three-bvh-csg
Version:
A fast, flexible, dynamic CSG implementation on top of three-mesh-bvh
1,077 lines (1,067 loc) • 63.3 kB
JavaScript
// Auto-generated ESM bundle of cdt2d
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
// node_modules/binary-search-bounds/search-bounds.js
var require_search_bounds = __commonJS({
"node_modules/binary-search-bounds/search-bounds.js"(exports, module) {
"use strict";
function ge(a, y, c, l, h) {
var i = h + 1;
while (l <= h) {
var m = l + h >>> 1, x = a[m];
var p = c !== void 0 ? c(x, y) : x - y;
if (p >= 0) {
i = m;
h = m - 1;
} else {
l = m + 1;
}
}
return i;
}
function gt(a, y, c, l, h) {
var i = h + 1;
while (l <= h) {
var m = l + h >>> 1, x = a[m];
var p = c !== void 0 ? c(x, y) : x - y;
if (p > 0) {
i = m;
h = m - 1;
} else {
l = m + 1;
}
}
return i;
}
function lt(a, y, c, l, h) {
var i = l - 1;
while (l <= h) {
var m = l + h >>> 1, x = a[m];
var p = c !== void 0 ? c(x, y) : x - y;
if (p < 0) {
i = m;
l = m + 1;
} else {
h = m - 1;
}
}
return i;
}
function le(a, y, c, l, h) {
var i = l - 1;
while (l <= h) {
var m = l + h >>> 1, x = a[m];
var p = c !== void 0 ? c(x, y) : x - y;
if (p <= 0) {
i = m;
l = m + 1;
} else {
h = m - 1;
}
}
return i;
}
function eq(a, y, c, l, h) {
while (l <= h) {
var m = l + h >>> 1, x = a[m];
var p = c !== void 0 ? c(x, y) : x - y;
if (p === 0) {
return m;
}
if (p <= 0) {
l = m + 1;
} else {
h = m - 1;
}
}
return -1;
}
function norm(a, y, c, l, h, f) {
if (typeof c === "function") {
return f(a, y, c, l === void 0 ? 0 : l | 0, h === void 0 ? a.length - 1 : h | 0);
}
return f(a, y, void 0, c === void 0 ? 0 : c | 0, l === void 0 ? a.length - 1 : l | 0);
}
module.exports = {
ge: function(a, y, c, l, h) {
return norm(a, y, c, l, h, ge);
},
gt: function(a, y, c, l, h) {
return norm(a, y, c, l, h, gt);
},
lt: function(a, y, c, l, h) {
return norm(a, y, c, l, h, lt);
},
le: function(a, y, c, l, h) {
return norm(a, y, c, l, h, le);
},
eq: function(a, y, c, l, h) {
return norm(a, y, c, l, h, eq);
}
};
}
});
// node_modules/two-product/two-product.js
var require_two_product = __commonJS({
"node_modules/two-product/two-product.js"(exports, module) {
"use strict";
module.exports = twoProduct;
var SPLITTER = +(Math.pow(2, 27) + 1);
function twoProduct(a, b, result) {
var x = a * b;
var c = SPLITTER * a;
var abig = c - a;
var ahi = c - abig;
var alo = a - ahi;
var d = SPLITTER * b;
var bbig = d - b;
var bhi = d - bbig;
var blo = b - bhi;
var err1 = x - ahi * bhi;
var err2 = err1 - alo * bhi;
var err3 = err2 - ahi * blo;
var y = alo * blo - err3;
if (result) {
result[0] = y;
result[1] = x;
return result;
}
return [y, x];
}
}
});
// node_modules/robust-sum/robust-sum.js
var require_robust_sum = __commonJS({
"node_modules/robust-sum/robust-sum.js"(exports, module) {
"use strict";
module.exports = linearExpansionSum;
function scalarScalar(a, b) {
var x = a + b;
var bv = x - a;
var av = x - bv;
var br = b - bv;
var ar = a - av;
var y = ar + br;
if (y) {
return [y, x];
}
return [x];
}
function linearExpansionSum(e, f) {
var ne = e.length | 0;
var nf = f.length | 0;
if (ne === 1 && nf === 1) {
return scalarScalar(e[0], f[0]);
}
var n = ne + nf;
var g = new Array(n);
var count = 0;
var eptr = 0;
var fptr = 0;
var abs = Math.abs;
var ei = e[eptr];
var ea = abs(ei);
var fi = f[fptr];
var fa = abs(fi);
var a, b;
if (ea < fa) {
b = ei;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
ea = abs(ei);
}
} else {
b = fi;
fptr += 1;
if (fptr < nf) {
fi = f[fptr];
fa = abs(fi);
}
}
if (eptr < ne && ea < fa || fptr >= nf) {
a = ei;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
ea = abs(ei);
}
} else {
a = fi;
fptr += 1;
if (fptr < nf) {
fi = f[fptr];
fa = abs(fi);
}
}
var x = a + b;
var bv = x - a;
var y = b - bv;
var q0 = y;
var q1 = x;
var _x, _bv, _av, _br, _ar;
while (eptr < ne && fptr < nf) {
if (ea < fa) {
a = ei;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
ea = abs(ei);
}
} else {
a = fi;
fptr += 1;
if (fptr < nf) {
fi = f[fptr];
fa = abs(fi);
}
}
b = q0;
x = a + b;
bv = x - a;
y = b - bv;
if (y) {
g[count++] = y;
}
_x = q1 + x;
_bv = _x - q1;
_av = _x - _bv;
_br = x - _bv;
_ar = q1 - _av;
q0 = _ar + _br;
q1 = _x;
}
while (eptr < ne) {
a = ei;
b = q0;
x = a + b;
bv = x - a;
y = b - bv;
if (y) {
g[count++] = y;
}
_x = q1 + x;
_bv = _x - q1;
_av = _x - _bv;
_br = x - _bv;
_ar = q1 - _av;
q0 = _ar + _br;
q1 = _x;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
}
}
while (fptr < nf) {
a = fi;
b = q0;
x = a + b;
bv = x - a;
y = b - bv;
if (y) {
g[count++] = y;
}
_x = q1 + x;
_bv = _x - q1;
_av = _x - _bv;
_br = x - _bv;
_ar = q1 - _av;
q0 = _ar + _br;
q1 = _x;
fptr += 1;
if (fptr < nf) {
fi = f[fptr];
}
}
if (q0) {
g[count++] = q0;
}
if (q1) {
g[count++] = q1;
}
if (!count) {
g[count++] = 0;
}
g.length = count;
return g;
}
}
});
// node_modules/two-sum/two-sum.js
var require_two_sum = __commonJS({
"node_modules/two-sum/two-sum.js"(exports, module) {
"use strict";
module.exports = fastTwoSum;
function fastTwoSum(a, b, result) {
var x = a + b;
var bv = x - a;
var av = x - bv;
var br = b - bv;
var ar = a - av;
if (result) {
result[0] = ar + br;
result[1] = x;
return result;
}
return [ar + br, x];
}
}
});
// node_modules/robust-scale/robust-scale.js
var require_robust_scale = __commonJS({
"node_modules/robust-scale/robust-scale.js"(exports, module) {
"use strict";
var twoProduct = require_two_product();
var twoSum = require_two_sum();
module.exports = scaleLinearExpansion;
function scaleLinearExpansion(e, scale) {
var n = e.length;
if (n === 1) {
var ts = twoProduct(e[0], scale);
if (ts[0]) {
return ts;
}
return [ts[1]];
}
var g = new Array(2 * n);
var q = [0.1, 0.1];
var t = [0.1, 0.1];
var count = 0;
twoProduct(e[0], scale, q);
if (q[0]) {
g[count++] = q[0];
}
for (var i = 1; i < n; ++i) {
twoProduct(e[i], scale, t);
var pq = q[1];
twoSum(pq, t[0], q);
if (q[0]) {
g[count++] = q[0];
}
var a = t[1];
var b = q[1];
var x = a + b;
var bv = x - a;
var y = b - bv;
q[1] = x;
if (y) {
g[count++] = y;
}
}
if (q[1]) {
g[count++] = q[1];
}
if (count === 0) {
g[count++] = 0;
}
g.length = count;
return g;
}
}
});
// node_modules/robust-subtract/robust-diff.js
var require_robust_diff = __commonJS({
"node_modules/robust-subtract/robust-diff.js"(exports, module) {
"use strict";
module.exports = robustSubtract;
function scalarScalar(a, b) {
var x = a + b;
var bv = x - a;
var av = x - bv;
var br = b - bv;
var ar = a - av;
var y = ar + br;
if (y) {
return [y, x];
}
return [x];
}
function robustSubtract(e, f) {
var ne = e.length | 0;
var nf = f.length | 0;
if (ne === 1 && nf === 1) {
return scalarScalar(e[0], -f[0]);
}
var n = ne + nf;
var g = new Array(n);
var count = 0;
var eptr = 0;
var fptr = 0;
var abs = Math.abs;
var ei = e[eptr];
var ea = abs(ei);
var fi = -f[fptr];
var fa = abs(fi);
var a, b;
if (ea < fa) {
b = ei;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
ea = abs(ei);
}
} else {
b = fi;
fptr += 1;
if (fptr < nf) {
fi = -f[fptr];
fa = abs(fi);
}
}
if (eptr < ne && ea < fa || fptr >= nf) {
a = ei;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
ea = abs(ei);
}
} else {
a = fi;
fptr += 1;
if (fptr < nf) {
fi = -f[fptr];
fa = abs(fi);
}
}
var x = a + b;
var bv = x - a;
var y = b - bv;
var q0 = y;
var q1 = x;
var _x, _bv, _av, _br, _ar;
while (eptr < ne && fptr < nf) {
if (ea < fa) {
a = ei;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
ea = abs(ei);
}
} else {
a = fi;
fptr += 1;
if (fptr < nf) {
fi = -f[fptr];
fa = abs(fi);
}
}
b = q0;
x = a + b;
bv = x - a;
y = b - bv;
if (y) {
g[count++] = y;
}
_x = q1 + x;
_bv = _x - q1;
_av = _x - _bv;
_br = x - _bv;
_ar = q1 - _av;
q0 = _ar + _br;
q1 = _x;
}
while (eptr < ne) {
a = ei;
b = q0;
x = a + b;
bv = x - a;
y = b - bv;
if (y) {
g[count++] = y;
}
_x = q1 + x;
_bv = _x - q1;
_av = _x - _bv;
_br = x - _bv;
_ar = q1 - _av;
q0 = _ar + _br;
q1 = _x;
eptr += 1;
if (eptr < ne) {
ei = e[eptr];
}
}
while (fptr < nf) {
a = fi;
b = q0;
x = a + b;
bv = x - a;
y = b - bv;
if (y) {
g[count++] = y;
}
_x = q1 + x;
_bv = _x - q1;
_av = _x - _bv;
_br = x - _bv;
_ar = q1 - _av;
q0 = _ar + _br;
q1 = _x;
fptr += 1;
if (fptr < nf) {
fi = -f[fptr];
}
}
if (q0) {
g[count++] = q0;
}
if (q1) {
g[count++] = q1;
}
if (!count) {
g[count++] = 0;
}
g.length = count;
return g;
}
}
});
// node_modules/robust-orientation/orientation.js
var require_orientation = __commonJS({
"node_modules/robust-orientation/orientation.js"(exports, module) {
"use strict";
var twoProduct = require_two_product();
var robustSum = require_robust_sum();
var robustScale = require_robust_scale();
var robustSubtract = require_robust_diff();
var NUM_EXPAND = 5;
var EPSILON = 11102230246251565e-32;
var ERRBOUND3 = (3 + 16 * EPSILON) * EPSILON;
var ERRBOUND4 = (7 + 56 * EPSILON) * EPSILON;
function orientation_3(sum, prod, scale, sub) {
return function orientation3Exact2(m0, m1, m2) {
var p = sum(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])));
var n = sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0]));
var d = sub(p, n);
return d[d.length - 1];
};
}
function orientation_4(sum, prod, scale, sub) {
return function orientation4Exact2(m0, m1, m2, m3) {
var p = sum(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m3[2]))), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m3[2]))));
var n = sum(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m3[2]))), sum(scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m2[2]))));
var d = sub(p, n);
return d[d.length - 1];
};
}
function orientation_5(sum, prod, scale, sub) {
return function orientation5Exact(m0, m1, m2, m3, m4) {
var p = sum(sum(sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m2[2]), sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), -m3[2]), scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m4[2]))), m1[3]), sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m3[2]), scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m4[2]))), -m2[3]), scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m4[2]))), m3[3]))), sum(scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m3[2]))), -m4[3]), sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m3[2]), scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m4[2]))), m0[3]), scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m3[2]), scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), m4[2]))), -m1[3])))), sum(sum(scale(sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m4[2]))), m3[3]), sum(scale(sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m3[2]))), -m4[3]), scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m3[2]))), m0[3]))), sum(scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m3[2]))), -m1[3]), sum(scale(sum(scale(sum(prod(m1[1], m3[0]), prod(-m3[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m3[2]))), m2[3]), scale(sum(scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m2[2]))), -m3[3])))));
var n = sum(sum(sum(scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m2[2]), sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), -m3[2]), scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m4[2]))), m0[3]), scale(sum(scale(sum(prod(m3[1], m4[0]), prod(-m4[1], m3[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m3[2]), scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), m4[2]))), -m2[3])), sum(scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m4[2]))), m3[3]), scale(sum(scale(sum(prod(m2[1], m3[0]), prod(-m3[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m3[0]), prod(-m3[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m3[2]))), -m4[3]))), sum(sum(scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m1[2]), sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), -m2[2]), scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m4[2]))), m0[3]), scale(sum(scale(sum(prod(m2[1], m4[0]), prod(-m4[1], m2[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m2[2]), scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), m4[2]))), -m1[3])), sum(scale(sum(scale(sum(prod(m1[1], m4[0]), prod(-m4[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m4[0]), prod(-m4[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m4[2]))), m2[3]), scale(sum(scale(sum(prod(m1[1], m2[0]), prod(-m2[1], m1[0])), m0[2]), sum(scale(sum(prod(m0[1], m2[0]), prod(-m2[1], m0[0])), -m1[2]), scale(sum(prod(m0[1], m1[0]), prod(-m1[1], m0[0])), m2[2]))), -m4[3]))));
var d = sub(p, n);
return d[d.length - 1];
};
}
function orientation(n) {
var fn = n === 3 ? orientation_3 : n === 4 ? orientation_4 : orientation_5;
return fn(robustSum, twoProduct, robustScale, robustSubtract);
}
var orientation3Exact = orientation(3);
var orientation4Exact = orientation(4);
var CACHED = [
function orientation0() {
return 0;
},
function orientation1() {
return 0;
},
function orientation2(a, b) {
return b[0] - a[0];
},
function orientation3(a, b, c) {
var l = (a[1] - c[1]) * (b[0] - c[0]);
var r = (a[0] - c[0]) * (b[1] - c[1]);
var det = l - r;
var s;
if (l > 0) {
if (r <= 0) {
return det;
} else {
s = l + r;
}
} else if (l < 0) {
if (r >= 0) {
return det;
} else {
s = -(l + r);
}
} else {
return det;
}
var tol = ERRBOUND3 * s;
if (det >= tol || det <= -tol) {
return det;
}
return orientation3Exact(a, b, c);
},
function orientation4(a, b, c, d) {
var adx = a[0] - d[0];
var bdx = b[0] - d[0];
var cdx = c[0] - d[0];
var ady = a[1] - d[1];
var bdy = b[1] - d[1];
var cdy = c[1] - d[1];
var adz = a[2] - d[2];
var bdz = b[2] - d[2];
var cdz = c[2] - d[2];
var bdxcdy = bdx * cdy;
var cdxbdy = cdx * bdy;
var cdxady = cdx * ady;
var adxcdy = adx * cdy;
var adxbdy = adx * bdy;
var bdxady = bdx * ady;
var det = adz * (bdxcdy - cdxbdy) + bdz * (cdxady - adxcdy) + cdz * (adxbdy - bdxady);
var permanent = (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz) + (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz) + (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz);
var tol = ERRBOUND4 * permanent;
if (det > tol || -det > tol) {
return det;
}
return orientation4Exact(a, b, c, d);
}
];
function slowOrient(args) {
var proc2 = CACHED[args.length];
if (!proc2) {
proc2 = CACHED[args.length] = orientation(args.length);
}
return proc2.apply(void 0, args);
}
function proc(slow, o0, o1, o2, o3, o4, o5) {
return function getOrientation(a0, a1, a2, a3, a4) {
switch (arguments.length) {
case 0:
case 1:
return 0;
case 2:
return o2(a0, a1);
case 3:
return o3(a0, a1, a2);
case 4:
return o4(a0, a1, a2, a3);
case 5:
return o5(a0, a1, a2, a3, a4);
}
var s = new Array(arguments.length);
for (var i = 0; i < arguments.length; ++i) {
s[i] = arguments[i];
}
return slow(s);
};
}
function generateOrientationProc() {
while (CACHED.length <= NUM_EXPAND) {
CACHED.push(orientation(CACHED.length));
}
module.exports = proc.apply(void 0, [slowOrient].concat(CACHED));
for (var i = 0; i <= NUM_EXPAND; ++i) {
module.exports[i] = CACHED[i];
}
}
generateOrientationProc();
}
});
// node_modules/cdt2d/lib/monotone.js
var require_monotone = __commonJS({
"node_modules/cdt2d/lib/monotone.js"(exports, module) {
"use strict";
var bsearch = require_search_bounds();
var orient = require_orientation()[3];
var EVENT_POINT = 0;
var EVENT_END = 1;
var EVENT_START = 2;
module.exports = monotoneTriangulate;
function PartialHull(a, b, idx, lowerIds, upperIds) {
this.a = a;
this.b = b;
this.idx = idx;
this.lowerIds = lowerIds;
this.upperIds = upperIds;
}
function Event(a, b, type, idx) {
this.a = a;
this.b = b;
this.type = type;
this.idx = idx;
}
function compareEvent(a, b) {
var d = a.a[0] - b.a[0] || a.a[1] - b.a[1] || a.type - b.type;
if (d) {
return d;
}
if (a.type !== EVENT_POINT) {
d = orient(a.a, a.b, b.b);
if (d) {
return d;
}
}
return a.idx - b.idx;
}
function testPoint(hull, p) {
return orient(hull.a, hull.b, p);
}
function addPoint(cells, hulls, points, p, idx) {
var lo = bsearch.lt(hulls, p, testPoint);
var hi = bsearch.gt(hulls, p, testPoint);
for (var i = lo; i < hi; ++i) {
var hull = hulls[i];
var lowerIds = hull.lowerIds;
var m = lowerIds.length;
while (m > 1 && orient(
points[lowerIds[m - 2]],
points[lowerIds[m - 1]],
p
) > 0) {
cells.push(
[
lowerIds[m - 1],
lowerIds[m - 2],
idx
]
);
m -= 1;
}
lowerIds.length = m;
lowerIds.push(idx);
var upperIds = hull.upperIds;
var m = upperIds.length;
while (m > 1 && orient(
points[upperIds[m - 2]],
points[upperIds[m - 1]],
p
) < 0) {
cells.push(
[
upperIds[m - 2],
upperIds[m - 1],
idx
]
);
m -= 1;
}
upperIds.length = m;
upperIds.push(idx);
}
}
function findSplit(hull, edge) {
var d;
if (hull.a[0] < edge.a[0]) {
d = orient(hull.a, hull.b, edge.a);
} else {
d = orient(edge.b, edge.a, hull.a);
}
if (d) {
return d;
}
if (edge.b[0] < hull.b[0]) {
d = orient(hull.a, hull.b, edge.b);
} else {
d = orient(edge.b, edge.a, hull.b);
}
return d || hull.idx - edge.idx;
}
function splitHulls(hulls, points, event) {
var splitIdx = bsearch.le(hulls, event, findSplit);
var hull = hulls[splitIdx];
var upperIds = hull.upperIds;
var x = upperIds[upperIds.length - 1];
hull.upperIds = [x];
hulls.splice(
splitIdx + 1,
0,
new PartialHull(event.a, event.b, event.idx, [x], upperIds)
);
}
function mergeHulls(hulls, points, event) {
var tmp = event.a;
event.a = event.b;
event.b = tmp;
var mergeIdx = bsearch.eq(hulls, event, findSplit);
var upper = hulls[mergeIdx];
var lower = hulls[mergeIdx - 1];
lower.upperIds = upper.upperIds;
hulls.splice(mergeIdx, 1);
}
function monotoneTriangulate(points, edges) {
var numPoints = points.length;
var numEdges = edges.length;
var events = [];
for (var i = 0; i < numPoints; ++i) {
events.push(new Event(
points[i],
null,
EVENT_POINT,
i
));
}
for (var i = 0; i < numEdges; ++i) {
var e = edges[i];
var a = points[e[0]];
var b = points[e[1]];
if (a[0] < b[0]) {
events.push(
new Event(a, b, EVENT_START, i),
new Event(b, a, EVENT_END, i)
);
} else if (a[0] > b[0]) {
events.push(
new Event(b, a, EVENT_START, i),
new Event(a, b, EVENT_END, i)
);
}
}
events.sort(compareEvent);
var minX = events[0].a[0] - (1 + Math.abs(events[0].a[0])) * Math.pow(2, -52);
var hull = [new PartialHull([minX, 1], [minX, 0], -1, [], [], [], [])];
var cells = [];
for (var i = 0, numEvents = events.length; i < numEvents; ++i) {
var event = events[i];
var type = event.type;
if (type === EVENT_POINT) {
addPoint(cells, hull, points, event.a, event.idx);
} else if (type === EVENT_START) {
splitHulls(hull, points, event);
} else {
mergeHulls(hull, points, event);
}
}
return cells;
}
}
});
// node_modules/cdt2d/lib/triangulation.js
var require_triangulation = __commonJS({
"node_modules/cdt2d/lib/triangulation.js"(exports, module) {
"use strict";
var bsearch = require_search_bounds();
module.exports = createTriangulation;
function Triangulation(stars, edges) {
this.stars = stars;
this.edges = edges;
}
var proto = Triangulation.prototype;
function removePair(list, j, k) {
for (var i = 1, n = list.length; i < n; i += 2) {
if (list[i - 1] === j && list[i] === k) {
list[i - 1] = list[n - 2];
list[i] = list[n - 1];
list.length = n - 2;
return;
}
}
}
proto.isConstraint = /* @__PURE__ */ (function() {
var e = [0, 0];
function compareLex(a, b) {
return a[0] - b[0] || a[1] - b[1];
}
return function(i, j) {
e[0] = Math.min(i, j);
e[1] = Math.max(i, j);
return bsearch.eq(this.edges, e, compareLex) >= 0;
};
})();
proto.removeTriangle = function(i, j, k) {
var stars = this.stars;
removePair(stars[i], j, k);
removePair(stars[j], k, i);
removePair(stars[k], i, j);
};
proto.addTriangle = function(i, j, k) {
var stars = this.stars;
stars[i].push(j, k);
stars[j].push(k, i);
stars[k].push(i, j);
};
proto.opposite = function(j, i) {
var list = this.stars[i];
for (var k = 1, n = list.length; k < n; k += 2) {
if (list[k] === j) {
return list[k - 1];
}
}
return -1;
};
proto.flip = function(i, j) {
var a = this.opposite(i, j);
var b = this.opposite(j, i);
this.removeTriangle(i, j, a);
this.removeTriangle(j, i, b);
this.addTriangle(i, b, a);
this.addTriangle(j, a, b);
};
proto.edges = function() {
var stars = this.stars;
var result = [];
for (var i = 0, n = stars.length; i < n; ++i) {
var list = stars[i];
for (var j = 0, m = list.length; j < m; j += 2) {
result.push([list[j], list[j + 1]]);
}
}
return result;
};
proto.cells = function() {
var stars = this.stars;
var result = [];
for (var i = 0, n = stars.length; i < n; ++i) {
var list = stars[i];
for (var j = 0, m = list.length; j < m; j += 2) {
var s = list[j];
var t = list[j + 1];
if (i < Math.min(s, t)) {
result.push([i, s, t]);
}
}
}
return result;
};
function createTriangulation(numVerts, edges) {
var stars = new Array(numVerts);
for (var i = 0; i < numVerts; ++i) {
stars[i] = [];
}
return new Triangulation(stars, edges);
}
}
});
// node_modules/robust-in-sphere/in-sphere.js
var require_in_sphere = __commonJS({
"node_modules/robust-in-sphere/in-sphere.js"(exports, module) {
"use strict";
var twoProduct = require_two_product();
var robustSum = require_robust_sum();
var robustDiff = require_robust_diff();
var robustScale = require_robust_scale();
var NUM_EXPAND = 6;
function orientation(n) {
var fn = n === 3 ? inSphere3 : n === 4 ? inSphere4 : n === 5 ? inSphere5 : inSphere6;
return fn(robustSum, robustDiff, twoProduct, robustScale);
}
function inSphere0() {
return 0;
}
function inSphere1() {
return 0;
}
function inSphere2() {
return 0;
}
function inSphere3(sum, diff, prod, scale) {
function exactInSphere3(m0, m1, m2) {
var w0 = prod(m0[0], m0[0]);
var w0m1 = scale(w0, m1[0]);
var w0m2 = scale(w0, m2[0]);
var w1 = prod(m1[0], m1[0]);
var w1m0 = scale(w1, m0[0]);
var w1m2 = scale(w1, m2[0]);
var w2 = prod(m2[0], m2[0]);
var w2m0 = scale(w2, m0[0]);
var w2m1 = scale(w2, m1[0]);
var p = sum(diff(w2m1, w1m2), diff(w1m0, w0m1));
var n = diff(w2m0, w0m2);
var d = diff(p, n);
return d[d.length - 1];
}
return exactInSphere3;
}
function inSphere4(sum, diff, prod, scale) {
function exactInSphere4(m0, m1, m2, m3) {
var w0 = sum(prod(m0[0], m0[0]), prod(m0[1], m0[1]));
var w0m1 = scale(w0, m1[0]);
var w0m2 = scale(w0, m2[0]);
var w0m3 = scale(w0, m3[0]);
var w1 = sum(prod(m1[0], m1[0]), prod(m1[1], m1[1]));
var w1m0 = scale(w1, m0[0]);
var w1m2 = scale(w1, m2[0]);
var w1m3 = scale(w1, m3[0]);
var w2 = sum(prod(m2[0], m2[0]), prod(m2[1], m2[1]));
var w2m0 = scale(w2, m0[0]);
var w2m1 = scale(w2, m1[0]);
var w2m3 = scale(w2, m3[0]);
var w3 = sum(prod(m3[0], m3[0]), prod(m3[1], m3[1]));
var w3m0 = scale(w3, m0[0]);
var w3m1 = scale(w3, m1[0]);
var w3m2 = scale(w3, m2[0]);
var p = sum(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))));
var n = sum(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))));
var d = diff(p, n);
return d[d.length - 1];
}
return exactInSphere4;
}
function inSphere5(sum, diff, prod, scale) {
function exactInSphere5(m0, m1, m2, m3, m4) {
var w0 = sum(prod(m0[0], m0[0]), sum(prod(m0[1], m0[1]), prod(m0[2], m0[2])));
var w0m1 = scale(w0, m1[0]);
var w0m2 = scale(w0, m2[0]);
var w0m3 = scale(w0, m3[0]);
var w0m4 = scale(w0, m4[0]);
var w1 = sum(prod(m1[0], m1[0]), sum(prod(m1[1], m1[1]), prod(m1[2], m1[2])));
var w1m0 = scale(w1, m0[0]);
var w1m2 = scale(w1, m2[0]);
var w1m3 = scale(w1, m3[0]);
var w1m4 = scale(w1, m4[0]);
var w2 = sum(prod(m2[0], m2[0]), sum(prod(m2[1], m2[1]), prod(m2[2], m2[2])));
var w2m0 = scale(w2, m0[0]);
var w2m1 = scale(w2, m1[0]);
var w2m3 = scale(w2, m3[0]);
var w2m4 = scale(w2, m4[0]);
var w3 = sum(prod(m3[0], m3[0]), sum(prod(m3[1], m3[1]), prod(m3[2], m3[2])));
var w3m0 = scale(w3, m0[0]);
var w3m1 = scale(w3, m1[0]);
var w3m2 = scale(w3, m2[0]);
var w3m4 = scale(w3, m4[0]);
var w4 = sum(prod(m4[0], m4[0]), sum(prod(m4[1], m4[1]), prod(m4[2], m4[2])));
var w4m0 = scale(w4, m0[0]);
var w4m1 = scale(w4, m1[0]);
var w4m2 = scale(w4, m2[0]);
var w4m3 = scale(w4, m3[0]);
var p = sum(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m1[2]), sum(scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m2[2]), scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m3[2]))), sum(scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m4[2]), sum(scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m1[2])))), sum(sum(scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), m3[2]), sum(scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m4[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), m0[2]))), sum(scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m1[2]), sum(scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m3[2])))));
var n = sum(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m2[2])), sum(scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m4[2]))), sum(sum(scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m0[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), -m1[2])), sum(scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m4[2]))));
var d = diff(p, n);
return d[d.length - 1];
}
return exactInSphere5;
}
function inSphere6(sum, diff, prod, scale) {
function exactInSphere6(m0, m1, m2, m3, m4, m5) {
var w0 = sum(sum(prod(m0[0], m0[0]), prod(m0[1], m0[1])), sum(prod(m0[2], m0[2]), prod(m0[3], m0[3])));
var w0m1 = scale(w0, m1[0]);
var w0m2 = scale(w0, m2[0]);
var w0m3 = scale(w0, m3[0]);
var w0m4 = scale(w0, m4[0]);
var w0m5 = scale(w0, m5[0]);
var w1 = sum(sum(prod(m1[0], m1[0]), prod(m1[1], m1[1])), sum(prod(m1[2], m1[2]), prod(m1[3], m1[3])));
var w1m0 = scale(w1, m0[0]);
var w1m2 = scale(w1, m2[0]);
var w1m3 = scale(w1, m3[0]);
var w1m4 = scale(w1, m4[0]);
var w1m5 = scale(w1, m5[0]);
var w2 = sum(sum(prod(m2[0], m2[0]), prod(m2[1], m2[1])), sum(prod(m2[2], m2[2]), prod(m2[3], m2[3])));
var w2m0 = scale(w2, m0[0]);
var w2m1 = scale(w2, m1[0]);
var w2m3 = scale(w2, m3[0]);
var w2m4 = scale(w2, m4[0]);
var w2m5 = scale(w2, m5[0]);
var w3 = sum(sum(prod(m3[0], m3[0]), prod(m3[1], m3[1])), sum(prod(m3[2], m3[2]), prod(m3[3], m3[3])));
var w3m0 = scale(w3, m0[0]);
var w3m1 = scale(w3, m1[0]);
var w3m2 = scale(w3, m2[0]);
var w3m4 = scale(w3, m4[0]);
var w3m5 = scale(w3, m5[0]);
var w4 = sum(sum(prod(m4[0], m4[0]), prod(m4[1], m4[1])), sum(prod(m4[2], m4[2]), prod(m4[3], m4[3])));
var w4m0 = scale(w4, m0[0]);
var w4m1 = scale(w4, m1[0]);
var w4m2 = scale(w4, m2[0]);
var w4m3 = scale(w4, m3[0]);
var w4m5 = scale(w4, m5[0]);
var w5 = sum(sum(prod(m5[0], m5[0]), prod(m5[1], m5[1])), sum(prod(m5[2], m5[2]), prod(m5[3], m5[3])));
var w5m0 = scale(w5, m0[0]);
var w5m1 = scale(w5, m1[0]);
var w5m2 = scale(w5, m2[0]);
var w5m3 = scale(w5, m3[0]);
var w5m4 = scale(w5, m4[0]);
var p = sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m2[2]), scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), -m5[2]))), m1[3]), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m5[2]))), -m2[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), -m5[2]))), m3[3]))), sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m1[2]), scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m5[2]))), -m4[3]), scale(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m1[2]), scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m2[2])), sum(scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m4[2]))), m5[3])), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), -m5[2]))), m0[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m5[2]))), -m1[3])))), sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m4[2]), scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), -m5[2]))), m3[3]), scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m3[2]), scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m5[2]))), -m4[3])), sum(scale(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m3[1]), scale(diff(w3m1, w1m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m1[2])), sum(scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), m3[2]), scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m4[2]))), m5[3]), scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m1[2]), scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), -m5[2]))), m0[3]))), sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m5[2]))), -m1[3]), scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m3[1]), scale(diff(w3m1, w1m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m3[2]), scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), -m5[2]))), m2[3])), sum(scale(sum(sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m0[2]), scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m5[2]))), -m3[3]), scale(sum(sum(scale(sum(scale(diff(w3m2, w2m3), m1[1]), sum(scale(diff(w3m1, w1m3), -m2[1]), scale(diff(w2m1, w1m2), m3[1]))), m0[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m1[2])), sum(scale(sum(scale(diff(w3m1, w1m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m1[1]), scale(diff(w1m0, w0m1), m3[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m3[2]))), m5[3])))));
var n = sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m2[2]), scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), -m5[2]))), m0[3]), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m3[1]), sum(scale(diff(w5m3, w3m5), -m4[1]), scale(diff(w4m3, w3m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m3[2])), sum(scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), m4[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m5[2]))), -m2[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), -m5[2]))), m3[3]))), sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m3, w3m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m3[1]), scale(diff(w3m2, w2m3), m5[1]))), m0[2]), scale(sum(scale(diff(w5m3, w3m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m3[1]), scale(diff(w3m0, w0m3), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m5[2]))), -m4[3]), scale(sum(sum(scale(sum(scale(diff(w4m3, w3m4), m2[1]), sum(scale(diff(w4m2, w2m4), -m3[1]), scale(diff(w3m2, w2m3), m4[1]))), m0[2]), scale(sum(scale(diff(w4m3, w3m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m3[1]), scale(diff(w3m0, w0m3), m4[1]))), -m2[2])), sum(scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), m3[2]), scale(sum(scale(diff(w3m2, w2m3), m0[1]), sum(scale(diff(w3m0, w0m3), -m2[1]), scale(diff(w2m0, w0m2), m3[1]))), -m4[2]))), m5[3])), sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m1[2]), scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), -m5[2]))), m0[3]), scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m2[1]), sum(scale(diff(w5m2, w2m5), -m4[1]), scale(diff(w4m2, w2m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m2[2])), sum(scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), m4[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), scale(diff(w2m0, w0m2), m4[1]))), -m5[2]))), -m1[3])))), sum(sum(sum(scale(sum(sum(scale(sum(scale(diff(w5m4, w4m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m4[1]), scale(diff(w4m1, w1m4), m5[1]))), m0[2]), scale(sum(scale(diff(w5m4, w4m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m4[1]), scale(diff(w4m0, w0m4), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m4[2]), scale(sum(scale(diff(w4m1, w1m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m1[1]), scale(diff(w1m0, w0m1), m4[1]))), -m5[2]))), m2[3]), scale(sum(sum(scale(sum(scale(diff(w5m2, w2m5), m1[1]), sum(scale(diff(w5m1, w1m5), -m2[1]), scale(diff(w2m1, w1m2), m5[1]))), m0[2]), scale(sum(scale(diff(w5m2, w2m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m2[1]), scale(diff(w2m0, w0m2), m5[1]))), -m1[2])), sum(scale(sum(scale(diff(w5m1, w1m5), m0[1]), sum(scale(diff(w5m0, w0m5), -m1[1]), scale(diff(w1m0, w0m1), m5[1]))), m2[2]), scale(sum(scale(diff(w2m1, w1m2), m0[1]), sum(scale(diff(w2m0, w0m2), -m1[1]), scale(diff(w1m0, w0m1), m2[1]))), -m5[2]))), -m4[3])), sum(scale(sum(sum(scale(sum(scale(diff(w4m2, w2m4), m1[1]), sum(scale(diff(w4m1, w1m4), -m2[1]), scale(diff(w2m1, w1m2), m4[1]))), m0[2]), scale(sum(scale(diff(w4m2, w2m4), m0[1]), sum(scale(diff(w4m0, w0m4), -m2[1]), s