var Human = (() => { var __create = Object.create; var __defProp = Object.defineProperty; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); var __commonJS = (callback, module) => () => { if (!module) { module = {exports: {}}; callback(module.exports, module); } return module.exports; }; var __export = (target, all3) => { __markAsModule(target); for (var name in all3) __defProp(target, name, {get: all3[name], enumerable: true}); }; var __exportStar = (target, module, desc) => { __markAsModule(target); if (typeof module === "object" || typeof module === "function") { for (let key of __getOwnPropNames(module)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable}); } return target; }; var __toModule = (module) => { if (module && module.__esModule) return module; return __exportStar(__defProp(__create(__getProtoOf(module)), "default", {value: module, enumerable: true}), module); }; // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/lib/alea.js var require_alea = __commonJS((exports3, module) => { (function(global2, module2, define2) { function Alea(seed) { var me = this, mash = Mash(); me.next = function() { var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; me.s0 = me.s1; me.s1 = me.s2; return me.s2 = t - (me.c = t | 0); }; me.c = 1; me.s0 = mash(" "); me.s1 = mash(" "); me.s2 = mash(" "); me.s0 -= mash(seed); if (me.s0 < 0) { me.s0 += 1; } me.s1 -= mash(seed); if (me.s1 < 0) { me.s1 += 1; } me.s2 -= mash(seed); if (me.s2 < 0) { me.s2 += 1; } mash = null; } function copy(f, t) { t.c = f.c; t.s0 = f.s0; t.s1 = f.s1; t.s2 = f.s2; return t; } function impl(seed, opts) { var xg = new Alea(seed), state6 = opts && opts.state, prng = xg.next; prng.int32 = function() { return xg.next() * 4294967296 | 0; }; prng.double = function() { return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; }; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } function Mash() { var n = 4022871197; var mash = function(data) { data = data.toString(); for (var i = 0; i < data.length; i++) { n += data.charCodeAt(i); var h = 0.02519603282416938 * n; n = h >>> 0; h -= n; h *= n; n = h >>> 0; h -= n; n += h * 4294967296; } return (n >>> 0) * 23283064365386963e-26; }; return mash; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.alea = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/lib/xor128.js var require_xor128 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this, strseed = ""; me.x = 0; me.y = 0; me.z = 0; me.w = 0; me.next = function() { var t = me.x ^ me.x << 11; me.x = me.y; me.y = me.z; me.z = me.w; return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; }; if (seed === (seed | 0)) { me.x = seed; } else { strseed += seed; } for (var k = 0; k < strseed.length + 64; k++) { me.x ^= strseed.charCodeAt(k) | 0; me.next(); } } function copy(f, t) { t.x = f.x; t.y = f.y; t.z = f.z; t.w = f.w; return t; } function impl(seed, opts) { var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xor128 = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/lib/xorwow.js var require_xorwow = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this, strseed = ""; me.next = function() { var t = me.x ^ me.x >>> 2; me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v; return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; }; me.x = 0; me.y = 0; me.z = 0; me.w = 0; me.v = 0; if (seed === (seed | 0)) { me.x = seed; } else { strseed += seed; } for (var k = 0; k < strseed.length + 64; k++) { me.x ^= strseed.charCodeAt(k) | 0; if (k == strseed.length) { me.d = me.x << 10 ^ me.x >>> 4; } me.next(); } } function copy(f, t) { t.x = f.x; t.y = f.y; t.z = f.z; t.w = f.w; t.v = f.v; t.d = f.d; return t; } function impl(seed, opts) { var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xorwow = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/lib/xorshift7.js var require_xorshift7 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this; me.next = function() { var X = me.x, i = me.i, t, v, w; t = X[i]; t ^= t >>> 7; v = t ^ t << 24; t = X[i + 1 & 7]; v ^= t ^ t >>> 10; t = X[i + 3 & 7]; v ^= t ^ t >>> 3; t = X[i + 4 & 7]; v ^= t ^ t << 7; t = X[i + 7 & 7]; t = t ^ t << 13; v ^= t ^ t << 9; X[i] = v; me.i = i + 1 & 7; return v; }; function init2(me2, seed2) { var j, w, X = []; if (seed2 === (seed2 | 0)) { w = X[0] = seed2; } else { seed2 = "" + seed2; for (j = 0; j < seed2.length; ++j) { X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; } } while (X.length < 8) X.push(0); for (j = 0; j < 8 && X[j] === 0; ++j) ; if (j == 8) w = X[7] = -1; else w = X[j]; me2.x = X; me2.i = 0; for (j = 256; j > 0; --j) { me2.next(); } } init2(me, seed); } function copy(f, t) { t.x = f.x.slice(); t.i = f.i; return t; } function impl(seed, opts) { if (seed == null) seed = +new Date(); var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (state6.x) copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xorshift7 = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/lib/xor4096.js var require_xor4096 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this; me.next = function() { var w = me.w, X = me.X, i = me.i, t, v; me.w = w = w + 1640531527 | 0; v = X[i + 34 & 127]; t = X[i = i + 1 & 127]; v ^= v << 13; t ^= t << 17; v ^= v >>> 15; t ^= t >>> 12; v = X[i] = v ^ t; me.i = i; return v + (w ^ w >>> 16) | 0; }; function init2(me2, seed2) { var t, v, i, j, w, X = [], limit = 128; if (seed2 === (seed2 | 0)) { v = seed2; seed2 = null; } else { seed2 = seed2 + "\0"; v = 0; limit = Math.max(limit, seed2.length); } for (i = 0, j = -32; j < limit; ++j) { if (seed2) v ^= seed2.charCodeAt((j + 32) % seed2.length); if (j === 0) w = v; v ^= v << 10; v ^= v >>> 15; v ^= v << 4; v ^= v >>> 13; if (j >= 0) { w = w + 1640531527 | 0; t = X[j & 127] ^= v + w; i = t == 0 ? i + 1 : 0; } } if (i >= 128) { X[(seed2 && seed2.length || 0) & 127] = -1; } i = 127; for (j = 4 * 128; j > 0; --j) { v = X[i + 34 & 127]; t = X[i = i + 1 & 127]; v ^= v << 13; t ^= t << 17; v ^= v >>> 15; t ^= t >>> 12; X[i] = v ^ t; } me2.w = w; me2.X = X; me2.i = i; } init2(me, seed); } function copy(f, t) { t.i = f.i; t.w = f.w; t.X = f.X.slice(); return t; } ; function impl(seed, opts) { if (seed == null) seed = +new Date(); var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (state6.X) copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xor4096 = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/lib/tychei.js var require_tychei = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this, strseed = ""; me.next = function() { var b = me.b, c = me.c, d = me.d, a = me.a; b = b << 25 ^ b >>> 7 ^ c; c = c - d | 0; d = d << 24 ^ d >>> 8 ^ a; a = a - b | 0; me.b = b = b << 20 ^ b >>> 12 ^ c; me.c = c = c - d | 0; me.d = d << 16 ^ c >>> 16 ^ a; return me.a = a - b | 0; }; me.a = 0; me.b = 0; me.c = 2654435769 | 0; me.d = 1367130551; if (seed === Math.floor(seed)) { me.a = seed / 4294967296 | 0; me.b = seed | 0; } else { strseed += seed; } for (var k = 0; k < strseed.length + 20; k++) { me.b ^= strseed.charCodeAt(k) | 0; me.next(); } } function copy(f, t) { t.a = f.a; t.b = f.b; t.c = f.c; t.d = f.d; return t; } ; function impl(seed, opts) { var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.tychei = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // empty:crypto var require_crypto = __commonJS(() => { }); // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/seedrandom.js var require_seedrandom = __commonJS((exports3, module) => { (function(pool3, math) { var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; function seedrandom4(seed, options, callback) { var key = []; options = options == true ? {entropy: true} : options || {}; var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); var arc4 = new ARC4(key); var prng = function() { var n = arc4.g(chunks), d = startdenom, x = 0; while (n < significance) { n = (n + x) * width; d *= width; x = arc4.g(1); } while (n >= overflow) { n /= 2; d /= 2; x >>>= 1; } return (n + x) / d; }; prng.int32 = function() { return arc4.g(4) | 0; }; prng.quick = function() { return arc4.g(4) / 4294967296; }; prng.double = prng; mixkey(tostring(arc4.S), pool3); return (options.pass || callback || function(prng2, seed2, is_math_call, state6) { if (state6) { if (state6.S) { copy(state6, arc4); } prng2.state = function() { return copy(arc4, {}); }; } if (is_math_call) { math[rngname] = prng2; return seed2; } else return prng2; })(prng, shortseed, "global" in options ? options.global : this == math, options.state); } math["seed" + rngname] = seedrandom4; function ARC4(key) { var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; if (!keylen) { key = [keylen++]; } while (i < width) { s[i] = i++; } for (i = 0; i < width; i++) { s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; s[j] = t; } (me.g = function(count2) { var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; while (count2--) { t2 = s2[i2 = mask & i2 + 1]; r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; } me.i = i2; me.j = j2; return r; })(width); } function copy(f, t) { t.i = f.i; t.j = f.j; t.S = f.S.slice(); return t; } ; function flatten4(obj, depth) { var result = [], typ = typeof obj, prop; if (depth && typ == "object") { for (prop in obj) { try { result.push(flatten4(obj[prop], depth - 1)); } catch (e) { } } } return result.length ? result : typ == "string" ? obj : obj + "\0"; } function mixkey(seed, key) { var stringseed = seed + "", smear, j = 0; while (j < stringseed.length) { key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); } return tostring(key); } function autoseed() { try { var out; if (nodecrypto && (out = nodecrypto.randomBytes)) { out = out(width); } else { out = new Uint8Array(width); (global2.crypto || global2.msCrypto).getRandomValues(out); } return tostring(out); } catch (e) { var browser = global2.navigator, plugins = browser && browser.plugins; return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; } } function tostring(a) { return String.fromCharCode.apply(0, a); } mixkey(math.random(), pool3); if (typeof module == "object" && module.exports) { module.exports = seedrandom4; try { nodecrypto = require_crypto(); } catch (ex) { } } else if (typeof define == "function" && define.amd) { define(function() { return seedrandom4; }); } })([], Math); }); // node_modules/@tensorflow/tfjs-core/node_modules/seedrandom/index.js var require_seedrandom2 = __commonJS((exports3, module) => { var alea4 = require_alea(); var xor128 = require_xor128(); var xorwow = require_xorwow(); var xorshift7 = require_xorshift7(); var xor4096 = require_xor4096(); var tychei = require_tychei(); var sr = require_seedrandom(); sr.alea = alea4; sr.xor128 = xor128; sr.xorwow = xorwow; sr.xorshift7 = xorshift7; sr.xor4096 = xor4096; sr.tychei = tychei; module.exports = sr; }); // node_modules/seedrandom/lib/alea.js var require_alea2 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function Alea(seed) { var me = this, mash = Mash(); me.next = function() { var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; me.s0 = me.s1; me.s1 = me.s2; return me.s2 = t - (me.c = t | 0); }; me.c = 1; me.s0 = mash(" "); me.s1 = mash(" "); me.s2 = mash(" "); me.s0 -= mash(seed); if (me.s0 < 0) { me.s0 += 1; } me.s1 -= mash(seed); if (me.s1 < 0) { me.s1 += 1; } me.s2 -= mash(seed); if (me.s2 < 0) { me.s2 += 1; } mash = null; } function copy(f, t) { t.c = f.c; t.s0 = f.s0; t.s1 = f.s1; t.s2 = f.s2; return t; } function impl(seed, opts) { var xg = new Alea(seed), state6 = opts && opts.state, prng = xg.next; prng.int32 = function() { return xg.next() * 4294967296 | 0; }; prng.double = function() { return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; }; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } function Mash() { var n = 4022871197; var mash = function(data) { data = String(data); for (var i = 0; i < data.length; i++) { n += data.charCodeAt(i); var h = 0.02519603282416938 * n; n = h >>> 0; h -= n; h *= n; n = h >>> 0; h -= n; n += h * 4294967296; } return (n >>> 0) * 23283064365386963e-26; }; return mash; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.alea = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/seedrandom/lib/xor128.js var require_xor1282 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this, strseed = ""; me.x = 0; me.y = 0; me.z = 0; me.w = 0; me.next = function() { var t = me.x ^ me.x << 11; me.x = me.y; me.y = me.z; me.z = me.w; return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; }; if (seed === (seed | 0)) { me.x = seed; } else { strseed += seed; } for (var k = 0; k < strseed.length + 64; k++) { me.x ^= strseed.charCodeAt(k) | 0; me.next(); } } function copy(f, t) { t.x = f.x; t.y = f.y; t.z = f.z; t.w = f.w; return t; } function impl(seed, opts) { var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xor128 = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/seedrandom/lib/xorwow.js var require_xorwow2 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this, strseed = ""; me.next = function() { var t = me.x ^ me.x >>> 2; me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v; return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; }; me.x = 0; me.y = 0; me.z = 0; me.w = 0; me.v = 0; if (seed === (seed | 0)) { me.x = seed; } else { strseed += seed; } for (var k = 0; k < strseed.length + 64; k++) { me.x ^= strseed.charCodeAt(k) | 0; if (k == strseed.length) { me.d = me.x << 10 ^ me.x >>> 4; } me.next(); } } function copy(f, t) { t.x = f.x; t.y = f.y; t.z = f.z; t.w = f.w; t.v = f.v; t.d = f.d; return t; } function impl(seed, opts) { var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xorwow = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/seedrandom/lib/xorshift7.js var require_xorshift72 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this; me.next = function() { var X = me.x, i = me.i, t, v, w; t = X[i]; t ^= t >>> 7; v = t ^ t << 24; t = X[i + 1 & 7]; v ^= t ^ t >>> 10; t = X[i + 3 & 7]; v ^= t ^ t >>> 3; t = X[i + 4 & 7]; v ^= t ^ t << 7; t = X[i + 7 & 7]; t = t ^ t << 13; v ^= t ^ t << 9; X[i] = v; me.i = i + 1 & 7; return v; }; function init2(me2, seed2) { var j, w, X = []; if (seed2 === (seed2 | 0)) { w = X[0] = seed2; } else { seed2 = "" + seed2; for (j = 0; j < seed2.length; ++j) { X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; } } while (X.length < 8) X.push(0); for (j = 0; j < 8 && X[j] === 0; ++j) ; if (j == 8) w = X[7] = -1; else w = X[j]; me2.x = X; me2.i = 0; for (j = 256; j > 0; --j) { me2.next(); } } init2(me, seed); } function copy(f, t) { t.x = f.x.slice(); t.i = f.i; return t; } function impl(seed, opts) { if (seed == null) seed = +new Date(); var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (state6.x) copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xorshift7 = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/seedrandom/lib/xor4096.js var require_xor40962 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this; me.next = function() { var w = me.w, X = me.X, i = me.i, t, v; me.w = w = w + 1640531527 | 0; v = X[i + 34 & 127]; t = X[i = i + 1 & 127]; v ^= v << 13; t ^= t << 17; v ^= v >>> 15; t ^= t >>> 12; v = X[i] = v ^ t; me.i = i; return v + (w ^ w >>> 16) | 0; }; function init2(me2, seed2) { var t, v, i, j, w, X = [], limit = 128; if (seed2 === (seed2 | 0)) { v = seed2; seed2 = null; } else { seed2 = seed2 + "\0"; v = 0; limit = Math.max(limit, seed2.length); } for (i = 0, j = -32; j < limit; ++j) { if (seed2) v ^= seed2.charCodeAt((j + 32) % seed2.length); if (j === 0) w = v; v ^= v << 10; v ^= v >>> 15; v ^= v << 4; v ^= v >>> 13; if (j >= 0) { w = w + 1640531527 | 0; t = X[j & 127] ^= v + w; i = t == 0 ? i + 1 : 0; } } if (i >= 128) { X[(seed2 && seed2.length || 0) & 127] = -1; } i = 127; for (j = 4 * 128; j > 0; --j) { v = X[i + 34 & 127]; t = X[i = i + 1 & 127]; v ^= v << 13; t ^= t << 17; v ^= v >>> 15; t ^= t >>> 12; X[i] = v ^ t; } me2.w = w; me2.X = X; me2.i = i; } init2(me, seed); } function copy(f, t) { t.i = f.i; t.w = f.w; t.X = f.X.slice(); return t; } ; function impl(seed, opts) { if (seed == null) seed = +new Date(); var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (state6.X) copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.xor4096 = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/seedrandom/lib/tychei.js var require_tychei2 = __commonJS((exports3, module) => { (function(global2, module2, define2) { function XorGen(seed) { var me = this, strseed = ""; me.next = function() { var b = me.b, c = me.c, d = me.d, a = me.a; b = b << 25 ^ b >>> 7 ^ c; c = c - d | 0; d = d << 24 ^ d >>> 8 ^ a; a = a - b | 0; me.b = b = b << 20 ^ b >>> 12 ^ c; me.c = c = c - d | 0; me.d = d << 16 ^ c >>> 16 ^ a; return me.a = a - b | 0; }; me.a = 0; me.b = 0; me.c = 2654435769 | 0; me.d = 1367130551; if (seed === Math.floor(seed)) { me.a = seed / 4294967296 | 0; me.b = seed | 0; } else { strseed += seed; } for (var k = 0; k < strseed.length + 20; k++) { me.b ^= strseed.charCodeAt(k) | 0; me.next(); } } function copy(f, t) { t.a = f.a; t.b = f.b; t.c = f.c; t.d = f.d; return t; } ; function impl(seed, opts) { var xg = new XorGen(seed), state6 = opts && opts.state, prng = function() { return (xg.next() >>> 0) / 4294967296; }; prng.double = function() { do { var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); } while (result === 0); return result; }; prng.int32 = xg.next; prng.quick = prng; if (state6) { if (typeof state6 == "object") copy(state6, xg); prng.state = function() { return copy(xg, {}); }; } return prng; } if (module2 && module2.exports) { module2.exports = impl; } else if (define2 && define2.amd) { define2(function() { return impl; }); } else { this.tychei = impl; } })(exports3, typeof module == "object" && module, typeof define == "function" && define); }); // node_modules/seedrandom/seedrandom.js var require_seedrandom3 = __commonJS((exports3, module) => { (function(global2, pool3, math) { var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; function seedrandom4(seed, options, callback) { var key = []; options = options == true ? {entropy: true} : options || {}; var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); var arc4 = new ARC4(key); var prng = function() { var n = arc4.g(chunks), d = startdenom, x = 0; while (n < significance) { n = (n + x) * width; d *= width; x = arc4.g(1); } while (n >= overflow) { n /= 2; d /= 2; x >>>= 1; } return (n + x) / d; }; prng.int32 = function() { return arc4.g(4) | 0; }; prng.quick = function() { return arc4.g(4) / 4294967296; }; prng.double = prng; mixkey(tostring(arc4.S), pool3); return (options.pass || callback || function(prng2, seed2, is_math_call, state6) { if (state6) { if (state6.S) { copy(state6, arc4); } prng2.state = function() { return copy(arc4, {}); }; } if (is_math_call) { math[rngname] = prng2; return seed2; } else return prng2; })(prng, shortseed, "global" in options ? options.global : this == math, options.state); } function ARC4(key) { var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; if (!keylen) { key = [keylen++]; } while (i < width) { s[i] = i++; } for (i = 0; i < width; i++) { s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; s[j] = t; } (me.g = function(count2) { var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; while (count2--) { t2 = s2[i2 = mask & i2 + 1]; r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; } me.i = i2; me.j = j2; return r; })(width); } function copy(f, t) { t.i = f.i; t.j = f.j; t.S = f.S.slice(); return t; } ; function flatten4(obj, depth) { var result = [], typ = typeof obj, prop; if (depth && typ == "object") { for (prop in obj) { try { result.push(flatten4(obj[prop], depth - 1)); } catch (e) { } } } return result.length ? result : typ == "string" ? obj : obj + "\0"; } function mixkey(seed, key) { var stringseed = seed + "", smear, j = 0; while (j < stringseed.length) { key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); } return tostring(key); } function autoseed() { try { var out; if (nodecrypto && (out = nodecrypto.randomBytes)) { out = out(width); } else { out = new Uint8Array(width); (global2.crypto || global2.msCrypto).getRandomValues(out); } return tostring(out); } catch (e) { var browser = global2.navigator, plugins = browser && browser.plugins; return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; } } function tostring(a) { return String.fromCharCode.apply(0, a); } mixkey(math.random(), pool3); if (typeof module == "object" && module.exports) { module.exports = seedrandom4; try { nodecrypto = require_crypto(); } catch (ex) { } } else if (typeof define == "function" && define.amd) { define(function() { return seedrandom4; }); } else { math["seed" + rngname] = seedrandom4; } })(typeof self !== "undefined" ? self : exports3, [], Math); }); // node_modules/seedrandom/index.js var require_seedrandom4 = __commonJS((exports3, module) => { var alea4 = require_alea2(); var xor128 = require_xor1282(); var xorwow = require_xorwow2(); var xorshift7 = require_xorshift72(); var xor4096 = require_xor40962(); var tychei = require_tychei2(); var sr = require_seedrandom3(); sr.alea = alea4; sr.xor128 = xor128; sr.xorwow = xorwow; sr.xorshift7 = xorshift7; sr.xor4096 = xor4096; sr.tychei = tychei; module.exports = sr; }); // empty:/home/vlado/dev/human/node_modules/string_decoder/lib/string_decoder.js var require_string_decoder = __commonJS(() => { }); // empty:path var require_path = __commonJS(() => { }); // empty:worker_threads var require_worker_threads = __commonJS(() => { }); // empty:perf_hooks var require_perf_hooks = __commonJS(() => { }); // node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm-threaded-simd.js var require_tfjs_backend_wasm_threaded_simd = __commonJS((exports3, module) => { var WasmBackendModuleThreadedSimd = function() { var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; if (typeof __filename !== "undefined") _scriptDir = _scriptDir || __filename; return function(WasmBackendModuleThreadedSimd2) { WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; function GROWABLE_HEAP_I8() { if (wasmMemory.buffer != buffer10) { updateGlobalBufferAndViews(wasmMemory.buffer); } return HEAP8; } function GROWABLE_HEAP_U8() { if (wasmMemory.buffer != buffer10) { updateGlobalBufferAndViews(wasmMemory.buffer); } return HEAPU8; } function GROWABLE_HEAP_I32() { if (wasmMemory.buffer != buffer10) { updateGlobalBufferAndViews(wasmMemory.buffer); } return HEAP32; } function GROWABLE_HEAP_U32() { if (wasmMemory.buffer != buffer10) { updateGlobalBufferAndViews(wasmMemory.buffer); } return HEAPU32; } function GROWABLE_HEAP_F64() { if (wasmMemory.buffer != buffer10) { updateGlobalBufferAndViews(wasmMemory.buffer); } return HEAPF64; } var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; var moduleOverrides = {}; var key; for (key in Module) { if (Module.hasOwnProperty(key)) { moduleOverrides[key] = Module[key]; } } var arguments_ = []; var thisProgram = "./this.program"; var quit_ = function(status, toThrow) { throw toThrow; }; var ENVIRONMENT_IS_WEB = false; var ENVIRONMENT_IS_WORKER = false; var ENVIRONMENT_IS_NODE = false; var ENVIRONMENT_IS_SHELL = false; ENVIRONMENT_IS_WEB = typeof window === "object"; ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; if (ENVIRONMENT_IS_PTHREAD) { buffer10 = Module["buffer"]; DYNAMIC_BASE = Module["DYNAMIC_BASE"]; DYNAMICTOP_PTR = Module["DYNAMICTOP_PTR"]; } var scriptDirectory = ""; function locateFile(path) { if (Module["locateFile"]) { return Module["locateFile"](path, scriptDirectory); } return scriptDirectory + path; } var read_, readAsync, readBinary, setWindowTitle; var nodeFS; var nodePath; if (ENVIRONMENT_IS_NODE) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = require_path().dirname(scriptDirectory) + "/"; } else { scriptDirectory = __dirname + "/"; } read_ = function shell_read(filename, binary) { if (!nodeFS) nodeFS = require("fs"); if (!nodePath) nodePath = require_path(); filename = nodePath["normalize"](filename); return nodeFS["readFileSync"](filename, binary ? null : "utf8"); }; readBinary = function readBinary2(filename) { var ret = read_(filename, true); if (!ret.buffer) { ret = new Uint8Array(ret); } assert3(ret.buffer); return ret; }; if (process["argv"].length > 1) { thisProgram = process["argv"][1].replace(/\\/g, "/"); } arguments_ = process["argv"].slice(2); process["on"]("uncaughtException", function(ex) { if (!(ex instanceof ExitStatus)) { throw ex; } }); process["on"]("unhandledRejection", abort); quit_ = function(status) { process["exit"](status); }; Module["inspect"] = function() { return "[Emscripten Module object]"; }; var nodeWorkerThreads; try { nodeWorkerThreads = require_worker_threads(); } catch (e) { console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); throw e; } Worker = nodeWorkerThreads.Worker; } else if (ENVIRONMENT_IS_SHELL) { if (typeof read != "undefined") { read_ = function shell_read(f) { return read(f); }; } readBinary = function readBinary2(f) { var data; if (typeof readbuffer === "function") { return new Uint8Array(readbuffer(f)); } data = read(f, "binary"); assert3(typeof data === "object"); return data; }; if (typeof scriptArgs != "undefined") { arguments_ = scriptArgs; } else if (typeof arguments != "undefined") { arguments_ = arguments; } if (typeof quit === "function") { quit_ = function(status) { quit(status); }; } if (typeof print !== "undefined") { if (typeof console === "undefined") console = {}; console.log = print; console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; } } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = self.location.href; } else if (document.currentScript) { scriptDirectory = document.currentScript.src; } if (_scriptDir) { scriptDirectory = _scriptDir; } if (scriptDirectory.indexOf("blob:") !== 0) { scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); } else { scriptDirectory = ""; } if (ENVIRONMENT_IS_NODE) { read_ = function shell_read(filename, binary) { if (!nodeFS) nodeFS = require("fs"); if (!nodePath) nodePath = require_path(); filename = nodePath["normalize"](filename); return nodeFS["readFileSync"](filename, binary ? null : "utf8"); }; readBinary = function readBinary2(filename) { var ret = read_(filename, true); if (!ret.buffer) { ret = new Uint8Array(ret); } assert3(ret.buffer); return ret; }; } else { read_ = function shell_read(url) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.send(null); return xhr.responseText; }; if (ENVIRONMENT_IS_WORKER) { readBinary = function readBinary2(url) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.responseType = "arraybuffer"; xhr.send(null); return new Uint8Array(xhr.response); }; } readAsync = function readAsync2(url, onload, onerror) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.responseType = "arraybuffer"; xhr.onload = function xhr_onload() { if (xhr.status == 200 || xhr.status == 0 && xhr.response) { onload(xhr.response); return; } onerror(); }; xhr.onerror = onerror; xhr.send(null); }; } setWindowTitle = function(title) { document.title = title; }; } else { } if (ENVIRONMENT_IS_NODE) { if (typeof performance === "undefined") { performance = require_perf_hooks().performance; } } var out = Module["print"] || console.log.bind(console); var err = Module["printErr"] || console.warn.bind(console); for (key in moduleOverrides) { if (moduleOverrides.hasOwnProperty(key)) { Module[key] = moduleOverrides[key]; } } moduleOverrides = null; if (Module["arguments"]) arguments_ = Module["arguments"]; if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; if (Module["quit"]) quit_ = Module["quit"]; var Atomics_load = Atomics.load; var Atomics_store = Atomics.store; var Atomics_compareExchange = Atomics.compareExchange; var wasmBinary; if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; var noExitRuntime; if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"]; if (typeof WebAssembly !== "object") { err("no native wasm support detected"); } var wasmMemory; var wasmTable = new WebAssembly.Table({initial: 165, maximum: 165 + 0, element: "anyfunc"}); var wasmModule; var threadInfoStruct = 0; var selfThreadId = 0; var ABORT = false; var EXITSTATUS = 0; function assert3(condition, text) { if (!condition) { abort("Assertion failed: " + text); } } function getCFunc(ident) { var func2 = Module["_" + ident]; assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); return func2; } function ccall(ident, returnType, argTypes, args, opts) { var toC = {string: function(str) { var ret2 = 0; if (str !== null && str !== void 0 && str !== 0) { var len = (str.length << 2) + 1; ret2 = stackAlloc(len); stringToUTF8(str, ret2, len); } return ret2; }, array: function(arr) { var ret2 = stackAlloc(arr.length); writeArrayToMemory(arr, ret2); return ret2; }}; function convertReturnValue(ret2) { if (returnType === "string") return UTF8ToString(ret2); if (returnType === "boolean") return Boolean(ret2); return ret2; } var func2 = getCFunc(ident); var cArgs = []; var stack6 = 0; if (args) { for (var i = 0; i < args.length; i++) { var converter = toC[argTypes[i]]; if (converter) { if (stack6 === 0) stack6 = stackSave(); cArgs[i] = converter(args[i]); } else { cArgs[i] = args[i]; } } } var ret = func2.apply(null, cArgs); ret = convertReturnValue(ret); if (stack6 !== 0) stackRestore(stack6); return ret; } function cwrap(ident, returnType, argTypes, opts) { argTypes = argTypes || []; var numericArgs = argTypes.every(function(type) { return type === "number"; }); var numericRet = returnType !== "string"; if (numericRet && numericArgs && !opts) { return getCFunc(ident); } return function() { return ccall(ident, returnType, argTypes, arguments, opts); }; } function UTF8ArrayToString(heap, idx, maxBytesToRead) { var endIdx = idx + maxBytesToRead; var str = ""; while (!(idx >= endIdx)) { var u0 = heap[idx++]; if (!u0) return str; if (!(u0 & 128)) { str += String.fromCharCode(u0); continue; } var u1 = heap[idx++] & 63; if ((u0 & 224) == 192) { str += String.fromCharCode((u0 & 31) << 6 | u1); continue; } var u2 = heap[idx++] & 63; if ((u0 & 240) == 224) { u0 = (u0 & 15) << 12 | u1 << 6 | u2; } else { u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; } if (u0 < 65536) { str += String.fromCharCode(u0); } else { var ch = u0 - 65536; str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); } } return str; } function UTF8ToString(ptr, maxBytesToRead) { return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; } function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { if (!(maxBytesToWrite > 0)) return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; for (var i = 0; i < str.length; ++i) { var u = str.charCodeAt(i); if (u >= 55296 && u <= 57343) { var u1 = str.charCodeAt(++i); u = 65536 + ((u & 1023) << 10) | u1 & 1023; } if (u <= 127) { if (outIdx >= endIdx) break; heap[outIdx++] = u; } else if (u <= 2047) { if (outIdx + 1 >= endIdx) break; heap[outIdx++] = 192 | u >> 6; heap[outIdx++] = 128 | u & 63; } else if (u <= 65535) { if (outIdx + 2 >= endIdx) break; heap[outIdx++] = 224 | u >> 12; heap[outIdx++] = 128 | u >> 6 & 63; heap[outIdx++] = 128 | u & 63; } else { if (outIdx + 3 >= endIdx) break; heap[outIdx++] = 240 | u >> 18; heap[outIdx++] = 128 | u >> 12 & 63; heap[outIdx++] = 128 | u >> 6 & 63; heap[outIdx++] = 128 | u & 63; } } heap[outIdx] = 0; return outIdx - startIdx; } function stringToUTF8(str, outPtr, maxBytesToWrite) { return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); } function lengthBytesUTF8(str) { var len = 0; for (var i = 0; i < str.length; ++i) { var u = str.charCodeAt(i); if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; if (u <= 127) ++len; else if (u <= 2047) len += 2; else if (u <= 65535) len += 3; else len += 4; } return len; } function writeArrayToMemory(array2, buffer11) { GROWABLE_HEAP_I8().set(array2, buffer11); } var WASM_PAGE_SIZE = 65536; function alignUp(x, multiple) { if (x % multiple > 0) { x += multiple - x % multiple; } return x; } var buffer10, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; function updateGlobalBufferAndViews(buf) { buffer10 = buf; Module["HEAP8"] = HEAP8 = new Int8Array(buf); Module["HEAP16"] = HEAP16 = new Int16Array(buf); Module["HEAP32"] = HEAP32 = new Int32Array(buf); Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); } var STACK_BASE = 5256384, STACKTOP = STACK_BASE, STACK_MAX = 13504, DYNAMIC_BASE = 5256384, DYNAMICTOP_PTR = 12576; if (ENVIRONMENT_IS_PTHREAD) { } var INITIAL_INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; if (ENVIRONMENT_IS_PTHREAD) { wasmMemory = Module["wasmMemory"]; buffer10 = Module["buffer"]; } else { if (Module["wasmMemory"]) { wasmMemory = Module["wasmMemory"]; } else { wasmMemory = new WebAssembly.Memory({initial: INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE, maximum: 2147483648 / WASM_PAGE_SIZE, shared: true}); if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); if (ENVIRONMENT_IS_NODE) { console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); } throw Error("bad memory"); } } } if (wasmMemory) { buffer10 = wasmMemory.buffer; } INITIAL_INITIAL_MEMORY = buffer10.byteLength; updateGlobalBufferAndViews(buffer10); if (!ENVIRONMENT_IS_PTHREAD) { GROWABLE_HEAP_I32()[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE; } function callRuntimeCallbacks(callbacks3) { while (callbacks3.length > 0) { var callback = callbacks3.shift(); if (typeof callback == "function") { callback(Module); continue; } var func2 = callback.func; if (typeof func2 === "number") { if (callback.arg === void 0) { Module["dynCall_v"](func2); } else { Module["dynCall_vi"](func2, callback.arg); } } else { func2(callback.arg === void 0 ? null : callback.arg); } } } var __ATPRERUN__ = []; var __ATINIT__ = []; var __ATMAIN__ = []; var __ATEXIT__ = []; var __ATPOSTRUN__ = []; var runtimeInitialized = false; if (ENVIRONMENT_IS_PTHREAD) runtimeInitialized = true; function preRun() { if (ENVIRONMENT_IS_PTHREAD) return; if (Module["preRun"]) { if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; while (Module["preRun"].length) { addOnPreRun(Module["preRun"].shift()); } } callRuntimeCallbacks(__ATPRERUN__); } function initRuntime() { runtimeInitialized = true; callRuntimeCallbacks(__ATINIT__); } function preMain() { if (ENVIRONMENT_IS_PTHREAD) return; callRuntimeCallbacks(__ATMAIN__); } function postRun() { if (ENVIRONMENT_IS_PTHREAD) return; if (Module["postRun"]) { if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; while (Module["postRun"].length) { addOnPostRun(Module["postRun"].shift()); } } callRuntimeCallbacks(__ATPOSTRUN__); } function addOnPreRun(cb) { __ATPRERUN__.unshift(cb); } function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } var Math_ceil = Math.ceil; var Math_floor = Math.floor; var runDependencies = 0; var runDependencyWatcher = null; var dependenciesFulfilled = null; function addRunDependency(id) { assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); runDependencies++; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies); } } function removeRunDependency(id) { runDependencies--; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies); } if (runDependencies == 0) { if (runDependencyWatcher !== null) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; } if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback(); } } } Module["preloadedImages"] = {}; Module["preloadedAudios"] = {}; function abort(what) { if (Module["onAbort"]) { Module["onAbort"](what); } if (ENVIRONMENT_IS_PTHREAD) console.error("Pthread aborting at " + new Error().stack); what += ""; out(what); err(what); ABORT = true; EXITSTATUS = 1; what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; throw new WebAssembly.RuntimeError(what); } function hasPrefix(str, prefix) { return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; } var dataURIPrefix = "data:application/octet-stream;base64,"; function isDataURI(filename) { return hasPrefix(filename, dataURIPrefix); } var fileURIPrefix = "file://"; function isFileURI(filename) { return hasPrefix(filename, fileURIPrefix); } var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; if (!isDataURI(wasmBinaryFile)) { wasmBinaryFile = locateFile(wasmBinaryFile); } function getBinary() { try { if (wasmBinary) { return new Uint8Array(wasmBinary); } if (readBinary) { return readBinary(wasmBinaryFile); } else { throw "both async and sync fetching of the wasm failed"; } } catch (err2) { abort(err2); } } function getBinaryPromise() { if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { if (!response["ok"]) { throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; } return response["arrayBuffer"](); }).catch(function() { return getBinary(); }); } return new Promise(function(resolve, reject) { resolve(getBinary()); }); } function createWasm() { var info = {a: asmLibraryArg}; function receiveInstance(instance, module2) { var exports5 = instance.exports; Module["asm"] = exports5; wasmModule = module2; if (!ENVIRONMENT_IS_PTHREAD) { var numWorkersToLoad = PThread.unusedWorkers.length; PThread.unusedWorkers.forEach(function(w) { PThread.loadWasmModuleToWorker(w, function() { if (!--numWorkersToLoad) removeRunDependency("wasm-instantiate"); }); }); } } if (!ENVIRONMENT_IS_PTHREAD) { addRunDependency("wasm-instantiate"); } function receiveInstantiatedSource(output) { receiveInstance(output["instance"], output["module"]); } function instantiateArrayBuffer(receiver) { return getBinaryPromise().then(function(binary) { return WebAssembly.instantiate(binary, info); }).then(receiver, function(reason) { err("failed to asynchronously prepare wasm: " + reason); abort(reason); }); } function instantiateAsync() { if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { var result = WebAssembly.instantiateStreaming(response, info); return result.then(receiveInstantiatedSource, function(reason) { err("wasm streaming compile failed: " + reason); err("falling back to ArrayBuffer instantiation"); instantiateArrayBuffer(receiveInstantiatedSource); }); }); } else { return instantiateArrayBuffer(receiveInstantiatedSource); } } if (Module["instantiateWasm"]) { try { var exports4 = Module["instantiateWasm"](info, receiveInstance); return exports4; } catch (e) { err("Module.instantiateWasm callback failed with error: " + e); return false; } } instantiateAsync(); return {}; } var ASM_CONSTS = {}; function initPthreadsJS() { PThread.initRuntime(); } if (!ENVIRONMENT_IS_PTHREAD) __ATINIT__.push({func: function() { ___wasm_call_ctors(); }}); var __pthread_ptr = 0; var __pthread_is_main_runtime_thread = 0; var __pthread_is_main_browser_thread = 0; function __register_pthread_ptr(pthreadPtr, isMainBrowserThread, isMainRuntimeThread) { pthreadPtr = pthreadPtr | 0; isMainBrowserThread = isMainBrowserThread | 0; isMainRuntimeThread = isMainRuntimeThread | 0; __pthread_ptr = pthreadPtr; __pthread_is_main_browser_thread = isMainBrowserThread; __pthread_is_main_runtime_thread = isMainRuntimeThread; } Module["__register_pthread_ptr"] = __register_pthread_ptr; var ERRNO_CODES = {EPERM: 63, ENOENT: 44, ESRCH: 71, EINTR: 27, EIO: 29, ENXIO: 60, E2BIG: 1, ENOEXEC: 45, EBADF: 8, ECHILD: 12, EAGAIN: 6, EWOULDBLOCK: 6, ENOMEM: 48, EACCES: 2, EFAULT: 21, ENOTBLK: 105, EBUSY: 10, EEXIST: 20, EXDEV: 75, ENODEV: 43, ENOTDIR: 54, EISDIR: 31, EINVAL: 28, ENFILE: 41, EMFILE: 33, ENOTTY: 59, ETXTBSY: 74, EFBIG: 22, ENOSPC: 51, ESPIPE: 70, EROFS: 69, EMLINK: 34, EPIPE: 64, EDOM: 18, ERANGE: 68, ENOMSG: 49, EIDRM: 24, ECHRNG: 106, EL2NSYNC: 156, EL3HLT: 107, EL3RST: 108, ELNRNG: 109, EUNATCH: 110, ENOCSI: 111, EL2HLT: 112, EDEADLK: 16, ENOLCK: 46, EBADE: 113, EBADR: 114, EXFULL: 115, ENOANO: 104, EBADRQC: 103, EBADSLT: 102, EDEADLOCK: 16, EBFONT: 101, ENOSTR: 100, ENODATA: 116, ETIME: 117, ENOSR: 118, ENONET: 119, ENOPKG: 120, EREMOTE: 121, ENOLINK: 47, EADV: 122, ESRMNT: 123, ECOMM: 124, EPROTO: 65, EMULTIHOP: 36, EDOTDOT: 125, EBADMSG: 9, ENOTUNIQ: 126, EBADFD: 127, EREMCHG: 128, ELIBACC: 129, ELIBBAD: 130, ELIBSCN: 131, ELIBMAX: 132, ELIBEXEC: 133, ENOSYS: 52, ENOTEMPTY: 55, ENAMETOOLONG: 37, ELOOP: 32, EOPNOTSUPP: 138, EPFNOSUPPORT: 139, ECONNRESET: 15, ENOBUFS: 42, EAFNOSUPPORT: 5, EPROTOTYPE: 67, ENOTSOCK: 57, ENOPROTOOPT: 50, ESHUTDOWN: 140, ECONNREFUSED: 14, EADDRINUSE: 3, ECONNABORTED: 13, ENETUNREACH: 40, ENETDOWN: 38, ETIMEDOUT: 73, EHOSTDOWN: 142, EHOSTUNREACH: 23, EINPROGRESS: 26, EALREADY: 7, EDESTADDRREQ: 17, EMSGSIZE: 35, EPROTONOSUPPORT: 66, ESOCKTNOSUPPORT: 137, EADDRNOTAVAIL: 4, ENETRESET: 39, EISCONN: 30, ENOTCONN: 53, ETOOMANYREFS: 141, EUSERS: 136, EDQUOT: 19, ESTALE: 72, ENOTSUP: 138, ENOMEDIUM: 148, EILSEQ: 25, EOVERFLOW: 61, ECANCELED: 11, ENOTRECOVERABLE: 56, EOWNERDEAD: 62, ESTRPIPE: 135}; var __main_thread_futex_wait_address = 13488; function _emscripten_futex_wake(addr, count2) { if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0) return -28; if (count2 == 0) return 0; if (count2 >= 2147483647) count2 = Infinity; var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __main_thread_futex_wait_address >> 2); var mainThreadWoken = 0; if (mainThreadWaitAddress == addr) { var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __main_thread_futex_wait_address >> 2, mainThreadWaitAddress, 0); if (loadedAddr == mainThreadWaitAddress) { --count2; mainThreadWoken = 1; if (count2 <= 0) return 1; } } var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2); if (ret >= 0) return ret + mainThreadWoken; throw "Atomics.notify returned an unexpected value " + ret; } Module["_emscripten_futex_wake"] = _emscripten_futex_wake; function __kill_thread(pthread_ptr) { if (ENVIRONMENT_IS_PTHREAD) throw "Internal Error! _kill_thread() can only ever be called from main application thread!"; if (!pthread_ptr) throw "Internal Error! Null pthread_ptr in _kill_thread!"; GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; var pthread = PThread.pthreads[pthread_ptr]; pthread.worker.terminate(); PThread.freeThreadData(pthread); PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); pthread.worker.pthread = void 0; } function __cancel_thread(pthread_ptr) { if (ENVIRONMENT_IS_PTHREAD) throw "Internal Error! _cancel_thread() can only ever be called from main application thread!"; if (!pthread_ptr) throw "Internal Error! Null pthread_ptr in _cancel_thread!"; var pthread = PThread.pthreads[pthread_ptr]; pthread.worker.postMessage({cmd: "cancel"}); } function __cleanup_thread(pthread_ptr) { if (ENVIRONMENT_IS_PTHREAD) throw "Internal Error! _cleanup_thread() can only ever be called from main application thread!"; if (!pthread_ptr) throw "Internal Error! Null pthread_ptr in _cleanup_thread!"; GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; var pthread = PThread.pthreads[pthread_ptr]; if (pthread) { var worker = pthread.worker; PThread.returnWorkerToPool(worker); } } var PThread = {MAIN_THREAD_ID: 1, mainThreadInfo: {schedPolicy: 0, schedPrio: 0}, unusedWorkers: [], runningWorkers: [], initRuntime: function() { __register_pthread_ptr(PThread.mainThreadBlock, !ENVIRONMENT_IS_WORKER, 1); _emscripten_register_main_browser_thread_id(PThread.mainThreadBlock); }, initMainThreadBlock: function() { var pthreadPoolSize = 8; for (var i = 0; i < pthreadPoolSize; ++i) { PThread.allocateUnusedWorker(); } PThread.mainThreadBlock = 12736; for (var i = 0; i < 232 / 4; ++i) GROWABLE_HEAP_U32()[PThread.mainThreadBlock / 4 + i] = 0; GROWABLE_HEAP_I32()[PThread.mainThreadBlock + 12 >> 2] = PThread.mainThreadBlock; var headPtr = PThread.mainThreadBlock + 156; GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; var tlsMemory = 12976; for (var i = 0; i < 128; ++i) GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; Atomics.store(GROWABLE_HEAP_U32(), PThread.mainThreadBlock + 104 >> 2, tlsMemory); Atomics.store(GROWABLE_HEAP_U32(), PThread.mainThreadBlock + 40 >> 2, PThread.mainThreadBlock); Atomics.store(GROWABLE_HEAP_U32(), PThread.mainThreadBlock + 44 >> 2, 42); }, initWorker: function() { }, pthreads: {}, exitHandlers: null, setThreadStatus: function() { }, runExitHandlers: function() { if (PThread.exitHandlers !== null) { while (PThread.exitHandlers.length > 0) { PThread.exitHandlers.pop()(); } PThread.exitHandlers = null; } if (ENVIRONMENT_IS_PTHREAD && threadInfoStruct) ___pthread_tsd_run_dtors(); }, threadExit: function(exitCode) { var tb = _pthread_self(); if (tb) { Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 1); Atomics.store(GROWABLE_HEAP_U32(), tb + 64 >> 2, 0); PThread.runExitHandlers(); _emscripten_futex_wake(tb + 0, 2147483647); __register_pthread_ptr(0, 0, 0); threadInfoStruct = 0; if (ENVIRONMENT_IS_PTHREAD) { postMessage({cmd: "exit"}); } } }, threadCancel: function() { PThread.runExitHandlers(); Atomics.store(GROWABLE_HEAP_U32(), threadInfoStruct + 4 >> 2, -1); Atomics.store(GROWABLE_HEAP_U32(), threadInfoStruct + 0 >> 2, 1); _emscripten_futex_wake(threadInfoStruct + 0, 2147483647); threadInfoStruct = selfThreadId = 0; __register_pthread_ptr(0, 0, 0); postMessage({cmd: "cancelDone"}); }, terminateAllThreads: function() { for (var t in PThread.pthreads) { var pthread = PThread.pthreads[t]; if (pthread && pthread.worker) { PThread.returnWorkerToPool(pthread.worker); } } PThread.pthreads = {}; for (var i = 0; i < PThread.unusedWorkers.length; ++i) { var worker = PThread.unusedWorkers[i]; worker.terminate(); } PThread.unusedWorkers = []; for (var i = 0; i < PThread.runningWorkers.length; ++i) { var worker = PThread.runningWorkers[i]; var pthread = worker.pthread; PThread.freeThreadData(pthread); worker.terminate(); } PThread.runningWorkers = []; }, freeThreadData: function(pthread) { if (!pthread) return; if (pthread.threadInfoStruct) { var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 104 >> 2]; GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 104 >> 2] = 0; _free(tlsMemory); _free(pthread.threadInfoStruct); } pthread.threadInfoStruct = 0; if (pthread.allocatedOwnStack && pthread.stackBase) _free(pthread.stackBase); pthread.stackBase = 0; if (pthread.worker) pthread.worker.pthread = null; }, returnWorkerToPool: function(worker) { delete PThread.pthreads[worker.pthread.thread]; PThread.unusedWorkers.push(worker); PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); PThread.freeThreadData(worker.pthread); worker.pthread = void 0; }, receiveObjectTransfer: function(data) { }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { worker.onmessage = function(e) { var d = e["data"]; var cmd = d["cmd"]; if (worker.pthread) PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; if (d["targetThread"] && d["targetThread"] != _pthread_self()) { var thread = PThread.pthreads[d.targetThread]; if (thread) { thread.worker.postMessage(e.data, d["transferList"]); } else { console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); } PThread.currentProxiedOperationCallerThread = void 0; return; } if (cmd === "processQueuedMainThreadWork") { _emscripten_main_thread_process_queued_calls(); } else if (cmd === "spawnThread") { __spawn_thread(e.data); } else if (cmd === "cleanupThread") { __cleanup_thread(d["thread"]); } else if (cmd === "killThread") { __kill_thread(d["thread"]); } else if (cmd === "cancelThread") { __cancel_thread(d["thread"]); } else if (cmd === "loaded") { worker.loaded = true; if (onFinishedLoading) onFinishedLoading(worker); if (worker.runPthread) { worker.runPthread(); delete worker.runPthread; } } else if (cmd === "print") { out("Thread " + d["threadId"] + ": " + d["text"]); } else if (cmd === "printErr") { err("Thread " + d["threadId"] + ": " + d["text"]); } else if (cmd === "alert") { alert("Thread " + d["threadId"] + ": " + d["text"]); } else if (cmd === "exit") { var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.thread + 68 >> 2); if (detached) { PThread.returnWorkerToPool(worker); } } else if (cmd === "cancelDone") { PThread.returnWorkerToPool(worker); } else if (cmd === "objectTransfer") { PThread.receiveObjectTransfer(e.data); } else if (e.data.target === "setimmediate") { worker.postMessage(e.data); } else { err("worker sent an unknown command " + cmd); } PThread.currentProxiedOperationCallerThread = void 0; }; worker.onerror = function(e) { err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); }; if (ENVIRONMENT_IS_NODE) { worker.on("message", function(data) { worker.onmessage({data}); }); worker.on("error", function(data) { worker.onerror(data); }); worker.on("exit", function(data) { console.log("worker exited - TODO: update the worker queue?"); }); } worker.postMessage({cmd: "load", urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, wasmMemory, wasmModule, DYNAMIC_BASE, DYNAMICTOP_PTR}); }, allocateUnusedWorker: function() { var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); PThread.unusedWorkers.push(new Worker(pthreadMainJs)); }, getNewWorker: function() { if (PThread.unusedWorkers.length == 0) { PThread.allocateUnusedWorker(); PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); } if (PThread.unusedWorkers.length > 0) return PThread.unusedWorkers.pop(); else return null; }, busySpinWait: function(msecs) { var t = performance.now() + msecs; while (performance.now() < t) { } }}; function establishStackSpace(stackTop, stackMax) { STACK_BASE = STACKTOP = stackTop; STACK_MAX = stackMax; stackRestore(stackTop); } Module["establishStackSpace"] = establishStackSpace; function getNoExitRuntime() { return noExitRuntime; } Module["getNoExitRuntime"] = getNoExitRuntime; function ___assert_fail(condition, filename, line, func2) { abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); } function ___call_main(argc, argv) { var returnCode = _main(argc, argv); } var _emscripten_get_now; if (ENVIRONMENT_IS_NODE) { _emscripten_get_now = function() { var t = process["hrtime"](); return t[0] * 1e3 + t[1] / 1e6; }; } else if (ENVIRONMENT_IS_PTHREAD) { _emscripten_get_now = function() { return performance.now() - Module["__performance_now_clock_drift"]; }; } else if (typeof dateNow !== "undefined") { _emscripten_get_now = dateNow; } else _emscripten_get_now = function() { return performance.now(); }; function setErrNo(value) { GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; return value; } function _atexit(func2, arg) { if (ENVIRONMENT_IS_PTHREAD) return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); __ATEXIT__.unshift({func: func2, arg}); } function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { if (targetThreadId == mainThreadId) { postMessage({cmd: "processQueuedMainThreadWork"}); } else if (ENVIRONMENT_IS_PTHREAD) { postMessage({targetThread: targetThreadId, cmd: "processThreadQueue"}); } else { var pthread = PThread.pthreads[targetThreadId]; var worker = pthread && pthread.worker; if (!worker) { return; } worker.postMessage({cmd: "processThreadQueue"}); } return 1; } function _abort() { abort(); } function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { expectedStatus = expectedStatus | 0; newStatus = newStatus | 0; } function _emscripten_futex_wait(addr, val, timeout) { if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) return -28; if (ENVIRONMENT_IS_WORKER) { var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); if (ret === "timed-out") return -73; if (ret === "not-equal") return -6; if (ret === "ok") return 0; throw "Atomics.wait returned an unexpected value " + ret; } else { var loadedVal = Atomics.load(GROWABLE_HEAP_I32(), addr >> 2); if (val != loadedVal) return -6; var tNow = performance.now(); var tEnd = tNow + timeout; Atomics.store(GROWABLE_HEAP_I32(), __main_thread_futex_wait_address >> 2, addr); var ourWaitAddress = addr; while (addr == ourWaitAddress) { tNow = performance.now(); if (tNow > tEnd) { return -73; } _emscripten_main_thread_process_queued_calls(); addr = Atomics.load(GROWABLE_HEAP_I32(), __main_thread_futex_wait_address >> 2); } return 0; } } function _emscripten_is_main_browser_thread() { return __pthread_is_main_browser_thread | 0; } function _emscripten_is_main_runtime_thread() { return __pthread_is_main_runtime_thread | 0; } function _emscripten_memcpy_big(dest, src, num) { GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); } function _emscripten_num_logical_cores() { return navigator["hardwareConcurrency"]; } function _emscripten_proxy_to_main_thread_js(index, sync) { var numCallArgs = arguments.length - 2; var stack6 = stackSave(); var args = stackAlloc(numCallArgs * 8); var b = args >> 3; for (var i = 0; i < numCallArgs; i++) { GROWABLE_HEAP_F64()[b + i] = arguments[2 + i]; } var ret = _emscripten_run_in_main_runtime_thread_js(index, numCallArgs, args, sync); stackRestore(stack6); return ret; } var _emscripten_receive_on_main_thread_js_callArgs = []; function readAsmConstArgs(sigPtr, buf) { if (!readAsmConstArgs.array) { readAsmConstArgs.array = []; } var args = readAsmConstArgs.array; args.length = 0; var ch; while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { if (ch === 100 || ch === 102) { buf = buf + 7 & ~7; args.push(GROWABLE_HEAP_F64()[buf >> 3]); buf += 8; } else { buf = buf + 3 & ~3; args.push(GROWABLE_HEAP_I32()[buf >> 2]); buf += 4; } } return args; } function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; var b = args >> 3; for (var i = 0; i < numCallArgs; i++) { _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; } var isEmAsmConst = index < 0; var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; if (isEmAsmConst) { var sigPtr = _emscripten_receive_on_main_thread_js_callArgs[1]; var varargPtr = _emscripten_receive_on_main_thread_js_callArgs[2]; var constArgs = readAsmConstArgs(sigPtr, varargPtr); return func2.apply(null, constArgs); } return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); } function _emscripten_get_heap_size() { return GROWABLE_HEAP_U8().length; } function emscripten_realloc_buffer(size) { try { wasmMemory.grow(size - buffer10.byteLength + 65535 >>> 16); updateGlobalBufferAndViews(wasmMemory.buffer); return 1; } catch (e) { } } function _emscripten_resize_heap(requestedSize) { requestedSize = requestedSize >>> 0; var oldSize = _emscripten_get_heap_size(); if (requestedSize <= oldSize) { return false; } var PAGE_MULTIPLE = 65536; var maxHeapSize = 2147483648; if (requestedSize > maxHeapSize) { return false; } var minHeapSize = 16777216; for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), PAGE_MULTIPLE)); var replacement = emscripten_realloc_buffer(newSize); if (replacement) { return true; } } return false; } var JSEvents = {keyEvent: 0, mouseEvent: 0, wheelEvent: 0, uiEvent: 0, focusEvent: 0, deviceOrientationEvent: 0, deviceMotionEvent: 0, fullscreenChangeEvent: 0, pointerlockChangeEvent: 0, visibilityChangeEvent: 0, touchEvent: 0, previousFullscreenElement: null, previousScreenX: null, previousScreenY: null, removeEventListenersRegistered: false, removeAllEventListeners: function() { for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { JSEvents._removeHandler(i); } JSEvents.eventHandlers = []; JSEvents.deferredCalls = []; }, registerRemoveEventListeners: function() { if (!JSEvents.removeEventListenersRegistered) { __ATEXIT__.push(JSEvents.removeAllEventListeners); JSEvents.removeEventListenersRegistered = true; } }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { function arraysHaveEqualContent(arrA, arrB) { if (arrA.length != arrB.length) return false; for (var i2 in arrA) { if (arrA[i2] != arrB[i2]) return false; } return true; } for (var i in JSEvents.deferredCalls) { var call = JSEvents.deferredCalls[i]; if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { return; } } JSEvents.deferredCalls.push({targetFunction, precedence, argsList}); JSEvents.deferredCalls.sort(function(x, y) { return x.precedence < y.precedence; }); }, removeDeferredCalls: function(targetFunction) { for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { JSEvents.deferredCalls.splice(i, 1); --i; } } }, canPerformEventHandlerRequests: function() { return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; }, runDeferredCalls: function() { if (!JSEvents.canPerformEventHandlerRequests()) { return; } for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { var call = JSEvents.deferredCalls[i]; JSEvents.deferredCalls.splice(i, 1); --i; call.targetFunction.apply(null, call.argsList); } }, inEventHandler: 0, currentEventHandler: null, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { JSEvents._removeHandler(i--); } } }, _removeHandler: function(i) { var h = JSEvents.eventHandlers[i]; h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); JSEvents.eventHandlers.splice(i, 1); }, registerOrRemoveHandler: function(eventHandler) { var jsEventHandler = function jsEventHandler2(event) { ++JSEvents.inEventHandler; JSEvents.currentEventHandler = eventHandler; JSEvents.runDeferredCalls(); eventHandler.handlerFunc(event); JSEvents.runDeferredCalls(); --JSEvents.inEventHandler; }; if (eventHandler.callbackfunc) { eventHandler.eventListenerFunc = jsEventHandler; eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); JSEvents.eventHandlers.push(eventHandler); JSEvents.registerRemoveEventListeners(); } else { for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { JSEvents._removeHandler(i--); } } } }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { var stackTop = stackSave(); var varargs = stackAlloc(12); GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; _emscripten_async_queue_on_thread_(targetThread, 637534208, eventHandlerFunc, eventData, varargs); stackRestore(stackTop); }, getTargetThreadForEventCallback: function(targetThread) { switch (targetThread) { case 1: return 0; case 2: return PThread.currentProxiedOperationCallerThread; default: return targetThread; } }, getNodeNameForTarget: function(target) { if (!target) return ""; if (target == window) return "#window"; if (target == screen) return "#screen"; return target && target.nodeName ? target.nodeName : ""; }, fullscreenEnabled: function() { return document.fullscreenEnabled || document.webkitFullscreenEnabled; }}; function stringToNewUTF8(jsString) { var length = lengthBytesUTF8(jsString) + 1; var cString = _malloc(length); stringToUTF8(jsString, cString, length); return cString; } function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { var stackTop = stackSave(); var varargs = stackAlloc(12); var targetCanvasPtr = 0; if (targetCanvas) { targetCanvasPtr = stringToNewUTF8(targetCanvas); } GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; _emscripten_async_queue_on_thread_(targetThread, 657457152, 0, targetCanvasPtr, varargs); stackRestore(stackTop); } function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); } function __maybeCStringToJsString(cString) { return cString > 2 ? UTF8ToString(cString) : cString; } var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; function __findEventTarget(target) { target = __maybeCStringToJsString(target); var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); return domElement; } function __findCanvasEventTarget(target) { return __findEventTarget(target); } function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { var canvas = __findCanvasEventTarget(target); if (!canvas) return -4; if (canvas.canvasSharedPtr) { GROWABLE_HEAP_I32()[canvas.canvasSharedPtr >> 2] = width; GROWABLE_HEAP_I32()[canvas.canvasSharedPtr + 4 >> 2] = height; } if (canvas.offscreenCanvas || !canvas.controlTransferredOffscreen) { if (canvas.offscreenCanvas) canvas = canvas.offscreenCanvas; var autoResizeViewport = false; if (canvas.GLctxObject && canvas.GLctxObject.GLctx) { var prevViewport = canvas.GLctxObject.GLctx.getParameter(2978); autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas.width && prevViewport[3] === canvas.height; } canvas.width = width; canvas.height = height; if (autoResizeViewport) { canvas.GLctxObject.GLctx.viewport(0, 0, width, height); } } else if (canvas.canvasSharedPtr) { var targetThread = GROWABLE_HEAP_I32()[canvas.canvasSharedPtr + 8 >> 2]; _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); return 1; } else { return -4; } return 0; } function _emscripten_set_canvas_element_size_main_thread(target, width, height) { if (ENVIRONMENT_IS_PTHREAD) return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); return _emscripten_set_canvas_element_size_calling_thread(target, width, height); } function _emscripten_set_canvas_element_size(target, width, height) { var canvas = __findCanvasEventTarget(target); if (canvas) { return _emscripten_set_canvas_element_size_calling_thread(target, width, height); } else { return _emscripten_set_canvas_element_size_main_thread(target, width, height); } } function _emscripten_set_current_thread_status(newStatus) { newStatus = newStatus | 0; } function _emscripten_set_thread_name(threadId, name) { threadId = threadId | 0; name = name | 0; } function __webgl_enable_ANGLE_instanced_arrays(ctx) { var ext = ctx.getExtension("ANGLE_instanced_arrays"); if (ext) { ctx["vertexAttribDivisor"] = function(index, divisor) { ext["vertexAttribDivisorANGLE"](index, divisor); }; ctx["drawArraysInstanced"] = function(mode, first, count2, primcount) { ext["drawArraysInstancedANGLE"](mode, first, count2, primcount); }; ctx["drawElementsInstanced"] = function(mode, count2, type, indices, primcount) { ext["drawElementsInstancedANGLE"](mode, count2, type, indices, primcount); }; return 1; } } function __webgl_enable_OES_vertex_array_object(ctx) { var ext = ctx.getExtension("OES_vertex_array_object"); if (ext) { ctx["createVertexArray"] = function() { return ext["createVertexArrayOES"](); }; ctx["deleteVertexArray"] = function(vao) { ext["deleteVertexArrayOES"](vao); }; ctx["bindVertexArray"] = function(vao) { ext["bindVertexArrayOES"](vao); }; ctx["isVertexArray"] = function(vao) { return ext["isVertexArrayOES"](vao); }; return 1; } } function __webgl_enable_WEBGL_draw_buffers(ctx) { var ext = ctx.getExtension("WEBGL_draw_buffers"); if (ext) { ctx["drawBuffers"] = function(n, bufs) { ext["drawBuffersWEBGL"](n, bufs); }; return 1; } } var GL = {counter: 1, lastError: 0, buffers: [], mappedBuffers: {}, programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, currentContext: null, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, init: function() { var miniTempFloatBuffer = new Float32Array(GL.MINI_TEMP_BUFFER_SIZE); for (var i = 0; i < GL.MINI_TEMP_BUFFER_SIZE; i++) { GL.miniTempBufferFloatViews[i] = miniTempFloatBuffer.subarray(0, i + 1); } var miniTempIntBuffer = new Int32Array(GL.MINI_TEMP_BUFFER_SIZE); for (var i = 0; i < GL.MINI_TEMP_BUFFER_SIZE; i++) { GL.miniTempBufferIntViews[i] = miniTempIntBuffer.subarray(0, i + 1); } }, recordError: function recordError(errorCode) { if (!GL.lastError) { GL.lastError = errorCode; } }, getNewId: function(table) { var ret = GL.counter++; for (var i = table.length; i < ret; i++) { table[i] = null; } return ret; }, MINI_TEMP_BUFFER_SIZE: 256, miniTempBufferFloatViews: [0], miniTempBufferIntViews: [0], getSource: function(shader, count2, string, length) { var source = ""; for (var i = 0; i < count2; ++i) { var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); } return source; }, createContext: function(canvas, webGLContextAttributes) { var ctx = canvas.getContext("webgl", webGLContextAttributes); if (!ctx) return 0; var handle = GL.registerContext(ctx, webGLContextAttributes); return handle; }, registerContext: function(ctx, webGLContextAttributes) { var handle = _malloc(8); GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); var context = {handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx}; if (ctx.canvas) ctx.canvas.GLctxObject = context; GL.contexts[handle] = context; if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { GL.initExtensions(context); } return handle; }, makeContextCurrent: function(contextHandle) { GL.currentContext = GL.contexts[contextHandle]; Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; return !(contextHandle && !GLctx); }, getContext: function(contextHandle) { return GL.contexts[contextHandle]; }, deleteContext: function(contextHandle) { if (GL.currentContext === GL.contexts[contextHandle]) GL.currentContext = null; if (typeof JSEvents === "object") JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; _free(GL.contexts[contextHandle].handle); GL.contexts[contextHandle] = null; }, initExtensions: function(context) { if (!context) context = GL.currentContext; if (context.initExtensionsDone) return; context.initExtensionsDone = true; var GLctx2 = context.GLctx; __webgl_enable_ANGLE_instanced_arrays(GLctx2); __webgl_enable_OES_vertex_array_object(GLctx2); __webgl_enable_WEBGL_draw_buffers(GLctx2); GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); var automaticallyEnabledExtensions = ["OES_texture_float", "OES_texture_half_float", "OES_standard_derivatives", "OES_vertex_array_object", "WEBGL_compressed_texture_s3tc", "WEBGL_depth_texture", "OES_element_index_uint", "EXT_texture_filter_anisotropic", "EXT_frag_depth", "WEBGL_draw_buffers", "ANGLE_instanced_arrays", "OES_texture_float_linear", "OES_texture_half_float_linear", "EXT_blend_minmax", "EXT_shader_texture_lod", "EXT_texture_norm16", "WEBGL_compressed_texture_pvrtc", "EXT_color_buffer_half_float", "WEBGL_color_buffer_float", "EXT_sRGB", "WEBGL_compressed_texture_etc1", "EXT_disjoint_timer_query", "WEBGL_compressed_texture_etc", "WEBGL_compressed_texture_astc", "EXT_color_buffer_float", "WEBGL_compressed_texture_s3tc_srgb", "EXT_disjoint_timer_query_webgl2", "WEBKIT_WEBGL_compressed_texture_pvrtc"]; var exts = GLctx2.getSupportedExtensions() || []; exts.forEach(function(ext) { if (automaticallyEnabledExtensions.indexOf(ext) != -1) { GLctx2.getExtension(ext); } }); }, populateUniformTable: function(program) { var p = GL.programs[program]; var ptable = GL.programInfos[program] = {uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1}; var utable = ptable.uniforms; var numUniforms = GLctx.getProgramParameter(p, 35718); for (var i = 0; i < numUniforms; ++i) { var u = GLctx.getActiveUniform(p, i); var name = u.name; ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); if (name.slice(-1) == "]") { name = name.slice(0, name.lastIndexOf("[")); } var loc = GLctx.getUniformLocation(p, name); if (loc) { var id = GL.getNewId(GL.uniforms); utable[name] = [u.size, id]; GL.uniforms[id] = loc; for (var j = 1; j < u.size; ++j) { var n = name + "[" + j + "]"; loc = GLctx.getUniformLocation(p, n); id = GL.getNewId(GL.uniforms); GL.uniforms[id] = loc; } } } }}; var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; function _emscripten_webgl_do_create_context(target, attributes) { var contextAttributes = {}; var a = attributes >> 2; contextAttributes["alpha"] = !!GROWABLE_HEAP_I32()[a + (0 >> 2)]; contextAttributes["depth"] = !!GROWABLE_HEAP_I32()[a + (4 >> 2)]; contextAttributes["stencil"] = !!GROWABLE_HEAP_I32()[a + (8 >> 2)]; contextAttributes["antialias"] = !!GROWABLE_HEAP_I32()[a + (12 >> 2)]; contextAttributes["premultipliedAlpha"] = !!GROWABLE_HEAP_I32()[a + (16 >> 2)]; contextAttributes["preserveDrawingBuffer"] = !!GROWABLE_HEAP_I32()[a + (20 >> 2)]; var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; contextAttributes["powerPreference"] = __emscripten_webgl_power_preferences[powerPreference]; contextAttributes["failIfMajorPerformanceCaveat"] = !!GROWABLE_HEAP_I32()[a + (28 >> 2)]; contextAttributes.majorVersion = GROWABLE_HEAP_I32()[a + (32 >> 2)]; contextAttributes.minorVersion = GROWABLE_HEAP_I32()[a + (36 >> 2)]; contextAttributes.enableExtensionsByDefault = GROWABLE_HEAP_I32()[a + (40 >> 2)]; contextAttributes.explicitSwapControl = GROWABLE_HEAP_I32()[a + (44 >> 2)]; contextAttributes.proxyContextToMainThread = GROWABLE_HEAP_I32()[a + (48 >> 2)]; contextAttributes.renderViaOffscreenBackBuffer = GROWABLE_HEAP_I32()[a + (52 >> 2)]; var canvas = __findCanvasEventTarget(target); if (!canvas) { return -4; } if (contextAttributes.explicitSwapControl) { return -1; } var contextHandle = GL.createContext(canvas, contextAttributes); return contextHandle; } function _emscripten_webgl_create_context(a0, a1) { return _emscripten_webgl_do_create_context(a0, a1); } var PATH = {splitPath: function(filename) { var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; return splitPathRe.exec(filename).slice(1); }, normalizeArray: function(parts, allowAboveRoot) { var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === ".") { parts.splice(i, 1); } else if (last === "..") { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } if (allowAboveRoot) { for (; up; up--) { parts.unshift(".."); } } return parts; }, normalize: function(path) { var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/"; path = PATH.normalizeArray(path.split("/").filter(function(p) { return !!p; }), !isAbsolute).join("/"); if (!path && !isAbsolute) { path = "."; } if (path && trailingSlash) { path += "/"; } return (isAbsolute ? "/" : "") + path; }, dirname: function(path) { var result = PATH.splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { return "."; } if (dir) { dir = dir.substr(0, dir.length - 1); } return root + dir; }, basename: function(path) { if (path === "/") return "/"; var lastSlash = path.lastIndexOf("/"); if (lastSlash === -1) return path; return path.substr(lastSlash + 1); }, extname: function(path) { return PATH.splitPath(path)[3]; }, join: function() { var paths = Array.prototype.slice.call(arguments, 0); return PATH.normalize(paths.join("/")); }, join2: function(l, r) { return PATH.normalize(l + "/" + r); }}; var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { var buffer11 = SYSCALLS.buffers[stream]; if (curr === 0 || curr === 10) { (stream === 1 ? out : err)(UTF8ArrayToString(buffer11, 0)); buffer11.length = 0; } else { buffer11.push(curr); } }, varargs: void 0, get: function() { SYSCALLS.varargs += 4; var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; return ret; }, getStr: function(ptr) { var ret = UTF8ToString(ptr); return ret; }, get64: function(low, high) { return low; }}; function _fd_close(fd) { if (ENVIRONMENT_IS_PTHREAD) return _emscripten_proxy_to_main_thread_js(3, 1, fd); return 0; } function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { if (ENVIRONMENT_IS_PTHREAD) return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); } function _fd_write(fd, iov, iovcnt, pnum) { if (ENVIRONMENT_IS_PTHREAD) return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); var num = 0; for (var i = 0; i < iovcnt; i++) { var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; for (var j = 0; j < len; j++) { SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); } num += len; } GROWABLE_HEAP_I32()[pnum >> 2] = num; return 0; } function _pthread_cleanup_pop(execute2) { var routine = PThread.exitHandlers.pop(); if (execute2) routine(); } function _pthread_cleanup_push(routine, arg) { if (PThread.exitHandlers === null) { PThread.exitHandlers = []; } PThread.exitHandlers.push(function() { dynCall_vi(routine, arg); }); } function __spawn_thread(threadParams) { if (ENVIRONMENT_IS_PTHREAD) throw "Internal Error! _spawn_thread() can only ever be called from main application thread!"; var worker = PThread.getNewWorker(); if (worker.pthread !== void 0) throw "Internal error!"; if (!threadParams.pthread_ptr) throw "Internal error, no pthread ptr!"; PThread.runningWorkers.push(worker); var tlsMemory = _malloc(128 * 4); for (var i = 0; i < 128; ++i) { GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; } var stackHigh = threadParams.stackBase + threadParams.stackSize; var pthread = PThread.pthreads[threadParams.pthread_ptr] = {worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, thread: threadParams.pthread_ptr, threadInfoStruct: threadParams.pthread_ptr}; var tis = pthread.threadInfoStruct >> 2; Atomics.store(GROWABLE_HEAP_U32(), tis + (0 >> 2), 0); Atomics.store(GROWABLE_HEAP_U32(), tis + (4 >> 2), 0); Atomics.store(GROWABLE_HEAP_U32(), tis + (8 >> 2), 0); Atomics.store(GROWABLE_HEAP_U32(), tis + (68 >> 2), threadParams.detached); Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), tlsMemory); Atomics.store(GROWABLE_HEAP_U32(), tis + (48 >> 2), 0); Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); Atomics.store(GROWABLE_HEAP_U32(), tis + (44 >> 2), 42); Atomics.store(GROWABLE_HEAP_U32(), tis + (108 >> 2), threadParams.stackSize); Atomics.store(GROWABLE_HEAP_U32(), tis + (84 >> 2), threadParams.stackSize); Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), stackHigh); Atomics.store(GROWABLE_HEAP_U32(), tis + (108 + 8 >> 2), stackHigh); Atomics.store(GROWABLE_HEAP_U32(), tis + (108 + 12 >> 2), threadParams.detached); Atomics.store(GROWABLE_HEAP_U32(), tis + (108 + 20 >> 2), threadParams.schedPolicy); Atomics.store(GROWABLE_HEAP_U32(), tis + (108 + 24 >> 2), threadParams.schedPrio); var global_libc = _emscripten_get_global_libc(); var global_locale = global_libc + 40; Atomics.store(GROWABLE_HEAP_U32(), tis + (176 >> 2), global_locale); worker.pthread = pthread; var msg = {cmd: "run", start_routine: threadParams.startRoutine, arg: threadParams.arg, threadInfoStruct: threadParams.pthread_ptr, selfThreadId: threadParams.pthread_ptr, parentThreadId: threadParams.parent_pthread_ptr, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize}; worker.runPthread = function() { msg.time = performance.now(); worker.postMessage(msg, threadParams.transferList); }; if (worker.loaded) { worker.runPthread(); delete worker.runPthread; } } function _pthread_getschedparam(thread, policy, schedparam) { if (!policy && !schedparam) return ERRNO_CODES.EINVAL; if (!thread) { err("pthread_getschedparam called with a null thread pointer!"); return ERRNO_CODES.ESRCH; } var self2 = GROWABLE_HEAP_I32()[thread + 12 >> 2]; if (self2 !== thread) { err("pthread_getschedparam attempted on thread " + thread + ", which does not point to a valid thread, or does not exist anymore!"); return ERRNO_CODES.ESRCH; } var schedPolicy = Atomics.load(GROWABLE_HEAP_U32(), thread + 108 + 20 >> 2); var schedPrio = Atomics.load(GROWABLE_HEAP_U32(), thread + 108 + 24 >> 2); if (policy) GROWABLE_HEAP_I32()[policy >> 2] = schedPolicy; if (schedparam) GROWABLE_HEAP_I32()[schedparam >> 2] = schedPrio; return 0; } function _pthread_self() { return __pthread_ptr | 0; } Module["_pthread_self"] = _pthread_self; function _pthread_create(pthread_ptr, attr, start_routine, arg) { if (typeof SharedArrayBuffer === "undefined") { err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); return 6; } if (!pthread_ptr) { err("pthread_create called with a null thread pointer!"); return 28; } var transferList = []; var error = 0; if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); } if (error) return error; var stackSize = 0; var stackBase = 0; var detached = 0; var schedPolicy = 0; var schedPrio = 0; if (attr) { stackSize = GROWABLE_HEAP_I32()[attr >> 2]; stackSize += 81920; stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; var inheritSched = GROWABLE_HEAP_I32()[attr + 16 >> 2] === 0; if (inheritSched) { var prevSchedPolicy = GROWABLE_HEAP_I32()[attr + 20 >> 2]; var prevSchedPrio = GROWABLE_HEAP_I32()[attr + 24 >> 2]; var parentThreadPtr = PThread.currentProxiedOperationCallerThread ? PThread.currentProxiedOperationCallerThread : _pthread_self(); _pthread_getschedparam(parentThreadPtr, attr + 20, attr + 24); schedPolicy = GROWABLE_HEAP_I32()[attr + 20 >> 2]; schedPrio = GROWABLE_HEAP_I32()[attr + 24 >> 2]; GROWABLE_HEAP_I32()[attr + 20 >> 2] = prevSchedPolicy; GROWABLE_HEAP_I32()[attr + 24 >> 2] = prevSchedPrio; } else { schedPolicy = GROWABLE_HEAP_I32()[attr + 20 >> 2]; schedPrio = GROWABLE_HEAP_I32()[attr + 24 >> 2]; } } else { stackSize = 2097152; } var allocatedOwnStack = stackBase == 0; if (allocatedOwnStack) { stackBase = _memalign(16, stackSize); } else { stackBase -= stackSize; assert3(stackBase > 0); } var threadInfoStruct2 = _malloc(232); for (var i = 0; i < 232 >> 2; ++i) GROWABLE_HEAP_U32()[(threadInfoStruct2 >> 2) + i] = 0; GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct2; GROWABLE_HEAP_I32()[threadInfoStruct2 + 12 >> 2] = threadInfoStruct2; var headPtr = threadInfoStruct2 + 156; GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; var threadParams = {stackBase, stackSize, allocatedOwnStack, schedPolicy, schedPrio, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct2, parent_pthread_ptr: _pthread_self(), arg, transferList}; if (ENVIRONMENT_IS_PTHREAD) { threadParams.cmd = "spawnThread"; postMessage(threadParams, transferList); } else { __spawn_thread(threadParams); } return 0; } function _roundf(d) { d = +d; return d >= 0 ? +Math_floor(d + 0.5) : +Math_ceil(d - 0.5); } function _sysconf(name) { if (ENVIRONMENT_IS_PTHREAD) return _emscripten_proxy_to_main_thread_js(6, 1, name); switch (name) { case 30: return 16384; case 85: var maxHeapSize = 2147483648; return maxHeapSize / 16384; case 132: case 133: case 12: case 137: case 138: case 15: case 235: case 16: case 17: case 18: case 19: case 20: case 149: case 13: case 10: case 236: case 153: case 9: case 21: case 22: case 159: case 154: case 14: case 77: case 78: case 139: case 80: case 81: case 82: case 68: case 67: case 164: case 11: case 29: case 47: case 48: case 95: case 52: case 51: case 46: case 79: return 200809; case 27: case 246: case 127: case 128: case 23: case 24: case 160: case 161: case 181: case 182: case 242: case 183: case 184: case 243: case 244: case 245: case 165: case 178: case 179: case 49: case 50: case 168: case 169: case 175: case 170: case 171: case 172: case 97: case 76: case 32: case 173: case 35: return -1; case 176: case 177: case 7: case 155: case 8: case 157: case 125: case 126: case 92: case 93: case 129: case 130: case 131: case 94: case 91: return 1; case 74: case 60: case 69: case 70: case 4: return 1024; case 31: case 42: case 72: return 32; case 87: case 26: case 33: return 2147483647; case 34: case 1: return 47839; case 38: case 36: return 99; case 43: case 37: return 2048; case 0: return 2097152; case 3: return 65536; case 28: return 32768; case 44: return 32767; case 75: return 16384; case 39: return 1e3; case 89: return 700; case 71: return 256; case 40: return 255; case 2: return 100; case 180: return 64; case 25: return 20; case 5: return 16; case 6: return 6; case 73: return 4; case 84: { if (typeof navigator === "object") return navigator["hardwareConcurrency"] || 1; return 1; } } setErrNo(28); return -1; } if (!ENVIRONMENT_IS_PTHREAD) PThread.initMainThreadBlock(); else PThread.initWorker(); var GLctx; GL.init(); var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; var asmLibraryArg = {e: ___assert_fail, r: ___call_main, w: __emscripten_notify_thread_queue, a: _abort, l: _emscripten_conditional_set_current_thread_status, d: _emscripten_futex_wait, c: _emscripten_futex_wake, h: _emscripten_get_now, g: _emscripten_is_main_browser_thread, x: _emscripten_is_main_runtime_thread, q: _emscripten_memcpy_big, B: _emscripten_num_logical_cores, t: _emscripten_receive_on_main_thread_js, A: _emscripten_resize_heap, u: _emscripten_set_canvas_element_size, k: _emscripten_set_current_thread_status, s: _emscripten_set_thread_name, v: _emscripten_webgl_create_context, m: _fd_close, o: _fd_seek, i: _fd_write, p: initPthreadsJS, memory: wasmMemory || Module["wasmMemory"], y: _pthread_cleanup_pop, z: _pthread_cleanup_push, j: _pthread_create, b: _pthread_self, f: _roundf, n: _sysconf, table: wasmTable}; var asm = createWasm(); Module["asm"] = asm; var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["C"]).apply(null, arguments); }; var _init = Module["_init"] = function() { return (_init = Module["_init"] = Module["asm"]["D"]).apply(null, arguments); }; var _register_tensor = Module["_register_tensor"] = function() { return (_register_tensor = Module["_register_tensor"] = Module["asm"]["E"]).apply(null, arguments); }; var _dispose_data = Module["_dispose_data"] = function() { return (_dispose_data = Module["_dispose_data"] = Module["asm"]["F"]).apply(null, arguments); }; var _dispose = Module["_dispose"] = function() { return (_dispose = Module["_dispose"] = Module["asm"]["G"]).apply(null, arguments); }; var _Abs = Module["_Abs"] = function() { return (_Abs = Module["_Abs"] = Module["asm"]["H"]).apply(null, arguments); }; var _Add = Module["_Add"] = function() { return (_Add = Module["_Add"] = Module["asm"]["I"]).apply(null, arguments); }; var _AddN = Module["_AddN"] = function() { return (_AddN = Module["_AddN"] = Module["asm"]["J"]).apply(null, arguments); }; var _ArgMax = Module["_ArgMax"] = function() { return (_ArgMax = Module["_ArgMax"] = Module["asm"]["K"]).apply(null, arguments); }; var _AvgPool = Module["_AvgPool"] = function() { return (_AvgPool = Module["_AvgPool"] = Module["asm"]["L"]).apply(null, arguments); }; var _BatchMatMul = Module["_BatchMatMul"] = function() { return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["M"]).apply(null, arguments); }; var _ClipByValue = Module["_ClipByValue"] = function() { return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["N"]).apply(null, arguments); }; var _Conv2D = Module["_Conv2D"] = function() { return (_Conv2D = Module["_Conv2D"] = Module["asm"]["O"]).apply(null, arguments); }; var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["P"]).apply(null, arguments); }; var _Cos = Module["_Cos"] = function() { return (_Cos = Module["_Cos"] = Module["asm"]["Q"]).apply(null, arguments); }; var _CropAndResize = Module["_CropAndResize"] = function() { return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["R"]).apply(null, arguments); }; var _Cumsum = Module["_Cumsum"] = function() { return (_Cumsum = Module["_Cumsum"] = Module["asm"]["S"]).apply(null, arguments); }; var _DepthToSpace = Module["_DepthToSpace"] = function() { return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["T"]).apply(null, arguments); }; var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["U"]).apply(null, arguments); }; var _Div = Module["_Div"] = function() { return (_Div = Module["_Div"] = Module["asm"]["V"]).apply(null, arguments); }; var _Equal = Module["_Equal"] = function() { return (_Equal = Module["_Equal"] = Module["asm"]["W"]).apply(null, arguments); }; var _Exp = Module["_Exp"] = function() { return (_Exp = Module["_Exp"] = Module["asm"]["X"]).apply(null, arguments); }; var _FlipLeftRight = Module["_FlipLeftRight"] = function() { return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["Y"]).apply(null, arguments); }; var _FloorDiv = Module["_FloorDiv"] = function() { return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["Z"]).apply(null, arguments); }; var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["_"]).apply(null, arguments); }; var _FusedConv2D = Module["_FusedConv2D"] = function() { return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["$"]).apply(null, arguments); }; var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["aa"]).apply(null, arguments); }; var _Gather = Module["_Gather"] = function() { return (_Gather = Module["_Gather"] = Module["asm"]["ba"]).apply(null, arguments); }; var _GatherNd = Module["_GatherNd"] = function() { return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ca"]).apply(null, arguments); }; var _Greater = Module["_Greater"] = function() { return (_Greater = Module["_Greater"] = Module["asm"]["da"]).apply(null, arguments); }; var _GreaterEqual = Module["_GreaterEqual"] = function() { return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ea"]).apply(null, arguments); }; var _Less = Module["_Less"] = function() { return (_Less = Module["_Less"] = Module["asm"]["fa"]).apply(null, arguments); }; var _LessEqual = Module["_LessEqual"] = function() { return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ga"]).apply(null, arguments); }; var _Log = Module["_Log"] = function() { return (_Log = Module["_Log"] = Module["asm"]["ha"]).apply(null, arguments); }; var _LogicalAnd = Module["_LogicalAnd"] = function() { return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["ia"]).apply(null, arguments); }; var _Max = Module["_Max"] = function() { return (_Max = Module["_Max"] = Module["asm"]["ja"]).apply(null, arguments); }; var _MaxPool = Module["_MaxPool"] = function() { return (_MaxPool = Module["_MaxPool"] = Module["asm"]["ka"]).apply(null, arguments); }; var _Maximum = Module["_Maximum"] = function() { return (_Maximum = Module["_Maximum"] = Module["asm"]["la"]).apply(null, arguments); }; var _Min = Module["_Min"] = function() { return (_Min = Module["_Min"] = Module["asm"]["ma"]).apply(null, arguments); }; var _Minimum = Module["_Minimum"] = function() { return (_Minimum = Module["_Minimum"] = Module["asm"]["na"]).apply(null, arguments); }; var _Multiply = Module["_Multiply"] = function() { return (_Multiply = Module["_Multiply"] = Module["asm"]["oa"]).apply(null, arguments); }; var _Negate = Module["_Negate"] = function() { return (_Negate = Module["_Negate"] = Module["asm"]["pa"]).apply(null, arguments); }; var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["qa"]).apply(null, arguments); }; var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ra"]).apply(null, arguments); }; var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["sa"]).apply(null, arguments); }; var _NotEqual = Module["_NotEqual"] = function() { return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ta"]).apply(null, arguments); }; var _OneHot = Module["_OneHot"] = function() { return (_OneHot = Module["_OneHot"] = Module["asm"]["ua"]).apply(null, arguments); }; var _PadV2 = Module["_PadV2"] = function() { return (_PadV2 = Module["_PadV2"] = Module["asm"]["va"]).apply(null, arguments); }; var _Pow = Module["_Pow"] = function() { return (_Pow = Module["_Pow"] = Module["asm"]["wa"]).apply(null, arguments); }; var _Prelu = Module["_Prelu"] = function() { return (_Prelu = Module["_Prelu"] = Module["asm"]["xa"]).apply(null, arguments); }; var _Relu = Module["_Relu"] = function() { return (_Relu = Module["_Relu"] = Module["asm"]["ya"]).apply(null, arguments); }; var _Relu6 = Module["_Relu6"] = function() { return (_Relu6 = Module["_Relu6"] = Module["asm"]["za"]).apply(null, arguments); }; var _ResizeBilinear = Module["_ResizeBilinear"] = function() { return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Aa"]).apply(null, arguments); }; var _Reverse = Module["_Reverse"] = function() { return (_Reverse = Module["_Reverse"] = Module["asm"]["Ba"]).apply(null, arguments); }; var _RotateWithOffset = Module["_RotateWithOffset"] = function() { return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ca"]).apply(null, arguments); }; var _Rsqrt = Module["_Rsqrt"] = function() { return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Da"]).apply(null, arguments); }; var _ScatterNd = Module["_ScatterNd"] = function() { return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ea"]).apply(null, arguments); }; var _SelectV2 = Module["_SelectV2"] = function() { return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Fa"]).apply(null, arguments); }; var _Sigmoid = Module["_Sigmoid"] = function() { return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["Ga"]).apply(null, arguments); }; var _Sin = Module["_Sin"] = function() { return (_Sin = Module["_Sin"] = Module["asm"]["Ha"]).apply(null, arguments); }; var _Softmax = Module["_Softmax"] = function() { return (_Softmax = Module["_Softmax"] = Module["asm"]["Ia"]).apply(null, arguments); }; var _Sqrt = Module["_Sqrt"] = function() { return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Ja"]).apply(null, arguments); }; var _Square = Module["_Square"] = function() { return (_Square = Module["_Square"] = Module["asm"]["Ka"]).apply(null, arguments); }; var _SquaredDifference = Module["_SquaredDifference"] = function() { return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["La"]).apply(null, arguments); }; var _StridedSlice = Module["_StridedSlice"] = function() { return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Ma"]).apply(null, arguments); }; var _Sub = Module["_Sub"] = function() { return (_Sub = Module["_Sub"] = Module["asm"]["Na"]).apply(null, arguments); }; var _Sum = Module["_Sum"] = function() { return (_Sum = Module["_Sum"] = Module["asm"]["Oa"]).apply(null, arguments); }; var _Tanh = Module["_Tanh"] = function() { return (_Tanh = Module["_Tanh"] = Module["asm"]["Pa"]).apply(null, arguments); }; var _Tile = Module["_Tile"] = function() { return (_Tile = Module["_Tile"] = Module["asm"]["Qa"]).apply(null, arguments); }; var _Transpose = Module["_Transpose"] = function() { return (_Transpose = Module["_Transpose"] = Module["asm"]["Ra"]).apply(null, arguments); }; var __FusedMatMul = Module["__FusedMatMul"] = function() { return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Sa"]).apply(null, arguments); }; var _malloc = Module["_malloc"] = function() { return (_malloc = Module["_malloc"] = Module["asm"]["Ta"]).apply(null, arguments); }; var _free = Module["_free"] = function() { return (_free = Module["_free"] = Module["asm"]["Ua"]).apply(null, arguments); }; var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["Va"]).apply(null, arguments); }; var ___errno_location = Module["___errno_location"] = function() { return (___errno_location = Module["___errno_location"] = Module["asm"]["Wa"]).apply(null, arguments); }; var ___em_js__initPthreadsJS = Module["___em_js__initPthreadsJS"] = function() { return (___em_js__initPthreadsJS = Module["___em_js__initPthreadsJS"] = Module["asm"]["Xa"]).apply(null, arguments); }; var _memalign = Module["_memalign"] = function() { return (_memalign = Module["_memalign"] = Module["asm"]["Ya"]).apply(null, arguments); }; var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["Za"]).apply(null, arguments); }; var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["_a"]).apply(null, arguments); }; var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["$a"]).apply(null, arguments); }; var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["ab"]).apply(null, arguments); }; var _emscripten_main_browser_thread_id = Module["_emscripten_main_browser_thread_id"] = function() { return (_emscripten_main_browser_thread_id = Module["_emscripten_main_browser_thread_id"] = Module["asm"]["bb"]).apply(null, arguments); }; var _emscripten_async_run_in_main_thread = Module["_emscripten_async_run_in_main_thread"] = function() { return (_emscripten_async_run_in_main_thread = Module["_emscripten_async_run_in_main_thread"] = Module["asm"]["cb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread = Module["_emscripten_sync_run_in_main_thread"] = function() { return (_emscripten_sync_run_in_main_thread = Module["_emscripten_sync_run_in_main_thread"] = Module["asm"]["db"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_0 = Module["_emscripten_sync_run_in_main_thread_0"] = function() { return (_emscripten_sync_run_in_main_thread_0 = Module["_emscripten_sync_run_in_main_thread_0"] = Module["asm"]["eb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_1 = Module["_emscripten_sync_run_in_main_thread_1"] = function() { return (_emscripten_sync_run_in_main_thread_1 = Module["_emscripten_sync_run_in_main_thread_1"] = Module["asm"]["fb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_2 = Module["_emscripten_sync_run_in_main_thread_2"] = function() { return (_emscripten_sync_run_in_main_thread_2 = Module["_emscripten_sync_run_in_main_thread_2"] = Module["asm"]["gb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_xprintf_varargs = Module["_emscripten_sync_run_in_main_thread_xprintf_varargs"] = function() { return (_emscripten_sync_run_in_main_thread_xprintf_varargs = Module["_emscripten_sync_run_in_main_thread_xprintf_varargs"] = Module["asm"]["hb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_3 = Module["_emscripten_sync_run_in_main_thread_3"] = function() { return (_emscripten_sync_run_in_main_thread_3 = Module["_emscripten_sync_run_in_main_thread_3"] = Module["asm"]["ib"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["jb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_5 = Module["_emscripten_sync_run_in_main_thread_5"] = function() { return (_emscripten_sync_run_in_main_thread_5 = Module["_emscripten_sync_run_in_main_thread_5"] = Module["asm"]["kb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_6 = Module["_emscripten_sync_run_in_main_thread_6"] = function() { return (_emscripten_sync_run_in_main_thread_6 = Module["_emscripten_sync_run_in_main_thread_6"] = Module["asm"]["lb"]).apply(null, arguments); }; var _emscripten_sync_run_in_main_thread_7 = Module["_emscripten_sync_run_in_main_thread_7"] = function() { return (_emscripten_sync_run_in_main_thread_7 = Module["_emscripten_sync_run_in_main_thread_7"] = Module["asm"]["mb"]).apply(null, arguments); }; var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["nb"]).apply(null, arguments); }; var _emscripten_async_queue_on_thread_ = Module["_emscripten_async_queue_on_thread_"] = function() { return (_emscripten_async_queue_on_thread_ = Module["_emscripten_async_queue_on_thread_"] = Module["asm"]["ob"]).apply(null, arguments); }; var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["pb"]).apply(null, arguments); }; var stackSave = Module["stackSave"] = function() { return (stackSave = Module["stackSave"] = Module["asm"]["qb"]).apply(null, arguments); }; var stackAlloc = Module["stackAlloc"] = function() { return (stackAlloc = Module["stackAlloc"] = Module["asm"]["rb"]).apply(null, arguments); }; var stackRestore = Module["stackRestore"] = function() { return (stackRestore = Module["stackRestore"] = Module["asm"]["sb"]).apply(null, arguments); }; var dynCall_vi = Module["dynCall_vi"] = function() { return (dynCall_vi = Module["dynCall_vi"] = Module["asm"]["tb"]).apply(null, arguments); }; var dynCall_v = Module["dynCall_v"] = function() { return (dynCall_v = Module["dynCall_v"] = Module["asm"]["ub"]).apply(null, arguments); }; var dynCall_ii = Module["dynCall_ii"] = function() { return (dynCall_ii = Module["dynCall_ii"] = Module["asm"]["vb"]).apply(null, arguments); }; Module["asm"] = asm; Module["cwrap"] = cwrap; Module["PThread"] = PThread; Module["PThread"] = PThread; Module["_pthread_self"] = _pthread_self; Module["wasmMemory"] = wasmMemory; Module["ExitStatus"] = ExitStatus; var calledRun; Module["then"] = function(func2) { if (calledRun) { func2(Module); } else { var old = Module["onRuntimeInitialized"]; Module["onRuntimeInitialized"] = function() { if (old) old(); func2(Module); }; } return Module; }; function ExitStatus(status) { this.name = "ExitStatus"; this.message = "Program terminated with exit(" + status + ")"; this.status = status; } dependenciesFulfilled = function runCaller() { if (!calledRun) run(); if (!calledRun) dependenciesFulfilled = runCaller; }; function run(args) { args = args || arguments_; if (runDependencies > 0) { return; } preRun(); if (runDependencies > 0) return; function doRun() { if (calledRun) return; calledRun = true; Module["calledRun"] = true; if (ABORT) return; initRuntime(); preMain(); if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); postRun(); } if (Module["setStatus"]) { Module["setStatus"]("Running..."); setTimeout(function() { setTimeout(function() { Module["setStatus"](""); }, 1); doRun(); }, 1); } else { doRun(); } } Module["run"] = run; if (Module["preInit"]) { if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; while (Module["preInit"].length > 0) { Module["preInit"].pop()(); } } if (!ENVIRONMENT_IS_PTHREAD) noExitRuntime = true; if (!ENVIRONMENT_IS_PTHREAD) run(); return WasmBackendModuleThreadedSimd2; }; }(); if (typeof exports3 === "object" && typeof module === "object") module.exports = WasmBackendModuleThreadedSimd; else if (typeof define === "function" && define["amd"]) define([], function() { return WasmBackendModuleThreadedSimd; }); else if (typeof exports3 === "object") exports3["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; }); // node_modules/@tensorflow/tfjs-backend-wasm/wasm-out/tfjs-backend-wasm.js var require_tfjs_backend_wasm = __commonJS((exports3, module) => { var WasmBackendModule = function() { var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; if (typeof __filename !== "undefined") _scriptDir = _scriptDir || __filename; return function(WasmBackendModule2) { WasmBackendModule2 = WasmBackendModule2 || {}; var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; var moduleOverrides = {}; var key; for (key in Module) { if (Module.hasOwnProperty(key)) { moduleOverrides[key] = Module[key]; } } var arguments_ = []; var thisProgram = "./this.program"; var quit_ = function(status, toThrow) { throw toThrow; }; var ENVIRONMENT_IS_WEB = false; var ENVIRONMENT_IS_WORKER = false; var ENVIRONMENT_IS_NODE = false; var ENVIRONMENT_IS_SHELL = false; ENVIRONMENT_IS_WEB = typeof window === "object"; ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; var scriptDirectory = ""; function locateFile(path) { if (Module["locateFile"]) { return Module["locateFile"](path, scriptDirectory); } return scriptDirectory + path; } var read_, readAsync, readBinary, setWindowTitle; var nodeFS; var nodePath; if (ENVIRONMENT_IS_NODE) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = require_path().dirname(scriptDirectory) + "/"; } else { scriptDirectory = __dirname + "/"; } read_ = function shell_read(filename, binary) { if (!nodeFS) nodeFS = require("fs"); if (!nodePath) nodePath = require_path(); filename = nodePath["normalize"](filename); return nodeFS["readFileSync"](filename, binary ? null : "utf8"); }; readBinary = function readBinary2(filename) { var ret = read_(filename, true); if (!ret.buffer) { ret = new Uint8Array(ret); } assert3(ret.buffer); return ret; }; if (process["argv"].length > 1) { thisProgram = process["argv"][1].replace(/\\/g, "/"); } arguments_ = process["argv"].slice(2); process["on"]("uncaughtException", function(ex) { if (!(ex instanceof ExitStatus)) { throw ex; } }); process["on"]("unhandledRejection", abort); quit_ = function(status) { process["exit"](status); }; Module["inspect"] = function() { return "[Emscripten Module object]"; }; } else if (ENVIRONMENT_IS_SHELL) { if (typeof read != "undefined") { read_ = function shell_read(f) { return read(f); }; } readBinary = function readBinary2(f) { var data; if (typeof readbuffer === "function") { return new Uint8Array(readbuffer(f)); } data = read(f, "binary"); assert3(typeof data === "object"); return data; }; if (typeof scriptArgs != "undefined") { arguments_ = scriptArgs; } else if (typeof arguments != "undefined") { arguments_ = arguments; } if (typeof quit === "function") { quit_ = function(status) { quit(status); }; } if (typeof print !== "undefined") { if (typeof console === "undefined") console = {}; console.log = print; console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; } } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = self.location.href; } else if (document.currentScript) { scriptDirectory = document.currentScript.src; } if (_scriptDir) { scriptDirectory = _scriptDir; } if (scriptDirectory.indexOf("blob:") !== 0) { scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); } else { scriptDirectory = ""; } { read_ = function shell_read(url) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.send(null); return xhr.responseText; }; if (ENVIRONMENT_IS_WORKER) { readBinary = function readBinary2(url) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.responseType = "arraybuffer"; xhr.send(null); return new Uint8Array(xhr.response); }; } readAsync = function readAsync2(url, onload, onerror) { var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.responseType = "arraybuffer"; xhr.onload = function xhr_onload() { if (xhr.status == 200 || xhr.status == 0 && xhr.response) { onload(xhr.response); return; } onerror(); }; xhr.onerror = onerror; xhr.send(null); }; } setWindowTitle = function(title) { document.title = title; }; } else { } var out = Module["print"] || console.log.bind(console); var err = Module["printErr"] || console.warn.bind(console); for (key in moduleOverrides) { if (moduleOverrides.hasOwnProperty(key)) { Module[key] = moduleOverrides[key]; } } moduleOverrides = null; if (Module["arguments"]) arguments_ = Module["arguments"]; if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; if (Module["quit"]) quit_ = Module["quit"]; var wasmBinary; if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; var noExitRuntime; if (Module["noExitRuntime"]) noExitRuntime = Module["noExitRuntime"]; if (typeof WebAssembly !== "object") { err("no native wasm support detected"); } var wasmMemory; var wasmTable = new WebAssembly.Table({initial: 147, maximum: 147 + 0, element: "anyfunc"}); var ABORT = false; var EXITSTATUS = 0; function assert3(condition, text) { if (!condition) { abort("Assertion failed: " + text); } } function getCFunc(ident) { var func2 = Module["_" + ident]; assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); return func2; } function ccall(ident, returnType, argTypes, args, opts) { var toC = {string: function(str) { var ret2 = 0; if (str !== null && str !== void 0 && str !== 0) { var len = (str.length << 2) + 1; ret2 = stackAlloc(len); stringToUTF8(str, ret2, len); } return ret2; }, array: function(arr) { var ret2 = stackAlloc(arr.length); writeArrayToMemory(arr, ret2); return ret2; }}; function convertReturnValue(ret2) { if (returnType === "string") return UTF8ToString(ret2); if (returnType === "boolean") return Boolean(ret2); return ret2; } var func2 = getCFunc(ident); var cArgs = []; var stack6 = 0; if (args) { for (var i = 0; i < args.length; i++) { var converter = toC[argTypes[i]]; if (converter) { if (stack6 === 0) stack6 = stackSave(); cArgs[i] = converter(args[i]); } else { cArgs[i] = args[i]; } } } var ret = func2.apply(null, cArgs); ret = convertReturnValue(ret); if (stack6 !== 0) stackRestore(stack6); return ret; } function cwrap(ident, returnType, argTypes, opts) { argTypes = argTypes || []; var numericArgs = argTypes.every(function(type) { return type === "number"; }); var numericRet = returnType !== "string"; if (numericRet && numericArgs && !opts) { return getCFunc(ident); } return function() { return ccall(ident, returnType, argTypes, arguments, opts); }; } var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; function UTF8ArrayToString(heap, idx, maxBytesToRead) { var endIdx = idx + maxBytesToRead; var endPtr = idx; while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { return UTF8Decoder.decode(heap.subarray(idx, endPtr)); } else { var str = ""; while (idx < endPtr) { var u0 = heap[idx++]; if (!(u0 & 128)) { str += String.fromCharCode(u0); continue; } var u1 = heap[idx++] & 63; if ((u0 & 224) == 192) { str += String.fromCharCode((u0 & 31) << 6 | u1); continue; } var u2 = heap[idx++] & 63; if ((u0 & 240) == 224) { u0 = (u0 & 15) << 12 | u1 << 6 | u2; } else { u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; } if (u0 < 65536) { str += String.fromCharCode(u0); } else { var ch = u0 - 65536; str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); } } } return str; } function UTF8ToString(ptr, maxBytesToRead) { return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; } function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { if (!(maxBytesToWrite > 0)) return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; for (var i = 0; i < str.length; ++i) { var u = str.charCodeAt(i); if (u >= 55296 && u <= 57343) { var u1 = str.charCodeAt(++i); u = 65536 + ((u & 1023) << 10) | u1 & 1023; } if (u <= 127) { if (outIdx >= endIdx) break; heap[outIdx++] = u; } else if (u <= 2047) { if (outIdx + 1 >= endIdx) break; heap[outIdx++] = 192 | u >> 6; heap[outIdx++] = 128 | u & 63; } else if (u <= 65535) { if (outIdx + 2 >= endIdx) break; heap[outIdx++] = 224 | u >> 12; heap[outIdx++] = 128 | u >> 6 & 63; heap[outIdx++] = 128 | u & 63; } else { if (outIdx + 3 >= endIdx) break; heap[outIdx++] = 240 | u >> 18; heap[outIdx++] = 128 | u >> 12 & 63; heap[outIdx++] = 128 | u >> 6 & 63; heap[outIdx++] = 128 | u & 63; } } heap[outIdx] = 0; return outIdx - startIdx; } function stringToUTF8(str, outPtr, maxBytesToWrite) { return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); } function writeArrayToMemory(array2, buffer11) { HEAP8.set(array2, buffer11); } var buffer10, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; function updateGlobalBufferAndViews(buf) { buffer10 = buf; Module["HEAP8"] = HEAP8 = new Int8Array(buf); Module["HEAP16"] = HEAP16 = new Int16Array(buf); Module["HEAP32"] = HEAP32 = new Int32Array(buf); Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); } var INITIAL_INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; function callRuntimeCallbacks(callbacks3) { while (callbacks3.length > 0) { var callback = callbacks3.shift(); if (typeof callback == "function") { callback(Module); continue; } var func2 = callback.func; if (typeof func2 === "number") { if (callback.arg === void 0) { Module["dynCall_v"](func2); } else { Module["dynCall_vi"](func2, callback.arg); } } else { func2(callback.arg === void 0 ? null : callback.arg); } } } var __ATPRERUN__ = []; var __ATINIT__ = []; var __ATMAIN__ = []; var __ATPOSTRUN__ = []; var runtimeInitialized = false; var runtimeExited = false; function preRun() { if (Module["preRun"]) { if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; while (Module["preRun"].length) { addOnPreRun(Module["preRun"].shift()); } } callRuntimeCallbacks(__ATPRERUN__); } function initRuntime() { runtimeInitialized = true; callRuntimeCallbacks(__ATINIT__); } function preMain() { callRuntimeCallbacks(__ATMAIN__); } function exitRuntime() { runtimeExited = true; } function postRun() { if (Module["postRun"]) { if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; while (Module["postRun"].length) { addOnPostRun(Module["postRun"].shift()); } } callRuntimeCallbacks(__ATPOSTRUN__); } function addOnPreRun(cb) { __ATPRERUN__.unshift(cb); } function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } var Math_ceil = Math.ceil; var Math_floor = Math.floor; var runDependencies = 0; var runDependencyWatcher = null; var dependenciesFulfilled = null; function addRunDependency(id) { runDependencies++; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies); } } function removeRunDependency(id) { runDependencies--; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies); } if (runDependencies == 0) { if (runDependencyWatcher !== null) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; } if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback(); } } } Module["preloadedImages"] = {}; Module["preloadedAudios"] = {}; function abort(what) { if (Module["onAbort"]) { Module["onAbort"](what); } what += ""; out(what); err(what); ABORT = true; EXITSTATUS = 1; what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; throw new WebAssembly.RuntimeError(what); } function hasPrefix(str, prefix) { return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; } var dataURIPrefix = "data:application/octet-stream;base64,"; function isDataURI(filename) { return hasPrefix(filename, dataURIPrefix); } var fileURIPrefix = "file://"; function isFileURI(filename) { return hasPrefix(filename, fileURIPrefix); } var wasmBinaryFile = "tfjs-backend-wasm.wasm"; if (!isDataURI(wasmBinaryFile)) { wasmBinaryFile = locateFile(wasmBinaryFile); } function getBinary() { try { if (wasmBinary) { return new Uint8Array(wasmBinary); } if (readBinary) { return readBinary(wasmBinaryFile); } else { throw "both async and sync fetching of the wasm failed"; } } catch (err2) { abort(err2); } } function getBinaryPromise() { if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { if (!response["ok"]) { throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; } return response["arrayBuffer"](); }).catch(function() { return getBinary(); }); } return new Promise(function(resolve, reject) { resolve(getBinary()); }); } function createWasm() { var info = {env: asmLibraryArg, wasi_snapshot_preview1: asmLibraryArg}; function receiveInstance(instance, module2) { var exports5 = instance.exports; Module["asm"] = exports5; wasmMemory = exports5["memory"]; updateGlobalBufferAndViews(wasmMemory.buffer); removeRunDependency("wasm-instantiate"); } addRunDependency("wasm-instantiate"); function receiveInstantiatedSource(output) { receiveInstance(output["instance"]); } function instantiateArrayBuffer(receiver) { return getBinaryPromise().then(function(binary) { return WebAssembly.instantiate(binary, info); }).then(receiver, function(reason) { err("failed to asynchronously prepare wasm: " + reason); abort(reason); }); } function instantiateAsync() { if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { var result = WebAssembly.instantiateStreaming(response, info); return result.then(receiveInstantiatedSource, function(reason) { err("wasm streaming compile failed: " + reason); err("falling back to ArrayBuffer instantiation"); instantiateArrayBuffer(receiveInstantiatedSource); }); }); } else { return instantiateArrayBuffer(receiveInstantiatedSource); } } if (Module["instantiateWasm"]) { try { var exports4 = Module["instantiateWasm"](info, receiveInstance); return exports4; } catch (e) { err("Module.instantiateWasm callback failed with error: " + e); return false; } } instantiateAsync(); return {}; } __ATINIT__.push(); function _emscripten_notify_memory_growth(memoryIndex) { updateGlobalBufferAndViews(wasmMemory.buffer); } var PATH = {splitPath: function(filename) { var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; return splitPathRe.exec(filename).slice(1); }, normalizeArray: function(parts, allowAboveRoot) { var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === ".") { parts.splice(i, 1); } else if (last === "..") { parts.splice(i, 1); up++; } else if (up) { parts.splice(i, 1); up--; } } if (allowAboveRoot) { for (; up; up--) { parts.unshift(".."); } } return parts; }, normalize: function(path) { var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/"; path = PATH.normalizeArray(path.split("/").filter(function(p) { return !!p; }), !isAbsolute).join("/"); if (!path && !isAbsolute) { path = "."; } if (path && trailingSlash) { path += "/"; } return (isAbsolute ? "/" : "") + path; }, dirname: function(path) { var result = PATH.splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { return "."; } if (dir) { dir = dir.substr(0, dir.length - 1); } return root + dir; }, basename: function(path) { if (path === "/") return "/"; var lastSlash = path.lastIndexOf("/"); if (lastSlash === -1) return path; return path.substr(lastSlash + 1); }, extname: function(path) { return PATH.splitPath(path)[3]; }, join: function() { var paths = Array.prototype.slice.call(arguments, 0); return PATH.normalize(paths.join("/")); }, join2: function(l, r) { return PATH.normalize(l + "/" + r); }}; var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { var buffer11 = SYSCALLS.buffers[stream]; if (curr === 0 || curr === 10) { (stream === 1 ? out : err)(UTF8ArrayToString(buffer11, 0)); buffer11.length = 0; } else { buffer11.push(curr); } }, varargs: void 0, get: function() { SYSCALLS.varargs += 4; var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; return ret; }, getStr: function(ptr) { var ret = UTF8ToString(ptr); return ret; }, get64: function(low, high) { return low; }}; function _fd_close(fd) { return 0; } function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { } function _fd_write(fd, iov, iovcnt, pnum) { var num = 0; for (var i = 0; i < iovcnt; i++) { var ptr = HEAP32[iov + i * 8 >> 2]; var len = HEAP32[iov + (i * 8 + 4) >> 2]; for (var j = 0; j < len; j++) { SYSCALLS.printChar(fd, HEAPU8[ptr + j]); } num += len; } HEAP32[pnum >> 2] = num; return 0; } function _exit(status) { exit(status); } function _proc_exit(code) { _exit(code); } function _roundf(d) { d = +d; return d >= 0 ? +Math_floor(d + 0.5) : +Math_ceil(d - 0.5); } var asmLibraryArg = {emscripten_notify_memory_growth: _emscripten_notify_memory_growth, fd_close: _fd_close, fd_seek: _fd_seek, fd_write: _fd_write, proc_exit: _proc_exit, roundf: _roundf}; var asm = createWasm(); Module["asm"] = asm; var _init = Module["_init"] = function() { return (_init = Module["_init"] = Module["asm"]["init"]).apply(null, arguments); }; var _register_tensor = Module["_register_tensor"] = function() { return (_register_tensor = Module["_register_tensor"] = Module["asm"]["register_tensor"]).apply(null, arguments); }; var _dispose_data = Module["_dispose_data"] = function() { return (_dispose_data = Module["_dispose_data"] = Module["asm"]["dispose_data"]).apply(null, arguments); }; var _dispose = Module["_dispose"] = function() { return (_dispose = Module["_dispose"] = Module["asm"]["dispose"]).apply(null, arguments); }; var _Abs = Module["_Abs"] = function() { return (_Abs = Module["_Abs"] = Module["asm"]["Abs"]).apply(null, arguments); }; var _Add = Module["_Add"] = function() { return (_Add = Module["_Add"] = Module["asm"]["Add"]).apply(null, arguments); }; var _AddN = Module["_AddN"] = function() { return (_AddN = Module["_AddN"] = Module["asm"]["AddN"]).apply(null, arguments); }; var _ArgMax = Module["_ArgMax"] = function() { return (_ArgMax = Module["_ArgMax"] = Module["asm"]["ArgMax"]).apply(null, arguments); }; var _AvgPool = Module["_AvgPool"] = function() { return (_AvgPool = Module["_AvgPool"] = Module["asm"]["AvgPool"]).apply(null, arguments); }; var _BatchMatMul = Module["_BatchMatMul"] = function() { return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["BatchMatMul"]).apply(null, arguments); }; var _ClipByValue = Module["_ClipByValue"] = function() { return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["ClipByValue"]).apply(null, arguments); }; var _Conv2D = Module["_Conv2D"] = function() { return (_Conv2D = Module["_Conv2D"] = Module["asm"]["Conv2D"]).apply(null, arguments); }; var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["Conv2DBackpropInput"]).apply(null, arguments); }; var _Cos = Module["_Cos"] = function() { return (_Cos = Module["_Cos"] = Module["asm"]["Cos"]).apply(null, arguments); }; var _CropAndResize = Module["_CropAndResize"] = function() { return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["CropAndResize"]).apply(null, arguments); }; var _Cumsum = Module["_Cumsum"] = function() { return (_Cumsum = Module["_Cumsum"] = Module["asm"]["Cumsum"]).apply(null, arguments); }; var _DepthToSpace = Module["_DepthToSpace"] = function() { return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["DepthToSpace"]).apply(null, arguments); }; var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["DepthwiseConv2dNative"]).apply(null, arguments); }; var _Div = Module["_Div"] = function() { return (_Div = Module["_Div"] = Module["asm"]["Div"]).apply(null, arguments); }; var _Equal = Module["_Equal"] = function() { return (_Equal = Module["_Equal"] = Module["asm"]["Equal"]).apply(null, arguments); }; var _Exp = Module["_Exp"] = function() { return (_Exp = Module["_Exp"] = Module["asm"]["Exp"]).apply(null, arguments); }; var _FlipLeftRight = Module["_FlipLeftRight"] = function() { return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["FlipLeftRight"]).apply(null, arguments); }; var _FloorDiv = Module["_FloorDiv"] = function() { return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["FloorDiv"]).apply(null, arguments); }; var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["FusedBatchNorm"]).apply(null, arguments); }; var _FusedConv2D = Module["_FusedConv2D"] = function() { return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["FusedConv2D"]).apply(null, arguments); }; var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["FusedDepthwiseConv2D"]).apply(null, arguments); }; var _Gather = Module["_Gather"] = function() { return (_Gather = Module["_Gather"] = Module["asm"]["Gather"]).apply(null, arguments); }; var _GatherNd = Module["_GatherNd"] = function() { return (_GatherNd = Module["_GatherNd"] = Module["asm"]["GatherNd"]).apply(null, arguments); }; var _Greater = Module["_Greater"] = function() { return (_Greater = Module["_Greater"] = Module["asm"]["Greater"]).apply(null, arguments); }; var _GreaterEqual = Module["_GreaterEqual"] = function() { return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["GreaterEqual"]).apply(null, arguments); }; var _Less = Module["_Less"] = function() { return (_Less = Module["_Less"] = Module["asm"]["Less"]).apply(null, arguments); }; var _LessEqual = Module["_LessEqual"] = function() { return (_LessEqual = Module["_LessEqual"] = Module["asm"]["LessEqual"]).apply(null, arguments); }; var _Log = Module["_Log"] = function() { return (_Log = Module["_Log"] = Module["asm"]["Log"]).apply(null, arguments); }; var _LogicalAnd = Module["_LogicalAnd"] = function() { return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["LogicalAnd"]).apply(null, arguments); }; var _Max = Module["_Max"] = function() { return (_Max = Module["_Max"] = Module["asm"]["Max"]).apply(null, arguments); }; var _MaxPool = Module["_MaxPool"] = function() { return (_MaxPool = Module["_MaxPool"] = Module["asm"]["MaxPool"]).apply(null, arguments); }; var _Maximum = Module["_Maximum"] = function() { return (_Maximum = Module["_Maximum"] = Module["asm"]["Maximum"]).apply(null, arguments); }; var _Min = Module["_Min"] = function() { return (_Min = Module["_Min"] = Module["asm"]["Min"]).apply(null, arguments); }; var _Minimum = Module["_Minimum"] = function() { return (_Minimum = Module["_Minimum"] = Module["asm"]["Minimum"]).apply(null, arguments); }; var _Multiply = Module["_Multiply"] = function() { return (_Multiply = Module["_Multiply"] = Module["asm"]["Multiply"]).apply(null, arguments); }; var _Negate = Module["_Negate"] = function() { return (_Negate = Module["_Negate"] = Module["asm"]["Negate"]).apply(null, arguments); }; var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["NonMaxSuppressionV3"]).apply(null, arguments); }; var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["NonMaxSuppressionV4"]).apply(null, arguments); }; var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["NonMaxSuppressionV5"]).apply(null, arguments); }; var _NotEqual = Module["_NotEqual"] = function() { return (_NotEqual = Module["_NotEqual"] = Module["asm"]["NotEqual"]).apply(null, arguments); }; var _OneHot = Module["_OneHot"] = function() { return (_OneHot = Module["_OneHot"] = Module["asm"]["OneHot"]).apply(null, arguments); }; var _PadV2 = Module["_PadV2"] = function() { return (_PadV2 = Module["_PadV2"] = Module["asm"]["PadV2"]).apply(null, arguments); }; var _Pow = Module["_Pow"] = function() { return (_Pow = Module["_Pow"] = Module["asm"]["Pow"]).apply(null, arguments); }; var _Prelu = Module["_Prelu"] = function() { return (_Prelu = Module["_Prelu"] = Module["asm"]["Prelu"]).apply(null, arguments); }; var _Relu = Module["_Relu"] = function() { return (_Relu = Module["_Relu"] = Module["asm"]["Relu"]).apply(null, arguments); }; var _Relu6 = Module["_Relu6"] = function() { return (_Relu6 = Module["_Relu6"] = Module["asm"]["Relu6"]).apply(null, arguments); }; var _ResizeBilinear = Module["_ResizeBilinear"] = function() { return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["ResizeBilinear"]).apply(null, arguments); }; var _Reverse = Module["_Reverse"] = function() { return (_Reverse = Module["_Reverse"] = Module["asm"]["Reverse"]).apply(null, arguments); }; var _RotateWithOffset = Module["_RotateWithOffset"] = function() { return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["RotateWithOffset"]).apply(null, arguments); }; var _Rsqrt = Module["_Rsqrt"] = function() { return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Rsqrt"]).apply(null, arguments); }; var _ScatterNd = Module["_ScatterNd"] = function() { return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["ScatterNd"]).apply(null, arguments); }; var _SelectV2 = Module["_SelectV2"] = function() { return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["SelectV2"]).apply(null, arguments); }; var _Sigmoid = Module["_Sigmoid"] = function() { return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["Sigmoid"]).apply(null, arguments); }; var _Sin = Module["_Sin"] = function() { return (_Sin = Module["_Sin"] = Module["asm"]["Sin"]).apply(null, arguments); }; var _Softmax = Module["_Softmax"] = function() { return (_Softmax = Module["_Softmax"] = Module["asm"]["Softmax"]).apply(null, arguments); }; var _Sqrt = Module["_Sqrt"] = function() { return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Sqrt"]).apply(null, arguments); }; var _Square = Module["_Square"] = function() { return (_Square = Module["_Square"] = Module["asm"]["Square"]).apply(null, arguments); }; var _SquaredDifference = Module["_SquaredDifference"] = function() { return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["SquaredDifference"]).apply(null, arguments); }; var _StridedSlice = Module["_StridedSlice"] = function() { return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["StridedSlice"]).apply(null, arguments); }; var _Sub = Module["_Sub"] = function() { return (_Sub = Module["_Sub"] = Module["asm"]["Sub"]).apply(null, arguments); }; var _Sum = Module["_Sum"] = function() { return (_Sum = Module["_Sum"] = Module["asm"]["Sum"]).apply(null, arguments); }; var _Tanh = Module["_Tanh"] = function() { return (_Tanh = Module["_Tanh"] = Module["asm"]["Tanh"]).apply(null, arguments); }; var _Tile = Module["_Tile"] = function() { return (_Tile = Module["_Tile"] = Module["asm"]["Tile"]).apply(null, arguments); }; var _Transpose = Module["_Transpose"] = function() { return (_Transpose = Module["_Transpose"] = Module["asm"]["Transpose"]).apply(null, arguments); }; var __FusedMatMul = Module["__FusedMatMul"] = function() { return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["_FusedMatMul"]).apply(null, arguments); }; var _malloc = Module["_malloc"] = function() { return (_malloc = Module["_malloc"] = Module["asm"]["malloc"]).apply(null, arguments); }; var _free = Module["_free"] = function() { return (_free = Module["_free"] = Module["asm"]["free"]).apply(null, arguments); }; var __start = Module["__start"] = function() { return (__start = Module["__start"] = Module["asm"]["_start"]).apply(null, arguments); }; var stackSave = Module["stackSave"] = function() { return (stackSave = Module["stackSave"] = Module["asm"]["stackSave"]).apply(null, arguments); }; var stackAlloc = Module["stackAlloc"] = function() { return (stackAlloc = Module["stackAlloc"] = Module["asm"]["stackAlloc"]).apply(null, arguments); }; var stackRestore = Module["stackRestore"] = function() { return (stackRestore = Module["stackRestore"] = Module["asm"]["stackRestore"]).apply(null, arguments); }; Module["asm"] = asm; Module["cwrap"] = cwrap; var calledRun; Module["then"] = function(func2) { if (calledRun) { func2(Module); } else { var old = Module["onRuntimeInitialized"]; Module["onRuntimeInitialized"] = function() { if (old) old(); func2(Module); }; } return Module; }; function ExitStatus(status) { this.name = "ExitStatus"; this.message = "Program terminated with exit(" + status + ")"; this.status = status; } var calledMain = false; dependenciesFulfilled = function runCaller() { if (!calledRun) run(); if (!calledRun) dependenciesFulfilled = runCaller; }; function callMain(args) { var entryFunction = Module["__start"]; try { entryFunction(); var ret = 0; exit(ret, true); } catch (e) { if (e instanceof ExitStatus) { return; } else if (e == "unwind") { noExitRuntime = true; return; } else { var toLog = e; if (e && typeof e === "object" && e.stack) { toLog = [e, e.stack]; } err("exception thrown: " + toLog); quit_(1, e); } } finally { calledMain = true; } } function run(args) { args = args || arguments_; if (runDependencies > 0) { return; } preRun(); if (runDependencies > 0) return; function doRun() { if (calledRun) return; calledRun = true; Module["calledRun"] = true; if (ABORT) return; initRuntime(); preMain(); if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); if (shouldRunNow) callMain(args); postRun(); } if (Module["setStatus"]) { Module["setStatus"]("Running..."); setTimeout(function() { setTimeout(function() { Module["setStatus"](""); }, 1); doRun(); }, 1); } else { doRun(); } } Module["run"] = run; function exit(status, implicit) { if (implicit && noExitRuntime && status === 0) { return; } if (noExitRuntime) { } else { ABORT = true; EXITSTATUS = status; exitRuntime(); if (Module["onExit"]) Module["onExit"](status); } quit_(status, new ExitStatus(status)); } if (Module["preInit"]) { if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; while (Module["preInit"].length > 0) { Module["preInit"].pop()(); } } var shouldRunNow = true; if (Module["noInitialRun"]) shouldRunNow = false; noExitRuntime = true; run(); return WasmBackendModule2; }; }(); if (typeof exports3 === "object" && typeof module === "object") module.exports = WasmBackendModule; else if (typeof define === "function" && define["amd"]) define([], function() { return WasmBackendModule; }); else if (typeof exports3 === "object") exports3["WasmBackendModule"] = WasmBackendModule; }); // src/face/blazeface.js var require_blazeface = __commonJS((exports3) => { const NUM_LANDMARKS = 6; function generateAnchors(inputSize) { const spec = {strides: [inputSize / 16, inputSize / 8], anchors: [2, 6]}; const anchors = []; for (let i = 0; i < spec.strides.length; i++) { const stride = spec.strides[i]; const gridRows = Math.floor((inputSize + stride - 1) / stride); const gridCols = Math.floor((inputSize + stride - 1) / stride); const anchorsNum = spec.anchors[i]; for (let gridY = 0; gridY < gridRows; gridY++) { const anchorY = stride * (gridY + 0.5); for (let gridX = 0; gridX < gridCols; gridX++) { const anchorX = stride * (gridX + 0.5); for (let n = 0; n < anchorsNum; n++) { anchors.push([anchorX, anchorY]); } } } } return anchors; } const disposeBox = (box) => { box.startEndTensor.dispose(); box.startPoint.dispose(); box.endPoint.dispose(); }; const createBox = (startEndTensor) => ({ startEndTensor, startPoint: dist_exports2.slice(startEndTensor, [0, 0], [-1, 2]), endPoint: dist_exports2.slice(startEndTensor, [0, 2], [-1, 2]) }); const scaleBox = (box, factors) => { const starts = dist_exports2.mul(box.startPoint, factors); const ends = dist_exports2.mul(box.endPoint, factors); const newCoordinates = dist_exports2.concat2d([starts, ends], 1); return createBox(newCoordinates); }; function decodeBounds(boxOutputs, anchors, inputSize) { const boxStarts = dist_exports2.slice(boxOutputs, [0, 1], [-1, 2]); const centers = dist_exports2.add(boxStarts, anchors); const boxSizes = dist_exports2.slice(boxOutputs, [0, 3], [-1, 2]); const boxSizesNormalized = dist_exports2.div(boxSizes, inputSize); const centersNormalized = dist_exports2.div(centers, inputSize); const halfBoxSize = dist_exports2.div(boxSizesNormalized, 2); const starts = dist_exports2.sub(centersNormalized, halfBoxSize); const ends = dist_exports2.add(centersNormalized, halfBoxSize); const startNormalized = dist_exports2.mul(starts, inputSize); const endNormalized = dist_exports2.mul(ends, inputSize); const concatAxis = 1; return dist_exports2.concat2d([startNormalized, endNormalized], concatAxis); } function scaleBoxFromPrediction(face, scaleFactor) { return dist_exports2.tidy(() => { const box = face["box"] ? face["box"] : face; return scaleBox(box, scaleFactor).startEndTensor.squeeze(); }); } class BlazeFaceModel { constructor(model2, config) { this.blazeFaceModel = model2; this.width = config.detector.inputSize; this.height = config.detector.inputSize; this.anchorsData = generateAnchors(config.detector.inputSize); this.anchors = dist_exports2.tensor2d(this.anchorsData); this.inputSize = dist_exports2.tensor1d([this.width, this.height]); this.config = config; this.scaleFaces = 0.8; } async getBoundingBoxes(inputImage) { if (!inputImage || inputImage.isDisposedInternal || inputImage.shape.length !== 4 || inputImage.shape[1] < 1 || inputImage.shape[2] < 1) return null; const [detectedOutputs, boxes, scores] = dist_exports2.tidy(() => { const resizedImage = inputImage.resizeBilinear([this.width, this.height]); const normalizedImage = dist_exports2.sub(resizedImage.div(127.5), 1); const batchedPrediction = this.blazeFaceModel.predict(normalizedImage); let prediction; if (Array.isArray(batchedPrediction)) { const sorted = batchedPrediction.sort((a, b) => a.size - b.size); const concat384 = dist_exports2.concat([sorted[0], sorted[2]], 2); const concat512 = dist_exports2.concat([sorted[1], sorted[3]], 2); const concat15 = dist_exports2.concat([concat512, concat384], 1); prediction = concat15.squeeze(0); } else { prediction = batchedPrediction.squeeze(); } const decodedBounds = decodeBounds(prediction, this.anchors, this.inputSize); const logits = dist_exports2.slice(prediction, [0, 0], [-1, 1]); const scoresOut = dist_exports2.sigmoid(logits).squeeze(); return [prediction, decodedBounds, scoresOut]; }); const boxIndicesTensor = await dist_exports2.image.nonMaxSuppressionAsync(boxes, scores, this.config.detector.maxFaces, this.config.detector.iouThreshold, this.config.detector.scoreThreshold); const boxIndices = boxIndicesTensor.arraySync(); boxIndicesTensor.dispose(); const boundingBoxesMap = boxIndices.map((boxIndex) => dist_exports2.slice(boxes, [boxIndex, 0], [1, -1])); const boundingBoxes = boundingBoxesMap.map((boundingBox) => { const vals = boundingBox.arraySync(); boundingBox.dispose(); return vals; }); const scoresVal = scores.dataSync(); const annotatedBoxes = []; for (const i in boundingBoxes) { const boxIndex = boxIndices[i]; const confidence = scoresVal[boxIndex]; if (confidence > this.config.detector.minConfidence) { const box = createBox(boundingBoxes[i]); const anchor = this.anchorsData[boxIndex]; const landmarks = dist_exports2.tidy(() => dist_exports2.slice(detectedOutputs, [boxIndex, NUM_LANDMARKS - 1], [1, -1]).squeeze().reshape([NUM_LANDMARKS, -1])); annotatedBoxes.push({box, landmarks, anchor, confidence}); } } detectedOutputs.dispose(); boxes.dispose(); scores.dispose(); detectedOutputs.dispose(); return { boxes: annotatedBoxes, scaleFactor: [inputImage.shape[2] / this.width, inputImage.shape[1] / this.height] }; } async estimateFaces(input2) { const {boxes, scaleFactor} = await this.getBoundingBoxes(input2); const faces = []; for (const face of boxes) { const landmarkData = face.landmarks.arraySync(); const scaledBox = scaleBoxFromPrediction(face, scaleFactor); const boxData = scaleBox.arraySync(); const probabilityData = face.probability.arraySync(); const anchor = face.anchor; const [scaleFactorX, scaleFactorY] = scaleFactor; const scaledLandmarks = landmarkData.map((landmark) => [ (landmark[0] + anchor[0]) * scaleFactorX, (landmark[1] + anchor[1]) * scaleFactorY ]); const normalizedFace = { topLeft: boxData.slice(0, 2), bottomRight: boxData.slice(2), landmarks: scaledLandmarks, probability: probabilityData }; disposeBox(face.box); face.landmarks.dispose(); face.probability.dispose(); scaledBox.dispose(); faces.push(normalizedFace); } return faces; } } async function load(config) { const blazeface = await loadGraphModel2(config.detector.modelPath, {fromTFHub: config.detector.modelPath.includes("tfhub.dev")}); const model2 = new BlazeFaceModel(blazeface, config); console.log(`Human: load model: ${config.detector.modelPath.match(/\/(.*)\./)[1]}`); return model2; } exports3.load = load; exports3.BlazeFaceModel = BlazeFaceModel; exports3.disposeBox = disposeBox; }); // src/face/keypoints.js var require_keypoints = __commonJS((exports3) => { exports3.MESH_ANNOTATIONS = { silhouette: [ 10, 338, 297, 332, 284, 251, 389, 356, 454, 323, 361, 288, 397, 365, 379, 378, 400, 377, 152, 148, 176, 149, 150, 136, 172, 58, 132, 93, 234, 127, 162, 21, 54, 103, 67, 109 ], lipsUpperOuter: [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291], lipsLowerOuter: [146, 91, 181, 84, 17, 314, 405, 321, 375, 291], lipsUpperInner: [78, 191, 80, 81, 82, 13, 312, 311, 310, 415, 308], lipsLowerInner: [78, 95, 88, 178, 87, 14, 317, 402, 318, 324, 308], rightEyeUpper0: [246, 161, 160, 159, 158, 157, 173], rightEyeLower0: [33, 7, 163, 144, 145, 153, 154, 155, 133], rightEyeUpper1: [247, 30, 29, 27, 28, 56, 190], rightEyeLower1: [130, 25, 110, 24, 23, 22, 26, 112, 243], rightEyeUpper2: [113, 225, 224, 223, 222, 221, 189], rightEyeLower2: [226, 31, 228, 229, 230, 231, 232, 233, 244], rightEyeLower3: [143, 111, 117, 118, 119, 120, 121, 128, 245], rightEyebrowUpper: [156, 70, 63, 105, 66, 107, 55, 193], rightEyebrowLower: [35, 124, 46, 53, 52, 65], rightEyeIris: [473, 474, 475, 476, 477], leftEyeUpper0: [466, 388, 387, 386, 385, 384, 398], leftEyeLower0: [263, 249, 390, 373, 374, 380, 381, 382, 362], leftEyeUpper1: [467, 260, 259, 257, 258, 286, 414], leftEyeLower1: [359, 255, 339, 254, 253, 252, 256, 341, 463], leftEyeUpper2: [342, 445, 444, 443, 442, 441, 413], leftEyeLower2: [446, 261, 448, 449, 450, 451, 452, 453, 464], leftEyeLower3: [372, 340, 346, 347, 348, 349, 350, 357, 465], leftEyebrowUpper: [383, 300, 293, 334, 296, 336, 285, 417], leftEyebrowLower: [265, 353, 276, 283, 282, 295], leftEyeIris: [468, 469, 470, 471, 472], midwayBetweenEyes: [168], noseTip: [1], noseBottom: [2], noseRightCorner: [98], noseLeftCorner: [327], rightCheek: [205], leftCheek: [425] }; exports3.MESH_TO_IRIS_INDICES_MAP = [ {key: "EyeUpper0", indices: [9, 10, 11, 12, 13, 14, 15]}, {key: "EyeUpper1", indices: [25, 26, 27, 28, 29, 30, 31]}, {key: "EyeUpper2", indices: [41, 42, 43, 44, 45, 46, 47]}, {key: "EyeLower0", indices: [0, 1, 2, 3, 4, 5, 6, 7, 8]}, {key: "EyeLower1", indices: [16, 17, 18, 19, 20, 21, 22, 23, 24]}, {key: "EyeLower2", indices: [32, 33, 34, 35, 36, 37, 38, 39, 40]}, {key: "EyeLower3", indices: [54, 55, 56, 57, 58, 59, 60, 61, 62]}, {key: "EyebrowUpper", indices: [63, 64, 65, 66, 67, 68, 69, 70]}, {key: "EyebrowLower", indices: [48, 49, 50, 51, 52, 53]} ]; }); // src/face/box.js var require_box = __commonJS((exports3) => { function scaleBoxCoordinates2(box, factor) { const startPoint = [box.startPoint[0] * factor[0], box.startPoint[1] * factor[1]]; const endPoint = [box.endPoint[0] * factor[0], box.endPoint[1] * factor[1]]; return {startPoint, endPoint}; } exports3.scaleBoxCoordinates = scaleBoxCoordinates2; function getBoxSize2(box) { return [ Math.abs(box.endPoint[0] - box.startPoint[0]), Math.abs(box.endPoint[1] - box.startPoint[1]) ]; } exports3.getBoxSize = getBoxSize2; function getBoxCenter2(box) { return [ box.startPoint[0] + (box.endPoint[0] - box.startPoint[0]) / 2, box.startPoint[1] + (box.endPoint[1] - box.startPoint[1]) / 2 ]; } exports3.getBoxCenter = getBoxCenter2; function cutBoxFromImageAndResize2(box, image3, cropSize) { const h = image3.shape[1]; const w = image3.shape[2]; const boxes = [[ box.startPoint[1] / h, box.startPoint[0] / w, box.endPoint[1] / h, box.endPoint[0] / w ]]; return dist_exports2.image.cropAndResize(image3, boxes, [0], cropSize); } exports3.cutBoxFromImageAndResize = cutBoxFromImageAndResize2; function enlargeBox2(box, factor = 1.5) { const center = getBoxCenter2(box); const size = getBoxSize2(box); const newHalfSize = [factor * size[0] / 2, factor * size[1] / 2]; const startPoint = [center[0] - newHalfSize[0], center[1] - newHalfSize[1]]; const endPoint = [center[0] + newHalfSize[0], center[1] + newHalfSize[1]]; return {startPoint, endPoint, landmarks: box.landmarks}; } exports3.enlargeBox = enlargeBox2; function squarifyBox2(box) { const centers = getBoxCenter2(box); const size = getBoxSize2(box); const maxEdge = Math.max(...size); const halfSize = maxEdge / 2; const startPoint = [centers[0] - halfSize, centers[1] - halfSize]; const endPoint = [centers[0] + halfSize, centers[1] + halfSize]; return {startPoint, endPoint, landmarks: box.landmarks}; } exports3.squarifyBox = squarifyBox2; }); // src/face/util.js var require_util = __commonJS((exports3) => { exports3.IDENTITY_MATRIX = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; function normalizeRadians2(angle) { return angle - 2 * Math.PI * Math.floor((angle + Math.PI) / (2 * Math.PI)); } exports3.normalizeRadians = normalizeRadians2; function computeRotation2(point1, point2) { const radians = Math.PI / 2 - Math.atan2(-(point2[1] - point1[1]), point2[0] - point1[0]); return normalizeRadians2(radians); } exports3.computeRotation = computeRotation2; function radToDegrees(rad) { return rad * 180 / Math.PI; } exports3.radToDegrees = radToDegrees; function buildTranslationMatrix2(x, y) { return [[1, 0, x], [0, 1, y], [0, 0, 1]]; } function dot6(v1, v2) { let product = 0; for (let i = 0; i < v1.length; i++) { product += v1[i] * v2[i]; } return product; } exports3.dot = dot6; function getColumnFrom2DArr2(arr, columnIndex) { const column = []; for (let i = 0; i < arr.length; i++) { column.push(arr[i][columnIndex]); } return column; } exports3.getColumnFrom2DArr = getColumnFrom2DArr2; function multiplyTransformMatrices2(mat1, mat2) { const product = []; const size = mat1.length; for (let row = 0; row < size; row++) { product.push([]); for (let col = 0; col < size; col++) { product[row].push(dot6(mat1[row], getColumnFrom2DArr2(mat2, col))); } } return product; } function buildRotationMatrix2(rotation, center) { const cosA = Math.cos(rotation); const sinA = Math.sin(rotation); const rotationMatrix = [[cosA, -sinA, 0], [sinA, cosA, 0], [0, 0, 1]]; const translationMatrix = buildTranslationMatrix2(center[0], center[1]); const translationTimesRotation = multiplyTransformMatrices2(translationMatrix, rotationMatrix); const negativeTranslationMatrix = buildTranslationMatrix2(-center[0], -center[1]); return multiplyTransformMatrices2(translationTimesRotation, negativeTranslationMatrix); } exports3.buildRotationMatrix = buildRotationMatrix2; function invertTransformMatrix2(matrix) { const rotationComponent = [[matrix[0][0], matrix[1][0]], [matrix[0][1], matrix[1][1]]]; const translationComponent = [matrix[0][2], matrix[1][2]]; const invertedTranslation = [ -dot6(rotationComponent[0], translationComponent), -dot6(rotationComponent[1], translationComponent) ]; return [ rotationComponent[0].concat(invertedTranslation[0]), rotationComponent[1].concat(invertedTranslation[1]), [0, 0, 1] ]; } exports3.invertTransformMatrix = invertTransformMatrix2; function rotatePoint2(homogeneousCoordinate, rotationMatrix) { return [ dot6(homogeneousCoordinate, rotationMatrix[0]), dot6(homogeneousCoordinate, rotationMatrix[1]) ]; } exports3.rotatePoint = rotatePoint2; function xyDistanceBetweenPoints(a, b) { return Math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2); } exports3.xyDistanceBetweenPoints = xyDistanceBetweenPoints; }); // src/face/facepipeline.js var require_facepipeline = __commonJS((exports3) => { const bounding = __toModule(require_box()); const keypoints = __toModule(require_keypoints()); const util145 = __toModule(require_util()); const LANDMARKS_COUNT = 468; const MESH_MOUTH_INDEX = 13; const MESH_KEYPOINTS_LINE_OF_SYMMETRY_INDICES = [MESH_MOUTH_INDEX, keypoints.MESH_ANNOTATIONS["midwayBetweenEyes"][0]]; const BLAZEFACE_MOUTH_INDEX = 3; const BLAZEFACE_NOSE_INDEX = 2; const BLAZEFACE_KEYPOINTS_LINE_OF_SYMMETRY_INDICES = [BLAZEFACE_MOUTH_INDEX, BLAZEFACE_NOSE_INDEX]; const LEFT_EYE_OUTLINE = keypoints.MESH_ANNOTATIONS["leftEyeLower0"]; const LEFT_EYE_BOUNDS = [LEFT_EYE_OUTLINE[0], LEFT_EYE_OUTLINE[LEFT_EYE_OUTLINE.length - 1]]; const RIGHT_EYE_OUTLINE = keypoints.MESH_ANNOTATIONS["rightEyeLower0"]; const RIGHT_EYE_BOUNDS = [RIGHT_EYE_OUTLINE[0], RIGHT_EYE_OUTLINE[RIGHT_EYE_OUTLINE.length - 1]]; const IRIS_UPPER_CENTER_INDEX = 3; const IRIS_LOWER_CENTER_INDEX = 4; const IRIS_IRIS_INDEX = 71; const IRIS_NUM_COORDINATES = 76; function replaceRawCoordinates(rawCoords, newCoords, prefix, keys) { for (let i = 0; i < keypoints.MESH_TO_IRIS_INDICES_MAP.length; i++) { const {key, indices} = keypoints.MESH_TO_IRIS_INDICES_MAP[i]; const originalIndices = keypoints.MESH_ANNOTATIONS[`${prefix}${key}`]; const shouldReplaceAllKeys = keys == null; if (shouldReplaceAllKeys || keys.includes(key)) { for (let j = 0; j < indices.length; j++) { const index = indices[j]; rawCoords[originalIndices[j]] = [ newCoords[index][0], newCoords[index][1], (newCoords[index][2] + rawCoords[originalIndices[j]][2]) / 2 ]; } } } } class Pipeline { constructor(boundingBoxDetector, meshDetector, irisModel, config) { this.storedBoxes = []; this.runsWithoutFaceDetector = 0; this.boundingBoxDetector = boundingBoxDetector; this.meshDetector = meshDetector; this.irisModel = irisModel; this.meshWidth = config.mesh.inputSize; this.meshHeight = config.mesh.inputSize; this.irisSize = config.iris.inputSize; this.irisEnlarge = 2.3; this.skipped = 1e3; this.detectedFaces = 0; } transformRawCoords(rawCoords, box, angle, rotationMatrix) { const boxSize = bounding.getBoxSize({startPoint: box.startPoint, endPoint: box.endPoint}); const scaleFactor = [boxSize[0] / this.meshWidth, boxSize[1] / this.meshHeight]; const coordsScaled = rawCoords.map((coord) => [ scaleFactor[0] * (coord[0] - this.meshWidth / 2), scaleFactor[1] * (coord[1] - this.meshHeight / 2), coord[2] ]); const coordsRotationMatrix = util145.buildRotationMatrix(angle, [0, 0]); const coordsRotated = coordsScaled.map((coord) => [...util145.rotatePoint(coord, coordsRotationMatrix), coord[2]]); const inverseRotationMatrix = util145.invertTransformMatrix(rotationMatrix); const boxCenter = [...bounding.getBoxCenter({startPoint: box.startPoint, endPoint: box.endPoint}), 1]; const originalBoxCenter = [ util145.dot(boxCenter, inverseRotationMatrix[0]), util145.dot(boxCenter, inverseRotationMatrix[1]) ]; return coordsRotated.map((coord) => [ coord[0] + originalBoxCenter[0], coord[1] + originalBoxCenter[1], coord[2] ]); } getLeftToRightEyeDepthDifference(rawCoords) { const leftEyeZ = rawCoords[LEFT_EYE_BOUNDS[0]][2]; const rightEyeZ = rawCoords[RIGHT_EYE_BOUNDS[0]][2]; return leftEyeZ - rightEyeZ; } getEyeBox(rawCoords, face, eyeInnerCornerIndex, eyeOuterCornerIndex, flip = false) { const box = bounding.squarifyBox(bounding.enlargeBox(this.calculateLandmarksBoundingBox([rawCoords[eyeInnerCornerIndex], rawCoords[eyeOuterCornerIndex]]), this.irisEnlarge)); const boxSize = bounding.getBoxSize(box); let crop = dist_exports2.image.cropAndResize(face, [[ box.startPoint[1] / this.meshHeight, box.startPoint[0] / this.meshWidth, box.endPoint[1] / this.meshHeight, box.endPoint[0] / this.meshWidth ]], [0], [this.irisSize, this.irisSize]); if (flip) { crop = dist_exports2.image.flipLeftRight(crop); } return {box, boxSize, crop}; } getEyeCoords(eyeData, eyeBox, eyeBoxSize, flip = false) { const eyeRawCoords = []; for (let i = 0; i < IRIS_NUM_COORDINATES; i++) { const x = eyeData[i * 3]; const y = eyeData[i * 3 + 1]; const z = eyeData[i * 3 + 2]; eyeRawCoords.push([ (flip ? 1 - x / this.irisSize : x / this.irisSize) * eyeBoxSize[0] + eyeBox.startPoint[0], y / this.irisSize * eyeBoxSize[1] + eyeBox.startPoint[1], z ]); } return {rawCoords: eyeRawCoords, iris: eyeRawCoords.slice(IRIS_IRIS_INDEX)}; } getAdjustedIrisCoords(rawCoords, irisCoords, direction) { const upperCenterZ = rawCoords[keypoints.MESH_ANNOTATIONS[`${direction}EyeUpper0`][IRIS_UPPER_CENTER_INDEX]][2]; const lowerCenterZ = rawCoords[keypoints.MESH_ANNOTATIONS[`${direction}EyeLower0`][IRIS_LOWER_CENTER_INDEX]][2]; const averageZ = (upperCenterZ + lowerCenterZ) / 2; return irisCoords.map((coord, i) => { let z = averageZ; if (i === 2) { z = upperCenterZ; } else if (i === 4) { z = lowerCenterZ; } return [coord[0], coord[1], z]; }); } async predict(input2, config) { this.skipped++; let useFreshBox = false; let detector; if (this.skipped > config.detector.skipFrames || !config.mesh.enabled) { detector = await this.boundingBoxDetector.getBoundingBoxes(input2); if (input2.shape[1] !== 255 && input2.shape[2] !== 255) this.skipped = 0; } if (detector && detector.boxes && detector.boxes.length > 0 && (!config.mesh.enabled || detector.boxes.length !== this.detectedFaces && this.detectedFaces !== config.detector.maxFaces)) { this.storedBoxes = []; this.detectedFaces = 0; for (const possible of detector.boxes) { this.storedBoxes.push({startPoint: possible.box.startPoint.dataSync(), endPoint: possible.box.endPoint.dataSync(), landmarks: possible.landmarks, confidence: possible.confidence}); } if (this.storedBoxes.length > 0) useFreshBox = true; } if (useFreshBox) { if (!detector || !detector.boxes || detector.boxes.length === 0) { this.storedBoxes = []; this.detectedFaces = 0; return null; } for (const i in this.storedBoxes) { const scaledBox = bounding.scaleBoxCoordinates({startPoint: this.storedBoxes[i].startPoint, endPoint: this.storedBoxes[i].endPoint}, detector.scaleFactor); const enlargedBox = bounding.enlargeBox(scaledBox); const landmarks = this.storedBoxes[i].landmarks.arraySync(); const confidence = this.storedBoxes[i].confidence; this.storedBoxes[i] = {...enlargedBox, confidence, landmarks}; } this.runsWithoutFaceDetector = 0; } if (detector && detector.boxes) { detector.boxes.forEach((prediction) => { prediction.box.startPoint.dispose(); prediction.box.endPoint.dispose(); prediction.landmarks.dispose(); }); } let results = dist_exports2.tidy(() => this.storedBoxes.map((box, i) => { let angle = 0; const boxLandmarksFromMeshModel = box.landmarks.length >= LANDMARKS_COUNT; let [indexOfMouth, indexOfForehead] = MESH_KEYPOINTS_LINE_OF_SYMMETRY_INDICES; if (boxLandmarksFromMeshModel === false) { [indexOfMouth, indexOfForehead] = BLAZEFACE_KEYPOINTS_LINE_OF_SYMMETRY_INDICES; } angle = util145.computeRotation(box.landmarks[indexOfMouth], box.landmarks[indexOfForehead]); const faceCenter = bounding.getBoxCenter({startPoint: box.startPoint, endPoint: box.endPoint}); const faceCenterNormalized = [faceCenter[0] / input2.shape[2], faceCenter[1] / input2.shape[1]]; let rotatedImage = input2; let rotationMatrix = util145.IDENTITY_MATRIX; if (angle !== 0) { rotatedImage = dist_exports2.image.rotateWithOffset(input2, angle, 0, faceCenterNormalized); rotationMatrix = util145.buildRotationMatrix(-angle, faceCenter); } const boxCPU = {startPoint: box.startPoint, endPoint: box.endPoint}; const face = bounding.cutBoxFromImageAndResize(boxCPU, rotatedImage, [this.meshHeight, this.meshWidth]).div(255); if (!config.mesh.enabled) { const prediction2 = { coords: null, box, faceConfidence: null, confidence: box.confidence, image: face }; return prediction2; } const [, confidence, coords] = this.meshDetector.predict(face); const confidenceVal = confidence.dataSync()[0]; confidence.dispose(); if (confidenceVal < config.detector.minConfidence) { coords.dispose(); return null; } const coordsReshaped = dist_exports2.reshape(coords, [-1, 3]); let rawCoords = coordsReshaped.arraySync(); if (config.iris.enabled) { const {box: leftEyeBox, boxSize: leftEyeBoxSize, crop: leftEyeCrop} = this.getEyeBox(rawCoords, face, LEFT_EYE_BOUNDS[0], LEFT_EYE_BOUNDS[1], true); const {box: rightEyeBox, boxSize: rightEyeBoxSize, crop: rightEyeCrop} = this.getEyeBox(rawCoords, face, RIGHT_EYE_BOUNDS[0], RIGHT_EYE_BOUNDS[1]); const eyePredictions = this.irisModel.predict(dist_exports2.concat([leftEyeCrop, rightEyeCrop])); const eyePredictionsData = eyePredictions.dataSync(); eyePredictions.dispose(); const leftEyeData = eyePredictionsData.slice(0, IRIS_NUM_COORDINATES * 3); const {rawCoords: leftEyeRawCoords, iris: leftIrisRawCoords} = this.getEyeCoords(leftEyeData, leftEyeBox, leftEyeBoxSize, true); const rightEyeData = eyePredictionsData.slice(IRIS_NUM_COORDINATES * 3); const {rawCoords: rightEyeRawCoords, iris: rightIrisRawCoords} = this.getEyeCoords(rightEyeData, rightEyeBox, rightEyeBoxSize); const leftToRightEyeDepthDifference = this.getLeftToRightEyeDepthDifference(rawCoords); if (Math.abs(leftToRightEyeDepthDifference) < 30) { replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left"); replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right"); } else if (leftToRightEyeDepthDifference < 1) { replaceRawCoordinates(rawCoords, leftEyeRawCoords, "left", ["EyeUpper0", "EyeLower0"]); } else { replaceRawCoordinates(rawCoords, rightEyeRawCoords, "right", ["EyeUpper0", "EyeLower0"]); } const adjustedLeftIrisCoords = this.getAdjustedIrisCoords(rawCoords, leftIrisRawCoords, "left"); const adjustedRightIrisCoords = this.getAdjustedIrisCoords(rawCoords, rightIrisRawCoords, "right"); rawCoords = rawCoords.concat(adjustedLeftIrisCoords).concat(adjustedRightIrisCoords); } const transformedCoordsData = this.transformRawCoords(rawCoords, box, angle, rotationMatrix); dist_exports2.dispose(rawCoords); const landmarksBox = bounding.enlargeBox(this.calculateLandmarksBoundingBox(transformedCoordsData)); const transformedCoords = dist_exports2.tensor2d(transformedCoordsData); const prediction = { coords: transformedCoords, box: landmarksBox, faceConfidence: confidenceVal, confidence: box.confidence, image: face }; this.storedBoxes[i] = {...landmarksBox, landmarks: transformedCoords.arraySync(), confidence: box.confidence, faceConfidence: confidenceVal}; return prediction; })); results = results.filter((a) => a !== null); this.detectedFaces = results.length; return results; } calculateLandmarksBoundingBox(landmarks) { const xs = landmarks.map((d) => d[0]); const ys = landmarks.map((d) => d[1]); const startPoint = [Math.min(...xs), Math.min(...ys)]; const endPoint = [Math.max(...xs), Math.max(...ys)]; return {startPoint, endPoint, landmarks}; } } exports3.Pipeline = Pipeline; }); // src/face/uvcoords.js var require_uvcoords = __commonJS((exports3) => { exports3.UV_COORDS = [ [0.499976992607117, 0.652534008026123], [0.500025987625122, 0.547487020492554], [0.499974012374878, 0.602371990680695], [0.482113003730774, 0.471979022026062], [0.500150978565216, 0.527155995368958], [0.499909996986389, 0.498252987861633], [0.499523013830185, 0.40106201171875], [0.289712011814117, 0.380764007568359], [0.499954998493195, 0.312398016452789], [0.499987006187439, 0.269918978214264], [0.500023007392883, 0.107050001621246], [0.500023007392883, 0.666234016418457], [0.5000159740448, 0.679224014282227], [0.500023007392883, 0.692348003387451], [0.499976992607117, 0.695277988910675], [0.499976992607117, 0.70593398809433], [0.499976992607117, 0.719385027885437], [0.499976992607117, 0.737019002437592], [0.499967992305756, 0.781370997428894], [0.499816000461578, 0.562981009483337], [0.473773002624512, 0.573909997940063], [0.104906998574734, 0.254140973091125], [0.365929991006851, 0.409575998783112], [0.338757991790771, 0.41302502155304], [0.311120003461838, 0.409460008144379], [0.274657994508743, 0.389131009578705], [0.393361985683441, 0.403706014156342], [0.345234006643295, 0.344011008739471], [0.370094001293182, 0.346076011657715], [0.319321990013123, 0.347265005111694], [0.297903001308441, 0.353591024875641], [0.24779200553894, 0.410809993743896], [0.396889001131058, 0.842755019664764], [0.280097991228104, 0.375599980354309], [0.106310002505779, 0.399955987930298], [0.2099249958992, 0.391353011131287], [0.355807989835739, 0.534406006336212], [0.471751004457474, 0.65040397644043], [0.474155008792877, 0.680191993713379], [0.439785003662109, 0.657229006290436], [0.414617002010345, 0.66654098033905], [0.450374007225037, 0.680860996246338], [0.428770989179611, 0.682690978050232], [0.374971002340317, 0.727805018424988], [0.486716985702515, 0.547628998756409], [0.485300987958908, 0.527395009994507], [0.257764995098114, 0.314490020275116], [0.401223003864288, 0.455172002315521], [0.429818987846375, 0.548614978790283], [0.421351999044418, 0.533740997314453], [0.276895999908447, 0.532056987285614], [0.483370006084442, 0.499586999416351], [0.33721199631691, 0.282882988452911], [0.296391993761063, 0.293242990970612], [0.169294998049736, 0.193813979625702], [0.447580009698868, 0.302609980106354], [0.392390012741089, 0.353887975215912], [0.354490011930466, 0.696784019470215], [0.067304998636246, 0.730105042457581], [0.442739009857178, 0.572826027870178], [0.457098007202148, 0.584792017936707], [0.381974011659622, 0.694710969924927], [0.392388999462128, 0.694203019142151], [0.277076005935669, 0.271932005882263], [0.422551989555359, 0.563233017921448], [0.385919004678726, 0.281364023685455], [0.383103013038635, 0.255840003490448], [0.331431001424789, 0.119714021682739], [0.229923993349075, 0.232002973556519], [0.364500999450684, 0.189113974571228], [0.229622006416321, 0.299540996551514], [0.173287004232407, 0.278747975826263], [0.472878992557526, 0.666198015213013], [0.446828007698059, 0.668527007102966], [0.422762006521225, 0.673889994621277], [0.445307999849319, 0.580065965652466], [0.388103008270264, 0.693961024284363], [0.403039008378983, 0.706539988517761], [0.403629004955292, 0.693953037261963], [0.460041999816895, 0.557139039039612], [0.431158006191254, 0.692366003990173], [0.452181994915009, 0.692366003990173], [0.475387006998062, 0.692366003990173], [0.465828001499176, 0.779190003871918], [0.472328990697861, 0.736225962638855], [0.473087012767792, 0.717857003211975], [0.473122000694275, 0.704625964164734], [0.473033010959625, 0.695277988910675], [0.427942007780075, 0.695277988910675], [0.426479011774063, 0.703539967536926], [0.423162013292313, 0.711845993995667], [0.4183090031147, 0.720062971115112], [0.390094995498657, 0.639572978019714], [0.013953999616206, 0.560034036636353], [0.499913990497589, 0.58014702796936], [0.413199990987778, 0.69539999961853], [0.409626007080078, 0.701822996139526], [0.468080013990402, 0.601534962654114], [0.422728985548019, 0.585985004901886], [0.463079988956451, 0.593783974647522], [0.37211999297142, 0.47341400384903], [0.334562003612518, 0.496073007583618], [0.411671012639999, 0.546965003013611], [0.242175996303558, 0.14767599105835], [0.290776997804642, 0.201445996761322], [0.327338010072708, 0.256527006626129], [0.399509996175766, 0.748921036720276], [0.441727995872498, 0.261676013469696], [0.429764986038208, 0.187834024429321], [0.412198007106781, 0.108901023864746], [0.288955003023148, 0.398952007293701], [0.218936994671822, 0.435410976409912], [0.41278201341629, 0.398970007896423], [0.257135003805161, 0.355440020561218], [0.427684992551804, 0.437960982322693], [0.448339998722076, 0.536936044692993], [0.178560003638268, 0.45755398273468], [0.247308000922203, 0.457193970680237], [0.286267012357712, 0.467674970626831], [0.332827985286713, 0.460712015628815], [0.368755996227264, 0.447206974029541], [0.398963987827301, 0.432654976844788], [0.476410001516342, 0.405806005001068], [0.189241006970406, 0.523923993110657], [0.228962004184723, 0.348950982093811], [0.490725994110107, 0.562400996685028], [0.404670000076294, 0.485132992267609], [0.019469000399113, 0.401564002037048], [0.426243007183075, 0.420431017875671], [0.396993011236191, 0.548797011375427], [0.266469985246658, 0.376977026462555], [0.439121007919312, 0.51895797252655], [0.032313998788595, 0.644356966018677], [0.419054001569748, 0.387154996395111], [0.462783008813858, 0.505746960639954], [0.238978996872902, 0.779744982719421], [0.198220998048782, 0.831938028335571], [0.107550002634525, 0.540755033493042], [0.183610007166862, 0.740257024765015], [0.134409993886948, 0.333683013916016], [0.385764002799988, 0.883153975009918], [0.490967005491257, 0.579378008842468], [0.382384985685349, 0.508572995662689], [0.174399003386497, 0.397670984268188], [0.318785011768341, 0.39623498916626], [0.343364000320435, 0.400596976280212], [0.396100014448166, 0.710216999053955], [0.187885001301765, 0.588537991046906], [0.430987000465393, 0.944064974784851], [0.318993002176285, 0.898285031318665], [0.266247987747192, 0.869701027870178], [0.500023007392883, 0.190576016902924], [0.499976992607117, 0.954452991485596], [0.366169989109039, 0.398822009563446], [0.393207013607025, 0.39553701877594], [0.410373002290726, 0.391080021858215], [0.194993004202843, 0.342101991176605], [0.388664990663528, 0.362284004688263], [0.365961998701096, 0.355970978736877], [0.343364000320435, 0.355356991291046], [0.318785011768341, 0.35834002494812], [0.301414996385574, 0.363156020641327], [0.058132998645306, 0.319076001644135], [0.301414996385574, 0.387449026107788], [0.499987989664078, 0.618434011936188], [0.415838003158569, 0.624195992946625], [0.445681989192963, 0.566076993942261], [0.465844005346298, 0.620640993118286], [0.49992299079895, 0.351523995399475], [0.288718998432159, 0.819945991039276], [0.335278987884521, 0.852819979190826], [0.440512001514435, 0.902418971061707], [0.128294005990028, 0.791940987110138], [0.408771991729736, 0.373893976211548], [0.455606997013092, 0.451801002025604], [0.499877005815506, 0.908990025520325], [0.375436991453171, 0.924192011356354], [0.11421000212431, 0.615022003650665], [0.448662012815475, 0.695277988910675], [0.4480200111866, 0.704632043838501], [0.447111994028091, 0.715808033943176], [0.444831997156143, 0.730794012546539], [0.430011987686157, 0.766808986663818], [0.406787008047104, 0.685672998428345], [0.400738000869751, 0.681069016456604], [0.392399996519089, 0.677703022956848], [0.367855995893478, 0.663918972015381], [0.247923001646996, 0.601333022117615], [0.452769994735718, 0.420849978923798], [0.43639200925827, 0.359887003898621], [0.416164010763168, 0.368713974952698], [0.413385987281799, 0.692366003990173], [0.228018000721931, 0.683571994304657], [0.468268007040024, 0.352671027183533], [0.411361992359161, 0.804327011108398], [0.499989002943039, 0.469825029373169], [0.479153990745544, 0.442654013633728], [0.499974012374878, 0.439637005329132], [0.432112008333206, 0.493588984012604], [0.499886006116867, 0.866917014122009], [0.49991300702095, 0.821729004383087], [0.456548988819122, 0.819200992584229], [0.344549000263214, 0.745438992977142], [0.37890899181366, 0.574010014533997], [0.374292999505997, 0.780184984207153], [0.319687992334366, 0.570737957954407], [0.357154995203018, 0.604269981384277], [0.295284003019333, 0.621580958366394], [0.447750002145767, 0.862477004528046], [0.410986006259918, 0.508723020553589], [0.31395098567009, 0.775308012962341], [0.354128003120422, 0.812552988529205], [0.324548006057739, 0.703992962837219], [0.189096003770828, 0.646299958229065], [0.279776990413666, 0.71465802192688], [0.1338230073452, 0.682700991630554], [0.336768001317978, 0.644733011722565], [0.429883986711502, 0.466521978378296], [0.455527991056442, 0.548622965812683], [0.437114000320435, 0.558896005153656], [0.467287987470627, 0.529924988746643], [0.414712011814117, 0.335219979286194], [0.37704598903656, 0.322777986526489], [0.344107985496521, 0.320150971412659], [0.312875986099243, 0.32233202457428], [0.283526003360748, 0.333190023899078], [0.241245999932289, 0.382785975933075], [0.102986000478268, 0.468762993812561], [0.267612010240555, 0.424560010433197], [0.297879010438919, 0.433175981044769], [0.333433985710144, 0.433878004550934], [0.366427004337311, 0.426115989685059], [0.396012008190155, 0.416696012020111], [0.420121014118195, 0.41022801399231], [0.007561000064015, 0.480777025222778], [0.432949006557465, 0.569517970085144], [0.458638995885849, 0.479089021682739], [0.473466008901596, 0.545744001865387], [0.476087987422943, 0.563830018043518], [0.468472003936768, 0.555056989192963], [0.433990985155106, 0.582361996173859], [0.483518004417419, 0.562983989715576], [0.482482999563217, 0.57784903049469], [0.42645001411438, 0.389798998832703], [0.438998997211456, 0.39649498462677], [0.450067013502121, 0.400434017181396], [0.289712011814117, 0.368252992630005], [0.276670008897781, 0.363372981548309], [0.517862021923065, 0.471948027610779], [0.710287988185883, 0.380764007568359], [0.526226997375488, 0.573909997940063], [0.895093023777008, 0.254140973091125], [0.634069979190826, 0.409575998783112], [0.661242008209229, 0.41302502155304], [0.688880026340485, 0.409460008144379], [0.725341975688934, 0.389131009578705], [0.606630027294159, 0.40370500087738], [0.654766023159027, 0.344011008739471], [0.629905998706818, 0.346076011657715], [0.680678009986877, 0.347265005111694], [0.702096998691559, 0.353591024875641], [0.75221198797226, 0.410804986953735], [0.602918028831482, 0.842862963676453], [0.719901978969574, 0.375599980354309], [0.893692970275879, 0.399959981441498], [0.790081977844238, 0.391354024410248], [0.643998026847839, 0.534487962722778], [0.528249025344849, 0.65040397644043], [0.525849997997284, 0.680191040039062], [0.560214996337891, 0.657229006290436], [0.585384011268616, 0.66654098033905], [0.549625992774963, 0.680860996246338], [0.57122802734375, 0.682691991329193], [0.624852001667023, 0.72809898853302], [0.513050019741058, 0.547281980514526], [0.51509702205658, 0.527251958847046], [0.742246985435486, 0.314507007598877], [0.598631024360657, 0.454979002475739], [0.570338010787964, 0.548575043678284], [0.578631997108459, 0.533622980117798], [0.723087012767792, 0.532054007053375], [0.516445994377136, 0.499638974666595], [0.662801027297974, 0.282917976379395], [0.70362401008606, 0.293271005153656], [0.830704987049103, 0.193813979625702], [0.552385985851288, 0.302568018436432], [0.607609987258911, 0.353887975215912], [0.645429015159607, 0.696707010269165], [0.932694971561432, 0.730105042457581], [0.557260990142822, 0.572826027870178], [0.542901992797852, 0.584792017936707], [0.6180260181427, 0.694710969924927], [0.607590973377228, 0.694203019142151], [0.722943007946014, 0.271963000297546], [0.577413976192474, 0.563166975975037], [0.614082992076874, 0.281386971473694], [0.616907000541687, 0.255886018276215], [0.668509006500244, 0.119913995265961], [0.770092010498047, 0.232020974159241], [0.635536015033722, 0.189248979091644], [0.77039098739624, 0.299556016921997], [0.826722025871277, 0.278755009174347], [0.527121007442474, 0.666198015213013], [0.553171992301941, 0.668527007102966], [0.577238023281097, 0.673889994621277], [0.554691970348358, 0.580065965652466], [0.611896991729736, 0.693961024284363], [0.59696102142334, 0.706539988517761], [0.596370995044708, 0.693953037261963], [0.539958000183105, 0.557139039039612], [0.568841993808746, 0.692366003990173], [0.547818005084991, 0.692366003990173], [0.52461302280426, 0.692366003990173], [0.534089982509613, 0.779141008853912], [0.527670979499817, 0.736225962638855], [0.526912987232208, 0.717857003211975], [0.526877999305725, 0.704625964164734], [0.526966989040375, 0.695277988910675], [0.572058022022247, 0.695277988910675], [0.573521018028259, 0.703539967536926], [0.57683801651001, 0.711845993995667], [0.581691026687622, 0.720062971115112], [0.609944999217987, 0.639909982681274], [0.986046016216278, 0.560034036636353], [0.5867999792099, 0.69539999961853], [0.590372025966644, 0.701822996139526], [0.531915009021759, 0.601536989212036], [0.577268004417419, 0.585934996604919], [0.536915004253387, 0.593786001205444], [0.627542972564697, 0.473352015018463], [0.665585994720459, 0.495950996875763], [0.588353991508484, 0.546862006187439], [0.757824003696442, 0.14767599105835], [0.709249973297119, 0.201507985591888], [0.672684013843536, 0.256581008434296], [0.600408971309662, 0.74900496006012], [0.55826598405838, 0.261672019958496], [0.570303976535797, 0.187870979309082], [0.588165998458862, 0.109044015407562], [0.711045026779175, 0.398952007293701], [0.781069993972778, 0.435405015945435], [0.587247014045715, 0.398931980133057], [0.742869973182678, 0.355445981025696], [0.572156012058258, 0.437651991844177], [0.55186802148819, 0.536570012569427], [0.821442008018494, 0.457556009292603], [0.752701997756958, 0.457181990146637], [0.71375697851181, 0.467626988887787], [0.66711300611496, 0.460672974586487], [0.631101012229919, 0.447153985500336], [0.6008620262146, 0.432473003864288], [0.523481011390686, 0.405627012252808], [0.810747981071472, 0.523926019668579], [0.771045982837677, 0.348959028720856], [0.509127020835876, 0.562718033790588], [0.595292985439301, 0.485023975372314], [0.980530977249146, 0.401564002037048], [0.573499977588654, 0.420000016689301], [0.602994978427887, 0.548687994480133], [0.733529984951019, 0.376977026462555], [0.560611009597778, 0.519016981124878], [0.967685997486115, 0.644356966018677], [0.580985009670258, 0.387160003185272], [0.537728011608124, 0.505385041236877], [0.760966002941132, 0.779752969741821], [0.801778972148895, 0.831938028335571], [0.892440974712372, 0.54076099395752], [0.816350996494293, 0.740260004997253], [0.865594983100891, 0.333687007427216], [0.614073991775513, 0.883246004581451], [0.508952975273132, 0.579437971115112], [0.617941975593567, 0.508316040039062], [0.825608015060425, 0.397674977779388], [0.681214988231659, 0.39623498916626], [0.656635999679565, 0.400596976280212], [0.603900015354156, 0.710216999053955], [0.81208598613739, 0.588539004325867], [0.56801301240921, 0.944564998149872], [0.681007981300354, 0.898285031318665], [0.733752012252808, 0.869701027870178], [0.633830010890961, 0.398822009563446], [0.606792986392975, 0.39553701877594], [0.589659988880157, 0.391062021255493], [0.805015981197357, 0.342108011245728], [0.611334979534149, 0.362284004688263], [0.634037971496582, 0.355970978736877], [0.656635999679565, 0.355356991291046], [0.681214988231659, 0.35834002494812], [0.698584973812103, 0.363156020641327], [0.941866993904114, 0.319076001644135], [0.698584973812103, 0.387449026107788], [0.584177017211914, 0.624107003211975], [0.554318010807037, 0.566076993942261], [0.534153997898102, 0.62064003944397], [0.711217999458313, 0.819975018501282], [0.664629995822906, 0.852871000766754], [0.559099972248077, 0.902631998062134], [0.871706008911133, 0.791940987110138], [0.591234028339386, 0.373893976211548], [0.544341027736664, 0.451583981513977], [0.624562978744507, 0.924192011356354], [0.88577002286911, 0.615028977394104], [0.551338016986847, 0.695277988910675], [0.551980018615723, 0.704632043838501], [0.552887976169586, 0.715808033943176], [0.555167973041534, 0.730794012546539], [0.569944024085999, 0.767035007476807], [0.593203008174896, 0.685675978660583], [0.599261999130249, 0.681069016456604], [0.607599973678589, 0.677703022956848], [0.631937980651855, 0.663500010967255], [0.752032995223999, 0.601315021514893], [0.547226011753082, 0.420395016670227], [0.563543975353241, 0.359827995300293], [0.583841025829315, 0.368713974952698], [0.586614012718201, 0.692366003990173], [0.771915018558502, 0.683578014373779], [0.531597018241882, 0.352482974529266], [0.588370978832245, 0.804440975189209], [0.52079701423645, 0.442565023899078], [0.567984998226166, 0.493479013442993], [0.543282985687256, 0.819254994392395], [0.655317008495331, 0.745514988899231], [0.621008992195129, 0.574018001556396], [0.625559985637665, 0.78031200170517], [0.680198013782501, 0.570719003677368], [0.64276397228241, 0.604337990283966], [0.704662978649139, 0.621529996395111], [0.552012026309967, 0.862591981887817], [0.589071989059448, 0.508637011051178], [0.685944974422455, 0.775357007980347], [0.645735025405884, 0.812640011310577], [0.675342977046967, 0.703978002071381], [0.810858011245728, 0.646304965019226], [0.72012197971344, 0.714666962623596], [0.866151988506317, 0.682704985141754], [0.663187026977539, 0.644596993923187], [0.570082008838654, 0.466325998306274], [0.544561982154846, 0.548375964164734], [0.562758982181549, 0.558784961700439], [0.531987011432648, 0.530140042304993], [0.585271000862122, 0.335177004337311], [0.622952997684479, 0.32277899980545], [0.655896008014679, 0.320163011550903], [0.687132000923157, 0.322345972061157], [0.716481983661652, 0.333200991153717], [0.758756995201111, 0.382786989212036], [0.897013008594513, 0.468769013881683], [0.732392013072968, 0.424547016620636], [0.70211398601532, 0.433162987232208], [0.66652500629425, 0.433866024017334], [0.633504986763, 0.426087975502014], [0.603875994682312, 0.416586995124817], [0.579657971858978, 0.409945011138916], [0.992439985275269, 0.480777025222778], [0.567192018032074, 0.569419980049133], [0.54136598110199, 0.478899002075195], [0.526564002037048, 0.546118021011353], [0.523913025856018, 0.563830018043518], [0.531529009342194, 0.555056989192963], [0.566035985946655, 0.582329034805298], [0.51631098985672, 0.563053965568542], [0.5174720287323, 0.577877044677734], [0.573594987392426, 0.389806985855103], [0.560697972774506, 0.395331978797913], [0.549755990505219, 0.399751007556915], [0.710287988185883, 0.368252992630005], [0.723330020904541, 0.363372981548309] ]; }); // src/face/facemesh.js var require_facemesh = __commonJS((exports3) => { const blazeface = __toModule(require_blazeface()); const keypoints = __toModule(require_keypoints()); const pipe = __toModule(require_facepipeline()); const uv_coords = __toModule(require_uvcoords()); class MediaPipeFaceMesh { constructor(blazeFace, blazeMeshModel, irisModel, config) { this.pipeline = new pipe.Pipeline(blazeFace, blazeMeshModel, irisModel, config); if (config) this.config = config; } async estimateFaces(input2, config) { if (config) this.config = config; const predictions = await this.pipeline.predict(input2, config); const results = []; for (const prediction of predictions || []) { if (prediction.isDisposedInternal) continue; const mesh = prediction.coords ? prediction.coords.arraySync() : null; const annotations = {}; if (mesh && mesh.length > 0) { for (const key in keypoints.MESH_ANNOTATIONS) { if (this.config.iris.enabled || key.includes("Iris") === false) { annotations[key] = keypoints.MESH_ANNOTATIONS[key].map((index) => mesh[index]); } } } results.push({ confidence: prediction.confidence || 0, box: prediction.box ? [prediction.box.startPoint[0], prediction.box.startPoint[1], prediction.box.endPoint[0] - prediction.box.startPoint[0], prediction.box.endPoint[1] - prediction.box.startPoint[1]] : 0, mesh, annotations, image: prediction.image ? dist_exports2.clone(prediction.image) : null }); if (prediction.coords) prediction.coords.dispose(); if (prediction.image) prediction.image.dispose(); } return results; } } async function load(config) { const models4 = await Promise.all([ blazeface.load(config), loadGraphModel2(config.mesh.modelPath, {fromTFHub: config.mesh.modelPath.includes("tfhub.dev")}), loadGraphModel2(config.iris.modelPath, {fromTFHub: config.iris.modelPath.includes("tfhub.dev")}) ]); const faceMesh = new MediaPipeFaceMesh(models4[0], models4[1], models4[2], config); console.log(`Human: load model: ${config.mesh.modelPath.match(/\/(.*)\./)[1]}`); console.log(`Human: load model: ${config.iris.modelPath.match(/\/(.*)\./)[1]}`); return faceMesh; } exports3.load = load; exports3.MediaPipeFaceMesh = MediaPipeFaceMesh; exports3.uv_coords = uv_coords; exports3.triangulation = triangulation_default; }); // src/profile.js var require_profile = __commonJS((exports3) => { const profileData = {}; function profile2(name, data) { if (!data || !data.kernels) return; const maxResults = 5; const time2 = data.kernels.filter((a) => a.kernelTimeMs > 0).reduce((a, b) => a += b.kernelTimeMs, 0); const slowest = data.kernels.map((a, i) => { a.id = i; return a; }).filter((a) => a.kernelTimeMs > 0).sort((a, b) => b.kernelTimeMs - a.kernelTimeMs); const largest = data.kernels.map((a, i) => { a.id = i; return a; }).filter((a) => a.totalBytesSnapshot > 0).sort((a, b) => b.totalBytesSnapshot - a.totalBytesSnapshot); if (slowest.length > maxResults) slowest.length = maxResults; if (largest.length > maxResults) largest.length = maxResults; const res = {newBytes: data.newBytes, newTensors: data.newTensors, peakBytes: data.peakBytes, numKernelOps: data.kernels.length, timeKernelOps: time2, slowestKernelOps: slowest, largestKernelOps: largest}; profileData[name] = res; console.log("Human profiler", name, res); } exports3.run = profile2; }); // src/age/age.js var require_age = __commonJS((exports3) => { const profile2 = __toModule(require_profile()); const models4 = {}; let last = {age: 0}; let frame4 = Number.MAX_SAFE_INTEGER; const zoom = [0, 0]; async function load(config) { if (!models4.age) { models4.age = await loadGraphModel2(config.face.age.modelPath); console.log(`Human: load model: ${config.face.age.modelPath.match(/\/(.*)\./)[1]}`); } return models4.age; } async function predict(image3, config) { if (frame4 < config.face.age.skipFrames && last.age && last.age > 0) { frame4 += 1; return last; } frame4 = 0; return new Promise(async (resolve) => { const box = [[ image3.shape[1] * zoom[0] / image3.shape[1], image3.shape[2] * zoom[1] / image3.shape[2], (image3.shape[1] - image3.shape[1] * zoom[0]) / image3.shape[1], (image3.shape[2] - image3.shape[2] * zoom[1]) / image3.shape[2] ]]; const resize = dist_exports2.image.cropAndResize(image3, box, [0], [config.face.age.inputSize, config.face.age.inputSize]); const enhance = dist_exports2.mul(resize, [255]); dist_exports2.dispose(resize); let ageT; const obj = {}; if (!config.profile) { if (config.face.age.enabled) ageT = await models4.age.predict(enhance); } else { const profileAge = config.face.age.enabled ? await dist_exports2.profile(() => models4.age.predict(enhance)) : {}; ageT = profileAge.result.clone(); profileAge.result.dispose(); profile2.run("age", profileAge); } enhance.dispose(); if (ageT) { const data = ageT.dataSync(); obj.age = Math.trunc(10 * data[0]) / 10; } ageT.dispose(); last = obj; resolve(obj); }); } exports3.predict = predict; exports3.load = load; }); // src/gender/gender.js var require_gender = __commonJS((exports3) => { const profile2 = __toModule(require_profile()); const models4 = {}; let last = {gender: ""}; let frame4 = Number.MAX_SAFE_INTEGER; let alternative = false; const zoom = [0, 0]; const rgb = [0.2989, 0.587, 0.114]; async function load(config) { if (!models4.gender) { models4.gender = await loadGraphModel2(config.face.gender.modelPath); alternative = models4.gender.inputs[0].shape[3] === 1; console.log(`Human: load model: ${config.face.gender.modelPath.match(/\/(.*)\./)[1]}`); } return models4.gender; } async function predict(image3, config) { if (frame4 < config.face.gender.skipFrames && last.gender !== "") { frame4 += 1; return last; } frame4 = 0; return new Promise(async (resolve) => { const box = [[ image3.shape[1] * zoom[0] / image3.shape[1], image3.shape[2] * zoom[1] / image3.shape[2], (image3.shape[1] - image3.shape[1] * zoom[0]) / image3.shape[1], (image3.shape[2] - image3.shape[2] * zoom[1]) / image3.shape[2] ]]; const resize = dist_exports2.image.cropAndResize(image3, box, [0], [config.face.gender.inputSize, config.face.gender.inputSize]); let enhance; if (alternative) { enhance = dist_exports2.tidy(() => { const [red, green, blue] = dist_exports2.split(resize, 3, 3); const redNorm = dist_exports2.mul(red, rgb[0]); const greenNorm = dist_exports2.mul(green, rgb[1]); const blueNorm = dist_exports2.mul(blue, rgb[2]); const grayscale = dist_exports2.addN([redNorm, greenNorm, blueNorm]); return grayscale.sub(0.5).mul(2); }); } else { enhance = dist_exports2.mul(resize, [255]); } dist_exports2.dispose(resize); let genderT; const obj = {}; if (!config.profile) { if (config.face.gender.enabled) genderT = await models4.gender.predict(enhance); } else { const profileGender = config.face.gender.enabled ? await dist_exports2.profile(() => models4.gender.predict(enhance)) : {}; genderT = profileGender.result.clone(); profileGender.result.dispose(); profile2.run("gender", profileGender); } enhance.dispose(); if (genderT) { const data = genderT.dataSync(); if (alternative) { const confidence = Math.trunc(100 * Math.abs(data[0] - data[1])) / 100; if (confidence > config.face.gender.minConfidence) { obj.gender = data[0] > data[1] ? "female" : "male"; obj.confidence = confidence; } } else { const confidence = Math.trunc(200 * Math.abs(data[0] - 0.5)) / 100; if (confidence > config.face.gender.minConfidence) { obj.gender = data[0] <= 0.5 ? "female" : "male"; obj.confidence = Math.min(0.99, confidence); } } } genderT.dispose(); last = obj; resolve(obj); }); } exports3.predict = predict; exports3.load = load; }); // src/emotion/emotion.js var require_emotion = __commonJS((exports3) => { const profile2 = __toModule(require_profile()); const annotations = ["angry", "disgust", "fear", "happy", "sad", "surpise", "neutral"]; const models4 = {}; let last = []; let frame4 = Number.MAX_SAFE_INTEGER; const zoom = [0, 0]; const rgb = [0.2989, 0.587, 0.114]; const scale = 1; async function load(config) { if (!models4.emotion) { models4.emotion = await loadGraphModel2(config.face.emotion.modelPath); console.log(`Human: load model: ${config.face.emotion.modelPath.match(/\/(.*)\./)[1]}`); } return models4.emotion; } async function predict(image3, config) { if (frame4 < config.face.emotion.skipFrames && last.length > 0) { frame4 += 1; return last; } frame4 = 0; return new Promise(async (resolve) => { const box = [[ image3.shape[1] * zoom[0] / image3.shape[1], image3.shape[2] * zoom[1] / image3.shape[2], (image3.shape[1] - image3.shape[1] * zoom[0]) / image3.shape[1], (image3.shape[2] - image3.shape[2] * zoom[1]) / image3.shape[2] ]]; const resize = dist_exports2.image.cropAndResize(image3, box, [0], [config.face.emotion.inputSize, config.face.emotion.inputSize]); const [red, green, blue] = dist_exports2.split(resize, 3, 3); resize.dispose(); const redNorm = dist_exports2.mul(red, rgb[0]); const greenNorm = dist_exports2.mul(green, rgb[1]); const blueNorm = dist_exports2.mul(blue, rgb[2]); red.dispose(); green.dispose(); blue.dispose(); const grayscale = dist_exports2.addN([redNorm, greenNorm, blueNorm]); redNorm.dispose(); greenNorm.dispose(); blueNorm.dispose(); const normalize = dist_exports2.tidy(() => grayscale.sub(0.5).mul(2)); grayscale.dispose(); const obj = []; if (config.face.emotion.enabled) { let data; if (!config.profile) { const emotionT = await models4.emotion.predict(normalize); data = emotionT.dataSync(); dist_exports2.dispose(emotionT); } else { const profileData = await dist_exports2.profile(() => models4.emotion.predict(normalize)); data = profileData.result.dataSync(); profileData.result.dispose(); profile2.run("emotion", profileData); } for (let i = 0; i < data.length; i++) { if (scale * data[i] > config.face.emotion.minConfidence) obj.push({score: Math.min(0.99, Math.trunc(100 * scale * data[i]) / 100), emotion: annotations[i]}); } obj.sort((a, b) => b.score - a.score); } normalize.dispose(); last = obj; resolve(obj); }); } exports3.predict = predict; exports3.load = load; }); // src/body/modelBase.js var require_modelBase = __commonJS((exports3) => { class BaseModel { constructor(model2, outputStride) { this.model = model2; this.outputStride = outputStride; } predict(input2) { return dist_exports2.tidy(() => { const asFloat = this.preprocessInput(input2.toFloat()); const asBatch = asFloat.expandDims(0); const results = this.model.predict(asBatch); const results3d = results.map((y) => y.squeeze([0])); const namedResults = this.nameOutputResults(results3d); return { heatmapScores: namedResults.heatmap.sigmoid(), offsets: namedResults.offsets, displacementFwd: namedResults.displacementFwd, displacementBwd: namedResults.displacementBwd }; }); } dispose() { this.model.dispose(); } } exports3.BaseModel = BaseModel; }); // src/body/modelMobileNet.js var require_modelMobileNet = __commonJS((exports3) => { const modelBase = __toModule(require_modelBase()); class MobileNet extends modelBase.BaseModel { preprocessInput(input2) { return dist_exports2.tidy(() => dist_exports2.div(input2, 127.5).sub(1)); } nameOutputResults(results) { const [offsets, heatmap, displacementFwd, displacementBwd] = results; return {offsets, heatmap, displacementFwd, displacementBwd}; } } exports3.MobileNet = MobileNet; }); // src/body/heapSort.js var require_heapSort = __commonJS((exports3) => { function half(k) { return Math.floor(k / 2); } class MaxHeap { constructor(maxSize, getElementValue) { this.priorityQueue = new Array(maxSize); this.numberOfElements = -1; this.getElementValue = getElementValue; } enqueue(x) { this.priorityQueue[++this.numberOfElements] = x; this.swim(this.numberOfElements); } dequeue() { const max8 = this.priorityQueue[0]; this.exchange(0, this.numberOfElements--); this.sink(0); this.priorityQueue[this.numberOfElements + 1] = null; return max8; } empty() { return this.numberOfElements === -1; } size() { return this.numberOfElements + 1; } all() { return this.priorityQueue.slice(0, this.numberOfElements + 1); } max() { return this.priorityQueue[0]; } swim(k) { while (k > 0 && this.less(half(k), k)) { this.exchange(k, half(k)); k = half(k); } } sink(k) { while (2 * k <= this.numberOfElements) { let j = 2 * k; if (j < this.numberOfElements && this.less(j, j + 1)) j++; if (!this.less(k, j)) break; this.exchange(k, j); k = j; } } getValueAt(i) { return this.getElementValue(this.priorityQueue[i]); } less(i, j) { return this.getValueAt(i) < this.getValueAt(j); } exchange(i, j) { const t = this.priorityQueue[i]; this.priorityQueue[i] = this.priorityQueue[j]; this.priorityQueue[j] = t; } } exports3.MaxHeap = MaxHeap; }); // src/body/buildParts.js var require_buildParts = __commonJS((exports3) => { const heapSort = __toModule(require_heapSort()); function scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, localMaximumRadius, scores) { const [height, width] = scores.shape; let localMaximum = true; const yStart = Math.max(heatmapY - localMaximumRadius, 0); const yEnd = Math.min(heatmapY + localMaximumRadius + 1, height); for (let yCurrent = yStart; yCurrent < yEnd; ++yCurrent) { const xStart = Math.max(heatmapX - localMaximumRadius, 0); const xEnd = Math.min(heatmapX + localMaximumRadius + 1, width); for (let xCurrent = xStart; xCurrent < xEnd; ++xCurrent) { if (scores.get(yCurrent, xCurrent, keypointId) > score) { localMaximum = false; break; } } if (!localMaximum) { break; } } return localMaximum; } function buildPartWithScoreQueue(scoreThreshold, localMaximumRadius, scores) { const [height, width, numKeypoints] = scores.shape; const queue = new heapSort.MaxHeap(height * width * numKeypoints, ({score}) => score); for (let heatmapY = 0; heatmapY < height; ++heatmapY) { for (let heatmapX = 0; heatmapX < width; ++heatmapX) { for (let keypointId = 0; keypointId < numKeypoints; ++keypointId) { const score = scores.get(heatmapY, heatmapX, keypointId); if (score < scoreThreshold) continue; if (scoreIsMaximumInLocalWindow(keypointId, score, heatmapY, heatmapX, localMaximumRadius, scores)) { queue.enqueue({score, part: {heatmapY, heatmapX, id: keypointId}}); } } } } return queue; } exports3.buildPartWithScoreQueue = buildPartWithScoreQueue; }); // src/body/keypoints.js var require_keypoints2 = __commonJS((exports3) => { exports3.partNames = [ "nose", "leftEye", "rightEye", "leftEar", "rightEar", "leftShoulder", "rightShoulder", "leftElbow", "rightElbow", "leftWrist", "rightWrist", "leftHip", "rightHip", "leftKnee", "rightKnee", "leftAnkle", "rightAnkle" ]; exports3.NUM_KEYPOINTS = exports3.partNames.length; exports3.partIds = exports3.partNames.reduce((result, jointName, i) => { result[jointName] = i; return result; }, {}); const connectedPartNames = [ ["leftHip", "leftShoulder"], ["leftElbow", "leftShoulder"], ["leftElbow", "leftWrist"], ["leftHip", "leftKnee"], ["leftKnee", "leftAnkle"], ["rightHip", "rightShoulder"], ["rightElbow", "rightShoulder"], ["rightElbow", "rightWrist"], ["rightHip", "rightKnee"], ["rightKnee", "rightAnkle"], ["leftShoulder", "rightShoulder"], ["leftHip", "rightHip"] ]; exports3.poseChain = [ ["nose", "leftEye"], ["leftEye", "leftEar"], ["nose", "rightEye"], ["rightEye", "rightEar"], ["nose", "leftShoulder"], ["leftShoulder", "leftElbow"], ["leftElbow", "leftWrist"], ["leftShoulder", "leftHip"], ["leftHip", "leftKnee"], ["leftKnee", "leftAnkle"], ["nose", "rightShoulder"], ["rightShoulder", "rightElbow"], ["rightElbow", "rightWrist"], ["rightShoulder", "rightHip"], ["rightHip", "rightKnee"], ["rightKnee", "rightAnkle"] ]; exports3.connectedPartIndices = connectedPartNames.map(([jointNameA, jointNameB]) => [exports3.partIds[jointNameA], exports3.partIds[jointNameB]]); exports3.partChannels = [ "left_face", "right_face", "right_upper_leg_front", "right_lower_leg_back", "right_upper_leg_back", "left_lower_leg_front", "left_upper_leg_front", "left_upper_leg_back", "left_lower_leg_back", "right_feet", "right_lower_leg_front", "left_feet", "torso_front", "torso_back", "right_upper_arm_front", "right_upper_arm_back", "right_lower_arm_back", "left_lower_arm_front", "left_upper_arm_front", "left_upper_arm_back", "left_lower_arm_back", "right_hand", "right_lower_arm_front", "left_hand" ]; }); // src/body/vectors.js var require_vectors = __commonJS((exports3) => { const kpt = __toModule(require_keypoints2()); function getOffsetPoint(y, x, keypoint, offsets) { return { y: offsets.get(y, x, keypoint), x: offsets.get(y, x, keypoint + kpt.NUM_KEYPOINTS) }; } exports3.getOffsetPoint = getOffsetPoint; function getImageCoords(part, outputStride, offsets) { const {heatmapY, heatmapX, id: keypoint} = part; const {y, x} = getOffsetPoint(heatmapY, heatmapX, keypoint, offsets); return { x: part.heatmapX * outputStride + x, y: part.heatmapY * outputStride + y }; } exports3.getImageCoords = getImageCoords; function fillArray(element, size) { const result = new Array(size); for (let i = 0; i < size; i++) { result[i] = element; } return result; } exports3.fillArray = fillArray; function clamp2(a, min6, max8) { if (a < min6) return min6; if (a > max8) return max8; return a; } exports3.clamp = clamp2; function squaredDistance(y1, x1, y2, x2) { const dy = y2 - y1; const dx = x2 - x1; return dy * dy + dx * dx; } exports3.squaredDistance = squaredDistance; function addVectors(a, b) { return {x: a.x + b.x, y: a.y + b.y}; } exports3.addVectors = addVectors; function clampVector(a, min6, max8) { return {y: clamp2(a.y, min6, max8), x: clamp2(a.x, min6, max8)}; } exports3.clampVector = clampVector; }); // src/body/decodePose.js var require_decodePose = __commonJS((exports3) => { const keypoints = __toModule(require_keypoints2()); const vectors = __toModule(require_vectors()); const parentChildrenTuples = keypoints.poseChain.map(([parentJoinName, childJoinName]) => [keypoints.partIds[parentJoinName], keypoints.partIds[childJoinName]]); const parentToChildEdges = parentChildrenTuples.map(([, childJointId]) => childJointId); const childToParentEdges = parentChildrenTuples.map(([parentJointId]) => parentJointId); function getDisplacement(edgeId, point, displacements) { const numEdges = displacements.shape[2] / 2; return { y: displacements.get(point.y, point.x, edgeId), x: displacements.get(point.y, point.x, numEdges + edgeId) }; } function getStridedIndexNearPoint(point, outputStride, height, width) { return { y: vectors.clamp(Math.round(point.y / outputStride), 0, height - 1), x: vectors.clamp(Math.round(point.x / outputStride), 0, width - 1) }; } function traverseToTargetKeypoint(edgeId, sourceKeypoint, targetKeypointId, scoresBuffer, offsets, outputStride, displacements, offsetRefineStep = 2) { const [height, width] = scoresBuffer.shape; const sourceKeypointIndices = getStridedIndexNearPoint(sourceKeypoint.position, outputStride, height, width); const displacement = getDisplacement(edgeId, sourceKeypointIndices, displacements); const displacedPoint = vectors.addVectors(sourceKeypoint.position, displacement); let targetKeypoint = displacedPoint; for (let i = 0; i < offsetRefineStep; i++) { const targetKeypointIndices = getStridedIndexNearPoint(targetKeypoint, outputStride, height, width); const offsetPoint = vectors.getOffsetPoint(targetKeypointIndices.y, targetKeypointIndices.x, targetKeypointId, offsets); targetKeypoint = vectors.addVectors({ x: targetKeypointIndices.x * outputStride, y: targetKeypointIndices.y * outputStride }, {x: offsetPoint.x, y: offsetPoint.y}); } const targetKeyPointIndices = getStridedIndexNearPoint(targetKeypoint, outputStride, height, width); const score = scoresBuffer.get(targetKeyPointIndices.y, targetKeyPointIndices.x, targetKeypointId); return {position: targetKeypoint, part: keypoints.partNames[targetKeypointId], score}; } function decodePose(root, scores, offsets, outputStride, displacementsFwd, displacementsBwd) { const numParts = scores.shape[2]; const numEdges = parentToChildEdges.length; const instanceKeypoints = new Array(numParts); const {part: rootPart, score: rootScore} = root; const rootPoint = vectors.getImageCoords(rootPart, outputStride, offsets); instanceKeypoints[rootPart.id] = { score: rootScore, part: keypoints.partNames[rootPart.id], position: rootPoint }; for (let edge = numEdges - 1; edge >= 0; --edge) { const sourceKeypointId = parentToChildEdges[edge]; const targetKeypointId = childToParentEdges[edge]; if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) { instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, outputStride, displacementsBwd); } } for (let edge = 0; edge < numEdges; ++edge) { const sourceKeypointId = childToParentEdges[edge]; const targetKeypointId = parentToChildEdges[edge]; if (instanceKeypoints[sourceKeypointId] && !instanceKeypoints[targetKeypointId]) { instanceKeypoints[targetKeypointId] = traverseToTargetKeypoint(edge, instanceKeypoints[sourceKeypointId], targetKeypointId, scores, offsets, outputStride, displacementsFwd); } } return instanceKeypoints; } exports3.decodePose = decodePose; }); // src/body/decodeMultiple.js var require_decodeMultiple = __commonJS((exports3) => { const buildParts = __toModule(require_buildParts()); const decodePose = __toModule(require_decodePose()); const vectors = __toModule(require_vectors()); function withinNmsRadiusOfCorrespondingPoint(poses, squaredNmsRadius, {x, y}, keypointId) { return poses.some(({keypoints}) => { const correspondingKeypoint = keypoints[keypointId].position; return vectors.squaredDistance(y, x, correspondingKeypoint.y, correspondingKeypoint.x) <= squaredNmsRadius; }); } function getInstanceScore(existingPoses, squaredNmsRadius, instanceKeypoints) { const notOverlappedKeypointScores = instanceKeypoints.reduce((result, {position, score}, keypointId) => { if (!withinNmsRadiusOfCorrespondingPoint(existingPoses, squaredNmsRadius, position, keypointId)) { result += score; } return result; }, 0); return notOverlappedKeypointScores / instanceKeypoints.length; } const kLocalMaximumRadius = 1; function decodeMultiplePoses(scoresBuffer, offsetsBuffer, displacementsFwdBuffer, displacementsBwdBuffer, outputStride, maxPoseDetections, scoreThreshold = 0.5, nmsRadius = 20) { const poses = []; const queue = buildParts.buildPartWithScoreQueue(scoreThreshold, kLocalMaximumRadius, scoresBuffer); const squaredNmsRadius = nmsRadius * nmsRadius; while (poses.length < maxPoseDetections && !queue.empty()) { const root = queue.dequeue(); const rootImageCoords = vectors.getImageCoords(root.part, outputStride, offsetsBuffer); if (withinNmsRadiusOfCorrespondingPoint(poses, squaredNmsRadius, rootImageCoords, root.part.id)) continue; const keypoints = decodePose.decodePose(root, scoresBuffer, offsetsBuffer, outputStride, displacementsFwdBuffer, displacementsBwdBuffer); const score = getInstanceScore(poses, squaredNmsRadius, keypoints); poses.push({keypoints, score}); } return poses; } exports3.decodeMultiplePoses = decodeMultiplePoses; }); // src/body/util.js var require_util2 = __commonJS((exports3) => { const kpt = __toModule(require_keypoints2()); function eitherPointDoesntMeetConfidence(a, b, minConfidence) { return a < minConfidence || b < minConfidence; } function getAdjacentKeyPoints(keypoints, minConfidence) { return kpt.connectedPartIndices.reduce((result, [leftJoint, rightJoint]) => { if (eitherPointDoesntMeetConfidence(keypoints[leftJoint].score, keypoints[rightJoint].score, minConfidence)) { return result; } result.push([keypoints[leftJoint], keypoints[rightJoint]]); return result; }, []); } exports3.getAdjacentKeyPoints = getAdjacentKeyPoints; const {NEGATIVE_INFINITY, POSITIVE_INFINITY} = Number; function getBoundingBox(keypoints) { return keypoints.reduce(({maxX, maxY, minX, minY}, {position: {x, y}}) => ({ maxX: Math.max(maxX, x), maxY: Math.max(maxY, y), minX: Math.min(minX, x), minY: Math.min(minY, y) }), { maxX: NEGATIVE_INFINITY, maxY: NEGATIVE_INFINITY, minX: POSITIVE_INFINITY, minY: POSITIVE_INFINITY }); } exports3.getBoundingBox = getBoundingBox; function getBoundingBoxPoints(keypoints) { const {minX, minY, maxX, maxY} = getBoundingBox(keypoints); return [{x: minX, y: minY}, {x: maxX, y: minY}, {x: maxX, y: maxY}, {x: minX, y: maxY}]; } exports3.getBoundingBoxPoints = getBoundingBoxPoints; async function toTensorBuffers3D(tensors) { return Promise.all(tensors.map((tensor16) => tensor16.buffer())); } exports3.toTensorBuffers3D = toTensorBuffers3D; function scalePose(pose, scaleY, scaleX) { return { score: pose.score, keypoints: pose.keypoints.map(({score, part, position}) => ({ score, part, position: {x: position.x * scaleX, y: position.y * scaleY} })) }; } exports3.scalePose = scalePose; function resizeTo(image3, [targetH, targetW]) { const input2 = image3.squeeze(0); const resized = input2.resizeBilinear([targetH, targetW]); input2.dispose(); return resized; } exports3.resizeTo = resizeTo; function scaleAndFlipPoses(poses, [height, width], [inputResolutionHeight, inputResolutionWidth]) { const scaledPoses = poses.map((pose) => scalePose(pose, height / inputResolutionHeight, width / inputResolutionWidth)); return scaledPoses; } exports3.scaleAndFlipPoses = scaleAndFlipPoses; }); // src/body/modelPoseNet.js var require_modelPoseNet = __commonJS((exports3) => { const modelMobileNet = __toModule(require_modelMobileNet()); const decodeMultiple = __toModule(require_decodeMultiple()); const util145 = __toModule(require_util2()); class PoseNet { constructor(net) { this.baseModel = net; this.outputStride = 16; } async estimatePoses(input2, config) { return new Promise(async (resolve) => { const height = input2.shape[1]; const width = input2.shape[2]; const resized = util145.resizeTo(input2, [config.body.inputSize, config.body.inputSize]); const res = this.baseModel.predict(resized); const allTensorBuffers = await util145.toTensorBuffers3D([res.heatmapScores, res.offsets, res.displacementFwd, res.displacementBwd]); const scoresBuffer = allTensorBuffers[0]; const offsetsBuffer = allTensorBuffers[1]; const displacementsFwdBuffer = allTensorBuffers[2]; const displacementsBwdBuffer = allTensorBuffers[3]; const poses = await decodeMultiple.decodeMultiplePoses(scoresBuffer, offsetsBuffer, displacementsFwdBuffer, displacementsBwdBuffer, this.outputStride, config.body.maxDetections, config.body.scoreThreshold, config.body.nmsRadius); const resultPoses = util145.scaleAndFlipPoses(poses, [height, width], [config.body.inputSize, config.body.inputSize]); res.heatmapScores.dispose(); res.offsets.dispose(); res.displacementFwd.dispose(); res.displacementBwd.dispose(); resized.dispose(); resolve(resultPoses); }); } dispose() { this.baseModel.dispose(); } } exports3.PoseNet = PoseNet; async function load(config) { const graphModel = await loadGraphModel2(config.body.modelPath); const mobilenet = new modelMobileNet.MobileNet(graphModel, this.outputStride); console.log(`Human: load model: ${config.body.modelPath.match(/\/(.*)\./)[1]}`); return new PoseNet(mobilenet); } exports3.load = load; }); // src/body/posenet.js var require_posenet = __commonJS((exports3) => { const modelMobileNet = __toModule(require_modelMobileNet()); const modelPoseNet = __toModule(require_modelPoseNet()); const decodeMultiple = __toModule(require_decodeMultiple()); const keypoints = __toModule(require_keypoints2()); const util145 = __toModule(require_util2()); exports3.load = modelPoseNet.load; exports3.PoseNet = modelPoseNet.PoseNet; exports3.MobileNet = modelMobileNet.MobileNet; exports3.decodeMultiplePoses = decodeMultiple.decodeMultiplePoses; exports3.partChannels = keypoints.partChannels; exports3.partIds = keypoints.partIds; exports3.partNames = keypoints.partNames; exports3.poseChain = keypoints.poseChain; exports3.getAdjacentKeyPoints = util145.getAdjacentKeyPoints; exports3.getBoundingBox = util145.getBoundingBox; exports3.getBoundingBoxPoints = util145.getBoundingBoxPoints; exports3.scaleAndFlipPoses = util145.scaleAndFlipPoses; exports3.scalePose = util145.scalePose; }); // src/hand/handdetector.js var require_handdetector = __commonJS((exports3) => { /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ class HandDetector { constructor(model2, inputSize, anchorsAnnotated) { this.model = model2; this.anchors = anchorsAnnotated.map((anchor) => [anchor.x_center, anchor.y_center]); this.anchorsTensor = dist_exports2.tensor2d(this.anchors); this.inputSizeTensor = dist_exports2.tensor1d([inputSize, inputSize]); this.doubleInputSizeTensor = dist_exports2.tensor1d([inputSize * 2, inputSize * 2]); } normalizeBoxes(boxes) { return dist_exports2.tidy(() => { const boxOffsets = dist_exports2.slice(boxes, [0, 0], [-1, 2]); const boxSizes = dist_exports2.slice(boxes, [0, 2], [-1, 2]); const boxCenterPoints = dist_exports2.add(dist_exports2.div(boxOffsets, this.inputSizeTensor), this.anchorsTensor); const halfBoxSizes = dist_exports2.div(boxSizes, this.doubleInputSizeTensor); const startPoints = dist_exports2.mul(dist_exports2.sub(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); const endPoints = dist_exports2.mul(dist_exports2.add(boxCenterPoints, halfBoxSizes), this.inputSizeTensor); return dist_exports2.concat2d([startPoints, endPoints], 1); }); } normalizeLandmarks(rawPalmLandmarks, index) { return dist_exports2.tidy(() => { const landmarks = dist_exports2.add(dist_exports2.div(rawPalmLandmarks.reshape([-1, 7, 2]), this.inputSizeTensor), this.anchors[index]); return dist_exports2.mul(landmarks, this.inputSizeTensor); }); } async getBoxes(input2, config) { const batched = this.model.predict(input2); const predictions = batched.squeeze(); batched.dispose(); const scores = dist_exports2.tidy(() => dist_exports2.sigmoid(dist_exports2.slice(predictions, [0, 0], [-1, 1])).squeeze()); const scoresVal = scores.dataSync(); const rawBoxes = dist_exports2.slice(predictions, [0, 1], [-1, 4]); const boxes = this.normalizeBoxes(rawBoxes); rawBoxes.dispose(); const filteredT = await dist_exports2.image.nonMaxSuppressionAsync(boxes, scores, config.maxHands, config.iouThreshold, config.scoreThreshold); const filtered = filteredT.arraySync(); scores.dispose(); filteredT.dispose(); const hands = []; for (const boxIndex of filtered) { if (scoresVal[boxIndex] >= config.minConfidence) { const matchingBox = dist_exports2.slice(boxes, [boxIndex, 0], [1, -1]); const rawPalmLandmarks = dist_exports2.slice(predictions, [boxIndex, 5], [1, 14]); const palmLandmarks = dist_exports2.tidy(() => this.normalizeLandmarks(rawPalmLandmarks, boxIndex).reshape([-1, 2])); rawPalmLandmarks.dispose(); hands.push({box: matchingBox, palmLandmarks, confidence: scoresVal[boxIndex]}); } } predictions.dispose(); boxes.dispose(); return hands; } async estimateHandBounds(input2, config) { const inputHeight = input2.shape[1]; const inputWidth = input2.shape[2]; const image3 = dist_exports2.tidy(() => input2.resizeBilinear([config.inputSize, config.inputSize]).div(127.5).sub(1)); const predictions = await this.getBoxes(image3, config); image3.dispose(); if (!predictions || predictions.length === 0) return null; const hands = []; for (const prediction of predictions) { const boxes = prediction.box.dataSync(); const startPoint = boxes.slice(0, 2); const endPoint = boxes.slice(2, 4); const palmLandmarks = prediction.palmLandmarks.arraySync(); prediction.box.dispose(); prediction.palmLandmarks.dispose(); hands.push(scaleBoxCoordinates({startPoint, endPoint, palmLandmarks, confidence: prediction.confidence}, [inputWidth / config.inputSize, inputHeight / config.inputSize])); } return hands; } } exports3.HandDetector = HandDetector; }); // src/hand/handpipeline.js var require_handpipeline = __commonJS((exports3) => { /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const PALM_BOX_SHIFT_VECTOR = [0, -0.4]; const PALM_BOX_ENLARGE_FACTOR = 3; const HAND_BOX_SHIFT_VECTOR = [0, -0.1]; const HAND_BOX_ENLARGE_FACTOR = 1.65; const PALM_LANDMARK_IDS = [0, 5, 9, 13, 17, 1, 2]; const PALM_LANDMARKS_INDEX_OF_PALM_BASE = 0; const PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE = 2; class HandPipeline { constructor(boundingBoxDetector, meshDetector, inputSize) { this.boxDetector = boundingBoxDetector; this.meshDetector = meshDetector; this.inputSize = inputSize; this.storedBoxes = []; this.skipped = 1e3; this.detectedHands = 0; } getBoxForPalmLandmarks(palmLandmarks, rotationMatrix) { const rotatedPalmLandmarks = palmLandmarks.map((coord) => { const homogeneousCoordinate = [...coord, 1]; return rotatePoint(homogeneousCoordinate, rotationMatrix); }); const boxAroundPalm = this.calculateLandmarksBoundingBox(rotatedPalmLandmarks); return enlargeBox(squarifyBox(shiftBox(boxAroundPalm, PALM_BOX_SHIFT_VECTOR)), PALM_BOX_ENLARGE_FACTOR); } getBoxForHandLandmarks(landmarks) { const boundingBox = this.calculateLandmarksBoundingBox(landmarks); const boxAroundHand = enlargeBox(squarifyBox(shiftBox(boundingBox, HAND_BOX_SHIFT_VECTOR)), HAND_BOX_ENLARGE_FACTOR); const palmLandmarks = []; for (let i = 0; i < PALM_LANDMARK_IDS.length; i++) { palmLandmarks.push(landmarks[PALM_LANDMARK_IDS[i]].slice(0, 2)); } boxAroundHand.palmLandmarks = palmLandmarks; return boxAroundHand; } transformRawCoords(rawCoords, box2, angle, rotationMatrix) { const boxSize = getBoxSize(box2); const scaleFactor = [boxSize[0] / this.inputSize, boxSize[1] / this.inputSize]; const coordsScaled = rawCoords.map((coord) => [ scaleFactor[0] * (coord[0] - this.inputSize / 2), scaleFactor[1] * (coord[1] - this.inputSize / 2), coord[2] ]); const coordsRotationMatrix = buildRotationMatrix(angle, [0, 0]); const coordsRotated = coordsScaled.map((coord) => { const rotated = rotatePoint(coord, coordsRotationMatrix); return [...rotated, coord[2]]; }); const inverseRotationMatrix = invertTransformMatrix(rotationMatrix); const boxCenter = [...getBoxCenter(box2), 1]; const originalBoxCenter = [ dot5(boxCenter, inverseRotationMatrix[0]), dot5(boxCenter, inverseRotationMatrix[1]) ]; return coordsRotated.map((coord) => [ coord[0] + originalBoxCenter[0], coord[1] + originalBoxCenter[1], coord[2] ]); } async estimateHands(image3, config) { this.skipped++; let useFreshBox = false; let boxes; if (this.skipped > config.skipFrames || !config.landmarks) { boxes = await this.boxDetector.estimateHandBounds(image3, config); if (image3.shape[1] !== 255 && image3.shape[2] !== 255) this.skipped = 0; } if (boxes && boxes.length > 0 && (boxes.length !== this.detectedHands && this.detectedHands !== config.maxHands || !config.landmarks)) { this.storedBoxes = []; this.detectedHands = 0; for (const possible of boxes) this.storedBoxes.push(possible); if (this.storedBoxes.length > 0) useFreshBox = true; } const hands = []; for (const i in this.storedBoxes) { const currentBox = this.storedBoxes[i]; if (!currentBox) continue; if (config.landmarks) { const angle = computeRotation(currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_PALM_BASE], currentBox.palmLandmarks[PALM_LANDMARKS_INDEX_OF_MIDDLE_FINGER_BASE]); const palmCenter = getBoxCenter(currentBox); const palmCenterNormalized = [palmCenter[0] / image3.shape[2], palmCenter[1] / image3.shape[1]]; const rotatedImage = dist_exports2.image.rotateWithOffset(image3, angle, 0, palmCenterNormalized); const rotationMatrix = buildRotationMatrix(-angle, palmCenter); const newBox = useFreshBox ? this.getBoxForPalmLandmarks(currentBox.palmLandmarks, rotationMatrix) : currentBox; const croppedInput = cutBoxFromImageAndResize(newBox, rotatedImage, [this.inputSize, this.inputSize]); const handImage = croppedInput.div(255); croppedInput.dispose(); rotatedImage.dispose(); const [confidence, keypoints] = await this.meshDetector.predict(handImage); handImage.dispose(); const confidenceValue = confidence.dataSync()[0]; confidence.dispose(); if (confidenceValue >= config.minConfidence) { const keypointsReshaped = dist_exports2.reshape(keypoints, [-1, 3]); const rawCoords = keypointsReshaped.arraySync(); keypoints.dispose(); keypointsReshaped.dispose(); const coords = this.transformRawCoords(rawCoords, newBox, angle, rotationMatrix); const nextBoundingBox = this.getBoxForHandLandmarks(coords); this.storedBoxes[i] = nextBoundingBox; const result = { landmarks: coords, confidence: confidenceValue, box: { topLeft: nextBoundingBox.startPoint, bottomRight: nextBoundingBox.endPoint } }; hands.push(result); } else { this.storedBoxes[i] = null; } keypoints.dispose(); } else { const enlarged = enlargeBox(squarifyBox(shiftBox(currentBox, HAND_BOX_SHIFT_VECTOR)), HAND_BOX_ENLARGE_FACTOR); const result = { confidence: currentBox.confidence, box: { topLeft: enlarged.startPoint, bottomRight: enlarged.endPoint } }; hands.push(result); } } this.storedBoxes = this.storedBoxes.filter((a) => a !== null); this.detectedHands = hands.length; return hands; } calculateLandmarksBoundingBox(landmarks) { const xs = landmarks.map((d) => d[0]); const ys = landmarks.map((d) => d[1]); const startPoint = [Math.min(...xs), Math.min(...ys)]; const endPoint = [Math.max(...xs), Math.max(...ys)]; return {startPoint, endPoint}; } } exports3.HandPipeline = HandPipeline; }); // src/hand/anchors.js var require_anchors = __commonJS((exports3) => { exports3.anchors = [ { w: 1, h: 1, x_center: 0.015625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.015625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.046875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.078125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.109375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.140625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.171875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.203125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.234375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.265625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.296875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.328125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.359375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.390625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.421875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.453125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.484375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.515625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.546875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.578125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.609375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.640625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.671875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.703125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.734375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.765625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.796875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.828125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.859375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.890625 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.921875 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.953125 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.015625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.046875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.078125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.109375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.140625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.171875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.203125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.234375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.265625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.296875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.328125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.359375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.390625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.421875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.453125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.484375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.515625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.546875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.578125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.609375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.640625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.671875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.703125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.734375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.765625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.796875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.828125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.859375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.890625, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.921875, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.953125, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.984375, y_center: 0.984375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.03125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.09375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.15625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.21875 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.28125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.34375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.40625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.46875 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.53125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.59375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.65625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.71875 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.78125 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.84375 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.90625 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.03125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.09375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.15625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.21875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.28125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.34375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.40625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.46875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.53125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.59375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.65625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.71875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.78125, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.84375, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.90625, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.96875, y_center: 0.96875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.0625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.1875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.3125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.4375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.5625 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.6875 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.8125 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.0625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.1875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.3125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.4375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.5625, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.6875, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.8125, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.9375 }, { w: 1, h: 1, x_center: 0.9375, y_center: 0.9375 } ]; }); // src/hand/handpose.js var require_handpose = __commonJS((exports3) => { const handdetector = __toModule(require_handdetector()); const pipeline = __toModule(require_handpipeline()); const anchors = __toModule(require_anchors()); /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const MESH_ANNOTATIONS = { thumb: [1, 2, 3, 4], indexFinger: [5, 6, 7, 8], middleFinger: [9, 10, 11, 12], ringFinger: [13, 14, 15, 16], pinky: [17, 18, 19, 20], palmBase: [0] }; class HandPose { constructor(pipe) { this.pipeline = pipe; } static getAnnotations() { return MESH_ANNOTATIONS; } async estimateHands(input2, config) { const predictions = await this.pipeline.estimateHands(input2, config); if (!predictions) return []; const hands = []; for (const prediction of predictions) { const annotations = {}; if (prediction.landmarks) { for (const key of Object.keys(MESH_ANNOTATIONS)) { annotations[key] = MESH_ANNOTATIONS[key].map((index) => prediction.landmarks[index]); } } hands.push({ confidence: prediction.confidence, box: prediction.box ? [ prediction.box.topLeft[0], prediction.box.topLeft[1], prediction.box.bottomRight[0] - prediction.box.topLeft[0], prediction.box.bottomRight[1] - prediction.box.topLeft[1] ] : 0, landmarks: prediction.landmarks, annotations }); } return hands; } } exports3.HandPose = HandPose; async function load(config) { const [handDetectorModel, handPoseModel] = await Promise.all([ loadGraphModel2(config.detector.modelPath, {fromTFHub: config.detector.modelPath.includes("tfhub.dev")}), loadGraphModel2(config.skeleton.modelPath, {fromTFHub: config.skeleton.modelPath.includes("tfhub.dev")}) ]); const detector = new handdetector.HandDetector(handDetectorModel, config.inputSize, anchors.anchors); const pipe = new pipeline.HandPipeline(detector, handPoseModel, config.inputSize); const handpose = new HandPose(pipe); console.log(`Human: load model: ${config.detector.modelPath.match(/\/(.*)\./)[1]}`); console.log(`Human: load model: ${config.skeleton.modelPath.match(/\/(.*)\./)[1]}`); return handpose; } exports3.load = load; }); // src/gesture.js var require_gesture = __commonJS((exports3) => { exports3.body = (res) => { if (!res) return []; const gestures = []; for (const pose of res) { const leftWrist = pose.keypoints.find((a) => a.part === "leftWrist"); const rightWrist = pose.keypoints.find((a) => a.part === "rightWrist"); const nose = pose.keypoints.find((a) => a.part === "nose"); if (nose && leftWrist && rightWrist && leftWrist.position.y < nose.position.y && rightWrist.position.y < nose.position.y) gestures.push("i give up"); else if (nose && leftWrist && leftWrist.position.y < nose.position.y) gestures.push("raise left hand"); else if (nose && rightWrist && rightWrist.position.y < nose.position.y) gestures.push("raise right hand"); const leftShoulder = pose.keypoints.find((a) => a.part === "leftShoulder"); const rightShoulder = pose.keypoints.find((a) => a.part === "rightShoulder"); if (leftShoulder && rightShoulder) gestures.push(`leaning ${leftShoulder.position.y > rightShoulder.position.y ? "left" : "right"}`); } return gestures; }; exports3.face = (res) => { if (!res) return []; const gestures = []; for (const face of res) { if (face.mesh && face.mesh.length > 0) { const eyeFacing = face.mesh[35][2] - face.mesh[263][2]; if (Math.abs(eyeFacing) < 10) gestures.push("facing camera"); else gestures.push(`facing ${eyeFacing < 0 ? "right" : "left"}`); const openLeft = Math.abs(face.mesh[374][1] - face.mesh[386][1]) / Math.abs(face.mesh[443][1] - face.mesh[450][1]); if (openLeft < 0.2) gestures.push("blink left eye"); const openRight = Math.abs(face.mesh[145][1] - face.mesh[159][1]) / Math.abs(face.mesh[223][1] - face.mesh[230][1]); if (openRight < 0.2) gestures.push("blink right eye"); const mouthOpen = Math.min(100, 500 * Math.abs(face.mesh[13][1] - face.mesh[14][1]) / Math.abs(face.mesh[10][1] - face.mesh[152][1])); if (mouthOpen > 10) gestures.push(`mouth ${Math.trunc(mouthOpen)}% open`); const chinDepth = face.mesh[152][2]; if (Math.abs(chinDepth) > 10) gestures.push(`head ${chinDepth < 0 ? "up" : "down"}`); } } return gestures; }; exports3.hand = (res) => { if (!res) return []; const gestures = []; for (const hand of res) { const fingers = []; for (const [finger, pos] of Object.entries(hand["annotations"])) { if (finger !== "palmBase") fingers.push({name: finger.toLowerCase(), position: pos[0]}); } if (fingers && fingers.length > 0) { const closest = fingers.reduce((best, a) => best.position[2] < a.position[2] ? best : a); const highest = fingers.reduce((best, a) => best.position[1] < a.position[1] ? best : a); gestures.push(`${closest.name} forward ${highest.name} up`); } } return gestures; }; }); // src/imagefx.js var require_imagefx = __commonJS((exports3) => { const WebGLProgram = function(gl, vertexSource, fragmentSource) { const _collect = function(source, prefix, collection) { const r = new RegExp("\\b" + prefix + " \\w+ (\\w+)", "ig"); source.replace(r, (match, name) => { collection[name] = 0; return match; }); }; const _compile = function(source, type) { const shader = gl.createShader(type); gl.shaderSource(shader, source); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { throw new Error("Filter: GL compile failed", gl.getShaderInfoLog(shader)); } return shader; }; this.uniform = {}; this.attribute = {}; const _vsh = _compile(vertexSource, gl.VERTEX_SHADER); const _fsh = _compile(fragmentSource, gl.FRAGMENT_SHADER); this.id = gl.createProgram(); gl.attachShader(this.id, _vsh); gl.attachShader(this.id, _fsh); gl.linkProgram(this.id); if (!gl.getProgramParameter(this.id, gl.LINK_STATUS)) { throw new Error("Filter: GL link failed", gl.getProgramInfoLog(this.id)); } gl.useProgram(this.id); _collect(vertexSource, "attribute", this.attribute); for (const a in this.attribute) { this.attribute[a] = gl.getAttribLocation(this.id, a); } _collect(vertexSource, "uniform", this.uniform); _collect(fragmentSource, "uniform", this.uniform); for (const u in this.uniform) { this.uniform[u] = gl.getUniformLocation(this.id, u); } }; const WebGLImageFilter = function(params) { if (!params) params = {}; let _drawCount = 0; let _sourceTexture = null; let _lastInChain = false; let _currentFramebufferIndex = -1; let _tempFramebuffers = [null, null]; let _filterChain = []; let _width = -1; let _height = -1; let _vertexBuffer = null; let _currentProgram = null; const _canvas = params.canvas || document.createElement("canvas"); const _shaderProgramCache = {}; const gl = _canvas.getContext("webgl"); if (!gl) throw new Error("Filter: getContext() failed"); this.addFilter = function(name) { const args = Array.prototype.slice.call(arguments, 1); const filter = _filter[name]; _filterChain.push({func: filter, args}); }; this.reset = function() { _filterChain = []; }; this.apply = function(image3) { _resize(image3.width, image3.height); _drawCount = 0; if (!_sourceTexture) _sourceTexture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, _sourceTexture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image3); if (_filterChain.length === 0) { _draw(); return _canvas; } for (let i = 0; i < _filterChain.length; i++) { _lastInChain = i === _filterChain.length - 1; const f = _filterChain[i]; f.func.apply(this, f.args || []); } return _canvas; }; const _resize = function(width, height) { if (width === _width && height === _height) { return; } _canvas.width = width; _width = width; _canvas.height = height; _height = height; if (!_vertexBuffer) { const vertices = new Float32Array([ -1, -1, 0, 1, 1, -1, 1, 1, -1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 1, 1, 1, 1, 1, 0 ]); _vertexBuffer = gl.createBuffer(), gl.bindBuffer(gl.ARRAY_BUFFER, _vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); } gl.viewport(0, 0, _width, _height); _tempFramebuffers = [null, null]; }; const _getTempFramebuffer = function(index) { _tempFramebuffers[index] = _tempFramebuffers[index] || _createFramebufferTexture(_width, _height); return _tempFramebuffers[index]; }; const _createFramebufferTexture = function(width, height) { const fbo = gl.createFramebuffer(); gl.bindFramebuffer(gl.FRAMEBUFFER, fbo); const renderbuffer = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer); const texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); gl.bindTexture(gl.TEXTURE_2D, null); gl.bindFramebuffer(gl.FRAMEBUFFER, null); return {fbo, texture}; }; const _draw = function(flags2) { let source = null; let target = null; let flipY = false; if (_drawCount === 0) { source = _sourceTexture; } else { source = _getTempFramebuffer(_currentFramebufferIndex).texture; } _drawCount++; if (_lastInChain && !(flags2 & DRAW.INTERMEDIATE)) { target = null; flipY = _drawCount % 2 === 0; } else { _currentFramebufferIndex = (_currentFramebufferIndex + 1) % 2; target = _getTempFramebuffer(_currentFramebufferIndex).fbo; } gl.bindTexture(gl.TEXTURE_2D, source); gl.bindFramebuffer(gl.FRAMEBUFFER, target); gl.uniform1f(_currentProgram.uniform.flipY, flipY ? -1 : 1); gl.drawArrays(gl.TRIANGLES, 0, 6); }; const _compileShader = function(fragmentSource) { if (_shaderProgramCache[fragmentSource]) { _currentProgram = _shaderProgramCache[fragmentSource]; gl.useProgram(_currentProgram.id); return _currentProgram; } _currentProgram = new WebGLProgram(gl, SHADER.VERTEX_IDENTITY, fragmentSource); const floatSize = Float32Array.BYTES_PER_ELEMENT; const vertSize = 4 * floatSize; gl.enableVertexAttribArray(_currentProgram.attribute.pos); gl.vertexAttribPointer(_currentProgram.attribute.pos, 2, gl.FLOAT, false, vertSize, 0 * floatSize); gl.enableVertexAttribArray(_currentProgram.attribute.uv); gl.vertexAttribPointer(_currentProgram.attribute.uv, 2, gl.FLOAT, false, vertSize, 2 * floatSize); _shaderProgramCache[fragmentSource] = _currentProgram; return _currentProgram; }; let DRAW = {INTERMEDIATE: 1}; let SHADER = {}; SHADER.VERTEX_IDENTITY = [ "precision highp float;", "attribute vec2 pos;", "attribute vec2 uv;", "varying vec2 vUv;", "uniform float flipY;", "void main(void) {", "vUv = uv;", "gl_Position = vec4(pos.x, pos.y*flipY, 0.0, 1.);", "}" ].join("\n"); SHADER.FRAGMENT_IDENTITY = [ "precision highp float;", "varying vec2 vUv;", "uniform sampler2D texture;", "void main(void) {", "gl_FragColor = texture2D(texture, vUv);", "}" ].join("\n"); let _filter = {}; _filter.colorMatrix = function(matrix) { const m = new Float32Array(matrix); m[4] /= 255; m[9] /= 255; m[14] /= 255; m[19] /= 255; const shader = m[18] === 1 && m[3] === 0 && m[8] === 0 && m[13] === 0 && m[15] === 0 && m[16] === 0 && m[17] === 0 && m[19] === 0 ? _filter.colorMatrix.SHADER.WITHOUT_ALPHA : _filter.colorMatrix.SHADER.WITH_ALPHA; const program = _compileShader(shader); gl.uniform1fv(program.uniform.m, m); _draw(); }; _filter.colorMatrix.SHADER = {}; _filter.colorMatrix.SHADER.WITH_ALPHA = [ "precision highp float;", "varying vec2 vUv;", "uniform sampler2D texture;", "uniform float m[20];", "void main(void) {", "vec4 c = texture2D(texture, vUv);", "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[3] * c.a + m[4];", "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[8] * c.a + m[9];", "gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[13] * c.a + m[14];", "gl_FragColor.a = m[15] * c.r + m[16] * c.g + m[17] * c.b + m[18] * c.a + m[19];", "}" ].join("\n"); _filter.colorMatrix.SHADER.WITHOUT_ALPHA = [ "precision highp float;", "varying vec2 vUv;", "uniform sampler2D texture;", "uniform float m[20];", "void main(void) {", "vec4 c = texture2D(texture, vUv);", "gl_FragColor.r = m[0] * c.r + m[1] * c.g + m[2] * c.b + m[4];", "gl_FragColor.g = m[5] * c.r + m[6] * c.g + m[7] * c.b + m[9];", "gl_FragColor.b = m[10] * c.r + m[11] * c.g + m[12] * c.b + m[14];", "gl_FragColor.a = c.a;", "}" ].join("\n"); _filter.brightness = function(brightness) { const b = (brightness || 0) + 1; _filter.colorMatrix([ b, 0, 0, 0, 0, 0, b, 0, 0, 0, 0, 0, b, 0, 0, 0, 0, 0, 1, 0 ]); }; _filter.saturation = function(amount) { const x = (amount || 0) * 2 / 3 + 1; const y = (x - 1) * -0.5; _filter.colorMatrix([ x, y, y, 0, 0, y, x, y, 0, 0, y, y, x, 0, 0, 0, 0, 0, 1, 0 ]); }; _filter.desaturate = function() { _filter.saturation(-1); }; _filter.contrast = function(amount) { const v = (amount || 0) + 1; const o = -128 * (v - 1); _filter.colorMatrix([ v, 0, 0, 0, o, 0, v, 0, 0, o, 0, 0, v, 0, o, 0, 0, 0, 1, 0 ]); }; _filter.negative = function() { _filter.contrast(-2); }; _filter.hue = function(rotation) { rotation = (rotation || 0) / 180 * Math.PI; const cos3 = Math.cos(rotation); const sin3 = Math.sin(rotation); const lumR = 0.213; const lumG = 0.715; const lumB = 0.072; _filter.colorMatrix([ lumR + cos3 * (1 - lumR) + sin3 * -lumR, lumG + cos3 * -lumG + sin3 * -lumG, lumB + cos3 * -lumB + sin3 * (1 - lumB), 0, 0, lumR + cos3 * -lumR + sin3 * 0.143, lumG + cos3 * (1 - lumG) + sin3 * 0.14, lumB + cos3 * -lumB + sin3 * -0.283, 0, 0, lumR + cos3 * -lumR + sin3 * -(1 - lumR), lumG + cos3 * -lumG + sin3 * lumG, lumB + cos3 * (1 - lumB) + sin3 * lumB, 0, 0, 0, 0, 0, 1, 0 ]); }; _filter.desaturateLuminance = function() { _filter.colorMatrix([ 0.2764723, 0.929708, 0.0938197, 0, -37.1, 0.2764723, 0.929708, 0.0938197, 0, -37.1, 0.2764723, 0.929708, 0.0938197, 0, -37.1, 0, 0, 0, 1, 0 ]); }; _filter.sepia = function() { _filter.colorMatrix([ 0.393, 0.7689999, 0.18899999, 0, 0, 0.349, 0.6859999, 0.16799999, 0, 0, 0.272, 0.5339999, 0.13099999, 0, 0, 0, 0, 0, 1, 0 ]); }; _filter.brownie = function() { _filter.colorMatrix([ 0.5997023498159715, 0.34553243048391263, -0.2708298674538042, 0, 47.43192855600873, -0.037703249837783157, 0.8609577587992641, 0.15059552388459913, 0, -36.96841498319127, 0.24113635128153335, -0.07441037908422492, 0.44972182064877153, 0, -7.562075277591283, 0, 0, 0, 1, 0 ]); }; _filter.vintagePinhole = function() { _filter.colorMatrix([ 0.6279345635605994, 0.3202183420819367, -0.03965408211312453, 0, 9.651285835294123, 0.02578397704808868, 0.6441188644374771, 0.03259127616149294, 0, 7.462829176470591, 0.0466055556782719, -0.0851232987247891, 0.5241648018700465, 0, 5.159190588235296, 0, 0, 0, 1, 0 ]); }; _filter.kodachrome = function() { _filter.colorMatrix([ 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502, -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203, -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946, 0, 0, 0, 1, 0 ]); }; _filter.technicolor = function() { _filter.colorMatrix([ 1.9125277891456083, -0.8545344976951645, -0.09155508482755585, 0, 11.793603434377337, -0.3087833385928097, 1.7658908555458428, -0.10601743074722245, 0, -70.35205161461398, -0.231103377548616, -0.7501899197440212, 1.847597816108189, 0, 30.950940869491138, 0, 0, 0, 1, 0 ]); }; _filter.polaroid = function() { _filter.colorMatrix([ 1.438, -0.062, -0.062, 0, 0, -0.122, 1.378, -0.122, 0, 0, -0.016, -0.016, 1.483, 0, 0, 0, 0, 0, 1, 0 ]); }; _filter.shiftToBGR = function() { _filter.colorMatrix([ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 ]); }; _filter.convolution = function(matrix) { const m = new Float32Array(matrix); const pixelSizeX = 1 / _width; const pixelSizeY = 1 / _height; const program = _compileShader(_filter.convolution.SHADER); gl.uniform1fv(program.uniform.m, m); gl.uniform2f(program.uniform.px, pixelSizeX, pixelSizeY); _draw(); }; _filter.convolution.SHADER = [ "precision highp float;", "varying vec2 vUv;", "uniform sampler2D texture;", "uniform vec2 px;", "uniform float m[9];", "void main(void) {", "vec4 c11 = texture2D(texture, vUv - px);", "vec4 c12 = texture2D(texture, vec2(vUv.x, vUv.y - px.y));", "vec4 c13 = texture2D(texture, vec2(vUv.x + px.x, vUv.y - px.y));", "vec4 c21 = texture2D(texture, vec2(vUv.x - px.x, vUv.y) );", "vec4 c22 = texture2D(texture, vUv);", "vec4 c23 = texture2D(texture, vec2(vUv.x + px.x, vUv.y) );", "vec4 c31 = texture2D(texture, vec2(vUv.x - px.x, vUv.y + px.y) );", "vec4 c32 = texture2D(texture, vec2(vUv.x, vUv.y + px.y) );", "vec4 c33 = texture2D(texture, vUv + px );", "gl_FragColor = ", "c11 * m[0] + c12 * m[1] + c22 * m[2] +", "c21 * m[3] + c22 * m[4] + c23 * m[5] +", "c31 * m[6] + c32 * m[7] + c33 * m[8];", "gl_FragColor.a = c22.a;", "}" ].join("\n"); _filter.detectEdges = function() { _filter.convolution.call(this, [ 0, 1, 0, 1, -4, 1, 0, 1, 0 ]); }; _filter.sobelX = function() { _filter.convolution.call(this, [ -1, 0, 1, -2, 0, 2, -1, 0, 1 ]); }; _filter.sobelY = function() { _filter.convolution.call(this, [ -1, -2, -1, 0, 0, 0, 1, 2, 1 ]); }; _filter.sharpen = function(amount) { const a = amount || 1; _filter.convolution.call(this, [ 0, -1 * a, 0, -1 * a, 1 + 4 * a, -1 * a, 0, -1 * a, 0 ]); }; _filter.emboss = function(size) { const s = size || 1; _filter.convolution.call(this, [ -2 * s, -1 * s, 0, -1 * s, 1, 1 * s, 0, 1 * s, 2 * s ]); }; _filter.blur = function(size) { const blurSizeX = size / 7 / _width; const blurSizeY = size / 7 / _height; const program = _compileShader(_filter.blur.SHADER); gl.uniform2f(program.uniform.px, 0, blurSizeY); _draw(DRAW.INTERMEDIATE); gl.uniform2f(program.uniform.px, blurSizeX, 0); _draw(); }; _filter.blur.SHADER = [ "precision highp float;", "varying vec2 vUv;", "uniform sampler2D texture;", "uniform vec2 px;", "void main(void) {", "gl_FragColor = vec4(0.0);", "gl_FragColor += texture2D(texture, vUv + vec2(-7.0*px.x, -7.0*px.y))*0.0044299121055113265;", "gl_FragColor += texture2D(texture, vUv + vec2(-6.0*px.x, -6.0*px.y))*0.00895781211794;", "gl_FragColor += texture2D(texture, vUv + vec2(-5.0*px.x, -5.0*px.y))*0.0215963866053;", "gl_FragColor += texture2D(texture, vUv + vec2(-4.0*px.x, -4.0*px.y))*0.0443683338718;", "gl_FragColor += texture2D(texture, vUv + vec2(-3.0*px.x, -3.0*px.y))*0.0776744219933;", "gl_FragColor += texture2D(texture, vUv + vec2(-2.0*px.x, -2.0*px.y))*0.115876621105;", "gl_FragColor += texture2D(texture, vUv + vec2(-1.0*px.x, -1.0*px.y))*0.147308056121;", "gl_FragColor += texture2D(texture, vUv )*0.159576912161;", "gl_FragColor += texture2D(texture, vUv + vec2( 1.0*px.x, 1.0*px.y))*0.147308056121;", "gl_FragColor += texture2D(texture, vUv + vec2( 2.0*px.x, 2.0*px.y))*0.115876621105;", "gl_FragColor += texture2D(texture, vUv + vec2( 3.0*px.x, 3.0*px.y))*0.0776744219933;", "gl_FragColor += texture2D(texture, vUv + vec2( 4.0*px.x, 4.0*px.y))*0.0443683338718;", "gl_FragColor += texture2D(texture, vUv + vec2( 5.0*px.x, 5.0*px.y))*0.0215963866053;", "gl_FragColor += texture2D(texture, vUv + vec2( 6.0*px.x, 6.0*px.y))*0.00895781211794;", "gl_FragColor += texture2D(texture, vUv + vec2( 7.0*px.x, 7.0*px.y))*0.0044299121055113265;", "}" ].join("\n"); _filter.pixelate = function(size) { const blurSizeX = size / _width; const blurSizeY = size / _height; const program = _compileShader(_filter.pixelate.SHADER); gl.uniform2f(program.uniform.size, blurSizeX, blurSizeY); _draw(); }; _filter.pixelate.SHADER = [ "precision highp float;", "varying vec2 vUv;", "uniform vec2 size;", "uniform sampler2D texture;", "vec2 pixelate(vec2 coord, vec2 size) {", "return floor( coord / size ) * size;", "}", "void main(void) {", "gl_FragColor = vec4(0.0);", "vec2 coord = pixelate(vUv, size);", "gl_FragColor += texture2D(texture, coord);", "}" ].join("\n"); }; exports3.Canvas = WebGLImageFilter; }); // src/image.js var require_image = __commonJS((exports3) => { const fxImage = __toModule(require_imagefx()); let inCanvas = null; let outCanvas = null; function process2(input2, config) { let tensor16; if (input2 instanceof dist_exports2.Tensor) { tensor16 = dist_exports2.clone(input2); } else { const originalWidth = input2.naturalWidth || input2.videoWidth || input2.width || input2.shape && input2.shape[1] > 0; const originalHeight = input2.naturalHeight || input2.videoHeight || input2.height || input2.shape && input2.shape[2] > 0; let targetWidth = originalWidth; let targetHeight = originalHeight; if (config.filter.width > 0) targetWidth = config.filter.width; else if (config.filter.height > 0) targetWidth = originalWidth * (config.filter.height / originalHeight); if (config.filter.height > 0) targetHeight = config.filter.height; else if (config.filter.width > 0) targetHeight = originalHeight * (config.filter.width / originalWidth); if (!inCanvas || inCanvas.width !== targetWidth || inCanvas.height !== targetHeight) { inCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); if (inCanvas.width !== targetWidth) inCanvas.width = targetWidth; if (inCanvas.height !== targetHeight) inCanvas.height = targetHeight; } const ctx = inCanvas.getContext("2d"); if (input2 instanceof ImageData) ctx.putImageData(input2, 0, 0); else ctx.drawImage(input2, 0, 0, originalWidth, originalHeight, 0, 0, inCanvas.width, inCanvas.height); if (config.filter.enabled) { if (!this.fx || !outCanvas || inCanvas.width !== outCanvas.width || inCanvas.height !== outCanvas.height) { outCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(inCanvas.width, inCanvas.height) : document.createElement("canvas"); if (outCanvas.width !== inCanvas.width) outCanvas.width = inCanvas.width; if (outCanvas.height !== inCanvas.height) outCanvas.height = inCanvas.height; this.fx = dist_exports2.ENV.flags.IS_BROWSER ? new fxImage.Canvas({canvas: outCanvas}) : null; } this.fx.reset(); this.fx.addFilter("brightness", config.filter.brightness); if (config.filter.contrast !== 0) this.fx.addFilter("contrast", config.filter.contrast); if (config.filter.sharpness !== 0) this.fx.addFilter("sharpen", config.filter.sharpness); if (config.filter.blur !== 0) this.fx.addFilter("blur", config.filter.blur); if (config.filter.saturation !== 0) this.fx.addFilter("saturation", config.filter.saturation); if (config.filter.hue !== 0) this.fx.addFilter("hue", config.filter.hue); if (config.filter.negative) this.fx.addFilter("negative"); if (config.filter.sepia) this.fx.addFilter("sepia"); if (config.filter.vintage) this.fx.addFilter("brownie"); if (config.filter.sepia) this.fx.addFilter("sepia"); if (config.filter.kodachrome) this.fx.addFilter("kodachrome"); if (config.filter.technicolor) this.fx.addFilter("technicolor"); if (config.filter.polaroid) this.fx.addFilter("polaroid"); if (config.filter.pixelate !== 0) this.fx.addFilter("pixelate", config.filter.pixelate); this.fx.apply(inCanvas); const gl = false; if (gl) { const glBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 4); const pixBuffer = new Uint8Array(outCanvas.width * outCanvas.height * 3); gl.readPixels(0, 0, outCanvas.width, outCanvas.height, gl.RGBA, gl.UNSIGNED_BYTE, glBuffer); let i = 0; for (let y = outCanvas.height - 1; y >= 0; y--) { for (let x = 0; x < outCanvas.width; x++) { const index = (x + y * outCanvas.width) * 4; pixBuffer[i++] = glBuffer[index + 0]; pixBuffer[i++] = glBuffer[index + 1]; pixBuffer[i++] = glBuffer[index + 2]; } } outCanvas.data = pixBuffer; } } else { outCanvas = inCanvas; } let pixels; if (outCanvas.data) { const shape = [outCanvas.height, outCanvas.width, 3]; pixels = dist_exports2.tensor3d(outCanvas.data, shape, "int32"); } else if (config.backend === "webgl" || outCanvas instanceof ImageData) { pixels = dist_exports2.browser.fromPixels(outCanvas); } else { const tempCanvas = typeof OffscreenCanvas !== "undefined" ? new OffscreenCanvas(targetWidth, targetHeight) : document.createElement("canvas"); tempCanvas.width = targetWidth; tempCanvas.height = targetHeight; const tempCtx = tempCanvas.getContext("2d"); tempCtx.drawImage(outCanvas, 0, 0); const data = tempCtx.getImageData(0, 0, targetWidth, targetHeight); pixels = dist_exports2.browser.fromPixels(data); } const casted = pixels.toFloat(); tensor16 = casted.expandDims(0); pixels.dispose(); casted.dispose(); } return {tensor: tensor16, canvas: config.filter.return ? outCanvas : null}; } exports3.process = process2; }); // src/human.js var require_human = __commonJS((exports3) => { __export(exports3, { default: () => Human }); const facemesh = __toModule(require_facemesh()); const age = __toModule(require_age()); const gender = __toModule(require_gender()); const emotion = __toModule(require_emotion()); const posenet = __toModule(require_posenet()); const handpose = __toModule(require_handpose()); const gesture = __toModule(require_gesture()); const image3 = __toModule(require_image()); const profile2 = __toModule(require_profile()); const disableSkipFrames = { face: {detector: {skipFrames: 0}, age: {skipFrames: 0}, gender: {skipFrames: 0}, emotion: {skipFrames: 0}}, hand: {skipFrames: 0} }; const now2 = () => { if (typeof performance !== "undefined") return performance.now(); return parseInt(Number(process.hrtime.bigint()) / 1e3 / 1e3); }; function mergeDeep(...objects) { const isObject = (obj) => obj && typeof obj === "object"; return objects.reduce((prev, obj) => { Object.keys(obj || {}).forEach((key) => { const pVal = prev[key]; const oVal = obj[key]; if (Array.isArray(pVal) && Array.isArray(oVal)) { prev[key] = pVal.concat(...oVal); } else if (isObject(pVal) && isObject(oVal)) { prev[key] = mergeDeep(pVal, oVal); } else { prev[key] = oVal; } }); return prev; }, {}); } class Human { constructor(userConfig = {}) { this.tf = dist_exports2; this.version = version17; this.config = mergeDeep(config_default, userConfig); this.fx = null; this.state = "idle"; this.numTensors = 0; this.analyzeMemoryLeaks = false; this.checkSanity = false; this.firstRun = true; this.perf = {}; this.models = { facemesh: null, posenet: null, handpose: null, iris: null, age: null, gender: null, emotion: null }; this.facemesh = facemesh; this.age = age; this.gender = gender; this.emotion = emotion; this.body = posenet; this.hand = handpose; } log(...msg) { if (msg && this.config.console) console.log("Human:", ...msg); } profile() { if (this.config.profile) return profile2.data; return {}; } analyze(...msg) { if (!this.analyzeMemoryLeaks) return; const current = dist_exports2.engine().state.numTensors; const previous = this.numTensors; this.numTensors = current; const leaked = current - previous; if (leaked !== 0) this.log(...msg, leaked); } sanity(input2) { if (!this.checkSanity) return null; if (!input2) return "input is not defined"; if (dist_exports2.ENV.flags.IS_NODE && !(input2 instanceof dist_exports2.Tensor)) { return "input must be a tensor"; } try { dist_exports2.getBackend(); } catch (e) { return "backend not loaded"; } return null; } async load(userConfig) { this.state = "load"; const timeStamp = now2(); if (userConfig) this.config = mergeDeep(this.config, userConfig); if (this.firstRun) { this.checkBackend(true); this.log(`version: ${this.version} TensorFlow/JS version: ${dist_exports2.version_core}`); this.log("configuration:", this.config); this.log("flags:", dist_exports2.ENV.flags); this.firstRun = false; } if (this.config.async) { [ this.models.facemesh, this.models.age, this.models.gender, this.models.emotion, this.models.posenet, this.models.handpose ] = await Promise.all([ this.models.facemesh || (this.config.face.enabled ? facemesh.load(this.config.face) : null), this.models.age || (this.config.face.enabled && this.config.face.age.enabled ? age.load(this.config) : null), this.models.gender || (this.config.face.enabled && this.config.face.gender.enabled ? gender.load(this.config) : null), this.models.emotion || (this.config.face.enabled && this.config.face.emotion.enabled ? emotion.load(this.config) : null), this.models.posenet || (this.config.body.enabled ? posenet.load(this.config) : null), this.models.handpose || (this.config.hand.enabled ? handpose.load(this.config.hand) : null) ]); } else { if (this.config.face.enabled && !this.models.facemesh) this.models.facemesh = await facemesh.load(this.config.face); if (this.config.face.enabled && this.config.face.age.enabled && !this.models.age) this.models.age = await age.load(this.config); if (this.config.face.enabled && this.config.face.gender.enabled && !this.models.gender) this.models.gender = await gender.load(this.config); if (this.config.face.enabled && this.config.face.emotion.enabled && !this.models.emotion) this.models.emotion = await emotion.load(this.config); if (this.config.body.enabled && !this.models.posenet) this.models.posenet = await posenet.load(this.config); if (this.config.hand.enabled && !this.models.handpose) this.models.handpose = await handpose.load(this.config.hand); } const current = Math.trunc(now2() - timeStamp); if (current > (this.perf.load || 0)) this.perf.load = current; } async checkBackend(force) { const timeStamp = now2(); if (this.config.backend && this.config.backend !== "" && force || dist_exports2.getBackend() !== this.config.backend) { this.state = "backend"; this.log("setting backend:", this.config.backend); if (this.config.backend === "wasm") { this.log("settings wasm path:", this.config.wasmPath); setWasmPaths(this.config.wasmPath); const simd = await dist_exports2.env().getAsync("WASM_HAS_SIMD_SUPPORT"); if (!simd) this.log("warning: wasm simd support is not enabled"); } await dist_exports2.setBackend(this.config.backend); dist_exports2.enableProdMode(); if (this.config.backend === "webgl") { if (this.config.deallocate) { this.log("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:", this.config.deallocate); dist_exports2.ENV.set("WEBGL_DELETE_TEXTURE_THRESHOLD", this.config.deallocate ? 0 : -1); } dist_exports2.ENV.set("WEBGL_PACK_DEPTHWISECONV", true); } await dist_exports2.ready(); } const current = Math.trunc(now2() - timeStamp); if (current > (this.perf.backend || 0)) this.perf.backend = current; } async detectFace(input2) { let timeStamp; let ageRes; let genderRes; let emotionRes; const faceRes = []; this.state = "run:face"; timeStamp = now2(); const faces = await this.models.facemesh.estimateFaces(input2, this.config.face); this.perf.face = Math.trunc(now2() - timeStamp); for (const face2 of faces) { this.analyze("Get Face"); if (!face2.image || face2.image.isDisposedInternal) { this.log("Face object is disposed:", face2.image); continue; } this.analyze("Start Age:"); if (this.config.async) { ageRes = this.config.face.age.enabled ? age.predict(face2.image, this.config) : {}; } else { this.state = "run:age"; timeStamp = now2(); ageRes = this.config.face.age.enabled ? await age.predict(face2.image, this.config) : {}; this.perf.age = Math.trunc(now2() - timeStamp); } this.analyze("Start Gender:"); if (this.config.async) { genderRes = this.config.face.gender.enabled ? gender.predict(face2.image, this.config) : {}; } else { this.state = "run:gender"; timeStamp = now2(); genderRes = this.config.face.gender.enabled ? await gender.predict(face2.image, this.config) : {}; this.perf.gender = Math.trunc(now2() - timeStamp); } this.analyze("Start Emotion:"); if (this.config.async) { emotionRes = this.config.face.emotion.enabled ? emotion.predict(face2.image, this.config) : {}; } else { this.state = "run:emotion"; timeStamp = now2(); emotionRes = this.config.face.emotion.enabled ? await emotion.predict(face2.image, this.config) : {}; this.perf.emotion = Math.trunc(now2() - timeStamp); } this.analyze("End Emotion:"); if (this.config.async) { [ageRes, genderRes, emotionRes] = await Promise.all([ageRes, genderRes, emotionRes]); } this.analyze("Finish Face:"); face2.image.dispose(); const irisSize = face2.annotations.leftEyeIris && face2.annotations.rightEyeIris ? 11.7 * Math.max(Math.abs(face2.annotations.leftEyeIris[3][0] - face2.annotations.leftEyeIris[1][0]), Math.abs(face2.annotations.rightEyeIris[4][1] - face2.annotations.rightEyeIris[2][1])) : 0; faceRes.push({ confidence: face2.confidence, box: face2.box, mesh: face2.mesh, annotations: face2.annotations, age: ageRes.age, gender: genderRes.gender, genderConfidence: genderRes.confidence, emotion: emotionRes, iris: irisSize !== 0 ? Math.trunc(irisSize) / 100 : 0 }); this.analyze("End Face"); } this.analyze("End FaceMesh:"); if (this.config.async) { if (this.perf.face) delete this.perf.face; if (this.perf.age) delete this.perf.age; if (this.perf.gender) delete this.perf.gender; if (this.perf.emotion) delete this.perf.emotion; } return faceRes; } async image(input2, userConfig = {}) { this.state = "image"; this.config = mergeDeep(this.config, userConfig); const process3 = image3.process(input2, this.config); process3.tensor.dispose(); return process3.canvas; } async detect(input2, userConfig = {}) { this.state = "config"; let timeStamp; this.config = mergeDeep(this.config, userConfig); if (!this.config.videoOptimized) this.config = mergeDeep(this.config, disableSkipFrames); this.state = "check"; const error = this.sanity(input2); if (error) { this.log(error, input2); return {error}; } return new Promise(async (resolve) => { let poseRes; let handRes; let faceRes; const timeStart = now2(); await this.checkBackend(); await this.load(); if (this.config.scoped) dist_exports2.engine().startScope(); this.analyze("Start Scope:"); timeStamp = now2(); const process3 = image3.process(input2, this.config); this.perf.image = Math.trunc(now2() - timeStamp); this.analyze("Get Image:"); if (this.config.async) { faceRes = this.config.face.enabled ? this.detectFace(process3.tensor) : []; if (this.perf.face) delete this.perf.face; } else { this.state = "run:face"; timeStamp = now2(); faceRes = this.config.face.enabled ? await this.detectFace(process3.tensor) : []; this.perf.face = Math.trunc(now2() - timeStamp); } this.analyze("Start Body:"); if (this.config.async) { poseRes = this.config.body.enabled ? this.models.posenet.estimatePoses(process3.tensor, this.config) : []; if (this.perf.body) delete this.perf.body; } else { this.state = "run:body"; timeStamp = now2(); poseRes = this.config.body.enabled ? await this.models.posenet.estimatePoses(process3.tensor, this.config) : []; this.perf.body = Math.trunc(now2() - timeStamp); } this.analyze("End Body:"); this.analyze("Start Hand:"); if (this.config.async) { handRes = this.config.hand.enabled ? this.models.handpose.estimateHands(process3.tensor, this.config.hand) : []; if (this.perf.hand) delete this.perf.hand; } else { this.state = "run:hand"; timeStamp = now2(); handRes = this.config.hand.enabled ? await this.models.handpose.estimateHands(process3.tensor, this.config.hand) : []; this.perf.hand = Math.trunc(now2() - timeStamp); } if (this.config.async) { [faceRes, poseRes, handRes] = await Promise.all([faceRes, poseRes, handRes]); } process3.tensor.dispose(); if (this.config.scoped) dist_exports2.engine().endScope(); this.analyze("End Scope:"); let gestureRes = []; if (this.config.gesture.enabled) { timeStamp = now2(); gestureRes = {face: gesture.face(faceRes), body: gesture.body(poseRes), hand: gesture.hand(handRes)}; if (!this.config.async) this.perf.gesture = Math.trunc(now2() - timeStamp); else if (this.perf.gesture) delete this.perf.gesture; } this.perf.total = Math.trunc(now2() - timeStart); this.state = "idle"; resolve({face: faceRes, body: poseRes, hand: handRes, gesture: gestureRes, performance: this.perf, canvas: process3.canvas}); }); } async warmup(userConfig) { const warmup = new ImageData(255, 255); await this.detect(warmup, userConfig); this.log("warmed up"); } } }); // node_modules/@tensorflow/tfjs/dist/index.js const dist_exports2 = {}; __export(dist_exports2, { Abs: () => Abs, Acos: () => Acos, Acosh: () => Acosh, AdadeltaOptimizer: () => AdadeltaOptimizer, AdagradOptimizer: () => AdagradOptimizer, AdamOptimizer: () => AdamOptimizer, AdamaxOptimizer: () => AdamaxOptimizer, Add: () => Add, AddN: () => AddN, All: () => All, Any: () => Any, ArgMax: () => ArgMax, ArgMin: () => ArgMin, Asin: () => Asin, Asinh: () => Asinh, Atan: () => Atan, Atan2: () => Atan2, Atanh: () => Atanh, AvgPool: () => AvgPool, AvgPool3D: () => AvgPool3D, AvgPool3DBackprop: () => AvgPool3DBackprop, AvgPoolBackprop: () => AvgPoolBackprop, BatchMatMul: () => BatchMatMul, BatchToSpaceND: () => BatchToSpaceND, BroadcastTo: () => BroadcastTo, Callback: () => Callback, CallbackList: () => CallbackList, Cast: () => Cast, Ceil: () => Ceil, ClipByValue: () => ClipByValue, Complex: () => Complex, Concat: () => Concat, Conv2D: () => Conv2D, Conv2DBackpropFilter: () => Conv2DBackpropFilter, Conv2DBackpropInput: () => Conv2DBackpropInput, Conv3D: () => Conv3D, Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, Cos: () => Cos, Cosh: () => Cosh, CropAndResize: () => CropAndResize, Cumsum: () => Cumsum, CustomCallback: () => CustomCallback, DataStorage: () => DataStorage, DepthToSpace: () => DepthToSpace, DepthwiseConv2dNative: () => DepthwiseConv2dNative, DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, Diag: () => Diag, Dilation2D: () => Dilation2D, Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, Dilation2DBackpropInput: () => Dilation2DBackpropInput, Div: () => Div, ENV: () => ENV, EarlyStopping: () => EarlyStopping, Elu: () => Elu, EluGrad: () => EluGrad, Environment: () => Environment, Equal: () => Equal, Erf: () => Erf, Exp: () => Exp, Expm1: () => Expm1, FFT: () => FFT, Fill: () => Fill, FlipLeftRight: () => FlipLeftRight, Floor: () => Floor, FloorDiv: () => FloorDiv, FromPixels: () => FromPixels, FusedBatchNorm: () => FusedBatchNorm, FusedConv2D: () => FusedConv2D, FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, GatherNd: () => GatherNd, GatherV2: () => GatherV2, GraphModel: () => GraphModel, Greater: () => Greater, GreaterEqual: () => GreaterEqual, History: () => History, IFFT: () => IFFT, Identity: () => Identity, Imag: () => Imag, InputSpec: () => InputSpec, IsFinite: () => IsFinite, IsInf: () => IsInf, IsNan: () => IsNan, KernelBackend: () => KernelBackend, LRN: () => LRN, LRNBackprop: () => LRNBackprop, LayerVariable: () => LayerVariable, LayersModel: () => LayersModel, Less: () => Less, LessEqual: () => LessEqual, LinSpace: () => LinSpace, Log: () => Log, Log1p: () => Log1p, LogSoftmax: () => LogSoftmax, LogicalAnd: () => LogicalAnd, LogicalNot: () => LogicalNot, LogicalOr: () => LogicalOr, Max: () => Max, MaxPool: () => MaxPool, MaxPool3D: () => MaxPool3D, MaxPool3DBackprop: () => MaxPool3DBackprop, MaxPoolBackprop: () => MaxPoolBackprop, MaxPoolWithArgmax: () => MaxPoolWithArgmax, Maximum: () => Maximum, Mean: () => Mean, Min: () => Min, Minimum: () => Minimum, MirrorPad: () => MirrorPad, Mod: () => Mod, MomentumOptimizer: () => MomentumOptimizer, Multiply: () => Multiply, Negate: () => Negate, NonMaxSuppressionV3: () => NonMaxSuppressionV3, NonMaxSuppressionV4: () => NonMaxSuppressionV4, NonMaxSuppressionV5: () => NonMaxSuppressionV5, NotEqual: () => NotEqual, OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, OneHot: () => OneHot, OnesLike: () => OnesLike, Optimizer: () => Optimizer, PadV2: () => PadV2, Pool: () => Pool, Pow: () => Pow, Prelu: () => Prelu, Prod: () => Prod, RMSPropOptimizer: () => RMSPropOptimizer, RNN: () => RNN, Range: () => Range, Rank: () => Rank, Real: () => Real, Reciprocal: () => Reciprocal, Reduction: () => Reduction, Relu: () => Relu, Relu6: () => Relu6, Reshape: () => Reshape, ResizeBilinear: () => ResizeBilinear, ResizeBilinearGrad: () => ResizeBilinearGrad, ResizeNearestNeighbor: () => ResizeNearestNeighbor, ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, Reverse: () => Reverse, RotateWithOffset: () => RotateWithOffset, Round: () => Round, Rsqrt: () => Rsqrt, SGDOptimizer: () => SGDOptimizer, ScatterNd: () => ScatterNd, SelectV2: () => SelectV2, Selu: () => Selu, Sequential: () => Sequential, Sigmoid: () => Sigmoid, Sign: () => Sign, Sin: () => Sin, Sinh: () => Sinh, Slice: () => Slice, Softmax: () => Softmax, Softplus: () => Softplus, SpaceToBatchND: () => SpaceToBatchND, SparseToDense: () => SparseToDense, SplitV: () => SplitV, Sqrt: () => Sqrt, Square: () => Square, SquaredDifference: () => SquaredDifference, Step: () => Step, StridedSlice: () => StridedSlice, Sub: () => Sub, Sum: () => Sum, SymbolicTensor: () => SymbolicTensor, Tan: () => Tan, Tanh: () => Tanh, Tensor: () => Tensor, TensorBuffer: () => TensorBuffer, Tile: () => Tile, TopK: () => TopK, Transpose: () => Transpose, Unique: () => Unique, Unpack: () => Unpack, UnsortedSegmentSum: () => UnsortedSegmentSum, Variable: () => Variable, ZerosLike: () => ZerosLike, _FusedMatMul: () => _FusedMatMul, abs: () => abs, acos: () => acos, acosh: () => acosh, add: () => add2, addN: () => addN, addStrict: () => addStrict, all: () => all, any: () => any, argMax: () => argMax, argMin: () => argMin, asin: () => asin, asinh: () => asinh, atan: () => atan, atan2: () => atan2, atanh: () => atanh, avgPool: () => avgPool, avgPool3d: () => avgPool3d, backend: () => backend2, backend_util: () => backend_util_exports, basicLSTMCell: () => basicLSTMCell, batchNorm: () => batchNorm, batchNorm2d: () => batchNorm2d, batchNorm3d: () => batchNorm3d, batchNorm4d: () => batchNorm4d, batchToSpaceND: () => batchToSpaceND, booleanMaskAsync: () => booleanMaskAsync, broadcastTo: () => broadcastTo, browser: () => browser_exports, buffer: () => buffer, callbacks: () => callbacks, cast: () => cast, ceil: () => ceil, clipByValue: () => clipByValue, clone: () => clone, complex: () => complex, concat: () => concat, concat1d: () => concat1d, concat2d: () => concat2d, concat3d: () => concat3d, concat4d: () => concat4d, constraints: () => exports_constraints_exports, conv1d: () => conv1d, conv2d: () => conv2d, conv2dTranspose: () => conv2dTranspose, conv3d: () => conv3d, conv3dTranspose: () => conv3dTranspose, copyRegisteredKernels: () => copyRegisteredKernels, cos: () => cos, cosh: () => cosh, cosineWindow: () => cosineWindow, cumsum: () => cumsum, customGrad: () => customGrad, data: () => dist_exports, deprecationWarn: () => deprecationWarn, depthToSpace: () => depthToSpace, depthwiseConv2d: () => depthwiseConv2d, deregisterOp: () => deregisterOp, device_util: () => device_util_exports, diag: () => diag, dilation2d: () => dilation2d, disableDeprecationWarnings: () => disableDeprecationWarnings, dispose: () => dispose, disposeVariables: () => disposeVariables, div: () => div, divNoNan: () => divNoNan, divStrict: () => divStrict, dot: () => dot, dropout: () => dropout, elu: () => elu, enableDebugMode: () => enableDebugMode, enableProdMode: () => enableProdMode, enclosingPowerOfTwo: () => enclosingPowerOfTwo, engine: () => engine14, env: () => env, equal: () => equal, equalStrict: () => equalStrict, erf: () => erf, exp: () => exp, expandDims: () => expandDims, expm1: () => expm1, eye: () => eye, fft: () => fft, fill: () => fill, findBackend: () => findBackend, findBackendFactory: () => findBackendFactory, floor: () => floor, floorDiv: () => floorDiv, fused: () => fused_ops_exports, gather: () => gather, gatherND: () => gatherND, gather_util: () => gather_nd_util_exports, getBackend: () => getBackend, getGradient: () => getGradient, getKernel: () => getKernel, getKernelsForBackend: () => getKernelsForBackend, grad: () => grad, grads: () => grads, greater: () => greater, greaterEqual: () => greaterEqual, greaterEqualStrict: () => greaterEqualStrict, greaterStrict: () => greaterStrict, ifft: () => ifft, imag: () => imag, image: () => image, inTopKAsync: () => inTopKAsync, initializers: () => exports_initializers_exports, input: () => input, io: () => io_exports, irfft: () => irfft, isFinite: () => isFinite2, isInf: () => isInf, isNaN: () => isNaN2, keep: () => keep, kernel_impls: () => kernel_impls_exports, layers: () => exports_layers_exports, leakyRelu: () => leakyRelu, less: () => less, lessEqual: () => lessEqual, lessEqualStrict: () => lessEqualStrict, lessStrict: () => lessStrict, linalg: () => linalg, linspace: () => linspace, loadGraphModel: () => loadGraphModel, loadLayersModel: () => loadLayersModel, localResponseNormalization: () => localResponseNormalization, log: () => log, log1p: () => log1p, logSigmoid: () => logSigmoid, logSoftmax: () => logSoftmax, logSumExp: () => logSumExp, logicalAnd: () => logicalAnd, logicalNot: () => logicalNot, logicalOr: () => logicalOr, logicalXor: () => logicalXor, losses: () => losses, matMul: () => matMul, math: () => math_exports, max: () => max, maxPool: () => maxPool, maxPool3d: () => maxPool3d, maxPoolWithArgmax: () => maxPoolWithArgmax, maximum: () => maximum, maximumStrict: () => maximumStrict, mean: () => mean, memory: () => memory, metrics: () => exports_metrics_exports, min: () => min, minimum: () => minimum, minimumStrict: () => minimumStrict, mirrorPad: () => mirrorPad, mod: () => mod, modStrict: () => modStrict, model: () => model, models: () => exports_models_exports, moments: () => moments, movingAverage: () => movingAverage, mul: () => mul, mulStrict: () => mulStrict, multiRNNCell: () => multiRNNCell, multinomial: () => multinomial, neg: () => neg, nextFrame: () => nextFrame, norm: () => norm, notEqual: () => notEqual, notEqualStrict: () => notEqualStrict, oneHot: () => oneHot, ones: () => ones2, onesLike: () => onesLike, op: () => op, outerProduct: () => outerProduct, pad: () => pad, pad1d: () => pad1d, pad2d: () => pad2d, pad3d: () => pad3d, pad4d: () => pad4d, pool: () => pool, pow: () => pow, powStrict: () => powStrict, prelu: () => prelu, print: () => print2, prod: () => prod, profile: () => profile, rand: () => rand, randomGamma: () => randomGamma, randomNormal: () => randomNormal, randomUniform: () => randomUniform, range: () => range, ready: () => ready, real: () => real, reciprocal: () => reciprocal, registerBackend: () => registerBackend, registerCallbackConstructor: () => registerCallbackConstructor, registerGradient: () => registerGradient, registerKernel: () => registerKernel, registerOp: () => registerOp, regularizers: () => exports_regularizers_exports, relu: () => relu, relu6: () => relu6, removeBackend: () => removeBackend, reshape: () => reshape, reverse: () => reverse, reverse1d: () => reverse1d, reverse2d: () => reverse2d, reverse3d: () => reverse3d, reverse4d: () => reverse4d, rfft: () => rfft, round: () => round, rsqrt: () => rsqrt, scalar: () => scalar, scatterND: () => scatterND, scatter_util: () => scatter_nd_util_exports, selu: () => selu, separableConv2d: () => separableConv2d, sequential: () => sequential, serialization: () => serialization_exports, setBackend: () => setBackend, setPlatform: () => setPlatform, setdiff1dAsync: () => setdiff1dAsync, sigmoid: () => sigmoid, sign: () => sign, signal: () => signal, sin: () => sin, sinh: () => sinh, slice: () => slice, slice1d: () => slice1d, slice2d: () => slice2d, slice3d: () => slice3d, slice4d: () => slice4d, slice_util: () => slice_util_exports, softmax: () => softmax, softplus: () => softplus, spaceToBatchND: () => spaceToBatchND, sparseToDense: () => sparseToDense, spectral: () => spectral, split: () => split, sqrt: () => sqrt, square: () => square, squaredDifference: () => squaredDifference, squaredDifferenceStrict: () => squaredDifferenceStrict, squeeze: () => squeeze, stack: () => stack, step: () => step, stridedSlice: () => stridedSlice, sub: () => sub, subStrict: () => subStrict, sum: () => sum2, sumOutType: () => sumOutType, tan: () => tan, tanh: () => tanh2, tensor: () => tensor4, tensor1d: () => tensor1d, tensor2d: () => tensor2d, tensor3d: () => tensor3d, tensor4d: () => tensor4d, tensor5d: () => tensor5d, tensor6d: () => tensor6d, tensor_util: () => tensor_util_exports, test_util: () => test_util_exports, tidy: () => tidy, tile: () => tile, time: () => time, topk: () => topk, train: () => train, transpose: () => transpose, truncatedNormal: () => truncatedNormal, unique: () => unique, unregisterGradient: () => unregisterGradient, unregisterKernel: () => unregisterKernel, unsortedSegmentSum: () => unsortedSegmentSum, unstack: () => unstack, upcastType: () => upcastType, util: () => util_exports, valueAndGrad: () => valueAndGrad, valueAndGrads: () => valueAndGrads, variable: () => variable, variableGrads: () => variableGrads, version: () => version14, version_converter: () => version6, version_core: () => version, version_layers: () => version2, where: () => where, whereAsync: () => whereAsync, zeros: () => zeros, zerosLike: () => zerosLike }); // node_modules/@tensorflow/tfjs-core/dist/backends/backend.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const EPSILON_FLOAT32 = 1e-7; const EPSILON_FLOAT16 = 1e-4; class DataStorage { constructor(backend3, dataMover) { this.backend = backend3; this.dataMover = dataMover; this.data = new WeakMap(); this.dataIdsCount = 0; } get(dataId) { if (!this.data.has(dataId)) { this.dataMover.moveData(this.backend, dataId); } return this.data.get(dataId); } set(dataId, value) { this.dataIdsCount++; this.data.set(dataId, value); } has(dataId) { return this.data.has(dataId); } delete(dataId) { this.dataIdsCount--; return this.data.delete(dataId); } numDataIds() { return this.dataIdsCount; } } class KernelBackend { time(f) { return notYetImplemented("time"); } read(dataId) { return notYetImplemented("read"); } readSync(dataId) { return notYetImplemented("readSync"); } numDataIds() { return notYetImplemented("numDataIds"); } disposeData(dataId) { return notYetImplemented("disposeData"); } write(values, shape, dtype) { return notYetImplemented("write"); } move(dataId, values, shape, dtype) { return notYetImplemented("move"); } memory() { return notYetImplemented("memory"); } floatPrecision() { return notYetImplemented("floatPrecision"); } epsilon() { return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; } batchMatMul(a, b, transposeA, transposeB) { return notYetImplemented("batchMatMul"); } fusedBatchMatMul({a, b, transposeA, transposeB, bias, activation: activation2, preluActivationWeights}) { return notYetImplemented("fusedBatchMatMul"); } slice(x, begin, size) { return notYetImplemented("slice"); } stridedSlice(x, begin, end, strides) { return notYetImplemented("stridedSlice"); } unstack(x, axis) { return notYetImplemented("unstack"); } reverse(a, axis) { return notYetImplemented("reverse"); } concat(tensors, axis) { return notYetImplemented("concat"); } neg(a) { return notYetImplemented("neg"); } add(a, b) { return notYetImplemented("add"); } addN(tensors) { return notYetImplemented("addN"); } subtract(a, b) { return notYetImplemented("subtract"); } multiply(a, b) { return notYetImplemented("multiply"); } realDivide(a, b) { return notYetImplemented("realDivide"); } floorDiv(a, b) { return notYetImplemented("floorDiv"); } sum(x, axes) { return notYetImplemented("sum"); } prod(x, axes) { return notYetImplemented("prod"); } unsortedSegmentSum(x, segmentIds, numSegments) { return notYetImplemented("unsortedSegmentSum"); } argMin(x, axis) { return notYetImplemented("argMin"); } argMax(x, axis) { return notYetImplemented("argMax"); } equal(a, b) { return notYetImplemented("equal"); } notEqual(a, b) { return notYetImplemented("notEqual"); } less(a, b) { return notYetImplemented("less"); } lessEqual(a, b) { return notYetImplemented("lessEqual"); } greater(a, b) { return notYetImplemented("greater"); } greaterEqual(a, b) { return notYetImplemented("greaterEqual"); } logicalNot(a) { return notYetImplemented("logicalNot"); } logicalAnd(a, b) { return notYetImplemented("logicalAnd"); } logicalOr(a, b) { return notYetImplemented("logicalOr"); } where(condition) { return notYetImplemented("where"); } select(condition, a, b) { return notYetImplemented("select"); } topk(x, k, sorted) { return notYetImplemented("topk"); } min(x, axes) { return notYetImplemented("min"); } minimum(a, b) { return notYetImplemented("minimum"); } mod(a, b) { return notYetImplemented("mod"); } max(x, axes) { return notYetImplemented("max"); } maximum(a, b) { return notYetImplemented("maximum"); } all(x, axes) { return notYetImplemented("all"); } any(x, axes) { return notYetImplemented("any"); } squaredDifference(a, b) { return notYetImplemented("squaredDifference"); } ceil(x) { return notYetImplemented("ceil"); } floor(x) { return notYetImplemented("floor"); } round(x) { return notYetImplemented("round"); } sign(x) { return notYetImplemented("sign"); } isNaN(x) { return notYetImplemented("isNaN"); } isInf(x) { return notYetImplemented("isInf"); } isFinite(x) { return notYetImplemented("isFinite"); } pow(a, b) { return notYetImplemented("pow"); } exp(x) { return notYetImplemented("exp"); } expm1(x) { return notYetImplemented("expm1"); } softmax(x, dim) { return notYetImplemented("softmax"); } log(x) { return notYetImplemented("log"); } log1p(x) { return notYetImplemented("log1p"); } sqrt(x) { return notYetImplemented("sqrt"); } rsqrt(x) { return notYetImplemented("rsqrt"); } square(x) { return notYetImplemented("square"); } reciprocal(x) { return notYetImplemented("reciprocal"); } relu(x) { return notYetImplemented("relu"); } relu6(x) { return notYetImplemented("relu6"); } prelu(x, a) { return notYetImplemented("prelu"); } elu(x) { return notYetImplemented("elu"); } eluDer(dy, y) { return notYetImplemented("eluDer"); } selu(x) { return notYetImplemented("selu"); } int(x) { return notYetImplemented("int"); } clip(x, min6, max8) { return notYetImplemented("clip"); } abs(x) { return notYetImplemented("abs"); } complexAbs(x) { return notYetImplemented("complexAbs"); } sigmoid(x) { return notYetImplemented("sigmoid"); } softplus(x) { return notYetImplemented("softplus"); } sin(x) { return notYetImplemented("sin"); } cos(x) { return notYetImplemented("cos"); } tan(x) { return notYetImplemented("tan"); } asin(x) { return notYetImplemented("asin"); } acos(x) { return notYetImplemented("acos"); } atan(x) { return notYetImplemented("atan"); } atan2(a, b) { return notYetImplemented("atan2"); } sinh(x) { return notYetImplemented("sinh"); } cosh(x) { return notYetImplemented("cosh"); } tanh(x) { return notYetImplemented("tanh"); } asinh(x) { return notYetImplemented("asinh"); } acosh(x) { return notYetImplemented("acosh"); } atanh(x) { return notYetImplemented("atanh"); } erf(x) { return notYetImplemented("erf"); } step(x, alpha) { return notYetImplemented("step"); } fusedConv2d({input: input2, filter, convInfo, bias, activation: activation2, preluActivationWeights}) { return notYetImplemented("fusedConv2d"); } conv2d(x, filter, convInfo) { return notYetImplemented("conv2d"); } conv2dDerInput(dy, filter, convInfo) { return notYetImplemented("conv2dDerInput"); } conv2dDerFilter(x, dY, convInfo) { return notYetImplemented("conv2dDerFilter"); } fusedDepthwiseConv2D({input: input2, filter, convInfo, bias, activation: activation2, preluActivationWeights}) { return notYetImplemented("fusedDepthwiseConv2D"); } depthwiseConv2D(input2, filter, convInfo) { return notYetImplemented("depthwiseConv2D"); } depthwiseConv2DDerInput(dy, filter, convInfo) { return notYetImplemented("depthwiseConv2DDerInput"); } depthwiseConv2DDerFilter(x, dY, convInfo) { return notYetImplemented("depthwiseConv2DDerFilter"); } conv3d(x, filter, convInfo) { return notYetImplemented("conv3d"); } conv3dDerInput(dy, filter, convInfo) { return notYetImplemented("conv3dDerInput"); } conv3dDerFilter(x, dY, convInfo) { return notYetImplemented("conv3dDerFilter"); } maxPool(x, convInfo) { return notYetImplemented("maxPool"); } maxPoolBackprop(dy, x, y, convInfo) { return notYetImplemented("maxPoolBackprop"); } avgPool(x, convInfo) { return notYetImplemented("avgPool"); } avgPoolBackprop(dy, x, convInfo) { return notYetImplemented("avgPoolBackprop"); } avgPool3d(x, convInfo) { return notYetImplemented("avgPool3d"); } avgPool3dBackprop(dy, x, convInfo) { return notYetImplemented("avgPool3dBackprop"); } maxPool3d(x, convInfo) { return notYetImplemented("maxPool3d"); } maxPool3dBackprop(dy, x, y, convInfo) { return notYetImplemented("maxPool3dBackprop"); } reshape(x, shape) { return notYetImplemented("reshape"); } cast(x, dtype) { return notYetImplemented("cast"); } tile(x, reps) { return notYetImplemented("tile"); } pad(x, paddings, constantValue) { return notYetImplemented("pad"); } transpose(x, perm) { return notYetImplemented("transpose"); } gather(x, indices, axis) { return notYetImplemented("gather"); } gatherND(x, indices) { return notYetImplemented("gatherND"); } scatterND(indices, updates, shape) { return notYetImplemented("scatterND"); } batchToSpaceND(x, blockShape, crops) { return notYetImplemented("batchToSpaceND"); } spaceToBatchND(x, blockShape, paddings) { return notYetImplemented("spaceToBatchND"); } resizeBilinear(x, newHeight, newWidth, alignCorners) { return notYetImplemented("resizeBilinear"); } resizeBilinearBackprop(dy, x, alignCorners) { return notYetImplemented("resizeBilinearBackprop"); } resizeNearestNeighbor(x, newHEight, newWidth, alignCorners) { return notYetImplemented("resizeNearestNeighbor"); } resizeNearestNeighborBackprop(dy, x, alignCorners) { return notYetImplemented("resizeNearestNeighborBackprop"); } batchNorm(x, mean5, variance, offset, scale, varianceEpsilon) { return notYetImplemented("batchNorm"); } localResponseNormalization4D(x, radius, bias, alpha, beta) { return notYetImplemented("localResponseNormalization4D"); } LRNGrad(dy, inputImage, outputImage, radius, bias, alpha, beta) { return notYetImplemented("LRNGrad"); } multinomial(logits, normalized, numSamples, seed) { return notYetImplemented("multinomial"); } oneHot(indices, depth, onValue, offValue) { return notYetImplemented("oneHot"); } cumsum(x, axis, exclusive, reverse9) { return notYetImplemented("cumsum"); } nonMaxSuppression(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { return notYetImplemented("nonMaxSuppression"); } fft(x) { return notYetImplemented("fft"); } ifft(x) { return notYetImplemented("ifft"); } complex(real6, imag6) { return notYetImplemented("complex"); } real(input2) { return notYetImplemented("real"); } imag(input2) { return notYetImplemented("imag"); } cropAndResize(image3, boxes, boxIndex, cropSize, method, extrapolationValue) { return notYetImplemented("cropAndResize"); } depthToSpace(x, blockSize, dataFormat) { return notYetImplemented("depthToSpace"); } split(value, sizeSplits, axis) { return notYetImplemented("split"); } sparseToDense(sparseIndices, sparseValues, outputShape, defaultValue) { return notYetImplemented("sparseToDense"); } diag(x) { return notYetImplemented("diag"); } fill(shape, value, dtype) { return notYetImplemented("fill"); } onesLike(x) { return notYetImplemented("onesLike"); } zerosLike(x) { return notYetImplemented("zerosLike"); } linspace(start, stop, num) { return notYetImplemented("linspace"); } dispose() { return notYetImplemented("dispose"); } } function notYetImplemented(kernelName) { throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); } // node_modules/@tensorflow/tfjs-core/dist/util_base.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function shuffle(array2) { let counter = array2.length; let temp = 0; let index = 0; while (counter > 0) { index = Math.random() * counter | 0; counter--; temp = array2[counter]; array2[counter] = array2[index]; array2[index] = temp; } } function clamp(min6, x, max8) { return Math.max(min6, Math.min(x, max8)); } function nearestLargerEven(val) { return val % 2 === 0 ? val : val + 1; } function sum(arr) { let sum14 = 0; for (let i = 0; i < arr.length; i++) { sum14 += arr[i]; } return sum14; } function randUniform(a, b) { const r = Math.random(); return b * r + (1 - r) * a; } function distSquared(a, b) { let result = 0; for (let i = 0; i < a.length; i++) { const diff = Number(a[i]) - Number(b[i]); result += diff * diff; } return result; } function assert(expr, msg) { if (!expr) { throw new Error(typeof msg === "string" ? msg : msg()); } } function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); } function assertNonNull(a) { assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); } function flatten(arr, result = [], skipTypedArray = false) { if (result == null) { result = []; } if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { for (let i = 0; i < arr.length; ++i) { flatten(arr[i], result, skipTypedArray); } } else { result.push(arr); } return result; } function sizeFromShape(shape) { if (shape.length === 0) { return 1; } let size = shape[0]; for (let i = 1; i < shape.length; i++) { size *= shape[i]; } return size; } function isScalarShape(shape) { return shape.length === 0; } function arraysEqual(n1, n2) { if (n1 === n2) { return true; } if (n1 == null || n2 == null) { return false; } if (n1.length !== n2.length) { return false; } for (let i = 0; i < n1.length; i++) { if (n1[i] !== n2[i]) { return false; } } return true; } function isInt(a) { return a % 1 === 0; } function tanh(x) { if (Math.tanh != null) { return Math.tanh(x); } if (x === Infinity) { return 1; } else if (x === -Infinity) { return -1; } else { const e2x = Math.exp(2 * x); return (e2x - 1) / (e2x + 1); } } function sizeToSquarishShape(size) { const width = Math.ceil(Math.sqrt(size)); return [width, Math.ceil(size / width)]; } function createShuffledIndices(n) { const shuffledIndices = new Uint32Array(n); for (let i = 0; i < n; ++i) { shuffledIndices[i] = i; } shuffle(shuffledIndices); return shuffledIndices; } function rightPad(a, size) { if (size <= a.length) { return a; } return a + " ".repeat(size - a.length); } function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { return new Promise((resolve, reject) => { let tryCount = 0; const tryFn = () => { if (checkFn()) { resolve(); return; } tryCount++; const nextBackoff = delayFn(tryCount); if (maxCounter != null && tryCount >= maxCounter) { reject(); return; } setTimeout(tryFn, nextBackoff); }; tryFn(); }); } function inferFromImplicitShape(shape, size) { let shapeProd = 1; let implicitIdx = -1; for (let i = 0; i < shape.length; ++i) { if (shape[i] >= 0) { shapeProd *= shape[i]; } else if (shape[i] === -1) { if (implicitIdx !== -1) { throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); } implicitIdx = i; } else if (shape[i] < 0) { throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); } } if (implicitIdx === -1) { if (size > 0 && size !== shapeProd) { throw Error(`Size(${size}) must match the product of shape ${shape}`); } return shape; } if (shapeProd === 0) { throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); } if (size % shapeProd !== 0) { throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); } const newShape = shape.slice(); newShape[implicitIdx] = size / shapeProd; return newShape; } function parseAxisParam(axis, shape) { const rank = shape.length; axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); return axis.map((a) => a < 0 ? rank + a : a); } function squeezeShape(shape, axis) { const newShape = []; const keptDims = []; const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); let j = 0; for (let i = 0; i < shape.length; ++i) { if (axes != null) { if (axes[j] === i && shape[i] !== 1) { throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); } if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { newShape.push(shape[i]); keptDims.push(i); } if (axes[j] <= i) { j++; } } if (shape[i] !== 1) { newShape.push(shape[i]); keptDims.push(i); } } return {newShape, keptDims}; } function getTypedArrayFromDType(dtype, size) { let values = null; if (dtype == null || dtype === "float32") { values = new Float32Array(size); } else if (dtype === "int32") { values = new Int32Array(size); } else if (dtype === "bool") { values = new Uint8Array(size); } else { throw new Error(`Unknown data type ${dtype}`); } return values; } function getArrayFromDType(dtype, size) { let values = null; if (dtype == null || dtype === "float32") { values = new Float32Array(size); } else if (dtype === "int32") { values = new Int32Array(size); } else if (dtype === "bool") { values = new Uint8Array(size); } else if (dtype === "string") { values = new Array(size); } else { throw new Error(`Unknown data type ${dtype}`); } return values; } function checkConversionForErrors(vals, dtype) { for (let i = 0; i < vals.length; i++) { const num = vals[i]; if (isNaN(num) || !isFinite(num)) { throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); } } } function isValidDtype(dtype) { return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; } function hasEncodingLoss(oldType, newType) { if (newType === "complex64") { return false; } if (newType === "float32" && oldType !== "complex64") { return false; } if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { return false; } if (newType === "bool" && oldType === "bool") { return false; } return true; } function isTypedArray(a) { return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; } function bytesPerElement(dtype) { if (dtype === "float32" || dtype === "int32") { return 4; } else if (dtype === "complex64") { return 8; } else if (dtype === "bool") { return 1; } else { throw new Error(`Unknown dtype ${dtype}`); } } function bytesFromStringArray(arr) { if (arr == null) { return 0; } let bytes = 0; arr.forEach((x) => bytes += x.length); return bytes; } function isString(value) { return typeof value === "string" || value instanceof String; } function isBoolean(value) { return typeof value === "boolean"; } function isNumber(value) { return typeof value === "number"; } function inferDtype(values) { if (Array.isArray(values)) { return inferDtype(values[0]); } if (values instanceof Float32Array) { return "float32"; } else if (values instanceof Int32Array || values instanceof Uint8Array) { return "int32"; } else if (isNumber(values)) { return "float32"; } else if (isString(values)) { return "string"; } else if (isBoolean(values)) { return "bool"; } return "float32"; } function isFunction(f) { return !!(f && f.constructor && f.call && f.apply); } function nearestDivisor(size, start) { for (let i = start; i < size; ++i) { if (size % i === 0) { return i; } } return size; } function computeStrides(shape) { const rank = shape.length; if (rank < 2) { return []; } const strides = new Array(rank - 1); strides[rank - 2] = shape[rank - 1]; for (let i = rank - 3; i >= 0; --i) { strides[i] = strides[i + 1] * shape[i + 1]; } return strides; } function createNestedArray(offset, shape, a) { const ret = new Array(); if (shape.length === 1) { const d = shape[0]; for (let i = 0; i < d; i++) { ret[i] = a[offset + i]; } } else { const d = shape[0]; const rest = shape.slice(1); const len = rest.reduce((acc, c) => acc * c); for (let i = 0; i < d; i++) { ret[i] = createNestedArray(offset + i * len, rest, a); } } return ret; } function toNestedArray(shape, a) { if (shape.length === 0) { return a[0]; } const size = shape.reduce((acc, c) => acc * c); if (size === 0) { return []; } if (size !== a.length) { throw new Error(`[${shape}] does not match the input size ${a.length}.`); } return createNestedArray(0, shape, a); } function makeOnesTypedArray(size, dtype) { const array2 = makeZerosTypedArray(size, dtype); for (let i = 0; i < array2.length; i++) { array2[i] = 1; } return array2; } function makeZerosTypedArray(size, dtype) { if (dtype == null || dtype === "float32" || dtype === "complex64") { return new Float32Array(size); } else if (dtype === "int32") { return new Int32Array(size); } else if (dtype === "bool") { return new Uint8Array(size); } else { throw new Error(`Unknown data type ${dtype}`); } } function makeZerosNestedTypedArray(shape, dtype) { const size = shape.reduce((prev, curr) => prev * curr, 1); if (dtype == null || dtype === "float32") { return toNestedArray(shape, new Float32Array(size)); } else if (dtype === "int32") { return toNestedArray(shape, new Int32Array(size)); } else if (dtype === "bool") { return toNestedArray(shape, new Uint8Array(size)); } else { throw new Error(`Unknown data type ${dtype}`); } } function assertNonNegativeIntegerDimensions(shape) { shape.forEach((dimSize) => { assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); }); } function locToIndex(locs, rank, strides) { if (rank === 0) { return 0; } else if (rank === 1) { return locs[0]; } let index = locs[locs.length - 1]; for (let i = 0; i < locs.length - 1; ++i) { index += strides[i] * locs[i]; } return index; } function indexToLoc(index, rank, strides) { if (rank === 0) { return []; } else if (rank === 1) { return [index]; } const locs = new Array(rank); for (let i = 0; i < locs.length - 1; ++i) { locs[i] = Math.floor(index / strides[i]); index -= locs[i] * strides[i]; } locs[locs.length - 1] = index; return locs; } function isPromise(object) { return object && object.then && typeof object.then === "function"; } // node_modules/@tensorflow/tfjs-core/dist/environment.js /** * @license * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; class Environment { constructor(global2) { this.global = global2; this.flags = {}; this.flagRegistry = {}; this.urlFlags = {}; this.populateURLFlags(); } setPlatform(platformName, platform) { if (this.platform != null) { console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); } this.platformName = platformName; this.platform = platform; } registerFlag(flagName, evaluationFn, setHook) { this.flagRegistry[flagName] = {evaluationFn, setHook}; if (this.urlFlags[flagName] != null) { const flagValue = this.urlFlags[flagName]; console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); this.set(flagName, flagValue); } } async getAsync(flagName) { if (flagName in this.flags) { return this.flags[flagName]; } this.flags[flagName] = await this.evaluateFlag(flagName); return this.flags[flagName]; } get(flagName) { if (flagName in this.flags) { return this.flags[flagName]; } const flagValue = this.evaluateFlag(flagName); if (isPromise(flagValue)) { throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); } this.flags[flagName] = flagValue; return this.flags[flagName]; } getNumber(flagName) { return this.get(flagName); } getBool(flagName) { return this.get(flagName); } getFlags() { return this.flags; } get features() { return this.flags; } set(flagName, value) { if (this.flagRegistry[flagName] == null) { throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); } this.flags[flagName] = value; if (this.flagRegistry[flagName].setHook != null) { this.flagRegistry[flagName].setHook(value); } } evaluateFlag(flagName) { if (this.flagRegistry[flagName] == null) { throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); } return this.flagRegistry[flagName].evaluationFn(); } setFlags(flags2) { this.flags = Object.assign({}, flags2); } reset() { this.flags = {}; this.urlFlags = {}; this.populateURLFlags(); } populateURLFlags() { if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { return; } const urlParams = getQueryParams(this.global.location.search); if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); keyValues.forEach((keyValue) => { const [key, value] = keyValue.split(":"); this.urlFlags[key] = parseValue(key, value); }); } } } function getQueryParams(queryString) { const params = {}; queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { decodeParam(params, t[0], t[1]); return t.join("="); }); return params; } function decodeParam(params, name, value) { params[decodeURIComponent(name)] = decodeURIComponent(value || ""); } function parseValue(flagName, value) { value = value.toLowerCase(); if (value === "true" || value === "false") { return value === "true"; } else if (`${+value}` === value) { return +value; } throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); } function env() { return ENV; } let ENV = null; function setEnvironmentGlobal(environment11) { ENV = environment11; } // node_modules/@tensorflow/tfjs-core/dist/global_util.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ let globalNameSpace; function getGlobalNamespace() { if (globalNameSpace == null) { let ns; if (typeof window !== "undefined") { ns = window; } else if (typeof global !== "undefined") { ns = global; } else if (typeof process !== "undefined") { ns = process; } else if (typeof self !== "undefined") { ns = self; } else { throw new Error("Could not find a global object"); } globalNameSpace = ns; } return globalNameSpace; } function getGlobalMap() { const ns = getGlobalNamespace(); if (ns._tfGlobals == null) { ns._tfGlobals = new Map(); } return ns._tfGlobals; } function getGlobal(key, init2) { const globalMap = getGlobalMap(); if (globalMap.has(key)) { return globalMap.get(key); } else { const singleton = init2(); globalMap.set(key, singleton); return globalMap.get(key); } } // node_modules/@tensorflow/tfjs-core/dist/kernel_names.js const Abs = "Abs"; const Acos = "Acos"; const Acosh = "Acosh"; const Add = "Add"; const AddN = "AddN"; const All = "All"; const Any = "Any"; const ArgMax = "ArgMax"; const ArgMin = "ArgMin"; const Asin = "Asin"; const Asinh = "Asinh"; const Atan = "Atan"; const Atanh = "Atanh"; const Atan2 = "Atan2"; const AvgPool = "AvgPool"; const AvgPoolBackprop = "AvgPoolBackprop"; const AvgPool3D = "AvgPool3D"; const AvgPool3DBackprop = "AvgPool3DBackprop"; const BatchMatMul = "BatchMatMul"; const BatchToSpaceND = "BatchToSpaceND"; const BroadcastTo = "BroadcastTo"; const Cast = "Cast"; const Ceil = "Ceil"; const ClipByValue = "ClipByValue"; const Complex = "Complex"; const Concat = "Concat"; const Conv2D = "Conv2D"; const Conv2DBackpropFilter = "Conv2DBackpropFilter"; const Conv2DBackpropInput = "Conv2DBackpropInput"; const Conv3D = "Conv3D"; const Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; const Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; const Cos = "Cos"; const Cosh = "Cosh"; const Cumsum = "Cumsum"; const CropAndResize = "CropAndResize"; const DepthToSpace = "DepthToSpace"; const DepthwiseConv2dNative = "DepthwiseConv2dNative"; const DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; const DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; const Diag = "Diag"; const Dilation2D = "Dilation2D"; const Dilation2DBackpropInput = "Dilation2DBackpropInput"; const Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; const Div = "Div"; const Elu = "Elu"; const EluGrad = "EluGrad"; const Erf = "Erf"; const Equal = "Equal"; const Exp = "Exp"; const Expm1 = "Expm1"; const FFT = "FFT"; const Fill = "Fill"; const FlipLeftRight = "FlipLeftRight"; const Floor = "Floor"; const FloorDiv = "FloorDiv"; const FusedBatchNorm = "FusedBatchNorm"; const GatherV2 = "GatherV2"; const GatherNd = "GatherNd"; const Greater = "Greater"; const GreaterEqual = "GreaterEqual"; const Identity = "Identity"; const IFFT = "IFFT"; const Imag = "Imag"; const IsFinite = "IsFinite"; const IsInf = "IsInf"; const IsNan = "IsNan"; const Less = "Less"; const LessEqual = "LessEqual"; const LinSpace = "LinSpace"; const Log = "Log"; const Log1p = "Log1p"; const LogicalAnd = "LogicalAnd"; const LogicalNot = "LogicalNot"; const LogicalOr = "LogicalOr"; const LogSoftmax = "LogSoftmax"; const LRN = "LRN"; const LRNBackprop = "LRNBackprop"; const Max = "Max"; const Maximum = "Maximum"; const MaxPool = "MaxPool"; const MaxPoolBackprop = "MaxPoolBackprop"; const MaxPool3D = "MaxPool3D"; const MaxPool3DBackprop = "MaxPool3DBackprop"; const MaxPoolWithArgmax = "MaxPoolWithArgmax"; const Mean = "Mean"; const Min = "Min"; const Minimum = "Minimum"; const MirrorPad = "MirrorPad"; const Mod = "Mod"; const Multiply = "Multiply"; const Negate = "Negate"; const NotEqual = "NotEqual"; const NonMaxSuppressionV3 = "NonMaxSuppressionV3"; const NonMaxSuppressionV4 = "NonMaxSuppressionV4"; const NonMaxSuppressionV5 = "NonMaxSuppressionV5"; const OnesLike = "OnesLike"; const OneHot = "OneHot"; const PadV2 = "PadV2"; const Pool = "Pool"; const Pow = "Pow"; const Prelu = "Prelu"; const Prod = "Prod"; const Range = "Range"; const Real = "Real"; const Reciprocal = "Reciprocal"; const Relu = "Relu"; const Reshape = "Reshape"; const ResizeNearestNeighbor = "ResizeNearestNeighbor"; const ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; const ResizeBilinear = "ResizeBilinear"; const ResizeBilinearGrad = "ResizeBilinearGrad"; const Relu6 = "Relu6"; const Reverse = "Reverse"; const Round = "Round"; const Rsqrt = "Rsqrt"; const ScatterNd = "ScatterNd"; const SelectV2 = "SelectV2"; const Selu = "Selu"; const Slice = "Slice"; const Sin = "Sin"; const Sinh = "Sinh"; const Sign = "Sign"; const Sigmoid = "Sigmoid"; const Softplus = "Softplus"; const Sqrt = "Sqrt"; const Sum = "Sum"; const SpaceToBatchND = "SpaceToBatchND"; const SplitV = "SplitV"; const Softmax = "Softmax"; const SquaredDifference = "SquaredDifference"; const Square = "Square"; const Sub = "Sub"; const SparseToDense = "SparseToDense"; const StridedSlice = "StridedSlice"; const Tan = "Tan"; const Tanh = "Tanh"; const Tile = "Tile"; const TopK = "TopK"; const Transpose = "Transpose"; const Unique = "Unique"; const Unpack = "Unpack"; const UnsortedSegmentSum = "UnsortedSegmentSum"; const ZerosLike = "ZerosLike"; const Step = "Step"; const FromPixels = "FromPixels"; const RotateWithOffset = "RotateWithOffset"; const _FusedMatMul = "_FusedMatMul"; const FusedConv2D = "FusedConv2D"; const FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; // node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const kernelRegistry = getGlobal("kernelRegistry", () => new Map()); const gradRegistry = getGlobal("gradRegistry", () => new Map()); function getKernel(kernelName, backendName) { const key = makeKey(kernelName, backendName); return kernelRegistry.get(key); } function getGradient(kernelName) { return gradRegistry.get(kernelName); } function getKernelsForBackend(backendName) { const it = kernelRegistry.entries(); const result = []; while (true) { const {done, value} = it.next(); if (done) { break; } const [key, config] = value; const [backend3] = key.split("_"); if (backend3 === backendName) { result.push(config); } } return result; } function registerKernel(config) { const {kernelName, backendName} = config; const key = makeKey(kernelName, backendName); if (kernelRegistry.has(key)) { console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); } kernelRegistry.set(key, config); } function registerGradient(config) { const {kernelName} = config; if (gradRegistry.has(kernelName)) { if (env().getBool("DEBUG")) { console.warn(`Overriding the gradient for '${kernelName}'`); } } gradRegistry.set(kernelName, config); } function unregisterKernel(kernelName, backendName) { const key = makeKey(kernelName, backendName); if (!kernelRegistry.has(key)) { throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); } kernelRegistry.delete(key); } function unregisterGradient(kernelName) { if (!gradRegistry.has(kernelName)) { throw new Error(`The gradient '${kernelName}' for backend is not registered`); } gradRegistry.delete(kernelName); } function copyRegisteredKernels(registeredBackendName, newBackendName) { const kernels = getKernelsForBackend(registeredBackendName); kernels.forEach((kernelConfig) => { const newKernelConfig = Object.assign({}, kernelConfig, {backendName: newBackendName}); registerKernel(newKernelConfig); }); } function makeKey(kernelName, backendName) { return `${backendName}_${kernelName}`; } // node_modules/@tensorflow/tfjs-core/dist/util.js const util_exports = {}; __export(util_exports, { arraysEqual: () => arraysEqual, assert: () => assert, assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, assertNonNull: () => assertNonNull, assertShapesMatch: () => assertShapesMatch, bytesFromStringArray: () => bytesFromStringArray, bytesPerElement: () => bytesPerElement, checkConversionForErrors: () => checkConversionForErrors, clamp: () => clamp, computeStrides: () => computeStrides, createScalarValue: () => createScalarValue, createShuffledIndices: () => createShuffledIndices, decodeString: () => decodeString, distSquared: () => distSquared, encodeString: () => encodeString, fetch: () => fetch2, flatten: () => flatten, getArrayFromDType: () => getArrayFromDType, getTypedArrayFromDType: () => getTypedArrayFromDType, hasEncodingLoss: () => hasEncodingLoss, indexToLoc: () => indexToLoc, inferDtype: () => inferDtype, inferFromImplicitShape: () => inferFromImplicitShape, isBoolean: () => isBoolean, isFunction: () => isFunction, isInt: () => isInt, isNumber: () => isNumber, isPromise: () => isPromise, isScalarShape: () => isScalarShape, isString: () => isString, isTypedArray: () => isTypedArray, isValidDtype: () => isValidDtype, locToIndex: () => locToIndex, makeOnesTypedArray: () => makeOnesTypedArray, makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, makeZerosTypedArray: () => makeZerosTypedArray, nearestDivisor: () => nearestDivisor, nearestLargerEven: () => nearestLargerEven, now: () => now, parseAxisParam: () => parseAxisParam, randUniform: () => randUniform, repeatedTry: () => repeatedTry, rightPad: () => rightPad, shuffle: () => shuffle, sizeFromShape: () => sizeFromShape, sizeToSquarishShape: () => sizeToSquarishShape, squeezeShape: () => squeezeShape, sum: () => sum, tanh: () => tanh, toNestedArray: () => toNestedArray, toTypedArray: () => toTypedArray }); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function createScalarValue(value, dtype) { if (dtype === "string") { return encodeString(value); } return toTypedArray([value], dtype); } function noConversionNeeded(a, dtype) { return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; } function toTypedArray(a, dtype) { if (dtype === "string") { throw new Error("Cannot convert a string[] to a TypedArray"); } if (Array.isArray(a)) { a = flatten(a); } if (env().getBool("DEBUG")) { checkConversionForErrors(a, dtype); } if (noConversionNeeded(a, dtype)) { return a; } if (dtype == null || dtype === "float32" || dtype === "complex64") { return new Float32Array(a); } else if (dtype === "int32") { return new Int32Array(a); } else if (dtype === "bool") { const bool = new Uint8Array(a.length); for (let i = 0; i < bool.length; ++i) { if (Math.round(a[i]) !== 0) { bool[i] = 1; } } return bool; } else { throw new Error(`Unknown data type ${dtype}`); } } function now() { return env().platform.now(); } function fetch2(path, requestInits) { return env().platform.fetch(path, requestInits); } function encodeString(s, encoding = "utf-8") { encoding = encoding || "utf-8"; return env().platform.encode(s, encoding); } function decodeString(bytes, encoding = "utf-8") { encoding = encoding || "utf-8"; return env().platform.decode(bytes, encoding); } // node_modules/@tensorflow/tfjs-core/dist/profiler.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ class Profiler { constructor(backendTimer, logger) { this.backendTimer = backendTimer; this.logger = logger; if (logger == null) { this.logger = new Logger(); } } profileKernel(kernelName, inputs, f) { let outputs; const holdResultWrapperFn = () => { outputs = f(); }; const timer = this.backendTimer.time(holdResultWrapperFn); for (let i = 0; i < outputs.length; i++) { const output = outputs[i]; output.data().then((tensorVals) => { checkComputationForErrors(tensorVals, output.dtype, kernelName); }); } const kernelProfile = { kernelName, outputs, inputs, timeMs: timer.then((timing) => timing.kernelMs), extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") }; return kernelProfile; } logKernelProfile(kernelProfile) { const {kernelName, outputs, timeMs, inputs, extraInfo} = kernelProfile; outputs.forEach((result) => { Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); }); }); } } function checkComputationForErrors(vals, dtype, kernelName) { if (dtype !== "float32") { return false; } for (let i = 0; i < vals.length; i++) { const num = vals[i]; if (isNaN(num) || !isFinite(num)) { console.warn(`Found ${num} in the result of '${kernelName}'`); return true; } } return false; } class Logger { logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; const paddedName = rightPad(name, 25); const rank = result.rank; const size = result.size; const shape = rightPad(result.shape.toString(), 14); let inputShapesDescription = ""; for (const name2 in inputs) { const input2 = inputs[name2]; if (input2 != null) { const inputShape = input2.shape || result.shape; const inputRank = inputShape.length; inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; } } console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); } } // node_modules/@tensorflow/tfjs-core/dist/tape.js /** * @license * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function getFilteredNodesXToY(tape2, xs, y) { const tensorsFromX = {}; const nodesFromX = {}; for (let i = 0; i < xs.length; i++) { tensorsFromX[xs[i].id] = true; } for (let i = 0; i < tape2.length; i++) { const node = tape2[i]; const nodeInputs = node.inputs; for (const inputName in nodeInputs) { const input2 = nodeInputs[inputName]; let anyInputFromX = false; for (let j = 0; j < xs.length; j++) { if (tensorsFromX[input2.id]) { node.outputs.forEach((output) => tensorsFromX[output.id] = true); anyInputFromX = true; nodesFromX[node.id] = true; break; } } if (anyInputFromX) { break; } } } const tensorsLeadToY = {}; tensorsLeadToY[y.id] = true; const nodesToY = {}; for (let i = tape2.length - 1; i >= 0; i--) { const node = tape2[i]; const nodeInputs = node.inputs; for (let j = 0; j < node.outputs.length; j++) { if (tensorsLeadToY[node.outputs[j].id]) { for (const inputName in nodeInputs) { tensorsLeadToY[nodeInputs[inputName].id] = true; nodesToY[node.id] = true; } break; } } } const filteredTape = []; for (let i = 0; i < tape2.length; i++) { const node = tape2[i]; if (nodesFromX[node.id] && nodesToY[node.id]) { const prunedInputs = {}; for (const inputName in node.inputs) { const nodeInput = node.inputs[inputName]; if (tensorsFromX[nodeInput.id]) { prunedInputs[inputName] = nodeInput; } } const prunedNode = Object.assign({}, node); prunedNode.inputs = prunedInputs; prunedNode.outputs = node.outputs; filteredTape.push(prunedNode); } } return filteredTape; } function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add24) { for (let i = filteredTape.length - 1; i >= 0; i--) { const node = filteredTape[i]; const dys = []; node.outputs.forEach((o) => { const gradTensor = tensorAccumulatedGradientMap[o.id]; if (gradTensor != null) { dys.push(gradTensor); } else { dys.push(null); } }); if (node.gradient == null) { throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); } const inputGradients = node.gradient(dys); for (const inputName in node.inputs) { if (!(inputName in inputGradients)) { throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); } const dx = tidy2(() => inputGradients[inputName]()); if (dx.dtype !== "float32") { throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); } const x = node.inputs[inputName]; if (!arraysEqual(dx.shape, x.shape)) { throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); } if (tensorAccumulatedGradientMap[x.id] == null) { tensorAccumulatedGradientMap[x.id] = dx; } else { const curGradient = tensorAccumulatedGradientMap[x.id]; tensorAccumulatedGradientMap[x.id] = add24(curGradient, dx); curGradient.dispose(); } } } } // node_modules/@tensorflow/tfjs-core/dist/tensor_format.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const FORMAT_LIMIT_NUM_VALS = 20; const FORMAT_NUM_FIRST_LAST_VALS = 3; const FORMAT_NUM_SIG_DIGITS = 7; function tensorToString(vals, shape, dtype, verbose) { const strides = computeStrides(shape); const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); const rank = shape.length; const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); const lines = ["Tensor"]; if (verbose) { lines.push(` dtype: ${dtype}`); lines.push(` rank: ${rank}`); lines.push(` shape: [${shape}]`); lines.push(` values:`); } lines.push(valsLines.map((l) => " " + l).join("\n")); return lines.join("\n"); } function computeMaxSizePerColumn(vals, shape, dtype, strides) { const n = sizeFromShape(shape); const numCols = strides[strides.length - 1]; const padPerCol = new Array(numCols).fill(0); const rank = shape.length; const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; if (rank > 1) { for (let row = 0; row < n / numCols; row++) { const offset = row * numCols; for (let j = 0; j < numCols; j++) { padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); } } } return padPerCol; } function valToString(val, pad8, dtype) { let valStr; if (Array.isArray(val)) { valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; } else if (isString(val)) { valStr = `'${val}'`; } else if (dtype === "bool") { valStr = boolNumToString(val); } else { valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); } return rightPad(valStr, pad8); } function boolNumToString(v) { return v === 0 ? "false" : "true"; } function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { const storagePerElement = dtype === "complex64" ? 2 : 1; const size = shape[0]; const rank = shape.length; if (rank === 0) { if (dtype === "complex64") { const complexTuple = createComplexTuples(vals); return [valToString(complexTuple[0], 0, dtype)]; } if (dtype === "bool") { return [boolNumToString(vals[0])]; } return [vals[0].toString()]; } if (rank === 1) { if (size > FORMAT_LIMIT_NUM_VALS) { const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; let firstVals = Array.from(vals.slice(0, firstValsSize)); let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); if (dtype === "complex64") { firstVals = createComplexTuples(firstVals); lastVals = createComplexTuples(lastVals); } return [ "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" ]; } const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); return [ "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" ]; } const subshape = shape.slice(1); const substrides = strides.slice(1); const stride = strides[0] * storagePerElement; const lines = []; if (size > FORMAT_LIMIT_NUM_VALS) { for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { const start = i * stride; const end = start + stride; lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); } lines.push("..."); for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { const start = i * stride; const end = start + stride; lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); } } else { for (let i = 0; i < size; i++) { const start = i * stride; const end = start + stride; lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); } } const sep = rank === 2 ? "," : ""; lines[0] = "[" + lines[0] + sep; for (let i = 1; i < lines.length - 1; i++) { lines[i] = " " + lines[i] + sep; } let newLineSep = ",\n"; for (let i = 2; i < rank; i++) { newLineSep += "\n"; } lines[lines.length - 1] = " " + lines[lines.length - 1] + "]" + (isLast ? "" : newLineSep); return lines; } function createComplexTuples(vals) { const complexTuples = []; for (let i = 0; i < vals.length; i += 2) { complexTuples.push([vals[i], vals[i + 1]]); } return complexTuples; } // node_modules/@tensorflow/tfjs-core/dist/tensor.js /** * @license * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ class TensorBuffer { constructor(shape, dtype, values) { this.dtype = dtype; this.shape = shape.slice(); this.size = sizeFromShape(shape); if (values != null) { const n = values.length; assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); } if (dtype === "complex64") { throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); } this.values = values || getArrayFromDType(dtype, this.size); this.strides = computeStrides(shape); } set(value, ...locs) { if (locs.length === 0) { locs = [0]; } assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); const index = this.locToIndex(locs); this.values[index] = value; } get(...locs) { if (locs.length === 0) { locs = [0]; } let i = 0; for (const loc of locs) { if (loc < 0 || loc >= this.shape[i]) { const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; throw new Error(msg); } i++; } let index = locs[locs.length - 1]; for (let i2 = 0; i2 < locs.length - 1; ++i2) { index += this.strides[i2] * locs[i2]; } return this.values[index]; } locToIndex(locs) { if (this.rank === 0) { return 0; } else if (this.rank === 1) { return locs[0]; } let index = locs[locs.length - 1]; for (let i = 0; i < locs.length - 1; ++i) { index += this.strides[i] * locs[i]; } return index; } indexToLoc(index) { if (this.rank === 0) { return []; } else if (this.rank === 1) { return [index]; } const locs = new Array(this.shape.length); for (let i = 0; i < locs.length - 1; ++i) { locs[i] = Math.floor(index / this.strides[i]); index -= locs[i] * this.strides[i]; } locs[locs.length - 1] = index; return locs; } get rank() { return this.shape.length; } toTensor() { return trackerFn().makeTensor(this.values, this.shape, this.dtype); } } let trackerFn = null; let opHandler = null; let deprecationWarningFn = null; function setTensorTracker(fn) { trackerFn = fn; } function setDeprecationWarningFn(fn) { deprecationWarningFn = fn; } class Tensor { constructor(shape, dtype, dataId, id) { this.kept = false; this.isDisposedInternal = false; this.shape = shape.slice(); this.dtype = dtype || "float32"; this.size = sizeFromShape(shape); this.strides = computeStrides(shape); this.dataId = dataId; this.id = id; this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; } get rank() { return this.shape.length; } async buffer() { const vals = await this.data(); return opHandler.buffer(this.shape, this.dtype, vals); } bufferSync() { return opHandler.buffer(this.shape, this.dtype, this.dataSync()); } async array() { const vals = await this.data(); return toNestedArray(this.shape, vals); } arraySync() { return toNestedArray(this.shape, this.dataSync()); } async data() { this.throwIfDisposed(); const data = trackerFn().read(this.dataId); if (this.dtype === "string") { const bytes = await data; try { return bytes.map((b) => decodeString(b)); } catch (_a) { throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); } } return data; } dataSync() { this.throwIfDisposed(); const data = trackerFn().readSync(this.dataId); if (this.dtype === "string") { try { return data.map((b) => decodeString(b)); } catch (_a) { throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); } } return data; } async bytes() { this.throwIfDisposed(); const data = await trackerFn().read(this.dataId); if (this.dtype === "string") { return data; } else { return new Uint8Array(data.buffer); } } dispose() { if (this.isDisposed) { return; } trackerFn().disposeTensor(this); this.isDisposedInternal = true; } get isDisposed() { return this.isDisposedInternal; } throwIfDisposed() { if (this.isDisposed) { throw new Error(`Tensor is disposed.`); } } print(verbose = false) { return opHandler.print(this, verbose); } clone() { this.throwIfDisposed(); return opHandler.clone(this); } toString(verbose = false) { const vals = this.dataSync(); return tensorToString(vals, this.shape, this.dtype, verbose); } cast(dtype) { this.throwIfDisposed(); return opHandler.cast(this, dtype); } variable(trainable = true, name, dtype) { this.throwIfDisposed(); return trackerFn().makeVariable(this, trainable, name, dtype); } } Object.defineProperty(Tensor, Symbol.hasInstance, { value: (instance) => { return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; } }); class Variable extends Tensor { constructor(initialValue, trainable, name, tensorId) { super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); this.trainable = trainable; this.name = name; } assign(newValue) { if (newValue.dtype !== this.dtype) { throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); } if (!arraysEqual(newValue.shape, this.shape)) { throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); } trackerFn().disposeTensor(this); this.dataId = newValue.dataId; trackerFn().incRef(this, null); } dispose() { trackerFn().disposeVariable(this); this.isDisposedInternal = true; } } Object.defineProperty(Variable, Symbol.hasInstance, { value: (instance) => { return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; } }); // node_modules/@tensorflow/tfjs-core/dist/tensor_util.js const tensor_util_exports = {}; __export(tensor_util_exports, { assertTypesMatch: () => assertTypesMatch, getTensorsInContainer: () => getTensorsInContainer, isTensorInList: () => isTensorInList, makeTypesMatch: () => makeTypesMatch }); // node_modules/@tensorflow/tfjs-core/dist/types.js /** * @license * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ var Rank; (function(Rank2) { Rank2["R0"] = "R0"; Rank2["R1"] = "R1"; Rank2["R2"] = "R2"; Rank2["R3"] = "R3"; Rank2["R4"] = "R4"; Rank2["R5"] = "R5"; Rank2["R6"] = "R6"; })(Rank || (Rank = {})); var UpcastInt32AndMap; (function(UpcastInt32AndMap2) { UpcastInt32AndMap2["float32"] = "float32"; UpcastInt32AndMap2["int32"] = "int32"; UpcastInt32AndMap2["bool"] = "int32"; UpcastInt32AndMap2["complex64"] = "complex64"; })(UpcastInt32AndMap || (UpcastInt32AndMap = {})); var UpcastBoolAndMap; (function(UpcastBoolAndMap2) { UpcastBoolAndMap2["float32"] = "float32"; UpcastBoolAndMap2["int32"] = "int32"; UpcastBoolAndMap2["bool"] = "bool"; UpcastBoolAndMap2["complex64"] = "complex64"; })(UpcastBoolAndMap || (UpcastBoolAndMap = {})); var UpcastFloat32AndMap; (function(UpcastFloat32AndMap2) { UpcastFloat32AndMap2["float32"] = "float32"; UpcastFloat32AndMap2["int32"] = "float32"; UpcastFloat32AndMap2["bool"] = "float32"; UpcastFloat32AndMap2["complex64"] = "complex64"; })(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); var UpcastComplex64AndMap; (function(UpcastComplex64AndMap2) { UpcastComplex64AndMap2["float32"] = "complex64"; UpcastComplex64AndMap2["int32"] = "complex64"; UpcastComplex64AndMap2["bool"] = "complex64"; UpcastComplex64AndMap2["complex64"] = "complex64"; })(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); const upcastTypeMap = { float32: UpcastFloat32AndMap, int32: UpcastInt32AndMap, bool: UpcastBoolAndMap, complex64: UpcastComplex64AndMap }; function upcastType(typeA, typeB) { if (typeA === "string" || typeB === "string") { if (typeA === "string" && typeB === "string") { return "string"; } throw new Error(`Can not upcast ${typeA} with ${typeB}`); } return upcastTypeMap[typeA][typeB]; } function sumOutType(type) { return upcastType(type, "int32"); } // node_modules/@tensorflow/tfjs-core/dist/tensor_util.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function makeTypesMatch(a, b) { if (a.dtype === b.dtype) { return [a, b]; } const dtype = upcastType(a.dtype, b.dtype); return [a.cast(dtype), b.cast(dtype)]; } function assertTypesMatch(a, b) { assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); } function isTensorInList(tensor16, tensorList) { return tensorList.some((x) => x.id === tensor16.id); } function getTensorsInContainer(result) { const list = []; const seen = new Set(); walkTensorContainer(result, list, seen); return list; } function walkTensorContainer(container2, list, seen) { if (container2 == null) { return; } if (container2 instanceof Tensor) { list.push(container2); return; } if (!isIterable(container2)) { return; } const iterable = container2; for (const k in iterable) { const val = iterable[k]; if (!seen.has(val)) { seen.add(val); walkTensorContainer(val, list, seen); } } } function isIterable(obj) { return Array.isArray(obj) || typeof obj === "object"; } // node_modules/@tensorflow/tfjs-core/dist/engine.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ class EngineState { constructor() { this.registeredVariables = {}; this.nextTapeNodeId = 0; this.numBytes = 0; this.numTensors = 0; this.numStringTensors = 0; this.numDataBuffers = 0; this.gradientDepth = 0; this.kernelDepth = 0; this.scopeStack = []; this.numDataMovesStack = []; this.nextScopeId = 0; this.tensorInfo = new WeakMap(); this.profiling = false; this.activeProfile = {newBytes: 0, newTensors: 0, peakBytes: 0, kernels: [], result: null}; } dispose() { for (const variableName in this.registeredVariables) { this.registeredVariables[variableName].dispose(); } } } class Engine { constructor(ENV4) { this.ENV = ENV4; this.registry = {}; this.registryFactory = {}; this.pendingBackendInitId = 0; this.state = new EngineState(); } async ready() { if (this.pendingBackendInit != null) { return this.pendingBackendInit.then(() => { }); } if (this.backendInstance != null) { return; } const sortedBackends = this.getSortedBackends(); for (let i = 0; i < sortedBackends.length; i++) { const backendName = sortedBackends[i]; const success = await this.initializeBackend(backendName).success; if (success) { await this.setBackend(backendName); return; } } throw new Error(`Could not initialize any backends, all backend initializations failed.`); } get backend() { if (this.pendingBackendInit != null) { throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); } if (this.backendInstance == null) { const {name, asyncInit} = this.initializeBackendsAndReturnBest(); if (asyncInit) { throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); } this.setBackend(name); } return this.backendInstance; } backendNames() { return Object.keys(this.registryFactory); } findBackend(backendName) { if (!(backendName in this.registry)) { if (backendName in this.registryFactory) { const {asyncInit} = this.initializeBackend(backendName); if (asyncInit) { return null; } } else { return null; } } return this.registry[backendName]; } findBackendFactory(backendName) { if (!(backendName in this.registryFactory)) { return null; } return this.registryFactory[backendName].factory; } registerBackend(backendName, factory, priority = 1) { if (backendName in this.registryFactory) { console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); return false; } this.registryFactory[backendName] = {factory, priority}; return true; } async setBackend(backendName) { if (this.registryFactory[backendName] == null) { throw new Error(`Backend name '${backendName}' not found in registry`); } this.backendName = backendName; if (this.registry[backendName] == null) { this.backendInstance = null; const {success, asyncInit} = this.initializeBackend(backendName); const result = asyncInit ? await success : success; if (!result) { return false; } } this.backendInstance = this.registry[backendName]; this.setupRegisteredKernels(); this.profiler = new Profiler(this.backendInstance); return true; } setupRegisteredKernels() { const kernels = getKernelsForBackend(this.backendName); kernels.forEach((kernel) => { if (kernel.setupFunc != null) { kernel.setupFunc(this.backendInstance); } }); } disposeRegisteredKernels(backendName) { const kernels = getKernelsForBackend(backendName); kernels.forEach((kernel) => { if (kernel.disposeFunc != null) { kernel.disposeFunc(this.registry[backendName]); } }); } initializeBackend(backendName) { const registryFactoryEntry = this.registryFactory[backendName]; if (registryFactoryEntry == null) { throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); } try { const backend3 = registryFactoryEntry.factory(); if (backend3 && !(backend3 instanceof KernelBackend) && typeof backend3.then === "function") { const promiseId = ++this.pendingBackendInitId; const success = backend3.then((backendInstance) => { if (promiseId < this.pendingBackendInitId) { return false; } this.registry[backendName] = backendInstance; this.pendingBackendInit = null; return true; }).catch((err) => { if (promiseId < this.pendingBackendInitId) { return false; } this.pendingBackendInit = null; console.warn(`Initialization of backend ${backendName} failed`); console.warn(err.stack || err.message); return false; }); this.pendingBackendInit = success; return {success, asyncInit: true}; } else { this.registry[backendName] = backend3; return {success: true, asyncInit: false}; } } catch (err) { console.warn(`Initialization of backend ${backendName} failed`); console.warn(err.stack || err.message); return {success: false, asyncInit: false}; } } removeBackend(backendName) { if (!(backendName in this.registryFactory)) { throw new Error(`${backendName} backend not found in registry`); } if (this.backendName === backendName && this.pendingBackendInit != null) { this.pendingBackendInitId++; } if (backendName in this.registry) { this.disposeRegisteredKernels(backendName); this.registry[backendName].dispose(); delete this.registry[backendName]; } delete this.registryFactory[backendName]; if (this.backendName === backendName) { this.pendingBackendInit = null; this.backendName = null; this.backendInstance = null; } } getSortedBackends() { if (Object.keys(this.registryFactory).length === 0) { throw new Error("No backend found in registry."); } return Object.keys(this.registryFactory).sort((a, b) => { return this.registryFactory[b].priority - this.registryFactory[a].priority; }); } initializeBackendsAndReturnBest() { const sortedBackends = this.getSortedBackends(); for (let i = 0; i < sortedBackends.length; i++) { const backendName = sortedBackends[i]; const {success, asyncInit} = this.initializeBackend(backendName); if (asyncInit || success) { return {name: backendName, asyncInit}; } } throw new Error(`Could not initialize any backends, all backend initializations failed.`); } moveData(backend3, dataId) { const info = this.state.tensorInfo.get(dataId); const srcBackend = info.backend; const values = this.readSync(dataId); srcBackend.disposeData(dataId); info.backend = backend3; backend3.move(dataId, values, info.shape, info.dtype); if (this.shouldCheckForMemLeaks()) { this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; } } tidy(nameOrFn, fn) { let name = null; if (fn == null) { if (typeof nameOrFn !== "function") { throw new Error("Please provide a function to tidy()"); } fn = nameOrFn; } else { if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); } if (typeof fn !== "function") { throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); } name = nameOrFn; } let result; return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { result = fn(); if (result instanceof Promise) { console.error("Cannot return a Promise inside of tidy."); } return result; }); } scopedRun(start, end, f) { start(); try { const res = f(); end(); return res; } catch (ex) { end(); throw ex; } } nextTensorId() { return Engine.nextTensorId++; } nextVariableId() { return Engine.nextVariableId++; } clone(x) { const y = this.makeTensorFromDataId(x.dataId, x.shape, x.dtype); const inputs = {x}; const grad2 = (dy) => ({ x: () => { const dtype = "float32"; const gradInputs = {x: dy}; const attrs = {dtype}; return ENGINE.runKernelFunc((backend3) => backend3.cast(dy, dtype), gradInputs, null, Cast, attrs); } }); const saved = []; this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); return y; } runKernel(kernelName, inputs, attrs, inputsToSave, outputsToSave) { const forwardFunc = null; const backwardsFunc = null; return this.runKernelFunc(forwardFunc, inputs, backwardsFunc, kernelName, attrs, inputsToSave, outputsToSave); } shouldCheckForMemLeaks() { return this.ENV.getBool("IS_TEST"); } checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { const numDataIdsAfter = this.backend.numDataIds(); let numOutputDataIds = 0; outInfos.forEach((info) => { numOutputDataIds += info.dtype === "complex64" ? 3 : 1; }); const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; if (dataIdsLeaked > 0) { throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); } } runKernelFunc(forwardFunc, inputs, backwardsFunc, kernelName, attrs, inputsToSave, outputsToSave) { let outputs; let saved = []; const isTapeOn = this.isTapeOn(); if (kernelName == null) { kernelName = this.state.activeScope != null ? this.state.activeScope.name : ""; } const startingBytecount = this.state.numBytes; const startingNumTensors = this.state.numTensors; if (this.shouldCheckForMemLeaks()) { this.state.numDataMovesStack.push(0); } let kernelFunc3; const kernel = getKernel(kernelName, this.backendName); let out; if (kernel != null) { kernelFunc3 = () => { const numDataIdsBefore = this.backend.numDataIds(); out = kernel.kernelFunc({inputs, attrs, backend: this.backend}); const outInfos = Array.isArray(out) ? out : [out]; if (this.shouldCheckForMemLeaks()) { this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); } const outTensors = outInfos.map(({dataId, shape, dtype}) => this.makeTensorFromDataId(dataId, shape, dtype)); if (isTapeOn) { let tensorsToSave = this.getTensorsForGradient(kernelName, inputs, outTensors); if (tensorsToSave == null) { if (outputsToSave == null) { outputsToSave = []; } const outsToSave = outTensors.filter((_, i) => outputsToSave[i]); tensorsToSave = (inputsToSave || []).slice().concat(outsToSave); } saved = this.saveTensorsForBackwardMode(tensorsToSave); } return outTensors; }; } else { const saveFunc = (tensors) => { if (!isTapeOn) { return; } saved = tensors.map((tensor16) => this.keep(this.clone(tensor16))); }; kernelFunc3 = () => { const numDataIdsBefore = this.backend.numDataIds(); out = this.tidy(() => forwardFunc(this.backend, saveFunc)); const outs = Array.isArray(out) ? out : [out]; if (this.shouldCheckForMemLeaks()) { this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outs); } return outs; }; } let kernelProfile; this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { outputs = kernelFunc3(); } else { kernelProfile = this.profiler.profileKernel(kernelName, inputs, () => kernelFunc3()); if (this.ENV.getBool("DEBUG")) { this.profiler.logKernelProfile(kernelProfile); } outputs = kernelProfile.outputs; } }); if (isTapeOn) { this.addTapeNode(kernelName, inputs, outputs, backwardsFunc, saved, attrs); } if (this.state.profiling) { this.state.activeProfile.kernels.push({ name: kernelName, bytesAdded: this.state.numBytes - startingBytecount, totalBytesSnapshot: this.state.numBytes, tensorsAdded: this.state.numTensors - startingNumTensors, totalTensorsSnapshot: this.state.numTensors, inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), outputShapes: outputs.map((item) => item.shape), kernelTimeMs: kernelProfile.timeMs, extraInfo: kernelProfile.extraInfo }); } return Array.isArray(out) ? outputs : outputs[0]; } saveTensorsForBackwardMode(tensors) { const saved = tensors.map((tensor16) => this.keep(this.clone(tensor16))); return saved; } getTensorsForGradient(kernelName, inputs, outputs) { const gradConfig = getGradient(kernelName); if (gradConfig != null) { const inputsToSave = gradConfig.inputsToSave || []; const outputsToSave = gradConfig.outputsToSave || []; let inputTensorsToSave; if (gradConfig.saveAllInputs) { assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); } else { inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); } const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); return inputTensorsToSave.concat(outputTensorsToSave); } return null; } makeTensor(values, shape, dtype, backend3) { if (values == null) { throw new Error("Values passed to engine.makeTensor() are null"); } dtype = dtype || "float32"; backend3 = backend3 || this.backend; let backendVals = values; if (dtype === "string" && isString(values[0])) { backendVals = values.map((d) => encodeString(d)); } const dataId = backend3.write(backendVals, shape, dtype); const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); this.incRef(t, backend3); if (dtype === "string") { const info = this.state.tensorInfo.get(dataId); const newBytes = bytesFromStringArray(backendVals); this.state.numBytes += newBytes - info.bytes; info.bytes = newBytes; } return t; } makeTensorFromDataId(dataId, shape, dtype, backend3) { dtype = dtype || "float32"; const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); this.incRef(t, backend3); return t; } makeVariable(initialValue, trainable = true, name, dtype) { name = name || this.nextVariableId().toString(); if (dtype != null && dtype !== initialValue.dtype) { initialValue = initialValue.cast(dtype); } const v = new Variable(initialValue, trainable, name, this.nextTensorId()); if (this.state.registeredVariables[v.name] != null) { throw new Error(`Variable with name ${v.name} was already registered`); } this.state.registeredVariables[v.name] = v; this.incRef(v, this.backend); return v; } incRef(a, backend3) { const refCount = this.state.tensorInfo.has(a.dataId) ? this.state.tensorInfo.get(a.dataId).refCount : 0; this.state.numTensors++; if (a.dtype === "string") { this.state.numStringTensors++; } if (refCount === 0) { this.state.numDataBuffers++; let bytes = 0; if (a.dtype !== "complex64" && a.dtype !== "string") { bytes = a.size * bytesPerElement(a.dtype); } this.state.tensorInfo.set(a.dataId, { backend: backend3 || this.backend, dtype: a.dtype, shape: a.shape, bytes, refCount: 0 }); this.state.numBytes += bytes; } this.state.tensorInfo.get(a.dataId).refCount++; if (!(a instanceof Variable)) { this.track(a); } } disposeTensor(a) { if (!this.state.tensorInfo.has(a.dataId)) { return; } this.state.numTensors--; if (a.dtype === "string") { this.state.numStringTensors--; } const info = this.state.tensorInfo.get(a.dataId); const refCount = info.refCount; if (refCount <= 1) { if (a.dtype !== "complex64") { this.state.numBytes -= info.bytes; } this.state.numDataBuffers--; info.backend.disposeData(a.dataId); this.state.tensorInfo.delete(a.dataId); } else { this.state.tensorInfo.get(a.dataId).refCount--; } } disposeVariables() { for (const varName in this.state.registeredVariables) { const v = this.state.registeredVariables[varName]; this.disposeVariable(v); } } disposeVariable(v) { this.disposeTensor(v); if (this.state.registeredVariables[v.name] != null) { delete this.state.registeredVariables[v.name]; } } memory() { const info = this.backend.memory(); info.numTensors = this.state.numTensors; info.numDataBuffers = this.state.numDataBuffers; info.numBytes = this.state.numBytes; if (this.state.numStringTensors > 0) { info.unreliable = true; if (info.reasons == null) { info.reasons = []; } info.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); } return info; } async profile(query) { this.state.profiling = true; const startBytes = this.state.numBytes; const startNumTensors = this.state.numTensors; this.state.activeProfile.kernels = []; this.state.activeProfile.result = await query(); this.state.profiling = false; this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); this.state.activeProfile.newBytes = this.state.numBytes - startBytes; this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; for (const kernel of this.state.activeProfile.kernels) { kernel.kernelTimeMs = await kernel.kernelTimeMs; kernel.extraInfo = await kernel.extraInfo; } return this.state.activeProfile; } isTapeOn() { return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; } addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { const tapeNode = {id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved}; const gradConfig = getGradient(kernelName); if (gradConfig != null) { gradientsFunc = gradConfig.gradFunc; } if (gradientsFunc != null) { tapeNode.gradient = (dys) => { dys = dys.map((dy, i) => { if (dy == null) { const output = outputs[i]; const vals = makeZerosTypedArray(output.size, output.dtype); return this.makeTensor(vals, output.shape, output.dtype); } return dy; }); return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); }; } this.state.activeTape.push(tapeNode); } keep(result) { result.kept = true; return result; } startTape() { if (this.state.gradientDepth === 0) { this.state.activeTape = []; } this.state.gradientDepth++; } endTape() { this.state.gradientDepth--; } startScope(name) { const scopeInfo = { track: [], name: "unnamed scope", id: this.state.nextScopeId++ }; if (name) { scopeInfo.name = name; } this.state.scopeStack.push(scopeInfo); this.state.activeScope = scopeInfo; } endScope(result) { const tensorsToTrackInParent = getTensorsInContainer(result); const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); for (let i = 0; i < this.state.activeScope.track.length; i++) { const tensor16 = this.state.activeScope.track[i]; if (!tensor16.kept && !tensorsToTrackInParentSet.has(tensor16.id)) { tensor16.dispose(); } } const oldScope = this.state.scopeStack.pop(); this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; tensorsToTrackInParent.forEach((tensor16) => { if (!tensor16.kept && tensor16.scopeId === oldScope.id) { this.track(tensor16); } }); } gradients(f, xs, dy, allowNoGradients = false) { assert(xs.length > 0, () => "gradients() received an empty list of xs."); if (dy != null && dy.dtype !== "float32") { throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); } const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); } return this.tidy("backward", () => { const accumulatedGradientMap = {}; accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); if (this.state.gradientDepth === 0) { this.state.activeTape.forEach((node) => { for (const tensor16 of node.saved) { tensor16.dispose(); } }); this.state.activeTape = null; } return {value: y, grads: grads2}; }); } customGrad(f) { assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); return (...inputs) => { assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); let res; const inputMap = {}; inputs.forEach((input2, i) => { inputMap[i] = input2; }); return this.runKernelFunc((_, save) => { res = f(...[...inputs, save]); assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); return res.value; }, inputMap, (dy, saved) => { const gradRes = res.gradFunc(dy, saved); const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); const gradMap = {}; grads2.forEach((grad2, i) => { gradMap[i] = () => grad2; }); return gradMap; }); }; } readSync(dataId) { const info = this.state.tensorInfo.get(dataId); return info.backend.readSync(dataId); } read(dataId) { const info = this.state.tensorInfo.get(dataId); return info.backend.read(dataId); } async time(query) { const start = now(); const timingInfo = await this.backend.time(query); timingInfo.wallMs = now() - start; return timingInfo; } track(result) { if (this.state.activeScope != null) { result.scopeId = this.state.activeScope.id; this.state.activeScope.track.push(result); } return result; } get registeredVariables() { return this.state.registeredVariables; } reset() { this.pendingBackendInitId++; this.state.dispose(); this.ENV.reset(); this.state = new EngineState(); for (const backendName in this.registry) { this.disposeRegisteredKernels(backendName); this.registry[backendName].dispose(); delete this.registry[backendName]; } this.backendName = null; this.backendInstance = null; this.pendingBackendInit = null; } } Engine.nextTensorId = 0; Engine.nextVariableId = 0; function ones(shape) { const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); return ENGINE.makeTensor(values, shape, "float32"); } function getOrMakeEngine() { const ns = getGlobalNamespace(); if (ns._tfengine == null) { const environment11 = new Environment(ns); ns._tfengine = new Engine(environment11); } setEnvironmentGlobal(ns._tfengine.ENV); setTensorTracker(() => ns._tfengine); return ns._tfengine; } const ENGINE = getOrMakeEngine(); function add(a, b) { const inputs = {a, b}; return ENGINE.runKernelFunc((backend3, save) => { const res = backend3.add(a, b); save([a, b]); return res; }, inputs, null, Add); } // node_modules/@tensorflow/tfjs-core/dist/device_util.js const device_util_exports = {}; __export(device_util_exports, { isBrowser: () => isBrowser, isMobile: () => isMobile }); /** * @license * Copyright 2017 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function _isNavigatorDefined() { return typeof navigator !== "undefined" && navigator != null; } function isMobile() { if (_isNavigatorDefined()) { const a = navigator.userAgent || navigator.vendor || window.opera; return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); } return false; } function isBrowser() { return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; } // node_modules/@tensorflow/tfjs-core/dist/flags.js /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const ENV2 = env(); ENV2.registerFlag("DEBUG", () => false, (debugValue) => { if (debugValue) { console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); } }); ENV2.registerFlag("IS_BROWSER", () => isBrowser()); ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); ENV2.registerFlag("PROD", () => false); ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); ENV2.registerFlag("IS_TEST", () => false); // node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function inferShape(val, dtype) { let firstElem = val; if (isTypedArray(val)) { return dtype === "string" ? [] : [val.length]; } if (!Array.isArray(val)) { return []; } const shape = []; while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { shape.push(firstElem.length); firstElem = firstElem[0]; } if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { deepAssertShapeConsistency(val, shape, []); } return shape; } function deepAssertShapeConsistency(val, shape, indices) { indices = indices || []; if (!Array.isArray(val) && !isTypedArray(val)) { assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); return; } assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); const subShape = shape.slice(1); for (let i = 0; i < val.length; ++i) { deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); } } function assertDtype(expectedDtype, actualDType, argName, functionName) { if (expectedDtype == null) { return; } if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); } } function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { if (x instanceof Tensor) { assertDtype(parseAsDtype, x.dtype, argName, functionName); return x; } let inferredDtype = inferDtype(x); if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { inferredDtype = parseAsDtype; } assertDtype(parseAsDtype, inferredDtype, argName, functionName); if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { const type = x == null ? "null" : x.constructor.name; throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); } const inferredShape = inferShape(x, inferredDtype); if (!isTypedArray(x) && !Array.isArray(x)) { x = [x]; } const skipTypedArray = true; const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); return ENGINE.makeTensor(values, inferredShape, inferredDtype); } function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { if (!Array.isArray(arg)) { throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); } const tensors = arg; return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName), parseAsDtype); } // node_modules/@tensorflow/tfjs-core/dist/ops/operation.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const OP_SCOPE_SUFFIX = "__op"; function op(f) { const keys = Object.keys(f); if (keys.length !== 1) { throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); } let opName = keys[0]; const fn = f[opName]; if (opName.endsWith("_")) { opName = opName.substring(0, opName.length - 1); } opName = opName + OP_SCOPE_SUFFIX; const f2 = (...args) => { ENGINE.startScope(opName); try { const result = fn(...args); if (isPromise(result)) { console.error("Cannot return a Promise inside of tidy."); } ENGINE.endScope(result); return result; } catch (ex) { ENGINE.endScope(null); throw ex; } }; Object.defineProperty(f2, "name", {value: opName, configurable: true}); return f2; } // node_modules/@tensorflow/tfjs-core/dist/ops/complex.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function complex_(real6, imag6) { const $real = convertToTensor(real6, "real", "complex"); const $imag = convertToTensor(imag6, "imag", "complex"); assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); const forward = (backend3) => { return backend3.complex($real, $imag); }; const inputs = {real: $real, imag: $imag}; return ENGINE.runKernelFunc(forward, inputs, null, Complex); } const complex = op({complex_}); // node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function makeTensor(values, shape, inferredShape, dtype) { if (dtype == null) { dtype = inferDtype(values); } if (dtype === "complex64") { throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); } if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); } if (shape != null) { assertNonNegativeIntegerDimensions(shape); const providedSize = sizeFromShape(shape); const inferredSize = sizeFromShape(inferredShape); assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); for (let i = 0; i < inferredShape.length; ++i) { const inferred = inferredShape[i]; const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); } } if (!isTypedArray(values) && !Array.isArray(values)) { values = [values]; } shape = shape || inferredShape; values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); return ENGINE.makeTensor(values, shape, dtype); } // node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function tensor4(values, shape, dtype) { const inferredShape = inferShape(values, dtype); return makeTensor(values, shape, inferredShape, dtype); } // node_modules/@tensorflow/tfjs-core/dist/io/types.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const DTYPE_VALUE_SIZE_MAP = { float32: 4, float16: 2, int32: 4, uint16: 2, uint8: 1, bool: 1, complex64: 8 }; // node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const NUM_BYTES_STRING_LENGTH = 4; async function encodeWeights(tensors, group) { const specs = []; const dataPromises = []; const names = Array.isArray(tensors) ? tensors.map((tensor16) => tensor16.name) : Object.keys(tensors); for (let i = 0; i < names.length; ++i) { const name = names[i]; const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); } const spec = {name, shape: t.shape, dtype: t.dtype}; if (t.dtype === "string") { const utf8bytes = new Promise(async (resolve) => { const vals = await t.bytes(); const totalNumBytes = vals.reduce((p, c) => p + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; const bytes = new Uint8Array(totalNumBytes); let offset = 0; for (let i2 = 0; i2 < vals.length; i2++) { const val = vals[i2]; const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); bytes.set(bytesOfLength, offset); offset += NUM_BYTES_STRING_LENGTH; bytes.set(val, offset); offset += val.length; } resolve(bytes); }); dataPromises.push(utf8bytes); } else { dataPromises.push(t.data()); } if (group != null) { spec.group = group; } specs.push(spec); } const tensorValues = await Promise.all(dataPromises); return {data: concatenateTypedArrays(tensorValues), specs}; } function decodeWeights(buffer10, specs) { const out = {}; let float16Decode; let offset = 0; for (const spec of specs) { const name = spec.name; const dtype = spec.dtype; const shape = spec.shape; const size = sizeFromShape(shape); let values; if ("quantization" in spec) { const quantization = spec.quantization; if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { if (!("min" in quantization && "scale" in quantization)) { throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); } } else if (quantization.dtype === "float16") { if (dtype !== "float32") { throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); } } else { throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); } const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; const byteBuffer = buffer10.slice(offset, offset + size * quantizationSizeFactor); const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); if (dtype === "float32") { if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { values = new Float32Array(quantizedArray.length); for (let i = 0; i < quantizedArray.length; i++) { const v = quantizedArray[i]; values[i] = v * quantization.scale + quantization.min; } } else if (quantization.dtype === "float16") { if (float16Decode === void 0) { float16Decode = getFloat16Decoder(); } values = float16Decode(quantizedArray); } else { throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); } } else if (dtype === "int32") { if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); } values = new Int32Array(quantizedArray.length); for (let i = 0; i < quantizedArray.length; i++) { const v = quantizedArray[i]; values[i] = Math.round(v * quantization.scale + quantization.min); } } else { throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); } offset += size * quantizationSizeFactor; } else if (dtype === "string") { const size2 = sizeFromShape(spec.shape); values = []; for (let i = 0; i < size2; i++) { const byteLength = new Uint32Array(buffer10.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; offset += NUM_BYTES_STRING_LENGTH; const bytes = new Uint8Array(buffer10.slice(offset, offset + byteLength)); values.push(bytes); offset += byteLength; } } else { const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; const byteBuffer = buffer10.slice(offset, offset + size * dtypeFactor); if (dtype === "float32") { values = new Float32Array(byteBuffer); } else if (dtype === "int32") { values = new Int32Array(byteBuffer); } else if (dtype === "bool") { values = new Uint8Array(byteBuffer); } else if (dtype === "complex64") { values = new Float32Array(byteBuffer); const real6 = new Float32Array(values.length / 2); const image3 = new Float32Array(values.length / 2); for (let i = 0; i < real6.length; i++) { real6[i] = values[i * 2]; image3[i] = values[i * 2 + 1]; } const realTensor = tensor4(real6, shape, "float32"); const imageTensor = tensor4(image3, shape, "float32"); out[name] = complex(realTensor, imageTensor); realTensor.dispose(); imageTensor.dispose(); } else { throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); } offset += size * dtypeFactor; } if (dtype !== "complex64") { out[name] = tensor4(values, shape, dtype); } } return out; } function concatenateTypedArrays(xs) { if (xs === null) { throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); } let totalByteLength = 0; const normalizedXs = []; xs.forEach((x) => { totalByteLength += x.byteLength; normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); } }); const y = new Uint8Array(totalByteLength); let offset = 0; normalizedXs.forEach((x) => { y.set(new Uint8Array(x.buffer), offset); offset += x.byteLength; }); return y.buffer; } const useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); function stringByteLength(str) { if (useNodeBuffer) { return Buffer.byteLength(str); } return new Blob([str]).size; } function concatenateArrayBuffers(buffers) { if (buffers.length === 1) { return buffers[0]; } let totalByteLength = 0; buffers.forEach((buffer10) => { totalByteLength += buffer10.byteLength; }); const temp = new Uint8Array(totalByteLength); let offset = 0; buffers.forEach((buffer10) => { temp.set(new Uint8Array(buffer10), offset); offset += buffer10.byteLength; }); return temp.buffer; } function basename(path) { const SEPARATOR = "/"; path = path.trim(); while (path.endsWith(SEPARATOR)) { path = path.slice(0, path.length - 1); } const items = path.split(SEPARATOR); return items[items.length - 1]; } function getModelArtifactsInfoForJSON(modelArtifacts) { if (modelArtifacts.modelTopology instanceof ArrayBuffer) { throw new Error("Expected JSON model topology, received ArrayBuffer."); } return { dateSaved: new Date(), modelTopologyType: "JSON", modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength }; } function computeFloat16MantisaTable() { const convertMantissa = (i) => { let m = i << 13; let e = 0; while ((m & 8388608) === 0) { e -= 8388608; m <<= 1; } m &= ~8388608; e += 947912704; return m | e; }; const mantisaTable = new Uint32Array(2048); mantisaTable[0] = 0; for (let i = 1; i < 1024; i++) { mantisaTable[i] = convertMantissa(i); } for (let i = 1024; i < 2048; i++) { mantisaTable[i] = 939524096 + (i - 1024 << 13); } return mantisaTable; } function computeFloat16ExponentTable() { const exponentTable = new Uint32Array(64); exponentTable[0] = 0; exponentTable[31] = 1199570944; exponentTable[32] = 2147483648; exponentTable[63] = 3347054592; for (let i = 1; i < 31; i++) { exponentTable[i] = i << 23; } for (let i = 33; i < 63; i++) { exponentTable[i] = 2147483648 + (i - 32 << 23); } return exponentTable; } function computeFloat16OffsetTable() { const offsetTable = new Uint32Array(64); for (let i = 0; i < 64; i++) { offsetTable[i] = 1024; } offsetTable[0] = offsetTable[32] = 0; return offsetTable; } function getFloat16Decoder() { const mantisaTable = computeFloat16MantisaTable(); const exponentTable = computeFloat16ExponentTable(); const offsetTable = computeFloat16OffsetTable(); return (quantizedArray) => { const buffer10 = new ArrayBuffer(4 * quantizedArray.length); const bufferUint32View = new Uint32Array(buffer10); for (let index = 0; index < quantizedArray.length; index++) { const float16Bits = quantizedArray[index]; const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; bufferUint32View[index] = float32Bits; } return new Float32Array(buffer10); }; } // node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ class IORouterRegistry { constructor() { this.saveRouters = []; this.loadRouters = []; } static getInstance() { if (IORouterRegistry.instance == null) { IORouterRegistry.instance = new IORouterRegistry(); } return IORouterRegistry.instance; } static registerSaveRouter(saveRouter) { IORouterRegistry.getInstance().saveRouters.push(saveRouter); } static registerLoadRouter(loadRouter) { IORouterRegistry.getInstance().loadRouters.push(loadRouter); } static getSaveHandlers(url) { return IORouterRegistry.getHandlers(url, "save"); } static getLoadHandlers(url, loadOptions) { return IORouterRegistry.getHandlers(url, "load", loadOptions); } static getHandlers(url, handlerType, loadOptions) { const validHandlers = []; const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; routers.forEach((router) => { const handler = router(url, loadOptions); if (handler !== null) { validHandlers.push(handler); } }); return validHandlers; } } const registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); const registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); const getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); const getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); // node_modules/@tensorflow/tfjs-core/dist/io/model_management.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const URL_SCHEME_SUFFIX = "://"; class ModelStoreManagerRegistry { constructor() { this.managers = {}; } static getInstance() { if (ModelStoreManagerRegistry.instance == null) { ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); } return ModelStoreManagerRegistry.instance; } static registerManager(scheme, manager) { assert(scheme != null, () => "scheme must not be undefined or null."); if (scheme.endsWith(URL_SCHEME_SUFFIX)) { scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); } assert(scheme.length > 0, () => "scheme must not be an empty string."); const registry = ModelStoreManagerRegistry.getInstance(); assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); registry.managers[scheme] = manager; } static getManager(scheme) { const manager = this.getInstance().managers[scheme]; if (manager == null) { throw new Error(`Cannot find model manager for scheme '${scheme}'`); } return manager; } static getSchemes() { return Object.keys(this.getInstance().managers); } } function parseURL(url) { if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); } return { scheme: url.split(URL_SCHEME_SUFFIX)[0], path: url.split(URL_SCHEME_SUFFIX)[1] }; } async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); const loadHandler = loadHandlers[0]; const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); const saveHandler = saveHandlers[0]; const sourceScheme = parseURL(sourceURL).scheme; const sourcePath = parseURL(sourceURL).path; const sameMedium = sourceScheme === parseURL(sourceURL).scheme; const modelArtifacts = await loadHandler.load(); if (deleteSource && sameMedium) { await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); } const saveResult = await saveHandler.save(modelArtifacts); if (deleteSource && !sameMedium) { await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); } return saveResult.modelArtifactsInfo; } async function listModels() { const schemes = ModelStoreManagerRegistry.getSchemes(); const out = {}; for (const scheme of schemes) { const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); for (const path in schemeOut) { const url = scheme + URL_SCHEME_SUFFIX + path; out[url] = schemeOut[path]; } } return out; } async function removeModel(url) { const schemeAndPath = parseURL(url); const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); return manager.removeModel(schemeAndPath.path); } async function copyModel(sourceURL, destURL) { const deleteSource = false; return cloneModelInternal(sourceURL, destURL, deleteSource); } async function moveModel(sourceURL, destURL) { const deleteSource = true; return cloneModelInternal(sourceURL, destURL, deleteSource); } // node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js /** * @license * Copyright 2020 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function buffer(shape, dtype = "float32", values) { dtype = dtype || "float32"; assertNonNegativeIntegerDimensions(shape); return new TensorBuffer(shape, dtype, values); } // node_modules/@tensorflow/tfjs-core/dist/ops/cast.js /** * @license * Copyright 2020 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function cast_(x, dtype) { const $x = convertToTensor(x, "x", "cast"); if (!isValidDtype(dtype)) { throw new Error(`Failed to cast to unknown dtype ${dtype}`); } if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { throw new Error("Only strings can be casted to strings"); } const inputs = {x: $x}; const attrs = {dtype}; return ENGINE.runKernelFunc((backend3) => backend3.cast($x, dtype), inputs, null, Cast, attrs); } const cast = op({cast_}); // node_modules/@tensorflow/tfjs-core/dist/ops/clone.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function clone_(x) { const $x = convertToTensor(x, "x", "clone", null); const forward = () => ENGINE.makeTensorFromDataId($x.dataId, $x.shape, $x.dtype); const inputs = {x: $x}; return ENGINE.runKernelFunc(forward, inputs, null, Identity); } const clone = op({clone_}); // node_modules/@tensorflow/tfjs-core/dist/ops/print.js /** * @license * Copyright 2020 Google Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function print2(x, verbose = false) { console.log(x.toString(verbose)); } // node_modules/@tensorflow/tfjs-core/dist/io/io.js const io_exports = {}; __export(io_exports, { browserFiles: () => browserFiles, browserHTTPRequest: () => browserHTTPRequest, concatenateArrayBuffers: () => concatenateArrayBuffers, copyModel: () => copyModel, decodeWeights: () => decodeWeights, encodeWeights: () => encodeWeights, fromMemory: () => fromMemory, getLoadHandlers: () => getLoadHandlers, getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, getSaveHandlers: () => getSaveHandlers, http: () => http, isHTTPScheme: () => isHTTPScheme, listModels: () => listModels, loadWeights: () => loadWeights, moveModel: () => moveModel, registerLoadRouter: () => registerLoadRouter, registerSaveRouter: () => registerSaveRouter, removeModel: () => removeModel, weightsLoaderFactory: () => weightsLoaderFactory, withSaveHandler: () => withSaveHandler }); // node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const DEFAULT_FILE_NAME_PREFIX = "model"; const DEFAULT_JSON_EXTENSION_NAME = ".json"; const DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; function defer(f) { return new Promise((resolve) => setTimeout(resolve)).then(f); } class BrowserDownloads { constructor(fileNamePrefix) { if (!env().getBool("IS_BROWSER")) { throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); } if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); } if (fileNamePrefix == null || fileNamePrefix.length === 0) { fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; } this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; } async save(modelArtifacts) { if (typeof document === "undefined") { throw new Error("Browser downloads are not supported in this environment since `document` is not present"); } const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], {type: "application/octet-stream"})); if (modelArtifacts.modelTopology instanceof ArrayBuffer) { throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); } else { const weightsManifest = [{ paths: ["./" + this.weightDataFileName], weights: modelArtifacts.weightSpecs }]; const modelTopologyAndWeightManifest = { modelTopology: modelArtifacts.modelTopology, format: modelArtifacts.format, generatedBy: modelArtifacts.generatedBy, convertedBy: modelArtifacts.convertedBy, weightsManifest }; const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: "application/json"})); const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; jsonAnchor.download = this.modelTopologyFileName; jsonAnchor.href = modelTopologyAndWeightManifestURL; await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); if (modelArtifacts.weightData != null) { const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; weightDataAnchor.download = this.weightDataFileName; weightDataAnchor.href = weightsURL; await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); } return {modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts)}; } } } BrowserDownloads.URL_SCHEME = "downloads://"; class BrowserFiles { constructor(files) { if (files == null || files.length < 1) { throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); } this.files = files; } async load() { const jsonFile = this.files[0]; const weightFiles = this.files.slice(1); return new Promise((resolve, reject) => { const jsonReader = new FileReader(); jsonReader.onload = (event) => { const modelJSON = JSON.parse(event.target.result); const modelTopology = modelJSON.modelTopology; if (modelTopology == null) { reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); return; } if (weightFiles.length === 0) { resolve({modelTopology}); } const weightsManifest = modelJSON.weightsManifest; if (weightsManifest == null) { reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); return; } let pathToFile; try { pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); } catch (err) { reject(err); return; } const weightSpecs = []; const paths = []; const perFileBuffers = []; weightsManifest.forEach((weightsGroup) => { weightsGroup.paths.forEach((path) => { paths.push(path); perFileBuffers.push(null); }); weightSpecs.push(...weightsGroup.weights); }); weightsManifest.forEach((weightsGroup) => { weightsGroup.paths.forEach((path) => { const weightFileReader = new FileReader(); weightFileReader.onload = (event2) => { const weightData = event2.target.result; const index = paths.indexOf(path); perFileBuffers[index] = weightData; if (perFileBuffers.indexOf(null) === -1) { resolve({ modelTopology, weightSpecs, weightData: concatenateArrayBuffers(perFileBuffers), format: modelJSON.format, generatedBy: modelJSON.generatedBy, convertedBy: modelJSON.convertedBy, userDefinedMetadata: modelJSON.userDefinedMetadata }); } }; weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); weightFileReader.readAsArrayBuffer(pathToFile[path]); }); }); }; jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); jsonReader.readAsText(jsonFile); }); } checkManifestAndWeightFiles(manifest, files) { const basenames = []; const fileNames = files.map((file) => basename(file.name)); const pathToFile = {}; for (const group of manifest) { group.paths.forEach((path) => { const pathBasename = basename(path); if (basenames.indexOf(pathBasename) !== -1) { throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); } basenames.push(pathBasename); if (fileNames.indexOf(pathBasename) === -1) { throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); } else { pathToFile[path] = files[fileNames.indexOf(pathBasename)]; } }); } if (basenames.length !== files.length) { throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); } return pathToFile; } } const browserDownloadsRouter = (url) => { if (!env().getBool("IS_BROWSER")) { return null; } else { if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); } else { return null; } } }; IORouterRegistry.registerSaveRouter(browserDownloadsRouter); function browserDownloads(fileNamePrefix = "model") { return new BrowserDownloads(fileNamePrefix); } function browserFiles(files) { return new BrowserFiles(files); } // node_modules/@tensorflow/tfjs-core/dist/io/progress.js /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { checkPromises(promises); startFraction = startFraction == null ? 0 : startFraction; endFraction = endFraction == null ? 1 : endFraction; checkFraction(startFraction, endFraction); let resolvedPromise = 0; const registerMonitor = (promise) => { promise.then((value) => { const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); onProgress(fraction); return value; }); return promise; }; function checkPromises(promises2) { assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); } function checkFraction(startFraction2, endFraction2) { assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); } return Promise.all(promises.map(registerMonitor)); } // node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { if (loadOptions == null) { loadOptions = {}; } const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, {isBinary: true})); const fetchStartFraction = 0; const fetchEndFraction = 0.5; const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); const bufferPromises = responses.map((response) => response.arrayBuffer()); const bufferStartFraction = 0.5; const bufferEndFraction = 1; const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); return buffers; } async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, {requestInit}); const loadWeights2 = weightsLoaderFactory(fetchWeights); return loadWeights2(manifest, filePathPrefix, weightNames); } function weightsLoaderFactory(fetchWeightsFunction) { return async (manifest, filePathPrefix = "", weightNames) => { const groupIndicesToFetchMap = manifest.map(() => false); const groupWeightsToFetch = {}; const weightsFound = weightNames != null ? weightNames.map(() => false) : []; const allManifestWeightNames = []; manifest.forEach((manifestGroupConfig, groupIndex) => { let groupOffset = 0; manifestGroupConfig.weights.forEach((weightsEntry) => { const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); const enqueueWeightsForFetchingFn = () => { groupIndicesToFetchMap[groupIndex] = true; if (groupWeightsToFetch[groupIndex] == null) { groupWeightsToFetch[groupIndex] = []; } groupWeightsToFetch[groupIndex].push({ manifestEntry: weightsEntry, groupOffset, sizeBytes: weightsBytes }); }; if (weightNames != null) { weightNames.forEach((weightName, weightIndex) => { if (weightName === weightsEntry.name) { enqueueWeightsForFetchingFn(); weightsFound[weightIndex] = true; } }); } else { enqueueWeightsForFetchingFn(); } allManifestWeightNames.push(weightsEntry.name); groupOffset += weightsBytes; }); }); if (!weightsFound.every((found) => found)) { const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); } const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { if (shouldFetch) { accumulator.push(i); } return accumulator; }, []); const fetchUrls = []; groupIndicesToFetch.forEach((i) => { manifest[i].paths.forEach((filepath) => { const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; fetchUrls.push(fetchUrl); }); }); const buffers = await fetchWeightsFunction(fetchUrls); const weightsTensorMap = {}; let bufferIndexOffset = 0; groupIndicesToFetch.forEach((i) => { const numBuffers = manifest[i].paths.length; let groupBytes = 0; for (let i2 = 0; i2 < numBuffers; i2++) { groupBytes += buffers[bufferIndexOffset + i2].byteLength; } const groupBuffer = new ArrayBuffer(groupBytes); const groupByteBuffer = new Uint8Array(groupBuffer); let groupBufferOffset = 0; for (let i2 = 0; i2 < numBuffers; i2++) { const buffer10 = new Uint8Array(buffers[bufferIndexOffset + i2]); groupByteBuffer.set(buffer10, groupBufferOffset); groupBufferOffset += buffer10.byteLength; } const weightsEntries = groupWeightsToFetch[i]; weightsEntries.forEach((weightsEntry) => { const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); for (const name in nameToTensorMap) { weightsTensorMap[name] = nameToTensorMap[name]; } }); bufferIndexOffset += numBuffers; }); return weightsTensorMap; }; } // node_modules/@tensorflow/tfjs-core/dist/io/http.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ const OCTET_STREAM_MIME_TYPE = "application/octet-stream"; const JSON_TYPE = "application/json"; class HTTPRequest { constructor(path, loadOptions) { this.DEFAULT_METHOD = "POST"; if (loadOptions == null) { loadOptions = {}; } this.weightPathPrefix = loadOptions.weightPathPrefix; this.onProgress = loadOptions.onProgress; this.weightUrlConverter = loadOptions.weightUrlConverter; if (loadOptions.fetchFunc != null) { assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); this.fetch = loadOptions.fetchFunc; } else { this.fetch = env().platform.fetch; } assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); if (Array.isArray(path)) { assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); } this.path = path; if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { throw new Error("requestInit is expected to have no pre-existing body, but has one."); } this.requestInit = loadOptions.requestInit || {}; } async save(modelArtifacts) { if (modelArtifacts.modelTopology instanceof ArrayBuffer) { throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); } const init2 = Object.assign({method: this.DEFAULT_METHOD}, this.requestInit); init2.body = new FormData(); const weightsManifest = [{ paths: ["./model.weights.bin"], weights: modelArtifacts.weightSpecs }]; const modelTopologyAndWeightManifest = { modelTopology: modelArtifacts.modelTopology, format: modelArtifacts.format, generatedBy: modelArtifacts.generatedBy, convertedBy: modelArtifacts.convertedBy, userDefinedMetadata: modelArtifacts.userDefinedMetadata, weightsManifest }; init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: JSON_TYPE}), "model.json"); if (modelArtifacts.weightData != null) { init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], {type: OCTET_STREAM_MIME_TYPE}), "model.weights.bin"); } const response = await this.fetch(this.path, init2); if (response.ok) { return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), responses: [response] }; } else { throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); } } async load() { const modelConfigRequest = await this.fetch(this.path, this.requestInit); if (!modelConfigRequest.ok) { throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); } let modelConfig; try { modelConfig = await modelConfigRequest.json(); } catch (e) { let message = `Failed to parse model JSON of response from ${this.path}.`; if (this.path.endsWith(".pb")) { message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; } else { message += " Please make sure the server is serving valid JSON for this request."; } throw new Error(message); } const modelTopology = modelConfig.modelTopology; const weightsManifest = modelConfig.weightsManifest; const generatedBy = modelConfig.generatedBy; const convertedBy = modelConfig.convertedBy; const format = modelConfig.format; const userDefinedMetadata = modelConfig.userDefinedMetadata; if (modelTopology == null && weightsManifest == null) { throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); } let weightSpecs; let weightData; if (weightsManifest != null) { const results = await this.loadWeights(weightsManifest); [weightSpecs, weightData] = results; } const artifacts = { modelTopology, weightSpecs, weightData, userDefinedMetadata, generatedBy, convertedBy, format }; const initializer = modelConfig.modelInitializer; if (initializer) { artifacts.modelInitializer = initializer; } return artifacts; } async loadWeights(weightsManifest) { const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; const [prefix, suffix] = parseUrl(weightPath); const pathPrefix = this.weightPathPrefix || prefix; const weightSpecs = []; for (const entry of weightsManifest) { weightSpecs.push(...entry.weights); } const fetchURLs = []; const urlPromises = []; for (const weightsGroup of weightsManifest) { for (const path of weightsGroup.paths) { if (this.weightUrlConverter != null) { urlPromises.push(this.weightUrlConverter(path)); } else { fetchURLs.push(pathPrefix + path + suffix); } } } if (this.weightUrlConverter) { fetchURLs.push(...await Promise.all(urlPromises)); } const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { requestInit: this.requestInit, fetchFunc: this.fetch, onProgress: this.onProgress }); return [weightSpecs, concatenateArrayBuffers(buffers)]; } } HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; function parseUrl(url) { const lastSlash = url.lastIndexOf("/"); const lastSearchParam = url.lastIndexOf("?"); const prefix = url.substring(0, lastSlash); const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; return [prefix + "/", suffix]; } function isHTTPScheme(url) { return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; } const httpRouter = (url, loadOptions) => { if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { return null; } else { let isHTTP = true; if (Array.isArray(url)) { isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); } else { isHTTP = isHTTPScheme(url); } if (isHTTP) { return http(url, loadOptions); } } return null; }; IORouterRegistry.registerSaveRouter(httpRouter); IORouterRegistry.registerLoadRouter(httpRouter); function http(path, loadOptions) { return new HTTPRequest(path, loadOptions); } function browserHTTPRequest(path, loadOptions) { return http(path, loadOptions); } // node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ class PassthroughLoader { constructor(modelArtifacts) { this.modelArtifacts = modelArtifacts; } async load() { return this.modelArtifacts; } } class PassthroughSaver { constructor(saveHandler) { this.saveHandler = saveHandler; } async save(modelArtifacts) { return this.saveHandler(modelArtifacts); } } function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { if (arguments.length === 1) { const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; if (isModelArtifacts) { return new PassthroughLoader(modelArtifacts); } else { console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); return new PassthroughLoader({modelTopology: modelArtifacts}); } } else { console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); return new PassthroughLoader({ modelTopology: modelArtifacts, weightSpecs, weightData, trainingConfig }); } } function withSaveHandler(saveHandler) { return new PassthroughSaver(saveHandler); } // node_modules/@tensorflow/tfjs-core/dist/io/io.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ // node_modules/@tensorflow/tfjs-core/dist/math.js const math_exports = {}; __export(math_exports, { confusionMatrix: () => confusionMatrix }); // node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function reshape_(x, shape) { const $x = convertToTensor(x, "x", "reshape", null); const inputs = {x: $x}; const attrs = {shape}; const forward = (backend3, save) => { shape = inferFromImplicitShape(shape, $x.size); assert($x.size === sizeFromShape(shape), () => "new shape and old shape must have the same number of elements."); save([$x]); return backend3.reshape($x, shape); }; return ENGINE.runKernelFunc(forward, inputs, null, Reshape, attrs); } const reshape = op({reshape_}); // node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function matMul_(a, b, transposeA = false, transposeB = false) { let $a = convertToTensor(a, "a", "matMul"); let $b = convertToTensor(b, "b", "matMul"); [$a, $b] = makeTypesMatch($a, $b); const forward = (backend3, save) => { save([$a, $b]); const innerShapeA = transposeA ? $a.shape[$a.rank - 2] : $a.shape[$a.rank - 1]; const innerShapeB = transposeB ? $b.shape[$b.rank - 1] : $b.shape[$b.rank - 2]; const outerShapeA = transposeA ? $a.shape[$a.rank - 1] : $a.shape[$a.rank - 2]; const outerShapeB = transposeB ? $b.shape[$b.rank - 2] : $b.shape[$b.rank - 1]; const outerDimsA = $a.shape.slice(0, -2); const outerDimsB = $b.shape.slice(0, -2); const batchDimA = sizeFromShape(outerDimsA); const batchDimB = sizeFromShape(outerDimsB); const batchDimsCompatible = batchDimA === batchDimB || batchDimA === 1 || batchDimB === 1; assert($a.rank >= 2 && $b.rank >= 2 && batchDimsCompatible, () => `Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${outerDimsA}) and (${outerDimsB}).`); assert(innerShapeA === innerShapeB, () => `Error in matMul: inner shapes (${innerShapeA}) and (${innerShapeB}) of Tensors with shapes ${$a.shape} and ${$b.shape} and transposeA=${transposeA} and transposeB=${transposeB} must match.`); const outShapeOuterDims = batchDimA > batchDimB ? outerDimsA : outerDimsB; const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]); const a3D = transposeA ? reshape($a, [batchDimA, innerShapeA, outerShapeA]) : reshape($a, [batchDimA, outerShapeA, innerShapeA]); const b3D = transposeB ? reshape($b, [batchDimB, outerShapeB, innerShapeB]) : reshape($b, [batchDimB, innerShapeB, outerShapeB]); const res3d = backend3.batchMatMul(a3D, b3D, transposeA, transposeB); return reshape(res3d, outShape); }; const inputs = {a: $a, b: $b}; const attrs = {transposeA, transposeB}; return ENGINE.runKernelFunc(forward, inputs, null, BatchMatMul, attrs); } const matMul = op({matMul_}); // node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js /** * @license * Copyright 2020 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function oneHot_(indices, depth, onValue = 1, offValue = 0) { if (depth < 2) { throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); } const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); const outShape = [...$indices.shape, depth]; const forward = (backend3, save) => { save([$indices]); return reshape(backend3.oneHot(reshape($indices, [$indices.size]), depth, onValue, offValue), outShape); }; const inputs = {indices: $indices}; const attrs = {depth, onValue, offValue}; return ENGINE.runKernelFunc(forward, inputs, null, OneHot, attrs); } const oneHot = op({oneHot_}); // node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function transpose_(x, perm) { const $x = convertToTensor(x, "x", "transpose"); if (perm == null) { perm = $x.shape.map((s, i) => i).reverse(); } assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); perm.forEach((axis) => { assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); }); if ($x.rank <= 1) { return $x.clone(); } const inputs = {x: $x}; const attrs = {perm}; return ENGINE.runKernelFunc((backend3) => backend3.transpose($x, perm), inputs, null, Transpose, attrs); } const transpose = op({transpose_}); // node_modules/@tensorflow/tfjs-core/dist/ops/confusion_matrix.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function confusionMatrix_(labels, predictions, numClasses) { const $labels = convertToTensor(labels, "labels", "confusionMatrix"); const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); const oneHotLabelsT = transpose(oneHotLabels); const product = matMul(oneHotLabelsT, oneHotPredictions); return cast(product, "int32"); } const confusionMatrix = op({confusionMatrix_}); // node_modules/@tensorflow/tfjs-core/dist/math.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ // node_modules/@tensorflow/tfjs-core/dist/ops/browser.js const browser_exports = {}; __export(browser_exports, { fromPixels: () => fromPixels, toPixels: () => toPixels }); // node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js /** * @license * Copyright 2018 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ function tensor3d(values, shape, dtype) { assertNonNull(values); if (shape != null && shape.length !== 3) { throw new Error("tensor3d() requires shape to have three numbers"); } const inferredShape = inferShape(values, dtype); if (inferredShape.length !== 3 && inferredShape.length !== 1) { throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); } if (inferredShape.length === 1 && shape == null) { throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); } return makeTensor(values, shape, inferredShape, dtype); } // node_modules/@tensorflow/tfjs-core/dist/ops/browser.js /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ let fromPixels2DContext; function fromPixels_(pixels, numChannels = 3) { if (numChannels > 4) { throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); } if (pixels == null) { throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); } let isPixelData = false; let isImageData = false; let isVideo = false; let isImage = false; let isCanvasLike = false; if (pixels.data instanceof Uint8Array) { isPixelData = true; } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { isImageData = true; } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { isVideo = true; } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { isImage = true; } else if (pixels.getContext != null) { isCanvasLike = true; } else { throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); } if (isVideo) { const HAVE_CURRENT_DATA_READY_STATE = 2; if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the