min-bounding-rectangle
Version:
Minimum bounding rectangle implementation in JavaScript. Uses `concaveman` and `mathjs` as dependencies.
1,553 lines (1,552 loc) • 249 kB
JavaScript
function Rr(t, e, n = 0, r = t.length - 1, i = Mu) {
for (; r > n; ) {
if (r - n > 600) {
const f = r - n + 1, l = e - n + 1, a = Math.log(f), c = 0.5 * Math.exp(2 * a / 3), D = 0.5 * Math.sqrt(a * c * (f - c) / f) * (l - f / 2 < 0 ? -1 : 1), w = Math.max(n, Math.floor(e - l * c / f + D)), M = Math.min(r, Math.floor(e + (f - l) * c / f + D));
Rr(t, e, w, M, i);
}
const u = t[e];
let o = n, s = r;
for (Xe(t, n, e), i(t[r], u) > 0 && Xe(t, n, r); o < s; ) {
for (Xe(t, o, s), o++, s--; i(t[o], u) < 0; ) o++;
for (; i(t[s], u) > 0; ) s--;
}
i(t[n], u) === 0 ? Xe(t, n, s) : (s++, Xe(t, s, r)), s <= e && (n = s + 1), e <= s && (r = s - 1);
}
}
function Xe(t, e, n) {
const r = t[e];
t[e] = t[n], t[n] = r;
}
function Mu(t, e) {
return t < e ? -1 : t > e ? 1 : 0;
}
class Kn {
constructor(e = 9) {
this._maxEntries = Math.max(4, e), this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4)), this.clear();
}
all() {
return this._all(this.data, []);
}
search(e) {
let n = this.data;
const r = [];
if (!tn(e, n)) return r;
const i = this.toBBox, u = [];
for (; n; ) {
for (let o = 0; o < n.children.length; o++) {
const s = n.children[o], f = n.leaf ? i(s) : s;
tn(e, f) && (n.leaf ? r.push(s) : xn(e, f) ? this._all(s, r) : u.push(s));
}
n = u.pop();
}
return r;
}
collides(e) {
let n = this.data;
if (!tn(e, n)) return !1;
const r = [];
for (; n; ) {
for (let i = 0; i < n.children.length; i++) {
const u = n.children[i], o = n.leaf ? this.toBBox(u) : u;
if (tn(e, o)) {
if (n.leaf || xn(e, o)) return !0;
r.push(u);
}
}
n = r.pop();
}
return !1;
}
load(e) {
if (!(e && e.length)) return this;
if (e.length < this._minEntries) {
for (let r = 0; r < e.length; r++)
this.insert(e[r]);
return this;
}
let n = this._build(e.slice(), 0, e.length - 1, 0);
if (!this.data.children.length)
this.data = n;
else if (this.data.height === n.height)
this._splitRoot(this.data, n);
else {
if (this.data.height < n.height) {
const r = this.data;
this.data = n, n = r;
}
this._insert(n, this.data.height - n.height - 1, !0);
}
return this;
}
insert(e) {
return e && this._insert(e, this.data.height - 1), this;
}
clear() {
return this.data = xe([]), this;
}
remove(e, n) {
if (!e) return this;
let r = this.data;
const i = this.toBBox(e), u = [], o = [];
let s, f, l;
for (; r || u.length; ) {
if (r || (r = u.pop(), f = u[u.length - 1], s = o.pop(), l = !0), r.leaf) {
const a = Nu(e, r.children, n);
if (a !== -1)
return r.children.splice(a, 1), u.push(r), this._condense(u), this;
}
!l && !r.leaf && xn(r, i) ? (u.push(r), o.push(s), s = 0, f = r, r = r.children[0]) : f ? (s++, r = f.children[s], l = !1) : r = null;
}
return this;
}
toBBox(e) {
return e;
}
compareMinX(e, n) {
return e.minX - n.minX;
}
compareMinY(e, n) {
return e.minY - n.minY;
}
toJSON() {
return this.data;
}
fromJSON(e) {
return this.data = e, this;
}
_all(e, n) {
const r = [];
for (; e; )
e.leaf ? n.push(...e.children) : r.push(...e.children), e = r.pop();
return n;
}
_build(e, n, r, i) {
const u = r - n + 1;
let o = this._maxEntries, s;
if (u <= o)
return s = xe(e.slice(n, r + 1)), Ae(s, this.toBBox), s;
i || (i = Math.ceil(Math.log(u) / Math.log(o)), o = Math.ceil(u / Math.pow(o, i - 1))), s = xe([]), s.leaf = !1, s.height = i;
const f = Math.ceil(u / o), l = f * Math.ceil(Math.sqrt(o));
jn(e, n, r, l, this.compareMinX);
for (let a = n; a <= r; a += l) {
const c = Math.min(a + l - 1, r);
jn(e, a, c, f, this.compareMinY);
for (let D = a; D <= c; D += f) {
const w = Math.min(D + f - 1, c);
s.children.push(this._build(e, D, w, i - 1));
}
}
return Ae(s, this.toBBox), s;
}
_chooseSubtree(e, n, r, i) {
for (; i.push(n), !(n.leaf || i.length - 1 === r); ) {
let u = 1 / 0, o = 1 / 0, s;
for (let f = 0; f < n.children.length; f++) {
const l = n.children[f], a = Nn(l), c = Tu(e, l) - a;
c < o ? (o = c, u = a < u ? a : u, s = l) : c === o && a < u && (u = a, s = l);
}
n = s || n.children[0];
}
return n;
}
_insert(e, n, r) {
const i = r ? e : this.toBBox(e), u = [], o = this._chooseSubtree(i, this.data, n, u);
for (o.children.push(e), Ze(o, i); n >= 0 && u[n].children.length > this._maxEntries; )
this._split(u, n), n--;
this._adjustParentBBoxes(i, u, n);
}
// split overflowed node into two
_split(e, n) {
const r = e[n], i = r.children.length, u = this._minEntries;
this._chooseSplitAxis(r, u, i);
const o = this._chooseSplitIndex(r, u, i), s = xe(r.children.splice(o, r.children.length - o));
s.height = r.height, s.leaf = r.leaf, Ae(r, this.toBBox), Ae(s, this.toBBox), n ? e[n - 1].children.push(s) : this._splitRoot(r, s);
}
_splitRoot(e, n) {
this.data = xe([e, n]), this.data.height = e.height + 1, this.data.leaf = !1, Ae(this.data, this.toBBox);
}
_chooseSplitIndex(e, n, r) {
let i, u = 1 / 0, o = 1 / 0;
for (let s = n; s <= r - n; s++) {
const f = Le(e, 0, s, this.toBBox), l = Le(e, s, r, this.toBBox), a = bu(f, l), c = Nn(f) + Nn(l);
a < u ? (u = a, i = s, o = c < o ? c : o) : a === u && c < o && (o = c, i = s);
}
return i || r - n;
}
// sorts node children by the best axis for split
_chooseSplitAxis(e, n, r) {
const i = e.leaf ? this.compareMinX : xu, u = e.leaf ? this.compareMinY : Su, o = this._allDistMargin(e, n, r, i), s = this._allDistMargin(e, n, r, u);
o < s && e.children.sort(i);
}
// total margin of all possible split distributions where each node is at least m full
_allDistMargin(e, n, r, i) {
e.children.sort(i);
const u = this.toBBox, o = Le(e, 0, n, u), s = Le(e, r - n, r, u);
let f = je(o) + je(s);
for (let l = n; l < r - n; l++) {
const a = e.children[l];
Ze(o, e.leaf ? u(a) : a), f += je(o);
}
for (let l = r - n - 1; l >= n; l--) {
const a = e.children[l];
Ze(s, e.leaf ? u(a) : a), f += je(s);
}
return f;
}
_adjustParentBBoxes(e, n, r) {
for (let i = r; i >= 0; i--)
Ze(n[i], e);
}
_condense(e) {
for (let n = e.length - 1, r; n >= 0; n--)
e[n].children.length === 0 ? n > 0 ? (r = e[n - 1].children, r.splice(r.indexOf(e[n]), 1)) : this.clear() : Ae(e[n], this.toBBox);
}
}
function Nu(t, e, n) {
if (!n) return e.indexOf(t);
for (let r = 0; r < e.length; r++)
if (n(t, e[r])) return r;
return -1;
}
function Ae(t, e) {
Le(t, 0, t.children.length, e, t);
}
function Le(t, e, n, r, i) {
i || (i = xe(null)), i.minX = 1 / 0, i.minY = 1 / 0, i.maxX = -1 / 0, i.maxY = -1 / 0;
for (let u = e; u < n; u++) {
const o = t.children[u];
Ze(i, t.leaf ? r(o) : o);
}
return i;
}
function Ze(t, e) {
return t.minX = Math.min(t.minX, e.minX), t.minY = Math.min(t.minY, e.minY), t.maxX = Math.max(t.maxX, e.maxX), t.maxY = Math.max(t.maxY, e.maxY), t;
}
function xu(t, e) {
return t.minX - e.minX;
}
function Su(t, e) {
return t.minY - e.minY;
}
function Nn(t) {
return (t.maxX - t.minX) * (t.maxY - t.minY);
}
function je(t) {
return t.maxX - t.minX + (t.maxY - t.minY);
}
function Tu(t, e) {
return (Math.max(e.maxX, t.maxX) - Math.min(e.minX, t.minX)) * (Math.max(e.maxY, t.maxY) - Math.min(e.minY, t.minY));
}
function bu(t, e) {
const n = Math.max(t.minX, e.minX), r = Math.max(t.minY, e.minY), i = Math.min(t.maxX, e.maxX), u = Math.min(t.maxY, e.maxY);
return Math.max(0, i - n) * Math.max(0, u - r);
}
function xn(t, e) {
return t.minX <= e.minX && t.minY <= e.minY && e.maxX <= t.maxX && e.maxY <= t.maxY;
}
function tn(t, e) {
return e.minX <= t.maxX && e.minY <= t.maxY && e.maxX >= t.minX && e.maxY >= t.minY;
}
function xe(t) {
return {
children: t,
height: 1,
leaf: !0,
minX: 1 / 0,
minY: 1 / 0,
maxX: -1 / 0,
maxY: -1 / 0
};
}
function jn(t, e, n, r, i) {
const u = [e, n];
for (; u.length; ) {
if (n = u.pop(), e = u.pop(), n - e <= r) continue;
const o = e + Math.ceil((n - e) / r / 2) * r;
Rr(t, o, e, n, i), u.push(e, o, o, n);
}
}
class Iu {
constructor(e = [], n = (r, i) => r < i ? -1 : r > i ? 1 : 0) {
if (this.data = e, this.length = this.data.length, this.compare = n, this.length > 0)
for (let r = (this.length >> 1) - 1; r >= 0; r--) this._down(r);
}
push(e) {
this.data.push(e), this._up(this.length++);
}
pop() {
if (this.length === 0) return;
const e = this.data[0], n = this.data.pop();
return --this.length > 0 && (this.data[0] = n, this._down(0)), e;
}
peek() {
return this.data[0];
}
_up(e) {
const { data: n, compare: r } = this, i = n[e];
for (; e > 0; ) {
const u = e - 1 >> 1, o = n[u];
if (r(i, o) >= 0) break;
n[e] = o, e = u;
}
n[e] = i;
}
_down(e) {
const { data: n, compare: r } = this, i = this.length >> 1, u = n[e];
for (; e < i; ) {
let o = (e << 1) + 1;
const s = o + 1;
if (s < this.length && r(n[s], n[o]) < 0 && (o = s), r(n[o], u) >= 0) break;
n[e] = n[o], e = o;
}
n[e] = u;
}
}
function qr(t) {
return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t;
}
var $e = { exports: {} }, Sn, tr;
function Ou() {
return tr || (tr = 1, Sn = function(e, n, r, i) {
var u = e[0], o = e[1], s = !1;
r === void 0 && (r = 0), i === void 0 && (i = n.length);
for (var f = (i - r) / 2, l = 0, a = f - 1; l < f; a = l++) {
var c = n[r + l * 2 + 0], D = n[r + l * 2 + 1], w = n[r + a * 2 + 0], M = n[r + a * 2 + 1], h = D > o != M > o && u < (w - c) * (o - D) / (M - D) + c;
h && (s = !s);
}
return s;
}), Sn;
}
var Tn, er;
function Pu() {
return er || (er = 1, Tn = function(e, n, r, i) {
var u = e[0], o = e[1], s = !1;
r === void 0 && (r = 0), i === void 0 && (i = n.length);
for (var f = i - r, l = 0, a = f - 1; l < f; a = l++) {
var c = n[l + r][0], D = n[l + r][1], w = n[a + r][0], M = n[a + r][1], h = D > o != M > o && u < (w - c) * (o - D) / (M - D) + c;
h && (s = !s);
}
return s;
}), Tn;
}
var nr;
function zu() {
if (nr) return $e.exports;
nr = 1;
var t = Ou(), e = Pu();
return $e.exports = function(r, i, u, o) {
return i.length > 0 && Array.isArray(i[0]) ? e(r, i, u, o) : t(r, i, u, o);
}, $e.exports.nested = e, $e.exports.flat = t, $e.exports;
}
var Ru = zu();
const qu = /* @__PURE__ */ qr(Ru), ae = 11102230246251565e-32, bt = 134217729, Yu = (3 + 8 * ae) * ae;
function bn(t, e, n, r, i) {
let u, o, s, f, l = e[0], a = r[0], c = 0, D = 0;
a > l == a > -l ? (u = l, l = e[++c]) : (u = a, a = r[++D]);
let w = 0;
if (c < t && D < n)
for (a > l == a > -l ? (o = l + u, s = u - (o - l), l = e[++c]) : (o = a + u, s = u - (o - a), a = r[++D]), u = o, s !== 0 && (i[w++] = s); c < t && D < n; )
a > l == a > -l ? (o = u + l, f = o - u, s = u - (o - f) + (l - f), l = e[++c]) : (o = u + a, f = o - u, s = u - (o - f) + (a - f), a = r[++D]), u = o, s !== 0 && (i[w++] = s);
for (; c < t; )
o = u + l, f = o - u, s = u - (o - f) + (l - f), l = e[++c], u = o, s !== 0 && (i[w++] = s);
for (; D < n; )
o = u + a, f = o - u, s = u - (o - f) + (a - f), a = r[++D], u = o, s !== 0 && (i[w++] = s);
return (u !== 0 || w === 0) && (i[w++] = u), w;
}
function Uu(t, e) {
let n = e[0];
for (let r = 1; r < t; r++) n += e[r];
return n;
}
function Ge(t) {
return new Float64Array(t);
}
const Xu = (3 + 16 * ae) * ae, $u = (2 + 12 * ae) * ae, Lu = (9 + 64 * ae) * ae * ae, Ce = Ge(4), rr = Ge(8), ir = Ge(12), ur = Ge(16), qt = Ge(4);
function Zu(t, e, n, r, i, u, o) {
let s, f, l, a, c, D, w, M, h, g, p, E, F, A, d, m, C, y;
const B = t - i, x = n - i, T = e - u, q = r - u;
A = B * q, D = bt * B, w = D - (D - B), M = B - w, D = bt * q, h = D - (D - q), g = q - h, d = M * g - (A - w * h - M * h - w * g), m = T * x, D = bt * T, w = D - (D - T), M = T - w, D = bt * x, h = D - (D - x), g = x - h, C = M * g - (m - w * h - M * h - w * g), p = d - C, c = d - p, Ce[0] = d - (p + c) + (c - C), E = A + p, c = E - A, F = A - (E - c) + (p - c), p = F - m, c = F - p, Ce[1] = F - (p + c) + (c - m), y = E + p, c = y - E, Ce[2] = E - (y - c) + (p - c), Ce[3] = y;
let Z = Uu(4, Ce), W = $u * o;
if (Z >= W || -Z >= W || (c = t - B, s = t - (B + c) + (c - i), c = n - x, l = n - (x + c) + (c - i), c = e - T, f = e - (T + c) + (c - u), c = r - q, a = r - (q + c) + (c - u), s === 0 && f === 0 && l === 0 && a === 0) || (W = Lu * o + Yu * Math.abs(Z), Z += B * a + q * s - (T * l + x * f), Z >= W || -Z >= W)) return Z;
A = s * q, D = bt * s, w = D - (D - s), M = s - w, D = bt * q, h = D - (D - q), g = q - h, d = M * g - (A - w * h - M * h - w * g), m = f * x, D = bt * f, w = D - (D - f), M = f - w, D = bt * x, h = D - (D - x), g = x - h, C = M * g - (m - w * h - M * h - w * g), p = d - C, c = d - p, qt[0] = d - (p + c) + (c - C), E = A + p, c = E - A, F = A - (E - c) + (p - c), p = F - m, c = F - p, qt[1] = F - (p + c) + (c - m), y = E + p, c = y - E, qt[2] = E - (y - c) + (p - c), qt[3] = y;
const L = bn(4, Ce, 4, qt, rr);
A = B * a, D = bt * B, w = D - (D - B), M = B - w, D = bt * a, h = D - (D - a), g = a - h, d = M * g - (A - w * h - M * h - w * g), m = T * l, D = bt * T, w = D - (D - T), M = T - w, D = bt * l, h = D - (D - l), g = l - h, C = M * g - (m - w * h - M * h - w * g), p = d - C, c = d - p, qt[0] = d - (p + c) + (c - C), E = A + p, c = E - A, F = A - (E - c) + (p - c), p = F - m, c = F - p, qt[1] = F - (p + c) + (c - m), y = E + p, c = y - E, qt[2] = E - (y - c) + (p - c), qt[3] = y;
const z = bn(L, rr, 4, qt, ir);
A = s * a, D = bt * s, w = D - (D - s), M = s - w, D = bt * a, h = D - (D - a), g = a - h, d = M * g - (A - w * h - M * h - w * g), m = f * l, D = bt * f, w = D - (D - f), M = f - w, D = bt * l, h = D - (D - l), g = l - h, C = M * g - (m - w * h - M * h - w * g), p = d - C, c = d - p, qt[0] = d - (p + c) + (c - C), E = A + p, c = E - A, F = A - (E - c) + (p - c), p = F - m, c = F - p, qt[1] = F - (p + c) + (c - m), y = E + p, c = y - E, qt[2] = E - (y - c) + (p - c), qt[3] = y;
const J = bn(z, ir, 4, qt, ur);
return ur[J - 1];
}
function Wu(t, e, n, r, i, u) {
const o = (e - u) * (n - i), s = (t - i) * (r - u), f = o - s, l = Math.abs(o + s);
return Math.abs(f) >= Xu * l ? f : -Zu(t, e, n, r, i, u, l);
}
function Vu(t, e, n) {
e = Math.max(0, e === void 0 ? 2 : e), n = n || 0;
const r = Qu(t), i = new Kn(16);
i.toBBox = function(D) {
return {
minX: D[0],
minY: D[1],
maxX: D[0],
maxY: D[1]
};
}, i.compareMinX = function(D, w) {
return D[0] - w[0];
}, i.compareMinY = function(D, w) {
return D[1] - w[1];
}, i.load(t);
const u = [];
let o;
for (let D = 0; D < r.length; D++) {
const w = r[D];
i.remove(w), o = ar(w, o), u.push(o);
}
const s = new Kn(16);
for (let D = 0; D < u.length; D++) s.insert(In(u[D]));
const f = e * e, l = n * n;
for (; u.length; ) {
const D = u.shift(), w = D.p, M = D.next.p, h = On(w, M);
if (h < l) continue;
const g = h / f, p = Hu(i, D.prev.p, w, M, D.next.next.p, g, s);
p && Math.min(On(p, w), On(p, M)) <= g && (u.push(D), u.push(ar(p, D)), i.remove(p), s.remove(D), s.insert(In(D)), s.insert(In(D.next)));
}
let a = o;
const c = [];
do
c.push(a.p), a = a.next;
while (a !== o);
return c.push(a.p), c;
}
function Hu(t, e, n, r, i, u, o) {
const s = new Iu([], Ju);
let f = t.data;
for (; f; ) {
for (let l = 0; l < f.children.length; l++) {
const a = f.children[l], c = f.leaf ? Pn(a, n, r) : ku(n, r, a);
c > u || s.push({
node: a,
dist: c
});
}
for (; s.length && !s.peek().node.children; ) {
const l = s.pop(), a = l.node, c = Pn(a, e, n), D = Pn(a, r, i);
if (l.dist < c && l.dist < D && sr(n, a, o) && sr(r, a, o)) return a;
}
f = s.pop(), f && (f = f.node);
}
return null;
}
function Ju(t, e) {
return t.dist - e.dist;
}
function ku(t, e, n) {
if (or(t, n) || or(e, n)) return 0;
const r = en(t[0], t[1], e[0], e[1], n.minX, n.minY, n.maxX, n.minY);
if (r === 0) return 0;
const i = en(t[0], t[1], e[0], e[1], n.minX, n.minY, n.minX, n.maxY);
if (i === 0) return 0;
const u = en(t[0], t[1], e[0], e[1], n.maxX, n.minY, n.maxX, n.maxY);
if (u === 0) return 0;
const o = en(t[0], t[1], e[0], e[1], n.minX, n.maxY, n.maxX, n.maxY);
return o === 0 ? 0 : Math.min(r, i, u, o);
}
function or(t, e) {
return t[0] >= e.minX && t[0] <= e.maxX && t[1] >= e.minY && t[1] <= e.maxY;
}
function sr(t, e, n) {
const r = Math.min(t[0], e[0]), i = Math.min(t[1], e[1]), u = Math.max(t[0], e[0]), o = Math.max(t[1], e[1]), s = n.search({ minX: r, minY: i, maxX: u, maxY: o });
for (let f = 0; f < s.length; f++)
if (Gu(s[f].p, s[f].next.p, t, e)) return !1;
return !0;
}
function Se(t, e, n) {
return Wu(t[0], t[1], e[0], e[1], n[0], n[1]);
}
function Gu(t, e, n, r) {
return t !== r && e !== n && Se(t, e, n) > 0 != Se(t, e, r) > 0 && Se(n, r, t) > 0 != Se(n, r, e) > 0;
}
function In(t) {
const e = t.p, n = t.next.p;
return t.minX = Math.min(e[0], n[0]), t.minY = Math.min(e[1], n[1]), t.maxX = Math.max(e[0], n[0]), t.maxY = Math.max(e[1], n[1]), t;
}
function Qu(t) {
let e = t[0], n = t[0], r = t[0], i = t[0];
for (let s = 0; s < t.length; s++) {
const f = t[s];
f[0] < e[0] && (e = f), f[0] > r[0] && (r = f), f[1] < n[1] && (n = f), f[1] > i[1] && (i = f);
}
const u = [e, n, r, i], o = u.slice();
for (let s = 0; s < t.length; s++)
qu(t[s], u) || o.push(t[s]);
return ju(o);
}
function ar(t, e) {
const n = {
p: t,
prev: null,
next: null,
minX: 0,
minY: 0,
maxX: 0,
maxY: 0
};
return e ? (n.next = e.next, n.prev = e, e.next.prev = n, e.next = n) : (n.prev = n, n.next = n), n;
}
function On(t, e) {
const n = t[0] - e[0], r = t[1] - e[1];
return n * n + r * r;
}
function Pn(t, e, n) {
let r = e[0], i = e[1], u = n[0] - r, o = n[1] - i;
if (u !== 0 || o !== 0) {
const s = ((t[0] - r) * u + (t[1] - i) * o) / (u * u + o * o);
s > 1 ? (r = n[0], i = n[1]) : s > 0 && (r += u * s, i += o * s);
}
return u = t[0] - r, o = t[1] - i, u * u + o * o;
}
function en(t, e, n, r, i, u, o, s) {
const f = n - t, l = r - e, a = o - i, c = s - u, D = t - i, w = e - u, M = f * f + l * l, h = f * a + l * c, g = a * a + c * c, p = f * D + l * w, E = a * D + c * w, F = M * g - h * h;
let A, d, m = F, C = F;
F === 0 ? (A = 0, m = 1, d = E, C = g) : (A = h * E - g * p, d = M * E - h * p, A < 0 ? (A = 0, d = E, C = g) : A > m && (A = m, d = E + h, C = g)), d < 0 ? (d = 0, -p < 0 ? A = 0 : -p > M ? A = m : (A = -p, m = M)) : d > C && (d = C, -p + h < 0 ? A = 0 : -p + h > M ? A = m : (A = -p + h, m = M));
const y = A === 0 ? 0 : A / m, B = d === 0 ? 0 : d / C, x = (1 - y) * t + y * n, T = (1 - y) * e + y * r, q = (1 - B) * i + B * o, Z = (1 - B) * u + B * s, W = q - x, L = Z - T;
return W * W + L * L;
}
function Ku(t, e) {
return t[0] === e[0] ? t[1] - e[1] : t[0] - e[0];
}
function ju(t) {
t.sort(Ku);
const e = [];
for (let r = 0; r < t.length; r++) {
for (; e.length >= 2 && Se(e[e.length - 2], e[e.length - 1], t[r]) <= 0; )
e.pop();
e.push(t[r]);
}
const n = [];
for (let r = t.length - 1; r >= 0; r--) {
for (; n.length >= 2 && Se(n[n.length - 2], n[n.length - 1], t[r]) <= 0; )
n.pop();
n.push(t[r]);
}
return n.pop(), e.pop(), e.concat(n);
}
function fn() {
return fn = Object.assign ? Object.assign.bind() : function(t) {
for (var e = 1; e < arguments.length; e++) {
var n = arguments[e];
for (var r in n) ({}).hasOwnProperty.call(n, r) && (t[r] = n[r]);
}
return t;
}, fn.apply(null, arguments);
}
var Yr = {
// minimum relative difference between two compared values,
// used by all comparison functions
relTol: 1e-12,
// minimum absolute difference between two compared values,
// used by all comparison functions
absTol: 1e-15,
// type of default matrix output. Choose 'matrix' (default) or 'array'
matrix: "Matrix",
// type of default number output. Choose 'number' (default) 'BigNumber', 'bigint', or 'Fraction'
number: "number",
// type of fallback used for config { number: 'bigint' } when a value cannot be represented
// in the configured numeric type. Choose 'number' (default) or 'BigNumber'.
numberFallback: "number",
// number of significant digits in BigNumbers
precision: 64,
// predictable output type of functions. When true, output type depends only
// on the input types. When false (default), output type can vary depending
// on input values. For example `math.sqrt(-4)` returns `complex('2i')` when
// predictable is false, and returns `NaN` when true.
predictable: !1,
// random seed for seeded pseudo random number generation
// null = randomly seed
randomSeed: null
};
function to(t, e) {
if (cn(t, e))
return t[e];
throw typeof t[e] == "function" && no(t, e) ? new Error('Cannot access method "' + e + '" as a property') : new Error('No access to property "' + e + '"');
}
function eo(t, e, n) {
if (cn(t, e))
return t[e] = n, n;
throw new Error('No access to property "' + e + '"');
}
function cn(t, e) {
return !ro(t) && !Array.isArray(t) ? !1 : kt(io, e) ? !0 : !(e in Object.prototype || e in Function.prototype);
}
function no(t, e) {
return t == null || typeof t[e] != "function" || kt(t, e) && Object.getPrototypeOf && e in Object.getPrototypeOf(t) ? !1 : kt(uo, e) ? !0 : !(e in Object.prototype || e in Function.prototype);
}
function ro(t) {
return typeof t == "object" && t && t.constructor === Object;
}
var io = {
length: !0,
name: !0
}, uo = {
toString: !0,
valueOf: !0,
toLocaleString: !0
};
class oo {
constructor(e) {
this.wrappedObject = e, this[Symbol.iterator] = this.entries;
}
keys() {
return Object.keys(this.wrappedObject).filter((e) => this.has(e)).values();
}
get(e) {
return to(this.wrappedObject, e);
}
set(e, n) {
return eo(this.wrappedObject, e, n), this;
}
has(e) {
return cn(this.wrappedObject, e) && e in this.wrappedObject;
}
entries() {
return so(this.keys(), (e) => [e, this.get(e)]);
}
forEach(e) {
for (var n of this.keys())
e(this.get(n), n, this);
}
delete(e) {
cn(this.wrappedObject, e) && delete this.wrappedObject[e];
}
clear() {
for (var e of this.keys())
this.delete(e);
}
get size() {
return Object.keys(this.wrappedObject).length;
}
}
function so(t, e) {
return {
next: () => {
var n = t.next();
return n.done ? n : {
value: e(n.value),
done: !1
};
}
};
}
function lt(t) {
return typeof t == "number";
}
function Nt(t) {
return !t || typeof t != "object" || typeof t.constructor != "function" ? !1 : t.isBigNumber === !0 && typeof t.constructor.prototype == "object" && t.constructor.prototype.isBigNumber === !0 || typeof t.constructor.isDecimal == "function" && t.constructor.isDecimal(t) === !0;
}
function Ur(t) {
return typeof t == "bigint";
}
function gn(t) {
return t && typeof t == "object" && Object.getPrototypeOf(t).isComplex === !0 || !1;
}
function vn(t) {
return t && typeof t == "object" && Object.getPrototypeOf(t).isFraction === !0 || !1;
}
function Fn(t) {
return t && t.constructor.prototype.isUnit === !0 || !1;
}
function jt(t) {
return typeof t == "string";
}
var At = Array.isArray;
function Mt(t) {
return t && t.constructor.prototype.isMatrix === !0 || !1;
}
function He(t) {
return Array.isArray(t) || Mt(t);
}
function Xr(t) {
return t && t.isDenseMatrix && t.constructor.prototype.isMatrix === !0 || !1;
}
function $r(t) {
return t && t.isSparseMatrix && t.constructor.prototype.isMatrix === !0 || !1;
}
function Lr(t) {
return t && t.constructor.prototype.isRange === !0 || !1;
}
function wn(t) {
return t && t.constructor.prototype.isIndex === !0 || !1;
}
function Zr(t) {
return typeof t == "boolean";
}
function Wr(t) {
return t && t.constructor.prototype.isResultSet === !0 || !1;
}
function Vr(t) {
return t && t.constructor.prototype.isHelp === !0 || !1;
}
function Hr(t) {
return typeof t == "function";
}
function Jr(t) {
return t instanceof Date;
}
function kr(t) {
return t instanceof RegExp;
}
function qe(t) {
return !!(t && typeof t == "object" && t.constructor === Object && !gn(t) && !vn(t));
}
function Ie(t) {
return t ? t instanceof Map || t instanceof oo || typeof t.set == "function" && typeof t.get == "function" && typeof t.keys == "function" && typeof t.has == "function" : !1;
}
function ao(t) {
return Ie(t) && Ie(t.a) && Ie(t.b);
}
function fo(t) {
return Ie(t) && qe(t.wrappedObject);
}
function Gr(t) {
return t === null;
}
function Qr(t) {
return t === void 0;
}
function Kr(t) {
return t && t.isAccessorNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function jr(t) {
return t && t.isArrayNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ti(t) {
return t && t.isAssignmentNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ei(t) {
return t && t.isBlockNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ni(t) {
return t && t.isConditionalNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ri(t) {
return t && t.isConstantNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ii(t) {
return t && t.isFunctionAssignmentNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ui(t) {
return t && t.isFunctionNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function oi(t) {
return t && t.isIndexNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function si(t) {
return t && t.isNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ai(t) {
return t && t.isObjectNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function fi(t) {
return t && t.isOperatorNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function ci(t) {
return t && t.isParenthesisNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function li(t) {
return t && t.isRangeNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function hi(t) {
return t && t.isRelationalNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function Di(t) {
return t && t.isSymbolNode === !0 && t.constructor.prototype.isNode === !0 || !1;
}
function pi(t) {
return t && t.constructor.prototype.isChain === !0 || !1;
}
function me(t) {
var e = typeof t;
return e === "object" ? t === null ? "null" : Nt(t) ? "BigNumber" : t.constructor && t.constructor.name ? t.constructor.name : "Object" : e;
}
function Dt(t) {
var e = typeof t;
if (e === "number" || e === "bigint" || e === "string" || e === "boolean" || t === null || t === void 0)
return t;
if (typeof t.clone == "function")
return t.clone();
if (Array.isArray(t))
return t.map(function(n) {
return Dt(n);
});
if (t instanceof Date) return new Date(t.valueOf());
if (Nt(t)) return t;
if (qe(t))
return co(t, Dt);
if (e === "function")
return t;
throw new TypeError("Cannot clone: unknown type of value (value: ".concat(t, ")"));
}
function co(t, e) {
var n = {};
for (var r in t)
kt(t, r) && (n[r] = e(t[r]));
return n;
}
function di(t, e) {
if (Array.isArray(e))
throw new TypeError("Arrays are not supported by deepExtend");
for (var n in e)
if (kt(e, n) && !(n in Object.prototype) && !(n in Function.prototype))
if (e[n] && e[n].constructor === Object)
t[n] === void 0 && (t[n] = {}), t[n] && t[n].constructor === Object ? di(t[n], e[n]) : t[n] = e[n];
else {
if (Array.isArray(e[n]))
throw new TypeError("Arrays are not supported by deepExtend");
t[n] = e[n];
}
return t;
}
function Pe(t, e) {
var n, r, i;
if (Array.isArray(t)) {
if (!Array.isArray(e) || t.length !== e.length)
return !1;
for (r = 0, i = t.length; r < i; r++)
if (!Pe(t[r], e[r]))
return !1;
return !0;
} else {
if (typeof t == "function")
return t === e;
if (t instanceof Object) {
if (Array.isArray(e) || !(e instanceof Object))
return !1;
for (n in t)
if (!(n in e) || !Pe(t[n], e[n]))
return !1;
for (n in e)
if (!(n in t))
return !1;
return !0;
} else
return t === e;
}
}
function lo(t) {
var e = {};
return mi(t, e), e;
}
function mi(t, e) {
for (var n in t)
if (kt(t, n)) {
var r = t[n];
typeof r == "object" && r !== null ? mi(r, e) : e[n] = r;
}
}
function ye(t, e, n) {
var r = !0, i;
Object.defineProperty(t, e, {
get: function() {
return r && (i = n(), r = !1), i;
},
set: function(o) {
i = o, r = !1;
},
configurable: !0,
enumerable: !0
});
}
function kt(t, e) {
return t && Object.hasOwnProperty.call(t, e);
}
function ho(t) {
return t && typeof t.factory == "function";
}
function Do(t, e) {
for (var n = {}, r = 0; r < e.length; r++) {
var i = e[r], u = t[i];
u !== void 0 && (n[i] = u);
}
return n;
}
var fr = ["Matrix", "Array"], cr = ["number", "BigNumber", "Fraction"];
function po(t, e) {
function n(r) {
if (r) {
if (r.epsilon !== void 0) {
console.warn('Warning: The configuration option "epsilon" is deprecated. Use "relTol" and "absTol" instead.');
var i = Dt(r);
return i.relTol = r.epsilon, i.absTol = r.epsilon * 1e-3, delete i.epsilon, n(i);
}
var u = Dt(t);
lr(r, "matrix", fr), lr(r, "number", cr), di(t, r);
var o = Dt(t), s = Dt(r);
return e("config", o, u, s), o;
} else
return Dt(t);
}
return n.MATRIX_OPTIONS = fr, n.NUMBER_OPTIONS = cr, Object.keys(Yr).forEach((r) => {
Object.defineProperty(n, r, {
get: () => t[r],
enumerable: !0,
configurable: !0
});
}), n;
}
function lr(t, e, n) {
t[e] !== void 0 && !n.includes(t[e]) && console.warn('Warning: Unknown value "' + t[e] + '" for configuration option "' + e + '". Available options: ' + n.map((r) => JSON.stringify(r)).join(", ") + ".");
}
function hr() {
return !0;
}
function Vt() {
return !1;
}
function Be() {
}
const Dr = "Argument is not a typed-function.";
function gi() {
function t(v) {
return typeof v == "object" && v !== null && v.constructor === Object;
}
const e = [{
name: "number",
test: function(v) {
return typeof v == "number";
}
}, {
name: "string",
test: function(v) {
return typeof v == "string";
}
}, {
name: "boolean",
test: function(v) {
return typeof v == "boolean";
}
}, {
name: "Function",
test: function(v) {
return typeof v == "function";
}
}, {
name: "Array",
test: Array.isArray
}, {
name: "Date",
test: function(v) {
return v instanceof Date;
}
}, {
name: "RegExp",
test: function(v) {
return v instanceof RegExp;
}
}, {
name: "Object",
test: t
}, {
name: "null",
test: function(v) {
return v === null;
}
}, {
name: "undefined",
test: function(v) {
return v === void 0;
}
}], n = {
name: "any",
test: hr,
isAny: !0
};
let r, i, u = 0, o = {
createCount: 0
};
function s(v) {
const _ = r.get(v);
if (_)
return _;
let N = 'Unknown type "' + v + '"';
const b = v.toLowerCase();
let P;
for (P of i)
if (P.toLowerCase() === b) {
N += '. Did you mean "' + P + '" ?';
break;
}
throw new TypeError(N);
}
function f(v) {
let _ = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "any";
const N = _ ? s(_).index : i.length, b = [];
for (let I = 0; I < v.length; ++I) {
if (!v[I] || typeof v[I].name != "string" || typeof v[I].test != "function")
throw new TypeError("Object with properties {name: string, test: function} expected");
const X = v[I].name;
if (r.has(X))
throw new TypeError('Duplicate type name "' + X + '"');
b.push(X), r.set(X, {
name: X,
test: v[I].test,
isAny: v[I].isAny,
index: N + I,
conversionsTo: []
// Newly added type can't have any conversions to it
});
}
const P = i.slice(N);
i = i.slice(0, N).concat(b).concat(P);
for (let I = N + b.length; I < i.length; ++I)
r.get(i[I]).index = I;
}
function l() {
r = /* @__PURE__ */ new Map(), i = [], u = 0, f([n], !1);
}
l(), f(e);
function a() {
let v;
for (v of i)
r.get(v).conversionsTo = [];
u = 0;
}
function c(v) {
const _ = i.filter((N) => {
const b = r.get(N);
return !b.isAny && b.test(v);
});
return _.length ? _ : ["any"];
}
function D(v) {
return v && typeof v == "function" && "_typedFunctionData" in v;
}
function w(v, _, N) {
if (!D(v))
throw new TypeError(Dr);
const b = N && N.exact, P = Array.isArray(_) ? _.join(",") : _, I = A(P), X = g(I);
if (!b || X in v.signatures) {
const ut = v._typedFunctionData.signatureMap.get(X);
if (ut)
return ut;
}
const Y = I.length;
let $;
if (b) {
$ = [];
let ut;
for (ut in v.signatures)
$.push(v._typedFunctionData.signatureMap.get(ut));
} else
$ = v._typedFunctionData.signatures;
for (let ut = 0; ut < Y; ++ut) {
const ct = I[ut], Et = [];
let Yt;
for (Yt of $) {
const Rt = y(Yt.params, ut);
if (!(!Rt || ct.restParam && !Rt.restParam)) {
if (!Rt.hasAny) {
const Gt = F(Rt);
if (ct.types.some((Qt) => !Gt.has(Qt.name)))
continue;
}
Et.push(Yt);
}
}
if ($ = Et, $.length === 0) break;
}
let R;
for (R of $)
if (R.params.length <= Y)
return R;
throw new TypeError("Signature not found (signature: " + (v.name || "unnamed") + "(" + g(I, ", ") + "))");
}
function M(v, _, N) {
return w(v, _, N).implementation;
}
function h(v, _) {
const N = s(_);
if (N.test(v))
return v;
const b = N.conversionsTo;
if (b.length === 0)
throw new Error("There are no conversions to " + _ + " defined.");
for (let P = 0; P < b.length; P++)
if (s(b[P].from).test(v))
return b[P].convert(v);
throw new Error("Cannot convert " + v + " to " + _);
}
function g(v) {
let _ = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : ",";
return v.map((N) => N.name).join(_);
}
function p(v) {
const _ = v.indexOf("...") === 0, b = (_ ? v.length > 3 ? v.slice(3) : "any" : v).split("|").map((Y) => s(Y.trim()));
let P = !1, I = _ ? "..." : "";
return {
types: b.map(function(Y) {
return P = Y.isAny || P, I += Y.name + "|", {
name: Y.name,
typeIndex: Y.index,
test: Y.test,
isAny: Y.isAny,
conversion: null,
conversionIndex: -1
};
}),
name: I.slice(0, -1),
// remove trailing '|' from above
hasAny: P,
hasConversion: !1,
restParam: _
};
}
function E(v) {
const _ = v.types.map((X) => X.name), N = J(_);
let b = v.hasAny, P = v.name;
const I = N.map(function(X) {
const Y = s(X.from);
return b = Y.isAny || b, P += "|" + X.from, {
name: X.from,
typeIndex: Y.index,
test: Y.test,
isAny: Y.isAny,
conversion: X,
conversionIndex: X.index
};
});
return {
types: v.types.concat(I),
name: P,
hasAny: b,
hasConversion: I.length > 0,
restParam: v.restParam
};
}
function F(v) {
return v.typeSet || (v.typeSet = /* @__PURE__ */ new Set(), v.types.forEach((_) => v.typeSet.add(_.name))), v.typeSet;
}
function A(v) {
const _ = [];
if (typeof v != "string")
throw new TypeError("Signatures must be strings");
const N = v.trim();
if (N === "")
return _;
const b = N.split(",");
for (let P = 0; P < b.length; ++P) {
const I = p(b[P].trim());
if (I.restParam && P !== b.length - 1)
throw new SyntaxError('Unexpected rest parameter "' + b[P] + '": only allowed for the last parameter');
if (I.types.length === 0)
return null;
_.push(I);
}
return _;
}
function d(v) {
const _ = st(v);
return _ ? _.restParam : !1;
}
function m(v) {
if (!v || v.types.length === 0)
return hr;
if (v.types.length === 1)
return s(v.types[0].name).test;
if (v.types.length === 2) {
const _ = s(v.types[0].name).test, N = s(v.types[1].name).test;
return function(P) {
return _(P) || N(P);
};
} else {
const _ = v.types.map(function(N) {
return s(N.name).test;
});
return function(b) {
for (let P = 0; P < _.length; P++)
if (_[P](b))
return !0;
return !1;
};
}
}
function C(v) {
let _, N, b;
if (d(v)) {
_ = zt(v).map(m);
const P = _.length, I = m(st(v)), X = function(Y) {
for (let $ = P; $ < Y.length; $++)
if (!I(Y[$]))
return !1;
return !0;
};
return function($) {
for (let R = 0; R < _.length; R++)
if (!_[R]($[R]))
return !1;
return X($) && $.length >= P + 1;
};
} else
return v.length === 0 ? function(I) {
return I.length === 0;
} : v.length === 1 ? (N = m(v[0]), function(I) {
return N(I[0]) && I.length === 1;
}) : v.length === 2 ? (N = m(v[0]), b = m(v[1]), function(I) {
return N(I[0]) && b(I[1]) && I.length === 2;
}) : (_ = v.map(m), function(I) {
for (let X = 0; X < _.length; X++)
if (!_[X](I[X]))
return !1;
return I.length === _.length;
});
}
function y(v, _) {
return _ < v.length ? v[_] : d(v) ? st(v) : null;
}
function B(v, _) {
const N = y(v, _);
return N ? F(N) : /* @__PURE__ */ new Set();
}
function x(v) {
return v.conversion === null || v.conversion === void 0;
}
function T(v, _) {
const N = /* @__PURE__ */ new Set();
return v.forEach((b) => {
const P = B(b.params, _);
let I;
for (I of P)
N.add(I);
}), N.has("any") ? ["any"] : Array.from(N);
}
function q(v, _, N) {
let b, P;
const I = v || "unnamed";
let X = N, Y;
for (Y = 0; Y < _.length; Y++) {
const ct = [];
if (X.forEach((Et) => {
const Yt = y(Et.params, Y), Rt = m(Yt);
(Y < Et.params.length || d(Et.params)) && Rt(_[Y]) && ct.push(Et);
}), ct.length === 0) {
if (P = T(X, Y), P.length > 0) {
const Et = c(_[Y]);
return b = new TypeError("Unexpected type of argument in function " + I + " (expected: " + P.join(" or ") + ", actual: " + Et.join(" | ") + ", index: " + Y + ")"), b.data = {
category: "wrongType",
fn: I,
index: Y,
actual: Et,
expected: P
}, b;
}
} else
X = ct;
}
const $ = X.map(function(ct) {
return d(ct.params) ? 1 / 0 : ct.params.length;
});
if (_.length < Math.min.apply(null, $))
return P = T(X, Y), b = new TypeError("Too few arguments in function " + I + " (expected: " + P.join(" or ") + ", index: " + _.length + ")"), b.data = {
category: "tooFewArgs",
fn: I,
index: _.length,
expected: P
}, b;
const R = Math.max.apply(null, $);
if (_.length > R)
return b = new TypeError("Too many arguments in function " + I + " (expected: " + R + ", actual: " + _.length + ")"), b.data = {
category: "tooManyArgs",
fn: I,
index: _.length,
expectedLength: R
}, b;
const ut = [];
for (let ct = 0; ct < _.length; ++ct)
ut.push(c(_[ct]).join("|"));
return b = new TypeError('Arguments of type "' + ut.join(", ") + '" do not match any of the defined signatures of function ' + I + "."), b.data = {
category: "mismatch",
actual: ut
}, b;
}
function Z(v) {
let _ = i.length + 1;
for (let N = 0; N < v.types.length; N++)
x(v.types[N]) && (_ = Math.min(_, v.types[N].typeIndex));
return _;
}
function W(v) {
let _ = u + 1;
for (let N = 0; N < v.types.length; N++)
x(v.types[N]) || (_ = Math.min(_, v.types[N].conversionIndex));
return _;
}
function L(v, _) {
if (v.hasAny) {
if (!_.hasAny)
return 1;
} else if (_.hasAny)
return -1;
if (v.restParam) {
if (!_.restParam)
return 1;
} else if (_.restParam)
return -1;
if (v.hasConversion) {
if (!_.hasConversion)
return 1;
} else if (_.hasConversion)
return -1;
const N = Z(v) - Z(_);
if (N < 0)
return -1;
if (N > 0)
return 1;
const b = W(v) - W(_);
return b < 0 ? -1 : b > 0 ? 1 : 0;
}
function z(v, _) {
const N = v.params, b = _.params, P = st(N), I = st(b), X = d(N), Y = d(b);
if (X && P.hasAny) {
if (!Y || !I.hasAny)
return 1;
} else if (Y && I.hasAny)
return -1;
let $ = 0, R = 0, ut;
for (ut of N)
ut.hasAny && ++$, ut.hasConversion && ++R;
let ct = 0, Et = 0;
for (ut of b)
ut.hasAny && ++ct, ut.hasConversion && ++Et;
if ($ !== ct)
return $ - ct;
if (X && P.hasConversion) {
if (!Y || !I.hasConversion)
return 1;
} else if (Y && I.hasConversion)
return -1;
if (R !== Et)
return R - Et;
if (X) {
if (!Y)
return 1;
} else if (Y)
return -1;
const Yt = (N.length - b.length) * (X ? -1 : 1);
if (Yt !== 0)
return Yt;
const Rt = [];
let Gt = 0;
for (let Ee = 0; Ee < N.length; ++Ee) {
const Qe = L(N[Ee], b[Ee]);
Rt.push(Qe), Gt += Qe;
}
if (Gt !== 0)
return Gt;
let Qt;
for (Qt of Rt)
if (Qt !== 0)
return Qt;
return 0;
}
function J(v) {
if (v.length === 0)
return [];
const _ = v.map(s);
v.length > 1 && _.sort((P, I) => P.index - I.index);
let N = _[0].conversionsTo;
if (v.length === 1)
return N;
N = N.concat([]);
const b = new Set(v);
for (let P = 1; P < _.length; ++P) {
let I;
for (I of _[P].conversionsTo)
b.has(I.from) || (N.push(I), b.add(I.from));
}
return N;
}
function k(v, _) {
let N = _;
if (v.some((P) => P.hasConversion)) {
const P = d(v), I = v.map(G);
N = function() {
const Y = [], $ = P ? arguments.length - 1 : arguments.length;
for (let R = 0; R < $; R++)
Y[R] = I[R](arguments[R]);
return P && (Y[$] = arguments[$].map(I[$])), _.apply(this, Y);
};
}
let b = N;
if (d(v)) {
const P = v.length - 1;
b = function() {
return N.apply(this, it(arguments, 0, P).concat([it(arguments, P)]));
};
}
return b;
}
function G(v) {
let _, N, b, P;
const I = [], X = [];
switch (v.types.forEach(function(Y) {
Y.conversion && (I.push(s(Y.conversion.from).test), X.push(Y.conversion.convert));
}), X.length) {
case 0:
return function($) {
return $;
};
case 1:
return _ = I[0], b = X[0], function($) {
return _($) ? b($) : $;
};
case 2:
return _ = I[0], N = I[1], b = X[0], P = X[1], function($) {
return _($) ? b($) : N($) ? P($) : $;
};
default:
return function($) {
for (let R = 0; R < X.length; R++)
if (I[R]($))
return X[R]($);
return $;
};
}
}
function j(v) {
function _(N, b, P) {
if (b < N.length) {
const I = N[b];
let X = [];
if (I.restParam) {
const Y = I.types.filter(x);
Y.length < I.types.length && X.push({
types: Y,
name: "..." + Y.map(($) => $.name).join("|"),
hasAny: Y.some(($) => $.isAny),
hasConversion: !1,
restParam: !0
}), X.push(I);
} else
X = I.types.map(function(Y) {
return {
types: [Y],
name: Y.name,
hasAny: Y.isAny,
hasConversion: Y.conversion,
restParam: !1
};
});
return xt(X, function(Y) {
return _(N, b + 1, P.concat([Y]));
});
} else
return [P];
}
return _(v, 0, []);
}
function rt(v, _) {
const N = Math.max(v.length, _.length);
for (let Y = 0; Y < N; Y++) {
const $ = B(v, Y), R = B(_, Y);
let ut = !1, ct;
for (ct of R)
if ($.has(ct)) {
ut = !0;
break;
}
if (!ut)
return !1;
}
const b = v.length, P = _.length, I = d(v), X = d(_);
return I ? X ? b === P : P >= b : X ? b >= P : b === P;
}
function et(v) {
return v.map((_) => ue(_) ? Wt(_.referToSelf.callback) : ie(_) ? yt(_.referTo.references, _.referTo.callback) : _);
}
function ot(v, _, N) {
const b = [];
let P;
for (P of v) {
let I = N[P];
if (typeof I != "number")
throw new TypeError('No definition for referenced signature "' + P + '"');
if (I = _[I], typeof I != "function")
return !1;
b.push(I);
}
return b;
}
function wt(v, _, N) {
const b = et(v), P = new Array(b.length).fill(!1);
let I = !0;
for (; I; ) {
I = !1;
let X = !0;
for (let Y = 0; Y < b.length; ++Y) {
if (P[Y]) continue;
const $ = b[Y];
if (ue($))
b[Y] = $.referToSelf.callback(N), b[Y].referToSelf = $.referToSelf, P[Y] = !0, X = !1;
else if (ie($)) {
const R = ot($.referTo.references, b, _);
R ? (b[Y] = $.referTo.callback.apply(this, R), b[Y].referTo = $.referTo, P[Y] = !0, X = !1) : I = !0;
}
}
if (X && I)
throw new SyntaxError("Circular reference detected in resolving typed.referTo");
}
return b;
}
function vt(v) {
const _ = /\bthis(\(|\.signatures\b)/;
Object.keys(v).forEach((N) => {
const b = v[N];
if (_.test(b.toString()))
throw new SyntaxError("Using `this` to self-reference a function is deprecated since typed-function@3. Use typed.referTo and typed.referToSelf instead.");
});
}
function mt(v, _) {
if (o.createCount++, Object.keys(_).length === 0)
throw new SyntaxError("No signatures provided");
o.warnAgainstDeprecatedThis && vt(_);
const N = [], b = [], P = {}, I = [];
let X;
for (X in _) {
if (!Object.prototype.hasOwnProperty.call(_, X))
continue;
const nt = A(X);
if (!nt) continue;
N.forEach(function(Ue) {
if (rt(Ue, nt))
throw new TypeError('Conflicting signatures "' + g(Ue) + '" and "' + g(nt) + '".');
}), N.push(nt);
const Ut = b.length;
b.push(_[X]);
const Bu = nt.map(E);
let Ke;
for (Ke of j(Bu)) {
const Ue = g(Ke);
I.push({
params: Ke,
name: Ue,
fn: Ut
}), Ke.every((_u) => !_u.hasConversion) && (P[Ue] = Ut);
}
}
I.sort(z);
const Y = wt(b, P, Ye);
let $;
for ($ in P)
Object.prototype.hasOwnProperty.call(P, $) && (P[$] = Y[P[$]]);
const R = [], ut = /* @__PURE__ */ new Map();
for ($ of I)
ut.has($.name) || ($.fn = Y[$.fn], R.push($), ut.set($.name, $));
const ct = R[0] && R[0].params.length <= 2 && !d(R[0].params), Et = R[1] && R[1].params.length <= 2 && !d(R[1].params), Yt = R[2] && R[2].params.length <= 2 && !d(R[2].params), Rt = R[3] && R[3].params.length <= 2 && !d(R[3].params), Gt = R[4] && R[4].params.length <= 2 && !d(R[4].params), Qt = R[5] && R[5].params.length <= 2 && !d(R[5].params), Ee = ct && Et && Yt && Rt && Gt && Qt;
for (let nt = 0; nt < R.length; ++nt)
R[nt].test = C(R[nt].params);
const Qe = ct ? m(R[0].params[0]) : Vt, Qi = Et ? m(R[1].params[0]) : Vt, Ki = Yt ? m(R[2].params[0]) : Vt, ji = Rt ? m(R[3].params[0]) : Vt, tu = Gt ? m(R[4].params[0]) : Vt, eu = Qt ? m(R[5].params[0]) : Vt, nu = ct ? m(R[0].params[1]) : Vt, ru = Et ? m(R[1].params[1]) : Vt, iu = Yt ? m(R[2].params[1]) : Vt, uu = Rt ? m(R[3].params[1]) : Vt, ou = Gt ? m(R[4].params[1]) : Vt, su = Qt ? m(R[5].params[1]) : Vt;
for (let nt = 0; nt < R.length; ++nt)
R[nt].implementation = k(R[nt].params, R[nt].fn);
const au = ct ? R[0].implementation : Be, fu = Et ? R[1].implementation : Be, cu = Yt ? R[2].implementation : Be, lu = Rt ? R[3].implementation : Be, hu = Gt ? R[4].implementation : Be, Du = Qt ? R[5].implementation : Be, pu = ct ? R[0].params.length : -1, du = Et ? R[1].params.length : -1, mu = Yt ? R[2].params.length : -1, gu = Rt ? R[3].params.length : -1, vu = Gt ? R[4].params.length : -1, Fu = Qt ? R[5].params.length : -1, wu = Ee ? 6 : 0, Eu = R.length, Au = R.map((nt) => nt.test), Cu = R.map((nt) => nt.implementation), yu = function() {
for (let Ut = wu; Ut < Eu; Ut++)
if (Au[Ut](arguments))
return Cu[Ut].apply(this, arguments);
return o.onMismatch(v, arguments, R);