From c15e6a5ba40e42dca03c816071c6da3e07623bdc Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 31 Mar 2021 07:01:22 -0400 Subject: [PATCH] enable minify --- .gitignore | 2 +- CHANGELOG.md | 4 +- dist/face-api.esm-nobundle.js | 4539 +- dist/face-api.esm-nobundle.js.map | 6 +- dist/face-api.esm.js | 77558 +------------------ dist/face-api.esm.js.map | 6 +- dist/face-api.js | 77812 +------------------- dist/face-api.js.map | 6 +- dist/face-api.node-cpu.js | 4678 +- dist/face-api.node-cpu.js.map | 6 +- dist/face-api.node-gpu.js | 4678 +- dist/face-api.node-gpu.js.map | 6 +- dist/face-api.node.js | 4678 +- dist/face-api.node.js.map | 6 +- dist/tfjs.esm.js | 75646 +------------------ dist/tfjs.esm.js.map | 2 +- package.json | 10 +- server/build.js | 9 +- server/serve.js | 0 typedoc/assets/css/main.css | 2 +- typedoc/classes/detectallfacestask.html | 8 +- typedoc/classes/detectsinglefacetask.html | 8 +- typedoc/index.html | 6 +- 23 files changed, 4526 insertions(+), 245150 deletions(-) mode change 100755 => 100644 server/serve.js diff --git a/.gitignore b/.gitignore index 12b440b..611b728 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ node_modules pnpm-lock.yaml -test + diff --git a/CHANGELOG.md b/CHANGELOG.md index 75f6026..9b0303f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # @vladmandic/face-api -Version: **1.1.5** +Version: **1.1.6** Description: **FaceAPI: AI-powered Face Detection, Description & Recognition using Tensorflow/JS** Author: **Vladimir Mandic ** @@ -9,7 +9,7 @@ Repository: **** ## Changelog -### **HEAD -> master** 2021/03/25 mandic00@live.com +### **1.1.6** 2021/03/26 mandic00@live.com ### **1.1.5** 2021/03/23 mandic00@live.com diff --git a/dist/face-api.esm-nobundle.js b/dist/face-api.esm-nobundle.js index fad594f..44c6637 100644 --- a/dist/face-api.esm-nobundle.js +++ b/dist/face-api.esm-nobundle.js @@ -5,4542 +5,5 @@ author: ' */ -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, all) => { - for (var name in all) - __defProp(target, name, {get: all[name], enumerable: true}); -}; -var __exportStar = (target, module, desc) => { - if (module && 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) => { - return __exportStar(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); -}; - -// dist/tfjs.esm.js -import * as dist_star from "@tensorflow/tfjs/dist/index.js"; -import * as tfjs_backend_wasm_star from "@tensorflow/tfjs-backend-wasm"; -var require_tfjs_esm = __commonJS((exports) => { - __markAsModule(exports); - __exportStar(exports, dist_star); - __exportStar(exports, tfjs_backend_wasm_star); -}); - -// src/env/isNodejs.ts -var require_isNodejs = __commonJS((exports, module) => { - __markAsModule(exports); - __export(exports, { - isNodejs: () => isNodejs2 - }); - function isNodejs2() { - return typeof global === "object" && true && typeof module !== "undefined" && typeof process !== "undefined" && !!process.version; - } -}); - -// src/index.ts -var tf42 = require_tfjs_esm(); - -// src/draw/index.ts -var draw_exports = {}; -__export(draw_exports, { - AnchorPosition: () => AnchorPosition, - DrawBox: () => DrawBox, - DrawBoxOptions: () => DrawBoxOptions, - DrawFaceLandmarks: () => DrawFaceLandmarks, - DrawFaceLandmarksOptions: () => DrawFaceLandmarksOptions, - DrawTextField: () => DrawTextField, - DrawTextFieldOptions: () => DrawTextFieldOptions, - drawContour: () => drawContour, - drawDetections: () => drawDetections, - drawFaceExpressions: () => drawFaceExpressions, - drawFaceLandmarks: () => drawFaceLandmarks -}); - -// src/draw/drawContour.ts -function drawContour(ctx, points, isClosed = false) { - ctx.beginPath(); - points.slice(1).forEach(({x, y}, prevIdx) => { - const from = points[prevIdx]; - ctx.moveTo(from.x, from.y); - ctx.lineTo(x, y); - }); - if (isClosed) { - const from = points[points.length - 1]; - const to = points[0]; - if (!from || !to) { - return; - } - ctx.moveTo(from.x, from.y); - ctx.lineTo(to.x, to.y); - } - ctx.stroke(); -} - -// src/utils/index.ts -var utils_exports = {}; -__export(utils_exports, { - computeReshapedDimensions: () => computeReshapedDimensions, - getCenterPoint: () => getCenterPoint, - isDimensions: () => isDimensions, - isEven: () => isEven, - isFloat: () => isFloat, - isTensor: () => isTensor, - isTensor1D: () => isTensor1D, - isTensor2D: () => isTensor2D, - isTensor3D: () => isTensor3D, - isTensor4D: () => isTensor4D, - isValidNumber: () => isValidNumber, - isValidProbablitiy: () => isValidProbablitiy, - range: () => range, - round: () => round -}); -var tf = require_tfjs_esm(); - -// src/classes/Dimensions.ts -var Dimensions = class { - constructor(width, height) { - if (!isValidNumber(width) || !isValidNumber(height)) { - throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width, height})}`); - } - this._width = width; - this._height = height; - } - get width() { - return this._width; - } - get height() { - return this._height; - } - reverse() { - return new Dimensions(1 / this.width, 1 / this.height); - } -}; - -// src/utils/index.ts -function isTensor(tensor2, dim) { - return tensor2 instanceof tf.Tensor && tensor2.shape.length === dim; -} -function isTensor1D(tensor2) { - return isTensor(tensor2, 1); -} -function isTensor2D(tensor2) { - return isTensor(tensor2, 2); -} -function isTensor3D(tensor2) { - return isTensor(tensor2, 3); -} -function isTensor4D(tensor2) { - return isTensor(tensor2, 4); -} -function isFloat(num) { - return num % 1 !== 0; -} -function isEven(num) { - return num % 2 === 0; -} -function round(num, prec = 2) { - const f = 10 ** prec; - return Math.floor(num * f) / f; -} -function isDimensions(obj) { - return obj && obj.width && obj.height; -} -function computeReshapedDimensions({width, height}, inputSize) { - const scale2 = inputSize / Math.max(height, width); - return new Dimensions(Math.round(width * scale2), Math.round(height * scale2)); -} -function getCenterPoint(pts) { - return pts.reduce((sum, pt) => sum.add(pt), new Point(0, 0)).div(new Point(pts.length, pts.length)); -} -function range(num, start, step) { - return Array(num).fill(0).map((_, i) => start + i * step); -} -function isValidNumber(num) { - return !!num && num !== Infinity && num !== -Infinity && !Number.isNaN(num) || num === 0; -} -function isValidProbablitiy(num) { - return isValidNumber(num) && num >= 0 && num <= 1; -} - -// src/classes/Point.ts -var Point = class { - constructor(x, y) { - this._x = x; - this._y = y; - } - get x() { - return this._x; - } - get y() { - return this._y; - } - add(pt) { - return new Point(this.x + pt.x, this.y + pt.y); - } - sub(pt) { - return new Point(this.x - pt.x, this.y - pt.y); - } - mul(pt) { - return new Point(this.x * pt.x, this.y * pt.y); - } - div(pt) { - return new Point(this.x / pt.x, this.y / pt.y); - } - abs() { - return new Point(Math.abs(this.x), Math.abs(this.y)); - } - magnitude() { - return Math.sqrt(this.x ** 2 + this.y ** 2); - } - floor() { - return new Point(Math.floor(this.x), Math.floor(this.y)); - } -}; - -// src/classes/Box.ts -var Box = class { - static isRect(rect) { - return !!rect && [rect.x, rect.y, rect.width, rect.height].every(isValidNumber); - } - static assertIsValidBox(box, callee, allowNegativeDimensions = false) { - if (!Box.isRect(box)) { - throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`); - } - if (!allowNegativeDimensions && (box.width < 0 || box.height < 0)) { - throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`); - } - } - constructor(_box, allowNegativeDimensions = true) { - const box = _box || {}; - const isBbox = [box.left, box.top, box.right, box.bottom].every(isValidNumber); - const isRect = [box.x, box.y, box.width, box.height].every(isValidNumber); - if (!isRect && !isBbox) { - throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`); - } - const [x, y, width, height] = isRect ? [box.x, box.y, box.width, box.height] : [box.left, box.top, box.right - box.left, box.bottom - box.top]; - Box.assertIsValidBox({ - x, - y, - width, - height - }, "Box.constructor", allowNegativeDimensions); - this._x = x; - this._y = y; - this._width = width; - this._height = height; - } - get x() { - return this._x; - } - get y() { - return this._y; - } - get width() { - return this._width; - } - get height() { - return this._height; - } - get left() { - return this.x; - } - get top() { - return this.y; - } - get right() { - return this.x + this.width; - } - get bottom() { - return this.y + this.height; - } - get area() { - return this.width * this.height; - } - get topLeft() { - return new Point(this.left, this.top); - } - get topRight() { - return new Point(this.right, this.top); - } - get bottomLeft() { - return new Point(this.left, this.bottom); - } - get bottomRight() { - return new Point(this.right, this.bottom); - } - round() { - const [x, y, width, height] = [this.x, this.y, this.width, this.height].map((val) => Math.round(val)); - return new Box({ - x, - y, - width, - height - }); - } - floor() { - const [x, y, width, height] = [this.x, this.y, this.width, this.height].map((val) => Math.floor(val)); - return new Box({ - x, - y, - width, - height - }); - } - toSquare() { - let { - x, - y, - width, - height - } = this; - const diff = Math.abs(width - height); - if (width < height) { - x -= diff / 2; - width += diff; - } - if (height < width) { - y -= diff / 2; - height += diff; - } - return new Box({x, y, width, height}); - } - rescale(s) { - const scaleX = isDimensions(s) ? s.width : s; - const scaleY = isDimensions(s) ? s.height : s; - return new Box({ - x: this.x * scaleX, - y: this.y * scaleY, - width: this.width * scaleX, - height: this.height * scaleY - }); - } - pad(padX, padY) { - const [x, y, width, height] = [ - this.x - padX / 2, - this.y - padY / 2, - this.width + padX, - this.height + padY - ]; - return new Box({ - x, - y, - width, - height - }); - } - clipAtImageBorders(imgWidth, imgHeight) { - const {x, y, right, bottom} = this; - const clippedX = Math.max(x, 0); - const clippedY = Math.max(y, 0); - const newWidth = right - clippedX; - const newHeight = bottom - clippedY; - const clippedWidth = Math.min(newWidth, imgWidth - clippedX); - const clippedHeight = Math.min(newHeight, imgHeight - clippedY); - return new Box({ - x: clippedX, - y: clippedY, - width: clippedWidth, - height: clippedHeight - }).floor(); - } - shift(sx, sy) { - const {width, height} = this; - const x = this.x + sx; - const y = this.y + sy; - return new Box({ - x, - y, - width, - height - }); - } - padAtBorders(imageHeight, imageWidth) { - const w = this.width + 1; - const h = this.height + 1; - const dx = 1; - const dy = 1; - let edx = w; - let edy = h; - let x = this.left; - let y = this.top; - let ex = this.right; - let ey = this.bottom; - if (ex > imageWidth) { - edx = -ex + imageWidth + w; - ex = imageWidth; - } - if (ey > imageHeight) { - edy = -ey + imageHeight + h; - ey = imageHeight; - } - if (x < 1) { - edy = 2 - x; - x = 1; - } - if (y < 1) { - edy = 2 - y; - y = 1; - } - return { - dy, - edy, - dx, - edx, - y, - ey, - x, - ex, - w, - h - }; - } - calibrate(region) { - return new Box({ - left: this.left + region.left * this.width, - top: this.top + region.top * this.height, - right: this.right + region.right * this.width, - bottom: this.bottom + region.bottom * this.height - }).toSquare().round(); - } -}; - -// src/classes/BoundingBox.ts -var BoundingBox = class extends Box { - constructor(left, top, right, bottom, allowNegativeDimensions = false) { - super({ - left, - top, - right, - bottom - }, allowNegativeDimensions); - } -}; - -// src/classes/ObjectDetection.ts -var ObjectDetection = class { - constructor(score, classScore, className, relativeBox, imageDims) { - this._imageDims = new Dimensions(imageDims.width, imageDims.height); - this._score = score; - this._classScore = classScore; - this._className = className; - this._box = new Box(relativeBox).rescale(this._imageDims); - } - get score() { - return this._score; - } - get classScore() { - return this._classScore; - } - get className() { - return this._className; - } - get box() { - return this._box; - } - get imageDims() { - return this._imageDims; - } - get imageWidth() { - return this.imageDims.width; - } - get imageHeight() { - return this.imageDims.height; - } - get relativeBox() { - return new Box(this._box).rescale(this.imageDims.reverse()); - } - forSize(width, height) { - return new ObjectDetection(this.score, this.classScore, this.className, this.relativeBox, {width, height}); - } -}; - -// src/classes/FaceDetection.ts -var FaceDetection = class extends ObjectDetection { - constructor(score, relativeBox, imageDims) { - super(score, score, "", relativeBox, imageDims); - } - forSize(width, height) { - const {score, relativeBox, imageDims} = super.forSize(width, height); - return new FaceDetection(score, relativeBox, imageDims); - } -}; - -// src/ops/iou.ts -function iou(box1, box2, isIOU = true) { - const width = Math.max(0, Math.min(box1.right, box2.right) - Math.max(box1.left, box2.left)); - const height = Math.max(0, Math.min(box1.bottom, box2.bottom) - Math.max(box1.top, box2.top)); - const interSection = width * height; - return isIOU ? interSection / (box1.area + box2.area - interSection) : interSection / Math.min(box1.area, box2.area); -} - -// src/ops/minBbox.ts -function minBbox(pts) { - const xs = pts.map((pt) => pt.x); - const ys = pts.map((pt) => pt.y); - const minX = xs.reduce((min, x) => x < min ? x : min, Infinity); - const minY = ys.reduce((min, y) => y < min ? y : min, Infinity); - const maxX = xs.reduce((max, x) => max < x ? x : max, 0); - const maxY = ys.reduce((max, y) => max < y ? y : max, 0); - return new BoundingBox(minX, minY, maxX, maxY); -} - -// src/ops/nonMaxSuppression.ts -function nonMaxSuppression(boxes, scores, iouThreshold, isIOU = true) { - let indicesSortedByScore = scores.map((score, boxIndex) => ({score, boxIndex})).sort((c1, c2) => c1.score - c2.score).map((c) => c.boxIndex); - const pick = []; - while (indicesSortedByScore.length > 0) { - const curr = indicesSortedByScore.pop(); - pick.push(curr); - const indices = indicesSortedByScore; - const outputs = []; - for (let i = 0; i < indices.length; i++) { - const idx = indices[i]; - const currBox = boxes[curr]; - const idxBox = boxes[idx]; - outputs.push(iou(currBox, idxBox, isIOU)); - } - indicesSortedByScore = indicesSortedByScore.filter((_, j) => outputs[j] <= iouThreshold); - } - return pick; -} - -// src/ops/normalize.ts -var tf2 = require_tfjs_esm(); -function normalize(x, meanRgb) { - return tf2.tidy(() => { - const [r, g, b] = meanRgb; - const avg_r = tf2.fill([...x.shape.slice(0, 3), 1], r, "float32"); - const avg_g = tf2.fill([...x.shape.slice(0, 3), 1], g, "float32"); - const avg_b = tf2.fill([...x.shape.slice(0, 3), 1], b, "float32"); - const avg_rgb = tf2.concat([avg_r, avg_g, avg_b], 3); - return tf2.sub(x, avg_rgb); - }); -} - -// src/ops/padToSquare.ts -var tf3 = require_tfjs_esm(); -function padToSquare(imgTensor, isCenterImage = false) { - return tf3.tidy(() => { - const [height, width] = imgTensor.shape.slice(1); - if (height === width) { - return imgTensor; - } - const dimDiff = Math.abs(height - width); - const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1)); - const paddingAxis = height > width ? 2 : 1; - const createPaddingTensor = (paddingAmountLocal) => { - const paddingTensorShape = imgTensor.shape.slice(); - paddingTensorShape[paddingAxis] = paddingAmountLocal; - return tf3.fill(paddingTensorShape, 0, "float32"); - }; - const paddingTensorAppend = createPaddingTensor(paddingAmount); - const remainingPaddingAmount = dimDiff - paddingTensorAppend.shape[paddingAxis]; - const paddingTensorPrepend = isCenterImage && remainingPaddingAmount ? createPaddingTensor(remainingPaddingAmount) : null; - const tensorsToStack = [ - paddingTensorPrepend, - imgTensor, - paddingTensorAppend - ].filter((t) => !!t).map((t) => tf3.cast(t, "float32")); - return tf3.concat(tensorsToStack, paddingAxis); - }); -} - -// src/ops/shuffleArray.ts -function shuffleArray(inputArray) { - const array = inputArray.slice(); - for (let i = array.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - const x = array[i]; - array[i] = array[j]; - array[j] = x; - } - return array; -} - -// src/ops/index.ts -function sigmoid(x) { - return 1 / (1 + Math.exp(-x)); -} -function inverseSigmoid(x) { - return Math.log(x / (1 - x)); -} - -// src/classes/Rect.ts -var Rect = class extends Box { - constructor(x, y, width, height, allowNegativeDimensions = false) { - super({ - x, - y, - width, - height - }, allowNegativeDimensions); - } -}; - -// src/classes/FaceLandmarks.ts -var relX = 0.5; -var relY = 0.43; -var relScale = 0.45; -var FaceLandmarks = class { - constructor(relativeFaceLandmarkPositions, imgDims, shift = new Point(0, 0)) { - const {width, height} = imgDims; - this._imgDims = new Dimensions(width, height); - this._shift = shift; - this._positions = relativeFaceLandmarkPositions.map((pt) => pt.mul(new Point(width, height)).add(shift)); - } - get shift() { - return new Point(this._shift.x, this._shift.y); - } - get imageWidth() { - return this._imgDims.width; - } - get imageHeight() { - return this._imgDims.height; - } - get positions() { - return this._positions; - } - get relativePositions() { - return this._positions.map((pt) => pt.sub(this._shift).div(new Point(this.imageWidth, this.imageHeight))); - } - forSize(width, height) { - return new this.constructor(this.relativePositions, {width, height}); - } - shiftBy(x, y) { - return new this.constructor(this.relativePositions, this._imgDims, new Point(x, y)); - } - shiftByPoint(pt) { - return this.shiftBy(pt.x, pt.y); - } - align(detection, options = {}) { - if (detection) { - const box = detection instanceof FaceDetection ? detection.box.floor() : new Box(detection); - return this.shiftBy(box.x, box.y).align(null, options); - } - const {useDlibAlignment, minBoxPadding} = {useDlibAlignment: false, minBoxPadding: 0.2, ...options}; - if (useDlibAlignment) { - return this.alignDlib(); - } - return this.alignMinBbox(minBoxPadding); - } - alignDlib() { - const centers = this.getRefPointsForAlignment(); - const [leftEyeCenter, rightEyeCenter, mouthCenter] = centers; - const distToMouth = (pt) => mouthCenter.sub(pt).magnitude(); - const eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2; - const size = Math.floor(eyeToMouthDist / relScale); - const refPoint = getCenterPoint(centers); - const x = Math.floor(Math.max(0, refPoint.x - relX * size)); - const y = Math.floor(Math.max(0, refPoint.y - relY * size)); - return new Rect(x, y, Math.min(size, this.imageWidth + x), Math.min(size, this.imageHeight + y)); - } - alignMinBbox(padding) { - const box = minBbox(this.positions); - return box.pad(box.width * padding, box.height * padding); - } - getRefPointsForAlignment() { - throw new Error("getRefPointsForAlignment not implemented by base class"); - } -}; - -// src/classes/FaceLandmarks5.ts -var FaceLandmarks5 = class extends FaceLandmarks { - getRefPointsForAlignment() { - const pts = this.positions; - return [ - pts[0], - pts[1], - getCenterPoint([pts[3], pts[4]]) - ]; - } -}; - -// src/classes/FaceLandmarks68.ts -var FaceLandmarks68 = class extends FaceLandmarks { - getJawOutline() { - return this.positions.slice(0, 17); - } - getLeftEyeBrow() { - return this.positions.slice(17, 22); - } - getRightEyeBrow() { - return this.positions.slice(22, 27); - } - getNose() { - return this.positions.slice(27, 36); - } - getLeftEye() { - return this.positions.slice(36, 42); - } - getRightEye() { - return this.positions.slice(42, 48); - } - getMouth() { - return this.positions.slice(48, 68); - } - getRefPointsForAlignment() { - return [ - this.getLeftEye(), - this.getRightEye(), - this.getMouth() - ].map(getCenterPoint); - } -}; - -// src/classes/FaceMatch.ts -var FaceMatch = class { - constructor(label, distance) { - this._label = label; - this._distance = distance; - } - get label() { - return this._label; - } - get distance() { - return this._distance; - } - toString(withDistance = true) { - return `${this.label}${withDistance ? ` (${round(this.distance)})` : ""}`; - } -}; - -// src/classes/LabeledBox.ts -var LabeledBox = class extends Box { - static assertIsValidLabeledBox(box, callee) { - Box.assertIsValidBox(box, callee); - if (!isValidNumber(box.label)) { - throw new Error(`${callee} - expected property label (${box.label}) to be a number`); - } - } - constructor(box, label) { - super(box); - this._label = label; - } - get label() { - return this._label; - } -}; - -// src/classes/LabeledFaceDescriptors.ts -var LabeledFaceDescriptors = class { - constructor(label, descriptors) { - if (!(typeof label === "string")) { - throw new Error("LabeledFaceDescriptors - constructor expected label to be a string"); - } - if (!Array.isArray(descriptors) || descriptors.some((desc) => !(desc instanceof Float32Array))) { - throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array"); - } - this._label = label; - this._descriptors = descriptors; - } - get label() { - return this._label; - } - get descriptors() { - return this._descriptors; - } - toJSON() { - return { - label: this.label, - descriptors: this.descriptors.map((d) => Array.from(d)) - }; - } - static fromJSON(json) { - const descriptors = json.descriptors.map((d) => new Float32Array(d)); - return new LabeledFaceDescriptors(json.label, descriptors); - } -}; - -// src/classes/PredictedBox.ts -var PredictedBox = class extends LabeledBox { - static assertIsValidPredictedBox(box, callee) { - LabeledBox.assertIsValidLabeledBox(box, callee); - if (!isValidProbablitiy(box.score) || !isValidProbablitiy(box.classScore)) { - throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`); - } - } - constructor(box, label, score, classScore) { - super(box, label); - this._score = score; - this._classScore = classScore; - } - get score() { - return this._score; - } - get classScore() { - return this._classScore; - } -}; - -// src/factories/WithFaceDetection.ts -function isWithFaceDetection(obj) { - return obj.detection instanceof FaceDetection; -} -function extendWithFaceDetection(sourceObj, detection) { - const extension = {detection}; - return {...sourceObj, ...extension}; -} - -// src/env/createBrowserEnv.ts -function createBrowserEnv() { - const fetch = window.fetch; - if (!fetch) - throw new Error("fetch - missing fetch implementation for browser environment"); - const readFile = () => { - throw new Error("readFile - filesystem not available for browser environment"); - }; - return { - Canvas: HTMLCanvasElement, - CanvasRenderingContext2D, - Image: HTMLImageElement, - ImageData, - Video: HTMLVideoElement, - createCanvasElement: () => document.createElement("canvas"), - createImageElement: () => document.createElement("img"), - fetch, - readFile - }; -} - -// src/env/createFileSystem.ts -function createFileSystem(fs) { - let requireFsError = ""; - if (!fs) { - try { - fs = require("fs"); - } catch (err) { - requireFsError = err.toString(); - } - } - const readFile = fs ? (filePath) => new Promise((resolve, reject) => { - fs.readFile(filePath, (err, buffer) => err ? reject(err) : resolve(buffer)); - }) : () => { - throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`); - }; - return { - readFile - }; -} - -// src/env/createNodejsEnv.ts -function createNodejsEnv() { - const Canvas = global["Canvas"] || global.HTMLCanvasElement; - const Image = global.Image || global.HTMLImageElement; - const createCanvasElement = () => { - if (Canvas) - return new Canvas(); - throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment"); - }; - const createImageElement = () => { - if (Image) - return new Image(); - throw new Error("createImageElement - missing Image implementation for nodejs environment"); - }; - const fetch = global.fetch; - const fileSystem = createFileSystem(); - return { - Canvas: Canvas || class { - }, - CanvasRenderingContext2D: global.CanvasRenderingContext2D || class { - }, - Image: Image || class { - }, - ImageData: global.ImageData || class { - }, - Video: global.HTMLVideoElement || class { - }, - createCanvasElement, - createImageElement, - fetch, - ...fileSystem - }; -} - -// src/env/isBrowser.ts -function isBrowser() { - return typeof window === "object" && typeof document !== "undefined" && typeof HTMLImageElement !== "undefined" && typeof HTMLCanvasElement !== "undefined" && typeof HTMLVideoElement !== "undefined" && typeof ImageData !== "undefined" && typeof CanvasRenderingContext2D !== "undefined"; -} - -// src/env/index.ts -var import_isNodejs = __toModule(require_isNodejs()); -var environment; -function getEnv() { - if (!environment) { - throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()"); - } - return environment; -} -function setEnv(env2) { - environment = env2; -} -function initialize() { - if (isBrowser()) - return setEnv(createBrowserEnv()); - if ((0, import_isNodejs.isNodejs)()) - return setEnv(createNodejsEnv()); - return null; -} -function monkeyPatch(env2) { - if (!environment) { - initialize(); - } - if (!environment) { - throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()"); - } - const {Canvas = environment.Canvas, Image = environment.Image} = env2; - environment.Canvas = Canvas; - environment.Image = Image; - environment.createCanvasElement = env2.createCanvasElement || (() => new Canvas()); - environment.createImageElement = env2.createImageElement || (() => new Image()); - environment.ImageData = env2.ImageData || environment.ImageData; - environment.Video = env2.Video || environment.Video; - environment.fetch = env2.fetch || environment.fetch; - environment.readFile = env2.readFile || environment.readFile; -} -var env = { - getEnv, - setEnv, - initialize, - createBrowserEnv, - createFileSystem, - createNodejsEnv, - monkeyPatch, - isBrowser, - isNodejs: import_isNodejs.isNodejs -}; -initialize(); - -// src/dom/resolveInput.ts -function resolveInput(arg) { - if (!env.isNodejs() && typeof arg === "string") { - return document.getElementById(arg); - } - return arg; -} - -// src/dom/getContext2dOrThrow.ts -function getContext2dOrThrow(canvasArg) { - const {Canvas, CanvasRenderingContext2D: CanvasRenderingContext2D2} = env.getEnv(); - if (canvasArg instanceof CanvasRenderingContext2D2) { - return canvasArg; - } - const canvas = resolveInput(canvasArg); - if (!(canvas instanceof Canvas)) { - throw new Error("resolveContext2d - expected canvas to be of instance of Canvas"); - } - const ctx = canvas.getContext("2d"); - if (!ctx) { - throw new Error("resolveContext2d - canvas 2d context is null"); - } - return ctx; -} - -// src/draw/DrawTextField.ts -var AnchorPosition; -(function(AnchorPosition2) { - AnchorPosition2["TOP_LEFT"] = "TOP_LEFT"; - AnchorPosition2["TOP_RIGHT"] = "TOP_RIGHT"; - AnchorPosition2["BOTTOM_LEFT"] = "BOTTOM_LEFT"; - AnchorPosition2["BOTTOM_RIGHT"] = "BOTTOM_RIGHT"; -})(AnchorPosition || (AnchorPosition = {})); -var DrawTextFieldOptions = class { - constructor(options = {}) { - const { - anchorPosition, - backgroundColor, - fontColor, - fontSize, - fontStyle, - padding - } = options; - this.anchorPosition = anchorPosition || AnchorPosition.TOP_LEFT; - this.backgroundColor = backgroundColor || "rgba(0, 0, 0, 0.5)"; - this.fontColor = fontColor || "rgba(255, 255, 255, 1)"; - this.fontSize = fontSize || 14; - this.fontStyle = fontStyle || "Georgia"; - this.padding = padding || 4; - } -}; -var DrawTextField = class { - constructor(text, anchor, options = {}) { - this.text = typeof text === "string" ? [text] : text instanceof DrawTextField ? text.text : text; - this.anchor = anchor; - this.options = new DrawTextFieldOptions(options); - } - measureWidth(ctx) { - const {padding} = this.options; - return this.text.map((l) => ctx.measureText(l).width).reduce((w0, w1) => w0 < w1 ? w1 : w0, 0) + 2 * padding; - } - measureHeight() { - const {fontSize, padding} = this.options; - return this.text.length * fontSize + 2 * padding; - } - getUpperLeft(ctx, canvasDims) { - const {anchorPosition} = this.options; - const isShiftLeft = anchorPosition === AnchorPosition.BOTTOM_RIGHT || anchorPosition === AnchorPosition.TOP_RIGHT; - const isShiftTop = anchorPosition === AnchorPosition.BOTTOM_LEFT || anchorPosition === AnchorPosition.BOTTOM_RIGHT; - const textFieldWidth = this.measureWidth(ctx); - const textFieldHeight = this.measureHeight(); - const x = isShiftLeft ? this.anchor.x - textFieldWidth : this.anchor.x; - const y = isShiftTop ? this.anchor.y - textFieldHeight : this.anchor.y; - if (canvasDims) { - const {width, height} = canvasDims; - const newX = Math.max(Math.min(x, width - textFieldWidth), 0); - const newY = Math.max(Math.min(y, height - textFieldHeight), 0); - return {x: newX, y: newY}; - } - return {x, y}; - } - draw(canvasArg) { - const canvas = resolveInput(canvasArg); - const ctx = getContext2dOrThrow(canvas); - const { - backgroundColor, - fontColor, - fontSize, - fontStyle, - padding - } = this.options; - ctx.font = `${fontSize}px ${fontStyle}`; - const maxTextWidth = this.measureWidth(ctx); - const textHeight = this.measureHeight(); - ctx.fillStyle = backgroundColor; - const upperLeft = this.getUpperLeft(ctx, canvas); - ctx.fillRect(upperLeft.x, upperLeft.y, maxTextWidth, textHeight); - ctx.fillStyle = fontColor; - this.text.forEach((textLine, i) => { - const x = padding + upperLeft.x; - const y = padding + upperLeft.y + (i + 1) * fontSize; - ctx.fillText(textLine, x, y); - }); - } -}; - -// src/draw/DrawBox.ts -var DrawBoxOptions = class { - constructor(options = {}) { - const { - boxColor, - lineWidth, - label, - drawLabelOptions - } = options; - this.boxColor = boxColor || "rgba(0, 0, 255, 1)"; - this.lineWidth = lineWidth || 2; - this.label = label; - const defaultDrawLabelOptions = { - anchorPosition: AnchorPosition.BOTTOM_LEFT, - backgroundColor: this.boxColor - }; - this.drawLabelOptions = new DrawTextFieldOptions({...defaultDrawLabelOptions, ...drawLabelOptions}); - } -}; -var DrawBox = class { - constructor(box, options = {}) { - this.box = new Box(box); - this.options = new DrawBoxOptions(options); - } - draw(canvasArg) { - const ctx = getContext2dOrThrow(canvasArg); - const {boxColor, lineWidth} = this.options; - const { - x, - y, - width, - height - } = this.box; - ctx.strokeStyle = boxColor; - ctx.lineWidth = lineWidth; - ctx.strokeRect(x, y, width, height); - const {label} = this.options; - if (label) { - new DrawTextField([label], {x: x - lineWidth / 2, y}, this.options.drawLabelOptions).draw(canvasArg); - } - } -}; - -// src/draw/drawDetections.ts -function drawDetections(canvasArg, detections) { - const detectionsArray = Array.isArray(detections) ? detections : [detections]; - detectionsArray.forEach((det) => { - const score = det instanceof FaceDetection ? det.score : isWithFaceDetection(det) ? det.detection.score : void 0; - const box = det instanceof FaceDetection ? det.box : isWithFaceDetection(det) ? det.detection.box : new Box(det); - const label = score ? `${round(score)}` : void 0; - new DrawBox(box, {label}).draw(canvasArg); - }); -} - -// src/faceExpressionNet/FaceExpressionNet.ts -var tf18 = require_tfjs_esm(); - -// src/dom/isMediaLoaded.ts -function isMediaLoaded(media) { - const {Image, Video} = env.getEnv(); - return media instanceof Image && media.complete || media instanceof Video && media.readyState >= 3; -} - -// src/dom/awaitMediaLoaded.ts -function awaitMediaLoaded(media) { - return new Promise((resolve, reject) => { - if (media instanceof env.getEnv().Canvas || isMediaLoaded(media)) - return resolve(null); - function onError(e) { - if (!e.currentTarget) - return; - e.currentTarget.removeEventListener("load", onLoad); - e.currentTarget.removeEventListener("error", onError); - reject(e); - } - function onLoad(e) { - if (!e.currentTarget) - return; - e.currentTarget.removeEventListener("load", onLoad); - e.currentTarget.removeEventListener("error", onError); - resolve(e); - } - media.addEventListener("load", onLoad); - media.addEventListener("error", onError); - }); -} - -// src/dom/bufferToImage.ts -function bufferToImage(buf) { - return new Promise((resolve, reject) => { - if (!(buf instanceof Blob)) - reject(new Error("bufferToImage - expected buf to be of type: Blob")); - const reader = new FileReader(); - reader.onload = () => { - if (typeof reader.result !== "string") - reject(new Error("bufferToImage - expected reader.result to be a string, in onload")); - const img = env.getEnv().createImageElement(); - img.onload = () => resolve(img); - img.onerror = reject; - img.src = reader.result; - }; - reader.onerror = reject; - reader.readAsDataURL(buf); - }); -} - -// src/dom/getMediaDimensions.ts -function getMediaDimensions(input) { - const {Image, Video} = env.getEnv(); - if (input instanceof Image) { - return new Dimensions(input.naturalWidth, input.naturalHeight); - } - if (input instanceof Video) { - return new Dimensions(input.videoWidth, input.videoHeight); - } - return new Dimensions(input.width, input.height); -} - -// src/dom/createCanvas.ts -function createCanvas({width, height}) { - const {createCanvasElement} = env.getEnv(); - const canvas = createCanvasElement(); - canvas.width = width; - canvas.height = height; - return canvas; -} -function createCanvasFromMedia(media, dims) { - const {ImageData: ImageData2} = env.getEnv(); - if (!(media instanceof ImageData2) && !isMediaLoaded(media)) { - throw new Error("createCanvasFromMedia - media has not finished loading yet"); - } - const {width, height} = dims || getMediaDimensions(media); - const canvas = createCanvas({width, height}); - if (media instanceof ImageData2) { - getContext2dOrThrow(canvas).putImageData(media, 0, 0); - } else { - getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height); - } - return canvas; -} - -// src/dom/imageTensorToCanvas.ts -var tf4 = require_tfjs_esm(); -async function imageTensorToCanvas(imgTensor, canvas) { - const targetCanvas = canvas || env.getEnv().createCanvasElement(); - const [height, width, numChannels] = imgTensor.shape.slice(isTensor4D(imgTensor) ? 1 : 0); - const imgTensor3D = tf4.tidy(() => imgTensor.as3D(height, width, numChannels).toInt()); - await tf4.browser.toPixels(imgTensor3D, targetCanvas); - imgTensor3D.dispose(); - return targetCanvas; -} - -// src/dom/isMediaElement.ts -function isMediaElement(input) { - const {Image, Canvas, Video} = env.getEnv(); - return input instanceof Image || input instanceof Canvas || input instanceof Video; -} - -// src/dom/NetInput.ts -var tf5 = require_tfjs_esm(); - -// src/dom/imageToSquare.ts -function imageToSquare(input, inputSize, centerImage = false) { - const {Image, Canvas} = env.getEnv(); - if (!(input instanceof Image || input instanceof Canvas)) { - throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement"); - } - if (inputSize <= 0) - return createCanvas({width: 1, height: 1}); - const dims = getMediaDimensions(input); - const scale2 = inputSize / Math.max(dims.height, dims.width); - const width = scale2 * dims.width; - const height = scale2 * dims.height; - const targetCanvas = createCanvas({width: inputSize, height: inputSize}); - const inputCanvas = input instanceof Canvas ? input : createCanvasFromMedia(input); - const offset = Math.abs(width - height) / 2; - const dx = centerImage && width < height ? offset : 0; - const dy = centerImage && height < width ? offset : 0; - if (inputCanvas.width > 0 && inputCanvas.height > 0) - getContext2dOrThrow(targetCanvas).drawImage(inputCanvas, dx, dy, width, height); - return targetCanvas; -} - -// src/dom/NetInput.ts -var NetInput = class { - constructor(inputs, treatAsBatchInput = false) { - this._imageTensors = []; - this._canvases = []; - this._treatAsBatchInput = false; - this._inputDimensions = []; - if (!Array.isArray(inputs)) { - throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${inputs}`); - } - this._treatAsBatchInput = treatAsBatchInput; - this._batchSize = inputs.length; - inputs.forEach((input, idx) => { - if (isTensor3D(input)) { - this._imageTensors[idx] = input; - this._inputDimensions[idx] = input.shape; - return; - } - if (isTensor4D(input)) { - const batchSize = input.shape[0]; - if (batchSize !== 1) { - throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`); - } - this._imageTensors[idx] = input; - this._inputDimensions[idx] = input.shape.slice(1); - return; - } - const canvas = input instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input); - this._canvases[idx] = canvas; - this._inputDimensions[idx] = [canvas.height, canvas.width, 3]; - }); - } - get imageTensors() { - return this._imageTensors; - } - get canvases() { - return this._canvases; - } - get isBatchInput() { - return this.batchSize > 1 || this._treatAsBatchInput; - } - get batchSize() { - return this._batchSize; - } - get inputDimensions() { - return this._inputDimensions; - } - get inputSize() { - return this._inputSize; - } - get reshapedInputDimensions() { - return range(this.batchSize, 0, 1).map((_, batchIdx) => this.getReshapedInputDimensions(batchIdx)); - } - getInput(batchIdx) { - return this.canvases[batchIdx] || this.imageTensors[batchIdx]; - } - getInputDimensions(batchIdx) { - return this._inputDimensions[batchIdx]; - } - getInputHeight(batchIdx) { - return this._inputDimensions[batchIdx][0]; - } - getInputWidth(batchIdx) { - return this._inputDimensions[batchIdx][1]; - } - getReshapedInputDimensions(batchIdx) { - if (typeof this.inputSize !== "number") { - throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet"); - } - const width = this.getInputWidth(batchIdx); - const height = this.getInputHeight(batchIdx); - return computeReshapedDimensions({width, height}, this.inputSize); - } - toBatchTensor(inputSize, isCenterInputs = true) { - this._inputSize = inputSize; - return tf5.tidy(() => { - const inputTensors = range(this.batchSize, 0, 1).map((batchIdx) => { - const input = this.getInput(batchIdx); - if (input instanceof tf5.Tensor) { - let imgTensor = isTensor4D(input) ? input : tf5.expandDims(input); - imgTensor = padToSquare(imgTensor, isCenterInputs); - if (imgTensor.shape[1] !== inputSize || imgTensor.shape[2] !== inputSize) { - imgTensor = tf5.image.resizeBilinear(imgTensor, [inputSize, inputSize], false, false); - } - return imgTensor.as3D(inputSize, inputSize, 3); - } - if (input instanceof env.getEnv().Canvas) { - return tf5.browser.fromPixels(imageToSquare(input, inputSize, isCenterInputs)); - } - throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`); - }); - const batchTensor = tf5.stack(inputTensors.map((t) => tf5.cast(t, "float32"))).as4D(this.batchSize, inputSize, inputSize, 3); - return batchTensor; - }); - } -}; - -// src/dom/toNetInput.ts -async function toNetInput(inputs) { - if (inputs instanceof NetInput) - return inputs; - const inputArgArray = Array.isArray(inputs) ? inputs : [inputs]; - if (!inputArgArray.length) - throw new Error("toNetInput - empty array passed as input"); - const getIdxHint = (idx) => Array.isArray(inputs) ? ` at input index ${idx}:` : ""; - const inputArray = inputArgArray.map(resolveInput); - inputArray.forEach((input, i) => { - if (!isMediaElement(input) && !isTensor3D(input) && !isTensor4D(input)) { - if (typeof inputArgArray[i] === "string") - throw new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`); - throw new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`); - } - if (isTensor4D(input)) { - const batchSize = input.shape[0]; - if (batchSize !== 1) - throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`); - } - }); - await Promise.all(inputArray.map((input) => isMediaElement(input) && awaitMediaLoaded(input))); - return new NetInput(inputArray, Array.isArray(inputs)); -} - -// src/dom/extractFaces.ts -async function extractFaces(input, detections) { - const {Canvas} = env.getEnv(); - let canvas = input; - if (!(input instanceof Canvas)) { - const netInput = await toNetInput(input); - if (netInput.batchSize > 1) - throw new Error("extractFaces - batchSize > 1 not supported"); - const tensorOrCanvas = netInput.getInput(0); - canvas = tensorOrCanvas instanceof Canvas ? tensorOrCanvas : await imageTensorToCanvas(tensorOrCanvas); - } - const ctx = getContext2dOrThrow(canvas); - const boxes = detections.map((det) => det instanceof FaceDetection ? det.forSize(canvas.width, canvas.height).box.floor() : det).map((box) => box.clipAtImageBorders(canvas.width, canvas.height)); - return boxes.map(({x, y, width, height}) => { - const faceImg = createCanvas({width, height}); - if (width > 0 && height > 0) - getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x, y, width, height), 0, 0); - return faceImg; - }); -} - -// src/dom/extractFaceTensors.ts -var tf6 = require_tfjs_esm(); -async function extractFaceTensors(imageTensor, detections) { - if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) { - throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D"); - } - if (isTensor4D(imageTensor) && imageTensor.shape[0] > 1) { - throw new Error("extractFaceTensors - batchSize > 1 not supported"); - } - return tf6.tidy(() => { - const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0); - const boxes = detections.map((det) => det instanceof FaceDetection ? det.forSize(imgWidth, imgHeight).box : det).map((box) => box.clipAtImageBorders(imgWidth, imgHeight)); - const faceTensors = boxes.map(({ - x, - y, - width, - height - }) => tf6.slice3d(imageTensor.as3D(imgHeight, imgWidth, numChannels), [y, x, 0], [height, width, numChannels])); - return faceTensors; - }); -} - -// src/dom/fetchOrThrow.ts -async function fetchOrThrow(url, init) { - const {fetch} = env.getEnv(); - const res = await fetch(url, init); - if (!(res.status < 400)) { - throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`); - } - return res; -} - -// src/dom/fetchImage.ts -async function fetchImage(uri) { - const res = await fetchOrThrow(uri); - const blob = await res.blob(); - if (!blob.type.startsWith("image/")) { - throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`); - } - return bufferToImage(blob); -} - -// src/dom/fetchJson.ts -async function fetchJson(uri) { - return (await fetchOrThrow(uri)).json(); -} - -// src/dom/fetchNetWeights.ts -async function fetchNetWeights(uri) { - return new Float32Array(await (await fetchOrThrow(uri)).arrayBuffer()); -} - -// src/dom/loadWeightMap.ts -var tf7 = require_tfjs_esm(); - -// src/common/getModelUris.ts -function getModelUris(uri, defaultModelName) { - const defaultManifestFilename = `${defaultModelName}-weights_manifest.json`; - if (!uri) { - return { - modelBaseUri: "", - manifestUri: defaultManifestFilename - }; - } - if (uri === "/") { - return { - modelBaseUri: "/", - manifestUri: `/${defaultManifestFilename}` - }; - } - const protocol = uri.startsWith("http://") ? "http://" : uri.startsWith("https://") ? "https://" : ""; - uri = uri.replace(protocol, ""); - const parts = uri.split("/").filter((s) => s); - const manifestFile = uri.endsWith(".json") ? parts[parts.length - 1] : defaultManifestFilename; - let modelBaseUri = protocol + (uri.endsWith(".json") ? parts.slice(0, parts.length - 1) : parts).join("/"); - modelBaseUri = uri.startsWith("/") ? `/${modelBaseUri}` : modelBaseUri; - return { - modelBaseUri, - manifestUri: modelBaseUri === "/" ? `/${manifestFile}` : `${modelBaseUri}/${manifestFile}` - }; -} - -// src/dom/loadWeightMap.ts -async function loadWeightMap(uri, defaultModelName) { - const {manifestUri, modelBaseUri} = getModelUris(uri, defaultModelName); - const manifest = await fetchJson(manifestUri); - return tf7.io.loadWeights(manifest, modelBaseUri); -} - -// src/dom/matchDimensions.ts -function matchDimensions(input, reference, useMediaDimensions = false) { - const {width, height} = useMediaDimensions ? getMediaDimensions(reference) : reference; - input.width = width; - input.height = height; - return {width, height}; -} - -// src/faceFeatureExtractor/FaceFeatureExtractor.ts -var tf15 = require_tfjs_esm(); - -// src/NeuralNetwork.ts -var tf8 = require_tfjs_esm(); -var NeuralNetwork = class { - constructor(name) { - this._params = void 0; - this._paramMappings = []; - this._name = name; - } - get params() { - return this._params; - } - get paramMappings() { - return this._paramMappings; - } - get isLoaded() { - return !!this.params; - } - getParamFromPath(paramPath) { - const {obj, objProp} = this.traversePropertyPath(paramPath); - return obj[objProp]; - } - reassignParamFromPath(paramPath, tensor2) { - const {obj, objProp} = this.traversePropertyPath(paramPath); - obj[objProp].dispose(); - obj[objProp] = tensor2; - } - getParamList() { - return this._paramMappings.map(({paramPath}) => ({ - path: paramPath, - tensor: this.getParamFromPath(paramPath) - })); - } - getTrainableParams() { - return this.getParamList().filter((param) => param.tensor instanceof tf8.Variable); - } - getFrozenParams() { - return this.getParamList().filter((param) => !(param.tensor instanceof tf8.Variable)); - } - variable() { - this.getFrozenParams().forEach(({path, tensor: tensor2}) => { - this.reassignParamFromPath(path, tensor2.variable()); - }); - } - freeze() { - this.getTrainableParams().forEach(({path, tensor: variable}) => { - const tensor2 = tf8.tensor(variable.dataSync()); - variable.dispose(); - this.reassignParamFromPath(path, tensor2); - }); - } - dispose(throwOnRedispose = true) { - this.getParamList().forEach((param) => { - if (throwOnRedispose && param.tensor.isDisposed) { - throw new Error(`param tensor has already been disposed for path ${param.path}`); - } - param.tensor.dispose(); - }); - this._params = void 0; - } - serializeParams() { - return new Float32Array(this.getParamList().map(({tensor: tensor2}) => Array.from(tensor2.dataSync())).reduce((flat, arr) => flat.concat(arr))); - } - async load(weightsOrUrl) { - if (weightsOrUrl instanceof Float32Array) { - this.extractWeights(weightsOrUrl); - return; - } - await this.loadFromUri(weightsOrUrl); - } - async loadFromUri(uri) { - if (uri && typeof uri !== "string") { - throw new Error(`${this._name}.loadFromUri - expected model uri`); - } - const weightMap = await loadWeightMap(uri, this.getDefaultModelName()); - this.loadFromWeightMap(weightMap); - } - async loadFromDisk(filePath) { - if (filePath && typeof filePath !== "string") { - throw new Error(`${this._name}.loadFromDisk - expected model file path`); - } - const {readFile} = env.getEnv(); - const {manifestUri, modelBaseUri} = getModelUris(filePath, this.getDefaultModelName()); - const fetchWeightsFromDisk = (filePaths) => Promise.all(filePaths.map((fp) => readFile(fp).then((buf) => buf.buffer))); - const loadWeights = tf8.io.weightsLoaderFactory(fetchWeightsFromDisk); - const manifest = JSON.parse((await readFile(manifestUri)).toString()); - const weightMap = await loadWeights(manifest, modelBaseUri); - this.loadFromWeightMap(weightMap); - } - loadFromWeightMap(weightMap) { - const {paramMappings, params} = this.extractParamsFromWeightMap(weightMap); - this._paramMappings = paramMappings; - this._params = params; - } - extractWeights(weights) { - const {paramMappings, params} = this.extractParams(weights); - this._paramMappings = paramMappings; - this._params = params; - } - traversePropertyPath(paramPath) { - if (!this.params) { - throw new Error("traversePropertyPath - model has no loaded params"); - } - const result = paramPath.split("/").reduce((res, objProp2) => { - if (!res.nextObj.hasOwnProperty(objProp2)) { - throw new Error(`traversePropertyPath - object does not have property ${objProp2}, for path ${paramPath}`); - } - return {obj: res.nextObj, objProp: objProp2, nextObj: res.nextObj[objProp2]}; - }, {nextObj: this.params}); - const {obj, objProp} = result; - if (!obj || !objProp || !(obj[objProp] instanceof tf8.Tensor)) { - throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`); - } - return {obj, objProp}; - } -}; - -// src/faceFeatureExtractor/denseBlock.ts -var tf10 = require_tfjs_esm(); - -// src/common/depthwiseSeparableConv.ts -var tf9 = require_tfjs_esm(); -function depthwiseSeparableConv(x, params, stride) { - return tf9.tidy(() => { - let out = tf9.separableConv2d(x, params.depthwise_filter, params.pointwise_filter, stride, "same"); - out = tf9.add(out, params.bias); - return out; - }); -} - -// src/faceFeatureExtractor/denseBlock.ts -function denseBlock3(x, denseBlockParams, isFirstLayer = false) { - return tf10.tidy(() => { - const out1 = tf10.relu(isFirstLayer ? tf10.add(tf10.conv2d(x, denseBlockParams.conv0.filters, [2, 2], "same"), denseBlockParams.conv0.bias) : depthwiseSeparableConv(x, denseBlockParams.conv0, [2, 2])); - const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]); - const in3 = tf10.relu(tf10.add(out1, out2)); - const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]); - return tf10.relu(tf10.add(out1, tf10.add(out2, out3))); - }); -} -function denseBlock4(x, denseBlockParams, isFirstLayer = false, isScaleDown = true) { - return tf10.tidy(() => { - const out1 = tf10.relu(isFirstLayer ? tf10.add(tf10.conv2d(x, denseBlockParams.conv0.filters, isScaleDown ? [2, 2] : [1, 1], "same"), denseBlockParams.conv0.bias) : depthwiseSeparableConv(x, denseBlockParams.conv0, isScaleDown ? [2, 2] : [1, 1])); - const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]); - const in3 = tf10.relu(tf10.add(out1, out2)); - const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]); - const in4 = tf10.relu(tf10.add(out1, tf10.add(out2, out3))); - const out4 = depthwiseSeparableConv(in4, denseBlockParams.conv3, [1, 1]); - return tf10.relu(tf10.add(out1, tf10.add(out2, tf10.add(out3, out4)))); - }); -} - -// src/common/convLayer.ts -var tf11 = require_tfjs_esm(); -function convLayer(x, params, padding = "same", withRelu = false) { - return tf11.tidy(() => { - const out = tf11.add(tf11.conv2d(x, params.filters, [1, 1], padding), params.bias); - return withRelu ? tf11.relu(out) : out; - }); -} - -// src/common/disposeUnusedWeightTensors.ts -function disposeUnusedWeightTensors(weightMap, paramMappings) { - Object.keys(weightMap).forEach((path) => { - if (!paramMappings.some((pm) => pm.originalPath === path)) { - weightMap[path].dispose(); - } - }); -} - -// src/common/extractConvParamsFactory.ts -var tf12 = require_tfjs_esm(); -function extractConvParamsFactory(extractWeights, paramMappings) { - return (channelsIn, channelsOut, filterSize, mappedPrefix) => { - const filters = tf12.tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); - const bias = tf12.tensor1d(extractWeights(channelsOut)); - paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/bias`}); - return {filters, bias}; - }; -} - -// src/common/extractFCParamsFactory.ts -var tf13 = require_tfjs_esm(); -function extractFCParamsFactory(extractWeights, paramMappings) { - return (channelsIn, channelsOut, mappedPrefix) => { - const fc_weights = tf13.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]); - const fc_bias = tf13.tensor1d(extractWeights(channelsOut)); - paramMappings.push({paramPath: `${mappedPrefix}/weights`}, {paramPath: `${mappedPrefix}/bias`}); - return { - weights: fc_weights, - bias: fc_bias - }; - }; -} - -// src/common/extractSeparableConvParamsFactory.ts -var tf14 = require_tfjs_esm(); - -// src/common/types.ts -var SeparableConvParams = class { - constructor(depthwise_filter, pointwise_filter, bias) { - this.depthwise_filter = depthwise_filter; - this.pointwise_filter = pointwise_filter; - this.bias = bias; - } -}; - -// src/common/extractSeparableConvParamsFactory.ts -function extractSeparableConvParamsFactory(extractWeights, paramMappings) { - return (channelsIn, channelsOut, mappedPrefix) => { - const depthwise_filter = tf14.tensor4d(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1]); - const pointwise_filter = tf14.tensor4d(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut]); - const bias = tf14.tensor1d(extractWeights(channelsOut)); - paramMappings.push({paramPath: `${mappedPrefix}/depthwise_filter`}, {paramPath: `${mappedPrefix}/pointwise_filter`}, {paramPath: `${mappedPrefix}/bias`}); - return new SeparableConvParams(depthwise_filter, pointwise_filter, bias); - }; -} -function loadSeparableConvParamsFactory(extractWeightEntry) { - return (prefix) => { - const depthwise_filter = extractWeightEntry(`${prefix}/depthwise_filter`, 4); - const pointwise_filter = extractWeightEntry(`${prefix}/pointwise_filter`, 4); - const bias = extractWeightEntry(`${prefix}/bias`, 1); - return new SeparableConvParams(depthwise_filter, pointwise_filter, bias); - }; -} - -// src/common/extractWeightEntryFactory.ts -function extractWeightEntryFactory(weightMap, paramMappings) { - return (originalPath, paramRank, mappedPath) => { - const tensor2 = weightMap[originalPath]; - if (!isTensor(tensor2, paramRank)) { - throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor2}`); - } - paramMappings.push({originalPath, paramPath: mappedPath || originalPath}); - return tensor2; - }; -} - -// src/common/extractWeightsFactory.ts -function extractWeightsFactory(weights) { - let remainingWeights = weights; - function extractWeights(numWeights) { - const ret = remainingWeights.slice(0, numWeights); - remainingWeights = remainingWeights.slice(numWeights); - return ret; - } - function getRemainingWeights() { - return remainingWeights; - } - return { - extractWeights, - getRemainingWeights - }; -} - -// src/faceFeatureExtractor/extractorsFactory.ts -function extractorsFactory(extractWeights, paramMappings) { - const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings); - const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings); - function extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer = false) { - const conv0 = isFirstLayer ? extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv0`) : extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/conv0`); - const conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv1`); - const conv22 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv2`); - return {conv0, conv1, conv2: conv22}; - } - function extractDenseBlock4Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer = false) { - const {conv0, conv1, conv2: conv22} = extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer); - const conv3 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv3`); - return { - conv0, - conv1, - conv2: conv22, - conv3 - }; - } - return { - extractDenseBlock3Params, - extractDenseBlock4Params - }; -} - -// src/faceFeatureExtractor/extractParams.ts -function extractParams(weights) { - const paramMappings = []; - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const { - extractDenseBlock4Params - } = extractorsFactory(extractWeights, paramMappings); - const dense0 = extractDenseBlock4Params(3, 32, "dense0", true); - const dense1 = extractDenseBlock4Params(32, 64, "dense1"); - const dense2 = extractDenseBlock4Params(64, 128, "dense2"); - const dense3 = extractDenseBlock4Params(128, 256, "dense3"); - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - return { - paramMappings, - params: { - dense0, - dense1, - dense2, - dense3 - } - }; -} - -// src/common/loadConvParamsFactory.ts -function loadConvParamsFactory(extractWeightEntry) { - return (prefix) => { - const filters = extractWeightEntry(`${prefix}/filters`, 4); - const bias = extractWeightEntry(`${prefix}/bias`, 1); - return {filters, bias}; - }; -} - -// src/faceFeatureExtractor/loadParamsFactory.ts -function loadParamsFactory(weightMap, paramMappings) { - const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); - const extractConvParams = loadConvParamsFactory(extractWeightEntry); - const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry); - function extractDenseBlock3Params(prefix, isFirstLayer = false) { - const conv0 = isFirstLayer ? extractConvParams(`${prefix}/conv0`) : extractSeparableConvParams(`${prefix}/conv0`); - const conv1 = extractSeparableConvParams(`${prefix}/conv1`); - const conv22 = extractSeparableConvParams(`${prefix}/conv2`); - return {conv0, conv1, conv2: conv22}; - } - function extractDenseBlock4Params(prefix, isFirstLayer = false) { - const conv0 = isFirstLayer ? extractConvParams(`${prefix}/conv0`) : extractSeparableConvParams(`${prefix}/conv0`); - const conv1 = extractSeparableConvParams(`${prefix}/conv1`); - const conv22 = extractSeparableConvParams(`${prefix}/conv2`); - const conv3 = extractSeparableConvParams(`${prefix}/conv3`); - return { - conv0, - conv1, - conv2: conv22, - conv3 - }; - } - return { - extractDenseBlock3Params, - extractDenseBlock4Params - }; -} - -// src/faceFeatureExtractor/extractParamsFromWeightMap.ts -function extractParamsFromWeightMap(weightMap) { - const paramMappings = []; - const { - extractDenseBlock4Params - } = loadParamsFactory(weightMap, paramMappings); - const params = { - dense0: extractDenseBlock4Params("dense0", true), - dense1: extractDenseBlock4Params("dense1"), - dense2: extractDenseBlock4Params("dense2"), - dense3: extractDenseBlock4Params("dense3") - }; - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params, paramMappings}; -} - -// src/faceFeatureExtractor/FaceFeatureExtractor.ts -var FaceFeatureExtractor = class extends NeuralNetwork { - constructor() { - super("FaceFeatureExtractor"); - } - forwardInput(input) { - const {params} = this; - if (!params) { - throw new Error("FaceFeatureExtractor - load model before inference"); - } - return tf15.tidy(() => { - const batchTensor = tf15.cast(input.toBatchTensor(112, true), "float32"); - const meanRgb = [122.782, 117.001, 104.298]; - const normalized = normalize(batchTensor, meanRgb).div(255); - let out = denseBlock4(normalized, params.dense0, true); - out = denseBlock4(out, params.dense1); - out = denseBlock4(out, params.dense2); - out = denseBlock4(out, params.dense3); - out = tf15.avgPool(out, [7, 7], [2, 2], "valid"); - return out; - }); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - getDefaultModelName() { - return "face_feature_extractor_model"; - } - extractParamsFromWeightMap(weightMap) { - return extractParamsFromWeightMap(weightMap); - } - extractParams(weights) { - return extractParams(weights); - } -}; - -// src/faceProcessor/FaceProcessor.ts -var tf17 = require_tfjs_esm(); - -// src/common/fullyConnectedLayer.ts -var tf16 = require_tfjs_esm(); -function fullyConnectedLayer(x, params) { - return tf16.tidy(() => tf16.add(tf16.matMul(x, params.weights), params.bias)); -} - -// src/faceProcessor/extractParams.ts -function extractParams2(weights, channelsIn, channelsOut) { - const paramMappings = []; - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings); - const fc = extractFCParams(channelsIn, channelsOut, "fc"); - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - return { - paramMappings, - params: {fc} - }; -} - -// src/faceProcessor/extractParamsFromWeightMap.ts -function extractParamsFromWeightMap2(weightMap) { - const paramMappings = []; - const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); - function extractFcParams(prefix) { - const weights = extractWeightEntry(`${prefix}/weights`, 2); - const bias = extractWeightEntry(`${prefix}/bias`, 1); - return {weights, bias}; - } - const params = { - fc: extractFcParams("fc") - }; - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params, paramMappings}; -} - -// src/faceProcessor/util.ts -function seperateWeightMaps(weightMap) { - const featureExtractorMap = {}; - const classifierMap = {}; - Object.keys(weightMap).forEach((key) => { - const map = key.startsWith("fc") ? classifierMap : featureExtractorMap; - map[key] = weightMap[key]; - }); - return {featureExtractorMap, classifierMap}; -} - -// src/faceProcessor/FaceProcessor.ts -var FaceProcessor = class extends NeuralNetwork { - constructor(_name, faceFeatureExtractor) { - super(_name); - this._faceFeatureExtractor = faceFeatureExtractor; - } - get faceFeatureExtractor() { - return this._faceFeatureExtractor; - } - runNet(input) { - const {params} = this; - if (!params) { - throw new Error(`${this._name} - load model before inference`); - } - return tf17.tidy(() => { - const bottleneckFeatures = input instanceof NetInput ? this.faceFeatureExtractor.forwardInput(input) : input; - return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0], -1), params.fc); - }); - } - dispose(throwOnRedispose = true) { - this.faceFeatureExtractor.dispose(throwOnRedispose); - super.dispose(throwOnRedispose); - } - loadClassifierParams(weights) { - const {params, paramMappings} = this.extractClassifierParams(weights); - this._params = params; - this._paramMappings = paramMappings; - } - extractClassifierParams(weights) { - return extractParams2(weights, this.getClassifierChannelsIn(), this.getClassifierChannelsOut()); - } - extractParamsFromWeightMap(weightMap) { - const {featureExtractorMap, classifierMap} = seperateWeightMaps(weightMap); - this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap); - return extractParamsFromWeightMap2(classifierMap); - } - extractParams(weights) { - const cIn = this.getClassifierChannelsIn(); - const cOut = this.getClassifierChannelsOut(); - const classifierWeightSize = cOut * cIn + cOut; - const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize); - const classifierWeights = weights.slice(weights.length - classifierWeightSize); - this.faceFeatureExtractor.extractWeights(featureExtractorWeights); - return this.extractClassifierParams(classifierWeights); - } -}; - -// src/faceExpressionNet/FaceExpressions.ts -var FACE_EXPRESSION_LABELS = ["neutral", "happy", "sad", "angry", "fearful", "disgusted", "surprised"]; -var FaceExpressions = class { - constructor(probabilities) { - if (probabilities.length !== 7) { - throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`); - } - FACE_EXPRESSION_LABELS.forEach((expression, idx) => { - this[expression] = probabilities[idx]; - }); - } - asSortedArray() { - return FACE_EXPRESSION_LABELS.map((expression) => ({expression, probability: this[expression]})).sort((e0, e1) => e1.probability - e0.probability); - } -}; - -// src/faceExpressionNet/FaceExpressionNet.ts -var FaceExpressionNet = class extends FaceProcessor { - constructor(faceFeatureExtractor = new FaceFeatureExtractor()) { - super("FaceExpressionNet", faceFeatureExtractor); - } - forwardInput(input) { - return tf18.tidy(() => tf18.softmax(this.runNet(input))); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - async predictExpressions(input) { - const netInput = await toNetInput(input); - const out = await this.forwardInput(netInput); - const probabilitesByBatch = await Promise.all(tf18.unstack(out).map(async (t) => { - const data = t.dataSync(); - t.dispose(); - return data; - })); - out.dispose(); - const predictionsByBatch = probabilitesByBatch.map((probabilites) => new FaceExpressions(probabilites)); - return netInput.isBatchInput ? predictionsByBatch : predictionsByBatch[0]; - } - getDefaultModelName() { - return "face_expression_model"; - } - getClassifierChannelsIn() { - return 256; - } - getClassifierChannelsOut() { - return 7; - } -}; - -// src/factories/WithFaceExpressions.ts -function isWithFaceExpressions(obj) { - return obj.expressions instanceof FaceExpressions; -} -function extendWithFaceExpressions(sourceObj, expressions) { - const extension = {expressions}; - return {...sourceObj, ...extension}; -} - -// src/draw/drawFaceExpressions.ts -function drawFaceExpressions(canvasArg, faceExpressions, minConfidence = 0.1, textFieldAnchor) { - const faceExpressionsArray = Array.isArray(faceExpressions) ? faceExpressions : [faceExpressions]; - faceExpressionsArray.forEach((e) => { - const expr = e instanceof FaceExpressions ? e : isWithFaceExpressions(e) ? e.expressions : void 0; - if (!expr) { - throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof"); - } - const sorted = expr.asSortedArray(); - const resultsToDisplay = sorted.filter((exprLocal) => exprLocal.probability > minConfidence); - const anchor = isWithFaceDetection(e) ? e.detection.box.bottomLeft : textFieldAnchor || new Point(0, 0); - const drawTextField = new DrawTextField(resultsToDisplay.map((exprLocal) => `${exprLocal.expression} (${round(exprLocal.probability)})`), anchor); - drawTextField.draw(canvasArg); - }); -} - -// src/factories/WithFaceLandmarks.ts -function isWithFaceLandmarks(obj) { - return isWithFaceDetection(obj) && obj["landmarks"] instanceof FaceLandmarks && obj["unshiftedLandmarks"] instanceof FaceLandmarks && obj["alignedRect"] instanceof FaceDetection; -} -function calculateFaceAngle(mesh) { - const radians = (a1, a2, b1, b2) => Math.atan2(b2 - a2, b1 - a1) % Math.PI; - const degrees = (theta) => theta * 180 / Math.PI; - const angle = {roll: void 0, pitch: void 0, yaw: void 0}; - if (!mesh || !mesh._positions || mesh._positions.length !== 68) - return angle; - const pt = mesh._positions; - angle.roll = -radians(pt[36]._x, pt[36]._y, pt[45]._x, pt[45]._y); - angle.pitch = radians(0, Math.abs(pt[0]._x - pt[30]._x) / pt[30]._x, Math.PI, Math.abs(pt[16]._x - pt[30]._x) / pt[30]._x); - const bottom = pt.reduce((prev, cur) => prev < cur._y ? prev : cur._y, Infinity); - const top = pt.reduce((prev, cur) => prev > cur._y ? prev : cur._y, -Infinity); - angle.yaw = Math.PI * (mesh._imgDims._height / (top - bottom) / 1.4 - 1); - return angle; -} -function extendWithFaceLandmarks(sourceObj, unshiftedLandmarks) { - const {box: shift} = sourceObj.detection; - const landmarks = unshiftedLandmarks.shiftBy(shift.x, shift.y); - const rect = landmarks.align(); - const {imageDims} = sourceObj.detection; - const alignedRect = new FaceDetection(sourceObj.detection.score, rect.rescale(imageDims.reverse()), imageDims); - const angle = calculateFaceAngle(unshiftedLandmarks); - const extension = { - landmarks, - unshiftedLandmarks, - alignedRect, - angle - }; - return {...sourceObj, ...extension}; -} - -// src/draw/DrawFaceLandmarks.ts -var DrawFaceLandmarksOptions = class { - constructor(options = {}) { - const { - drawLines = true, - drawPoints = true, - lineWidth, - lineColor, - pointSize, - pointColor - } = options; - this.drawLines = drawLines; - this.drawPoints = drawPoints; - this.lineWidth = lineWidth || 1; - this.pointSize = pointSize || 2; - this.lineColor = lineColor || "rgba(0, 255, 255, 1)"; - this.pointColor = pointColor || "rgba(255, 0, 255, 1)"; - } -}; -var DrawFaceLandmarks = class { - constructor(faceLandmarks, options = {}) { - this.faceLandmarks = faceLandmarks; - this.options = new DrawFaceLandmarksOptions(options); - } - draw(canvasArg) { - const ctx = getContext2dOrThrow(canvasArg); - const { - drawLines, - drawPoints, - lineWidth, - lineColor, - pointSize, - pointColor - } = this.options; - if (drawLines && this.faceLandmarks instanceof FaceLandmarks68) { - ctx.strokeStyle = lineColor; - ctx.lineWidth = lineWidth; - drawContour(ctx, this.faceLandmarks.getJawOutline()); - drawContour(ctx, this.faceLandmarks.getLeftEyeBrow()); - drawContour(ctx, this.faceLandmarks.getRightEyeBrow()); - drawContour(ctx, this.faceLandmarks.getNose()); - drawContour(ctx, this.faceLandmarks.getLeftEye(), true); - drawContour(ctx, this.faceLandmarks.getRightEye(), true); - drawContour(ctx, this.faceLandmarks.getMouth(), true); - } - if (drawPoints) { - ctx.strokeStyle = pointColor; - ctx.fillStyle = pointColor; - const drawPoint = (pt) => { - ctx.beginPath(); - ctx.arc(pt.x, pt.y, pointSize, 0, 2 * Math.PI); - ctx.fill(); - }; - this.faceLandmarks.positions.forEach(drawPoint); - } - } -}; -function drawFaceLandmarks(canvasArg, faceLandmarks) { - const faceLandmarksArray = Array.isArray(faceLandmarks) ? faceLandmarks : [faceLandmarks]; - faceLandmarksArray.forEach((f) => { - const landmarks = f instanceof FaceLandmarks ? f : isWithFaceLandmarks(f) ? f.landmarks : void 0; - if (!landmarks) { - throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof"); - } - new DrawFaceLandmarks(landmarks).draw(canvasArg); - }); -} - -// package.json -var version = "1.1.5"; - -// src/ageGenderNet/AgeGenderNet.ts -var tf20 = require_tfjs_esm(); - -// src/xception/TinyXception.ts -var tf19 = require_tfjs_esm(); - -// src/xception/extractParams.ts -function extractorsFactory2(extractWeights, paramMappings) { - const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings); - const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings); - function extractReductionBlockParams(channelsIn, channelsOut, mappedPrefix) { - const separable_conv0 = extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/separable_conv0`); - const separable_conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/separable_conv1`); - const expansion_conv = extractConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/expansion_conv`); - return {separable_conv0, separable_conv1, expansion_conv}; - } - function extractMainBlockParams(channels, mappedPrefix) { - const separable_conv0 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv0`); - const separable_conv1 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv1`); - const separable_conv2 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv2`); - return {separable_conv0, separable_conv1, separable_conv2}; - } - return { - extractConvParams, - extractSeparableConvParams, - extractReductionBlockParams, - extractMainBlockParams - }; -} -function extractParams3(weights, numMainBlocks) { - const paramMappings = []; - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const { - extractConvParams, - extractSeparableConvParams, - extractReductionBlockParams, - extractMainBlockParams - } = extractorsFactory2(extractWeights, paramMappings); - const entry_flow_conv_in = extractConvParams(3, 32, 3, "entry_flow/conv_in"); - const entry_flow_reduction_block_0 = extractReductionBlockParams(32, 64, "entry_flow/reduction_block_0"); - const entry_flow_reduction_block_1 = extractReductionBlockParams(64, 128, "entry_flow/reduction_block_1"); - const entry_flow = { - conv_in: entry_flow_conv_in, - reduction_block_0: entry_flow_reduction_block_0, - reduction_block_1: entry_flow_reduction_block_1 - }; - const middle_flow = {}; - range(numMainBlocks, 0, 1).forEach((idx) => { - middle_flow[`main_block_${idx}`] = extractMainBlockParams(128, `middle_flow/main_block_${idx}`); - }); - const exit_flow_reduction_block = extractReductionBlockParams(128, 256, "exit_flow/reduction_block"); - const exit_flow_separable_conv = extractSeparableConvParams(256, 512, "exit_flow/separable_conv"); - const exit_flow = { - reduction_block: exit_flow_reduction_block, - separable_conv: exit_flow_separable_conv - }; - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - return { - paramMappings, - params: {entry_flow, middle_flow, exit_flow} - }; -} - -// src/xception/extractParamsFromWeightMap.ts -function loadParamsFactory2(weightMap, paramMappings) { - const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); - const extractConvParams = loadConvParamsFactory(extractWeightEntry); - const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry); - function extractReductionBlockParams(mappedPrefix) { - const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`); - const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`); - const expansion_conv = extractConvParams(`${mappedPrefix}/expansion_conv`); - return {separable_conv0, separable_conv1, expansion_conv}; - } - function extractMainBlockParams(mappedPrefix) { - const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`); - const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`); - const separable_conv2 = extractSeparableConvParams(`${mappedPrefix}/separable_conv2`); - return {separable_conv0, separable_conv1, separable_conv2}; - } - return { - extractConvParams, - extractSeparableConvParams, - extractReductionBlockParams, - extractMainBlockParams - }; -} -function extractParamsFromWeightMap3(weightMap, numMainBlocks) { - const paramMappings = []; - const { - extractConvParams, - extractSeparableConvParams, - extractReductionBlockParams, - extractMainBlockParams - } = loadParamsFactory2(weightMap, paramMappings); - const entry_flow_conv_in = extractConvParams("entry_flow/conv_in"); - const entry_flow_reduction_block_0 = extractReductionBlockParams("entry_flow/reduction_block_0"); - const entry_flow_reduction_block_1 = extractReductionBlockParams("entry_flow/reduction_block_1"); - const entry_flow = { - conv_in: entry_flow_conv_in, - reduction_block_0: entry_flow_reduction_block_0, - reduction_block_1: entry_flow_reduction_block_1 - }; - const middle_flow = {}; - range(numMainBlocks, 0, 1).forEach((idx) => { - middle_flow[`main_block_${idx}`] = extractMainBlockParams(`middle_flow/main_block_${idx}`); - }); - const exit_flow_reduction_block = extractReductionBlockParams("exit_flow/reduction_block"); - const exit_flow_separable_conv = extractSeparableConvParams("exit_flow/separable_conv"); - const exit_flow = { - reduction_block: exit_flow_reduction_block, - separable_conv: exit_flow_separable_conv - }; - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params: {entry_flow, middle_flow, exit_flow}, paramMappings}; -} - -// src/xception/TinyXception.ts -function conv(x, params, stride) { - return tf19.add(tf19.conv2d(x, params.filters, stride, "same"), params.bias); -} -function reductionBlock(x, params, isActivateInput = true) { - let out = isActivateInput ? tf19.relu(x) : x; - out = depthwiseSeparableConv(out, params.separable_conv0, [1, 1]); - out = depthwiseSeparableConv(tf19.relu(out), params.separable_conv1, [1, 1]); - out = tf19.maxPool(out, [3, 3], [2, 2], "same"); - out = tf19.add(out, conv(x, params.expansion_conv, [2, 2])); - return out; -} -function mainBlock(x, params) { - let out = depthwiseSeparableConv(tf19.relu(x), params.separable_conv0, [1, 1]); - out = depthwiseSeparableConv(tf19.relu(out), params.separable_conv1, [1, 1]); - out = depthwiseSeparableConv(tf19.relu(out), params.separable_conv2, [1, 1]); - out = tf19.add(out, x); - return out; -} -var TinyXception = class extends NeuralNetwork { - constructor(numMainBlocks) { - super("TinyXception"); - this._numMainBlocks = numMainBlocks; - } - forwardInput(input) { - const {params} = this; - if (!params) { - throw new Error("TinyXception - load model before inference"); - } - return tf19.tidy(() => { - const batchTensor = tf19.cast(input.toBatchTensor(112, true), "float32"); - const meanRgb = [122.782, 117.001, 104.298]; - const normalized = normalize(batchTensor, meanRgb).div(255); - let out = tf19.relu(conv(normalized, params.entry_flow.conv_in, [2, 2])); - out = reductionBlock(out, params.entry_flow.reduction_block_0, false); - out = reductionBlock(out, params.entry_flow.reduction_block_1); - range(this._numMainBlocks, 0, 1).forEach((idx) => { - out = mainBlock(out, params.middle_flow[`main_block_${idx}`]); - }); - out = reductionBlock(out, params.exit_flow.reduction_block); - out = tf19.relu(depthwiseSeparableConv(out, params.exit_flow.separable_conv, [1, 1])); - return out; - }); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - getDefaultModelName() { - return "tiny_xception_model"; - } - extractParamsFromWeightMap(weightMap) { - return extractParamsFromWeightMap3(weightMap, this._numMainBlocks); - } - extractParams(weights) { - return extractParams3(weights, this._numMainBlocks); - } -}; - -// src/ageGenderNet/extractParams.ts -function extractParams4(weights) { - const paramMappings = []; - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings); - const age = extractFCParams(512, 1, "fc/age"); - const gender = extractFCParams(512, 2, "fc/gender"); - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - return { - paramMappings, - params: {fc: {age, gender}} - }; -} - -// src/ageGenderNet/extractParamsFromWeightMap.ts -function extractParamsFromWeightMap4(weightMap) { - const paramMappings = []; - const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); - function extractFcParams(prefix) { - const weights = extractWeightEntry(`${prefix}/weights`, 2); - const bias = extractWeightEntry(`${prefix}/bias`, 1); - return {weights, bias}; - } - const params = { - fc: { - age: extractFcParams("fc/age"), - gender: extractFcParams("fc/gender") - } - }; - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params, paramMappings}; -} - -// src/ageGenderNet/types.ts -var Gender; -(function(Gender2) { - Gender2["FEMALE"] = "female"; - Gender2["MALE"] = "male"; -})(Gender || (Gender = {})); - -// src/ageGenderNet/AgeGenderNet.ts -var AgeGenderNet = class extends NeuralNetwork { - constructor(faceFeatureExtractor = new TinyXception(2)) { - super("AgeGenderNet"); - this._faceFeatureExtractor = faceFeatureExtractor; - } - get faceFeatureExtractor() { - return this._faceFeatureExtractor; - } - runNet(input) { - const {params} = this; - if (!params) { - throw new Error(`${this._name} - load model before inference`); - } - return tf20.tidy(() => { - const bottleneckFeatures = input instanceof NetInput ? this.faceFeatureExtractor.forwardInput(input) : input; - const pooled = tf20.avgPool(bottleneckFeatures, [7, 7], [2, 2], "valid").as2D(bottleneckFeatures.shape[0], -1); - const age = fullyConnectedLayer(pooled, params.fc.age).as1D(); - const gender = fullyConnectedLayer(pooled, params.fc.gender); - return {age, gender}; - }); - } - forwardInput(input) { - return tf20.tidy(() => { - const {age, gender} = this.runNet(input); - return {age, gender: tf20.softmax(gender)}; - }); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - async predictAgeAndGender(input) { - const netInput = await toNetInput(input); - const out = await this.forwardInput(netInput); - const ages = tf20.unstack(out.age); - const genders = tf20.unstack(out.gender); - const ageAndGenderTensors = ages.map((ageTensor, i) => ({ - ageTensor, - genderTensor: genders[i] - })); - const predictionsByBatch = await Promise.all(ageAndGenderTensors.map(async ({ageTensor, genderTensor}) => { - const age = ageTensor.dataSync()[0]; - const probMale = genderTensor.dataSync()[0]; - const isMale = probMale > 0.5; - const gender = isMale ? Gender.MALE : Gender.FEMALE; - const genderProbability = isMale ? probMale : 1 - probMale; - ageTensor.dispose(); - genderTensor.dispose(); - return {age, gender, genderProbability}; - })); - out.age.dispose(); - out.gender.dispose(); - return netInput.isBatchInput ? predictionsByBatch : predictionsByBatch[0]; - } - getDefaultModelName() { - return "age_gender_model"; - } - dispose(throwOnRedispose = true) { - this.faceFeatureExtractor.dispose(throwOnRedispose); - super.dispose(throwOnRedispose); - } - loadClassifierParams(weights) { - const {params, paramMappings} = this.extractClassifierParams(weights); - this._params = params; - this._paramMappings = paramMappings; - } - extractClassifierParams(weights) { - return extractParams4(weights); - } - extractParamsFromWeightMap(weightMap) { - const {featureExtractorMap, classifierMap} = seperateWeightMaps(weightMap); - this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap); - return extractParamsFromWeightMap4(classifierMap); - } - extractParams(weights) { - const classifierWeightSize = 512 * 1 + 1 + (512 * 2 + 2); - const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize); - const classifierWeights = weights.slice(weights.length - classifierWeightSize); - this.faceFeatureExtractor.extractWeights(featureExtractorWeights); - return this.extractClassifierParams(classifierWeights); - } -}; - -// src/faceLandmarkNet/FaceLandmark68NetBase.ts -var tf21 = require_tfjs_esm(); -var FaceLandmark68NetBase = class extends FaceProcessor { - postProcess(output, inputSize, originalDimensions) { - const inputDimensions = originalDimensions.map(({width, height}) => { - const scale2 = inputSize / Math.max(height, width); - return { - width: width * scale2, - height: height * scale2 - }; - }); - const batchSize = inputDimensions.length; - return tf21.tidy(() => { - const createInterleavedTensor = (fillX, fillY) => tf21.stack([tf21.fill([68], fillX, "float32"), tf21.fill([68], fillY, "float32")], 1).as2D(1, 136).as1D(); - const getPadding = (batchIdx, cond) => { - const {width, height} = inputDimensions[batchIdx]; - return cond(width, height) ? Math.abs(width - height) / 2 : 0; - }; - const getPaddingX = (batchIdx) => getPadding(batchIdx, (w, h) => w < h); - const getPaddingY = (batchIdx) => getPadding(batchIdx, (w, h) => h < w); - const landmarkTensors = output.mul(tf21.fill([batchSize, 136], inputSize, "float32")).sub(tf21.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(getPaddingX(batchIdx), getPaddingY(batchIdx))))).div(tf21.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(inputDimensions[batchIdx].width, inputDimensions[batchIdx].height)))); - return landmarkTensors; - }); - } - forwardInput(input) { - return tf21.tidy(() => { - const out = this.runNet(input); - return this.postProcess(out, input.inputSize, input.inputDimensions.map(([height, width]) => ({height, width}))); - }); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - async detectLandmarks(input) { - const netInput = await toNetInput(input); - const landmarkTensors = tf21.tidy(() => tf21.unstack(this.forwardInput(netInput))); - const landmarksForBatch = await Promise.all(landmarkTensors.map(async (landmarkTensor, batchIdx) => { - const landmarksArray = Array.from(landmarkTensor.dataSync()); - const xCoords = landmarksArray.filter((_, i) => isEven(i)); - const yCoords = landmarksArray.filter((_, i) => !isEven(i)); - return new FaceLandmarks68(Array(68).fill(0).map((_, i) => new Point(xCoords[i], yCoords[i])), { - height: netInput.getInputHeight(batchIdx), - width: netInput.getInputWidth(batchIdx) - }); - })); - landmarkTensors.forEach((t) => t.dispose()); - return netInput.isBatchInput ? landmarksForBatch : landmarksForBatch[0]; - } - getClassifierChannelsOut() { - return 136; - } -}; - -// src/faceLandmarkNet/FaceLandmark68Net.ts -var FaceLandmark68Net = class extends FaceLandmark68NetBase { - constructor(faceFeatureExtractor = new FaceFeatureExtractor()) { - super("FaceLandmark68Net", faceFeatureExtractor); - } - getDefaultModelName() { - return "face_landmark_68_model"; - } - getClassifierChannelsIn() { - return 256; - } -}; - -// src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts -var tf22 = require_tfjs_esm(); - -// src/faceFeatureExtractor/extractParamsFromWeightMapTiny.ts -function extractParamsFromWeightMapTiny(weightMap) { - const paramMappings = []; - const { - extractDenseBlock3Params - } = loadParamsFactory(weightMap, paramMappings); - const params = { - dense0: extractDenseBlock3Params("dense0", true), - dense1: extractDenseBlock3Params("dense1"), - dense2: extractDenseBlock3Params("dense2") - }; - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params, paramMappings}; -} - -// src/faceFeatureExtractor/extractParamsTiny.ts -function extractParamsTiny(weights) { - const paramMappings = []; - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const { - extractDenseBlock3Params - } = extractorsFactory(extractWeights, paramMappings); - const dense0 = extractDenseBlock3Params(3, 32, "dense0", true); - const dense1 = extractDenseBlock3Params(32, 64, "dense1"); - const dense2 = extractDenseBlock3Params(64, 128, "dense2"); - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - return { - paramMappings, - params: {dense0, dense1, dense2} - }; -} - -// src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts -var TinyFaceFeatureExtractor = class extends NeuralNetwork { - constructor() { - super("TinyFaceFeatureExtractor"); - } - forwardInput(input) { - const {params} = this; - if (!params) { - throw new Error("TinyFaceFeatureExtractor - load model before inference"); - } - return tf22.tidy(() => { - const batchTensor = tf22.cast(input.toBatchTensor(112, true), "float32"); - const meanRgb = [122.782, 117.001, 104.298]; - const normalized = normalize(batchTensor, meanRgb).div(255); - let out = denseBlock3(normalized, params.dense0, true); - out = denseBlock3(out, params.dense1); - out = denseBlock3(out, params.dense2); - out = tf22.avgPool(out, [14, 14], [2, 2], "valid"); - return out; - }); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - getDefaultModelName() { - return "face_feature_extractor_tiny_model"; - } - extractParamsFromWeightMap(weightMap) { - return extractParamsFromWeightMapTiny(weightMap); - } - extractParams(weights) { - return extractParamsTiny(weights); - } -}; - -// src/faceLandmarkNet/FaceLandmark68TinyNet.ts -var FaceLandmark68TinyNet = class extends FaceLandmark68NetBase { - constructor(faceFeatureExtractor = new TinyFaceFeatureExtractor()) { - super("FaceLandmark68TinyNet", faceFeatureExtractor); - } - getDefaultModelName() { - return "face_landmark_68_tiny_model"; - } - getClassifierChannelsIn() { - return 128; - } -}; - -// src/faceLandmarkNet/index.ts -var FaceLandmarkNet = class extends FaceLandmark68Net { -}; - -// src/faceRecognitionNet/FaceRecognitionNet.ts -var tf27 = require_tfjs_esm(); - -// src/faceRecognitionNet/convLayer.ts -var tf24 = require_tfjs_esm(); - -// src/faceRecognitionNet/scaleLayer.ts -var tf23 = require_tfjs_esm(); -function scale(x, params) { - return tf23.add(tf23.mul(x, params.weights), params.biases); -} - -// src/faceRecognitionNet/convLayer.ts -function convLayer2(x, params, strides, withRelu, padding = "same") { - const {filters, bias} = params.conv; - let out = tf24.conv2d(x, filters, strides, padding); - out = tf24.add(out, bias); - out = scale(out, params.scale); - return withRelu ? tf24.relu(out) : out; -} -function conv2(x, params) { - return convLayer2(x, params, [1, 1], true); -} -function convNoRelu(x, params) { - return convLayer2(x, params, [1, 1], false); -} -function convDown(x, params) { - return convLayer2(x, params, [2, 2], true, "valid"); -} - -// src/faceRecognitionNet/extractParams.ts -var tf25 = require_tfjs_esm(); -function extractorsFactory3(extractWeights, paramMappings) { - function extractFilterValues(numFilterValues, numFilters, filterSize) { - const weights = extractWeights(numFilterValues); - const depth = weights.length / (numFilters * filterSize * filterSize); - if (isFloat(depth)) { - throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`); - } - return tf25.tidy(() => tf25.transpose(tf25.tensor4d(weights, [numFilters, depth, filterSize, filterSize]), [2, 3, 1, 0])); - } - function extractConvParams(numFilterValues, numFilters, filterSize, mappedPrefix) { - const filters = extractFilterValues(numFilterValues, numFilters, filterSize); - const bias = tf25.tensor1d(extractWeights(numFilters)); - paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/bias`}); - return {filters, bias}; - } - function extractScaleLayerParams(numWeights, mappedPrefix) { - const weights = tf25.tensor1d(extractWeights(numWeights)); - const biases = tf25.tensor1d(extractWeights(numWeights)); - paramMappings.push({paramPath: `${mappedPrefix}/weights`}, {paramPath: `${mappedPrefix}/biases`}); - return { - weights, - biases - }; - } - function extractConvLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix) { - const conv3 = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`); - const scale2 = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`); - return {conv: conv3, scale: scale2}; - } - function extractResidualLayerParams(numFilterValues, numFilters, filterSize, mappedPrefix, isDown = false) { - const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`); - const conv22 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`); - return {conv1, conv2: conv22}; - } - return { - extractConvLayerParams, - extractResidualLayerParams - }; -} -function extractParams5(weights) { - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const paramMappings = []; - const { - extractConvLayerParams, - extractResidualLayerParams - } = extractorsFactory3(extractWeights, paramMappings); - const conv32_down = extractConvLayerParams(4704, 32, 7, "conv32_down"); - const conv32_1 = extractResidualLayerParams(9216, 32, 3, "conv32_1"); - const conv32_2 = extractResidualLayerParams(9216, 32, 3, "conv32_2"); - const conv32_3 = extractResidualLayerParams(9216, 32, 3, "conv32_3"); - const conv64_down = extractResidualLayerParams(36864, 64, 3, "conv64_down", true); - const conv64_1 = extractResidualLayerParams(36864, 64, 3, "conv64_1"); - const conv64_2 = extractResidualLayerParams(36864, 64, 3, "conv64_2"); - const conv64_3 = extractResidualLayerParams(36864, 64, 3, "conv64_3"); - const conv128_down = extractResidualLayerParams(147456, 128, 3, "conv128_down", true); - const conv128_1 = extractResidualLayerParams(147456, 128, 3, "conv128_1"); - const conv128_2 = extractResidualLayerParams(147456, 128, 3, "conv128_2"); - const conv256_down = extractResidualLayerParams(589824, 256, 3, "conv256_down", true); - const conv256_1 = extractResidualLayerParams(589824, 256, 3, "conv256_1"); - const conv256_2 = extractResidualLayerParams(589824, 256, 3, "conv256_2"); - const conv256_down_out = extractResidualLayerParams(589824, 256, 3, "conv256_down_out"); - const fc = tf25.tidy(() => tf25.transpose(tf25.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0])); - paramMappings.push({paramPath: "fc"}); - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - const params = { - conv32_down, - conv32_1, - conv32_2, - conv32_3, - conv64_down, - conv64_1, - conv64_2, - conv64_3, - conv128_down, - conv128_1, - conv128_2, - conv256_down, - conv256_1, - conv256_2, - conv256_down_out, - fc - }; - return {params, paramMappings}; -} - -// src/faceRecognitionNet/extractParamsFromWeightMap.ts -function extractorsFactory4(weightMap, paramMappings) { - const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); - function extractScaleLayerParams(prefix) { - const weights = extractWeightEntry(`${prefix}/scale/weights`, 1); - const biases = extractWeightEntry(`${prefix}/scale/biases`, 1); - return {weights, biases}; - } - function extractConvLayerParams(prefix) { - const filters = extractWeightEntry(`${prefix}/conv/filters`, 4); - const bias = extractWeightEntry(`${prefix}/conv/bias`, 1); - const scale2 = extractScaleLayerParams(prefix); - return {conv: {filters, bias}, scale: scale2}; - } - function extractResidualLayerParams(prefix) { - return { - conv1: extractConvLayerParams(`${prefix}/conv1`), - conv2: extractConvLayerParams(`${prefix}/conv2`) - }; - } - return { - extractConvLayerParams, - extractResidualLayerParams - }; -} -function extractParamsFromWeightMap5(weightMap) { - const paramMappings = []; - const { - extractConvLayerParams, - extractResidualLayerParams - } = extractorsFactory4(weightMap, paramMappings); - const conv32_down = extractConvLayerParams("conv32_down"); - const conv32_1 = extractResidualLayerParams("conv32_1"); - const conv32_2 = extractResidualLayerParams("conv32_2"); - const conv32_3 = extractResidualLayerParams("conv32_3"); - const conv64_down = extractResidualLayerParams("conv64_down"); - const conv64_1 = extractResidualLayerParams("conv64_1"); - const conv64_2 = extractResidualLayerParams("conv64_2"); - const conv64_3 = extractResidualLayerParams("conv64_3"); - const conv128_down = extractResidualLayerParams("conv128_down"); - const conv128_1 = extractResidualLayerParams("conv128_1"); - const conv128_2 = extractResidualLayerParams("conv128_2"); - const conv256_down = extractResidualLayerParams("conv256_down"); - const conv256_1 = extractResidualLayerParams("conv256_1"); - const conv256_2 = extractResidualLayerParams("conv256_2"); - const conv256_down_out = extractResidualLayerParams("conv256_down_out"); - const {fc} = weightMap; - paramMappings.push({originalPath: "fc", paramPath: "fc"}); - if (!isTensor2D(fc)) { - throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`); - } - const params = { - conv32_down, - conv32_1, - conv32_2, - conv32_3, - conv64_down, - conv64_1, - conv64_2, - conv64_3, - conv128_down, - conv128_1, - conv128_2, - conv256_down, - conv256_1, - conv256_2, - conv256_down_out, - fc - }; - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params, paramMappings}; -} - -// src/faceRecognitionNet/residualLayer.ts -var tf26 = require_tfjs_esm(); -function residual(x, params) { - let out = conv2(x, params.conv1); - out = convNoRelu(out, params.conv2); - out = tf26.add(out, x); - out = tf26.relu(out); - return out; -} -function residualDown(x, params) { - let out = convDown(x, params.conv1); - out = convNoRelu(out, params.conv2); - let pooled = tf26.avgPool(x, 2, 2, "valid"); - const zeros2 = tf26.zeros(pooled.shape); - const isPad = pooled.shape[3] !== out.shape[3]; - const isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2]; - if (isAdjustShape) { - const padShapeX = [...out.shape]; - padShapeX[1] = 1; - const zerosW = tf26.zeros(padShapeX); - out = tf26.concat([out, zerosW], 1); - const padShapeY = [...out.shape]; - padShapeY[2] = 1; - const zerosH = tf26.zeros(padShapeY); - out = tf26.concat([out, zerosH], 2); - } - pooled = isPad ? tf26.concat([pooled, zeros2], 3) : pooled; - out = tf26.add(pooled, out); - out = tf26.relu(out); - return out; -} - -// src/faceRecognitionNet/FaceRecognitionNet.ts -var FaceRecognitionNet = class extends NeuralNetwork { - constructor() { - super("FaceRecognitionNet"); - } - forwardInput(input) { - const {params} = this; - if (!params) { - throw new Error("FaceRecognitionNet - load model before inference"); - } - return tf27.tidy(() => { - const batchTensor = tf27.cast(input.toBatchTensor(150, true), "float32"); - const meanRgb = [122.782, 117.001, 104.298]; - const normalized = normalize(batchTensor, meanRgb).div(255); - let out = convDown(normalized, params.conv32_down); - out = tf27.maxPool(out, 3, 2, "valid"); - out = residual(out, params.conv32_1); - out = residual(out, params.conv32_2); - out = residual(out, params.conv32_3); - out = residualDown(out, params.conv64_down); - out = residual(out, params.conv64_1); - out = residual(out, params.conv64_2); - out = residual(out, params.conv64_3); - out = residualDown(out, params.conv128_down); - out = residual(out, params.conv128_1); - out = residual(out, params.conv128_2); - out = residualDown(out, params.conv256_down); - out = residual(out, params.conv256_1); - out = residual(out, params.conv256_2); - out = residualDown(out, params.conv256_down_out); - const globalAvg = out.mean([1, 2]); - const fullyConnected = tf27.matMul(globalAvg, params.fc); - return fullyConnected; - }); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - async computeFaceDescriptor(input) { - var _a; - if ((_a = input == null ? void 0 : input.shape) == null ? void 0 : _a.some((dim) => dim <= 0)) - return new Float32Array(128); - const netInput = await toNetInput(input); - const faceDescriptorTensors = tf27.tidy(() => tf27.unstack(this.forwardInput(netInput))); - const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map((t) => t.data())); - faceDescriptorTensors.forEach((t) => t.dispose()); - return netInput.isBatchInput ? faceDescriptorsForBatch : faceDescriptorsForBatch[0]; - } - getDefaultModelName() { - return "face_recognition_model"; - } - extractParamsFromWeightMap(weightMap) { - return extractParamsFromWeightMap5(weightMap); - } - extractParams(weights) { - return extractParams5(weights); - } -}; - -// src/faceRecognitionNet/index.ts -function createFaceRecognitionNet(weights) { - const net = new FaceRecognitionNet(); - net.extractWeights(weights); - return net; -} - -// src/factories/WithFaceDescriptor.ts -function extendWithFaceDescriptor(sourceObj, descriptor) { - const extension = {descriptor}; - return {...sourceObj, ...extension}; -} - -// src/factories/WithAge.ts -function isWithAge(obj) { - return typeof obj.age === "number"; -} -function extendWithAge(sourceObj, age) { - const extension = {age}; - return {...sourceObj, ...extension}; -} - -// src/factories/WithGender.ts -function isWithGender(obj) { - return (obj.gender === Gender.MALE || obj.gender === Gender.FEMALE) && isValidProbablitiy(obj.genderProbability); -} -function extendWithGender(sourceObj, gender, genderProbability) { - const extension = {gender, genderProbability}; - return {...sourceObj, ...extension}; -} - -// src/ssdMobilenetv1/SsdMobilenetv1.ts -var tf34 = require_tfjs_esm(); - -// src/ssdMobilenetv1/extractParams.ts -var tf28 = require_tfjs_esm(); -function extractorsFactory5(extractWeights, paramMappings) { - function extractDepthwiseConvParams(numChannels, mappedPrefix) { - const filters = tf28.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]); - const batch_norm_scale = tf28.tensor1d(extractWeights(numChannels)); - const batch_norm_offset = tf28.tensor1d(extractWeights(numChannels)); - const batch_norm_mean = tf28.tensor1d(extractWeights(numChannels)); - const batch_norm_variance = tf28.tensor1d(extractWeights(numChannels)); - paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/batch_norm_scale`}, {paramPath: `${mappedPrefix}/batch_norm_offset`}, {paramPath: `${mappedPrefix}/batch_norm_mean`}, {paramPath: `${mappedPrefix}/batch_norm_variance`}); - return { - filters, - batch_norm_scale, - batch_norm_offset, - batch_norm_mean, - batch_norm_variance - }; - } - function extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, isPointwiseConv) { - const filters = tf28.tensor4d(extractWeights(channelsIn * channelsOut * filterSize * filterSize), [filterSize, filterSize, channelsIn, channelsOut]); - const bias = tf28.tensor1d(extractWeights(channelsOut)); - paramMappings.push({paramPath: `${mappedPrefix}/filters`}, {paramPath: `${mappedPrefix}/${isPointwiseConv ? "batch_norm_offset" : "bias"}`}); - return {filters, bias}; - } - function extractPointwiseConvParams(channelsIn, channelsOut, filterSize, mappedPrefix) { - const { - filters, - bias - } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true); - return { - filters, - batch_norm_offset: bias - }; - } - function extractConvPairParams(channelsIn, channelsOut, mappedPrefix) { - const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`); - const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`); - return {depthwise_conv, pointwise_conv}; - } - function extractMobilenetV1Params() { - const conv_0 = extractPointwiseConvParams(3, 32, 3, "mobilenetv1/conv_0"); - const conv_1 = extractConvPairParams(32, 64, "mobilenetv1/conv_1"); - const conv_2 = extractConvPairParams(64, 128, "mobilenetv1/conv_2"); - const conv_3 = extractConvPairParams(128, 128, "mobilenetv1/conv_3"); - const conv_4 = extractConvPairParams(128, 256, "mobilenetv1/conv_4"); - const conv_5 = extractConvPairParams(256, 256, "mobilenetv1/conv_5"); - const conv_6 = extractConvPairParams(256, 512, "mobilenetv1/conv_6"); - const conv_7 = extractConvPairParams(512, 512, "mobilenetv1/conv_7"); - const conv_8 = extractConvPairParams(512, 512, "mobilenetv1/conv_8"); - const conv_9 = extractConvPairParams(512, 512, "mobilenetv1/conv_9"); - const conv_10 = extractConvPairParams(512, 512, "mobilenetv1/conv_10"); - const conv_11 = extractConvPairParams(512, 512, "mobilenetv1/conv_11"); - const conv_12 = extractConvPairParams(512, 1024, "mobilenetv1/conv_12"); - const conv_13 = extractConvPairParams(1024, 1024, "mobilenetv1/conv_13"); - return { - conv_0, - conv_1, - conv_2, - conv_3, - conv_4, - conv_5, - conv_6, - conv_7, - conv_8, - conv_9, - conv_10, - conv_11, - conv_12, - conv_13 - }; - } - function extractPredictionLayerParams() { - const conv_0 = extractPointwiseConvParams(1024, 256, 1, "prediction_layer/conv_0"); - const conv_1 = extractPointwiseConvParams(256, 512, 3, "prediction_layer/conv_1"); - const conv_2 = extractPointwiseConvParams(512, 128, 1, "prediction_layer/conv_2"); - const conv_3 = extractPointwiseConvParams(128, 256, 3, "prediction_layer/conv_3"); - const conv_4 = extractPointwiseConvParams(256, 128, 1, "prediction_layer/conv_4"); - const conv_5 = extractPointwiseConvParams(128, 256, 3, "prediction_layer/conv_5"); - const conv_6 = extractPointwiseConvParams(256, 64, 1, "prediction_layer/conv_6"); - const conv_7 = extractPointwiseConvParams(64, 128, 3, "prediction_layer/conv_7"); - const box_encoding_0_predictor = extractConvParams(512, 12, 1, "prediction_layer/box_predictor_0/box_encoding_predictor"); - const class_predictor_0 = extractConvParams(512, 9, 1, "prediction_layer/box_predictor_0/class_predictor"); - const box_encoding_1_predictor = extractConvParams(1024, 24, 1, "prediction_layer/box_predictor_1/box_encoding_predictor"); - const class_predictor_1 = extractConvParams(1024, 18, 1, "prediction_layer/box_predictor_1/class_predictor"); - const box_encoding_2_predictor = extractConvParams(512, 24, 1, "prediction_layer/box_predictor_2/box_encoding_predictor"); - const class_predictor_2 = extractConvParams(512, 18, 1, "prediction_layer/box_predictor_2/class_predictor"); - const box_encoding_3_predictor = extractConvParams(256, 24, 1, "prediction_layer/box_predictor_3/box_encoding_predictor"); - const class_predictor_3 = extractConvParams(256, 18, 1, "prediction_layer/box_predictor_3/class_predictor"); - const box_encoding_4_predictor = extractConvParams(256, 24, 1, "prediction_layer/box_predictor_4/box_encoding_predictor"); - const class_predictor_4 = extractConvParams(256, 18, 1, "prediction_layer/box_predictor_4/class_predictor"); - const box_encoding_5_predictor = extractConvParams(128, 24, 1, "prediction_layer/box_predictor_5/box_encoding_predictor"); - const class_predictor_5 = extractConvParams(128, 18, 1, "prediction_layer/box_predictor_5/class_predictor"); - const box_predictor_0 = { - box_encoding_predictor: box_encoding_0_predictor, - class_predictor: class_predictor_0 - }; - const box_predictor_1 = { - box_encoding_predictor: box_encoding_1_predictor, - class_predictor: class_predictor_1 - }; - const box_predictor_2 = { - box_encoding_predictor: box_encoding_2_predictor, - class_predictor: class_predictor_2 - }; - const box_predictor_3 = { - box_encoding_predictor: box_encoding_3_predictor, - class_predictor: class_predictor_3 - }; - const box_predictor_4 = { - box_encoding_predictor: box_encoding_4_predictor, - class_predictor: class_predictor_4 - }; - const box_predictor_5 = { - box_encoding_predictor: box_encoding_5_predictor, - class_predictor: class_predictor_5 - }; - return { - conv_0, - conv_1, - conv_2, - conv_3, - conv_4, - conv_5, - conv_6, - conv_7, - box_predictor_0, - box_predictor_1, - box_predictor_2, - box_predictor_3, - box_predictor_4, - box_predictor_5 - }; - } - return { - extractMobilenetV1Params, - extractPredictionLayerParams - }; -} -function extractParams6(weights) { - const paramMappings = []; - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const { - extractMobilenetV1Params, - extractPredictionLayerParams - } = extractorsFactory5(extractWeights, paramMappings); - const mobilenetv1 = extractMobilenetV1Params(); - const prediction_layer = extractPredictionLayerParams(); - const extra_dim = tf28.tensor3d(extractWeights(5118 * 4), [1, 5118, 4]); - const output_layer = { - extra_dim - }; - paramMappings.push({paramPath: "output_layer/extra_dim"}); - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - return { - params: { - mobilenetv1, - prediction_layer, - output_layer - }, - paramMappings - }; -} - -// src/ssdMobilenetv1/extractParamsFromWeightMap.ts -function extractorsFactory6(weightMap, paramMappings) { - const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); - function extractPointwiseConvParams(prefix, idx, mappedPrefix) { - const filters = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`); - const batch_norm_offset = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`); - return {filters, batch_norm_offset}; - } - function extractConvPairParams(idx) { - const mappedPrefix = `mobilenetv1/conv_${idx}`; - const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`; - const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`; - const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`; - const filters = extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`); - const batch_norm_scale = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`); - const batch_norm_offset = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`); - const batch_norm_mean = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`); - const batch_norm_variance = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`); - return { - depthwise_conv: { - filters, - batch_norm_scale, - batch_norm_offset, - batch_norm_mean, - batch_norm_variance - }, - pointwise_conv: extractPointwiseConvParams("MobilenetV1", idx, mappedPrefixPointwiseConv) - }; - } - function extractMobilenetV1Params() { - return { - conv_0: extractPointwiseConvParams("MobilenetV1", 0, "mobilenetv1/conv_0"), - conv_1: extractConvPairParams(1), - conv_2: extractConvPairParams(2), - conv_3: extractConvPairParams(3), - conv_4: extractConvPairParams(4), - conv_5: extractConvPairParams(5), - conv_6: extractConvPairParams(6), - conv_7: extractConvPairParams(7), - conv_8: extractConvPairParams(8), - conv_9: extractConvPairParams(9), - conv_10: extractConvPairParams(10), - conv_11: extractConvPairParams(11), - conv_12: extractConvPairParams(12), - conv_13: extractConvPairParams(13) - }; - } - function extractConvParams(prefix, mappedPrefix) { - const filters = extractWeightEntry(`${prefix}/weights`, 4, `${mappedPrefix}/filters`); - const bias = extractWeightEntry(`${prefix}/biases`, 1, `${mappedPrefix}/bias`); - return {filters, bias}; - } - function extractBoxPredictorParams(idx) { - const box_encoding_predictor = extractConvParams(`Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`, `prediction_layer/box_predictor_${idx}/box_encoding_predictor`); - const class_predictor = extractConvParams(`Prediction/BoxPredictor_${idx}/ClassPredictor`, `prediction_layer/box_predictor_${idx}/class_predictor`); - return {box_encoding_predictor, class_predictor}; - } - function extractPredictionLayerParams() { - return { - conv_0: extractPointwiseConvParams("Prediction", 0, "prediction_layer/conv_0"), - conv_1: extractPointwiseConvParams("Prediction", 1, "prediction_layer/conv_1"), - conv_2: extractPointwiseConvParams("Prediction", 2, "prediction_layer/conv_2"), - conv_3: extractPointwiseConvParams("Prediction", 3, "prediction_layer/conv_3"), - conv_4: extractPointwiseConvParams("Prediction", 4, "prediction_layer/conv_4"), - conv_5: extractPointwiseConvParams("Prediction", 5, "prediction_layer/conv_5"), - conv_6: extractPointwiseConvParams("Prediction", 6, "prediction_layer/conv_6"), - conv_7: extractPointwiseConvParams("Prediction", 7, "prediction_layer/conv_7"), - box_predictor_0: extractBoxPredictorParams(0), - box_predictor_1: extractBoxPredictorParams(1), - box_predictor_2: extractBoxPredictorParams(2), - box_predictor_3: extractBoxPredictorParams(3), - box_predictor_4: extractBoxPredictorParams(4), - box_predictor_5: extractBoxPredictorParams(5) - }; - } - return { - extractMobilenetV1Params, - extractPredictionLayerParams - }; -} -function extractParamsFromWeightMap6(weightMap) { - const paramMappings = []; - const { - extractMobilenetV1Params, - extractPredictionLayerParams - } = extractorsFactory6(weightMap, paramMappings); - const extra_dim = weightMap["Output/extra_dim"]; - paramMappings.push({originalPath: "Output/extra_dim", paramPath: "output_layer/extra_dim"}); - if (!isTensor3D(extra_dim)) { - throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`); - } - const params = { - mobilenetv1: extractMobilenetV1Params(), - prediction_layer: extractPredictionLayerParams(), - output_layer: { - extra_dim - } - }; - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params, paramMappings}; -} - -// src/ssdMobilenetv1/mobileNetV1.ts -var tf30 = require_tfjs_esm(); - -// src/ssdMobilenetv1/pointwiseConvLayer.ts -var tf29 = require_tfjs_esm(); -function pointwiseConvLayer(x, params, strides) { - return tf29.tidy(() => { - let out = tf29.conv2d(x, params.filters, strides, "same"); - out = tf29.add(out, params.batch_norm_offset); - return tf29.clipByValue(out, 0, 6); - }); -} - -// src/ssdMobilenetv1/mobileNetV1.ts -var epsilon = 0.0010000000474974513; -function depthwiseConvLayer(x, params, strides) { - return tf30.tidy(() => { - let out = tf30.depthwiseConv2d(x, params.filters, strides, "same"); - out = tf30.batchNorm(out, params.batch_norm_mean, params.batch_norm_variance, params.batch_norm_offset, params.batch_norm_scale, epsilon); - return tf30.clipByValue(out, 0, 6); - }); -} -function getStridesForLayerIdx(layerIdx) { - return [2, 4, 6, 12].some((idx) => idx === layerIdx) ? [2, 2] : [1, 1]; -} -function mobileNetV1(x, params) { - return tf30.tidy(() => { - let conv11; - let out = pointwiseConvLayer(x, params.conv_0, [2, 2]); - const convPairParams = [ - params.conv_1, - params.conv_2, - params.conv_3, - params.conv_4, - params.conv_5, - params.conv_6, - params.conv_7, - params.conv_8, - params.conv_9, - params.conv_10, - params.conv_11, - params.conv_12, - params.conv_13 - ]; - convPairParams.forEach((param, i) => { - const layerIdx = i + 1; - const depthwiseConvStrides = getStridesForLayerIdx(layerIdx); - out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides); - out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]); - if (layerIdx === 11) - conv11 = out; - }); - if (conv11 === null) { - throw new Error("mobileNetV1 - output of conv layer 11 is null"); - } - return { - out, - conv11 - }; - }); -} - -// src/ssdMobilenetv1/nonMaxSuppression.ts -function IOU(boxes, i, j) { - const boxesData = boxes.arraySync(); - const yminI = Math.min(boxesData[i][0], boxesData[i][2]); - const xminI = Math.min(boxesData[i][1], boxesData[i][3]); - const ymaxI = Math.max(boxesData[i][0], boxesData[i][2]); - const xmaxI = Math.max(boxesData[i][1], boxesData[i][3]); - const yminJ = Math.min(boxesData[j][0], boxesData[j][2]); - const xminJ = Math.min(boxesData[j][1], boxesData[j][3]); - const ymaxJ = Math.max(boxesData[j][0], boxesData[j][2]); - const xmaxJ = Math.max(boxesData[j][1], boxesData[j][3]); - const areaI = (ymaxI - yminI) * (xmaxI - xminI); - const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ); - if (areaI <= 0 || areaJ <= 0) - return 0; - const intersectionYmin = Math.max(yminI, yminJ); - const intersectionXmin = Math.max(xminI, xminJ); - const intersectionYmax = Math.min(ymaxI, ymaxJ); - const intersectionXmax = Math.min(xmaxI, xmaxJ); - const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0) * Math.max(intersectionXmax - intersectionXmin, 0); - return intersectionArea / (areaI + areaJ - intersectionArea); -} -function nonMaxSuppression2(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) { - const numBoxes = boxes.shape[0]; - const outputSize = Math.min(maxOutputSize, numBoxes); - const candidates = scores.map((score, boxIndex) => ({score, boxIndex})).filter((c) => c.score > scoreThreshold).sort((c1, c2) => c2.score - c1.score); - const suppressFunc = (x) => x <= iouThreshold ? 1 : 0; - const selected = []; - candidates.forEach((c) => { - if (selected.length >= outputSize) - return; - const originalScore = c.score; - for (let j = selected.length - 1; j >= 0; --j) { - const iou2 = IOU(boxes, c.boxIndex, selected[j]); - if (iou2 === 0) - continue; - c.score *= suppressFunc(iou2); - if (c.score <= scoreThreshold) - break; - } - if (originalScore === c.score) { - selected.push(c.boxIndex); - } - }); - return selected; -} - -// src/ssdMobilenetv1/outputLayer.ts -var tf31 = require_tfjs_esm(); -function getCenterCoordinatesAndSizesLayer(x) { - const vec = tf31.unstack(tf31.transpose(x, [1, 0])); - const sizes = [ - tf31.sub(vec[2], vec[0]), - tf31.sub(vec[3], vec[1]) - ]; - const centers = [ - tf31.add(vec[0], tf31.div(sizes[0], 2)), - tf31.add(vec[1], tf31.div(sizes[1], 2)) - ]; - return {sizes, centers}; -} -function decodeBoxesLayer(x0, x1) { - const {sizes, centers} = getCenterCoordinatesAndSizesLayer(x0); - const vec = tf31.unstack(tf31.transpose(x1, [1, 0])); - const div0_out = tf31.div(tf31.mul(tf31.exp(tf31.div(vec[2], 5)), sizes[0]), 2); - const add0_out = tf31.add(tf31.mul(tf31.div(vec[0], 10), sizes[0]), centers[0]); - const div1_out = tf31.div(tf31.mul(tf31.exp(tf31.div(vec[3], 5)), sizes[1]), 2); - const add1_out = tf31.add(tf31.mul(tf31.div(vec[1], 10), sizes[1]), centers[1]); - return tf31.transpose(tf31.stack([ - tf31.sub(add0_out, div0_out), - tf31.sub(add1_out, div1_out), - tf31.add(add0_out, div0_out), - tf31.add(add1_out, div1_out) - ]), [1, 0]); -} -function outputLayer(boxPredictions, classPredictions, params) { - return tf31.tidy(() => { - const batchSize = boxPredictions.shape[0]; - let boxes = decodeBoxesLayer(tf31.reshape(tf31.tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]), tf31.reshape(boxPredictions, [-1, 4])); - boxes = tf31.reshape(boxes, [batchSize, boxes.shape[0] / batchSize, 4]); - const scoresAndClasses = tf31.sigmoid(tf31.slice(classPredictions, [0, 0, 1], [-1, -1, -1])); - let scores = tf31.slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]); - scores = tf31.reshape(scores, [batchSize, scores.shape[1]]); - const boxesByBatch = tf31.unstack(boxes); - const scoresByBatch = tf31.unstack(scores); - return {boxes: boxesByBatch, scores: scoresByBatch}; - }); -} - -// src/ssdMobilenetv1/predictionLayer.ts -var tf33 = require_tfjs_esm(); - -// src/ssdMobilenetv1/boxPredictionLayer.ts -var tf32 = require_tfjs_esm(); -function boxPredictionLayer(x, params) { - return tf32.tidy(() => { - const batchSize = x.shape[0]; - const boxPredictionEncoding = tf32.reshape(convLayer(x, params.box_encoding_predictor), [batchSize, -1, 1, 4]); - const classPrediction = tf32.reshape(convLayer(x, params.class_predictor), [batchSize, -1, 3]); - return {boxPredictionEncoding, classPrediction}; - }); -} - -// src/ssdMobilenetv1/predictionLayer.ts -function predictionLayer(x, conv11, params) { - return tf33.tidy(() => { - const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]); - const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]); - const conv22 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]); - const conv3 = pointwiseConvLayer(conv22, params.conv_3, [2, 2]); - const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]); - const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]); - const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]); - const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]); - const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0); - const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1); - const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2); - const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3); - const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4); - const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5); - const boxPredictions = tf33.concat([ - boxPrediction0.boxPredictionEncoding, - boxPrediction1.boxPredictionEncoding, - boxPrediction2.boxPredictionEncoding, - boxPrediction3.boxPredictionEncoding, - boxPrediction4.boxPredictionEncoding, - boxPrediction5.boxPredictionEncoding - ], 1); - const classPredictions = tf33.concat([ - boxPrediction0.classPrediction, - boxPrediction1.classPrediction, - boxPrediction2.classPrediction, - boxPrediction3.classPrediction, - boxPrediction4.classPrediction, - boxPrediction5.classPrediction - ], 1); - return { - boxPredictions, - classPredictions - }; - }); -} - -// src/ssdMobilenetv1/SsdMobilenetv1Options.ts -var SsdMobilenetv1Options = class { - constructor({minConfidence, maxResults} = {}) { - this._name = "SsdMobilenetv1Options"; - this._minConfidence = minConfidence || 0.5; - this._maxResults = maxResults || 100; - if (typeof this._minConfidence !== "number" || this._minConfidence <= 0 || this._minConfidence >= 1) { - throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`); - } - if (typeof this._maxResults !== "number") { - throw new Error(`${this._name} - expected maxResults to be a number`); - } - } - get minConfidence() { - return this._minConfidence; - } - get maxResults() { - return this._maxResults; - } -}; - -// src/ssdMobilenetv1/SsdMobilenetv1.ts -var SsdMobilenetv1 = class extends NeuralNetwork { - constructor() { - super("SsdMobilenetv1"); - } - forwardInput(input) { - const {params} = this; - if (!params) { - throw new Error("SsdMobilenetv1 - load model before inference"); - } - return tf34.tidy(() => { - const batchTensor = tf34.cast(input.toBatchTensor(512, false), "float32"); - const x = tf34.sub(tf34.div(batchTensor, 127.5), 1); - const features = mobileNetV1(x, params.mobilenetv1); - const {boxPredictions, classPredictions} = predictionLayer(features.out, features.conv11, params.prediction_layer); - return outputLayer(boxPredictions, classPredictions, params.output_layer); - }); - } - async forward(input) { - return this.forwardInput(await toNetInput(input)); - } - async locateFaces(input, options = {}) { - const {maxResults, minConfidence} = new SsdMobilenetv1Options(options); - const netInput = await toNetInput(input); - const {boxes: _boxes, scores: _scores} = this.forwardInput(netInput); - const boxes = _boxes[0]; - const scores = _scores[0]; - for (let i = 1; i < _boxes.length; i++) { - _boxes[i].dispose(); - _scores[i].dispose(); - } - const scoresData = Array.from(scores.dataSync()); - const iouThreshold = 0.5; - const indices = nonMaxSuppression2(boxes, scoresData, maxResults, iouThreshold, minConfidence); - const reshapedDims = netInput.getReshapedInputDimensions(0); - const inputSize = netInput.inputSize; - const padX = inputSize / reshapedDims.width; - const padY = inputSize / reshapedDims.height; - const boxesData = boxes.arraySync(); - const results = indices.map((idx) => { - const [top, bottom] = [ - Math.max(0, boxesData[idx][0]), - Math.min(1, boxesData[idx][2]) - ].map((val) => val * padY); - const [left, right] = [ - Math.max(0, boxesData[idx][1]), - Math.min(1, boxesData[idx][3]) - ].map((val) => val * padX); - return new FaceDetection(scoresData[idx], new Rect(left, top, right - left, bottom - top), {height: netInput.getInputHeight(0), width: netInput.getInputWidth(0)}); - }); - boxes.dispose(); - scores.dispose(); - return results; - } - getDefaultModelName() { - return "ssd_mobilenetv1_model"; - } - extractParamsFromWeightMap(weightMap) { - return extractParamsFromWeightMap6(weightMap); - } - extractParams(weights) { - return extractParams6(weights); - } -}; - -// src/ssdMobilenetv1/index.ts -function createSsdMobilenetv1(weights) { - const net = new SsdMobilenetv1(); - net.extractWeights(weights); - return net; -} -function createFaceDetectionNet(weights) { - return createSsdMobilenetv1(weights); -} -var FaceDetectionNet = class extends SsdMobilenetv1 { -}; - -// src/tinyYolov2/const.ts -var IOU_THRESHOLD = 0.4; -var BOX_ANCHORS = [ - new Point(0.738768, 0.874946), - new Point(2.42204, 2.65704), - new Point(4.30971, 7.04493), - new Point(10.246, 4.59428), - new Point(12.6868, 11.8741) -]; -var BOX_ANCHORS_SEPARABLE = [ - new Point(1.603231, 2.094468), - new Point(6.041143, 7.080126), - new Point(2.882459, 3.518061), - new Point(4.266906, 5.178857), - new Point(9.041765, 10.66308) -]; -var MEAN_RGB_SEPARABLE = [117.001, 114.697, 97.404]; -var DEFAULT_MODEL_NAME = "tiny_yolov2_model"; -var DEFAULT_MODEL_NAME_SEPARABLE_CONV = "tiny_yolov2_separable_conv_model"; - -// src/tinyYolov2/TinyYolov2Base.ts -var tf39 = require_tfjs_esm(); - -// src/tinyYolov2/config.ts -var isNumber = (arg) => typeof arg === "number"; -function validateConfig(config) { - if (!config) { - throw new Error(`invalid config: ${config}`); - } - if (typeof config.withSeparableConvs !== "boolean") { - throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config.withSeparableConvs}`); - } - if (!isNumber(config.iouThreshold) || config.iouThreshold < 0 || config.iouThreshold > 1) { - throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config.iouThreshold}`); - } - if (!Array.isArray(config.classes) || !config.classes.length || !config.classes.every((c) => typeof c === "string")) { - throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config.classes)}`); - } - if (!Array.isArray(config.anchors) || !config.anchors.length || !config.anchors.map((a) => a || {}).every((a) => isNumber(a.x) && isNumber(a.y))) { - throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config.anchors)}`); - } - if (config.meanRgb && (!Array.isArray(config.meanRgb) || config.meanRgb.length !== 3 || !config.meanRgb.every(isNumber))) { - throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`); - } -} - -// src/tinyYolov2/convWithBatchNorm.ts -var tf36 = require_tfjs_esm(); - -// src/tinyYolov2/leaky.ts -var tf35 = require_tfjs_esm(); -function leaky(x) { - return tf35.tidy(() => { - const min = tf35.mul(x, tf35.scalar(0.10000000149011612)); - return tf35.add(tf35.relu(tf35.sub(x, min)), min); - }); -} - -// src/tinyYolov2/convWithBatchNorm.ts -function convWithBatchNorm(x, params) { - return tf36.tidy(() => { - let out = tf36.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]); - out = tf36.conv2d(out, params.conv.filters, [1, 1], "valid"); - out = tf36.sub(out, params.bn.sub); - out = tf36.mul(out, params.bn.truediv); - out = tf36.add(out, params.conv.bias); - return leaky(out); - }); -} - -// src/tinyYolov2/depthwiseSeparableConv.ts -var tf37 = require_tfjs_esm(); -function depthwiseSeparableConv2(x, params) { - return tf37.tidy(() => { - let out = tf37.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]); - out = tf37.separableConv2d(out, params.depthwise_filter, params.pointwise_filter, [1, 1], "valid"); - out = tf37.add(out, params.bias); - return leaky(out); - }); -} - -// src/tinyYolov2/extractParams.ts -var tf38 = require_tfjs_esm(); -function extractorsFactory7(extractWeights, paramMappings) { - const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings); - function extractBatchNormParams(size, mappedPrefix) { - const sub6 = tf38.tensor1d(extractWeights(size)); - const truediv = tf38.tensor1d(extractWeights(size)); - paramMappings.push({paramPath: `${mappedPrefix}/sub`}, {paramPath: `${mappedPrefix}/truediv`}); - return {sub: sub6, truediv}; - } - function extractConvWithBatchNormParams(channelsIn, channelsOut, mappedPrefix) { - const conv3 = extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv`); - const bn = extractBatchNormParams(channelsOut, `${mappedPrefix}/bn`); - return {conv: conv3, bn}; - } - const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings); - return { - extractConvParams, - extractConvWithBatchNormParams, - extractSeparableConvParams - }; -} -function extractParams7(weights, config, boxEncodingSize, filterSizes) { - const { - extractWeights, - getRemainingWeights - } = extractWeightsFactory(weights); - const paramMappings = []; - const { - extractConvParams, - extractConvWithBatchNormParams, - extractSeparableConvParams - } = extractorsFactory7(extractWeights, paramMappings); - let params; - if (config.withSeparableConvs) { - const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes; - const conv0 = config.isFirstLayerConv2d ? extractConvParams(s0, s1, 3, "conv0") : extractSeparableConvParams(s0, s1, "conv0"); - const conv1 = extractSeparableConvParams(s1, s2, "conv1"); - const conv22 = extractSeparableConvParams(s2, s3, "conv2"); - const conv3 = extractSeparableConvParams(s3, s4, "conv3"); - const conv4 = extractSeparableConvParams(s4, s5, "conv4"); - const conv5 = extractSeparableConvParams(s5, s6, "conv5"); - const conv6 = s7 ? extractSeparableConvParams(s6, s7, "conv6") : void 0; - const conv7 = s8 ? extractSeparableConvParams(s7, s8, "conv7") : void 0; - const conv8 = extractConvParams(s8 || s7 || s6, 5 * boxEncodingSize, 1, "conv8"); - params = { - conv0, - conv1, - conv2: conv22, - conv3, - conv4, - conv5, - conv6, - conv7, - conv8 - }; - } else { - const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes; - const conv0 = extractConvWithBatchNormParams(s0, s1, "conv0"); - const conv1 = extractConvWithBatchNormParams(s1, s2, "conv1"); - const conv22 = extractConvWithBatchNormParams(s2, s3, "conv2"); - const conv3 = extractConvWithBatchNormParams(s3, s4, "conv3"); - const conv4 = extractConvWithBatchNormParams(s4, s5, "conv4"); - const conv5 = extractConvWithBatchNormParams(s5, s6, "conv5"); - const conv6 = extractConvWithBatchNormParams(s6, s7, "conv6"); - const conv7 = extractConvWithBatchNormParams(s7, s8, "conv7"); - const conv8 = extractConvParams(s8, 5 * boxEncodingSize, 1, "conv8"); - params = { - conv0, - conv1, - conv2: conv22, - conv3, - conv4, - conv5, - conv6, - conv7, - conv8 - }; - } - if (getRemainingWeights().length !== 0) { - throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`); - } - return {params, paramMappings}; -} - -// src/tinyYolov2/extractParamsFromWeightMap.ts -function extractorsFactory8(weightMap, paramMappings) { - const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings); - function extractBatchNormParams(prefix) { - const sub6 = extractWeightEntry(`${prefix}/sub`, 1); - const truediv = extractWeightEntry(`${prefix}/truediv`, 1); - return {sub: sub6, truediv}; - } - function extractConvParams(prefix) { - const filters = extractWeightEntry(`${prefix}/filters`, 4); - const bias = extractWeightEntry(`${prefix}/bias`, 1); - return {filters, bias}; - } - function extractConvWithBatchNormParams(prefix) { - const conv3 = extractConvParams(`${prefix}/conv`); - const bn = extractBatchNormParams(`${prefix}/bn`); - return {conv: conv3, bn}; - } - const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry); - return { - extractConvParams, - extractConvWithBatchNormParams, - extractSeparableConvParams - }; -} -function extractParamsFromWeightMap7(weightMap, config) { - const paramMappings = []; - const { - extractConvParams, - extractConvWithBatchNormParams, - extractSeparableConvParams - } = extractorsFactory8(weightMap, paramMappings); - let params; - if (config.withSeparableConvs) { - const numFilters = config.filterSizes && config.filterSizes.length || 9; - params = { - conv0: config.isFirstLayerConv2d ? extractConvParams("conv0") : extractSeparableConvParams("conv0"), - conv1: extractSeparableConvParams("conv1"), - conv2: extractSeparableConvParams("conv2"), - conv3: extractSeparableConvParams("conv3"), - conv4: extractSeparableConvParams("conv4"), - conv5: extractSeparableConvParams("conv5"), - conv6: numFilters > 7 ? extractSeparableConvParams("conv6") : void 0, - conv7: numFilters > 8 ? extractSeparableConvParams("conv7") : void 0, - conv8: extractConvParams("conv8") - }; - } else { - params = { - conv0: extractConvWithBatchNormParams("conv0"), - conv1: extractConvWithBatchNormParams("conv1"), - conv2: extractConvWithBatchNormParams("conv2"), - conv3: extractConvWithBatchNormParams("conv3"), - conv4: extractConvWithBatchNormParams("conv4"), - conv5: extractConvWithBatchNormParams("conv5"), - conv6: extractConvWithBatchNormParams("conv6"), - conv7: extractConvWithBatchNormParams("conv7"), - conv8: extractConvParams("conv8") - }; - } - disposeUnusedWeightTensors(weightMap, paramMappings); - return {params, paramMappings}; -} - -// src/tinyYolov2/TinyYolov2Options.ts -var TinyYolov2Options = class { - constructor({inputSize, scoreThreshold} = {}) { - this._name = "TinyYolov2Options"; - this._inputSize = inputSize || 416; - this._scoreThreshold = scoreThreshold || 0.5; - if (typeof this._inputSize !== "number" || this._inputSize % 32 !== 0) { - throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`); - } - if (typeof this._scoreThreshold !== "number" || this._scoreThreshold <= 0 || this._scoreThreshold >= 1) { - throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`); - } - } - get inputSize() { - return this._inputSize; - } - get scoreThreshold() { - return this._scoreThreshold; - } -}; - -// src/tinyYolov2/TinyYolov2Base.ts -var _TinyYolov2Base = class extends NeuralNetwork { - constructor(config) { - super("TinyYolov2"); - validateConfig(config); - this._config = config; - } - get config() { - return this._config; - } - get withClassScores() { - return this.config.withClassScores || this.config.classes.length > 1; - } - get boxEncodingSize() { - return 5 + (this.withClassScores ? this.config.classes.length : 0); - } - runTinyYolov2(x, params) { - let out = convWithBatchNorm(x, params.conv0); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = convWithBatchNorm(out, params.conv1); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = convWithBatchNorm(out, params.conv2); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = convWithBatchNorm(out, params.conv3); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = convWithBatchNorm(out, params.conv4); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = convWithBatchNorm(out, params.conv5); - out = tf39.maxPool(out, [2, 2], [1, 1], "same"); - out = convWithBatchNorm(out, params.conv6); - out = convWithBatchNorm(out, params.conv7); - return convLayer(out, params.conv8, "valid", false); - } - runMobilenet(x, params) { - let out = this.config.isFirstLayerConv2d ? leaky(convLayer(x, params.conv0, "valid", false)) : depthwiseSeparableConv2(x, params.conv0); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = depthwiseSeparableConv2(out, params.conv1); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = depthwiseSeparableConv2(out, params.conv2); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = depthwiseSeparableConv2(out, params.conv3); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = depthwiseSeparableConv2(out, params.conv4); - out = tf39.maxPool(out, [2, 2], [2, 2], "same"); - out = depthwiseSeparableConv2(out, params.conv5); - out = tf39.maxPool(out, [2, 2], [1, 1], "same"); - out = params.conv6 ? depthwiseSeparableConv2(out, params.conv6) : out; - out = params.conv7 ? depthwiseSeparableConv2(out, params.conv7) : out; - return convLayer(out, params.conv8, "valid", false); - } - forwardInput(input, inputSize) { - const {params} = this; - if (!params) { - throw new Error("TinyYolov2 - load model before inference"); - } - return tf39.tidy(() => { - let batchTensor = tf39.cast(input.toBatchTensor(inputSize, false), "float32"); - batchTensor = this.config.meanRgb ? normalize(batchTensor, this.config.meanRgb) : batchTensor; - batchTensor = batchTensor.div(255); - return this.config.withSeparableConvs ? this.runMobilenet(batchTensor, params) : this.runTinyYolov2(batchTensor, params); - }); - } - async forward(input, inputSize) { - return this.forwardInput(await toNetInput(input), inputSize); - } - async detect(input, forwardParams = {}) { - const {inputSize, scoreThreshold} = new TinyYolov2Options(forwardParams); - const netInput = await toNetInput(input); - const out = await this.forwardInput(netInput, inputSize); - const out0 = tf39.tidy(() => tf39.unstack(out)[0].expandDims()); - const inputDimensions = { - width: netInput.getInputWidth(0), - height: netInput.getInputHeight(0) - }; - const results = await this.extractBoxes(out0, netInput.getReshapedInputDimensions(0), scoreThreshold); - out.dispose(); - out0.dispose(); - const boxes = results.map((res) => res.box); - const scores = results.map((res) => res.score); - const classScores = results.map((res) => res.classScore); - const classNames = results.map((res) => this.config.classes[res.label]); - const indices = nonMaxSuppression(boxes.map((box) => box.rescale(inputSize)), scores, this.config.iouThreshold, true); - const detections = indices.map((idx) => new ObjectDetection(scores[idx], classScores[idx], classNames[idx], boxes[idx], inputDimensions)); - return detections; - } - getDefaultModelName() { - return ""; - } - extractParamsFromWeightMap(weightMap) { - return extractParamsFromWeightMap7(weightMap, this.config); - } - extractParams(weights) { - const filterSizes = this.config.filterSizes || _TinyYolov2Base.DEFAULT_FILTER_SIZES; - const numFilters = filterSizes ? filterSizes.length : void 0; - if (numFilters !== 7 && numFilters !== 8 && numFilters !== 9) { - throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`); - } - return extractParams7(weights, this.config, this.boxEncodingSize, filterSizes); - } - async extractBoxes(outputTensor, inputBlobDimensions, scoreThreshold) { - const {width, height} = inputBlobDimensions; - const inputSize = Math.max(width, height); - const correctionFactorX = inputSize / width; - const correctionFactorY = inputSize / height; - const numCells = outputTensor.shape[1]; - const numBoxes = this.config.anchors.length; - const [boxesTensor, scoresTensor, classScoresTensor] = tf39.tidy(() => { - const reshaped = outputTensor.reshape([numCells, numCells, numBoxes, this.boxEncodingSize]); - const boxes = reshaped.slice([0, 0, 0, 0], [numCells, numCells, numBoxes, 4]); - const scores = reshaped.slice([0, 0, 0, 4], [numCells, numCells, numBoxes, 1]); - const classScores = this.withClassScores ? tf39.softmax(reshaped.slice([0, 0, 0, 5], [numCells, numCells, numBoxes, this.config.classes.length]), 3) : tf39.scalar(0); - return [boxes, scores, classScores]; - }); - const results = []; - const scoresData = await scoresTensor.array(); - const boxesData = await boxesTensor.array(); - for (let row = 0; row < numCells; row++) { - for (let col = 0; col < numCells; col++) { - for (let anchor = 0; anchor < numBoxes; anchor++) { - const score = sigmoid(scoresData[row][col][anchor][0]); - if (!scoreThreshold || score > scoreThreshold) { - const ctX = (col + sigmoid(boxesData[row][col][anchor][0])) / numCells * correctionFactorX; - const ctY = (row + sigmoid(boxesData[row][col][anchor][1])) / numCells * correctionFactorY; - const widthLocal = Math.exp(boxesData[row][col][anchor][2]) * this.config.anchors[anchor].x / numCells * correctionFactorX; - const heightLocal = Math.exp(boxesData[row][col][anchor][3]) * this.config.anchors[anchor].y / numCells * correctionFactorY; - const x = ctX - widthLocal / 2; - const y = ctY - heightLocal / 2; - const pos = {row, col, anchor}; - const {classScore, label} = this.withClassScores ? await this.extractPredictedClass(classScoresTensor, pos) : {classScore: 1, label: 0}; - results.push({ - box: new BoundingBox(x, y, x + widthLocal, y + heightLocal), - score, - classScore: score * classScore, - label, - ...pos - }); - } - } - } - } - boxesTensor.dispose(); - scoresTensor.dispose(); - classScoresTensor.dispose(); - return results; - } - async extractPredictedClass(classesTensor, pos) { - const {row, col, anchor} = pos; - const classesData = await classesTensor.array(); - return Array(this.config.classes.length).fill(0).map((_, i) => classesData[row][col][anchor][i]).map((classScore, label) => ({ - classScore, - label - })).reduce((max, curr) => max.classScore > curr.classScore ? max : curr); - } -}; -var TinyYolov2Base = _TinyYolov2Base; -TinyYolov2Base.DEFAULT_FILTER_SIZES = [3, 16, 32, 64, 128, 256, 512, 1024, 1024]; - -// src/tinyYolov2/TinyYolov2.ts -var TinyYolov2 = class extends TinyYolov2Base { - constructor(withSeparableConvs = true) { - const config = { - withSeparableConvs, - iouThreshold: IOU_THRESHOLD, - classes: ["face"], - ...withSeparableConvs ? { - anchors: BOX_ANCHORS_SEPARABLE, - meanRgb: MEAN_RGB_SEPARABLE - } : { - anchors: BOX_ANCHORS, - withClassScores: true - } - }; - super(config); - } - get withSeparableConvs() { - return this.config.withSeparableConvs; - } - get anchors() { - return this.config.anchors; - } - async locateFaces(input, forwardParams) { - const objectDetections = await this.detect(input, forwardParams); - return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, {width: det.imageWidth, height: det.imageHeight})); - } - getDefaultModelName() { - return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME; - } - extractParamsFromWeightMap(weightMap) { - return super.extractParamsFromWeightMap(weightMap); - } -}; - -// src/tinyYolov2/index.ts -function createTinyYolov2(weights, withSeparableConvs = true) { - const net = new TinyYolov2(withSeparableConvs); - net.extractWeights(weights); - return net; -} - -// src/tinyFaceDetector/TinyFaceDetectorOptions.ts -var TinyFaceDetectorOptions = class extends TinyYolov2Options { - constructor() { - super(...arguments); - this._name = "TinyFaceDetectorOptions"; - } -}; - -// src/globalApi/ComposableTask.ts -var ComposableTask = class { - async then(onfulfilled) { - return onfulfilled(await this.run()); - } - async run() { - throw new Error("ComposableTask - run is not implemented"); - } -}; - -// src/globalApi/DetectFaceLandmarksTasks.ts -var tf41 = require_tfjs_esm(); - -// src/globalApi/extractFacesAndComputeResults.ts -var tf40 = require_tfjs_esm(); -async function extractAllFacesAndComputeResults(parentResults, input, computeResults, extractedFaces, getRectForAlignment = ({alignedRect}) => alignedRect) { - const faceBoxes = parentResults.map((parentResult) => isWithFaceLandmarks(parentResult) ? getRectForAlignment(parentResult) : parentResult.detection); - const faces = extractedFaces || (input instanceof tf40.Tensor ? await extractFaceTensors(input, faceBoxes) : await extractFaces(input, faceBoxes)); - const results = await computeResults(faces); - faces.forEach((f) => f instanceof tf40.Tensor && f.dispose()); - return results; -} -async function extractSingleFaceAndComputeResult(parentResult, input, computeResult, extractedFaces, getRectForAlignment) { - return extractAllFacesAndComputeResults([parentResult], input, async (faces) => computeResult(faces[0]), extractedFaces, getRectForAlignment); -} - -// src/tinyFaceDetector/const.ts -var IOU_THRESHOLD2 = 0.4; -var BOX_ANCHORS2 = [ - new Point(1.603231, 2.094468), - new Point(6.041143, 7.080126), - new Point(2.882459, 3.518061), - new Point(4.266906, 5.178857), - new Point(9.041765, 10.66308) -]; -var MEAN_RGB = [117.001, 114.697, 97.404]; - -// src/tinyFaceDetector/TinyFaceDetector.ts -var TinyFaceDetector = class extends TinyYolov2Base { - constructor() { - const config = { - withSeparableConvs: true, - iouThreshold: IOU_THRESHOLD2, - classes: ["face"], - anchors: BOX_ANCHORS2, - meanRgb: MEAN_RGB, - isFirstLayerConv2d: true, - filterSizes: [3, 16, 32, 64, 128, 256, 512] - }; - super(config); - } - get anchors() { - return this.config.anchors; - } - async locateFaces(input, forwardParams) { - const objectDetections = await this.detect(input, forwardParams); - return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, {width: det.imageWidth, height: det.imageHeight})); - } - getDefaultModelName() { - return "tiny_face_detector_model"; - } - extractParamsFromWeightMap(weightMap) { - return super.extractParamsFromWeightMap(weightMap); - } -}; - -// src/globalApi/nets.ts -var nets = { - ssdMobilenetv1: new SsdMobilenetv1(), - tinyFaceDetector: new TinyFaceDetector(), - tinyYolov2: new TinyYolov2(), - faceLandmark68Net: new FaceLandmark68Net(), - faceLandmark68TinyNet: new FaceLandmark68TinyNet(), - faceRecognitionNet: new FaceRecognitionNet(), - faceExpressionNet: new FaceExpressionNet(), - ageGenderNet: new AgeGenderNet() -}; -var ssdMobilenetv1 = (input, options) => nets.ssdMobilenetv1.locateFaces(input, options); -var tinyFaceDetector = (input, options) => nets.tinyFaceDetector.locateFaces(input, options); -var tinyYolov2 = (input, options) => nets.tinyYolov2.locateFaces(input, options); -var detectFaceLandmarks = (input) => nets.faceLandmark68Net.detectLandmarks(input); -var detectFaceLandmarksTiny = (input) => nets.faceLandmark68TinyNet.detectLandmarks(input); -var computeFaceDescriptor = (input) => nets.faceRecognitionNet.computeFaceDescriptor(input); -var recognizeFaceExpressions = (input) => nets.faceExpressionNet.predictExpressions(input); -var predictAgeAndGender = (input) => nets.ageGenderNet.predictAgeAndGender(input); -var loadSsdMobilenetv1Model = (url) => nets.ssdMobilenetv1.load(url); -var loadTinyFaceDetectorModel = (url) => nets.tinyFaceDetector.load(url); -var loadTinyYolov2Model = (url) => nets.tinyYolov2.load(url); -var loadFaceLandmarkModel = (url) => nets.faceLandmark68Net.load(url); -var loadFaceLandmarkTinyModel = (url) => nets.faceLandmark68TinyNet.load(url); -var loadFaceRecognitionModel = (url) => nets.faceRecognitionNet.load(url); -var loadFaceExpressionModel = (url) => nets.faceExpressionNet.load(url); -var loadAgeGenderModel = (url) => nets.ageGenderNet.load(url); -var loadFaceDetectionModel = loadSsdMobilenetv1Model; -var locateFaces = ssdMobilenetv1; -var detectLandmarks = detectFaceLandmarks; - -// src/globalApi/PredictFaceExpressionsTask.ts -var PredictFaceExpressionsTaskBase = class extends ComposableTask { - constructor(parentTask, input, extractedFaces) { - super(); - this.parentTask = parentTask; - this.input = input; - this.extractedFaces = extractedFaces; - } -}; -var PredictAllFaceExpressionsTask = class extends PredictFaceExpressionsTaskBase { - async run() { - const parentResults = await this.parentTask; - const faceExpressionsByFace = await extractAllFacesAndComputeResults(parentResults, this.input, async (faces) => Promise.all(faces.map((face) => nets.faceExpressionNet.predictExpressions(face))), this.extractedFaces); - return parentResults.map((parentResult, i) => extendWithFaceExpressions(parentResult, faceExpressionsByFace[i])); - } - withAgeAndGender() { - return new PredictAllAgeAndGenderTask(this, this.input); - } -}; -var PredictSingleFaceExpressionsTask = class extends PredictFaceExpressionsTaskBase { - async run() { - const parentResult = await this.parentTask; - if (!parentResult) { - return void 0; - } - const faceExpressions = await extractSingleFaceAndComputeResult(parentResult, this.input, (face) => nets.faceExpressionNet.predictExpressions(face), this.extractedFaces); - return extendWithFaceExpressions(parentResult, faceExpressions); - } - withAgeAndGender() { - return new PredictSingleAgeAndGenderTask(this, this.input); - } -}; -var PredictAllFaceExpressionsWithFaceAlignmentTask = class extends PredictAllFaceExpressionsTask { - withAgeAndGender() { - return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input); - } - withFaceDescriptors() { - return new ComputeAllFaceDescriptorsTask(this, this.input); - } -}; -var PredictSingleFaceExpressionsWithFaceAlignmentTask = class extends PredictSingleFaceExpressionsTask { - withAgeAndGender() { - return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input); - } - withFaceDescriptor() { - return new ComputeSingleFaceDescriptorTask(this, this.input); - } -}; - -// src/globalApi/PredictAgeAndGenderTask.ts -var PredictAgeAndGenderTaskBase = class extends ComposableTask { - constructor(parentTask, input, extractedFaces) { - super(); - this.parentTask = parentTask; - this.input = input; - this.extractedFaces = extractedFaces; - } -}; -var PredictAllAgeAndGenderTask = class extends PredictAgeAndGenderTaskBase { - async run() { - const parentResults = await this.parentTask; - const ageAndGenderByFace = await extractAllFacesAndComputeResults(parentResults, this.input, async (faces) => Promise.all(faces.map((face) => nets.ageGenderNet.predictAgeAndGender(face))), this.extractedFaces); - return parentResults.map((parentResult, i) => { - const {age, gender, genderProbability} = ageAndGenderByFace[i]; - return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age); - }); - } - withFaceExpressions() { - return new PredictAllFaceExpressionsTask(this, this.input); - } -}; -var PredictSingleAgeAndGenderTask = class extends PredictAgeAndGenderTaskBase { - async run() { - const parentResult = await this.parentTask; - if (!parentResult) { - return void 0; - } - const {age, gender, genderProbability} = await extractSingleFaceAndComputeResult(parentResult, this.input, (face) => nets.ageGenderNet.predictAgeAndGender(face), this.extractedFaces); - return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age); - } - withFaceExpressions() { - return new PredictSingleFaceExpressionsTask(this, this.input); - } -}; -var PredictAllAgeAndGenderWithFaceAlignmentTask = class extends PredictAllAgeAndGenderTask { - withFaceExpressions() { - return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input); - } - withFaceDescriptors() { - return new ComputeAllFaceDescriptorsTask(this, this.input); - } -}; -var PredictSingleAgeAndGenderWithFaceAlignmentTask = class extends PredictSingleAgeAndGenderTask { - withFaceExpressions() { - return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input); - } - withFaceDescriptor() { - return new ComputeSingleFaceDescriptorTask(this, this.input); - } -}; - -// src/globalApi/ComputeFaceDescriptorsTasks.ts -var ComputeFaceDescriptorsTaskBase = class extends ComposableTask { - constructor(parentTask, input) { - super(); - this.parentTask = parentTask; - this.input = input; - } -}; -var ComputeAllFaceDescriptorsTask = class extends ComputeFaceDescriptorsTaskBase { - async run() { - const parentResults = await this.parentTask; - const descriptors = await extractAllFacesAndComputeResults(parentResults, this.input, (faces) => Promise.all(faces.map((face) => nets.faceRecognitionNet.computeFaceDescriptor(face))), null, (parentResult) => parentResult.landmarks.align(null, {useDlibAlignment: true})); - return descriptors.map((descriptor, i) => extendWithFaceDescriptor(parentResults[i], descriptor)); - } - withFaceExpressions() { - return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input); - } - withAgeAndGender() { - return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input); - } -}; -var ComputeSingleFaceDescriptorTask = class extends ComputeFaceDescriptorsTaskBase { - async run() { - const parentResult = await this.parentTask; - if (!parentResult) { - return void 0; - } - const descriptor = await extractSingleFaceAndComputeResult(parentResult, this.input, (face) => nets.faceRecognitionNet.computeFaceDescriptor(face), null, (parentResult2) => parentResult2.landmarks.align(null, {useDlibAlignment: true})); - return extendWithFaceDescriptor(parentResult, descriptor); - } - withFaceExpressions() { - return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input); - } - withAgeAndGender() { - return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input); - } -}; - -// src/globalApi/DetectFaceLandmarksTasks.ts -var DetectFaceLandmarksTaskBase = class extends ComposableTask { - constructor(parentTask, input, useTinyLandmarkNet) { - super(); - this.parentTask = parentTask; - this.input = input; - this.useTinyLandmarkNet = useTinyLandmarkNet; - } - get landmarkNet() { - return this.useTinyLandmarkNet ? nets.faceLandmark68TinyNet : nets.faceLandmark68Net; - } -}; -var DetectAllFaceLandmarksTask = class extends DetectFaceLandmarksTaskBase { - async run() { - const parentResults = await this.parentTask; - const detections = parentResults.map((res) => res.detection); - const faces = this.input instanceof tf41.Tensor ? await extractFaceTensors(this.input, detections) : await extractFaces(this.input, detections); - const faceLandmarksByFace = await Promise.all(faces.map((face) => this.landmarkNet.detectLandmarks(face))); - faces.forEach((f) => f instanceof tf41.Tensor && f.dispose()); - return parentResults.map((parentResult, i) => extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i])); - } - withFaceExpressions() { - return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input); - } - withAgeAndGender() { - return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input); - } - withFaceDescriptors() { - return new ComputeAllFaceDescriptorsTask(this, this.input); - } -}; -var DetectSingleFaceLandmarksTask = class extends DetectFaceLandmarksTaskBase { - async run() { - const parentResult = await this.parentTask; - if (!parentResult) { - return void 0; - } - const {detection} = parentResult; - const faces = this.input instanceof tf41.Tensor ? await extractFaceTensors(this.input, [detection]) : await extractFaces(this.input, [detection]); - const landmarks = await this.landmarkNet.detectLandmarks(faces[0]); - faces.forEach((f) => f instanceof tf41.Tensor && f.dispose()); - return extendWithFaceLandmarks(parentResult, landmarks); - } - withFaceExpressions() { - return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input); - } - withAgeAndGender() { - return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input); - } - withFaceDescriptor() { - return new ComputeSingleFaceDescriptorTask(this, this.input); - } -}; - -// src/globalApi/DetectFacesTasks.ts -var DetectFacesTaskBase = class extends ComposableTask { - constructor(input, options = new SsdMobilenetv1Options()) { - super(); - this.input = input; - this.options = options; - } -}; -var DetectAllFacesTask = class extends DetectFacesTaskBase { - async run() { - const {input, options} = this; - let result; - if (options instanceof TinyFaceDetectorOptions) - result = nets.tinyFaceDetector.locateFaces(input, options); - else if (options instanceof SsdMobilenetv1Options) - result = nets.ssdMobilenetv1.locateFaces(input, options); - else if (options instanceof TinyYolov2Options) - result = nets.tinyYolov2.locateFaces(input, options); - else - throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options"); - return result; - } - runAndExtendWithFaceDetections() { - return new Promise(async (resolve) => { - const detections = await this.run(); - resolve(detections.map((detection) => extendWithFaceDetection({}, detection))); - }); - } - withFaceLandmarks(useTinyLandmarkNet = false) { - return new DetectAllFaceLandmarksTask(this.runAndExtendWithFaceDetections(), this.input, useTinyLandmarkNet); - } - withFaceExpressions() { - return new PredictAllFaceExpressionsTask(this.runAndExtendWithFaceDetections(), this.input); - } - withAgeAndGender() { - return new PredictAllAgeAndGenderTask(this.runAndExtendWithFaceDetections(), this.input); - } -}; -var DetectSingleFaceTask = class extends DetectFacesTaskBase { - async run() { - const faceDetections = await new DetectAllFacesTask(this.input, this.options); - let faceDetectionWithHighestScore = faceDetections[0]; - faceDetections.forEach((faceDetection) => { - if (faceDetection.score > faceDetectionWithHighestScore.score) - faceDetectionWithHighestScore = faceDetection; - }); - return faceDetectionWithHighestScore; - } - runAndExtendWithFaceDetection() { - return new Promise(async (resolve) => { - const detection = await this.run(); - resolve(detection ? extendWithFaceDetection({}, detection) : void 0); - }); - } - withFaceLandmarks(useTinyLandmarkNet = false) { - return new DetectSingleFaceLandmarksTask(this.runAndExtendWithFaceDetection(), this.input, useTinyLandmarkNet); - } - withFaceExpressions() { - return new PredictSingleFaceExpressionsTask(this.runAndExtendWithFaceDetection(), this.input); - } - withAgeAndGender() { - return new PredictSingleAgeAndGenderTask(this.runAndExtendWithFaceDetection(), this.input); - } -}; - -// src/globalApi/detectFaces.ts -function detectSingleFace(input, options = new SsdMobilenetv1Options()) { - return new DetectSingleFaceTask(input, options); -} -function detectAllFaces(input, options = new SsdMobilenetv1Options()) { - return new DetectAllFacesTask(input, options); -} - -// src/globalApi/allFaces.ts -async function allFacesSsdMobilenetv1(input, minConfidence) { - return detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? {minConfidence} : {})).withFaceLandmarks().withFaceDescriptors(); -} -async function allFacesTinyYolov2(input, forwardParams = {}) { - return detectAllFaces(input, new TinyYolov2Options(forwardParams)).withFaceLandmarks().withFaceDescriptors(); -} -var allFaces = allFacesSsdMobilenetv1; - -// src/euclideanDistance.ts -function euclideanDistance(arr1, arr2) { - if (arr1.length !== arr2.length) - throw new Error("euclideanDistance: arr1.length !== arr2.length"); - const desc1 = Array.from(arr1); - const desc2 = Array.from(arr2); - return Math.sqrt(desc1.map((val, i) => val - desc2[i]).reduce((res, diff) => res + diff ** 2, 0)); -} - -// src/globalApi/FaceMatcher.ts -var FaceMatcher = class { - constructor(inputs, distanceThreshold = 0.6) { - this._distanceThreshold = distanceThreshold; - const inputArray = Array.isArray(inputs) ? inputs : [inputs]; - if (!inputArray.length) { - throw new Error("FaceRecognizer.constructor - expected atleast one input"); - } - let count = 1; - const createUniqueLabel = () => `person ${count++}`; - this._labeledDescriptors = inputArray.map((desc) => { - if (desc instanceof LabeledFaceDescriptors) { - return desc; - } - if (desc instanceof Float32Array) { - return new LabeledFaceDescriptors(createUniqueLabel(), [desc]); - } - if (desc.descriptor && desc.descriptor instanceof Float32Array) { - return new LabeledFaceDescriptors(createUniqueLabel(), [desc.descriptor]); - } - throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>"); - }); - } - get labeledDescriptors() { - return this._labeledDescriptors; - } - get distanceThreshold() { - return this._distanceThreshold; - } - computeMeanDistance(queryDescriptor, descriptors) { - return descriptors.map((d) => euclideanDistance(d, queryDescriptor)).reduce((d1, d2) => d1 + d2, 0) / (descriptors.length || 1); - } - matchDescriptor(queryDescriptor) { - return this.labeledDescriptors.map(({descriptors, label}) => new FaceMatch(label, this.computeMeanDistance(queryDescriptor, descriptors))).reduce((best, curr) => best.distance < curr.distance ? best : curr); - } - findBestMatch(queryDescriptor) { - const bestMatch = this.matchDescriptor(queryDescriptor); - return bestMatch.distance < this.distanceThreshold ? bestMatch : new FaceMatch("unknown", bestMatch.distance); - } - toJSON() { - return { - distanceThreshold: this.distanceThreshold, - labeledDescriptors: this.labeledDescriptors.map((ld) => ld.toJSON()) - }; - } - static fromJSON(json) { - const labeledDescriptors = json.labeledDescriptors.map((ld) => LabeledFaceDescriptors.fromJSON(ld)); - return new FaceMatcher(labeledDescriptors, json.distanceThreshold); - } -}; - -// src/tinyFaceDetector/index.ts -function createTinyFaceDetector(weights) { - const net = new TinyFaceDetector(); - net.extractWeights(weights); - return net; -} - -// src/resizeResults.ts -function resizeResults(results, dimensions) { - const {width, height} = new Dimensions(dimensions.width, dimensions.height); - if (width <= 0 || height <= 0) { - throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width, height})}`); - } - if (Array.isArray(results)) { - return results.map((obj) => resizeResults(obj, {width, height})); - } - if (isWithFaceLandmarks(results)) { - const resizedDetection = results.detection.forSize(width, height); - const resizedLandmarks = results.unshiftedLandmarks.forSize(resizedDetection.box.width, resizedDetection.box.height); - return extendWithFaceLandmarks(extendWithFaceDetection(results, resizedDetection), resizedLandmarks); - } - if (isWithFaceDetection(results)) { - return extendWithFaceDetection(results, results.detection.forSize(width, height)); - } - if (results instanceof FaceLandmarks || results instanceof FaceDetection) { - return results.forSize(width, height); - } - return results; -} - -// src/index.ts -var node = typeof process !== "undefined"; -var browser3 = typeof navigator !== "undefined" && typeof navigator.userAgent !== "undefined"; -var version2 = {faceapi: version, node, browser: browser3}; -export { - AgeGenderNet, - BoundingBox, - Box, - ComposableTask, - ComputeAllFaceDescriptorsTask, - ComputeFaceDescriptorsTaskBase, - ComputeSingleFaceDescriptorTask, - DetectAllFaceLandmarksTask, - DetectAllFacesTask, - DetectFaceLandmarksTaskBase, - DetectFacesTaskBase, - DetectSingleFaceLandmarksTask, - DetectSingleFaceTask, - Dimensions, - FACE_EXPRESSION_LABELS, - FaceDetection, - FaceDetectionNet, - FaceExpressionNet, - FaceExpressions, - FaceLandmark68Net, - FaceLandmark68TinyNet, - FaceLandmarkNet, - FaceLandmarks, - FaceLandmarks5, - FaceLandmarks68, - FaceMatch, - FaceMatcher, - FaceRecognitionNet, - Gender, - LabeledBox, - LabeledFaceDescriptors, - NetInput, - NeuralNetwork, - ObjectDetection, - Point, - PredictedBox, - Rect, - SsdMobilenetv1, - SsdMobilenetv1Options, - TinyFaceDetector, - TinyFaceDetectorOptions, - TinyYolov2, - TinyYolov2Options, - allFaces, - allFacesSsdMobilenetv1, - allFacesTinyYolov2, - awaitMediaLoaded, - bufferToImage, - computeFaceDescriptor, - createCanvas, - createCanvasFromMedia, - createFaceDetectionNet, - createFaceRecognitionNet, - createSsdMobilenetv1, - createTinyFaceDetector, - createTinyYolov2, - detectAllFaces, - detectFaceLandmarks, - detectFaceLandmarksTiny, - detectLandmarks, - detectSingleFace, - draw_exports as draw, - env, - euclideanDistance, - extendWithAge, - extendWithFaceDescriptor, - extendWithFaceDetection, - extendWithFaceExpressions, - extendWithFaceLandmarks, - extendWithGender, - extractFaceTensors, - extractFaces, - fetchImage, - fetchJson, - fetchNetWeights, - fetchOrThrow, - getContext2dOrThrow, - getMediaDimensions, - imageTensorToCanvas, - imageToSquare, - inverseSigmoid, - iou, - isMediaElement, - isMediaLoaded, - isWithAge, - isWithFaceDetection, - isWithFaceExpressions, - isWithFaceLandmarks, - isWithGender, - loadAgeGenderModel, - loadFaceDetectionModel, - loadFaceExpressionModel, - loadFaceLandmarkModel, - loadFaceLandmarkTinyModel, - loadFaceRecognitionModel, - loadSsdMobilenetv1Model, - loadTinyFaceDetectorModel, - loadTinyYolov2Model, - loadWeightMap, - locateFaces, - matchDimensions, - minBbox, - nets, - nonMaxSuppression, - normalize, - padToSquare, - predictAgeAndGender, - recognizeFaceExpressions, - resizeResults, - resolveInput, - shuffleArray, - sigmoid, - ssdMobilenetv1, - tf42 as tf, - tinyFaceDetector, - tinyYolov2, - toNetInput, - utils_exports as utils, - validateConfig, - version2 as version -}; +var pr=Object.defineProperty;var ao=Object.prototype.hasOwnProperty,so=Object.getOwnPropertyNames,io=Object.getOwnPropertyDescriptor;var dr=(o,t)=>{for(var e in t)pr(o,e,{get:t[e],enumerable:!0})},wt=(o,t,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of so(t))!ao.call(o,r)&&r!=="default"&&pr(o,r,{get:()=>t[r],enumerable:!(e=io(t,r))||e.enumerable});return o};var n={};wt(n,Qo);wt(n,tn);import*as Qo from"@tensorflow/tfjs/dist/index.js";import*as tn from"@tensorflow/tfjs-backend-wasm";var To={};dr(To,{AnchorPosition:()=>J,DrawBox:()=>ue,DrawBoxOptions:()=>Ae,DrawFaceLandmarks:()=>Oe,DrawFaceLandmarksOptions:()=>$e,DrawTextField:()=>st,DrawTextFieldOptions:()=>Vt,drawContour:()=>q,drawDetections:()=>go,drawFaceExpressions:()=>vo,drawFaceLandmarks:()=>Fo});function q(o,t,e=!1){if(o.beginPath(),t.slice(1).forEach(({x:r,y:a},s)=>{let i=t[s];o.moveTo(i.x,i.y),o.lineTo(r,a)}),e){let r=t[t.length-1],a=t[0];if(!r||!a)return;o.moveTo(r.x,r.y),o.lineTo(a.x,a.y)}o.stroke()}var co={};dr(co,{computeReshapedDimensions:()=>Me,getCenterPoint:()=>dt,isDimensions:()=>ie,isEven:()=>se,isFloat:()=>Ee,isTensor:()=>mt,isTensor1D:()=>mo,isTensor2D:()=>De,isTensor3D:()=>Z,isTensor4D:()=>B,isValidNumber:()=>H,isValidProbablitiy:()=>Pt,range:()=>U,round:()=>pt});var L=class{constructor(t,e){if(!H(t)||!H(e))throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({width:t,height:e})}`);this._width=t,this._height=e}get width(){return this._width}get height(){return this._height}reverse(){return new L(1/this.width,1/this.height)}};function mt(o,t){return o instanceof n.Tensor&&o.shape.length===t}function mo(o){return mt(o,1)}function De(o){return mt(o,2)}function Z(o){return mt(o,3)}function B(o){return mt(o,4)}function Ee(o){return o%1!=0}function se(o){return o%2==0}function pt(o,t=2){let e=10**t;return Math.floor(o*e)/e}function ie(o){return o&&o.width&&o.height}function Me({width:o,height:t},e){let r=e/Math.max(t,o);return new L(Math.round(o*r),Math.round(t*r))}function dt(o){return o.reduce((t,e)=>t.add(e),new x(0,0)).div(new x(o.length,o.length))}function U(o,t,e){return Array(o).fill(0).map((r,a)=>t+a*e)}function H(o){return!!o&&o!==Infinity&&o!==-Infinity&&!Number.isNaN(o)||o===0}function Pt(o){return H(o)&&o>=0&&o<=1}var x=class{constructor(t,e){this._x=t,this._y=e}get x(){return this._x}get y(){return this._y}add(t){return new x(this.x+t.x,this.y+t.y)}sub(t){return new x(this.x-t.x,this.y-t.y)}mul(t){return new x(this.x*t.x,this.y*t.y)}div(t){return new x(this.x/t.x,this.y/t.y)}abs(){return new x(Math.abs(this.x),Math.abs(this.y))}magnitude(){return Math.sqrt(this.x**2+this.y**2)}floor(){return new x(Math.floor(this.x),Math.floor(this.y))}};var w=class{static isRect(t){return!!t&&[t.x,t.y,t.width,t.height].every(H)}static assertIsValidBox(t,e,r=!1){if(!w.isRect(t))throw new Error(`${e} - invalid box: ${JSON.stringify(t)}, expected object with properties x, y, width, height`);if(!r&&(t.width<0||t.height<0))throw new Error(`${e} - width (${t.width}) and height (${t.height}) must be positive numbers`)}constructor(t,e=!0){let r=t||{},a=[r.left,r.top,r.right,r.bottom].every(H),s=[r.x,r.y,r.width,r.height].every(H);if(!s&&!a)throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(r)}`);let[i,c,m,p]=s?[r.x,r.y,r.width,r.height]:[r.left,r.top,r.right-r.left,r.bottom-r.top];w.assertIsValidBox({x:i,y:c,width:m,height:p},"Box.constructor",e),this._x=i,this._y=c,this._width=m,this._height=p}get x(){return this._x}get y(){return this._y}get width(){return this._width}get height(){return this._height}get left(){return this.x}get top(){return this.y}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get area(){return this.width*this.height}get topLeft(){return new x(this.left,this.top)}get topRight(){return new x(this.right,this.top)}get bottomLeft(){return new x(this.left,this.bottom)}get bottomRight(){return new x(this.right,this.bottom)}round(){let[t,e,r,a]=[this.x,this.y,this.width,this.height].map(s=>Math.round(s));return new w({x:t,y:e,width:r,height:a})}floor(){let[t,e,r,a]=[this.x,this.y,this.width,this.height].map(s=>Math.floor(s));return new w({x:t,y:e,width:r,height:a})}toSquare(){let{x:t,y:e,width:r,height:a}=this,s=Math.abs(r-a);return re&&(c=-u+e+r,u=e),l>t&&(m=-l+t+a,l=t),p<1&&(m=2-p,p=1),d<1&&(m=2-d,d=1),{dy:i,edy:m,dx:s,edx:c,y:d,ey:l,x:p,ex:u,w:r,h:a}}calibrate(t){return new w({left:this.left+t.left*this.width,top:this.top+t.top*this.height,right:this.right+t.right*this.width,bottom:this.bottom+t.bottom*this.height}).toSquare().round()}};var Yt=class extends w{constructor(t,e,r,a,s=!1){super({left:t,top:e,right:r,bottom:a},s)}};var ut=class{constructor(t,e,r,a,s){this._imageDims=new L(s.width,s.height),this._score=t,this._classScore=e,this._className=r,this._box=new w(a).rescale(this._imageDims)}get score(){return this._score}get classScore(){return this._classScore}get className(){return this._className}get box(){return this._box}get imageDims(){return this._imageDims}get imageWidth(){return this.imageDims.width}get imageHeight(){return this.imageDims.height}get relativeBox(){return new w(this._box).rescale(this.imageDims.reverse())}forSize(t,e){return new ut(this.score,this.classScore,this.className,this.relativeBox,{width:t,height:e})}};var D=class extends ut{constructor(t,e,r){super(t,t,"",e,r)}forSize(t,e){let{score:r,relativeBox:a,imageDims:s}=super.forSize(t,e);return new D(r,a,s)}};function ur(o,t,e=!0){let r=Math.max(0,Math.min(o.right,t.right)-Math.max(o.left,t.left)),a=Math.max(0,Math.min(o.bottom,t.bottom)-Math.max(o.top,t.top)),s=r*a;return e?s/(o.area+t.area-s):s/Math.min(o.area,t.area)}function lr(o){let t=o.map(c=>c.x),e=o.map(c=>c.y),r=t.reduce((c,m)=>mmcc({score:i,boxIndex:c})).sort((i,c)=>i.score-c.score).map(i=>i.boxIndex),s=[];for(;a.length>0;){let i=a.pop();s.push(i);let c=a,m=[];for(let p=0;pm[d]<=e)}return s}function X(o,t){return n.tidy(()=>{let[e,r,a]=t,s=n.fill([...o.shape.slice(0,3),1],e,"float32"),i=n.fill([...o.shape.slice(0,3),1],r,"float32"),c=n.fill([...o.shape.slice(0,3),1],a,"float32"),m=n.concat([s,i,c],3);return n.sub(o,m)})}function hr(o,t=!1){return n.tidy(()=>{let[e,r]=o.shape.slice(1);if(e===r)return o;let a=Math.abs(e-r),s=Math.round(a*(t?.5:1)),i=e>r?2:1,c=l=>{let f=o.shape.slice();return f[i]=l,n.fill(f,0,"float32")},m=c(s),p=a-m.shape[i],u=[t&&p?c(p):null,o,m].filter(l=>!!l).map(l=>n.cast(l,"float32"));return n.concat(u,i)})}function Ln(o){let t=o.slice();for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1)),a=t[e];t[e]=t[r],t[r]=a}return t}function ce(o){return 1/(1+Math.exp(-o))}function On(o){return Math.log(o/(1-o))}var Gt=class extends w{constructor(t,e,r,a,s=!1){super({x:t,y:e,width:r,height:a},s)}};var po=.5,uo=.43,lo=.45,$=class{constructor(t,e,r=new x(0,0)){let{width:a,height:s}=e;this._imgDims=new L(a,s),this._shift=r,this._positions=t.map(i=>i.mul(new x(a,s)).add(r))}get shift(){return new x(this._shift.x,this._shift.y)}get imageWidth(){return this._imgDims.width}get imageHeight(){return this._imgDims.height}get positions(){return this._positions}get relativePositions(){return this._positions.map(t=>t.sub(this._shift).div(new x(this.imageWidth,this.imageHeight)))}forSize(t,e){return new this.constructor(this.relativePositions,{width:t,height:e})}shiftBy(t,e){return new this.constructor(this.relativePositions,this._imgDims,new x(t,e))}shiftByPoint(t){return this.shiftBy(t.x,t.y)}align(t,e={}){if(t){let s=t instanceof D?t.box.floor():new w(t);return this.shiftBy(s.x,s.y).align(null,e)}let{useDlibAlignment:r,minBoxPadding:a}={useDlibAlignment:!1,minBoxPadding:.2,...e};return r?this.alignDlib():this.alignMinBbox(a)}alignDlib(){let t=this.getRefPointsForAlignment(),[e,r,a]=t,s=u=>a.sub(u).magnitude(),i=(s(e)+s(r))/2,c=Math.floor(i/lo),m=dt(t),p=Math.floor(Math.max(0,m.x-po*c)),d=Math.floor(Math.max(0,m.y-uo*c));return new Gt(p,d,Math.min(c,this.imageWidth+p),Math.min(c,this.imageHeight+d))}alignMinBbox(t){let e=lr(this.positions);return e.pad(e.width*t,e.height*t)}getRefPointsForAlignment(){throw new Error("getRefPointsForAlignment not implemented by base class")}};var fo=class extends ${getRefPointsForAlignment(){let t=this.positions;return[t[0],t[1],dt([t[3],t[4]])]}};var zt=class extends ${getJawOutline(){return this.positions.slice(0,17)}getLeftEyeBrow(){return this.positions.slice(17,22)}getRightEyeBrow(){return this.positions.slice(22,27)}getNose(){return this.positions.slice(27,36)}getLeftEye(){return this.positions.slice(36,42)}getRightEye(){return this.positions.slice(42,48)}getMouth(){return this.positions.slice(48,68)}getRefPointsForAlignment(){return[this.getLeftEye(),this.getRightEye(),this.getMouth()].map(dt)}};var me=class{constructor(t,e){this._label=t,this._distance=e}get label(){return this._label}get distance(){return this._distance}toString(t=!0){return`${this.label}${t?` (${pt(this.distance)})`:""}`}};var pe=class extends w{static assertIsValidLabeledBox(t,e){if(w.assertIsValidBox(t,e),!H(t.label))throw new Error(`${e} - expected property label (${t.label}) to be a number`)}constructor(t,e){super(t);this._label=e}get label(){return this._label}};var at=class{constructor(t,e){if(typeof t!="string")throw new Error("LabeledFaceDescriptors - constructor expected label to be a string");if(!Array.isArray(e)||e.some(r=>!(r instanceof Float32Array)))throw new Error("LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array");this._label=t,this._descriptors=e}get label(){return this._label}get descriptors(){return this._descriptors}toJSON(){return{label:this.label,descriptors:this.descriptors.map(t=>Array.from(t))}}static fromJSON(t){let e=t.descriptors.map(r=>new Float32Array(r));return new at(t.label,e)}};var ho=class extends pe{static assertIsValidPredictedBox(t,e){if(pe.assertIsValidLabeledBox(t,e),!Pt(t.score)||!Pt(t.classScore))throw new Error(`${e} - expected properties score (${t.score}) and (${t.classScore}) to be a number between [0, 1]`)}constructor(t,e,r,a){super(t,e);this._score=r,this._classScore=a}get score(){return this._score}get classScore(){return this._classScore}};function K(o){return o.detection instanceof D}function Dt(o,t){return{...o,...{detection:t}}}function Ce(){let o=window.fetch;if(!o)throw new Error("fetch - missing fetch implementation for browser environment");return{Canvas:HTMLCanvasElement,CanvasRenderingContext2D,Image:HTMLImageElement,ImageData,Video:HTMLVideoElement,createCanvasElement:()=>document.createElement("canvas"),createImageElement:()=>document.createElement("img"),fetch:o,readFile:()=>{throw new Error("readFile - filesystem not available for browser environment")}}}function de(o){let t="";if(!o)try{o=require("fs")}catch(r){t=r.toString()}return{readFile:o?r=>new Promise((a,s)=>{o.readFile(r,(i,c)=>i?s(i):a(c))}):()=>{throw new Error(`readFile - failed to require fs in nodejs environment with error: ${t}`)}}}function Ne(){let o=global.Canvas||global.HTMLCanvasElement,t=global.Image||global.HTMLImageElement,e=()=>{if(o)return new o;throw new Error("createCanvasElement - missing Canvas implementation for nodejs environment")},r=()=>{if(t)return new t;throw new Error("createImageElement - missing Image implementation for nodejs environment")},a=global.fetch,s=de();return{Canvas:o||class{},CanvasRenderingContext2D:global.CanvasRenderingContext2D||class{},Image:t||class{},ImageData:global.ImageData||class{},Video:global.HTMLVideoElement||class{},createCanvasElement:e,createImageElement:r,fetch:a,...s}}function Ie(){return typeof window=="object"&&typeof document!="undefined"&&typeof HTMLImageElement!="undefined"&&typeof HTMLCanvasElement!="undefined"&&typeof HTMLVideoElement!="undefined"&&typeof ImageData!="undefined"&&typeof CanvasRenderingContext2D!="undefined"}function Le(){return typeof global=="object"&&!0&&typeof module!="undefined"&&typeof process!="undefined"&&!!process.version}var M;function xo(){if(!M)throw new Error("getEnv - environment is not defined, check isNodejs() and isBrowser()");return M}function ke(o){M=o}function Se(){return Ie()?ke(Ce()):Le()?ke(Ne()):null}function bo(o){if(M||Se(),!M)throw new Error("monkeyPatch - environment is not defined, check isNodejs() and isBrowser()");let{Canvas:t=M.Canvas,Image:e=M.Image}=o;M.Canvas=t,M.Image=e,M.createCanvasElement=o.createCanvasElement||(()=>new t),M.createImageElement=o.createImageElement||(()=>new e),M.ImageData=o.ImageData||M.ImageData,M.Video=o.Video||M.Video,M.fetch=o.fetch||M.fetch,M.readFile=o.readFile||M.readFile}var _={getEnv:xo,setEnv:ke,initialize:Se,createBrowserEnv:Ce,createFileSystem:de,createNodejsEnv:Ne,monkeyPatch:bo,isBrowser:Ie,isNodejs:Le};Se();function Et(o){return!_.isNodejs()&&typeof o=="string"?document.getElementById(o):o}function S(o){let{Canvas:t,CanvasRenderingContext2D:e}=_.getEnv();if(o instanceof e)return o;let r=Et(o);if(!(r instanceof t))throw new Error("resolveContext2d - expected canvas to be of instance of Canvas");let a=r.getContext("2d");if(!a)throw new Error("resolveContext2d - canvas 2d context is null");return a}var J;(function(o){o.TOP_LEFT="TOP_LEFT",o.TOP_RIGHT="TOP_RIGHT",o.BOTTOM_LEFT="BOTTOM_LEFT",o.BOTTOM_RIGHT="BOTTOM_RIGHT"})(J||(J={}));var Vt=class{constructor(t={}){let{anchorPosition:e,backgroundColor:r,fontColor:a,fontSize:s,fontStyle:i,padding:c}=t;this.anchorPosition=e||J.TOP_LEFT,this.backgroundColor=r||"rgba(0, 0, 0, 0.5)",this.fontColor=a||"rgba(255, 255, 255, 1)",this.fontSize=s||14,this.fontStyle=i||"Georgia",this.padding=c||4}},st=class{constructor(t,e,r={}){this.text=typeof t=="string"?[t]:t instanceof st?t.text:t,this.anchor=e,this.options=new Vt(r)}measureWidth(t){let{padding:e}=this.options;return this.text.map(r=>t.measureText(r).width).reduce((r,a)=>r{let b=m+u.x,F=m+u.y+(f+1)*i;r.fillText(l,b,F)})}};var Ae=class{constructor(t={}){let{boxColor:e,lineWidth:r,label:a,drawLabelOptions:s}=t;this.boxColor=e||"rgba(0, 0, 255, 1)",this.lineWidth=r||2,this.label=a;let i={anchorPosition:J.BOTTOM_LEFT,backgroundColor:this.boxColor};this.drawLabelOptions=new Vt({...i,...s})}},ue=class{constructor(t,e={}){this.box=new w(t),this.options=new Ae(e)}draw(t){let e=S(t),{boxColor:r,lineWidth:a}=this.options,{x:s,y:i,width:c,height:m}=this.box;e.strokeStyle=r,e.lineWidth=a,e.strokeRect(s,i,c,m);let{label:p}=this.options;p&&new st([p],{x:s-a/2,y:i},this.options.drawLabelOptions).draw(t)}};function go(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let a=r instanceof D?r.score:K(r)?r.detection.score:void 0,s=r instanceof D?r.box:K(r)?r.detection.box:new w(r),i=a?`${pt(a)}`:void 0;new ue(s,{label:i}).draw(o)})}function le(o){let{Image:t,Video:e}=_.getEnv();return o instanceof t&&o.complete||o instanceof e&&o.readyState>=3}function xr(o){return new Promise((t,e)=>{if(o instanceof _.getEnv().Canvas||le(o))return t(null);function r(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",a),s.currentTarget.removeEventListener("error",r),e(s))}function a(s){!s.currentTarget||(s.currentTarget.removeEventListener("load",a),s.currentTarget.removeEventListener("error",r),t(s))}o.addEventListener("load",a),o.addEventListener("error",r)})}function br(o){return new Promise((t,e)=>{o instanceof Blob||e(new Error("bufferToImage - expected buf to be of type: Blob"));let r=new FileReader;r.onload=()=>{typeof r.result!="string"&&e(new Error("bufferToImage - expected reader.result to be a string, in onload"));let a=_.getEnv().createImageElement();a.onload=()=>t(a),a.onerror=e,a.src=r.result},r.onerror=e,r.readAsDataURL(o)})}function Mt(o){let{Image:t,Video:e}=_.getEnv();return o instanceof t?new L(o.naturalWidth,o.naturalHeight):o instanceof e?new L(o.videoWidth,o.videoHeight):new L(o.width,o.height)}function Ct({width:o,height:t}){let{createCanvasElement:e}=_.getEnv(),r=e();return r.width=o,r.height=t,r}function fe(o,t){let{ImageData:e}=_.getEnv();if(!(o instanceof e)&&!le(o))throw new Error("createCanvasFromMedia - media has not finished loading yet");let{width:r,height:a}=t||Mt(o),s=Ct({width:r,height:a});return o instanceof e?S(s).putImageData(o,0,0):S(s).drawImage(o,0,0,r,a),s}async function gr(o,t){let e=t||_.getEnv().createCanvasElement(),[r,a,s]=o.shape.slice(B(o)?1:0),i=n.tidy(()=>o.as3D(r,a,s).toInt());return await n.browser.toPixels(i,e),i.dispose(),e}function We(o){let{Image:t,Canvas:e,Video:r}=_.getEnv();return o instanceof t||o instanceof e||o instanceof r}function vr(o,t,e=!1){let{Image:r,Canvas:a}=_.getEnv();if(!(o instanceof r||o instanceof a))throw new Error("imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement");if(t<=0)return Ct({width:1,height:1});let s=Mt(o),i=t/Math.max(s.height,s.width),c=i*s.width,m=i*s.height,p=Ct({width:t,height:t}),d=o instanceof a?o:fe(o),u=Math.abs(c-m)/2,l=e&&c0&&d.height>0&&S(p).drawImage(d,l,f,c,m),p}var it=class{constructor(t,e=!1){this._imageTensors=[];this._canvases=[];this._treatAsBatchInput=!1;this._inputDimensions=[];if(!Array.isArray(t))throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${t}`);this._treatAsBatchInput=e,this._batchSize=t.length,t.forEach((r,a)=>{if(Z(r)){this._imageTensors[a]=r,this._inputDimensions[a]=r.shape;return}if(B(r)){let i=r.shape[0];if(i!==1)throw new Error(`NetInput - tf.Tensor4D with batchSize ${i} passed, but not supported in input array`);this._imageTensors[a]=r,this._inputDimensions[a]=r.shape.slice(1);return}let s=r instanceof _.getEnv().Canvas?r:fe(r);this._canvases[a]=s,this._inputDimensions[a]=[s.height,s.width,3]})}get imageTensors(){return this._imageTensors}get canvases(){return this._canvases}get isBatchInput(){return this.batchSize>1||this._treatAsBatchInput}get batchSize(){return this._batchSize}get inputDimensions(){return this._inputDimensions}get inputSize(){return this._inputSize}get reshapedInputDimensions(){return U(this.batchSize,0,1).map((t,e)=>this.getReshapedInputDimensions(e))}getInput(t){return this.canvases[t]||this.imageTensors[t]}getInputDimensions(t){return this._inputDimensions[t]}getInputHeight(t){return this._inputDimensions[t][0]}getInputWidth(t){return this._inputDimensions[t][1]}getReshapedInputDimensions(t){if(typeof this.inputSize!="number")throw new Error("getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet");let e=this.getInputWidth(t),r=this.getInputHeight(t);return Me({width:e,height:r},this.inputSize)}toBatchTensor(t,e=!0){return this._inputSize=t,n.tidy(()=>{let r=U(this.batchSize,0,1).map(s=>{let i=this.getInput(s);if(i instanceof n.Tensor){let c=B(i)?i:n.expandDims(i);return c=hr(c,e),(c.shape[1]!==t||c.shape[2]!==t)&&(c=n.image.resizeBilinear(c,[t,t],!1,!1)),c.as3D(t,t,3)}if(i instanceof _.getEnv().Canvas)return n.browser.fromPixels(vr(i,t,e));throw new Error(`toBatchTensor - at batchIdx ${s}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${i}`)});return n.stack(r.map(s=>n.cast(s,"float32"))).as4D(this.batchSize,t,t,3)})}};async function P(o){if(o instanceof it)return o;let t=Array.isArray(o)?o:[o];if(!t.length)throw new Error("toNetInput - empty array passed as input");let e=a=>Array.isArray(o)?` at input index ${a}:`:"",r=t.map(Et);return r.forEach((a,s)=>{if(!We(a)&&!Z(a)&&!B(a))throw typeof t[s]=="string"?new Error(`toNetInput -${e(s)} string passed, but could not resolve HTMLElement for element id ${t[s]}`):new Error(`toNetInput -${e(s)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);if(B(a)){let i=a.shape[0];if(i!==1)throw new Error(`toNetInput -${e(s)} tf.Tensor4D with batchSize ${i} passed, but not supported in input array`)}}),await Promise.all(r.map(a=>We(a)&&xr(a))),new it(r,Array.isArray(o))}async function Ut(o,t){let{Canvas:e}=_.getEnv(),r=o;if(!(o instanceof e)){let i=await P(o);if(i.batchSize>1)throw new Error("extractFaces - batchSize > 1 not supported");let c=i.getInput(0);r=c instanceof e?c:await gr(c)}let a=S(r);return t.map(i=>i instanceof D?i.forSize(r.width,r.height).box.floor():i).map(i=>i.clipAtImageBorders(r.width,r.height)).map(({x:i,y:c,width:m,height:p})=>{let d=Ct({width:m,height:p});return m>0&&p>0&&S(d).putImageData(a.getImageData(i,c,m,p),0,0),d})}async function Xt(o,t){if(!Z(o)&&!B(o))throw new Error("extractFaceTensors - expected image tensor to be 3D or 4D");if(B(o)&&o.shape[0]>1)throw new Error("extractFaceTensors - batchSize > 1 not supported");return n.tidy(()=>{let[e,r,a]=o.shape.slice(B(o)?1:0);return t.map(c=>c instanceof D?c.forSize(r,e).box:c).map(c=>c.clipAtImageBorders(r,e)).map(({x:c,y:m,width:p,height:d})=>n.slice3d(o.as3D(e,r,a),[m,c,0],[d,p,a]))})}async function Nt(o,t){let{fetch:e}=_.getEnv(),r=await e(o,t);if(!(r.status<400))throw new Error(`failed to fetch: (${r.status}) ${r.statusText}, from url: ${r.url}`);return r}async function si(o){let t=await Nt(o),e=await t.blob();if(!e.type.startsWith("image/"))throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${e.type}, for url: ${t.url}`);return br(e)}async function yr(o){return(await Nt(o)).json()}async function di(o){return new Float32Array(await(await Nt(o)).arrayBuffer())}function he(o,t){let e=`${t}-weights_manifest.json`;if(!o)return{modelBaseUri:"",manifestUri:e};if(o==="/")return{modelBaseUri:"/",manifestUri:`/${e}`};let r=o.startsWith("http://")?"http://":o.startsWith("https://")?"https://":"";o=o.replace(r,"");let a=o.split("/").filter(c=>c),s=o.endsWith(".json")?a[a.length-1]:e,i=r+(o.endsWith(".json")?a.slice(0,a.length-1):a).join("/");return i=o.startsWith("/")?`/${i}`:i,{modelBaseUri:i,manifestUri:i==="/"?`/${s}`:`${i}/${s}`}}async function Fr(o,t){let{manifestUri:e,modelBaseUri:r}=he(o,t),a=await yr(e);return n.io.loadWeights(a,r)}function vi(o,t,e=!1){let{width:r,height:a}=e?Mt(t):t;return o.width=r,o.height=a,{width:r,height:a}}var C=class{constructor(t){this._params=void 0;this._paramMappings=[];this._name=t}get params(){return this._params}get paramMappings(){return this._paramMappings}get isLoaded(){return!!this.params}getParamFromPath(t){let{obj:e,objProp:r}=this.traversePropertyPath(t);return e[r]}reassignParamFromPath(t,e){let{obj:r,objProp:a}=this.traversePropertyPath(t);r[a].dispose(),r[a]=e}getParamList(){return this._paramMappings.map(({paramPath:t})=>({path:t,tensor:this.getParamFromPath(t)}))}getTrainableParams(){return this.getParamList().filter(t=>t.tensor instanceof n.Variable)}getFrozenParams(){return this.getParamList().filter(t=>!(t.tensor instanceof n.Variable))}variable(){this.getFrozenParams().forEach(({path:t,tensor:e})=>{this.reassignParamFromPath(t,e.variable())})}freeze(){this.getTrainableParams().forEach(({path:t,tensor:e})=>{let r=n.tensor(e.dataSync());e.dispose(),this.reassignParamFromPath(t,r)})}dispose(t=!0){this.getParamList().forEach(e=>{if(t&&e.tensor.isDisposed)throw new Error(`param tensor has already been disposed for path ${e.path}`);e.tensor.dispose()}),this._params=void 0}serializeParams(){return new Float32Array(this.getParamList().map(({tensor:t})=>Array.from(t.dataSync())).reduce((t,e)=>t.concat(e)))}async load(t){if(t instanceof Float32Array){this.extractWeights(t);return}await this.loadFromUri(t)}async loadFromUri(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromUri - expected model uri`);let e=await Fr(t,this.getDefaultModelName());this.loadFromWeightMap(e)}async loadFromDisk(t){if(t&&typeof t!="string")throw new Error(`${this._name}.loadFromDisk - expected model file path`);let{readFile:e}=_.getEnv(),{manifestUri:r,modelBaseUri:a}=he(t,this.getDefaultModelName()),s=p=>Promise.all(p.map(d=>e(d).then(u=>u.buffer))),i=n.io.weightsLoaderFactory(s),c=JSON.parse((await e(r)).toString()),m=await i(c,a);this.loadFromWeightMap(m)}loadFromWeightMap(t){let{paramMappings:e,params:r}=this.extractParamsFromWeightMap(t);this._paramMappings=e,this._params=r}extractWeights(t){let{paramMappings:e,params:r}=this.extractParams(t);this._paramMappings=e,this._params=r}traversePropertyPath(t){if(!this.params)throw new Error("traversePropertyPath - model has no loaded params");let e=t.split("/").reduce((s,i)=>{if(!s.nextObj.hasOwnProperty(i))throw new Error(`traversePropertyPath - object does not have property ${i}, for path ${t}`);return{obj:s.nextObj,objProp:i,nextObj:s.nextObj[i]}},{nextObj:this.params}),{obj:r,objProp:a}=e;if(!r||!a||!(r[a]instanceof n.Tensor))throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${t}`);return{obj:r,objProp:a}}};function k(o,t,e){return n.tidy(()=>{let r=n.separableConv2d(o,t.depthwise_filter,t.pointwise_filter,e,"same");return r=n.add(r,t.bias),r})}function xe(o,t,e=!1){return n.tidy(()=>{let r=n.relu(e?n.add(n.conv2d(o,t.conv0.filters,[2,2],"same"),t.conv0.bias):k(o,t.conv0,[2,2])),a=k(r,t.conv1,[1,1]),s=n.relu(n.add(r,a)),i=k(s,t.conv2,[1,1]);return n.relu(n.add(r,n.add(a,i)))})}function Jt(o,t,e=!1,r=!0){return n.tidy(()=>{let a=n.relu(e?n.add(n.conv2d(o,t.conv0.filters,r?[2,2]:[1,1],"same"),t.conv0.bias):k(o,t.conv0,r?[2,2]:[1,1])),s=k(a,t.conv1,[1,1]),i=n.relu(n.add(a,s)),c=k(i,t.conv2,[1,1]),m=n.relu(n.add(a,n.add(s,c))),p=k(m,t.conv3,[1,1]);return n.relu(n.add(a,n.add(s,n.add(c,p))))})}function lt(o,t,e="same",r=!1){return n.tidy(()=>{let a=n.add(n.conv2d(o,t.filters,[1,1],e),t.bias);return r?n.relu(a):a})}function N(o,t){Object.keys(o).forEach(e=>{t.some(r=>r.originalPath===e)||o[e].dispose()})}function It(o,t){return(e,r,a,s)=>{let i=n.tensor4d(o(e*r*a*a),[a,a,e,r]),c=n.tensor1d(o(r));return t.push({paramPath:`${s}/filters`},{paramPath:`${s}/bias`}),{filters:i,bias:c}}}function be(o,t){return(e,r,a)=>{let s=n.tensor2d(o(e*r),[e,r]),i=n.tensor1d(o(r));return t.push({paramPath:`${a}/weights`},{paramPath:`${a}/bias`}),{weights:s,bias:i}}}var ge=class{constructor(t,e,r){this.depthwise_filter=t;this.pointwise_filter=e;this.bias=r}};function Lt(o,t){return(e,r,a)=>{let s=n.tensor4d(o(3*3*e),[3,3,e,1]),i=n.tensor4d(o(e*r),[1,1,e,r]),c=n.tensor1d(o(r));return t.push({paramPath:`${a}/depthwise_filter`},{paramPath:`${a}/pointwise_filter`},{paramPath:`${a}/bias`}),new ge(s,i,c)}}function kt(o){return t=>{let e=o(`${t}/depthwise_filter`,4),r=o(`${t}/pointwise_filter`,4),a=o(`${t}/bias`,1);return new ge(e,r,a)}}function A(o,t){return(e,r,a)=>{let s=o[e];if(!mt(s,r))throw new Error(`expected weightMap[${e}] to be a Tensor${r}D, instead have ${s}`);return t.push({originalPath:e,paramPath:a||e}),s}}function I(o){let t=o;function e(a){let s=t.slice(0,a);return t=t.slice(a),s}function r(){return t}return{extractWeights:e,getRemainingWeights:r}}function ve(o,t){let e=It(o,t),r=Lt(o,t);function a(i,c,m,p=!1){let d=p?e(i,c,3,`${m}/conv0`):r(i,c,`${m}/conv0`),u=r(c,c,`${m}/conv1`),l=r(c,c,`${m}/conv2`);return{conv0:d,conv1:u,conv2:l}}function s(i,c,m,p=!1){let{conv0:d,conv1:u,conv2:l}=a(i,c,m,p),f=r(c,c,`${m}/conv3`);return{conv0:d,conv1:u,conv2:l,conv3:f}}return{extractDenseBlock3Params:a,extractDenseBlock4Params:s}}function Tr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=I(o),{extractDenseBlock4Params:a}=ve(e,t),s=a(3,32,"dense0",!0),i=a(32,64,"dense1"),c=a(64,128,"dense2"),m=a(128,256,"dense3");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:c,dense3:m}}}function ye(o){return t=>{let e=o(`${t}/filters`,4),r=o(`${t}/bias`,1);return{filters:e,bias:r}}}function Fe(o,t){let e=A(o,t),r=ye(e),a=kt(e);function s(c,m=!1){let p=m?r(`${c}/conv0`):a(`${c}/conv0`),d=a(`${c}/conv1`),u=a(`${c}/conv2`);return{conv0:p,conv1:d,conv2:u}}function i(c,m=!1){let p=m?r(`${c}/conv0`):a(`${c}/conv0`),d=a(`${c}/conv1`),u=a(`${c}/conv2`),l=a(`${c}/conv3`);return{conv0:p,conv1:d,conv2:u,conv3:l}}return{extractDenseBlock3Params:s,extractDenseBlock4Params:i}}function _r(o){let t=[],{extractDenseBlock4Params:e}=Fe(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2"),dense3:e("dense3")};return N(o,t),{params:r,paramMappings:t}}var qt=class extends C{constructor(){super("FaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceFeatureExtractor - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(112,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=Jt(s,e.dense0,!0);return i=Jt(i,e.dense1),i=Jt(i,e.dense2),i=Jt(i,e.dense3),i=n.avgPool(i,[7,7],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await P(t))}getDefaultModelName(){return"face_feature_extractor_model"}extractParamsFromWeightMap(t){return _r(t)}extractParams(t){return Tr(t)}};function Zt(o,t){return n.tidy(()=>n.add(n.matMul(o,t.weights),t.bias))}function wr(o,t,e){let r=[],{extractWeights:a,getRemainingWeights:s}=I(o),c=be(a,r)(t,e,"fc");if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{paramMappings:r,params:{fc:c}}}function Pr(o){let t=[],e=A(o,t);function r(s){let i=e(`${s}/weights`,2),c=e(`${s}/bias`,1);return{weights:i,bias:c}}let a={fc:r("fc")};return N(o,t),{params:a,paramMappings:t}}function Te(o){let t={},e={};return Object.keys(o).forEach(r=>{let a=r.startsWith("fc")?e:t;a[r]=o[r]}),{featureExtractorMap:t,classifierMap:e}}var Kt=class extends C{constructor(t,e){super(t);this._faceFeatureExtractor=e}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return n.tidy(()=>{let r=t instanceof it?this.faceFeatureExtractor.forwardInput(t):t;return Zt(r.as2D(r.shape[0],-1),e.fc)})}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return wr(t,this.getClassifierChannelsIn(),this.getClassifierChannelsOut())}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=Te(t);return this.faceFeatureExtractor.loadFromWeightMap(e),Pr(r)}extractParams(t){let e=this.getClassifierChannelsIn(),r=this.getClassifierChannelsOut(),a=r*e+r,s=t.slice(0,t.length-a),i=t.slice(t.length-a);return this.faceFeatureExtractor.extractWeights(s),this.extractClassifierParams(i)}};var Dr=["neutral","happy","sad","angry","fearful","disgusted","surprised"],ft=class{constructor(t){if(t.length!==7)throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${t.length}`);Dr.forEach((e,r)=>{this[e]=t[r]})}asSortedArray(){return Dr.map(t=>({expression:t,probability:this[t]})).sort((t,e)=>e.probability-t.probability)}};var Be=class extends Kt{constructor(t=new qt){super("FaceExpressionNet",t)}forwardInput(t){return n.tidy(()=>n.softmax(this.runNet(t)))}async forward(t){return this.forwardInput(await P(t))}async predictExpressions(t){let e=await P(t),r=await this.forwardInput(e),a=await Promise.all(n.unstack(r).map(async i=>{let c=i.dataSync();return i.dispose(),c}));r.dispose();let s=a.map(i=>new ft(i));return e.isBatchInput?s:s[0]}getDefaultModelName(){return"face_expression_model"}getClassifierChannelsIn(){return 256}getClassifierChannelsOut(){return 7}};function Er(o){return o.expressions instanceof ft}function Re(o,t){return{...o,...{expressions:t}}}function vo(o,t,e=.1,r){(Array.isArray(t)?t:[t]).forEach(s=>{let i=s instanceof ft?s:Er(s)?s.expressions:void 0;if(!i)throw new Error("drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof");let m=i.asSortedArray().filter(u=>u.probability>e),p=K(s)?s.detection.box.bottomLeft:r||new x(0,0);new st(m.map(u=>`${u.expression} (${pt(u.probability)})`),p).draw(o)})}function St(o){return K(o)&&o.landmarks instanceof $&&o.unshiftedLandmarks instanceof $&&o.alignedRect instanceof D}function yo(o){let t=(c,m,p,d)=>Math.atan2(d-m,p-c)%Math.PI,e=c=>c*180/Math.PI,r={roll:void 0,pitch:void 0,yaw:void 0};if(!o||!o._positions||o._positions.length!==68)return r;let a=o._positions;r.roll=-t(a[36]._x,a[36]._y,a[45]._x,a[45]._y),r.pitch=t(0,Math.abs(a[0]._x-a[30]._x)/a[30]._x,Math.PI,Math.abs(a[16]._x-a[30]._x)/a[30]._x);let s=a.reduce((c,m)=>cc>m._y?c:m._y,-Infinity);return r.yaw=Math.PI*(o._imgDims._height/(i-s)/1.4-1),r}function Qt(o,t){let{box:e}=o.detection,r=t.shiftBy(e.x,e.y),a=r.align(),{imageDims:s}=o.detection,i=new D(o.detection.score,a.rescale(s.reverse()),s),c=yo(t);return{...o,...{landmarks:r,unshiftedLandmarks:t,alignedRect:i,angle:c}}}var $e=class{constructor(t={}){let{drawLines:e=!0,drawPoints:r=!0,lineWidth:a,lineColor:s,pointSize:i,pointColor:c}=t;this.drawLines=e,this.drawPoints=r,this.lineWidth=a||1,this.pointSize=i||2,this.lineColor=s||"rgba(0, 255, 255, 1)",this.pointColor=c||"rgba(255, 0, 255, 1)"}},Oe=class{constructor(t,e={}){this.faceLandmarks=t,this.options=new $e(e)}draw(t){let e=S(t),{drawLines:r,drawPoints:a,lineWidth:s,lineColor:i,pointSize:c,pointColor:m}=this.options;if(r&&this.faceLandmarks instanceof zt&&(e.strokeStyle=i,e.lineWidth=s,q(e,this.faceLandmarks.getJawOutline()),q(e,this.faceLandmarks.getLeftEyeBrow()),q(e,this.faceLandmarks.getRightEyeBrow()),q(e,this.faceLandmarks.getNose()),q(e,this.faceLandmarks.getLeftEye(),!0),q(e,this.faceLandmarks.getRightEye(),!0),q(e,this.faceLandmarks.getMouth(),!0)),a){e.strokeStyle=m,e.fillStyle=m;let p=d=>{e.beginPath(),e.arc(d.x,d.y,c,0,2*Math.PI),e.fill()};this.faceLandmarks.positions.forEach(p)}}};function Fo(o,t){(Array.isArray(t)?t:[t]).forEach(r=>{let a=r instanceof $?r:St(r)?r.landmarks:void 0;if(!a)throw new Error("drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof");new Oe(a).draw(o)})}var Mr="1.1.6";function _o(o,t){let e=It(o,t),r=Lt(o,t);function a(i,c,m){let p=r(i,c,`${m}/separable_conv0`),d=r(c,c,`${m}/separable_conv1`),u=e(i,c,1,`${m}/expansion_conv`);return{separable_conv0:p,separable_conv1:d,expansion_conv:u}}function s(i,c){let m=r(i,i,`${c}/separable_conv0`),p=r(i,i,`${c}/separable_conv1`),d=r(i,i,`${c}/separable_conv2`);return{separable_conv0:m,separable_conv1:p,separable_conv2:d}}return{extractConvParams:e,extractSeparableConvParams:r,extractReductionBlockParams:a,extractMainBlockParams:s}}function Cr(o,t){let e=[],{extractWeights:r,getRemainingWeights:a}=I(o),{extractConvParams:s,extractSeparableConvParams:i,extractReductionBlockParams:c,extractMainBlockParams:m}=_o(r,e),p=s(3,32,3,"entry_flow/conv_in"),d=c(32,64,"entry_flow/reduction_block_0"),u=c(64,128,"entry_flow/reduction_block_1"),l={conv_in:p,reduction_block_0:d,reduction_block_1:u},f={};U(t,0,1).forEach(g=>{f[`main_block_${g}`]=m(128,`middle_flow/main_block_${g}`)});let b=c(128,256,"exit_flow/reduction_block"),F=i(256,512,"exit_flow/separable_conv"),h={reduction_block:b,separable_conv:F};if(a().length!==0)throw new Error(`weights remaing after extract: ${a().length}`);return{paramMappings:e,params:{entry_flow:l,middle_flow:f,exit_flow:h}}}function wo(o,t){let e=A(o,t),r=ye(e),a=kt(e);function s(c){let m=a(`${c}/separable_conv0`),p=a(`${c}/separable_conv1`),d=r(`${c}/expansion_conv`);return{separable_conv0:m,separable_conv1:p,expansion_conv:d}}function i(c){let m=a(`${c}/separable_conv0`),p=a(`${c}/separable_conv1`),d=a(`${c}/separable_conv2`);return{separable_conv0:m,separable_conv1:p,separable_conv2:d}}return{extractConvParams:r,extractSeparableConvParams:a,extractReductionBlockParams:s,extractMainBlockParams:i}}function Nr(o,t){let e=[],{extractConvParams:r,extractSeparableConvParams:a,extractReductionBlockParams:s,extractMainBlockParams:i}=wo(o,e),c=r("entry_flow/conv_in"),m=s("entry_flow/reduction_block_0"),p=s("entry_flow/reduction_block_1"),d={conv_in:c,reduction_block_0:m,reduction_block_1:p},u={};U(t,0,1).forEach(F=>{u[`main_block_${F}`]=i(`middle_flow/main_block_${F}`)});let l=s("exit_flow/reduction_block"),f=a("exit_flow/separable_conv"),b={reduction_block:l,separable_conv:f};return N(o,e),{params:{entry_flow:d,middle_flow:u,exit_flow:b},paramMappings:e}}function Ir(o,t,e){return n.add(n.conv2d(o,t.filters,e,"same"),t.bias)}function je(o,t,e=!0){let r=e?n.relu(o):o;return r=k(r,t.separable_conv0,[1,1]),r=k(n.relu(r),t.separable_conv1,[1,1]),r=n.maxPool(r,[3,3],[2,2],"same"),r=n.add(r,Ir(o,t.expansion_conv,[2,2])),r}function Po(o,t){let e=k(n.relu(o),t.separable_conv0,[1,1]);return e=k(n.relu(e),t.separable_conv1,[1,1]),e=k(n.relu(e),t.separable_conv2,[1,1]),e=n.add(e,o),e}var He=class extends C{constructor(t){super("TinyXception");this._numMainBlocks=t}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyXception - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(112,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=n.relu(Ir(s,e.entry_flow.conv_in,[2,2]));return i=je(i,e.entry_flow.reduction_block_0,!1),i=je(i,e.entry_flow.reduction_block_1),U(this._numMainBlocks,0,1).forEach(c=>{i=Po(i,e.middle_flow[`main_block_${c}`])}),i=je(i,e.exit_flow.reduction_block),i=n.relu(k(i,e.exit_flow.separable_conv,[1,1])),i})}async forward(t){return this.forwardInput(await P(t))}getDefaultModelName(){return"tiny_xception_model"}extractParamsFromWeightMap(t){return Nr(t,this._numMainBlocks)}extractParams(t){return Cr(t,this._numMainBlocks)}};function Lr(o){let t=[],{extractWeights:e,getRemainingWeights:r}=I(o),a=be(e,t),s=a(512,1,"fc/age"),i=a(512,2,"fc/gender");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{fc:{age:s,gender:i}}}}function kr(o){let t=[],e=A(o,t);function r(s){let i=e(`${s}/weights`,2),c=e(`${s}/bias`,1);return{weights:i,bias:c}}let a={fc:{age:r("fc/age"),gender:r("fc/gender")}};return N(o,t),{params:a,paramMappings:t}}var ct;(function(o){o.FEMALE="female",o.MALE="male"})(ct||(ct={}));var Ye=class extends C{constructor(t=new He(2)){super("AgeGenderNet");this._faceFeatureExtractor=t}get faceFeatureExtractor(){return this._faceFeatureExtractor}runNet(t){let{params:e}=this;if(!e)throw new Error(`${this._name} - load model before inference`);return n.tidy(()=>{let r=t instanceof it?this.faceFeatureExtractor.forwardInput(t):t,a=n.avgPool(r,[7,7],[2,2],"valid").as2D(r.shape[0],-1),s=Zt(a,e.fc.age).as1D(),i=Zt(a,e.fc.gender);return{age:s,gender:i}})}forwardInput(t){return n.tidy(()=>{let{age:e,gender:r}=this.runNet(t);return{age:e,gender:n.softmax(r)}})}async forward(t){return this.forwardInput(await P(t))}async predictAgeAndGender(t){let e=await P(t),r=await this.forwardInput(e),a=n.unstack(r.age),s=n.unstack(r.gender),i=a.map((m,p)=>({ageTensor:m,genderTensor:s[p]})),c=await Promise.all(i.map(async({ageTensor:m,genderTensor:p})=>{let d=m.dataSync()[0],u=p.dataSync()[0],l=u>.5,f=l?ct.MALE:ct.FEMALE,b=l?u:1-u;return m.dispose(),p.dispose(),{age:d,gender:f,genderProbability:b}}));return r.age.dispose(),r.gender.dispose(),e.isBatchInput?c:c[0]}getDefaultModelName(){return"age_gender_model"}dispose(t=!0){this.faceFeatureExtractor.dispose(t),super.dispose(t)}loadClassifierParams(t){let{params:e,paramMappings:r}=this.extractClassifierParams(t);this._params=e,this._paramMappings=r}extractClassifierParams(t){return Lr(t)}extractParamsFromWeightMap(t){let{featureExtractorMap:e,classifierMap:r}=Te(t);return this.faceFeatureExtractor.loadFromWeightMap(e),kr(r)}extractParams(t){let e=512*1+1+(512*2+2),r=t.slice(0,t.length-e),a=t.slice(t.length-e);return this.faceFeatureExtractor.extractWeights(r),this.extractClassifierParams(a)}};var te=class extends Kt{postProcess(t,e,r){let a=r.map(({width:i,height:c})=>{let m=e/Math.max(c,i);return{width:i*m,height:c*m}}),s=a.length;return n.tidy(()=>{let i=(u,l)=>n.stack([n.fill([68],u,"float32"),n.fill([68],l,"float32")],1).as2D(1,136).as1D(),c=(u,l)=>{let{width:f,height:b}=a[u];return l(f,b)?Math.abs(f-b)/2:0},m=u=>c(u,(l,f)=>lc(u,(l,f)=>fi(m(l),p(l))))).div(n.stack(Array.from(Array(s),(u,l)=>i(a[l].width,a[l].height))))})}forwardInput(t){return n.tidy(()=>{let e=this.runNet(t);return this.postProcess(e,t.inputSize,t.inputDimensions.map(([r,a])=>({height:r,width:a})))})}async forward(t){return this.forwardInput(await P(t))}async detectLandmarks(t){let e=await P(t),r=n.tidy(()=>n.unstack(this.forwardInput(e))),a=await Promise.all(r.map(async(s,i)=>{let c=Array.from(s.dataSync()),m=c.filter((d,u)=>se(u)),p=c.filter((d,u)=>!se(u));return new zt(Array(68).fill(0).map((d,u)=>new x(m[u],p[u])),{height:e.getInputHeight(i),width:e.getInputWidth(i)})}));return r.forEach(s=>s.dispose()),e.isBatchInput?a:a[0]}getClassifierChannelsOut(){return 136}};var ee=class extends te{constructor(t=new qt){super("FaceLandmark68Net",t)}getDefaultModelName(){return"face_landmark_68_model"}getClassifierChannelsIn(){return 256}};function Sr(o){let t=[],{extractDenseBlock3Params:e}=Fe(o,t),r={dense0:e("dense0",!0),dense1:e("dense1"),dense2:e("dense2")};return N(o,t),{params:r,paramMappings:t}}function Ar(o){let t=[],{extractWeights:e,getRemainingWeights:r}=I(o),{extractDenseBlock3Params:a}=ve(e,t),s=a(3,32,"dense0",!0),i=a(32,64,"dense1"),c=a(64,128,"dense2");if(r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{paramMappings:t,params:{dense0:s,dense1:i,dense2:c}}}var Ge=class extends C{constructor(){super("TinyFaceFeatureExtractor")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("TinyFaceFeatureExtractor - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(112,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=xe(s,e.dense0,!0);return i=xe(i,e.dense1),i=xe(i,e.dense2),i=n.avgPool(i,[14,14],[2,2],"valid"),i})}async forward(t){return this.forwardInput(await P(t))}getDefaultModelName(){return"face_feature_extractor_tiny_model"}extractParamsFromWeightMap(t){return Sr(t)}extractParams(t){return Ar(t)}};var ze=class extends te{constructor(t=new Ge){super("FaceLandmark68TinyNet",t)}getDefaultModelName(){return"face_landmark_68_tiny_model"}getClassifierChannelsIn(){return 128}};var Do=class extends ee{};function Wr(o,t){return n.add(n.mul(o,t.weights),t.biases)}function Ve(o,t,e,r,a="same"){let{filters:s,bias:i}=t.conv,c=n.conv2d(o,s,e,a);return c=n.add(c,i),c=Wr(c,t.scale),r?n.relu(c):c}function Br(o,t){return Ve(o,t,[1,1],!0)}function Ue(o,t){return Ve(o,t,[1,1],!1)}function _e(o,t){return Ve(o,t,[2,2],!0,"valid")}function Eo(o,t){function e(c,m,p){let d=o(c),u=d.length/(m*p*p);if(Ee(u))throw new Error(`depth has to be an integer: ${u}, weights.length: ${d.length}, numFilters: ${m}, filterSize: ${p}`);return n.tidy(()=>n.transpose(n.tensor4d(d,[m,u,p,p]),[2,3,1,0]))}function r(c,m,p,d){let u=e(c,m,p),l=n.tensor1d(o(m));return t.push({paramPath:`${d}/filters`},{paramPath:`${d}/bias`}),{filters:u,bias:l}}function a(c,m){let p=n.tensor1d(o(c)),d=n.tensor1d(o(c));return t.push({paramPath:`${m}/weights`},{paramPath:`${m}/biases`}),{weights:p,biases:d}}function s(c,m,p,d){let u=r(c,m,p,`${d}/conv`),l=a(m,`${d}/scale`);return{conv:u,scale:l}}function i(c,m,p,d,u=!1){let l=s((u?.5:1)*c,m,p,`${d}/conv1`),f=s(c,m,p,`${d}/conv2`);return{conv1:l,conv2:f}}return{extractConvLayerParams:s,extractResidualLayerParams:i}}function Rr(o){let{extractWeights:t,getRemainingWeights:e}=I(o),r=[],{extractConvLayerParams:a,extractResidualLayerParams:s}=Eo(t,r),i=a(4704,32,7,"conv32_down"),c=s(9216,32,3,"conv32_1"),m=s(9216,32,3,"conv32_2"),p=s(9216,32,3,"conv32_3"),d=s(36864,64,3,"conv64_down",!0),u=s(36864,64,3,"conv64_1"),l=s(36864,64,3,"conv64_2"),f=s(36864,64,3,"conv64_3"),b=s(147456,128,3,"conv128_down",!0),F=s(147456,128,3,"conv128_1"),h=s(147456,128,3,"conv128_2"),g=s(589824,256,3,"conv256_down",!0),y=s(589824,256,3,"conv256_1"),v=s(589824,256,3,"conv256_2"),E=s(589824,256,3,"conv256_down_out"),W=n.tidy(()=>n.transpose(n.tensor2d(t(256*128),[128,256]),[1,0]));if(r.push({paramPath:"fc"}),e().length!==0)throw new Error(`weights remaing after extract: ${e().length}`);return{params:{conv32_down:i,conv32_1:c,conv32_2:m,conv32_3:p,conv64_down:d,conv64_1:u,conv64_2:l,conv64_3:f,conv128_down:b,conv128_1:F,conv128_2:h,conv256_down:g,conv256_1:y,conv256_2:v,conv256_down_out:E,fc:W},paramMappings:r}}function Mo(o,t){let e=A(o,t);function r(i){let c=e(`${i}/scale/weights`,1),m=e(`${i}/scale/biases`,1);return{weights:c,biases:m}}function a(i){let c=e(`${i}/conv/filters`,4),m=e(`${i}/conv/bias`,1),p=r(i);return{conv:{filters:c,bias:m},scale:p}}function s(i){return{conv1:a(`${i}/conv1`),conv2:a(`${i}/conv2`)}}return{extractConvLayerParams:a,extractResidualLayerParams:s}}function $r(o){let t=[],{extractConvLayerParams:e,extractResidualLayerParams:r}=Mo(o,t),a=e("conv32_down"),s=r("conv32_1"),i=r("conv32_2"),c=r("conv32_3"),m=r("conv64_down"),p=r("conv64_1"),d=r("conv64_2"),u=r("conv64_3"),l=r("conv128_down"),f=r("conv128_1"),b=r("conv128_2"),F=r("conv256_down"),h=r("conv256_1"),g=r("conv256_2"),y=r("conv256_down_out"),{fc:v}=o;if(t.push({originalPath:"fc",paramPath:"fc"}),!De(v))throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${v}`);let E={conv32_down:a,conv32_1:s,conv32_2:i,conv32_3:c,conv64_down:m,conv64_1:p,conv64_2:d,conv64_3:u,conv128_down:l,conv128_1:f,conv128_2:b,conv256_down:F,conv256_1:h,conv256_2:g,conv256_down_out:y,fc:v};return N(o,t),{params:E,paramMappings:t}}function Y(o,t){let e=Br(o,t.conv1);return e=Ue(e,t.conv2),e=n.add(e,o),e=n.relu(e),e}function re(o,t){let e=_e(o,t.conv1);e=Ue(e,t.conv2);let r=n.avgPool(o,2,2,"valid"),a=n.zeros(r.shape),s=r.shape[3]!==e.shape[3];if(r.shape[1]!==e.shape[1]||r.shape[2]!==e.shape[2]){let c=[...e.shape];c[1]=1;let m=n.zeros(c);e=n.concat([e,m],1);let p=[...e.shape];p[2]=1;let d=n.zeros(p);e=n.concat([e,d],2)}return r=s?n.concat([r,a],3):r,e=n.add(r,e),e=n.relu(e),e}var oe=class extends C{constructor(){super("FaceRecognitionNet")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("FaceRecognitionNet - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(150,!0),"float32"),s=X(r,[122.782,117.001,104.298]).div(255),i=_e(s,e.conv32_down);i=n.maxPool(i,3,2,"valid"),i=Y(i,e.conv32_1),i=Y(i,e.conv32_2),i=Y(i,e.conv32_3),i=re(i,e.conv64_down),i=Y(i,e.conv64_1),i=Y(i,e.conv64_2),i=Y(i,e.conv64_3),i=re(i,e.conv128_down),i=Y(i,e.conv128_1),i=Y(i,e.conv128_2),i=re(i,e.conv256_down),i=Y(i,e.conv256_1),i=Y(i,e.conv256_2),i=re(i,e.conv256_down_out);let c=i.mean([1,2]);return n.matMul(c,e.fc)})}async forward(t){return this.forwardInput(await P(t))}async computeFaceDescriptor(t){var s;if((s=t==null?void 0:t.shape)==null?void 0:s.some(i=>i<=0))return new Float32Array(128);let e=await P(t),r=n.tidy(()=>n.unstack(this.forwardInput(e))),a=await Promise.all(r.map(i=>i.data()));return r.forEach(i=>i.dispose()),e.isBatchInput?a:a[0]}getDefaultModelName(){return"face_recognition_model"}extractParamsFromWeightMap(t){return $r(t)}extractParams(t){return Rr(t)}};function Md(o){let t=new oe;return t.extractWeights(o),t}function Xe(o,t){return{...o,...{descriptor:t}}}function Id(o){return typeof o.age=="number"}function Je(o,t){return{...o,...{age:t}}}function Ad(o){return(o.gender===ct.MALE||o.gender===ct.FEMALE)&&Pt(o.genderProbability)}function qe(o,t,e){return{...o,...{gender:t,genderProbability:e}}}function Co(o,t){function e(m,p){let d=n.tensor4d(o(3*3*m),[3,3,m,1]),u=n.tensor1d(o(m)),l=n.tensor1d(o(m)),f=n.tensor1d(o(m)),b=n.tensor1d(o(m));return t.push({paramPath:`${p}/filters`},{paramPath:`${p}/batch_norm_scale`},{paramPath:`${p}/batch_norm_offset`},{paramPath:`${p}/batch_norm_mean`},{paramPath:`${p}/batch_norm_variance`}),{filters:d,batch_norm_scale:u,batch_norm_offset:l,batch_norm_mean:f,batch_norm_variance:b}}function r(m,p,d,u,l){let f=n.tensor4d(o(m*p*d*d),[d,d,m,p]),b=n.tensor1d(o(p));return t.push({paramPath:`${u}/filters`},{paramPath:`${u}/${l?"batch_norm_offset":"bias"}`}),{filters:f,bias:b}}function a(m,p,d,u){let{filters:l,bias:f}=r(m,p,d,u,!0);return{filters:l,batch_norm_offset:f}}function s(m,p,d){let u=e(m,`${d}/depthwise_conv`),l=a(m,p,1,`${d}/pointwise_conv`);return{depthwise_conv:u,pointwise_conv:l}}function i(){let m=a(3,32,3,"mobilenetv1/conv_0"),p=s(32,64,"mobilenetv1/conv_1"),d=s(64,128,"mobilenetv1/conv_2"),u=s(128,128,"mobilenetv1/conv_3"),l=s(128,256,"mobilenetv1/conv_4"),f=s(256,256,"mobilenetv1/conv_5"),b=s(256,512,"mobilenetv1/conv_6"),F=s(512,512,"mobilenetv1/conv_7"),h=s(512,512,"mobilenetv1/conv_8"),g=s(512,512,"mobilenetv1/conv_9"),y=s(512,512,"mobilenetv1/conv_10"),v=s(512,512,"mobilenetv1/conv_11"),E=s(512,1024,"mobilenetv1/conv_12"),W=s(1024,1024,"mobilenetv1/conv_13");return{conv_0:m,conv_1:p,conv_2:d,conv_3:u,conv_4:l,conv_5:f,conv_6:b,conv_7:F,conv_8:h,conv_9:g,conv_10:y,conv_11:v,conv_12:E,conv_13:W}}function c(){let m=a(1024,256,1,"prediction_layer/conv_0"),p=a(256,512,3,"prediction_layer/conv_1"),d=a(512,128,1,"prediction_layer/conv_2"),u=a(128,256,3,"prediction_layer/conv_3"),l=a(256,128,1,"prediction_layer/conv_4"),f=a(128,256,3,"prediction_layer/conv_5"),b=a(256,64,1,"prediction_layer/conv_6"),F=a(64,128,3,"prediction_layer/conv_7"),h=r(512,12,1,"prediction_layer/box_predictor_0/box_encoding_predictor"),g=r(512,9,1,"prediction_layer/box_predictor_0/class_predictor"),y=r(1024,24,1,"prediction_layer/box_predictor_1/box_encoding_predictor"),v=r(1024,18,1,"prediction_layer/box_predictor_1/class_predictor"),E=r(512,24,1,"prediction_layer/box_predictor_2/box_encoding_predictor"),W=r(512,18,1,"prediction_layer/box_predictor_2/class_predictor"),j=r(256,24,1,"prediction_layer/box_predictor_3/box_encoding_predictor"),V=r(256,18,1,"prediction_layer/box_predictor_3/class_predictor"),R=r(256,24,1,"prediction_layer/box_predictor_4/box_encoding_predictor"),rt=r(256,18,1,"prediction_layer/box_predictor_4/class_predictor"),ot=r(128,24,1,"prediction_layer/box_predictor_5/box_encoding_predictor"),nt=r(128,18,1,"prediction_layer/box_predictor_5/class_predictor");return{conv_0:m,conv_1:p,conv_2:d,conv_3:u,conv_4:l,conv_5:f,conv_6:b,conv_7:F,box_predictor_0:{box_encoding_predictor:h,class_predictor:g},box_predictor_1:{box_encoding_predictor:y,class_predictor:v},box_predictor_2:{box_encoding_predictor:E,class_predictor:W},box_predictor_3:{box_encoding_predictor:j,class_predictor:V},box_predictor_4:{box_encoding_predictor:R,class_predictor:rt},box_predictor_5:{box_encoding_predictor:ot,class_predictor:nt}}}return{extractMobilenetV1Params:i,extractPredictionLayerParams:c}}function Or(o){let t=[],{extractWeights:e,getRemainingWeights:r}=I(o),{extractMobilenetV1Params:a,extractPredictionLayerParams:s}=Co(e,t),i=a(),c=s(),p={extra_dim:n.tensor3d(e(5118*4),[1,5118,4])};if(t.push({paramPath:"output_layer/extra_dim"}),r().length!==0)throw new Error(`weights remaing after extract: ${r().length}`);return{params:{mobilenetv1:i,prediction_layer:c,output_layer:p},paramMappings:t}}function No(o,t){let e=A(o,t);function r(p,d,u){let l=e(`${p}/Conv2d_${d}_pointwise/weights`,4,`${u}/filters`),f=e(`${p}/Conv2d_${d}_pointwise/convolution_bn_offset`,1,`${u}/batch_norm_offset`);return{filters:l,batch_norm_offset:f}}function a(p){let d=`mobilenetv1/conv_${p}`,u=`MobilenetV1/Conv2d_${p}_depthwise`,l=`${d}/depthwise_conv`,f=`${d}/pointwise_conv`,b=e(`${u}/depthwise_weights`,4,`${l}/filters`),F=e(`${u}/BatchNorm/gamma`,1,`${l}/batch_norm_scale`),h=e(`${u}/BatchNorm/beta`,1,`${l}/batch_norm_offset`),g=e(`${u}/BatchNorm/moving_mean`,1,`${l}/batch_norm_mean`),y=e(`${u}/BatchNorm/moving_variance`,1,`${l}/batch_norm_variance`);return{depthwise_conv:{filters:b,batch_norm_scale:F,batch_norm_offset:h,batch_norm_mean:g,batch_norm_variance:y},pointwise_conv:r("MobilenetV1",p,f)}}function s(){return{conv_0:r("MobilenetV1",0,"mobilenetv1/conv_0"),conv_1:a(1),conv_2:a(2),conv_3:a(3),conv_4:a(4),conv_5:a(5),conv_6:a(6),conv_7:a(7),conv_8:a(8),conv_9:a(9),conv_10:a(10),conv_11:a(11),conv_12:a(12),conv_13:a(13)}}function i(p,d){let u=e(`${p}/weights`,4,`${d}/filters`),l=e(`${p}/biases`,1,`${d}/bias`);return{filters:u,bias:l}}function c(p){let d=i(`Prediction/BoxPredictor_${p}/BoxEncodingPredictor`,`prediction_layer/box_predictor_${p}/box_encoding_predictor`),u=i(`Prediction/BoxPredictor_${p}/ClassPredictor`,`prediction_layer/box_predictor_${p}/class_predictor`);return{box_encoding_predictor:d,class_predictor:u}}function m(){return{conv_0:r("Prediction",0,"prediction_layer/conv_0"),conv_1:r("Prediction",1,"prediction_layer/conv_1"),conv_2:r("Prediction",2,"prediction_layer/conv_2"),conv_3:r("Prediction",3,"prediction_layer/conv_3"),conv_4:r("Prediction",4,"prediction_layer/conv_4"),conv_5:r("Prediction",5,"prediction_layer/conv_5"),conv_6:r("Prediction",6,"prediction_layer/conv_6"),conv_7:r("Prediction",7,"prediction_layer/conv_7"),box_predictor_0:c(0),box_predictor_1:c(1),box_predictor_2:c(2),box_predictor_3:c(3),box_predictor_4:c(4),box_predictor_5:c(5)}}return{extractMobilenetV1Params:s,extractPredictionLayerParams:m}}function jr(o){let t=[],{extractMobilenetV1Params:e,extractPredictionLayerParams:r}=No(o,t),a=o["Output/extra_dim"];if(t.push({originalPath:"Output/extra_dim",paramPath:"output_layer/extra_dim"}),!Z(a))throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${a}`);let s={mobilenetv1:e(),prediction_layer:r(),output_layer:{extra_dim:a}};return N(o,t),{params:s,paramMappings:t}}function O(o,t,e){return n.tidy(()=>{let r=n.conv2d(o,t.filters,e,"same");return r=n.add(r,t.batch_norm_offset),n.clipByValue(r,0,6)})}var Io=.0010000000474974513;function Lo(o,t,e){return n.tidy(()=>{let r=n.depthwiseConv2d(o,t.filters,e,"same");return r=n.batchNorm(r,t.batch_norm_mean,t.batch_norm_variance,t.batch_norm_offset,t.batch_norm_scale,Io),n.clipByValue(r,0,6)})}function ko(o){return[2,4,6,12].some(t=>t===o)?[2,2]:[1,1]}function Hr(o,t){return n.tidy(()=>{let e,r=O(o,t.conv_0,[2,2]);if([t.conv_1,t.conv_2,t.conv_3,t.conv_4,t.conv_5,t.conv_6,t.conv_7,t.conv_8,t.conv_9,t.conv_10,t.conv_11,t.conv_12,t.conv_13].forEach((s,i)=>{let c=i+1,m=ko(c);r=Lo(r,s.depthwise_conv,m),r=O(r,s.pointwise_conv,[1,1]),c===11&&(e=r)}),e===null)throw new Error("mobileNetV1 - output of conv layer 11 is null");return{out:r,conv11:e}})}function So(o,t,e){let r=o.arraySync(),a=Math.min(r[t][0],r[t][2]),s=Math.min(r[t][1],r[t][3]),i=Math.max(r[t][0],r[t][2]),c=Math.max(r[t][1],r[t][3]),m=Math.min(r[e][0],r[e][2]),p=Math.min(r[e][1],r[e][3]),d=Math.max(r[e][0],r[e][2]),u=Math.max(r[e][1],r[e][3]),l=(i-a)*(c-s),f=(d-m)*(u-p);if(l<=0||f<=0)return 0;let b=Math.max(a,m),F=Math.max(s,p),h=Math.min(i,d),g=Math.min(c,u),y=Math.max(h-b,0)*Math.max(g-F,0);return y/(l+f-y)}function Yr(o,t,e,r,a){let s=o.shape[0],i=Math.min(e,s),c=t.map((d,u)=>({score:d,boxIndex:u})).filter(d=>d.score>a).sort((d,u)=>u.score-d.score),m=d=>d<=r?1:0,p=[];return c.forEach(d=>{if(p.length>=i)return;let u=d.score;for(let l=p.length-1;l>=0;--l){let f=So(o,d.boxIndex,p[l]);if(f!==0&&(d.score*=m(f),d.score<=a))break}u===d.score&&p.push(d.boxIndex)}),p}function Ao(o){let t=n.unstack(n.transpose(o,[1,0])),e=[n.sub(t[2],t[0]),n.sub(t[3],t[1])],r=[n.add(t[0],n.div(e[0],2)),n.add(t[1],n.div(e[1],2))];return{sizes:e,centers:r}}function Wo(o,t){let{sizes:e,centers:r}=Ao(o),a=n.unstack(n.transpose(t,[1,0])),s=n.div(n.mul(n.exp(n.div(a[2],5)),e[0]),2),i=n.add(n.mul(n.div(a[0],10),e[0]),r[0]),c=n.div(n.mul(n.exp(n.div(a[3],5)),e[1]),2),m=n.add(n.mul(n.div(a[1],10),e[1]),r[1]);return n.transpose(n.stack([n.sub(i,s),n.sub(m,c),n.add(i,s),n.add(m,c)]),[1,0])}function Gr(o,t,e){return n.tidy(()=>{let r=o.shape[0],a=Wo(n.reshape(n.tile(e.extra_dim,[r,1,1]),[-1,4]),n.reshape(o,[-1,4]));a=n.reshape(a,[r,a.shape[0]/r,4]);let s=n.sigmoid(n.slice(t,[0,0,1],[-1,-1,-1])),i=n.slice(s,[0,0,0],[-1,-1,1]);i=n.reshape(i,[r,i.shape[1]]);let c=n.unstack(a),m=n.unstack(i);return{boxes:c,scores:m}})}function ht(o,t){return n.tidy(()=>{let e=o.shape[0],r=n.reshape(lt(o,t.box_encoding_predictor),[e,-1,1,4]),a=n.reshape(lt(o,t.class_predictor),[e,-1,3]);return{boxPredictionEncoding:r,classPrediction:a}})}function zr(o,t,e){return n.tidy(()=>{let r=O(o,e.conv_0,[1,1]),a=O(r,e.conv_1,[2,2]),s=O(a,e.conv_2,[1,1]),i=O(s,e.conv_3,[2,2]),c=O(i,e.conv_4,[1,1]),m=O(c,e.conv_5,[2,2]),p=O(m,e.conv_6,[1,1]),d=O(p,e.conv_7,[2,2]),u=ht(t,e.box_predictor_0),l=ht(o,e.box_predictor_1),f=ht(a,e.box_predictor_2),b=ht(i,e.box_predictor_3),F=ht(m,e.box_predictor_4),h=ht(d,e.box_predictor_5),g=n.concat([u.boxPredictionEncoding,l.boxPredictionEncoding,f.boxPredictionEncoding,b.boxPredictionEncoding,F.boxPredictionEncoding,h.boxPredictionEncoding],1),y=n.concat([u.classPrediction,l.classPrediction,f.classPrediction,b.classPrediction,F.classPrediction,h.classPrediction],1);return{boxPredictions:g,classPredictions:y}})}var G=class{constructor({minConfidence:t,maxResults:e}={}){this._name="SsdMobilenetv1Options";if(this._minConfidence=t||.5,this._maxResults=e||100,typeof this._minConfidence!="number"||this._minConfidence<=0||this._minConfidence>=1)throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);if(typeof this._maxResults!="number")throw new Error(`${this._name} - expected maxResults to be a number`)}get minConfidence(){return this._minConfidence}get maxResults(){return this._maxResults}};var At=class extends C{constructor(){super("SsdMobilenetv1")}forwardInput(t){let{params:e}=this;if(!e)throw new Error("SsdMobilenetv1 - load model before inference");return n.tidy(()=>{let r=n.cast(t.toBatchTensor(512,!1),"float32"),a=n.sub(n.div(r,127.5),1),s=Hr(a,e.mobilenetv1),{boxPredictions:i,classPredictions:c}=zr(s.out,s.conv11,e.prediction_layer);return Gr(i,c,e.output_layer)})}async forward(t){return this.forwardInput(await P(t))}async locateFaces(t,e={}){let{maxResults:r,minConfidence:a}=new G(e),s=await P(t),{boxes:i,scores:c}=this.forwardInput(s),m=i[0],p=c[0];for(let v=1;v{let[E,W]=[Math.max(0,g[v][0]),Math.min(1,g[v][2])].map(R=>R*h),[j,V]=[Math.max(0,g[v][1]),Math.min(1,g[v][3])].map(R=>R*F);return new D(d[v],new Gt(j,E,V-j,W-E),{height:s.getInputHeight(0),width:s.getInputWidth(0)})});return m.dispose(),p.dispose(),y}getDefaultModelName(){return"ssd_mobilenetv1_model"}extractParamsFromWeightMap(t){return jr(t)}extractParams(t){return Or(t)}};function Bo(o){let t=new At;return t.extractWeights(o),t}function Cu(o){return Bo(o)}var Ro=class extends At{};var Vr=.4,Ur=[new x(.738768,.874946),new x(2.42204,2.65704),new x(4.30971,7.04493),new x(10.246,4.59428),new x(12.6868,11.8741)],Xr=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],Jr=[117.001,114.697,97.404],qr="tiny_yolov2_model",Zr="tiny_yolov2_separable_conv_model";var we=o=>typeof o=="number";function Kr(o){if(!o)throw new Error(`invalid config: ${o}`);if(typeof o.withSeparableConvs!="boolean")throw new Error(`config.withSeparableConvs has to be a boolean, have: ${o.withSeparableConvs}`);if(!we(o.iouThreshold)||o.iouThreshold<0||o.iouThreshold>1)throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${o.iouThreshold}`);if(!Array.isArray(o.classes)||!o.classes.length||!o.classes.every(t=>typeof t=="string"))throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(o.classes)}`);if(!Array.isArray(o.anchors)||!o.anchors.length||!o.anchors.map(t=>t||{}).every(t=>we(t.x)&&we(t.y)))throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(o.anchors)}`);if(o.meanRgb&&(!Array.isArray(o.meanRgb)||o.meanRgb.length!==3||!o.meanRgb.every(we)))throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(o.meanRgb)}`)}function Wt(o){return n.tidy(()=>{let t=n.mul(o,n.scalar(.10000000149011612));return n.add(n.relu(n.sub(o,t)),t)})}function Q(o,t){return n.tidy(()=>{let e=n.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=n.conv2d(e,t.conv.filters,[1,1],"valid"),e=n.sub(e,t.bn.sub),e=n.mul(e,t.bn.truediv),e=n.add(e,t.conv.bias),Wt(e)})}function tt(o,t){return n.tidy(()=>{let e=n.pad(o,[[0,0],[1,1],[1,1],[0,0]]);return e=n.separableConv2d(e,t.depthwise_filter,t.pointwise_filter,[1,1],"valid"),e=n.add(e,t.bias),Wt(e)})}function $o(o,t){let e=It(o,t);function r(i,c){let m=n.tensor1d(o(i)),p=n.tensor1d(o(i));return t.push({paramPath:`${c}/sub`},{paramPath:`${c}/truediv`}),{sub:m,truediv:p}}function a(i,c,m){let p=e(i,c,3,`${m}/conv`),d=r(c,`${m}/bn`);return{conv:p,bn:d}}let s=Lt(o,t);return{extractConvParams:e,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}}function Qr(o,t,e,r){let{extractWeights:a,getRemainingWeights:s}=I(o),i=[],{extractConvParams:c,extractConvWithBatchNormParams:m,extractSeparableConvParams:p}=$o(a,i),d;if(t.withSeparableConvs){let[u,l,f,b,F,h,g,y,v]=r,E=t.isFirstLayerConv2d?c(u,l,3,"conv0"):p(u,l,"conv0"),W=p(l,f,"conv1"),j=p(f,b,"conv2"),V=p(b,F,"conv3"),R=p(F,h,"conv4"),rt=p(h,g,"conv5"),ot=y?p(g,y,"conv6"):void 0,nt=v?p(y,v,"conv7"):void 0,_t=c(v||y||g,5*e,1,"conv8");d={conv0:E,conv1:W,conv2:j,conv3:V,conv4:R,conv5:rt,conv6:ot,conv7:nt,conv8:_t}}else{let[u,l,f,b,F,h,g,y,v]=r,E=m(u,l,"conv0"),W=m(l,f,"conv1"),j=m(f,b,"conv2"),V=m(b,F,"conv3"),R=m(F,h,"conv4"),rt=m(h,g,"conv5"),ot=m(g,y,"conv6"),nt=m(y,v,"conv7"),_t=c(v,5*e,1,"conv8");d={conv0:E,conv1:W,conv2:j,conv3:V,conv4:R,conv5:rt,conv6:ot,conv7:nt,conv8:_t}}if(s().length!==0)throw new Error(`weights remaing after extract: ${s().length}`);return{params:d,paramMappings:i}}function Oo(o,t){let e=A(o,t);function r(c){let m=e(`${c}/sub`,1),p=e(`${c}/truediv`,1);return{sub:m,truediv:p}}function a(c){let m=e(`${c}/filters`,4),p=e(`${c}/bias`,1);return{filters:m,bias:p}}function s(c){let m=a(`${c}/conv`),p=r(`${c}/bn`);return{conv:m,bn:p}}let i=kt(e);return{extractConvParams:a,extractConvWithBatchNormParams:s,extractSeparableConvParams:i}}function to(o,t){let e=[],{extractConvParams:r,extractConvWithBatchNormParams:a,extractSeparableConvParams:s}=Oo(o,e),i;if(t.withSeparableConvs){let c=t.filterSizes&&t.filterSizes.length||9;i={conv0:t.isFirstLayerConv2d?r("conv0"):s("conv0"),conv1:s("conv1"),conv2:s("conv2"),conv3:s("conv3"),conv4:s("conv4"),conv5:s("conv5"),conv6:c>7?s("conv6"):void 0,conv7:c>8?s("conv7"):void 0,conv8:r("conv8")}}else i={conv0:a("conv0"),conv1:a("conv1"),conv2:a("conv2"),conv3:a("conv3"),conv4:a("conv4"),conv5:a("conv5"),conv6:a("conv6"),conv7:a("conv7"),conv8:r("conv8")};return N(o,e),{params:i,paramMappings:e}}var et=class{constructor({inputSize:t,scoreThreshold:e}={}){this._name="TinyYolov2Options";if(this._inputSize=t||416,this._scoreThreshold=e||.5,typeof this._inputSize!="number"||this._inputSize%32!=0)throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);if(typeof this._scoreThreshold!="number"||this._scoreThreshold<=0||this._scoreThreshold>=1)throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`)}get inputSize(){return this._inputSize}get scoreThreshold(){return this._scoreThreshold}};var Ze=class extends C{constructor(t){super("TinyYolov2");Kr(t),this._config=t}get config(){return this._config}get withClassScores(){return this.config.withClassScores||this.config.classes.length>1}get boxEncodingSize(){return 5+(this.withClassScores?this.config.classes.length:0)}runTinyYolov2(t,e){let r=Q(t,e.conv0);return r=n.maxPool(r,[2,2],[2,2],"same"),r=Q(r,e.conv1),r=n.maxPool(r,[2,2],[2,2],"same"),r=Q(r,e.conv2),r=n.maxPool(r,[2,2],[2,2],"same"),r=Q(r,e.conv3),r=n.maxPool(r,[2,2],[2,2],"same"),r=Q(r,e.conv4),r=n.maxPool(r,[2,2],[2,2],"same"),r=Q(r,e.conv5),r=n.maxPool(r,[2,2],[1,1],"same"),r=Q(r,e.conv6),r=Q(r,e.conv7),lt(r,e.conv8,"valid",!1)}runMobilenet(t,e){let r=this.config.isFirstLayerConv2d?Wt(lt(t,e.conv0,"valid",!1)):tt(t,e.conv0);return r=n.maxPool(r,[2,2],[2,2],"same"),r=tt(r,e.conv1),r=n.maxPool(r,[2,2],[2,2],"same"),r=tt(r,e.conv2),r=n.maxPool(r,[2,2],[2,2],"same"),r=tt(r,e.conv3),r=n.maxPool(r,[2,2],[2,2],"same"),r=tt(r,e.conv4),r=n.maxPool(r,[2,2],[2,2],"same"),r=tt(r,e.conv5),r=n.maxPool(r,[2,2],[1,1],"same"),r=e.conv6?tt(r,e.conv6):r,r=e.conv7?tt(r,e.conv7):r,lt(r,e.conv8,"valid",!1)}forwardInput(t,e){let{params:r}=this;if(!r)throw new Error("TinyYolov2 - load model before inference");return n.tidy(()=>{let a=n.cast(t.toBatchTensor(e,!1),"float32");return a=this.config.meanRgb?X(a,this.config.meanRgb):a,a=a.div(255),this.config.withSeparableConvs?this.runMobilenet(a,r):this.runTinyYolov2(a,r)})}async forward(t,e){return this.forwardInput(await P(t),e)}async detect(t,e={}){let{inputSize:r,scoreThreshold:a}=new et(e),s=await P(t),i=await this.forwardInput(s,r),c=n.tidy(()=>n.unstack(i)[0].expandDims()),m={width:s.getInputWidth(0),height:s.getInputHeight(0)},p=await this.extractBoxes(c,s.getReshapedInputDimensions(0),a);i.dispose(),c.dispose();let d=p.map(h=>h.box),u=p.map(h=>h.score),l=p.map(h=>h.classScore),f=p.map(h=>this.config.classes[h.label]);return fr(d.map(h=>h.rescale(r)),u,this.config.iouThreshold,!0).map(h=>new ut(u[h],l[h],f[h],d[h],m))}getDefaultModelName(){return""}extractParamsFromWeightMap(t){return to(t,this.config)}extractParams(t){let e=this.config.filterSizes||Ze.DEFAULT_FILTER_SIZES,r=e?e.length:void 0;if(r!==7&&r!==8&&r!==9)throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${r} filterSizes in config`);return Qr(t,this.config,this.boxEncodingSize,e)}async extractBoxes(t,e,r){let{width:a,height:s}=e,i=Math.max(a,s),c=i/a,m=i/s,p=t.shape[1],d=this.config.anchors.length,[u,l,f]=n.tidy(()=>{let g=t.reshape([p,p,d,this.boxEncodingSize]),y=g.slice([0,0,0,0],[p,p,d,4]),v=g.slice([0,0,0,4],[p,p,d,1]),E=this.withClassScores?n.softmax(g.slice([0,0,0,5],[p,p,d,this.config.classes.length]),3):n.scalar(0);return[y,v,E]}),b=[],F=await l.array(),h=await u.array();for(let g=0;gr){let W=(y+ce(h[g][y][v][0]))/p*c,j=(g+ce(h[g][y][v][1]))/p*m,V=Math.exp(h[g][y][v][2])*this.config.anchors[v].x/p*c,R=Math.exp(h[g][y][v][3])*this.config.anchors[v].y/p*m,rt=W-V/2,ot=j-R/2,nt={row:g,col:y,anchor:v},{classScore:_t,label:mr}=this.withClassScores?await this.extractPredictedClass(f,nt):{classScore:1,label:0};b.push({box:new Yt(rt,ot,rt+V,ot+R),score:E,classScore:E*_t,label:mr,...nt})}}return u.dispose(),l.dispose(),f.dispose(),b}async extractPredictedClass(t,e){let{row:r,col:a,anchor:s}=e,i=await t.array();return Array(this.config.classes.length).fill(0).map((c,m)=>i[r][a][s][m]).map((c,m)=>({classScore:c,label:m})).reduce((c,m)=>c.classScore>m.classScore?c:m)}},Bt=Ze;Bt.DEFAULT_FILTER_SIZES=[3,16,32,64,128,256,512,1024,1024];var ne=class extends Bt{constructor(t=!0){let e={withSeparableConvs:t,iouThreshold:Vr,classes:["face"],...t?{anchors:Xr,meanRgb:Jr}:{anchors:Ur,withClassScores:!0}};super(e)}get withSeparableConvs(){return this.config.withSeparableConvs}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(a=>new D(a.score,a.relativeBox,{width:a.imageWidth,height:a.imageHeight}))}getDefaultModelName(){return this.withSeparableConvs?Zr:qr}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};function Dl(o,t=!0){let e=new ne(t);return e.extractWeights(o),e}var Ke=class extends et{constructor(){super(...arguments);this._name="TinyFaceDetectorOptions"}};var z=class{async then(t){return t(await this.run())}async run(){throw new Error("ComposableTask - run is not implemented")}};async function xt(o,t,e,r,a=({alignedRect:s})=>s){let s=o.map(m=>St(m)?a(m):m.detection),i=r||(t instanceof n.Tensor?await Xt(t,s):await Ut(t,s)),c=await e(i);return i.forEach(m=>m instanceof n.Tensor&&m.dispose()),c}async function Rt(o,t,e,r,a){return xt([o],t,async s=>e(s[0]),r,a)}var eo=.4,ro=[new x(1.603231,2.094468),new x(6.041143,7.080126),new x(2.882459,3.518061),new x(4.266906,5.178857),new x(9.041765,10.66308)],oo=[117.001,114.697,97.404];var ae=class extends Bt{constructor(){let t={withSeparableConvs:!0,iouThreshold:eo,classes:["face"],anchors:ro,meanRgb:oo,isFirstLayerConv2d:!0,filterSizes:[3,16,32,64,128,256,512]};super(t)}get anchors(){return this.config.anchors}async locateFaces(t,e){return(await this.detect(t,e)).map(a=>new D(a.score,a.relativeBox,{width:a.imageWidth,height:a.imageHeight}))}getDefaultModelName(){return"tiny_face_detector_model"}extractParamsFromWeightMap(t){return super.extractParamsFromWeightMap(t)}};var T={ssdMobilenetv1:new At,tinyFaceDetector:new ae,tinyYolov2:new ne,faceLandmark68Net:new ee,faceLandmark68TinyNet:new ze,faceRecognitionNet:new oe,faceExpressionNet:new Be,ageGenderNet:new Ye},jo=(o,t)=>T.ssdMobilenetv1.locateFaces(o,t),tf=(o,t)=>T.tinyFaceDetector.locateFaces(o,t),ef=(o,t)=>T.tinyYolov2.locateFaces(o,t),Ho=o=>T.faceLandmark68Net.detectLandmarks(o),rf=o=>T.faceLandmark68TinyNet.detectLandmarks(o),of=o=>T.faceRecognitionNet.computeFaceDescriptor(o),nf=o=>T.faceExpressionNet.predictExpressions(o),af=o=>T.ageGenderNet.predictAgeAndGender(o),Yo=o=>T.ssdMobilenetv1.load(o),sf=o=>T.tinyFaceDetector.load(o),cf=o=>T.tinyYolov2.load(o),mf=o=>T.faceLandmark68Net.load(o),pf=o=>T.faceLandmark68TinyNet.load(o),df=o=>T.faceRecognitionNet.load(o),uf=o=>T.faceExpressionNet.load(o),lf=o=>T.ageGenderNet.load(o),ff=Yo,hf=jo,xf=Ho;var Qe=class extends z{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},jt=class extends Qe{async run(){let t=await this.parentTask,e=await xt(t,this.input,async r=>Promise.all(r.map(a=>T.faceExpressionNet.predictExpressions(a))),this.extractedFaces);return t.map((r,a)=>Re(r,e[a]))}withAgeAndGender(){return new $t(this,this.input)}},Ht=class extends Qe{async run(){let t=await this.parentTask;if(!t)return;let e=await Rt(t,this.input,r=>T.faceExpressionNet.predictExpressions(r),this.extractedFaces);return Re(t,e)}withAgeAndGender(){return new Ot(this,this.input)}},Ft=class extends jt{withAgeAndGender(){return new vt(this,this.input)}withFaceDescriptors(){return new bt(this,this.input)}},Tt=class extends Ht{withAgeAndGender(){return new yt(this,this.input)}withFaceDescriptor(){return new gt(this,this.input)}};var tr=class extends z{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.extractedFaces=r}},$t=class extends tr{async run(){let t=await this.parentTask,e=await xt(t,this.input,async r=>Promise.all(r.map(a=>T.ageGenderNet.predictAgeAndGender(a))),this.extractedFaces);return t.map((r,a)=>{let{age:s,gender:i,genderProbability:c}=e[a];return Je(qe(r,i,c),s)})}withFaceExpressions(){return new jt(this,this.input)}},Ot=class extends tr{async run(){let t=await this.parentTask;if(!t)return;let{age:e,gender:r,genderProbability:a}=await Rt(t,this.input,s=>T.ageGenderNet.predictAgeAndGender(s),this.extractedFaces);return Je(qe(t,r,a),e)}withFaceExpressions(){return new Ht(this,this.input)}},vt=class extends $t{withFaceExpressions(){return new Ft(this,this.input)}withFaceDescriptors(){return new bt(this,this.input)}},yt=class extends Ot{withFaceExpressions(){return new Tt(this,this.input)}withFaceDescriptor(){return new gt(this,this.input)}};var er=class extends z{constructor(t,e){super();this.parentTask=t;this.input=e}},bt=class extends er{async run(){let t=await this.parentTask;return(await xt(t,this.input,r=>Promise.all(r.map(a=>T.faceRecognitionNet.computeFaceDescriptor(a))),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}))).map((r,a)=>Xe(t[a],r))}withFaceExpressions(){return new Ft(this,this.input)}withAgeAndGender(){return new vt(this,this.input)}},gt=class extends er{async run(){let t=await this.parentTask;if(!t)return;let e=await Rt(t,this.input,r=>T.faceRecognitionNet.computeFaceDescriptor(r),null,r=>r.landmarks.align(null,{useDlibAlignment:!0}));return Xe(t,e)}withFaceExpressions(){return new Tt(this,this.input)}withAgeAndGender(){return new yt(this,this.input)}};var rr=class extends z{constructor(t,e,r){super();this.parentTask=t;this.input=e;this.useTinyLandmarkNet=r}get landmarkNet(){return this.useTinyLandmarkNet?T.faceLandmark68TinyNet:T.faceLandmark68Net}},or=class extends rr{async run(){let t=await this.parentTask,e=t.map(s=>s.detection),r=this.input instanceof n.Tensor?await Xt(this.input,e):await Ut(this.input,e),a=await Promise.all(r.map(s=>this.landmarkNet.detectLandmarks(s)));return r.forEach(s=>s instanceof n.Tensor&&s.dispose()),t.map((s,i)=>Qt(s,a[i]))}withFaceExpressions(){return new Ft(this,this.input)}withAgeAndGender(){return new vt(this,this.input)}withFaceDescriptors(){return new bt(this,this.input)}},nr=class extends rr{async run(){let t=await this.parentTask;if(!t)return;let{detection:e}=t,r=this.input instanceof n.Tensor?await Xt(this.input,[e]):await Ut(this.input,[e]),a=await this.landmarkNet.detectLandmarks(r[0]);return r.forEach(s=>s instanceof n.Tensor&&s.dispose()),Qt(t,a)}withFaceExpressions(){return new Tt(this,this.input)}withAgeAndGender(){return new yt(this,this.input)}withFaceDescriptor(){return new gt(this,this.input)}};var ar=class extends z{constructor(t,e=new G){super();this.input=t;this.options=e}},Pe=class extends ar{async run(){let{input:t,options:e}=this,r;if(e instanceof Ke)r=T.tinyFaceDetector.locateFaces(t,e);else if(e instanceof G)r=T.ssdMobilenetv1.locateFaces(t,e);else if(e instanceof et)r=T.tinyYolov2.locateFaces(t,e);else throw new Error("detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options");return r}runAndExtendWithFaceDetections(){return new Promise(async t=>{let e=await this.run();t(e.map(r=>Dt({},r)))})}withFaceLandmarks(t=!1){return new or(this.runAndExtendWithFaceDetections(),this.input,t)}withFaceExpressions(){return new jt(this.runAndExtendWithFaceDetections(),this.input)}withAgeAndGender(){return new $t(this.runAndExtendWithFaceDetections(),this.input)}},sr=class extends ar{async run(){let t=await new Pe(this.input,this.options),e=t[0];return t.forEach(r=>{r.score>e.score&&(e=r)}),e}runAndExtendWithFaceDetection(){return new Promise(async t=>{let e=await this.run();t(e?Dt({},e):void 0)})}withFaceLandmarks(t=!1){return new nr(this.runAndExtendWithFaceDetection(),this.input,t)}withFaceExpressions(){return new Ht(this.runAndExtendWithFaceDetection(),this.input)}withAgeAndGender(){return new Ot(this.runAndExtendWithFaceDetection(),this.input)}};function fh(o,t=new G){return new sr(o,t)}function ir(o,t=new G){return new Pe(o,t)}async function Go(o,t){return ir(o,new G(t?{minConfidence:t}:{})).withFaceLandmarks().withFaceDescriptors()}async function yh(o,t={}){return ir(o,new et(t)).withFaceLandmarks().withFaceDescriptors()}var Fh=Go;function no(o,t){if(o.length!==t.length)throw new Error("euclideanDistance: arr1.length !== arr2.length");let e=Array.from(o),r=Array.from(t);return Math.sqrt(e.map((a,s)=>a-r[s]).reduce((a,s)=>a+s**2,0))}var cr=class{constructor(t,e=.6){this._distanceThreshold=e;let r=Array.isArray(t)?t:[t];if(!r.length)throw new Error("FaceRecognizer.constructor - expected atleast one input");let a=1,s=()=>`person ${a++}`;this._labeledDescriptors=r.map(i=>{if(i instanceof at)return i;if(i instanceof Float32Array)return new at(s(),[i]);if(i.descriptor&&i.descriptor instanceof Float32Array)return new at(s(),[i.descriptor]);throw new Error("FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>")})}get labeledDescriptors(){return this._labeledDescriptors}get distanceThreshold(){return this._distanceThreshold}computeMeanDistance(t,e){return e.map(r=>no(r,t)).reduce((r,a)=>r+a,0)/(e.length||1)}matchDescriptor(t){return this.labeledDescriptors.map(({descriptors:e,label:r})=>new me(r,this.computeMeanDistance(t,e))).reduce((e,r)=>e.distancet.toJSON())}}static fromJSON(t){let e=t.labeledDescriptors.map(r=>at.fromJSON(r));return new cr(e,t.distanceThreshold)}};function Ih(o){let t=new ae;return t.extractWeights(o),t}function zo(o,t){let{width:e,height:r}=new L(t.width,t.height);if(e<=0||r<=0)throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({width:e,height:r})}`);if(Array.isArray(o))return o.map(a=>zo(a,{width:e,height:r}));if(St(o)){let a=o.detection.forSize(e,r),s=o.unshiftedLandmarks.forSize(a.box.width,a.box.height);return Qt(Dt(o,a),s)}return K(o)?Dt(o,o.detection.forSize(e,r)):o instanceof $||o instanceof D?o.forSize(e,r):o}var Vo=typeof process!="undefined",Uo=typeof navigator!="undefined"&&typeof navigator.userAgent!="undefined",ox={faceapi:Mr,node:Vo,browser:Uo};export{Ye as AgeGenderNet,Yt as BoundingBox,w as Box,z as ComposableTask,bt as ComputeAllFaceDescriptorsTask,er as ComputeFaceDescriptorsTaskBase,gt as ComputeSingleFaceDescriptorTask,or as DetectAllFaceLandmarksTask,Pe as DetectAllFacesTask,rr as DetectFaceLandmarksTaskBase,ar as DetectFacesTaskBase,nr as DetectSingleFaceLandmarksTask,sr as DetectSingleFaceTask,L as Dimensions,Dr as FACE_EXPRESSION_LABELS,D as FaceDetection,Ro as FaceDetectionNet,Be as FaceExpressionNet,ft as FaceExpressions,ee as FaceLandmark68Net,ze as FaceLandmark68TinyNet,Do as FaceLandmarkNet,$ as FaceLandmarks,fo as FaceLandmarks5,zt as FaceLandmarks68,me as FaceMatch,cr as FaceMatcher,oe as FaceRecognitionNet,ct as Gender,pe as LabeledBox,at as LabeledFaceDescriptors,it as NetInput,C as NeuralNetwork,ut as ObjectDetection,x as Point,ho as PredictedBox,Gt as Rect,At as SsdMobilenetv1,G as SsdMobilenetv1Options,ae as TinyFaceDetector,Ke as TinyFaceDetectorOptions,ne as TinyYolov2,et as TinyYolov2Options,Fh as allFaces,Go as allFacesSsdMobilenetv1,yh as allFacesTinyYolov2,xr as awaitMediaLoaded,br as bufferToImage,of as computeFaceDescriptor,Ct as createCanvas,fe as createCanvasFromMedia,Cu as createFaceDetectionNet,Md as createFaceRecognitionNet,Bo as createSsdMobilenetv1,Ih as createTinyFaceDetector,Dl as createTinyYolov2,ir as detectAllFaces,Ho as detectFaceLandmarks,rf as detectFaceLandmarksTiny,xf as detectLandmarks,fh as detectSingleFace,To as draw,_ as env,no as euclideanDistance,Je as extendWithAge,Xe as extendWithFaceDescriptor,Dt as extendWithFaceDetection,Re as extendWithFaceExpressions,Qt as extendWithFaceLandmarks,qe as extendWithGender,Xt as extractFaceTensors,Ut as extractFaces,si as fetchImage,yr as fetchJson,di as fetchNetWeights,Nt as fetchOrThrow,S as getContext2dOrThrow,Mt as getMediaDimensions,gr as imageTensorToCanvas,vr as imageToSquare,On as inverseSigmoid,ur as iou,We as isMediaElement,le as isMediaLoaded,Id as isWithAge,K as isWithFaceDetection,Er as isWithFaceExpressions,St as isWithFaceLandmarks,Ad as isWithGender,lf as loadAgeGenderModel,ff as loadFaceDetectionModel,uf as loadFaceExpressionModel,mf as loadFaceLandmarkModel,pf as loadFaceLandmarkTinyModel,df as loadFaceRecognitionModel,Yo as loadSsdMobilenetv1Model,sf as loadTinyFaceDetectorModel,cf as loadTinyYolov2Model,Fr as loadWeightMap,hf as locateFaces,vi as matchDimensions,lr as minBbox,T as nets,fr as nonMaxSuppression,X as normalize,hr as padToSquare,af as predictAgeAndGender,nf as recognizeFaceExpressions,zo as resizeResults,Et as resolveInput,Ln as shuffleArray,ce as sigmoid,jo as ssdMobilenetv1,n as tf,tf as tinyFaceDetector,ef as tinyYolov2,P as toNetInput,co as utils,Kr as validateConfig,ox as version}; //# sourceMappingURL=face-api.esm-nobundle.js.map diff --git a/dist/face-api.esm-nobundle.js.map b/dist/face-api.esm-nobundle.js.map index bb970b5..0eda986 100644 --- a/dist/face-api.esm-nobundle.js.map +++ b/dist/face-api.esm-nobundle.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../src/tfjs/tf-browser.ts", "../src/env/isNodejs.ts", "../src/index.ts", "../src/draw/index.ts", "../src/draw/drawContour.ts", "../src/utils/index.ts", "../src/classes/Dimensions.ts", "../src/classes/Point.ts", "../src/classes/Box.ts", "../src/classes/BoundingBox.ts", "../src/classes/ObjectDetection.ts", "../src/classes/FaceDetection.ts", "../src/ops/iou.ts", "../src/ops/minBbox.ts", "../src/ops/nonMaxSuppression.ts", "../src/ops/normalize.ts", "../src/ops/padToSquare.ts", "../src/ops/shuffleArray.ts", "../src/ops/index.ts", "../src/classes/Rect.ts", "../src/classes/FaceLandmarks.ts", "../src/classes/FaceLandmarks5.ts", "../src/classes/FaceLandmarks68.ts", "../src/classes/FaceMatch.ts", "../src/classes/LabeledBox.ts", "../src/classes/LabeledFaceDescriptors.ts", "../src/classes/PredictedBox.ts", "../src/factories/WithFaceDetection.ts", "../src/env/createBrowserEnv.ts", "../src/env/createFileSystem.ts", "../src/env/createNodejsEnv.ts", "../src/env/isBrowser.ts", "../src/env/index.ts", "../src/dom/resolveInput.ts", "../src/dom/getContext2dOrThrow.ts", "../src/draw/DrawTextField.ts", "../src/draw/DrawBox.ts", "../src/draw/drawDetections.ts", "../src/faceExpressionNet/FaceExpressionNet.ts", "../src/dom/isMediaLoaded.ts", "../src/dom/awaitMediaLoaded.ts", "../src/dom/bufferToImage.ts", "../src/dom/getMediaDimensions.ts", "../src/dom/createCanvas.ts", "../src/dom/imageTensorToCanvas.ts", "../src/dom/isMediaElement.ts", "../src/dom/NetInput.ts", "../src/dom/imageToSquare.ts", "../src/dom/toNetInput.ts", "../src/dom/extractFaces.ts", "../src/dom/extractFaceTensors.ts", "../src/dom/fetchOrThrow.ts", "../src/dom/fetchImage.ts", "../src/dom/fetchJson.ts", "../src/dom/fetchNetWeights.ts", "../src/dom/loadWeightMap.ts", "../src/common/getModelUris.ts", "../src/dom/matchDimensions.ts", "../src/faceFeatureExtractor/FaceFeatureExtractor.ts", "../src/NeuralNetwork.ts", "../src/faceFeatureExtractor/denseBlock.ts", "../src/common/depthwiseSeparableConv.ts", "../src/common/convLayer.ts", "../src/common/disposeUnusedWeightTensors.ts", "../src/common/extractConvParamsFactory.ts", "../src/common/extractFCParamsFactory.ts", "../src/common/extractSeparableConvParamsFactory.ts", "../src/common/types.ts", "../src/common/extractWeightEntryFactory.ts", "../src/common/extractWeightsFactory.ts", "../src/faceFeatureExtractor/extractorsFactory.ts", "../src/faceFeatureExtractor/extractParams.ts", "../src/common/loadConvParamsFactory.ts", "../src/faceFeatureExtractor/loadParamsFactory.ts", "../src/faceFeatureExtractor/extractParamsFromWeightMap.ts", "../src/faceProcessor/FaceProcessor.ts", "../src/common/fullyConnectedLayer.ts", "../src/faceProcessor/extractParams.ts", "../src/faceProcessor/extractParamsFromWeightMap.ts", "../src/faceProcessor/util.ts", "../src/faceExpressionNet/FaceExpressions.ts", "../src/factories/WithFaceExpressions.ts", "../src/draw/drawFaceExpressions.ts", "../src/factories/WithFaceLandmarks.ts", "../src/draw/DrawFaceLandmarks.ts", "../src/ageGenderNet/AgeGenderNet.ts", "../src/xception/TinyXception.ts", "../src/xception/extractParams.ts", "../src/xception/extractParamsFromWeightMap.ts", "../src/ageGenderNet/extractParams.ts", "../src/ageGenderNet/extractParamsFromWeightMap.ts", "../src/ageGenderNet/types.ts", "../src/faceLandmarkNet/FaceLandmark68NetBase.ts", "../src/faceLandmarkNet/FaceLandmark68Net.ts", "../src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts", "../src/faceFeatureExtractor/extractParamsFromWeightMapTiny.ts", "../src/faceFeatureExtractor/extractParamsTiny.ts", "../src/faceLandmarkNet/FaceLandmark68TinyNet.ts", "../src/faceLandmarkNet/index.ts", "../src/faceRecognitionNet/FaceRecognitionNet.ts", "../src/faceRecognitionNet/convLayer.ts", "../src/faceRecognitionNet/scaleLayer.ts", "../src/faceRecognitionNet/extractParams.ts", "../src/faceRecognitionNet/extractParamsFromWeightMap.ts", "../src/faceRecognitionNet/residualLayer.ts", "../src/faceRecognitionNet/index.ts", "../src/factories/WithFaceDescriptor.ts", "../src/factories/WithAge.ts", "../src/factories/WithGender.ts", "../src/ssdMobilenetv1/SsdMobilenetv1.ts", "../src/ssdMobilenetv1/extractParams.ts", "../src/ssdMobilenetv1/extractParamsFromWeightMap.ts", "../src/ssdMobilenetv1/mobileNetV1.ts", "../src/ssdMobilenetv1/pointwiseConvLayer.ts", "../src/ssdMobilenetv1/nonMaxSuppression.ts", "../src/ssdMobilenetv1/outputLayer.ts", "../src/ssdMobilenetv1/predictionLayer.ts", "../src/ssdMobilenetv1/boxPredictionLayer.ts", "../src/ssdMobilenetv1/SsdMobilenetv1Options.ts", "../src/ssdMobilenetv1/index.ts", "../src/tinyYolov2/const.ts", "../src/tinyYolov2/TinyYolov2Base.ts", "../src/tinyYolov2/config.ts", "../src/tinyYolov2/convWithBatchNorm.ts", "../src/tinyYolov2/leaky.ts", "../src/tinyYolov2/depthwiseSeparableConv.ts", "../src/tinyYolov2/extractParams.ts", "../src/tinyYolov2/extractParamsFromWeightMap.ts", "../src/tinyYolov2/TinyYolov2Options.ts", "../src/tinyYolov2/TinyYolov2.ts", "../src/tinyYolov2/index.ts", "../src/tinyFaceDetector/TinyFaceDetectorOptions.ts", "../src/globalApi/ComposableTask.ts", "../src/globalApi/DetectFaceLandmarksTasks.ts", "../src/globalApi/extractFacesAndComputeResults.ts", "../src/tinyFaceDetector/const.ts", "../src/tinyFaceDetector/TinyFaceDetector.ts", "../src/globalApi/nets.ts", "../src/globalApi/PredictFaceExpressionsTask.ts", "../src/globalApi/PredictAgeAndGenderTask.ts", "../src/globalApi/ComputeFaceDescriptorsTasks.ts", "../src/globalApi/DetectFacesTasks.ts", "../src/globalApi/detectFaces.ts", "../src/globalApi/allFaces.ts", "../src/euclideanDistance.ts", "../src/globalApi/FaceMatcher.ts", "../src/tinyFaceDetector/index.ts", "../src/resizeResults.ts"], - "sourcesContent": ["/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable node/no-unpublished-import */\n\n// wrapper to load tfjs in a single place so version can be changed quickly\n\nexport * from '@tensorflow/tfjs/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm';\n", "export function isNodejs(): boolean {\n return typeof global === 'object'\n && typeof require === 'function'\n && typeof module !== 'undefined'\n && typeof process !== 'undefined' && !!process.version;\n}\n", "import * as tf from '../dist/tfjs.esm';\nimport * as draw from './draw/index';\nimport * as utils from './utils/index';\nimport * as pkg from '../package.json';\n\nexport { tf, draw, utils };\n\nexport * from './ageGenderNet/index';\nexport * from './classes/index';\nexport * from './dom/index';\nexport * from './env/index';\nexport * from './faceExpressionNet/index';\nexport * from './faceLandmarkNet/index';\nexport * from './faceRecognitionNet/index';\nexport * from './factories/index';\nexport * from './globalApi/index';\nexport * from './ops/index';\nexport * from './ssdMobilenetv1/index';\nexport * from './tinyFaceDetector/index';\nexport * from './tinyYolov2/index';\nexport * from './euclideanDistance';\nexport * from './NeuralNetwork';\nexport * from './resizeResults';\n\nconst node = (typeof process !== 'undefined');\nconst browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined');\nexport const version = { faceapi: pkg.version as string, node, browser };\n", "export * from './drawContour';\nexport * from './drawDetections';\nexport * from './drawFaceExpressions';\nexport * from './DrawBox';\nexport * from './DrawFaceLandmarks';\nexport * from './DrawTextField';\n", "import { Point } from '../classes/index';\n\nexport function drawContour(\n ctx: CanvasRenderingContext2D,\n points: Point[],\n isClosed: boolean = false,\n) {\n ctx.beginPath();\n\n points.slice(1).forEach(({ x, y }, prevIdx) => {\n const from = points[prevIdx];\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(x, y);\n });\n\n if (isClosed) {\n const from = points[points.length - 1];\n const to = points[0];\n if (!from || !to) {\n return;\n }\n\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n }\n\n ctx.stroke();\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Point } from '../classes/index';\nimport { Dimensions, IDimensions } from '../classes/Dimensions';\n\nexport function isTensor(tensor: any, dim: number) {\n return tensor instanceof tf.Tensor && tensor.shape.length === dim;\n}\n\nexport function isTensor1D(tensor: any): tensor is tf.Tensor1D {\n return isTensor(tensor, 1);\n}\n\nexport function isTensor2D(tensor: any): tensor is tf.Tensor2D {\n return isTensor(tensor, 2);\n}\n\nexport function isTensor3D(tensor: any): tensor is tf.Tensor3D {\n return isTensor(tensor, 3);\n}\n\nexport function isTensor4D(tensor: any): tensor is tf.Tensor4D {\n return isTensor(tensor, 4);\n}\n\nexport function isFloat(num: number) {\n return num % 1 !== 0;\n}\n\nexport function isEven(num: number) {\n return num % 2 === 0;\n}\n\nexport function round(num: number, prec: number = 2) {\n const f = 10 ** prec;\n return Math.floor(num * f) / f;\n}\n\nexport function isDimensions(obj: any): boolean {\n return obj && obj.width && obj.height;\n}\n\nexport function computeReshapedDimensions({ width, height }: IDimensions, inputSize: number) {\n const scale = inputSize / Math.max(height, width);\n return new Dimensions(Math.round(width * scale), Math.round(height * scale));\n}\n\nexport function getCenterPoint(pts: Point[]): Point {\n return pts.reduce((sum, pt) => sum.add(pt), new Point(0, 0))\n .div(new Point(pts.length, pts.length));\n}\n\nexport function range(num: number, start: number, step: number): number[] {\n return Array(num).fill(0).map((_, i) => start + (i * step));\n}\n\nexport function isValidNumber(num: any) {\n return !!num && (num !== Infinity) && (num !== -Infinity) && !Number.isNaN(num) || num === 0;\n}\n\nexport function isValidProbablitiy(num: any) {\n return isValidNumber(num) && num >= 0 && num <= 1.0;\n}\n", "import { isValidNumber } from '../utils/index';\n\nexport interface IDimensions {\n width: number\n height: number\n}\n\nexport class Dimensions implements IDimensions {\n private _width: number\n\n private _height: number\n\n constructor(width: number, height: number) {\n if (!isValidNumber(width) || !isValidNumber(height)) {\n throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({ width, height })}`);\n }\n\n this._width = width;\n this._height = height;\n }\n\n public get width(): number { return this._width; }\n\n public get height(): number { return this._height; }\n\n public reverse(): Dimensions {\n return new Dimensions(1 / this.width, 1 / this.height);\n }\n}\n", "export interface IPoint {\n x: number\n y: number\n}\n\nexport class Point implements IPoint {\n private _x: number\n\n private _y: number\n\n constructor(x: number, y: number) {\n this._x = x;\n this._y = y;\n }\n\n get x(): number { return this._x; }\n\n get y(): number { return this._y; }\n\n public add(pt: IPoint): Point {\n return new Point(this.x + pt.x, this.y + pt.y);\n }\n\n public sub(pt: IPoint): Point {\n return new Point(this.x - pt.x, this.y - pt.y);\n }\n\n public mul(pt: IPoint): Point {\n return new Point(this.x * pt.x, this.y * pt.y);\n }\n\n public div(pt: IPoint): Point {\n return new Point(this.x / pt.x, this.y / pt.y);\n }\n\n public abs(): Point {\n return new Point(Math.abs(this.x), Math.abs(this.y));\n }\n\n public magnitude(): number {\n return Math.sqrt((this.x ** 2) + (this.y ** 2));\n }\n\n public floor(): Point {\n return new Point(Math.floor(this.x), Math.floor(this.y));\n }\n}\n", "import { isDimensions, isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { IDimensions } from './Dimensions';\nimport { Point } from './Point';\nimport { IRect } from './Rect';\n\nexport class Box implements IBoundingBox, IRect {\n public static isRect(rect: any): boolean {\n return !!rect && [rect.x, rect.y, rect.width, rect.height].every(isValidNumber);\n }\n\n public static assertIsValidBox(box: any, callee: string, allowNegativeDimensions: boolean = false) {\n if (!Box.isRect(box)) {\n throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);\n }\n\n if (!allowNegativeDimensions && (box.width < 0 || box.height < 0)) {\n throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`);\n }\n }\n\n private _x: number\n\n private _y: number\n\n private _width: number\n\n private _height: number\n\n constructor(_box: IBoundingBox | IRect, allowNegativeDimensions: boolean = true) {\n const box = (_box || {}) as any;\n\n const isBbox = [box.left, box.top, box.right, box.bottom].every(isValidNumber);\n const isRect = [box.x, box.y, box.width, box.height].every(isValidNumber);\n\n if (!isRect && !isBbox) {\n throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);\n }\n\n const [x, y, width, height] = isRect\n ? [box.x, box.y, box.width, box.height]\n : [box.left, box.top, box.right - box.left, box.bottom - box.top];\n\n Box.assertIsValidBox({\n x, y, width, height,\n }, 'Box.constructor', allowNegativeDimensions);\n\n this._x = x;\n this._y = y;\n this._width = width;\n this._height = height;\n }\n\n public get x(): number { return this._x; }\n\n public get y(): number { return this._y; }\n\n public get width(): number { return this._width; }\n\n public get height(): number { return this._height; }\n\n public get left(): number { return this.x; }\n\n public get top(): number { return this.y; }\n\n public get right(): number { return this.x + this.width; }\n\n public get bottom(): number { return this.y + this.height; }\n\n public get area(): number { return this.width * this.height; }\n\n public get topLeft(): Point { return new Point(this.left, this.top); }\n\n public get topRight(): Point { return new Point(this.right, this.top); }\n\n public get bottomLeft(): Point { return new Point(this.left, this.bottom); }\n\n public get bottomRight(): Point { return new Point(this.right, this.bottom); }\n\n public round(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map((val) => Math.round(val));\n return new Box({\n x, y, width, height,\n });\n }\n\n public floor(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map((val) => Math.floor(val));\n return new Box({\n x, y, width, height,\n });\n }\n\n public toSquare(): Box {\n let {\n x, y, width, height,\n } = this;\n const diff = Math.abs(width - height);\n if (width < height) {\n x -= (diff / 2);\n width += diff;\n }\n if (height < width) {\n y -= (diff / 2);\n height += diff;\n }\n\n return new Box({ x, y, width, height });\n }\n\n public rescale(s: IDimensions | number): Box {\n const scaleX = isDimensions(s) ? (s as IDimensions).width : s as number;\n const scaleY = isDimensions(s) ? (s as IDimensions).height : s as number;\n return new Box({\n x: this.x * scaleX,\n y: this.y * scaleY,\n width: this.width * scaleX,\n height: this.height * scaleY,\n });\n }\n\n public pad(padX: number, padY: number): Box {\n const [x, y, width, height] = [\n this.x - (padX / 2),\n this.y - (padY / 2),\n this.width + padX,\n this.height + padY,\n ];\n return new Box({\n x, y, width, height,\n });\n }\n\n public clipAtImageBorders(imgWidth: number, imgHeight: number): Box {\n const { x, y, right, bottom } = this;\n const clippedX = Math.max(x, 0);\n const clippedY = Math.max(y, 0);\n\n const newWidth = right - clippedX;\n const newHeight = bottom - clippedY;\n const clippedWidth = Math.min(newWidth, imgWidth - clippedX);\n const clippedHeight = Math.min(newHeight, imgHeight - clippedY);\n\n return (new Box({\n x: clippedX, y: clippedY, width: clippedWidth, height: clippedHeight,\n })).floor();\n }\n\n public shift(sx: number, sy: number): Box {\n const { width, height } = this;\n const x = this.x + sx;\n const y = this.y + sy;\n\n return new Box({\n x, y, width, height,\n });\n }\n\n public padAtBorders(imageHeight: number, imageWidth: number) {\n const w = this.width + 1;\n const h = this.height + 1;\n\n const dx = 1;\n const dy = 1;\n let edx = w;\n let edy = h;\n\n let x = this.left;\n let y = this.top;\n let ex = this.right;\n let ey = this.bottom;\n\n if (ex > imageWidth) {\n edx = -ex + imageWidth + w;\n ex = imageWidth;\n }\n if (ey > imageHeight) {\n edy = -ey + imageHeight + h;\n ey = imageHeight;\n }\n if (x < 1) {\n edy = 2 - x;\n x = 1;\n }\n if (y < 1) {\n edy = 2 - y;\n y = 1;\n }\n\n return {\n dy, edy, dx, edx, y, ey, x, ex, w, h,\n };\n }\n\n public calibrate(region: Box) {\n return new Box({\n left: this.left + (region.left * this.width),\n top: this.top + (region.top * this.height),\n right: this.right + (region.right * this.width),\n bottom: this.bottom + (region.bottom * this.height),\n }).toSquare().round();\n }\n}\n", "import { Box } from './Box';\n\nexport interface IBoundingBox {\n left: number\n top: number\n right: number\n bottom: number\n}\n\nexport class BoundingBox extends Box implements IBoundingBox {\n constructor(left: number, top: number, right: number, bottom: number, allowNegativeDimensions: boolean = false) {\n super({\n left, top, right, bottom,\n }, allowNegativeDimensions);\n }\n}\n", "import { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { IRect, Rect } from './Rect';\n\nexport class ObjectDetection {\n private _score: number\n\n private _classScore: number\n\n private _className: string\n\n private _box: Rect\n\n private _imageDims: Dimensions\n\n constructor(\n score: number,\n classScore: number,\n className: string,\n relativeBox: IRect,\n imageDims: IDimensions,\n ) {\n this._imageDims = new Dimensions(imageDims.width, imageDims.height);\n this._score = score;\n this._classScore = classScore;\n this._className = className;\n this._box = new Box(relativeBox).rescale(this._imageDims);\n }\n\n public get score(): number { return this._score; }\n\n public get classScore(): number { return this._classScore; }\n\n public get className(): string { return this._className; }\n\n public get box(): Box { return this._box; }\n\n public get imageDims(): Dimensions { return this._imageDims; }\n\n public get imageWidth(): number { return this.imageDims.width; }\n\n public get imageHeight(): number { return this.imageDims.height; }\n\n public get relativeBox(): Box { return new Box(this._box).rescale(this.imageDims.reverse()); }\n\n public forSize(width: number, height: number): ObjectDetection {\n return new ObjectDetection(\n this.score,\n this.classScore,\n this.className,\n this.relativeBox,\n { width, height },\n );\n }\n}\n", "import { Box } from './Box';\nimport { IDimensions } from './Dimensions';\nimport { ObjectDetection } from './ObjectDetection';\nimport { Rect } from './Rect';\n\nexport interface IFaceDetecion {\n score: number\n box: Box\n}\n\nexport class FaceDetection extends ObjectDetection implements IFaceDetecion {\n constructor(\n score: number,\n relativeBox: Rect,\n imageDims: IDimensions,\n ) {\n super(score, score, '', relativeBox, imageDims);\n }\n\n public forSize(width: number, height: number): FaceDetection {\n const { score, relativeBox, imageDims } = super.forSize(width, height);\n return new FaceDetection(score, relativeBox, imageDims);\n }\n}\n", "import { Box } from '../classes/Box';\n\nexport function iou(box1: Box, box2: Box, isIOU: boolean = true) {\n const width = Math.max(0.0, Math.min(box1.right, box2.right) - Math.max(box1.left, box2.left));\n const height = Math.max(0.0, Math.min(box1.bottom, box2.bottom) - Math.max(box1.top, box2.top));\n const interSection = width * height;\n\n return isIOU\n ? interSection / (box1.area + box2.area - interSection)\n : interSection / Math.min(box1.area, box2.area);\n}\n", "import { BoundingBox, IPoint } from '../classes/index';\n\nexport function minBbox(pts: IPoint[]): BoundingBox {\n const xs = pts.map((pt) => pt.x);\n const ys = pts.map((pt) => pt.y);\n const minX = xs.reduce((min, x) => (x < min ? x : min), Infinity);\n const minY = ys.reduce((min, y) => (y < min ? y : min), Infinity);\n const maxX = xs.reduce((max, x) => (max < x ? x : max), 0);\n const maxY = ys.reduce((max, y) => (max < y ? y : max), 0);\n\n return new BoundingBox(minX, minY, maxX, maxY);\n}\n", "import { Box } from '../classes/Box';\nimport { iou } from './iou';\n\nexport function nonMaxSuppression(\n boxes: Box[],\n scores: number[],\n iouThreshold: number,\n isIOU: boolean = true,\n): number[] {\n let indicesSortedByScore = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .sort((c1, c2) => c1.score - c2.score)\n .map((c) => c.boxIndex);\n\n const pick: number[] = [];\n\n while (indicesSortedByScore.length > 0) {\n const curr = indicesSortedByScore.pop() as number;\n pick.push(curr);\n\n const indices = indicesSortedByScore;\n\n const outputs: number[] = [];\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i];\n\n const currBox = boxes[curr];\n const idxBox = boxes[idx];\n\n outputs.push(iou(currBox, idxBox, isIOU));\n }\n\n indicesSortedByScore = indicesSortedByScore.filter(\n (_, j) => outputs[j] <= iouThreshold,\n );\n }\n\n return pick;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function normalize(x: tf.Tensor4D, meanRgb: number[]): tf.Tensor4D {\n return tf.tidy(() => {\n const [r, g, b] = meanRgb;\n const avg_r = tf.fill([...x.shape.slice(0, 3), 1], r, 'float32');\n const avg_g = tf.fill([...x.shape.slice(0, 3), 1], g, 'float32');\n const avg_b = tf.fill([...x.shape.slice(0, 3), 1], b, 'float32');\n const avg_rgb = tf.concat([avg_r, avg_g, avg_b], 3);\n\n return tf.sub(x, avg_rgb);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\n/**\n * Pads the smaller dimension of an image tensor with zeros, such that width === height.\n *\n * @param imgTensor The image tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The padded tensor with width === height.\n */\nexport function padToSquare(\n imgTensor: tf.Tensor4D,\n isCenterImage: boolean = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const [height, width] = imgTensor.shape.slice(1);\n if (height === width) {\n return imgTensor;\n }\n\n const dimDiff = Math.abs(height - width);\n const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));\n const paddingAxis = height > width ? 2 : 1;\n\n const createPaddingTensor = (paddingAmountLocal: number): tf.Tensor => {\n const paddingTensorShape = imgTensor.shape.slice();\n paddingTensorShape[paddingAxis] = paddingAmountLocal;\n return tf.fill(paddingTensorShape, 0, 'float32');\n };\n\n const paddingTensorAppend = createPaddingTensor(paddingAmount);\n const remainingPaddingAmount = dimDiff - (paddingTensorAppend.shape[paddingAxis] as number);\n\n const paddingTensorPrepend = isCenterImage && remainingPaddingAmount\n ? createPaddingTensor(remainingPaddingAmount)\n : null;\n\n const tensorsToStack = [\n paddingTensorPrepend,\n imgTensor,\n paddingTensorAppend,\n ]\n .filter((t) => !!t)\n .map((t: tf.Tensor) => tf.cast(t, 'float32')) as tf.Tensor4D[];\n return tf.concat(tensorsToStack, paddingAxis);\n });\n}\n", "export function shuffleArray(inputArray: any[]) {\n const array = inputArray.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const x = array[i];\n array[i] = array[j];\n array[j] = x;\n }\n return array;\n}\n", "export * from './iou';\nexport * from './minBbox';\nexport * from './nonMaxSuppression';\nexport * from './normalize';\nexport * from './padToSquare';\nexport * from './shuffleArray';\n\nexport function sigmoid(x: number) {\n return 1 / (1 + Math.exp(-x));\n}\n\nexport function inverseSigmoid(x: number) {\n return Math.log(x / (1 - x));\n}\n", "import { Box } from './Box';\n\nexport interface IRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport class Rect extends Box implements IRect {\n constructor(x: number, y: number, width: number, height: number, allowNegativeDimensions: boolean = false) {\n super({\n x, y, width, height,\n }, allowNegativeDimensions);\n }\n}\n", "import { minBbox } from '../ops/index';\nimport { getCenterPoint } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { FaceDetection } from './FaceDetection';\nimport { Point } from './Point';\nimport { IRect, Rect } from './Rect';\n\n// face alignment constants\nconst relX = 0.5;\nconst relY = 0.43;\nconst relScale = 0.45;\n\nexport interface IFaceLandmarks {\n positions: Point[]\n shift: Point\n}\n\nexport class FaceLandmarks implements IFaceLandmarks {\n protected _shift: Point\n\n protected _positions: Point[]\n\n protected _imgDims: Dimensions\n\n constructor(\n relativeFaceLandmarkPositions: Point[],\n imgDims: IDimensions,\n shift: Point = new Point(0, 0),\n ) {\n const { width, height } = imgDims;\n this._imgDims = new Dimensions(width, height);\n this._shift = shift;\n this._positions = relativeFaceLandmarkPositions.map(\n (pt) => pt.mul(new Point(width, height)).add(shift),\n );\n }\n\n public get shift(): Point { return new Point(this._shift.x, this._shift.y); }\n\n public get imageWidth(): number { return this._imgDims.width; }\n\n public get imageHeight(): number { return this._imgDims.height; }\n\n public get positions(): Point[] { return this._positions; }\n\n public get relativePositions(): Point[] {\n return this._positions.map(\n (pt) => pt.sub(this._shift).div(new Point(this.imageWidth, this.imageHeight)),\n );\n }\n\n public forSize(width: number, height: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n { width, height },\n );\n }\n\n public shiftBy(x: number, y: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n this._imgDims,\n new Point(x, y),\n );\n }\n\n public shiftByPoint(pt: Point): T {\n return this.shiftBy(pt.x, pt.y);\n }\n\n /**\n * Aligns the face landmarks after face detection from the relative positions of the faces\n * bounding box, or it's current shift. This function should be used to align the face images\n * after face detection has been performed, before they are passed to the face recognition net.\n * This will make the computed face descriptor more accurate.\n *\n * @param detection (optional) The bounding box of the face or the face detection result. If\n * no argument was passed the position of the face landmarks are assumed to be relative to\n * it's current shift.\n * @returns The bounding box of the aligned face.\n */\n public align(\n detection?: FaceDetection | IRect | IBoundingBox | null,\n options: { useDlibAlignment?: boolean, minBoxPadding?: number } = { },\n ): Box {\n if (detection) {\n const box = detection instanceof FaceDetection\n ? detection.box.floor()\n : new Box(detection);\n\n return this.shiftBy(box.x, box.y).align(null, options);\n }\n\n const { useDlibAlignment, minBoxPadding } = { useDlibAlignment: false, minBoxPadding: 0.2, ...options };\n\n if (useDlibAlignment) {\n return this.alignDlib();\n }\n\n return this.alignMinBbox(minBoxPadding);\n }\n\n private alignDlib(): Box {\n const centers = this.getRefPointsForAlignment();\n\n const [leftEyeCenter, rightEyeCenter, mouthCenter] = centers;\n const distToMouth = (pt: Point) => mouthCenter.sub(pt).magnitude();\n const eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2;\n\n const size = Math.floor(eyeToMouthDist / relScale);\n\n const refPoint = getCenterPoint(centers);\n // TODO: pad in case rectangle is out of image bounds\n const x = Math.floor(Math.max(0, refPoint.x - (relX * size)));\n const y = Math.floor(Math.max(0, refPoint.y - (relY * size)));\n\n return new Rect(x, y, Math.min(size, this.imageWidth + x), Math.min(size, this.imageHeight + y));\n }\n\n private alignMinBbox(padding: number): Box {\n const box = minBbox(this.positions);\n return box.pad(box.width * padding, box.height * padding);\n }\n\n protected getRefPointsForAlignment(): Point[] {\n throw new Error('getRefPointsForAlignment not implemented by base class');\n }\n}\n", "import { getCenterPoint } from '../utils/index';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks5 extends FaceLandmarks {\n protected getRefPointsForAlignment(): Point[] {\n const pts = this.positions;\n return [\n pts[0],\n pts[1],\n getCenterPoint([pts[3], pts[4]]),\n ];\n }\n}\n", "import { getCenterPoint } from '../utils/index';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks68 extends FaceLandmarks {\n public getJawOutline(): Point[] {\n return this.positions.slice(0, 17);\n }\n\n public getLeftEyeBrow(): Point[] {\n return this.positions.slice(17, 22);\n }\n\n public getRightEyeBrow(): Point[] {\n return this.positions.slice(22, 27);\n }\n\n public getNose(): Point[] {\n return this.positions.slice(27, 36);\n }\n\n public getLeftEye(): Point[] {\n return this.positions.slice(36, 42);\n }\n\n public getRightEye(): Point[] {\n return this.positions.slice(42, 48);\n }\n\n public getMouth(): Point[] {\n return this.positions.slice(48, 68);\n }\n\n protected getRefPointsForAlignment(): Point[] {\n return [\n this.getLeftEye(),\n this.getRightEye(),\n this.getMouth(),\n ].map(getCenterPoint);\n }\n}\n", "import { round } from '../utils/index';\n\nexport interface IFaceMatch {\n label: string\n distance: number\n}\n\nexport class FaceMatch implements IFaceMatch {\n private _label: string\n\n private _distance: number\n\n constructor(label: string, distance: number) {\n this._label = label;\n this._distance = distance;\n }\n\n public get label(): string { return this._label; }\n\n public get distance(): number { return this._distance; }\n\n public toString(withDistance: boolean = true): string {\n return `${this.label}${withDistance ? ` (${round(this.distance)})` : ''}`;\n }\n}\n", "import { isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { IRect } from './Rect';\n\nexport class LabeledBox extends Box {\n public static assertIsValidLabeledBox(box: any, callee: string) {\n Box.assertIsValidBox(box, callee);\n\n if (!isValidNumber(box.label)) {\n throw new Error(`${callee} - expected property label (${box.label}) to be a number`);\n }\n }\n\n private _label: number\n\n constructor(box: IBoundingBox | IRect | any, label: number) {\n super(box);\n this._label = label;\n }\n\n public get label(): number { return this._label; }\n}\n", "export class LabeledFaceDescriptors {\n private _label: string\n\n private _descriptors: Float32Array[]\n\n constructor(label: string, descriptors: Float32Array[]) {\n if (!(typeof label === 'string')) {\n throw new Error('LabeledFaceDescriptors - constructor expected label to be a string');\n }\n\n if (!Array.isArray(descriptors) || descriptors.some((desc) => !(desc instanceof Float32Array))) {\n throw new Error('LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array');\n }\n\n this._label = label;\n this._descriptors = descriptors;\n }\n\n public get label(): string { return this._label; }\n\n public get descriptors(): Float32Array[] { return this._descriptors; }\n\n public toJSON(): any {\n return {\n label: this.label,\n descriptors: this.descriptors.map((d) => Array.from(d)),\n };\n }\n\n public static fromJSON(json: any): LabeledFaceDescriptors {\n const descriptors = json.descriptors.map((d: any) => new Float32Array(d));\n return new LabeledFaceDescriptors(json.label, descriptors);\n }\n}\n", "import { isValidProbablitiy } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { LabeledBox } from './LabeledBox';\nimport { IRect } from './Rect';\n\nexport class PredictedBox extends LabeledBox {\n public static assertIsValidPredictedBox(box: any, callee: string) {\n LabeledBox.assertIsValidLabeledBox(box, callee);\n\n if (\n !isValidProbablitiy(box.score)\n || !isValidProbablitiy(box.classScore)\n ) {\n throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`);\n }\n }\n\n private _score: number\n\n private _classScore: number\n\n constructor(box: IBoundingBox | IRect | any, label: number, score: number, classScore: number) {\n super(box, label);\n this._score = score;\n this._classScore = classScore;\n }\n\n public get score(): number { return this._score; }\n\n public get classScore(): number { return this._classScore; }\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\n\nexport type WithFaceDetection = TSource & {\n detection: FaceDetection\n}\n\nexport function isWithFaceDetection(obj: any): obj is WithFaceDetection<{}> {\n return obj.detection instanceof FaceDetection;\n}\n\nexport function extendWithFaceDetection(sourceObj: TSource, detection: FaceDetection): WithFaceDetection {\n const extension = { detection };\n return { ...sourceObj, ...extension };\n}\n", "import { Environment } from './types';\n\nexport function createBrowserEnv(): Environment {\n const fetch = window.fetch;\n if (!fetch) throw new Error('fetch - missing fetch implementation for browser environment');\n\n const readFile = () => {\n throw new Error('readFile - filesystem not available for browser environment');\n };\n\n return {\n Canvas: HTMLCanvasElement,\n CanvasRenderingContext2D,\n Image: HTMLImageElement,\n ImageData,\n Video: HTMLVideoElement,\n createCanvasElement: () => document.createElement('canvas'),\n createImageElement: () => document.createElement('img'),\n fetch,\n readFile,\n };\n}\n", "import { FileSystem } from './types';\n\nexport function createFileSystem(fs?: any): FileSystem {\n let requireFsError = '';\n\n if (!fs) {\n try {\n // eslint-disable-next-line global-require\n fs = require('fs');\n } catch (err) {\n requireFsError = err.toString();\n }\n }\n\n const readFile = fs\n ? (filePath: string) => new Promise((resolve, reject) => {\n fs.readFile(filePath, (err: any, buffer: Buffer) => (err ? reject(err) : resolve(buffer)));\n })\n : () => {\n throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`);\n };\n\n return {\n readFile,\n };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { createFileSystem } from './createFileSystem';\nimport { Environment } from './types';\n\nexport function createNodejsEnv(): Environment {\n // eslint-disable-next-line dot-notation\n const Canvas = global['Canvas'] || global.HTMLCanvasElement;\n const Image = global.Image || global.HTMLImageElement;\n\n const createCanvasElement = () => {\n if (Canvas) return new Canvas();\n throw new Error('createCanvasElement - missing Canvas implementation for nodejs environment');\n };\n\n const createImageElement = () => {\n if (Image) return new Image();\n throw new Error('createImageElement - missing Image implementation for nodejs environment');\n };\n\n const fetch = global.fetch;\n // if (!fetch) throw new Error('fetch - missing fetch implementation for nodejs environment');\n\n const fileSystem = createFileSystem();\n\n return {\n Canvas: Canvas || class {},\n CanvasRenderingContext2D: global.CanvasRenderingContext2D || class {},\n Image: Image || class {},\n ImageData: global.ImageData || class {},\n Video: global.HTMLVideoElement || class {},\n createCanvasElement,\n createImageElement,\n fetch,\n ...fileSystem,\n };\n}\n", "export function isBrowser(): boolean {\n return typeof window === 'object'\n && typeof document !== 'undefined'\n && typeof HTMLImageElement !== 'undefined'\n && typeof HTMLCanvasElement !== 'undefined'\n && typeof HTMLVideoElement !== 'undefined'\n && typeof ImageData !== 'undefined'\n && typeof CanvasRenderingContext2D !== 'undefined';\n}\n", "import { createBrowserEnv } from './createBrowserEnv';\nimport { createFileSystem } from './createFileSystem';\nimport { createNodejsEnv } from './createNodejsEnv';\nimport { isBrowser } from './isBrowser';\nimport { isNodejs } from './isNodejs';\nimport { Environment } from './types';\n\nlet environment: Environment | null;\n\nfunction getEnv(): Environment {\n if (!environment) {\n throw new Error('getEnv - environment is not defined, check isNodejs() and isBrowser()');\n }\n return environment;\n}\n\nfunction setEnv(env: Environment) {\n environment = env;\n}\n\nfunction initialize() {\n // check for isBrowser() first to prevent electron renderer process\n // to be initialized with wrong environment due to isNodejs() returning true\n if (isBrowser()) return setEnv(createBrowserEnv());\n if (isNodejs()) return setEnv(createNodejsEnv());\n return null;\n}\n\nfunction monkeyPatch(env: Partial) {\n if (!environment) {\n initialize();\n }\n\n if (!environment) {\n throw new Error('monkeyPatch - environment is not defined, check isNodejs() and isBrowser()');\n }\n\n const { Canvas = environment.Canvas, Image = environment.Image } = env;\n environment.Canvas = Canvas;\n environment.Image = Image;\n environment.createCanvasElement = env.createCanvasElement || (() => new Canvas());\n environment.createImageElement = env.createImageElement || (() => new Image());\n\n environment.ImageData = env.ImageData || environment.ImageData;\n environment.Video = env.Video || environment.Video;\n environment.fetch = env.fetch || environment.fetch;\n environment.readFile = env.readFile || environment.readFile;\n}\n\nexport const env = {\n getEnv,\n setEnv,\n initialize,\n createBrowserEnv,\n createFileSystem,\n createNodejsEnv,\n monkeyPatch,\n isBrowser,\n isNodejs,\n};\n\ninitialize();\n\nexport * from './types';\n", "import { env } from '../env/index';\n\nexport function resolveInput(arg: string | any) {\n if (!env.isNodejs() && typeof arg === 'string') {\n return document.getElementById(arg);\n }\n return arg;\n}\n", "import { env } from '../env/index';\nimport { resolveInput } from './resolveInput';\n\nexport function getContext2dOrThrow(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D): CanvasRenderingContext2D {\n const { Canvas, CanvasRenderingContext2D } = env.getEnv();\n\n if (canvasArg instanceof CanvasRenderingContext2D) {\n return canvasArg;\n }\n\n const canvas = resolveInput(canvasArg);\n\n if (!(canvas instanceof Canvas)) {\n throw new Error('resolveContext2d - expected canvas to be of instance of Canvas');\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('resolveContext2d - canvas 2d context is null');\n }\n\n return ctx;\n}\n", "/* eslint-disable max-classes-per-file */\nimport { IDimensions, IPoint } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { resolveInput } from '../dom/resolveInput';\n\n// eslint-disable-next-line no-shadow\nexport enum AnchorPosition {\n // eslint-disable-next-line no-unused-vars\n TOP_LEFT = 'TOP_LEFT',\n // eslint-disable-next-line no-unused-vars\n TOP_RIGHT = 'TOP_RIGHT',\n // eslint-disable-next-line no-unused-vars\n BOTTOM_LEFT = 'BOTTOM_LEFT',\n // eslint-disable-next-line no-unused-vars\n BOTTOM_RIGHT = 'BOTTOM_RIGHT'\n}\n\nexport interface IDrawTextFieldOptions {\n anchorPosition?: AnchorPosition\n backgroundColor?: string\n fontColor?: string\n fontSize?: number\n fontStyle?: string\n padding?: number\n}\n\nexport class DrawTextFieldOptions implements IDrawTextFieldOptions {\n public anchorPosition: AnchorPosition\n\n public backgroundColor: string\n\n public fontColor: string\n\n public fontSize: number\n\n public fontStyle: string\n\n public padding: number\n\n constructor(options: IDrawTextFieldOptions = {}) {\n const {\n anchorPosition, backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = options;\n this.anchorPosition = anchorPosition || AnchorPosition.TOP_LEFT;\n this.backgroundColor = backgroundColor || 'rgba(0, 0, 0, 0.5)';\n this.fontColor = fontColor || 'rgba(255, 255, 255, 1)';\n this.fontSize = fontSize || 14;\n this.fontStyle = fontStyle || 'Georgia';\n this.padding = padding || 4;\n }\n}\n\nexport class DrawTextField {\n public text: string[]\n\n public anchor : IPoint\n\n public options: DrawTextFieldOptions\n\n constructor(\n text: string | string[] | DrawTextField,\n anchor: IPoint,\n options: IDrawTextFieldOptions = {},\n ) {\n // eslint-disable-next-line no-nested-ternary\n this.text = typeof text === 'string'\n ? [text]\n : (text instanceof DrawTextField ? text.text : text);\n this.anchor = anchor;\n this.options = new DrawTextFieldOptions(options);\n }\n\n measureWidth(ctx: CanvasRenderingContext2D): number {\n const { padding } = this.options;\n return this.text.map((l) => ctx.measureText(l).width).reduce((w0, w1) => (w0 < w1 ? w1 : w0), 0) + (2 * padding);\n }\n\n measureHeight(): number {\n const { fontSize, padding } = this.options;\n return this.text.length * fontSize + (2 * padding);\n }\n\n getUpperLeft(ctx: CanvasRenderingContext2D, canvasDims?: IDimensions): IPoint {\n const { anchorPosition } = this.options;\n const isShiftLeft = anchorPosition === AnchorPosition.BOTTOM_RIGHT || anchorPosition === AnchorPosition.TOP_RIGHT;\n const isShiftTop = anchorPosition === AnchorPosition.BOTTOM_LEFT || anchorPosition === AnchorPosition.BOTTOM_RIGHT;\n\n const textFieldWidth = this.measureWidth(ctx);\n const textFieldHeight = this.measureHeight();\n const x = (isShiftLeft ? this.anchor.x - textFieldWidth : this.anchor.x);\n const y = isShiftTop ? this.anchor.y - textFieldHeight : this.anchor.y;\n\n // adjust anchor if text box exceeds canvas borders\n if (canvasDims) {\n const { width, height } = canvasDims;\n const newX = Math.max(Math.min(x, width - textFieldWidth), 0);\n const newY = Math.max(Math.min(y, height - textFieldHeight), 0);\n return { x: newX, y: newY };\n }\n return { x, y };\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const canvas = resolveInput(canvasArg);\n const ctx = getContext2dOrThrow(canvas);\n\n const {\n backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = this.options;\n\n ctx.font = `${fontSize}px ${fontStyle}`;\n const maxTextWidth = this.measureWidth(ctx);\n const textHeight = this.measureHeight();\n\n ctx.fillStyle = backgroundColor;\n const upperLeft = this.getUpperLeft(ctx, canvas);\n ctx.fillRect(upperLeft.x, upperLeft.y, maxTextWidth, textHeight);\n\n ctx.fillStyle = fontColor;\n this.text.forEach((textLine, i) => {\n const x = padding + upperLeft.x;\n const y = padding + upperLeft.y + ((i + 1) * fontSize);\n ctx.fillText(textLine, x, y);\n });\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { Box, IBoundingBox, IRect } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { AnchorPosition, DrawTextField, DrawTextFieldOptions, IDrawTextFieldOptions } from './DrawTextField';\n\nexport interface IDrawBoxOptions {\n boxColor?: string\n lineWidth?: number\n drawLabelOptions?: IDrawTextFieldOptions\n label?: string\n}\n\nexport class DrawBoxOptions {\n public boxColor: string\n\n public lineWidth: number\n\n public drawLabelOptions: DrawTextFieldOptions\n\n public label?: string\n\n constructor(options: IDrawBoxOptions = {}) {\n const {\n boxColor, lineWidth, label, drawLabelOptions,\n } = options;\n this.boxColor = boxColor || 'rgba(0, 0, 255, 1)';\n this.lineWidth = lineWidth || 2;\n this.label = label;\n\n const defaultDrawLabelOptions = {\n anchorPosition: AnchorPosition.BOTTOM_LEFT,\n backgroundColor: this.boxColor,\n };\n this.drawLabelOptions = new DrawTextFieldOptions({ ...defaultDrawLabelOptions, ...drawLabelOptions });\n }\n}\n\nexport class DrawBox {\n public box: Box\n\n public options: DrawBoxOptions\n\n constructor(\n box: IBoundingBox | IRect,\n options: IDrawBoxOptions = {},\n ) {\n this.box = new Box(box);\n this.options = new DrawBoxOptions(options);\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg);\n\n const { boxColor, lineWidth } = this.options;\n\n const {\n x, y, width, height,\n } = this.box;\n ctx.strokeStyle = boxColor;\n ctx.lineWidth = lineWidth;\n ctx.strokeRect(x, y, width, height);\n\n const { label } = this.options;\n if (label) {\n new DrawTextField([label], { x: x - (lineWidth / 2), y }, this.options.drawLabelOptions).draw(canvasArg);\n }\n }\n}\n", "import { Box, IBoundingBox, IRect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { round } from '../utils/index';\nimport { DrawBox } from './DrawBox';\n\nexport type TDrawDetectionsInput = IRect | IBoundingBox | FaceDetection | WithFaceDetection<{}>\n\nexport function drawDetections(\n canvasArg: string | HTMLCanvasElement,\n detections: TDrawDetectionsInput | Array,\n) {\n const detectionsArray = Array.isArray(detections) ? detections : [detections];\n\n detectionsArray.forEach((det) => {\n // eslint-disable-next-line no-nested-ternary\n const score = det instanceof FaceDetection\n ? det.score\n : (isWithFaceDetection(det) ? det.detection.score : undefined);\n\n // eslint-disable-next-line no-nested-ternary\n const box = det instanceof FaceDetection\n ? det.box\n : (isWithFaceDetection(det) ? det.detection.box : new Box(det));\n\n const label = score ? `${round(score)}` : undefined;\n new DrawBox(box, { label }).draw(canvasArg);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { FaceExpressions } from './FaceExpressions';\n\nexport class FaceExpressionNet extends FaceProcessor {\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceExpressionNet', faceFeatureExtractor);\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n return tf.tidy(() => tf.softmax(this.runNet(input)));\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async predictExpressions(input: TNetInput) {\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput);\n const probabilitesByBatch = await Promise.all(tf.unstack(out).map(async (t) => {\n const data = t.dataSync();\n t.dispose();\n return data;\n }));\n out.dispose();\n\n const predictionsByBatch = probabilitesByBatch\n .map((probabilites) => new FaceExpressions(probabilites as Float32Array));\n\n return netInput.isBatchInput\n ? predictionsByBatch\n : predictionsByBatch[0];\n }\n\n protected getDefaultModelName(): string {\n return 'face_expression_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 256;\n }\n\n protected getClassifierChannelsOut(): number {\n return 7;\n }\n}\n", "import { env } from '../env/index';\n\nexport function isMediaLoaded(media: HTMLImageElement | HTMLVideoElement) : boolean {\n const { Image, Video } = env.getEnv();\n\n return (media instanceof Image && media.complete)\n || (media instanceof Video && media.readyState >= 3);\n}\n", "import { env } from '../env/index';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function awaitMediaLoaded(media: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement) {\n // eslint-disable-next-line consistent-return\n return new Promise((resolve, reject) => {\n if (media instanceof env.getEnv().Canvas || isMediaLoaded(media)) return resolve(null);\n\n function onError(e: Event) {\n if (!e.currentTarget) return;\n // eslint-disable-next-line no-use-before-define\n e.currentTarget.removeEventListener('load', onLoad);\n e.currentTarget.removeEventListener('error', onError);\n reject(e);\n }\n\n function onLoad(e: Event) {\n if (!e.currentTarget) return;\n e.currentTarget.removeEventListener('load', onLoad);\n e.currentTarget.removeEventListener('error', onError);\n resolve(e);\n }\n\n media.addEventListener('load', onLoad);\n media.addEventListener('error', onError);\n });\n}\n", "import { env } from '../env/index';\n\nexport function bufferToImage(buf: Blob): Promise {\n return new Promise((resolve, reject) => {\n if (!(buf instanceof Blob)) reject(new Error('bufferToImage - expected buf to be of type: Blob'));\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') reject(new Error('bufferToImage - expected reader.result to be a string, in onload'));\n const img = env.getEnv().createImageElement();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = reader.result as string;\n };\n reader.onerror = reject;\n reader.readAsDataURL(buf);\n });\n}\n", "import { Dimensions, IDimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\n\nexport function getMediaDimensions(input: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | IDimensions): Dimensions {\n const { Image, Video } = env.getEnv();\n\n if (input instanceof Image) {\n return new Dimensions(input.naturalWidth, input.naturalHeight);\n }\n if (input instanceof Video) {\n return new Dimensions(input.videoWidth, input.videoHeight);\n }\n return new Dimensions(input.width, input.height);\n}\n", "import { IDimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function createCanvas({ width, height }: IDimensions): HTMLCanvasElement {\n const { createCanvasElement } = env.getEnv();\n const canvas = createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n\nexport function createCanvasFromMedia(media: HTMLImageElement | HTMLVideoElement | ImageData, dims?: IDimensions): HTMLCanvasElement {\n const { ImageData } = env.getEnv();\n\n if (!(media instanceof ImageData) && !isMediaLoaded(media)) {\n throw new Error('createCanvasFromMedia - media has not finished loading yet');\n }\n\n const { width, height } = dims || getMediaDimensions(media);\n const canvas = createCanvas({ width, height });\n\n if (media instanceof ImageData) {\n getContext2dOrThrow(canvas).putImageData(media, 0, 0);\n } else {\n getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height);\n }\n return canvas;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { env } from '../env/index';\nimport { isTensor4D } from '../utils/index';\n\nexport async function imageTensorToCanvas(\n imgTensor: tf.Tensor,\n canvas?: HTMLCanvasElement,\n): Promise {\n const targetCanvas = canvas || env.getEnv().createCanvasElement();\n\n const [height, width, numChannels] = imgTensor.shape.slice(isTensor4D(imgTensor) ? 1 : 0);\n const imgTensor3D = tf.tidy(() => imgTensor.as3D(height, width, numChannels).toInt());\n await tf.browser.toPixels(imgTensor3D, targetCanvas);\n\n imgTensor3D.dispose();\n\n return targetCanvas;\n}\n", "import { env } from '../env/index';\n\nexport function isMediaElement(input: any) {\n const { Image, Canvas, Video } = env.getEnv();\n\n return input instanceof Image\n || input instanceof Canvas\n || input instanceof Video;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Dimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\nimport { padToSquare } from '../ops/padToSquare';\nimport { computeReshapedDimensions, isTensor3D, isTensor4D, range } from '../utils/index';\nimport { createCanvasFromMedia } from './createCanvas';\nimport { imageToSquare } from './imageToSquare';\nimport { TResolvedNetInput } from './types';\n\nexport class NetInput {\n private _imageTensors: Array = []\n\n private _canvases: HTMLCanvasElement[] = []\n\n private _batchSize: number\n\n private _treatAsBatchInput: boolean = false\n\n private _inputDimensions: number[][] = []\n\n private _inputSize: number\n\n constructor(inputs: Array, treatAsBatchInput: boolean = false) {\n if (!Array.isArray(inputs)) {\n throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${inputs}`);\n }\n\n this._treatAsBatchInput = treatAsBatchInput;\n this._batchSize = inputs.length;\n\n inputs.forEach((input, idx) => {\n if (isTensor3D(input)) {\n this._imageTensors[idx] = input;\n this._inputDimensions[idx] = input.shape;\n return;\n }\n\n if (isTensor4D(input)) {\n const batchSize = (input as any).shape[0];\n if (batchSize !== 1) {\n throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);\n }\n\n this._imageTensors[idx] = input;\n this._inputDimensions[idx] = (input as any).shape.slice(1);\n return;\n }\n\n const canvas = (input as any) instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input);\n this._canvases[idx] = canvas;\n this._inputDimensions[idx] = [canvas.height, canvas.width, 3];\n });\n }\n\n public get imageTensors(): Array {\n return this._imageTensors;\n }\n\n public get canvases(): HTMLCanvasElement[] {\n return this._canvases;\n }\n\n public get isBatchInput(): boolean {\n return this.batchSize > 1 || this._treatAsBatchInput;\n }\n\n public get batchSize(): number {\n return this._batchSize;\n }\n\n public get inputDimensions(): number[][] {\n return this._inputDimensions;\n }\n\n public get inputSize(): number | undefined {\n return this._inputSize;\n }\n\n public get reshapedInputDimensions(): Dimensions[] {\n return range(this.batchSize, 0, 1).map(\n (_, batchIdx) => this.getReshapedInputDimensions(batchIdx),\n );\n }\n\n public getInput(batchIdx: number): tf.Tensor3D | tf.Tensor4D | HTMLCanvasElement {\n return this.canvases[batchIdx] || this.imageTensors[batchIdx];\n }\n\n public getInputDimensions(batchIdx: number): number[] {\n return this._inputDimensions[batchIdx];\n }\n\n public getInputHeight(batchIdx: number): number {\n return this._inputDimensions[batchIdx][0];\n }\n\n public getInputWidth(batchIdx: number): number {\n return this._inputDimensions[batchIdx][1];\n }\n\n public getReshapedInputDimensions(batchIdx: number): Dimensions {\n if (typeof this.inputSize !== 'number') {\n throw new Error('getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet');\n }\n\n const width = this.getInputWidth(batchIdx);\n const height = this.getInputHeight(batchIdx);\n return computeReshapedDimensions({ width, height }, this.inputSize);\n }\n\n /**\n * Create a batch tensor from all input canvases and tensors\n * with size [batchSize, inputSize, inputSize, 3].\n *\n * @param inputSize Height and width of the tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The batch tensor.\n */\n public toBatchTensor(inputSize: number, isCenterInputs: boolean = true): tf.Tensor4D {\n this._inputSize = inputSize;\n\n return tf.tidy(() => {\n const inputTensors = range(this.batchSize, 0, 1).map((batchIdx) => {\n const input = this.getInput(batchIdx);\n\n if (input instanceof tf.Tensor) {\n let imgTensor = isTensor4D(input) ? input : tf.expandDims(input);\n imgTensor = padToSquare(imgTensor, isCenterInputs);\n\n if (imgTensor.shape[1] !== inputSize || imgTensor.shape[2] !== inputSize) {\n imgTensor = tf.image.resizeBilinear(imgTensor, [inputSize, inputSize], false, false);\n }\n\n return imgTensor.as3D(inputSize, inputSize, 3);\n }\n\n if (input instanceof env.getEnv().Canvas) {\n return tf.browser.fromPixels(imageToSquare(input, inputSize, isCenterInputs));\n }\n\n throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`);\n });\n\n const batchTensor = tf.stack(inputTensors.map((t) => tf.cast(t, 'float32'))).as4D(this.batchSize, inputSize, inputSize, 3);\n\n return batchTensor;\n });\n }\n}\n", "import { env } from '../env/index';\nimport { createCanvas, createCanvasFromMedia } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function imageToSquare(input: HTMLImageElement | HTMLCanvasElement, inputSize: number, centerImage: boolean = false) {\n const { Image, Canvas } = env.getEnv();\n\n if (!(input instanceof Image || input instanceof Canvas)) {\n throw new Error('imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement');\n }\n\n if (inputSize <= 0) return createCanvas({ width: 1, height: 1 });\n const dims = getMediaDimensions(input);\n const scale = inputSize / Math.max(dims.height, dims.width);\n const width = scale * dims.width;\n const height = scale * dims.height;\n\n const targetCanvas = createCanvas({ width: inputSize, height: inputSize });\n const inputCanvas = input instanceof Canvas ? input : createCanvasFromMedia(input);\n\n const offset = Math.abs(width - height) / 2;\n const dx = centerImage && width < height ? offset : 0;\n const dy = centerImage && height < width ? offset : 0;\n if (inputCanvas.width > 0 && inputCanvas.height > 0) getContext2dOrThrow(targetCanvas).drawImage(inputCanvas, dx, dy, width, height);\n\n return targetCanvas;\n}\n", "import { isTensor3D, isTensor4D } from '../utils/index';\nimport { awaitMediaLoaded } from './awaitMediaLoaded';\nimport { isMediaElement } from './isMediaElement';\nimport { NetInput } from './NetInput';\nimport { resolveInput } from './resolveInput';\nimport { TNetInput } from './types';\n\n/**\n * Validates the input to make sure, they are valid net inputs and awaits all media elements\n * to be finished loading.\n *\n * @param input The input, which can be a media element or an array of different media elements.\n * @returns A NetInput instance, which can be passed into one of the neural networks.\n */\nexport async function toNetInput(inputs: TNetInput): Promise {\n if (inputs instanceof NetInput) return inputs;\n const inputArgArray = Array.isArray(inputs) ? inputs : [inputs];\n if (!inputArgArray.length) throw new Error('toNetInput - empty array passed as input');\n const getIdxHint = (idx: number) => (Array.isArray(inputs) ? ` at input index ${idx}:` : '');\n const inputArray = inputArgArray.map(resolveInput);\n inputArray.forEach((input, i) => {\n if (!isMediaElement(input) && !isTensor3D(input) && !isTensor4D(input)) {\n if (typeof inputArgArray[i] === 'string') throw new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`);\n throw new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);\n }\n if (isTensor4D(input)) {\n // if tf.Tensor4D is passed in the input array, the batch size has to be 1\n const batchSize = input.shape[0];\n if (batchSize !== 1) throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);\n }\n });\n // wait for all media elements being loaded\n await Promise.all(inputArray.map((input) => isMediaElement(input) && awaitMediaLoaded(input)));\n return new NetInput(inputArray, Array.isArray(inputs));\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\nimport { Rect } from '../classes/Rect';\nimport { env } from '../env/index';\nimport { createCanvas } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { imageTensorToCanvas } from './imageTensorToCanvas';\nimport { toNetInput } from './toNetInput';\nimport { TNetInput } from './types';\n\n/**\n * Extracts the image regions containing the detected faces.\n *\n * @param input The image that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns The Canvases of the corresponding image region for each detected face.\n */\nexport async function extractFaces(input: TNetInput, detections: Array): Promise {\n const { Canvas } = env.getEnv();\n let canvas = input as HTMLCanvasElement;\n if (!(input instanceof Canvas)) {\n const netInput = await toNetInput(input);\n if (netInput.batchSize > 1) throw new Error('extractFaces - batchSize > 1 not supported');\n const tensorOrCanvas = netInput.getInput(0);\n canvas = tensorOrCanvas instanceof Canvas ? tensorOrCanvas : await imageTensorToCanvas(tensorOrCanvas);\n }\n const ctx = getContext2dOrThrow(canvas);\n const boxes = detections\n .map((det) => (det instanceof FaceDetection ? det.forSize(canvas.width, canvas.height).box.floor() : det))\n .map((box) => box.clipAtImageBorders(canvas.width, canvas.height));\n return boxes.map(({ x, y, width, height }) => {\n const faceImg = createCanvas({ width, height });\n if (width > 0 && height > 0) getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x, y, width, height), 0, 0);\n return faceImg;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isTensor3D, isTensor4D } from '../utils/index';\n\n/**\n * Extracts the tensors of the image regions containing the detected faces.\n * Useful if you want to compute the face descriptors for the face images.\n * Using this method is faster then extracting a canvas for each face and\n * converting them to tensors individually.\n *\n * @param imageTensor The image tensor that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns Tensors of the corresponding image region for each detected face.\n */\nexport async function extractFaceTensors(imageTensor: tf.Tensor3D | tf.Tensor4D, detections: Array): Promise {\n if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) {\n throw new Error('extractFaceTensors - expected image tensor to be 3D or 4D');\n }\n\n if (isTensor4D(imageTensor) && imageTensor.shape[0] > 1) {\n throw new Error('extractFaceTensors - batchSize > 1 not supported');\n }\n\n return tf.tidy(() => {\n const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0);\n\n const boxes = detections\n .map((det) => (det instanceof FaceDetection\n ? det.forSize(imgWidth, imgHeight).box\n : det))\n .map((box) => box.clipAtImageBorders(imgWidth, imgHeight));\n\n const faceTensors = boxes.map(({\n x, y, width, height,\n }) => tf.slice3d(imageTensor.as3D(imgHeight, imgWidth, numChannels), [y, x, 0], [height, width, numChannels]));\n\n return faceTensors;\n });\n}\n", "import { env } from '../env/index';\n\nexport async function fetchOrThrow(\n url: string,\n // eslint-disable-next-line no-undef\n init?: RequestInit,\n): Promise {\n const { fetch } = env.getEnv();\n const res = await fetch(url, init);\n if (!(res.status < 400)) {\n throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);\n }\n return res;\n}\n", "import { bufferToImage } from './bufferToImage';\nimport { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchImage(uri: string): Promise {\n const res = await fetchOrThrow(uri);\n const blob = await (res).blob();\n\n if (!blob.type.startsWith('image/')) {\n throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);\n }\n return bufferToImage(blob);\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchJson(uri: string): Promise {\n return (await fetchOrThrow(uri)).json();\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchNetWeights(uri: string): Promise {\n return new Float32Array(await (await fetchOrThrow(uri)).arrayBuffer());\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { getModelUris } from '../common/getModelUris';\nimport { fetchJson } from './fetchJson';\n\nexport async function loadWeightMap(\n uri: string | undefined,\n defaultModelName: string,\n): Promise {\n const { manifestUri, modelBaseUri } = getModelUris(uri, defaultModelName);\n const manifest = await fetchJson(manifestUri);\n // if (manifest['weightsManifest']) manifest = manifest['weightsManifest'];\n return tf.io.loadWeights(manifest, modelBaseUri);\n}\n", "export function getModelUris(uri: string | undefined, defaultModelName: string) {\n const defaultManifestFilename = `${defaultModelName}-weights_manifest.json`;\n\n if (!uri) {\n return {\n modelBaseUri: '',\n manifestUri: defaultManifestFilename,\n };\n }\n\n if (uri === '/') {\n return {\n modelBaseUri: '/',\n manifestUri: `/${defaultManifestFilename}`,\n };\n }\n // eslint-disable-next-line no-nested-ternary\n const protocol = uri.startsWith('http://') ? 'http://' : uri.startsWith('https://') ? 'https://' : '';\n uri = uri.replace(protocol, '');\n\n const parts = uri.split('/').filter((s) => s);\n\n const manifestFile = uri.endsWith('.json')\n ? parts[parts.length - 1]\n : defaultManifestFilename;\n\n let modelBaseUri = protocol + (uri.endsWith('.json') ? parts.slice(0, parts.length - 1) : parts).join('/');\n modelBaseUri = uri.startsWith('/') ? `/${modelBaseUri}` : modelBaseUri;\n\n return {\n modelBaseUri,\n manifestUri: modelBaseUri === '/' ? `/${manifestFile}` : `${modelBaseUri}/${manifestFile}`,\n };\n}\n", "import { IDimensions } from '../classes/index';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function matchDimensions(input: IDimensions, reference: IDimensions, useMediaDimensions: boolean = false) {\n const { width, height } = useMediaDimensions\n ? getMediaDimensions(reference)\n : reference;\n input.width = width;\n input.height = height;\n return { width, height };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { denseBlock4 } from './denseBlock';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { FaceFeatureExtractorParams, IFaceFeatureExtractor } from './types';\n\nexport class FaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n constructor() {\n super('FaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('FaceFeatureExtractor - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = denseBlock4(normalized, params.dense0, true);\n out = denseBlock4(out, params.dense1);\n out = denseBlock4(out, params.dense2);\n out = denseBlock4(out, params.dense3);\n out = tf.avgPool(out, [7, 7], [2, 2], 'valid');\n\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import * as tf from '../dist/tfjs.esm';\n\nimport { ParamMapping } from './common/index';\nimport { getModelUris } from './common/getModelUris';\nimport { loadWeightMap } from './dom/index';\nimport { env } from './env/index';\n\nexport abstract class NeuralNetwork {\n constructor(name: string) {\n this._name = name;\n }\n\n protected _params: TNetParams | undefined = undefined\n\n protected _paramMappings: ParamMapping[] = []\n\n public _name: any;\n\n public get params(): TNetParams | undefined { return this._params; }\n\n public get paramMappings(): ParamMapping[] { return this._paramMappings; }\n\n public get isLoaded(): boolean { return !!this.params; }\n\n public getParamFromPath(paramPath: string): tf.Tensor {\n const { obj, objProp } = this.traversePropertyPath(paramPath);\n return obj[objProp];\n }\n\n public reassignParamFromPath(paramPath: string, tensor: tf.Tensor) {\n const { obj, objProp } = this.traversePropertyPath(paramPath);\n obj[objProp].dispose();\n obj[objProp] = tensor;\n }\n\n public getParamList() {\n return this._paramMappings.map(({ paramPath }) => ({\n path: paramPath,\n tensor: this.getParamFromPath(paramPath),\n }));\n }\n\n public getTrainableParams() {\n return this.getParamList().filter((param) => param.tensor instanceof tf.Variable);\n }\n\n public getFrozenParams() {\n return this.getParamList().filter((param) => !(param.tensor instanceof tf.Variable));\n }\n\n public variable() {\n this.getFrozenParams().forEach(({ path, tensor }) => {\n this.reassignParamFromPath(path, tensor.variable());\n });\n }\n\n public freeze() {\n this.getTrainableParams().forEach(({ path, tensor: variable }) => {\n const tensor = tf.tensor(variable.dataSync());\n variable.dispose();\n this.reassignParamFromPath(path, tensor);\n });\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.getParamList().forEach((param) => {\n if (throwOnRedispose && param.tensor.isDisposed) {\n throw new Error(`param tensor has already been disposed for path ${param.path}`);\n }\n param.tensor.dispose();\n });\n this._params = undefined;\n }\n\n public serializeParams(): Float32Array {\n return new Float32Array(\n this.getParamList()\n .map(({ tensor }) => Array.from(tensor.dataSync()) as number[])\n .reduce((flat, arr) => flat.concat(arr)),\n );\n }\n\n public async load(weightsOrUrl: Float32Array | string | undefined): Promise {\n if (weightsOrUrl instanceof Float32Array) {\n this.extractWeights(weightsOrUrl);\n return;\n }\n await this.loadFromUri(weightsOrUrl);\n }\n\n public async loadFromUri(uri: string | undefined) {\n if (uri && typeof uri !== 'string') {\n throw new Error(`${this._name}.loadFromUri - expected model uri`);\n }\n const weightMap = await loadWeightMap(uri, this.getDefaultModelName());\n this.loadFromWeightMap(weightMap);\n }\n\n public async loadFromDisk(filePath: string | undefined) {\n if (filePath && typeof filePath !== 'string') {\n throw new Error(`${this._name}.loadFromDisk - expected model file path`);\n }\n const { readFile } = env.getEnv();\n const { manifestUri, modelBaseUri } = getModelUris(filePath, this.getDefaultModelName());\n const fetchWeightsFromDisk = (filePaths: string[]) => Promise.all(filePaths.map((fp) => readFile(fp).then((buf) => buf.buffer)));\n const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk);\n const manifest = JSON.parse((await readFile(manifestUri)).toString());\n const weightMap = await loadWeights(manifest, modelBaseUri);\n this.loadFromWeightMap(weightMap);\n }\n\n public loadFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { paramMappings, params } = this.extractParamsFromWeightMap(weightMap);\n this._paramMappings = paramMappings;\n this._params = params;\n }\n\n public extractWeights(weights: Float32Array) {\n const { paramMappings, params } = this.extractParams(weights);\n this._paramMappings = paramMappings;\n this._params = params;\n }\n\n private traversePropertyPath(paramPath: string) {\n if (!this.params) {\n throw new Error('traversePropertyPath - model has no loaded params');\n }\n\n const result = paramPath.split('/').reduce((res: { nextObj: any, obj?: any, objProp?: string }, objProp) => {\n // eslint-disable-next-line no-prototype-builtins\n if (!res.nextObj.hasOwnProperty(objProp)) {\n throw new Error(`traversePropertyPath - object does not have property ${objProp}, for path ${paramPath}`);\n }\n return { obj: res.nextObj, objProp, nextObj: res.nextObj[objProp] };\n }, { nextObj: this.params });\n\n const { obj, objProp } = result;\n if (!obj || !objProp || !(obj[objProp] instanceof tf.Tensor)) {\n throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);\n }\n\n return { obj, objProp };\n }\n\n protected abstract getDefaultModelName(): string\n\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TNetParams, paramMappings: ParamMapping[] }\n\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParams(weights: Float32Array): { params: TNetParams, paramMappings: ParamMapping[] }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, SeparableConvParams } from '../common/index';\nimport { depthwiseSeparableConv } from '../common/depthwiseSeparableConv';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function denseBlock3(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock3Params,\n isFirstLayer: boolean = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, [2, 2], 'same'),\n denseBlockParams.conv0.bias,\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, [2, 2]),\n ) as tf.Tensor4D;\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]);\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D;\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]);\n\n return tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D;\n });\n}\n\nexport function denseBlock4(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock4Params,\n isFirstLayer: boolean = false,\n isScaleDown: boolean = true,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, isScaleDown ? [2, 2] : [1, 1], 'same'),\n denseBlockParams.conv0.bias,\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, isScaleDown ? [2, 2] : [1, 1]),\n ) as tf.Tensor4D;\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]);\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D;\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]);\n\n const in4 = tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D;\n const out4 = depthwiseSeparableConv(in4, denseBlockParams.conv3, [1, 1]);\n\n return tf.relu(tf.add(out1, tf.add(out2, tf.add(out3, out4)))) as tf.Tensor4D;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { SeparableConvParams } from './types';\n\nexport function depthwiseSeparableConv(\n x: tf.Tensor4D,\n params: SeparableConvParams,\n stride: [number, number],\n): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.separableConv2d(x, params.depthwise_filter, params.pointwise_filter, stride, 'same');\n out = tf.add(out, params.bias);\n return out;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from './types';\n\nexport function convLayer(\n x: tf.Tensor4D,\n params: ConvParams,\n padding: 'valid' | 'same' = 'same',\n withRelu: boolean = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out = tf.add(\n tf.conv2d(x, params.filters, [1, 1], padding),\n params.bias,\n ) as tf.Tensor4D;\n\n return withRelu ? tf.relu(out) : out;\n });\n}\n", "import { ParamMapping } from './types';\n\nexport function disposeUnusedWeightTensors(weightMap: any, paramMappings: ParamMapping[]) {\n Object.keys(weightMap).forEach((path) => {\n if (!paramMappings.some((pm) => pm.originalPath === path)) {\n weightMap[path].dispose();\n }\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, ExtractWeightsFunction, ParamMapping } from './types';\n\nexport function extractConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvParams => {\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut],\n );\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return { filters, bias };\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, FCParams, ParamMapping } from './types';\n\nexport function extractFCParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string,\n ): FCParams => {\n const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]);\n const fc_bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return {\n weights: fc_weights,\n bias: fc_bias,\n };\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, ParamMapping, SeparableConvParams } from './types';\n\nexport function extractSeparableConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (channelsIn: number, channelsOut: number, mappedPrefix: string): SeparableConvParams => {\n const depthwise_filter = tf.tensor4d(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1]);\n const pointwise_filter = tf.tensor4d(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut]);\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/depthwise_filter` },\n { paramPath: `${mappedPrefix}/pointwise_filter` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias,\n );\n };\n}\n\nexport function loadSeparableConvParamsFactory(\n // eslint-disable-next-line no-unused-vars\n extractWeightEntry: (originalPath: string, paramRank: number) => T,\n) {\n return (prefix: string): SeparableConvParams => {\n const depthwise_filter = extractWeightEntry(`${prefix}/depthwise_filter`, 4);\n const pointwise_filter = extractWeightEntry(`${prefix}/pointwise_filter`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias,\n );\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\n// eslint-disable-next-line no-unused-vars\nexport type ExtractWeightsFunction = (numWeights: number) => Float32Array\n\nexport type ParamMapping = {\n originalPath?: string\n paramPath: string\n}\n\nexport type ConvParams = {\n filters: tf.Tensor4D\n bias: tf.Tensor1D\n}\n\nexport type FCParams = {\n weights: tf.Tensor2D\n bias: tf.Tensor1D\n}\n\nexport class SeparableConvParams {\n // eslint-disable-next-line no-useless-constructor\n constructor(\n // eslint-disable-next-line no-unused-vars\n public depthwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public pointwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public bias: tf.Tensor1D,\n // eslint-disable-next-line no-empty-function\n ) {}\n}\n", "import { isTensor } from '../utils/index';\nimport { ParamMapping } from './types';\n\nexport function extractWeightEntryFactory(weightMap: any, paramMappings: ParamMapping[]) {\n return (originalPath: string, paramRank: number, mappedPath?: string) => {\n const tensor = weightMap[originalPath];\n\n if (!isTensor(tensor, paramRank)) {\n throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor}`);\n }\n\n paramMappings.push(\n { originalPath, paramPath: mappedPath || originalPath },\n );\n\n return tensor;\n };\n}\n", "export function extractWeightsFactory(weights: Float32Array) {\n let remainingWeights = weights;\n\n function extractWeights(numWeights: number): Float32Array {\n const ret = remainingWeights.slice(0, numWeights);\n remainingWeights = remainingWeights.slice(numWeights);\n return ret;\n }\n\n function getRemainingWeights(): Float32Array {\n return remainingWeights;\n }\n\n return {\n extractWeights,\n getRemainingWeights,\n };\n}\n", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, ExtractWeightsFunction, ParamMapping } from '../common/index';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n function extractDenseBlock3Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock3Params {\n const conv0 = isFirstLayer\n ? extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv0`)\n : extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/conv0`);\n const conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv1`);\n const conv2 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv2`);\n\n return { conv0, conv1, conv2 };\n }\n\n function extractDenseBlock4Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock4Params {\n const { conv0, conv1, conv2 } = extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer);\n const conv3 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv3`);\n\n return {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractDenseBlock4Params,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const dense0 = extractDenseBlock4Params(3, 32, 'dense0', true);\n const dense1 = extractDenseBlock4Params(32, 64, 'dense1');\n const dense2 = extractDenseBlock4Params(64, 128, 'dense2');\n const dense3 = extractDenseBlock4Params(128, 256, 'dense3');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: {\n dense0, dense1, dense2, dense3,\n },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from './types';\n\n// eslint-disable-next-line no-unused-vars\nexport function loadConvParamsFactory(extractWeightEntry: (originalPath: string, paramRank: number) => T) {\n return (prefix: string): ConvParams => {\n const filters = extractWeightEntry(`${prefix}/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n\n return { filters, bias };\n };\n}\n", "import { extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry);\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n\n function extractDenseBlock3Params(prefix: string, isFirstLayer: boolean = false): DenseBlock3Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`);\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`);\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`);\n\n return { conv0, conv1, conv2 };\n }\n\n function extractDenseBlock4Params(prefix: string, isFirstLayer: boolean = false): DenseBlock4Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`);\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`);\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`);\n const conv3 = extractSeparableConvParams(`${prefix}/conv3`);\n\n return {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractDenseBlock4Params,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const params = {\n dense0: extractDenseBlock4Params('dense0', true),\n dense1: extractDenseBlock4Params('dense1'),\n dense2: extractDenseBlock4Params('dense2'),\n dense3: extractDenseBlock4Params('dense3'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { NetInput } from '../dom/index';\nimport { FaceFeatureExtractorParams, IFaceFeatureExtractor, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { NetParams } from './types';\nimport { seperateWeightMaps } from './util';\n\nexport abstract class FaceProcessor<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends NeuralNetwork {\n protected _faceFeatureExtractor: IFaceFeatureExtractor\n\n constructor(_name: string, faceFeatureExtractor: IFaceFeatureExtractor) {\n super(_name);\n this._faceFeatureExtractor = faceFeatureExtractor;\n }\n\n public get faceFeatureExtractor(): IFaceFeatureExtractor {\n return this._faceFeatureExtractor;\n }\n\n protected abstract getDefaultModelName(): string\n\n protected abstract getClassifierChannelsIn(): number\n\n protected abstract getClassifierChannelsOut(): number\n\n public runNet(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n const { params } = this;\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`);\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input;\n return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0], -1), params.fc);\n });\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose);\n super.dispose(throwOnRedispose);\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights);\n this._params = params;\n this._paramMappings = paramMappings;\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights, this.getClassifierChannelsIn(), this.getClassifierChannelsOut());\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeightMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\n const cIn = this.getClassifierChannelsIn();\n const cOut = this.getClassifierChannelsOut();\n const classifierWeightSize = (cOut * cIn) + cOut;\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize);\n const classifierWeights = weights.slice(weights.length - classifierWeightSize);\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights);\n return this.extractClassifierParams(classifierWeights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from './types';\n\nexport function fullyConnectedLayer(\n x: tf.Tensor2D,\n params: FCParams,\n): tf.Tensor2D {\n return tf.tidy(() => tf.add(\n tf.matMul(x, params.weights),\n params.bias,\n ));\n}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array, channelsIn: number, channelsOut: number): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings);\n\n const fc = extractFCParams(channelsIn, channelsOut, 'fc');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { fc },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { weights, bias };\n }\n\n const params = {\n fc: extractFcParams('fc'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function seperateWeightMaps(weightMap: tf.NamedTensorMap) {\n const featureExtractorMap: tf.NamedTensorMap = {};\n const classifierMap: tf.NamedTensorMap = {};\n\n Object.keys(weightMap).forEach((key) => {\n const map = key.startsWith('fc') ? classifierMap : featureExtractorMap;\n map[key] = weightMap[key];\n });\n\n return { featureExtractorMap, classifierMap };\n}\n", "export const FACE_EXPRESSION_LABELS = ['neutral', 'happy', 'sad', 'angry', 'fearful', 'disgusted', 'surprised'];\n\nexport class FaceExpressions {\n public neutral: number\n\n public happy: number\n\n public sad: number\n\n public angry: number\n\n public fearful: number\n\n public disgusted: number\n\n public surprised: number\n\n constructor(probabilities: number[] | Float32Array) {\n if (probabilities.length !== 7) {\n throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);\n }\n\n FACE_EXPRESSION_LABELS.forEach((expression, idx) => {\n this[expression] = probabilities[idx];\n });\n }\n\n asSortedArray() {\n return FACE_EXPRESSION_LABELS\n .map((expression) => ({ expression, probability: this[expression] as number }))\n .sort((e0, e1) => e1.probability - e0.probability);\n }\n}\n", "import { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\n\nexport type WithFaceExpressions = TSource & {\n expressions: FaceExpressions\n}\n\nexport function isWithFaceExpressions(obj: any): obj is WithFaceExpressions<{}> {\n return obj.expressions instanceof FaceExpressions;\n}\n\nexport function extendWithFaceExpressions<\n TSource\n>(\n sourceObj: TSource,\n expressions: FaceExpressions,\n): WithFaceExpressions {\n const extension = { expressions };\n return { ...sourceObj, ...extension };\n}\n", "import { IPoint, Point } from '../classes/index';\nimport { FaceExpressions } from '../faceExpressionNet/index';\nimport { isWithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { round } from '../utils/index';\nimport { DrawTextField } from './DrawTextField';\n\nexport type DrawFaceExpressionsInput = FaceExpressions | WithFaceExpressions<{}>\n\nexport function drawFaceExpressions(\n canvasArg: string | HTMLCanvasElement,\n faceExpressions: DrawFaceExpressionsInput | Array,\n minConfidence = 0.1,\n textFieldAnchor?: IPoint,\n) {\n const faceExpressionsArray = Array.isArray(faceExpressions) ? faceExpressions : [faceExpressions];\n\n faceExpressionsArray.forEach((e) => {\n // eslint-disable-next-line no-nested-ternary\n const expr = e instanceof FaceExpressions\n ? e\n : (isWithFaceExpressions(e) ? e.expressions : undefined);\n if (!expr) {\n throw new Error('drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof');\n }\n\n const sorted = expr.asSortedArray();\n const resultsToDisplay = sorted.filter((exprLocal) => exprLocal.probability > minConfidence);\n\n const anchor = isWithFaceDetection(e)\n ? e.detection.box.bottomLeft\n : (textFieldAnchor || new Point(0, 0));\n\n const drawTextField = new DrawTextField(\n resultsToDisplay.map((exprLocal) => `${exprLocal.expression} (${round(exprLocal.probability)})`),\n anchor,\n );\n drawTextField.draw(canvasArg);\n });\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { isWithFaceDetection, WithFaceDetection } from './WithFaceDetection';\n\nexport type WithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 > = TSource & {\n landmarks: TFaceLandmarks,\n unshiftedLandmarks: TFaceLandmarks,\n alignedRect: FaceDetection,\n angle: { roll: number | undefined, pitch: number | undefined, yaw: number | undefined },\n }\n\nexport function isWithFaceLandmarks(obj: any): obj is WithFaceLandmarks, FaceLandmarks> {\n return isWithFaceDetection(obj)\n // eslint-disable-next-line dot-notation\n && obj['landmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['unshiftedLandmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['alignedRect'] instanceof FaceDetection;\n}\n\nfunction calculateFaceAngle(mesh) {\n // returns the angle in the plane (in radians) between the positive x-axis and the ray from (0,0) to the point (x,y)\n const radians = (a1, a2, b1, b2) => (Math.atan2(b2 - a2, b1 - a1) % Math.PI);\n // convert radians to degrees\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const degrees = (theta) => (theta * 180) / Math.PI;\n\n const angle = { roll: undefined, pitch: undefined, yaw: undefined };\n\n if (!mesh || !mesh._positions || mesh._positions.length !== 68) return angle;\n const pt = mesh._positions;\n\n // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees\n // value of 0 means center\n\n // roll is face lean from left to right\n // comparing x,y of outside corners of leftEye and rightEye\n angle.roll = -radians(pt[36]._x, pt[36]._y, pt[45]._x, pt[45]._y);\n\n // pitch is face turn from left right\n // comparing x distance of top of nose to left and right edge of face\n // precision is lacking since coordinates are not precise enough\n angle.pitch = radians(0, Math.abs(pt[0]._x - pt[30]._x) / pt[30]._x, Math.PI, Math.abs(pt[16]._x - pt[30]._x) / pt[30]._x);\n\n // yaw is face move from up to down\n // comparing size of the box around the face with top and bottom of detected landmarks\n // silly hack, but this gives us face compression on y-axis\n // e.g., tilting head up hides the forehead that doesn't have any landmarks so ratio drops\n const bottom = pt.reduce((prev, cur) => (prev < cur._y ? prev : cur._y), +Infinity);\n const top = pt.reduce((prev, cur) => (prev > cur._y ? prev : cur._y), -Infinity);\n angle.yaw = Math.PI * (mesh._imgDims._height / (top - bottom) / 1.40 - 1);\n\n return angle;\n}\n\nexport function extendWithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 >(sourceObj: TSource, unshiftedLandmarks: TFaceLandmarks): WithFaceLandmarks {\n const { box: shift } = sourceObj.detection;\n const landmarks = unshiftedLandmarks.shiftBy(shift.x, shift.y);\n\n const rect = landmarks.align();\n const { imageDims } = sourceObj.detection;\n const alignedRect = new FaceDetection(sourceObj.detection.score, rect.rescale(imageDims.reverse()), imageDims);\n const angle = calculateFaceAngle(unshiftedLandmarks);\n\n const extension = {\n landmarks,\n unshiftedLandmarks,\n alignedRect,\n angle,\n };\n\n return { ...sourceObj, ...extension };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { IPoint } from '../classes/index';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { drawContour } from './drawContour';\n\nexport interface IDrawFaceLandmarksOptions {\n drawLines?: boolean\n drawPoints?: boolean\n lineWidth?: number\n pointSize?: number\n lineColor?: string\n pointColor?: string\n}\n\nexport class DrawFaceLandmarksOptions {\n public drawLines: boolean\n\n public drawPoints: boolean\n\n public lineWidth: number\n\n public pointSize: number\n\n public lineColor: string\n\n public pointColor: string\n\n constructor(options: IDrawFaceLandmarksOptions = {}) {\n const {\n drawLines = true, drawPoints = true, lineWidth, lineColor, pointSize, pointColor,\n } = options;\n this.drawLines = drawLines;\n this.drawPoints = drawPoints;\n this.lineWidth = lineWidth || 1;\n this.pointSize = pointSize || 2;\n this.lineColor = lineColor || 'rgba(0, 255, 255, 1)';\n this.pointColor = pointColor || 'rgba(255, 0, 255, 1)';\n }\n}\n\nexport class DrawFaceLandmarks {\n public faceLandmarks: FaceLandmarks\n\n public options: DrawFaceLandmarksOptions\n\n constructor(\n faceLandmarks: FaceLandmarks,\n options: IDrawFaceLandmarksOptions = {},\n ) {\n this.faceLandmarks = faceLandmarks;\n this.options = new DrawFaceLandmarksOptions(options);\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg);\n\n const {\n drawLines, drawPoints, lineWidth, lineColor, pointSize, pointColor,\n } = this.options;\n\n if (drawLines && this.faceLandmarks instanceof FaceLandmarks68) {\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n drawContour(ctx, this.faceLandmarks.getJawOutline());\n drawContour(ctx, this.faceLandmarks.getLeftEyeBrow());\n drawContour(ctx, this.faceLandmarks.getRightEyeBrow());\n drawContour(ctx, this.faceLandmarks.getNose());\n drawContour(ctx, this.faceLandmarks.getLeftEye(), true);\n drawContour(ctx, this.faceLandmarks.getRightEye(), true);\n drawContour(ctx, this.faceLandmarks.getMouth(), true);\n }\n\n if (drawPoints) {\n ctx.strokeStyle = pointColor;\n ctx.fillStyle = pointColor;\n\n const drawPoint = (pt: IPoint) => {\n ctx.beginPath();\n ctx.arc(pt.x, pt.y, pointSize, 0, 2 * Math.PI);\n ctx.fill();\n };\n this.faceLandmarks.positions.forEach(drawPoint);\n }\n }\n}\n\nexport type DrawFaceLandmarksInput = FaceLandmarks | WithFaceLandmarks>\n\nexport function drawFaceLandmarks(\n canvasArg: string | HTMLCanvasElement,\n faceLandmarks: DrawFaceLandmarksInput | Array,\n) {\n const faceLandmarksArray = Array.isArray(faceLandmarks) ? faceLandmarks : [faceLandmarks];\n faceLandmarksArray.forEach((f) => {\n // eslint-disable-next-line no-nested-ternary\n const landmarks = f instanceof FaceLandmarks\n ? f\n : (isWithFaceLandmarks(f) ? f.landmarks : undefined);\n if (!landmarks) {\n throw new Error('drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof');\n }\n\n new DrawFaceLandmarks(landmarks).draw(canvasArg);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { seperateWeightMaps } from '../faceProcessor/util';\nimport { TinyXception } from '../xception/TinyXception';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { AgeAndGenderPrediction, Gender, NetOutput, NetParams } from './types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\n\nexport class AgeGenderNet extends NeuralNetwork {\n private _faceFeatureExtractor: TinyXception\n\n constructor(faceFeatureExtractor: TinyXception = new TinyXception(2)) {\n super('AgeGenderNet');\n this._faceFeatureExtractor = faceFeatureExtractor;\n }\n\n public get faceFeatureExtractor(): TinyXception {\n return this._faceFeatureExtractor;\n }\n\n public runNet(input: NetInput | tf.Tensor4D): NetOutput {\n const { params } = this;\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`);\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input;\n\n const pooled = tf.avgPool(bottleneckFeatures, [7, 7], [2, 2], 'valid').as2D(bottleneckFeatures.shape[0], -1);\n const age = fullyConnectedLayer(pooled, params.fc.age).as1D();\n const gender = fullyConnectedLayer(pooled, params.fc.gender);\n return { age, gender };\n });\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): NetOutput {\n return tf.tidy(() => {\n const { age, gender } = this.runNet(input);\n return { age, gender: tf.softmax(gender) };\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async predictAgeAndGender(input: TNetInput): Promise {\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput);\n\n const ages = tf.unstack(out.age);\n const genders = tf.unstack(out.gender);\n const ageAndGenderTensors = ages.map((ageTensor, i) => ({\n ageTensor,\n genderTensor: genders[i],\n }));\n\n const predictionsByBatch = await Promise.all(\n ageAndGenderTensors.map(async ({ ageTensor, genderTensor }) => {\n const age = (ageTensor.dataSync())[0];\n const probMale = (genderTensor.dataSync())[0];\n const isMale = probMale > 0.5;\n const gender = isMale ? Gender.MALE : Gender.FEMALE;\n const genderProbability = isMale ? probMale : (1 - probMale);\n\n ageTensor.dispose();\n genderTensor.dispose();\n return { age, gender, genderProbability };\n }),\n );\n out.age.dispose();\n out.gender.dispose();\n\n return netInput.isBatchInput ? predictionsByBatch as AgeAndGenderPrediction[] : predictionsByBatch[0] as AgeAndGenderPrediction;\n }\n\n protected getDefaultModelName(): string {\n return 'age_gender_model';\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose);\n super.dispose(throwOnRedispose);\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights);\n this._params = params;\n this._paramMappings = paramMappings;\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights);\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeightMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\n const classifierWeightSize = (512 * 1 + 1) + (512 * 2 + 2);\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize);\n const classifierWeights = weights.slice(weights.length - classifierWeightSize);\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights);\n return this.extractClassifierParams(classifierWeights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, depthwiseSeparableConv } from '../common/index';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { range } from '../utils/index';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction conv(x: tf.Tensor4D, params: ConvParams, stride: [number, number]): tf.Tensor4D {\n return tf.add(tf.conv2d(x, params.filters, stride, 'same'), params.bias);\n}\n\nfunction reductionBlock(x: tf.Tensor4D, params: ReductionBlockParams, isActivateInput: boolean = true): tf.Tensor4D {\n let out = isActivateInput ? tf.relu(x) : x;\n out = depthwiseSeparableConv(out, params.separable_conv0, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1]);\n out = tf.maxPool(out, [3, 3], [2, 2], 'same');\n out = tf.add(out, conv(x, params.expansion_conv, [2, 2]));\n return out;\n}\n\nfunction mainBlock(x: tf.Tensor4D, params: MainBlockParams): tf.Tensor4D {\n let out = depthwiseSeparableConv(tf.relu(x), params.separable_conv0, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv2, [1, 1]);\n out = tf.add(out, x);\n return out;\n}\n\nexport class TinyXception extends NeuralNetwork {\n private _numMainBlocks: number\n\n constructor(numMainBlocks: number) {\n super('TinyXception');\n this._numMainBlocks = numMainBlocks;\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n if (!params) {\n throw new Error('TinyXception - load model before inference');\n }\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n let out = tf.relu(conv(normalized, params.entry_flow.conv_in, [2, 2]));\n out = reductionBlock(out, params.entry_flow.reduction_block_0, false);\n out = reductionBlock(out, params.entry_flow.reduction_block_1);\n range(this._numMainBlocks, 0, 1).forEach((idx) => {\n out = mainBlock(out, params.middle_flow[`main_block_${idx}`]);\n });\n out = reductionBlock(out, params.exit_flow.reduction_block);\n out = tf.relu(depthwiseSeparableConv(out, params.exit_flow.separable_conv, [1, 1]));\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'tiny_xception_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap, this._numMainBlocks);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights, this._numMainBlocks);\n }\n}\n", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, extractWeightsFactory } from '../common/index';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n function extractReductionBlockParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ReductionBlockParams {\n const separable_conv0 = extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/separable_conv1`);\n const expansion_conv = extractConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/expansion_conv`);\n\n return { separable_conv0, separable_conv1, expansion_conv };\n }\n\n function extractMainBlockParams(channels: number, mappedPrefix: string): MainBlockParams {\n const separable_conv0 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv1`);\n const separable_conv2 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv2`);\n\n return { separable_conv0, separable_conv1, separable_conv2 };\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n };\n}\n\nexport function extractParams(weights: Float32Array, numMainBlocks: number): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const entry_flow_conv_in = extractConvParams(3, 32, 3, 'entry_flow/conv_in');\n const entry_flow_reduction_block_0 = extractReductionBlockParams(32, 64, 'entry_flow/reduction_block_0');\n const entry_flow_reduction_block_1 = extractReductionBlockParams(64, 128, 'entry_flow/reduction_block_1');\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1,\n };\n\n const middle_flow = {};\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(128, `middle_flow/main_block_${idx}`);\n });\n\n const exit_flow_reduction_block = extractReductionBlockParams(128, 256, 'exit_flow/reduction_block');\n const exit_flow_separable_conv = extractSeparableConvParams(256, 512, 'exit_flow/separable_conv');\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv,\n };\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { entry_flow, middle_flow, exit_flow },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry);\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n\n function extractReductionBlockParams(mappedPrefix: string): ReductionBlockParams {\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`);\n const expansion_conv = extractConvParams(`${mappedPrefix}/expansion_conv`);\n\n return { separable_conv0, separable_conv1, expansion_conv };\n }\n\n function extractMainBlockParams(mappedPrefix: string): MainBlockParams {\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`);\n const separable_conv2 = extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);\n\n return { separable_conv0, separable_conv1, separable_conv2 };\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n numMainBlocks: number,\n): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const entry_flow_conv_in = extractConvParams('entry_flow/conv_in');\n const entry_flow_reduction_block_0 = extractReductionBlockParams('entry_flow/reduction_block_0');\n const entry_flow_reduction_block_1 = extractReductionBlockParams('entry_flow/reduction_block_1');\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1,\n };\n\n const middle_flow = {};\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(`middle_flow/main_block_${idx}`);\n });\n\n const exit_flow_reduction_block = extractReductionBlockParams('exit_flow/reduction_block');\n const exit_flow_separable_conv = extractSeparableConvParams('exit_flow/separable_conv');\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv,\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params: { entry_flow, middle_flow, exit_flow }, paramMappings };\n}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings);\n\n const age = extractFCParams(512, 1, 'fc/age');\n const gender = extractFCParams(512, 2, 'fc/gender');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { fc: { age, gender } },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { weights, bias };\n }\n\n const params = {\n fc: {\n age: extractFcParams('fc/age'),\n gender: extractFcParams('fc/gender'),\n },\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from '../common/index';\n\n// eslint-disable-next-line no-shadow\nexport enum Gender {\n // eslint-disable-next-line no-unused-vars\n FEMALE = 'female',\n // eslint-disable-next-line no-unused-vars\n MALE = 'male'\n}\n\nexport type AgeAndGenderPrediction = {\n age: number\n gender: Gender\n genderProbability: number\n}\n\nexport type NetOutput = { age: tf.Tensor1D, gender: tf.Tensor2D }\n\nexport type NetParams = {\n fc: {\n age: FCParams\n gender: FCParams\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { IDimensions, Point } from '../classes/index';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { FaceFeatureExtractorParams, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { isEven } from '../utils/index';\n\nexport abstract class FaceLandmark68NetBase<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends FaceProcessor {\n public postProcess(output: tf.Tensor2D, inputSize: number, originalDimensions: IDimensions[]): tf.Tensor2D {\n const inputDimensions = originalDimensions.map(({ width, height }) => {\n const scale = inputSize / Math.max(height, width);\n return {\n width: width * scale,\n height: height * scale,\n };\n });\n\n const batchSize = inputDimensions.length;\n\n return tf.tidy(() => {\n const createInterleavedTensor = (fillX: number, fillY: number) => tf.stack([tf.fill([68], fillX, 'float32'), tf.fill([68], fillY, 'float32')], 1).as2D(1, 136).as1D();\n\n // eslint-disable-next-line no-unused-vars\n const getPadding = (batchIdx: number, cond: (w: number, h: number) => boolean): number => {\n const { width, height } = inputDimensions[batchIdx];\n return cond(width, height) ? Math.abs(width - height) / 2 : 0;\n };\n\n const getPaddingX = (batchIdx: number) => getPadding(batchIdx, (w, h) => w < h);\n const getPaddingY = (batchIdx: number) => getPadding(batchIdx, (w, h) => h < w);\n\n const landmarkTensors = output\n .mul(tf.fill([batchSize, 136], inputSize, 'float32'))\n .sub(tf.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(\n getPaddingX(batchIdx),\n getPaddingY(batchIdx),\n ))))\n .div(tf.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(\n inputDimensions[batchIdx].width,\n inputDimensions[batchIdx].height,\n ))));\n\n return landmarkTensors as tf.Tensor2D;\n });\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n return tf.tidy(() => {\n const out = this.runNet(input);\n return this.postProcess(\n out,\n input.inputSize as number,\n input.inputDimensions.map(([height, width]) => ({ height, width })),\n );\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async detectLandmarks(input: TNetInput): Promise {\n const netInput = await toNetInput(input);\n const landmarkTensors = tf.tidy(\n () => tf.unstack(this.forwardInput(netInput)),\n );\n\n const landmarksForBatch = await Promise.all(landmarkTensors.map(\n async (landmarkTensor, batchIdx) => {\n const landmarksArray = Array.from(landmarkTensor.dataSync());\n const xCoords = landmarksArray.filter((_, i) => isEven(i));\n const yCoords = landmarksArray.filter((_, i) => !isEven(i));\n\n return new FaceLandmarks68(\n Array(68).fill(0).map((_, i) => new Point(xCoords[i] as number, yCoords[i] as number)),\n {\n height: netInput.getInputHeight(batchIdx),\n width: netInput.getInputWidth(batchIdx),\n },\n );\n },\n ));\n\n landmarkTensors.forEach((t) => t.dispose());\n\n return netInput.isBatchInput ? landmarksForBatch as FaceLandmarks68[] : landmarksForBatch[0] as FaceLandmarks68;\n }\n\n protected getClassifierChannelsOut(): number {\n return 136;\n }\n}\n", "import { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68Net extends FaceLandmark68NetBase {\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceLandmark68Net', faceFeatureExtractor);\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 256;\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { denseBlock3 } from './denseBlock';\nimport { extractParamsFromWeightMapTiny } from './extractParamsFromWeightMapTiny';\nimport { extractParamsTiny } from './extractParamsTiny';\nimport { IFaceFeatureExtractor, TinyFaceFeatureExtractorParams } from './types';\n\nexport class TinyFaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n constructor() {\n super('TinyFaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('TinyFaceFeatureExtractor - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = denseBlock3(normalized, params.dense0, true);\n out = denseBlock3(out, params.dense1);\n out = denseBlock3(out, params.dense2);\n out = tf.avgPool(out, [14, 14], [2, 2], 'valid');\n\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_tiny_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMapTiny(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParamsTiny(weights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeightMapTiny(\n weightMap: tf.NamedTensorMap,\n): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractDenseBlock3Params,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const params = {\n dense0: extractDenseBlock3Params('dense0', true),\n dense1: extractDenseBlock3Params('dense1'),\n dense2: extractDenseBlock3Params('dense2'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsTiny(weights: Float32Array): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractDenseBlock3Params,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const dense0 = extractDenseBlock3Params(3, 32, 'dense0', true);\n const dense1 = extractDenseBlock3Params(32, 64, 'dense1');\n const dense2 = extractDenseBlock3Params(64, 128, 'dense2');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { dense0, dense1, dense2 },\n };\n}\n", "import { TinyFaceFeatureExtractor } from '../faceFeatureExtractor/TinyFaceFeatureExtractor';\nimport { TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68TinyNet extends FaceLandmark68NetBase {\n constructor(faceFeatureExtractor: TinyFaceFeatureExtractor = new TinyFaceFeatureExtractor()) {\n super('FaceLandmark68TinyNet', faceFeatureExtractor);\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_tiny_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 128;\n }\n}\n", "import { FaceLandmark68Net } from './FaceLandmark68Net';\n\nexport * from './FaceLandmark68Net';\nexport * from './FaceLandmark68TinyNet';\nexport class FaceLandmarkNet extends FaceLandmark68Net {}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { convDown } from './convLayer';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { residual, residualDown } from './residualLayer';\nimport { NetParams } from './types';\n\nexport class FaceRecognitionNet extends NeuralNetwork {\n constructor() {\n super('FaceRecognitionNet');\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n const { params } = this;\n\n if (!params) {\n throw new Error('FaceRecognitionNet - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(150, true), 'float32');\n\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = convDown(normalized, params.conv32_down);\n out = tf.maxPool(out, 3, 2, 'valid');\n\n out = residual(out, params.conv32_1);\n out = residual(out, params.conv32_2);\n out = residual(out, params.conv32_3);\n\n out = residualDown(out, params.conv64_down);\n out = residual(out, params.conv64_1);\n out = residual(out, params.conv64_2);\n out = residual(out, params.conv64_3);\n\n out = residualDown(out, params.conv128_down);\n out = residual(out, params.conv128_1);\n out = residual(out, params.conv128_2);\n\n out = residualDown(out, params.conv256_down);\n out = residual(out, params.conv256_1);\n out = residual(out, params.conv256_2);\n out = residualDown(out, params.conv256_down_out);\n\n const globalAvg = out.mean([1, 2]) as tf.Tensor2D;\n const fullyConnected = tf.matMul(globalAvg, params.fc);\n\n return fullyConnected;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async computeFaceDescriptor(input: TNetInput): Promise {\n if (input?.shape?.some((dim) => dim <= 0)) return new Float32Array(128);\n const netInput = await toNetInput(input);\n const faceDescriptorTensors = tf.tidy(() => tf.unstack(this.forwardInput(netInput)));\n const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map((t) => t.data())) as Float32Array[];\n faceDescriptorTensors.forEach((t) => t.dispose());\n return netInput.isBatchInput ? faceDescriptorsForBatch : faceDescriptorsForBatch[0];\n }\n\n protected getDefaultModelName(): string {\n return 'face_recognition_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { scale } from './scaleLayer';\nimport { ConvLayerParams } from './types';\n\nfunction convLayer(\n x: tf.Tensor4D,\n params: ConvLayerParams,\n strides: [number, number],\n withRelu: boolean,\n padding: 'valid' | 'same' = 'same',\n): tf.Tensor4D {\n const { filters, bias } = params.conv;\n\n let out = tf.conv2d(x, filters, strides, padding);\n out = tf.add(out, bias);\n out = scale(out, params.scale);\n return withRelu ? tf.relu(out) : out;\n}\n\nexport function conv(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], true);\n}\n\nexport function convNoRelu(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], false);\n}\n\nexport function convDown(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [2, 2], true, 'valid');\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ScaleLayerParams } from './types';\n\nexport function scale(x: tf.Tensor4D, params: ScaleLayerParams): tf.Tensor4D {\n return tf.add(tf.mul(x, params.weights), params.biases);\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, extractWeightsFactory, ExtractWeightsFunction, ParamMapping } from '../common/index';\nimport { isFloat } from '../utils/index';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {\n const weights = extractWeights(numFilterValues);\n const depth = weights.length / (numFilters * filterSize * filterSize);\n\n if (isFloat(depth)) {\n throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);\n }\n\n return tf.tidy(\n () => tf.transpose(\n tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]),\n [2, 3, 1, 0],\n ),\n );\n }\n\n function extractConvParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvParams {\n const filters = extractFilterValues(numFilterValues, numFilters, filterSize);\n const bias = tf.tensor1d(extractWeights(numFilters));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return { filters, bias };\n }\n\n function extractScaleLayerParams(numWeights: number, mappedPrefix: string): ScaleLayerParams {\n const weights = tf.tensor1d(extractWeights(numWeights));\n const biases = tf.tensor1d(extractWeights(numWeights));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/biases` },\n );\n\n return {\n weights,\n biases,\n };\n }\n\n function extractConvLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvLayerParams {\n const conv = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`);\n const scale = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`);\n\n return { conv, scale };\n }\n\n function extractResidualLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n isDown: boolean = false,\n ): ResidualLayerParams {\n const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`);\n const conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`);\n\n return { conv1, conv2 };\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams,\n };\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down');\n const conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1');\n const conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2');\n const conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3');\n\n const conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true);\n const conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1');\n const conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2');\n const conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3');\n\n const conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true);\n const conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1');\n const conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2');\n\n const conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true);\n const conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1');\n const conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2');\n const conv256_down_out = extractResidualLayerParams(589824, 256, 3, 'conv256_down_out');\n\n const fc = tf.tidy(\n () => tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]),\n );\n paramMappings.push({ paramPath: 'fc' });\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc,\n };\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common/index';\nimport { isTensor2D } from '../utils/index';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractScaleLayerParams(prefix: string): ScaleLayerParams {\n const weights = extractWeightEntry(`${prefix}/scale/weights`, 1);\n const biases = extractWeightEntry(`${prefix}/scale/biases`, 1);\n\n return { weights, biases };\n }\n\n function extractConvLayerParams(prefix: string): ConvLayerParams {\n const filters = extractWeightEntry(`${prefix}/conv/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/conv/bias`, 1);\n const scale = extractScaleLayerParams(prefix);\n\n return { conv: { filters, bias }, scale };\n }\n\n function extractResidualLayerParams(prefix: string): ResidualLayerParams {\n return {\n conv1: extractConvLayerParams(`${prefix}/conv1`),\n conv2: extractConvLayerParams(`${prefix}/conv2`),\n };\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams,\n } = extractorsFactory(weightMap, paramMappings);\n\n const conv32_down = extractConvLayerParams('conv32_down');\n const conv32_1 = extractResidualLayerParams('conv32_1');\n const conv32_2 = extractResidualLayerParams('conv32_2');\n const conv32_3 = extractResidualLayerParams('conv32_3');\n\n const conv64_down = extractResidualLayerParams('conv64_down');\n const conv64_1 = extractResidualLayerParams('conv64_1');\n const conv64_2 = extractResidualLayerParams('conv64_2');\n const conv64_3 = extractResidualLayerParams('conv64_3');\n\n const conv128_down = extractResidualLayerParams('conv128_down');\n const conv128_1 = extractResidualLayerParams('conv128_1');\n const conv128_2 = extractResidualLayerParams('conv128_2');\n\n const conv256_down = extractResidualLayerParams('conv256_down');\n const conv256_1 = extractResidualLayerParams('conv256_1');\n const conv256_2 = extractResidualLayerParams('conv256_2');\n const conv256_down_out = extractResidualLayerParams('conv256_down_out');\n\n const { fc } = weightMap;\n paramMappings.push({ originalPath: 'fc', paramPath: 'fc' });\n\n if (!isTensor2D(fc)) {\n throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc,\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { conv, convDown, convNoRelu } from './convLayer';\nimport { ResidualLayerParams } from './types';\n\nexport function residual(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = conv(x, params.conv1);\n out = convNoRelu(out, params.conv2);\n out = tf.add(out, x);\n out = tf.relu(out);\n return out;\n}\n\nexport function residualDown(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = convDown(x, params.conv1);\n out = convNoRelu(out, params.conv2);\n\n let pooled = tf.avgPool(x, 2, 2, 'valid') as tf.Tensor4D;\n const zeros = tf.zeros(pooled.shape);\n const isPad = pooled.shape[3] !== out.shape[3];\n const isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2];\n\n if (isAdjustShape) {\n const padShapeX = [...out.shape] as [number, number, number, number];\n padShapeX[1] = 1;\n const zerosW = tf.zeros(padShapeX);\n out = tf.concat([out, zerosW], 1);\n\n const padShapeY = [...out.shape] as [number, number, number, number];\n padShapeY[2] = 1;\n const zerosH = tf.zeros(padShapeY);\n out = tf.concat([out, zerosH], 2);\n }\n\n pooled = isPad ? tf.concat([pooled, zeros], 3) : pooled;\n out = tf.add(pooled, out) as tf.Tensor4D;\n\n out = tf.relu(out);\n return out;\n}\n", "import { FaceRecognitionNet } from './FaceRecognitionNet';\n\nexport * from './FaceRecognitionNet';\n\nexport function createFaceRecognitionNet(weights: Float32Array) {\n const net = new FaceRecognitionNet();\n net.extractWeights(weights);\n return net;\n}\n", "export type WithFaceDescriptor = TSource & {\n descriptor: Float32Array\n}\n\nexport function extendWithFaceDescriptor<\n TSource\n>(\n sourceObj: TSource,\n descriptor: Float32Array,\n): WithFaceDescriptor {\n const extension = { descriptor };\n return { ...sourceObj, ...extension };\n}\n", "export type WithAge = TSource & {\n age: number\n}\n\nexport function isWithAge(obj: any): obj is WithAge<{}> {\n return typeof obj.age === 'number';\n}\n\nexport function extendWithAge<\n TSource\n>(\n sourceObj: TSource,\n age: number,\n): WithAge {\n const extension = { age };\n return { ...sourceObj, ...extension };\n}\n", "import { Gender } from '../ageGenderNet/types';\nimport { isValidProbablitiy } from '../utils/index';\n\nexport type WithGender = TSource & {\n gender: Gender\n genderProbability: number\n}\n\nexport function isWithGender(obj: any): obj is WithGender<{}> {\n return (obj.gender === Gender.MALE || obj.gender === Gender.FEMALE)\n && isValidProbablitiy(obj.genderProbability);\n}\n\nexport function extendWithGender<\n TSource\n>(\n sourceObj: TSource,\n gender: Gender,\n genderProbability: number,\n): WithGender {\n const extension = { gender, genderProbability };\n return { ...sourceObj, ...extension };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { mobileNetV1 } from './mobileNetV1';\nimport { nonMaxSuppression } from './nonMaxSuppression';\nimport { outputLayer } from './outputLayer';\nimport { predictionLayer } from './predictionLayer';\nimport { ISsdMobilenetv1Options, SsdMobilenetv1Options } from './SsdMobilenetv1Options';\nimport { NetParams } from './types';\n\nexport class SsdMobilenetv1 extends NeuralNetwork {\n constructor() {\n super('SsdMobilenetv1');\n }\n\n public forwardInput(input: NetInput) {\n const { params } = this;\n\n if (!params) {\n throw new Error('SsdMobilenetv1 - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(512, false), 'float32');\n const x = tf.sub(tf.div(batchTensor, 127.5), 1) as tf.Tensor4D; // input is normalized -1..1\n const features = mobileNetV1(x, params.mobilenetv1);\n const { boxPredictions, classPredictions } = predictionLayer(features.out, features.conv11, params.prediction_layer);\n\n return outputLayer(boxPredictions, classPredictions, params.output_layer);\n });\n }\n\n public async forward(input: TNetInput) {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async locateFaces(input: TNetInput, options: ISsdMobilenetv1Options = {}): Promise {\n const { maxResults, minConfidence } = new SsdMobilenetv1Options(options);\n const netInput = await toNetInput(input);\n\n const { boxes: _boxes, scores: _scores } = this.forwardInput(netInput);\n\n const boxes = _boxes[0];\n const scores = _scores[0];\n for (let i = 1; i < _boxes.length; i++) {\n _boxes[i].dispose();\n _scores[i].dispose();\n }\n\n const scoresData = Array.from(scores.dataSync());\n const iouThreshold = 0.5;\n const indices = nonMaxSuppression(boxes, scoresData as number[], maxResults, iouThreshold, minConfidence);\n\n const reshapedDims = netInput.getReshapedInputDimensions(0);\n const inputSize = netInput.inputSize as number;\n const padX = inputSize / reshapedDims.width;\n const padY = inputSize / reshapedDims.height;\n\n const boxesData = boxes.arraySync();\n const results = indices\n .map((idx) => {\n const [top, bottom] = [\n Math.max(0, boxesData[idx][0]),\n Math.min(1.0, boxesData[idx][2]),\n ].map((val) => val * padY);\n const [left, right] = [\n Math.max(0, boxesData[idx][1]),\n Math.min(1.0, boxesData[idx][3]),\n ].map((val) => val * padX);\n return new FaceDetection(\n scoresData[idx] as number,\n new Rect(left, top, right - left, bottom - top),\n { height: netInput.getInputHeight(0), width: netInput.getInputWidth(0) },\n );\n });\n\n boxes.dispose();\n scores.dispose();\n return results;\n }\n\n protected getDefaultModelName(): string {\n return 'ssd_mobilenetv1_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, ParamMapping, ConvParams, extractWeightsFactory } from '../common/index';\nimport { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams {\n const filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);\n const batch_norm_scale = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_offset = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_mean = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_variance = tf.tensor1d(extractWeights(numChannels));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/batch_norm_scale` },\n { paramPath: `${mappedPrefix}/batch_norm_offset` },\n { paramPath: `${mappedPrefix}/batch_norm_mean` },\n { paramPath: `${mappedPrefix}/batch_norm_variance` },\n );\n\n return {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance,\n };\n }\n\n function extractConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n isPointwiseConv?: boolean,\n ): ConvParams {\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut],\n );\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/${isPointwiseConv ? 'batch_norm_offset' : 'bias'}` },\n );\n\n return { filters, bias };\n }\n\n function extractPointwiseConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n ): PointwiseConvParams {\n const {\n filters,\n bias,\n } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true);\n\n return {\n filters,\n batch_norm_offset: bias,\n };\n }\n\n function extractConvPairParams(\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string,\n ): MobileNetV1.ConvPairParams {\n const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`);\n const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`);\n\n return { depthwise_conv, pointwise_conv };\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n const conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');\n const conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');\n const conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');\n const conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');\n const conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');\n const conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');\n const conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');\n const conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');\n const conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');\n const conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');\n const conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');\n const conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');\n const conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');\n const conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n conv_8,\n conv_9,\n conv_10,\n conv_11,\n conv_12,\n conv_13,\n };\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n const conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');\n const conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');\n const conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');\n const conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');\n const conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');\n const conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');\n const conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');\n const conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');\n const box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');\n const class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');\n const box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');\n const class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');\n const box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');\n const class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');\n const box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');\n const class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');\n const box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');\n const class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');\n const box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');\n const class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');\n\n const box_predictor_0 = {\n box_encoding_predictor: box_encoding_0_predictor,\n class_predictor: class_predictor_0,\n };\n const box_predictor_1 = {\n box_encoding_predictor: box_encoding_1_predictor,\n class_predictor: class_predictor_1,\n };\n const box_predictor_2 = {\n box_encoding_predictor: box_encoding_2_predictor,\n class_predictor: class_predictor_2,\n };\n const box_predictor_3 = {\n box_encoding_predictor: box_encoding_3_predictor,\n class_predictor: class_predictor_3,\n };\n const box_predictor_4 = {\n box_encoding_predictor: box_encoding_4_predictor,\n class_predictor: class_predictor_4,\n };\n const box_predictor_5 = {\n box_encoding_predictor: box_encoding_5_predictor,\n class_predictor: class_predictor_5,\n };\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n box_predictor_0,\n box_predictor_1,\n box_predictor_2,\n box_predictor_3,\n box_predictor_4,\n box_predictor_5,\n };\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n };\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n } = extractorsFactory(extractWeights, paramMappings);\n const mobilenetv1 = extractMobilenetV1Params();\n const prediction_layer = extractPredictionLayerParams();\n const extra_dim = tf.tensor3d(\n extractWeights(5118 * 4),\n [1, 5118, 4],\n );\n const output_layer = {\n extra_dim,\n };\n paramMappings.push({ paramPath: 'output_layer/extra_dim' });\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n params: {\n mobilenetv1,\n prediction_layer,\n output_layer,\n },\n paramMappings,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common/index';\nimport { isTensor3D } from '../utils/index';\nimport { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {\n const filters = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`);\n const batch_norm_offset = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`);\n return { filters, batch_norm_offset };\n }\n\n function extractConvPairParams(idx: number): MobileNetV1.ConvPairParams {\n const mappedPrefix = `mobilenetv1/conv_${idx}`;\n const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`;\n const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`;\n const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`;\n\n const filters = extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`);\n const batch_norm_scale = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`);\n const batch_norm_offset = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`);\n const batch_norm_mean = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`);\n const batch_norm_variance = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`);\n\n return {\n depthwise_conv: {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance,\n },\n pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv),\n };\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n return {\n conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),\n conv_1: extractConvPairParams(1),\n conv_2: extractConvPairParams(2),\n conv_3: extractConvPairParams(3),\n conv_4: extractConvPairParams(4),\n conv_5: extractConvPairParams(5),\n conv_6: extractConvPairParams(6),\n conv_7: extractConvPairParams(7),\n conv_8: extractConvPairParams(8),\n conv_9: extractConvPairParams(9),\n conv_10: extractConvPairParams(10),\n conv_11: extractConvPairParams(11),\n conv_12: extractConvPairParams(12),\n conv_13: extractConvPairParams(13),\n };\n }\n\n function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/weights`, 4, `${mappedPrefix}/filters`);\n const bias = extractWeightEntry(`${prefix}/biases`, 1, `${mappedPrefix}/bias`);\n return { filters, bias };\n }\n\n function extractBoxPredictorParams(idx: number): BoxPredictionParams {\n const box_encoding_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,\n `prediction_layer/box_predictor_${idx}/box_encoding_predictor`,\n );\n const class_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/ClassPredictor`,\n `prediction_layer/box_predictor_${idx}/class_predictor`,\n );\n return { box_encoding_predictor, class_predictor };\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n return {\n conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),\n conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),\n conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),\n conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),\n conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),\n conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),\n conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),\n conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),\n box_predictor_0: extractBoxPredictorParams(0),\n box_predictor_1: extractBoxPredictorParams(1),\n box_predictor_2: extractBoxPredictorParams(2),\n box_predictor_3: extractBoxPredictorParams(3),\n box_predictor_4: extractBoxPredictorParams(4),\n box_predictor_5: extractBoxPredictorParams(5),\n };\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n } = extractorsFactory(weightMap, paramMappings);\n const extra_dim = weightMap['Output/extra_dim'];\n paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });\n if (!isTensor3D(extra_dim)) {\n throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);\n }\n\n const params = {\n mobilenetv1: extractMobilenetV1Params(),\n prediction_layer: extractPredictionLayerParams(),\n output_layer: {\n extra_dim,\n },\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { MobileNetV1 } from './types';\n\nconst epsilon = 0.0010000000474974513;\n\nfunction depthwiseConvLayer(x: tf.Tensor4D, params: MobileNetV1.DepthwiseConvParams, strides: [number, number]) {\n return tf.tidy(() => {\n let out = tf.depthwiseConv2d(x, params.filters, strides, 'same');\n out = tf.batchNorm(\n out,\n params.batch_norm_mean,\n params.batch_norm_variance,\n params.batch_norm_offset,\n params.batch_norm_scale,\n epsilon,\n );\n return tf.clipByValue(out, 0, 6);\n });\n}\n\nfunction getStridesForLayerIdx(layerIdx: number): [number, number] {\n return [2, 4, 6, 12].some((idx) => idx === layerIdx) ? [2, 2] : [1, 1];\n}\n\nexport function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) {\n return tf.tidy(() => {\n let conv11;\n let out = pointwiseConvLayer(x, params.conv_0, [2, 2]);\n\n const convPairParams = [\n params.conv_1,\n params.conv_2,\n params.conv_3,\n params.conv_4,\n params.conv_5,\n params.conv_6,\n params.conv_7,\n params.conv_8,\n params.conv_9,\n params.conv_10,\n params.conv_11,\n params.conv_12,\n params.conv_13,\n ];\n\n convPairParams.forEach((param, i) => {\n const layerIdx = i + 1;\n const depthwiseConvStrides = getStridesForLayerIdx(layerIdx);\n out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);\n out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);\n if (layerIdx === 11) conv11 = out;\n });\n\n if (conv11 === null) {\n throw new Error('mobileNetV1 - output of conv layer 11 is null');\n }\n\n return {\n out,\n conv11: conv11 as any,\n };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { PointwiseConvParams } from './types';\n\nexport function pointwiseConvLayer(x: tf.Tensor4D, params: PointwiseConvParams, strides: [number, number]) {\n return tf.tidy(() => {\n let out = tf.conv2d(x, params.filters, strides, 'same');\n /*\n if (x.shape[1] === 512 && x.shape[3] === 3) {\n console.log('Input:', x.shape, x.size, 'sum:', x.reshape([786432]).sum().dataSync()[0]); // input does not change (checked values)\n console.log('Filter:', params.filters.shape, params.filters.size, 'sum:', params.filters.reshape([864]).sum().dataSync()[0]); // params do not change (checked values)\n console.log('Strides', strides);\n console.log('Conv2d 1st 5 values:', out.shape, out.size, out.dataSync().slice(0, 5)); // output has different values!\n console.log('Conv2D sum of all values:', tf.reshape(out, [2097152]).sum().dataSync()[0]); // silly sum just to see how much results diverged\n }\n */\n out = tf.add(out, params.batch_norm_offset);\n return tf.clipByValue(out, 0, 6);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nfunction IOU(boxes: tf.Tensor2D, i: number, j: number) {\n const boxesData = boxes.arraySync();\n const yminI = Math.min(boxesData[i][0], boxesData[i][2]);\n const xminI = Math.min(boxesData[i][1], boxesData[i][3]);\n const ymaxI = Math.max(boxesData[i][0], boxesData[i][2]);\n const xmaxI = Math.max(boxesData[i][1], boxesData[i][3]);\n const yminJ = Math.min(boxesData[j][0], boxesData[j][2]);\n const xminJ = Math.min(boxesData[j][1], boxesData[j][3]);\n const ymaxJ = Math.max(boxesData[j][0], boxesData[j][2]);\n const xmaxJ = Math.max(boxesData[j][1], boxesData[j][3]);\n const areaI = (ymaxI - yminI) * (xmaxI - xminI);\n const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);\n if (areaI <= 0 || areaJ <= 0) return 0.0;\n const intersectionYmin = Math.max(yminI, yminJ);\n const intersectionXmin = Math.max(xminI, xminJ);\n const intersectionYmax = Math.min(ymaxI, ymaxJ);\n const intersectionXmax = Math.min(xmaxI, xmaxJ);\n const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) * Math.max(intersectionXmax - intersectionXmin, 0.0);\n return intersectionArea / (areaI + areaJ - intersectionArea);\n}\n\nexport function nonMaxSuppression(\n boxes: tf.Tensor2D,\n scores: number[],\n maxOutputSize: number,\n iouThreshold: number,\n scoreThreshold: number,\n): number[] {\n const numBoxes = boxes.shape[0];\n const outputSize = Math.min(maxOutputSize, numBoxes);\n\n const candidates = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .filter((c) => c.score > scoreThreshold)\n .sort((c1, c2) => c2.score - c1.score);\n\n const suppressFunc = (x: number) => (x <= iouThreshold ? 1 : 0);\n const selected: number[] = [];\n\n candidates.forEach((c) => {\n if (selected.length >= outputSize) return;\n const originalScore = c.score;\n for (let j = selected.length - 1; j >= 0; --j) {\n const iou = IOU(boxes, c.boxIndex, selected[j]);\n if (iou === 0.0) continue;\n c.score *= suppressFunc(iou);\n if (c.score <= scoreThreshold) break;\n }\n if (originalScore === c.score) {\n selected.push(c.boxIndex);\n }\n });\n return selected;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { OutputLayerParams } from './types';\n\nfunction getCenterCoordinatesAndSizesLayer(x: tf.Tensor2D) {\n const vec = tf.unstack(tf.transpose(x, [1, 0]));\n\n const sizes = [\n tf.sub(vec[2], vec[0]),\n tf.sub(vec[3], vec[1]),\n ];\n const centers = [\n tf.add(vec[0], tf.div(sizes[0], 2)),\n tf.add(vec[1], tf.div(sizes[1], 2)),\n ];\n return { sizes, centers };\n}\n\nfunction decodeBoxesLayer(x0: tf.Tensor2D, x1: tf.Tensor2D) {\n const { sizes, centers } = getCenterCoordinatesAndSizesLayer(x0);\n\n const vec = tf.unstack(tf.transpose(x1, [1, 0]));\n const div0_out = tf.div(tf.mul(tf.exp(tf.div(vec[2], 5)), sizes[0]), 2);\n const add0_out = tf.add(tf.mul(tf.div(vec[0], 10), sizes[0]), centers[0]);\n const div1_out = tf.div(tf.mul(tf.exp(tf.div(vec[3], 5)), sizes[1]), 2);\n const add1_out = tf.add(tf.mul(tf.div(vec[1], 10), sizes[1]), centers[1]);\n\n return tf.transpose(\n tf.stack([\n tf.sub(add0_out, div0_out),\n tf.sub(add1_out, div1_out),\n tf.add(add0_out, div0_out),\n tf.add(add1_out, div1_out),\n ]),\n [1, 0],\n );\n}\n\nexport function outputLayer(boxPredictions: tf.Tensor4D, classPredictions: tf.Tensor4D, params: OutputLayerParams) {\n return tf.tidy(() => {\n const batchSize = boxPredictions.shape[0];\n\n let boxes = decodeBoxesLayer(\n tf.reshape(tf.tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]) as tf.Tensor2D,\n tf.reshape(boxPredictions, [-1, 4]) as tf.Tensor2D,\n );\n boxes = tf.reshape(boxes, [batchSize, (boxes.shape[0] / batchSize), 4]);\n\n const scoresAndClasses = tf.sigmoid(tf.slice(classPredictions, [0, 0, 1], [-1, -1, -1]));\n let scores = tf.slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]) as tf.Tensor;\n\n scores = tf.reshape(scores, [batchSize, scores.shape[1] as number]);\n\n const boxesByBatch = tf.unstack(boxes) as tf.Tensor2D[];\n const scoresByBatch = tf.unstack(scores) as tf.Tensor1D[];\n\n return { boxes: boxesByBatch, scores: scoresByBatch };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { boxPredictionLayer } from './boxPredictionLayer';\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { PredictionLayerParams } from './types';\n\nexport function predictionLayer(\n x: tf.Tensor4D,\n conv11: tf.Tensor4D,\n params: PredictionLayerParams,\n) {\n return tf.tidy(() => {\n const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]);\n const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]);\n const conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]);\n const conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2]);\n const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]);\n const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]);\n const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]);\n const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]);\n\n const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0);\n const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1);\n const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2);\n const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3);\n const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4);\n const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5);\n\n const boxPredictions = tf.concat([\n boxPrediction0.boxPredictionEncoding,\n boxPrediction1.boxPredictionEncoding,\n boxPrediction2.boxPredictionEncoding,\n boxPrediction3.boxPredictionEncoding,\n boxPrediction4.boxPredictionEncoding,\n boxPrediction5.boxPredictionEncoding,\n ], 1) as tf.Tensor4D;\n\n const classPredictions = tf.concat([\n boxPrediction0.classPrediction,\n boxPrediction1.classPrediction,\n boxPrediction2.classPrediction,\n boxPrediction3.classPrediction,\n boxPrediction4.classPrediction,\n boxPrediction5.classPrediction,\n ], 1) as tf.Tensor4D;\n\n return {\n boxPredictions,\n classPredictions,\n };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { convLayer } from '../common/index';\nimport { BoxPredictionParams } from './types';\n\nexport function boxPredictionLayer(\n x: tf.Tensor4D,\n params: BoxPredictionParams,\n) {\n return tf.tidy(() => {\n const batchSize = x.shape[0];\n const boxPredictionEncoding = tf.reshape(\n convLayer(x, params.box_encoding_predictor),\n [batchSize, -1, 1, 4],\n );\n const classPrediction = tf.reshape(\n convLayer(x, params.class_predictor),\n [batchSize, -1, 3],\n );\n return { boxPredictionEncoding, classPrediction };\n });\n}\n", "export interface ISsdMobilenetv1Options {\n minConfidence?: number\n maxResults?: number\n}\n\nexport class SsdMobilenetv1Options {\n protected _name: string = 'SsdMobilenetv1Options'\n\n private _minConfidence: number\n\n private _maxResults: number\n\n constructor({ minConfidence, maxResults }: ISsdMobilenetv1Options = {}) {\n this._minConfidence = minConfidence || 0.5;\n this._maxResults = maxResults || 100;\n\n if (typeof this._minConfidence !== 'number' || this._minConfidence <= 0 || this._minConfidence >= 1) {\n throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);\n }\n\n if (typeof this._maxResults !== 'number') {\n throw new Error(`${this._name} - expected maxResults to be a number`);\n }\n }\n\n get minConfidence(): number { return this._minConfidence; }\n\n get maxResults(): number { return this._maxResults; }\n}\n", "import { SsdMobilenetv1 } from './SsdMobilenetv1';\n\nexport * from './SsdMobilenetv1';\nexport * from './SsdMobilenetv1Options';\n\nexport function createSsdMobilenetv1(weights: Float32Array) {\n const net = new SsdMobilenetv1();\n net.extractWeights(weights);\n return net;\n}\n\nexport function createFaceDetectionNet(weights: Float32Array) {\n return createSsdMobilenetv1(weights);\n}\n\n// alias for backward compatibily\nexport class FaceDetectionNet extends SsdMobilenetv1 {}\n", "import { Point } from '../classes/index';\n\nexport const IOU_THRESHOLD = 0.4;\n\nexport const BOX_ANCHORS = [\n new Point(0.738768, 0.874946),\n new Point(2.42204, 2.65704),\n new Point(4.30971, 7.04493),\n new Point(10.246, 4.59428),\n new Point(12.6868, 11.8741),\n];\n\nexport const BOX_ANCHORS_SEPARABLE = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308),\n];\n\nexport const MEAN_RGB_SEPARABLE: [number, number, number] = [117.001, 114.697, 97.404];\n\nexport const DEFAULT_MODEL_NAME = 'tiny_yolov2_model';\nexport const DEFAULT_MODEL_NAME_SEPARABLE_CONV = 'tiny_yolov2_separable_conv_model';\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { BoundingBox } from '../classes/BoundingBox';\nimport { Dimensions } from '../classes/Dimensions';\nimport { ObjectDetection } from '../classes/ObjectDetection';\nimport { convLayer } from '../common/index';\nimport { ConvParams, SeparableConvParams } from '../common/types';\nimport { toNetInput } from '../dom/index';\nimport { NetInput } from '../dom/NetInput';\nimport { TNetInput } from '../dom/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { sigmoid } from '../ops/index';\nimport { nonMaxSuppression } from '../ops/nonMaxSuppression';\nimport { normalize } from '../ops/normalize';\nimport { TinyYolov2Config, validateConfig } from './config';\nimport { convWithBatchNorm } from './convWithBatchNorm';\nimport { depthwiseSeparableConv } from './depthwiseSeparableConv';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { leaky } from './leaky';\nimport { ITinyYolov2Options, TinyYolov2Options } from './TinyYolov2Options';\nimport { DefaultTinyYolov2NetParams, MobilenetParams, TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2Base extends NeuralNetwork {\n public static DEFAULT_FILTER_SIZES = [3, 16, 32, 64, 128, 256, 512, 1024, 1024];\n\n private _config: TinyYolov2Config\n\n constructor(config: TinyYolov2Config) {\n super('TinyYolov2');\n validateConfig(config);\n this._config = config;\n }\n\n public get config(): TinyYolov2Config {\n return this._config;\n }\n\n public get withClassScores(): boolean {\n return this.config.withClassScores || this.config.classes.length > 1;\n }\n\n public get boxEncodingSize(): number {\n return 5 + (this.withClassScores ? this.config.classes.length : 0);\n }\n\n public runTinyYolov2(x: tf.Tensor4D, params: DefaultTinyYolov2NetParams): tf.Tensor4D {\n let out = convWithBatchNorm(x, params.conv0);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv1);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv2);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv3);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv4);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv5);\n out = tf.maxPool(out, [2, 2], [1, 1], 'same');\n out = convWithBatchNorm(out, params.conv6);\n out = convWithBatchNorm(out, params.conv7);\n return convLayer(out, params.conv8, 'valid', false);\n }\n\n public runMobilenet(x: tf.Tensor4D, params: MobilenetParams): tf.Tensor4D {\n let out = this.config.isFirstLayerConv2d\n ? leaky(convLayer(x, params.conv0 as ConvParams, 'valid', false))\n : depthwiseSeparableConv(x, params.conv0 as SeparableConvParams);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv1);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv2);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv3);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv4);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv5);\n out = tf.maxPool(out, [2, 2], [1, 1], 'same');\n out = params.conv6 ? depthwiseSeparableConv(out, params.conv6) : out;\n out = params.conv7 ? depthwiseSeparableConv(out, params.conv7) : out;\n return convLayer(out, params.conv8, 'valid', false);\n }\n\n public forwardInput(input: NetInput, inputSize: number): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('TinyYolov2 - load model before inference');\n }\n\n return tf.tidy(() => {\n let batchTensor = tf.cast(input.toBatchTensor(inputSize, false), 'float32');\n batchTensor = this.config.meanRgb\n ? normalize(batchTensor, this.config.meanRgb)\n : batchTensor;\n batchTensor = batchTensor.div(255) as tf.Tensor4D;\n return this.config.withSeparableConvs\n ? this.runMobilenet(batchTensor, params as MobilenetParams)\n : this.runTinyYolov2(batchTensor, params as DefaultTinyYolov2NetParams);\n });\n }\n\n public async forward(input: TNetInput, inputSize: number): Promise {\n return this.forwardInput(await toNetInput(input), inputSize);\n }\n\n public async detect(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise {\n const { inputSize, scoreThreshold } = new TinyYolov2Options(forwardParams);\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput, inputSize);\n const out0 = tf.tidy(() => tf.unstack(out)[0].expandDims()) as tf.Tensor4D;\n const inputDimensions = {\n width: netInput.getInputWidth(0),\n height: netInput.getInputHeight(0),\n };\n\n const results = await this.extractBoxes(out0, netInput.getReshapedInputDimensions(0), scoreThreshold);\n out.dispose();\n out0.dispose();\n\n const boxes = results.map((res) => res.box);\n const scores = results.map((res) => res.score);\n const classScores = results.map((res) => res.classScore);\n const classNames = results.map((res) => this.config.classes[res.label]);\n\n const indices = nonMaxSuppression(\n boxes.map((box) => box.rescale(inputSize)),\n scores,\n this.config.iouThreshold,\n true,\n );\n\n const detections = indices.map((idx) => new ObjectDetection(\n scores[idx],\n classScores[idx],\n classNames[idx],\n boxes[idx],\n inputDimensions,\n ));\n return detections;\n }\n\n protected getDefaultModelName(): string {\n return '';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap, this.config);\n }\n\n protected extractParams(weights: Float32Array) {\n const filterSizes = this.config.filterSizes || TinyYolov2Base.DEFAULT_FILTER_SIZES;\n\n const numFilters = filterSizes ? filterSizes.length : undefined;\n if (numFilters !== 7 && numFilters !== 8 && numFilters !== 9) {\n throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);\n }\n return extractParams(weights, this.config, this.boxEncodingSize, filterSizes);\n }\n\n protected async extractBoxes(\n outputTensor: tf.Tensor4D,\n inputBlobDimensions: Dimensions,\n scoreThreshold?: number,\n ) {\n const { width, height } = inputBlobDimensions;\n const inputSize = Math.max(width, height);\n const correctionFactorX = inputSize / width;\n const correctionFactorY = inputSize / height;\n\n const numCells = outputTensor.shape[1];\n const numBoxes = this.config.anchors.length;\n\n const [boxesTensor, scoresTensor, classScoresTensor] = tf.tidy(() => {\n const reshaped = outputTensor.reshape([numCells, numCells, numBoxes, this.boxEncodingSize]);\n\n const boxes = reshaped.slice([0, 0, 0, 0], [numCells, numCells, numBoxes, 4]);\n const scores = reshaped.slice([0, 0, 0, 4], [numCells, numCells, numBoxes, 1]);\n const classScores = this.withClassScores\n ? tf.softmax(reshaped.slice([0, 0, 0, 5], [numCells, numCells, numBoxes, this.config.classes.length]), 3)\n : tf.scalar(0);\n return [boxes, scores, classScores];\n });\n\n const results = [] as any;\n const scoresData = await scoresTensor.array();\n const boxesData = await boxesTensor.array();\n for (let row = 0; row < numCells; row++) {\n for (let col = 0; col < numCells; col++) {\n for (let anchor = 0; anchor < numBoxes; anchor++) {\n const score = sigmoid(scoresData[row][col][anchor][0]);\n if (!scoreThreshold || score > scoreThreshold) {\n const ctX = ((col + sigmoid(boxesData[row][col][anchor][0])) / numCells) * correctionFactorX;\n const ctY = ((row + sigmoid(boxesData[row][col][anchor][1])) / numCells) * correctionFactorY;\n const widthLocal = ((Math.exp(boxesData[row][col][anchor][2]) * this.config.anchors[anchor].x) / numCells) * correctionFactorX;\n const heightLocal = ((Math.exp(boxesData[row][col][anchor][3]) * this.config.anchors[anchor].y) / numCells) * correctionFactorY;\n const x = (ctX - (widthLocal / 2));\n const y = (ctY - (heightLocal / 2));\n const pos = { row, col, anchor };\n const { classScore, label } = this.withClassScores\n ? await this.extractPredictedClass(classScoresTensor as tf.Tensor4D, pos)\n : { classScore: 1, label: 0 };\n results.push({\n box: new BoundingBox(x, y, x + widthLocal, y + heightLocal),\n score,\n classScore: score * classScore,\n label,\n ...pos,\n });\n }\n }\n }\n }\n\n boxesTensor.dispose();\n scoresTensor.dispose();\n classScoresTensor.dispose();\n return results;\n }\n\n private async extractPredictedClass(classesTensor: tf.Tensor4D, pos: { row: number, col: number, anchor: number }) {\n const { row, col, anchor } = pos;\n const classesData = await classesTensor.array();\n return Array(this.config.classes.length).fill(0)\n .map((_, i) => classesData[row][col][anchor][i])\n .map((classScore, label) => ({\n classScore,\n label,\n }))\n .reduce((max, curr) => (max.classScore > curr.classScore ? max : curr));\n }\n}\n", "import { Point } from '../classes/Point';\n\nexport type TinyYolov2Config = {\n withSeparableConvs: boolean\n iouThreshold: number\n anchors: Point[]\n classes: string[]\n meanRgb?: [number, number, number]\n withClassScores?: boolean,\n filterSizes?: number[]\n isFirstLayerConv2d?: boolean\n}\n\nconst isNumber = (arg: any) => typeof arg === 'number';\n\nexport function validateConfig(config: any) {\n if (!config) {\n throw new Error(`invalid config: ${config}`);\n }\n\n if (typeof config.withSeparableConvs !== 'boolean') {\n throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config.withSeparableConvs}`);\n }\n\n if (!isNumber(config.iouThreshold) || config.iouThreshold < 0 || config.iouThreshold > 1.0) {\n throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config.iouThreshold}`);\n }\n\n if (\n !Array.isArray(config.classes)\n || !config.classes.length\n || !config.classes.every((c: any) => typeof c === 'string')\n ) {\n throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config.classes)}`);\n }\n\n if (\n !Array.isArray(config.anchors)\n || !config.anchors.length\n || !config.anchors.map((a: any) => a || {}).every((a: any) => isNumber(a.x) && isNumber(a.y))\n ) {\n throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config.anchors)}`);\n }\n\n if (config.meanRgb && (\n !Array.isArray(config.meanRgb)\n || config.meanRgb.length !== 3\n || !config.meanRgb.every(isNumber)\n )) {\n throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { leaky } from './leaky';\nimport { ConvWithBatchNorm } from './types';\n\nexport function convWithBatchNorm(x: tf.Tensor4D, params: ConvWithBatchNorm): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D;\n out = tf.conv2d(out, params.conv.filters, [1, 1], 'valid');\n out = tf.sub(out, params.bn.sub);\n out = tf.mul(out, params.bn.truediv);\n out = tf.add(out, params.conv.bias);\n return leaky(out);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function leaky(x: tf.Tensor4D): tf.Tensor4D {\n return tf.tidy(() => {\n const min = tf.mul(x, tf.scalar(0.10000000149011612));\n return tf.add(tf.relu(tf.sub(x, min)), min);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { SeparableConvParams } from '../common/types';\nimport { leaky } from './leaky';\n\nexport function depthwiseSeparableConv(x: tf.Tensor4D, params: SeparableConvParams): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D;\n out = tf.separableConv2d(out, params.depthwise_filter, params.pointwise_filter, [1, 1], 'valid');\n out = tf.add(out, params.bias);\n return leaky(out);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { extractConvParamsFactory } from '../common/index';\nimport { extractSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightsFactory } from '../common/extractWeightsFactory';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n\n function extractBatchNormParams(size: number, mappedPrefix: string): BatchNorm {\n const sub = tf.tensor1d(extractWeights(size));\n const truediv = tf.tensor1d(extractWeights(size));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/sub` },\n { paramPath: `${mappedPrefix}/truediv` },\n );\n return { sub, truediv };\n }\n\n function extractConvWithBatchNormParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ConvWithBatchNorm {\n const conv = extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv`);\n const bn = extractBatchNormParams(channelsOut, `${mappedPrefix}/bn`);\n return { conv, bn };\n }\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n };\n}\n\nexport function extractParams(\n weights: Float32Array,\n config: TinyYolov2Config,\n boxEncodingSize: number,\n filterSizes: number[],\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const paramMappings: ParamMapping[] = [];\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n } = extractorsFactory(extractWeights, paramMappings);\n let params: TinyYolov2NetParams;\n\n if (config.withSeparableConvs) {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes;\n const conv0 = config.isFirstLayerConv2d\n ? extractConvParams(s0, s1, 3, 'conv0')\n : extractSeparableConvParams(s0, s1, 'conv0');\n const conv1 = extractSeparableConvParams(s1, s2, 'conv1');\n const conv2 = extractSeparableConvParams(s2, s3, 'conv2');\n const conv3 = extractSeparableConvParams(s3, s4, 'conv3');\n const conv4 = extractSeparableConvParams(s4, s5, 'conv4');\n const conv5 = extractSeparableConvParams(s5, s6, 'conv5');\n const conv6 = s7 ? extractSeparableConvParams(s6, s7, 'conv6') : undefined;\n const conv7 = s8 ? extractSeparableConvParams(s7, s8, 'conv7') : undefined;\n const conv8 = extractConvParams(s8 || s7 || s6, 5 * boxEncodingSize, 1, 'conv8');\n params = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\n } else {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes;\n const conv0 = extractConvWithBatchNormParams(s0, s1, 'conv0');\n const conv1 = extractConvWithBatchNormParams(s1, s2, 'conv1');\n const conv2 = extractConvWithBatchNormParams(s2, s3, 'conv2');\n const conv3 = extractConvWithBatchNormParams(s3, s4, 'conv3');\n const conv4 = extractConvWithBatchNormParams(s4, s5, 'conv4');\n const conv5 = extractConvWithBatchNormParams(s5, s6, 'conv5');\n const conv6 = extractConvWithBatchNormParams(s6, s7, 'conv6');\n const conv7 = extractConvWithBatchNormParams(s7, s8, 'conv7');\n const conv8 = extractConvParams(s8, 5 * boxEncodingSize, 1, 'conv8');\n params = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\n }\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from '../common/index';\nimport { disposeUnusedWeightTensors } from '../common/disposeUnusedWeightTensors';\nimport { loadSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightEntryFactory } from '../common/extractWeightEntryFactory';\nimport { ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractBatchNormParams(prefix: string): BatchNorm {\n const sub = extractWeightEntry(`${prefix}/sub`, 1);\n const truediv = extractWeightEntry(`${prefix}/truediv`, 1);\n return { sub, truediv };\n }\n\n function extractConvParams(prefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { filters, bias };\n }\n\n function extractConvWithBatchNormParams(prefix: string): ConvWithBatchNorm {\n const conv = extractConvParams(`${prefix}/conv`);\n const bn = extractBatchNormParams(`${prefix}/bn`);\n return { conv, bn };\n }\n\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n config: TinyYolov2Config,\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n } = extractorsFactory(weightMap, paramMappings);\n\n let params: TinyYolov2NetParams;\n\n if (config.withSeparableConvs) {\n // eslint-disable-next-line no-mixed-operators\n const numFilters = (config.filterSizes && config.filterSizes.length || 9);\n params = {\n conv0: config.isFirstLayerConv2d ? extractConvParams('conv0') : extractSeparableConvParams('conv0'),\n conv1: extractSeparableConvParams('conv1'),\n conv2: extractSeparableConvParams('conv2'),\n conv3: extractSeparableConvParams('conv3'),\n conv4: extractSeparableConvParams('conv4'),\n conv5: extractSeparableConvParams('conv5'),\n conv6: numFilters > 7 ? extractSeparableConvParams('conv6') : undefined,\n conv7: numFilters > 8 ? extractSeparableConvParams('conv7') : undefined,\n conv8: extractConvParams('conv8'),\n };\n } else {\n params = {\n conv0: extractConvWithBatchNormParams('conv0'),\n conv1: extractConvWithBatchNormParams('conv1'),\n conv2: extractConvWithBatchNormParams('conv2'),\n conv3: extractConvWithBatchNormParams('conv3'),\n conv4: extractConvWithBatchNormParams('conv4'),\n conv5: extractConvWithBatchNormParams('conv5'),\n conv6: extractConvWithBatchNormParams('conv6'),\n conv7: extractConvWithBatchNormParams('conv7'),\n conv8: extractConvParams('conv8'),\n };\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n return { params, paramMappings };\n}\n", "export interface ITinyYolov2Options {\n inputSize?: number\n scoreThreshold?: number\n}\n\nexport class TinyYolov2Options {\n protected _name: string = 'TinyYolov2Options'\n\n private _inputSize: number\n\n private _scoreThreshold: number\n\n constructor({ inputSize, scoreThreshold }: ITinyYolov2Options = {}) {\n this._inputSize = inputSize || 416;\n this._scoreThreshold = scoreThreshold || 0.5;\n\n if (typeof this._inputSize !== 'number' || this._inputSize % 32 !== 0) {\n throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);\n }\n\n if (typeof this._scoreThreshold !== 'number' || this._scoreThreshold <= 0 || this._scoreThreshold >= 1) {\n throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`);\n }\n }\n\n get inputSize(): number { return this._inputSize; }\n\n get scoreThreshold(): number { return this._scoreThreshold; }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\nimport { ParamMapping } from '../common/types';\nimport { TNetInput } from '../dom/types';\nimport {\n BOX_ANCHORS,\n BOX_ANCHORS_SEPARABLE,\n DEFAULT_MODEL_NAME,\n DEFAULT_MODEL_NAME_SEPARABLE_CONV,\n IOU_THRESHOLD,\n MEAN_RGB_SEPARABLE,\n} from './const';\nimport { TinyYolov2Base } from './TinyYolov2Base';\nimport { ITinyYolov2Options } from './TinyYolov2Options';\nimport { TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2 extends TinyYolov2Base {\n constructor(withSeparableConvs: boolean = true) {\n const config = {\n withSeparableConvs,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\n ...(withSeparableConvs\n ? {\n anchors: BOX_ANCHORS_SEPARABLE,\n meanRgb: MEAN_RGB_SEPARABLE,\n }\n : {\n anchors: BOX_ANCHORS,\n withClassScores: true,\n }),\n };\n\n super(config);\n }\n\n public get withSeparableConvs(): boolean {\n return this.config.withSeparableConvs;\n }\n\n public get anchors(): Point[] {\n return this.config.anchors;\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams);\n return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }));\n }\n\n protected getDefaultModelName(): string {\n return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME;\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeightMap(weightMap);\n }\n}\n", "import { TinyYolov2 } from './TinyYolov2';\n\nexport * from './TinyYolov2Options';\nexport * from './config';\nexport * from './types';\nexport { TinyYolov2 };\n\nexport function createTinyYolov2(weights: Float32Array, withSeparableConvs: boolean = true) {\n const net = new TinyYolov2(withSeparableConvs);\n net.extractWeights(weights);\n return net;\n}\n", "import { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\n\nexport interface ITinyFaceDetectorOptions extends ITinyYolov2Options {}\n\nexport class TinyFaceDetectorOptions extends TinyYolov2Options {\n protected _name: string = 'TinyFaceDetectorOptions'\n}\n", "export class ComposableTask {\n public async then(\n // eslint-disable-next-line no-unused-vars\n onfulfilled: (value: T) => T | PromiseLike,\n ): Promise {\n return onfulfilled(await this.run());\n }\n\n public async run(): Promise {\n throw new Error('ComposableTask - run is not implemented');\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class DetectFaceLandmarksTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected useTinyLandmarkNet: boolean,\n ) {\n super();\n }\n\n protected get landmarkNet(): FaceLandmark68Net | FaceLandmark68TinyNet {\n return this.useTinyLandmarkNet\n ? nets.faceLandmark68TinyNet\n : nets.faceLandmark68Net;\n }\n}\n\nexport class DetectAllFaceLandmarksTask<\n TSource extends WithFaceDetection<{}>\n> extends DetectFaceLandmarksTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n const detections = parentResults.map((res) => res.detection);\n\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, detections)\n : await extractFaces(this.input, detections);\n\n const faceLandmarksByFace = await Promise.all(faces.map(\n (face) => this.landmarkNet.detectLandmarks(face),\n )) as FaceLandmarks68[];\n\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n\n return parentResults.map((parentResult, i) => extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i]));\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class DetectSingleFaceLandmarksTask> extends DetectFaceLandmarksTaskBase | undefined, TSource | undefined> {\n public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n\n const { detection } = parentResult;\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, [detection])\n : await extractFaces(this.input, [detection]);\n\n const landmarks = await this.landmarkNet.detectLandmarks(faces[0]) as FaceLandmarks68;\n\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n\n return extendWithFaceLandmarks(parentResult, landmarks);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\n\nexport async function extractAllFacesAndComputeResults, TResult>(\n parentResults: TSource[],\n input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n computeResults: (faces: Array) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment: (parentResult: WithFaceLandmarks) => FaceDetection = ({ alignedRect }) => alignedRect,\n) {\n const faceBoxes = parentResults.map((parentResult) => (isWithFaceLandmarks(parentResult)\n ? getRectForAlignment(parentResult)\n : parentResult.detection));\n\n const faces: Array = extractedFaces || (\n input instanceof tf.Tensor\n ? await extractFaceTensors(input, faceBoxes)\n : await extractFaces(input, faceBoxes)\n );\n\n const results = await computeResults(faces);\n\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n\n return results;\n}\n\nexport async function extractSingleFaceAndComputeResult, TResult>(\n parentResult: TSource,\n input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n computeResult: (face: HTMLCanvasElement | tf.Tensor3D) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment?: (parentResultLocal: WithFaceLandmarks) => FaceDetection,\n) {\n return extractAllFacesAndComputeResults(\n [parentResult],\n input,\n async (faces) => computeResult(faces[0]),\n extractedFaces,\n getRectForAlignment,\n );\n}\n", "import { Point } from '../classes/index';\n\nexport const IOU_THRESHOLD = 0.4;\n\nexport const BOX_ANCHORS = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308),\n];\n\nexport const MEAN_RGB: [number, number, number] = [117.001, 114.697, 97.404];\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\nimport { ParamMapping } from '../common/index';\nimport { TNetInput } from '../dom/index';\nimport { ITinyYolov2Options } from '../tinyYolov2/index';\nimport { TinyYolov2Base } from '../tinyYolov2/TinyYolov2Base';\nimport { TinyYolov2NetParams } from '../tinyYolov2/types';\nimport { BOX_ANCHORS, IOU_THRESHOLD, MEAN_RGB } from './const';\n\nexport class TinyFaceDetector extends TinyYolov2Base {\n constructor() {\n const config = {\n withSeparableConvs: true,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\n anchors: BOX_ANCHORS,\n meanRgb: MEAN_RGB,\n isFirstLayerConv2d: true,\n filterSizes: [3, 16, 32, 64, 128, 256, 512],\n };\n\n super(config);\n }\n\n public get anchors(): Point[] {\n return this.config.anchors;\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams);\n return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }));\n }\n\n protected getDefaultModelName(): string {\n return 'tiny_face_detector_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeightMap(weightMap);\n }\n}\n", "import { AgeGenderNet } from '../ageGenderNet/AgeGenderNet';\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { TNetInput } from '../dom/index';\nimport { FaceExpressionNet } from '../faceExpressionNet/FaceExpressionNet';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { FaceRecognitionNet } from '../faceRecognitionNet/FaceRecognitionNet';\nimport { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { ITinyYolov2Options, TinyYolov2 } from '../tinyYolov2/index';\n\nexport const nets = {\n ssdMobilenetv1: new SsdMobilenetv1(),\n tinyFaceDetector: new TinyFaceDetector(),\n tinyYolov2: new TinyYolov2(),\n faceLandmark68Net: new FaceLandmark68Net(),\n faceLandmark68TinyNet: new FaceLandmark68TinyNet(),\n faceRecognitionNet: new FaceRecognitionNet(),\n faceExpressionNet: new FaceExpressionNet(),\n ageGenderNet: new AgeGenderNet(),\n};\n\n/**\n * Attempts to detect all faces in an image using SSD Mobilenetv1 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see SsdMobilenetv1Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const ssdMobilenetv1 = (input: TNetInput, options: SsdMobilenetv1Options): Promise => nets.ssdMobilenetv1.locateFaces(input, options);\n\n/**\n * Attempts to detect all faces in an image using the Tiny Face Detector.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyFaceDetectorOptions constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyFaceDetector = (input: TNetInput, options: TinyFaceDetectorOptions): Promise => nets.tinyFaceDetector.locateFaces(input, options);\n\n/**\n * Attempts to detect all faces in an image using the Tiny Yolov2 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyYolov2Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyYolov2 = (input: TNetInput, options: ITinyYolov2Options): Promise => nets.tinyYolov2.locateFaces(input, options);\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarks = (input: TNetInput): Promise => nets.faceLandmark68Net.detectLandmarks(input);\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image\n * using a tinier version of the 68 point face landmark model, which is slightly\n * faster at inference, but also slightly less accurate.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarksTiny = (input: TNetInput): Promise => nets.faceLandmark68TinyNet.detectLandmarks(input);\n\n/**\n * Computes a 128 entry vector (face descriptor / face embeddings) from the face shown in an image,\n * which uniquely represents the features of that persons face. The computed face descriptor can\n * be used to measure the similarity between faces, by computing the euclidean distance of two\n * face descriptors.\n *\n * @param inputs The face image extracted from the aligned bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Face descriptor with 128 entries or array thereof in case of batch input.\n */\nexport const computeFaceDescriptor = (input: TNetInput): Promise => nets.faceRecognitionNet.computeFaceDescriptor(input);\n\n/**\n * Recognizes the facial expressions from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Facial expressions with corresponding probabilities or array thereof in case of batch input.\n */\nexport const recognizeFaceExpressions = (input: TNetInput): Promise => nets.faceExpressionNet.predictExpressions(input);\n\n/**\n * Predicts age and gender from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Predictions with age, gender and gender probability or array thereof in case of batch input.\n */\nexport const predictAgeAndGender = (input: TNetInput): Promise => nets.ageGenderNet.predictAgeAndGender(input);\n\nexport const loadSsdMobilenetv1Model = (url: string) => nets.ssdMobilenetv1.load(url);\nexport const loadTinyFaceDetectorModel = (url: string) => nets.tinyFaceDetector.load(url);\nexport const loadTinyYolov2Model = (url: string) => nets.tinyYolov2.load(url);\nexport const loadFaceLandmarkModel = (url: string) => nets.faceLandmark68Net.load(url);\nexport const loadFaceLandmarkTinyModel = (url: string) => nets.faceLandmark68TinyNet.load(url);\nexport const loadFaceRecognitionModel = (url: string) => nets.faceRecognitionNet.load(url);\nexport const loadFaceExpressionModel = (url: string) => nets.faceExpressionNet.load(url);\nexport const loadAgeGenderModel = (url: string) => nets.ageGenderNet.load(url);\n\n// backward compatibility\nexport const loadFaceDetectionModel = loadSsdMobilenetv1Model;\nexport const locateFaces = ssdMobilenetv1;\nexport const detectLandmarks = detectFaceLandmarks;\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { TNetInput } from '../dom/index';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderTask, PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\n\nexport class PredictFaceExpressionsTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllFaceExpressionsTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictFaceExpressionsTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n\n const faceExpressionsByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => Promise.all(faces.map(\n (face) => nets.faceExpressionNet.predictExpressions(face) as Promise,\n )),\n this.extractedFaces,\n );\n\n return parentResults.map(\n (parentResult, i) => extendWithFaceExpressions(parentResult, faceExpressionsByFace[i]),\n );\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(this, this.input);\n }\n}\n\nexport class PredictSingleFaceExpressionsTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictFaceExpressionsTaskBase | undefined, TSource | undefined> {\n public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n\n const faceExpressions = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.faceExpressionNet.predictExpressions(face) as Promise,\n this.extractedFaces,\n );\n\n return extendWithFaceExpressions(parentResult, faceExpressions);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(this, this.input);\n }\n}\n\nexport class PredictAllFaceExpressionsWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictAllFaceExpressionsTask {\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class PredictSingleFaceExpressionsWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictSingleFaceExpressionsTask {\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { TNetInput } from '../dom/index';\nimport { extendWithAge, WithAge } from '../factories/WithAge';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { extendWithGender, WithGender } from '../factories/WithGender';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllFaceExpressionsTask, PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class PredictAgeAndGenderTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllAgeAndGenderTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictAgeAndGenderTaskBase>[], TSource[]> {\n public async run(): Promise>[]> {\n const parentResults = await this.parentTask;\n\n const ageAndGenderByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => Promise.all(faces.map(\n (face) => nets.ageGenderNet.predictAgeAndGender(face) as Promise,\n )),\n this.extractedFaces,\n );\n\n return parentResults.map((parentResult, i) => {\n const { age, gender, genderProbability } = ageAndGenderByFace[i];\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age);\n });\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask(this, this.input);\n }\n}\n\nexport class PredictSingleAgeAndGenderTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictAgeAndGenderTaskBase> | undefined, TSource | undefined> {\n public async run(): Promise> | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n\n const { age, gender, genderProbability } = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.ageGenderNet.predictAgeAndGender(face) as Promise,\n this.extractedFaces,\n );\n\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(this, this.input);\n }\n}\n\nexport class PredictAllAgeAndGenderWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictAllAgeAndGenderTask {\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class PredictSingleAgeAndGenderWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictSingleAgeAndGenderTask {\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { TNetInput } from '../dom/index';\nimport { extendWithFaceDescriptor, WithFaceDescriptor } from '../factories/WithFaceDescriptor';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class ComputeFaceDescriptorsTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n ) {\n super();\n }\n}\n\nexport class ComputeAllFaceDescriptorsTask<\n TSource extends WithFaceLandmarks>\n> extends ComputeFaceDescriptorsTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n\n const descriptors = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n (faces) => Promise.all(faces.map((face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise)),\n null,\n (parentResult) => parentResult.landmarks.align(null, { useDlibAlignment: true }),\n );\n\n return descriptors.map((descriptor, i) => extendWithFaceDescriptor(parentResults[i], descriptor));\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n}\n\nexport class ComputeSingleFaceDescriptorTask<\n TSource extends WithFaceLandmarks>\n> extends ComputeFaceDescriptorsTaskBase | undefined, TSource | undefined> {\n public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n const descriptor = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise,\n null,\n // eslint-disable-next-line no-shadow\n (parentResult) => parentResult.landmarks.align(null, { useDlibAlignment: true }),\n );\n\n return extendWithFaceDescriptor(parentResult, descriptor);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { TNetInput } from '../dom/index';\nimport { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { TinyYolov2Options } from '../tinyYolov2/index';\nimport { ComposableTask } from './ComposableTask';\nimport { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderTask, PredictSingleAgeAndGenderTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsTask, PredictSingleFaceExpressionsTask } from './PredictFaceExpressionsTask';\nimport { FaceDetectionOptions } from './types';\n\nexport class DetectFacesTaskBase extends ComposableTask {\n // eslint-disable-next-line no-unused-vars\n constructor(protected input: TNetInput, protected options: FaceDetectionOptions = new SsdMobilenetv1Options()) {\n super();\n }\n}\n\nexport class DetectAllFacesTask extends DetectFacesTaskBase {\n public async run(): Promise {\n const { input, options } = this;\n let result;\n if (options instanceof TinyFaceDetectorOptions) result = nets.tinyFaceDetector.locateFaces(input, options);\n else if (options instanceof SsdMobilenetv1Options) result = nets.ssdMobilenetv1.locateFaces(input, options);\n else if (options instanceof TinyYolov2Options) result = nets.tinyYolov2.locateFaces(input, options);\n else throw new Error('detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options');\n\n return result;\n }\n\n private runAndExtendWithFaceDetections(): Promise[]> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise[]>(async (resolve) => {\n const detections = await this.run();\n resolve(detections.map((detection) => extendWithFaceDetection({}, detection)));\n });\n }\n\n withFaceLandmarks(useTinyLandmarkNet: boolean = false) {\n return new DetectAllFaceLandmarksTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n useTinyLandmarkNet,\n );\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n );\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n );\n }\n}\n\nexport class DetectSingleFaceTask extends DetectFacesTaskBase {\n public async run(): Promise {\n const faceDetections = await new DetectAllFacesTask(this.input, this.options);\n let faceDetectionWithHighestScore = faceDetections[0];\n faceDetections.forEach((faceDetection) => {\n if (faceDetection.score > faceDetectionWithHighestScore.score) faceDetectionWithHighestScore = faceDetection;\n });\n return faceDetectionWithHighestScore;\n }\n\n private runAndExtendWithFaceDetection(): Promise | undefined> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise | undefined>(async (resolve) => {\n const detection = await this.run();\n resolve(detection ? extendWithFaceDetection<{}>({}, detection) : undefined);\n });\n }\n\n withFaceLandmarks(useTinyLandmarkNet: boolean = false) {\n return new DetectSingleFaceLandmarksTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n useTinyLandmarkNet,\n );\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n );\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n );\n }\n}\n", "import { TNetInput } from '../dom/index';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { DetectAllFacesTask, DetectSingleFaceTask } from './DetectFacesTasks';\nimport { FaceDetectionOptions } from './types';\n\nexport function detectSingleFace(input: TNetInput, options: FaceDetectionOptions = new SsdMobilenetv1Options()): DetectSingleFaceTask {\n return new DetectSingleFaceTask(input, options);\n}\n\nexport function detectAllFaces(input: TNetInput, options: FaceDetectionOptions = new SsdMobilenetv1Options()): DetectAllFacesTask {\n return new DetectAllFacesTask(input, options);\n}\n", "import { TNetInput } from '../dom/index';\nimport { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories/index';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/index';\nimport { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\nimport { detectAllFaces } from './detectFaces';\n\nexport async function allFacesSsdMobilenetv1(input: TNetInput, minConfidence?: number): Promise>>[]> {\n return detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? { minConfidence } : {}))\n .withFaceLandmarks()\n .withFaceDescriptors();\n}\n\nexport async function allFacesTinyYolov2(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise>>[]> {\n return detectAllFaces(input, new TinyYolov2Options(forwardParams))\n .withFaceLandmarks()\n .withFaceDescriptors();\n}\n\nexport const allFaces = allFacesSsdMobilenetv1;\n", "export function euclideanDistance(arr1: number[] | Float32Array, arr2: number[] | Float32Array) {\n if (arr1.length !== arr2.length) throw new Error('euclideanDistance: arr1.length !== arr2.length');\n\n const desc1 = Array.from(arr1);\n const desc2 = Array.from(arr2);\n\n return Math.sqrt(\n desc1\n .map((val, i) => val - desc2[i])\n .reduce((res, diff) => res + (diff ** 2), 0),\n );\n}\n", "import { FaceMatch } from '../classes/FaceMatch';\nimport { LabeledFaceDescriptors } from '../classes/LabeledFaceDescriptors';\nimport { euclideanDistance } from '../euclideanDistance';\nimport { WithFaceDescriptor } from '../factories/index';\n\nexport class FaceMatcher {\n private _labeledDescriptors: LabeledFaceDescriptors[]\n\n private _distanceThreshold: number\n\n constructor(\n inputs: LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>,\n distanceThreshold: number = 0.6,\n ) {\n this._distanceThreshold = distanceThreshold;\n\n const inputArray = Array.isArray(inputs) ? inputs : [inputs];\n\n if (!inputArray.length) {\n throw new Error('FaceRecognizer.constructor - expected atleast one input');\n }\n\n let count = 1;\n const createUniqueLabel = () => `person ${count++}`;\n\n this._labeledDescriptors = inputArray.map((desc) => {\n if (desc instanceof LabeledFaceDescriptors) {\n return desc;\n }\n\n if (desc instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc]);\n }\n\n if (desc.descriptor && desc.descriptor instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc.descriptor]);\n }\n\n throw new Error('FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>');\n });\n }\n\n public get labeledDescriptors(): LabeledFaceDescriptors[] { return this._labeledDescriptors; }\n\n public get distanceThreshold(): number { return this._distanceThreshold; }\n\n public computeMeanDistance(queryDescriptor: Float32Array, descriptors: Float32Array[]): number {\n return descriptors\n .map((d) => euclideanDistance(d, queryDescriptor))\n .reduce((d1, d2) => d1 + d2, 0)\n / (descriptors.length || 1);\n }\n\n public matchDescriptor(queryDescriptor: Float32Array): FaceMatch {\n return this.labeledDescriptors\n .map(({ descriptors, label }) => new FaceMatch(\n label,\n this.computeMeanDistance(queryDescriptor, descriptors),\n ))\n .reduce((best, curr) => (best.distance < curr.distance ? best : curr));\n }\n\n public findBestMatch(queryDescriptor: Float32Array): FaceMatch {\n const bestMatch = this.matchDescriptor(queryDescriptor);\n return bestMatch.distance < this.distanceThreshold\n ? bestMatch\n : new FaceMatch('unknown', bestMatch.distance);\n }\n\n public toJSON(): any {\n return {\n distanceThreshold: this.distanceThreshold,\n labeledDescriptors: this.labeledDescriptors.map((ld) => ld.toJSON()),\n };\n }\n\n public static fromJSON(json: any): FaceMatcher {\n const labeledDescriptors = json.labeledDescriptors\n .map((ld: any) => LabeledFaceDescriptors.fromJSON(ld));\n return new FaceMatcher(labeledDescriptors, json.distanceThreshold);\n }\n}\n", "import { TinyFaceDetector } from './TinyFaceDetector';\n\nexport * from './TinyFaceDetector';\nexport * from './TinyFaceDetectorOptions';\n\nexport function createTinyFaceDetector(weights: Float32Array) {\n const net = new TinyFaceDetector();\n net.extractWeights(weights);\n return net;\n}\n", "import { Dimensions, IDimensions } from './classes/index';\nimport { FaceDetection } from './classes/FaceDetection';\nimport { FaceLandmarks } from './classes/FaceLandmarks';\nimport { extendWithFaceDetection, isWithFaceDetection } from './factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, isWithFaceLandmarks } from './factories/WithFaceLandmarks';\n\nexport function resizeResults(results: T, dimensions: IDimensions): T {\n const { width, height } = new Dimensions(dimensions.width, dimensions.height);\n\n if (width <= 0 || height <= 0) {\n throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({ width, height })}`);\n }\n\n if (Array.isArray(results)) {\n // return results.map(obj => resizeResults(obj, { width, height })) as any as T\n return (results as Array).map((obj) => resizeResults(obj, { width, height } as IDimensions)) as any as T;\n }\n\n if (isWithFaceLandmarks(results)) {\n const resizedDetection = results.detection.forSize(width, height);\n const resizedLandmarks = results.unshiftedLandmarks.forSize(resizedDetection.box.width, resizedDetection.box.height);\n return extendWithFaceLandmarks(extendWithFaceDetection(results, resizedDetection), resizedLandmarks);\n }\n\n if (isWithFaceDetection(results)) {\n return extendWithFaceDetection(results, results.detection.forSize(width, height));\n }\n\n if (results instanceof FaceLandmarks || results instanceof FaceDetection) {\n return (results as any).forSize(width, height);\n }\n\n return results;\n}\n"], - "mappings": "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", + "sources": ["../src/tfjs/tf-browser.ts", "../src/draw/index.ts", "../src/draw/drawContour.ts", "../src/utils/index.ts", "../src/classes/Dimensions.ts", "../src/classes/Point.ts", "../src/classes/Box.ts", "../src/classes/BoundingBox.ts", "../src/classes/ObjectDetection.ts", "../src/classes/FaceDetection.ts", "../src/ops/iou.ts", "../src/ops/minBbox.ts", "../src/ops/nonMaxSuppression.ts", "../src/ops/normalize.ts", "../src/ops/padToSquare.ts", "../src/ops/shuffleArray.ts", "../src/ops/index.ts", "../src/classes/Rect.ts", "../src/classes/FaceLandmarks.ts", "../src/classes/FaceLandmarks5.ts", "../src/classes/FaceLandmarks68.ts", "../src/classes/FaceMatch.ts", "../src/classes/LabeledBox.ts", "../src/classes/LabeledFaceDescriptors.ts", "../src/classes/PredictedBox.ts", "../src/factories/WithFaceDetection.ts", "../src/env/createBrowserEnv.ts", "../src/env/createFileSystem.ts", "../src/env/createNodejsEnv.ts", "../src/env/isBrowser.ts", "../src/env/isNodejs.ts", "../src/env/index.ts", "../src/dom/resolveInput.ts", "../src/dom/getContext2dOrThrow.ts", "../src/draw/DrawTextField.ts", "../src/draw/DrawBox.ts", "../src/draw/drawDetections.ts", "../src/dom/isMediaLoaded.ts", "../src/dom/awaitMediaLoaded.ts", "../src/dom/bufferToImage.ts", "../src/dom/getMediaDimensions.ts", "../src/dom/createCanvas.ts", "../src/dom/imageTensorToCanvas.ts", "../src/dom/isMediaElement.ts", "../src/dom/imageToSquare.ts", "../src/dom/NetInput.ts", "../src/dom/toNetInput.ts", "../src/dom/extractFaces.ts", "../src/dom/extractFaceTensors.ts", "../src/dom/fetchOrThrow.ts", "../src/dom/fetchImage.ts", "../src/dom/fetchJson.ts", "../src/dom/fetchNetWeights.ts", "../src/common/getModelUris.ts", "../src/dom/loadWeightMap.ts", "../src/dom/matchDimensions.ts", "../src/NeuralNetwork.ts", "../src/common/depthwiseSeparableConv.ts", "../src/faceFeatureExtractor/denseBlock.ts", "../src/common/convLayer.ts", "../src/common/disposeUnusedWeightTensors.ts", "../src/common/extractConvParamsFactory.ts", "../src/common/extractFCParamsFactory.ts", "../src/common/types.ts", "../src/common/extractSeparableConvParamsFactory.ts", "../src/common/extractWeightEntryFactory.ts", "../src/common/extractWeightsFactory.ts", "../src/faceFeatureExtractor/extractorsFactory.ts", "../src/faceFeatureExtractor/extractParams.ts", "../src/common/loadConvParamsFactory.ts", "../src/faceFeatureExtractor/loadParamsFactory.ts", "../src/faceFeatureExtractor/extractParamsFromWeightMap.ts", "../src/faceFeatureExtractor/FaceFeatureExtractor.ts", "../src/common/fullyConnectedLayer.ts", "../src/faceProcessor/extractParams.ts", "../src/faceProcessor/extractParamsFromWeightMap.ts", "../src/faceProcessor/util.ts", "../src/faceProcessor/FaceProcessor.ts", "../src/faceExpressionNet/FaceExpressions.ts", "../src/faceExpressionNet/FaceExpressionNet.ts", "../src/factories/WithFaceExpressions.ts", "../src/draw/drawFaceExpressions.ts", "../src/factories/WithFaceLandmarks.ts", "../src/draw/DrawFaceLandmarks.ts", "../src/xception/extractParams.ts", "../src/xception/extractParamsFromWeightMap.ts", "../src/xception/TinyXception.ts", "../src/ageGenderNet/extractParams.ts", "../src/ageGenderNet/extractParamsFromWeightMap.ts", "../src/ageGenderNet/types.ts", "../src/ageGenderNet/AgeGenderNet.ts", "../src/faceLandmarkNet/FaceLandmark68NetBase.ts", "../src/faceLandmarkNet/FaceLandmark68Net.ts", "../src/faceFeatureExtractor/extractParamsFromWeightMapTiny.ts", "../src/faceFeatureExtractor/extractParamsTiny.ts", "../src/faceFeatureExtractor/TinyFaceFeatureExtractor.ts", "../src/faceLandmarkNet/FaceLandmark68TinyNet.ts", "../src/faceLandmarkNet/index.ts", "../src/faceRecognitionNet/scaleLayer.ts", "../src/faceRecognitionNet/convLayer.ts", "../src/faceRecognitionNet/extractParams.ts", "../src/faceRecognitionNet/extractParamsFromWeightMap.ts", "../src/faceRecognitionNet/residualLayer.ts", "../src/faceRecognitionNet/FaceRecognitionNet.ts", "../src/faceRecognitionNet/index.ts", "../src/factories/WithFaceDescriptor.ts", "../src/factories/WithAge.ts", "../src/factories/WithGender.ts", "../src/ssdMobilenetv1/extractParams.ts", "../src/ssdMobilenetv1/extractParamsFromWeightMap.ts", "../src/ssdMobilenetv1/pointwiseConvLayer.ts", "../src/ssdMobilenetv1/mobileNetV1.ts", "../src/ssdMobilenetv1/nonMaxSuppression.ts", "../src/ssdMobilenetv1/outputLayer.ts", "../src/ssdMobilenetv1/boxPredictionLayer.ts", "../src/ssdMobilenetv1/predictionLayer.ts", "../src/ssdMobilenetv1/SsdMobilenetv1Options.ts", "../src/ssdMobilenetv1/SsdMobilenetv1.ts", "../src/ssdMobilenetv1/index.ts", "../src/tinyYolov2/const.ts", "../src/tinyYolov2/config.ts", "../src/tinyYolov2/leaky.ts", "../src/tinyYolov2/convWithBatchNorm.ts", "../src/tinyYolov2/depthwiseSeparableConv.ts", "../src/tinyYolov2/extractParams.ts", "../src/tinyYolov2/extractParamsFromWeightMap.ts", "../src/tinyYolov2/TinyYolov2Options.ts", "../src/tinyYolov2/TinyYolov2Base.ts", "../src/tinyYolov2/TinyYolov2.ts", "../src/tinyYolov2/index.ts", "../src/tinyFaceDetector/TinyFaceDetectorOptions.ts", "../src/globalApi/ComposableTask.ts", "../src/globalApi/extractFacesAndComputeResults.ts", "../src/tinyFaceDetector/const.ts", "../src/tinyFaceDetector/TinyFaceDetector.ts", "../src/globalApi/nets.ts", "../src/globalApi/PredictFaceExpressionsTask.ts", "../src/globalApi/PredictAgeAndGenderTask.ts", "../src/globalApi/ComputeFaceDescriptorsTasks.ts", "../src/globalApi/DetectFaceLandmarksTasks.ts", "../src/globalApi/DetectFacesTasks.ts", "../src/globalApi/detectFaces.ts", "../src/globalApi/allFaces.ts", "../src/euclideanDistance.ts", "../src/globalApi/FaceMatcher.ts", "../src/tinyFaceDetector/index.ts", "../src/resizeResults.ts", "../src/index.ts"], + "sourcesContent": ["/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable node/no-unpublished-import */\n\n// wrapper to load tfjs in a single place so version can be changed quickly\n\nexport * from '@tensorflow/tfjs/dist/index.js';\nexport * from '@tensorflow/tfjs-backend-wasm';\n", "export * from './drawContour';\nexport * from './drawDetections';\nexport * from './drawFaceExpressions';\nexport * from './DrawBox';\nexport * from './DrawFaceLandmarks';\nexport * from './DrawTextField';\n", "import { Point } from '../classes/index';\n\nexport function drawContour(\n ctx: CanvasRenderingContext2D,\n points: Point[],\n isClosed: boolean = false,\n) {\n ctx.beginPath();\n\n points.slice(1).forEach(({ x, y }, prevIdx) => {\n const from = points[prevIdx];\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(x, y);\n });\n\n if (isClosed) {\n const from = points[points.length - 1];\n const to = points[0];\n if (!from || !to) {\n return;\n }\n\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n }\n\n ctx.stroke();\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Point } from '../classes/index';\nimport { Dimensions, IDimensions } from '../classes/Dimensions';\n\nexport function isTensor(tensor: any, dim: number) {\n return tensor instanceof tf.Tensor && tensor.shape.length === dim;\n}\n\nexport function isTensor1D(tensor: any): tensor is tf.Tensor1D {\n return isTensor(tensor, 1);\n}\n\nexport function isTensor2D(tensor: any): tensor is tf.Tensor2D {\n return isTensor(tensor, 2);\n}\n\nexport function isTensor3D(tensor: any): tensor is tf.Tensor3D {\n return isTensor(tensor, 3);\n}\n\nexport function isTensor4D(tensor: any): tensor is tf.Tensor4D {\n return isTensor(tensor, 4);\n}\n\nexport function isFloat(num: number) {\n return num % 1 !== 0;\n}\n\nexport function isEven(num: number) {\n return num % 2 === 0;\n}\n\nexport function round(num: number, prec: number = 2) {\n const f = 10 ** prec;\n return Math.floor(num * f) / f;\n}\n\nexport function isDimensions(obj: any): boolean {\n return obj && obj.width && obj.height;\n}\n\nexport function computeReshapedDimensions({ width, height }: IDimensions, inputSize: number) {\n const scale = inputSize / Math.max(height, width);\n return new Dimensions(Math.round(width * scale), Math.round(height * scale));\n}\n\nexport function getCenterPoint(pts: Point[]): Point {\n return pts.reduce((sum, pt) => sum.add(pt), new Point(0, 0))\n .div(new Point(pts.length, pts.length));\n}\n\nexport function range(num: number, start: number, step: number): number[] {\n return Array(num).fill(0).map((_, i) => start + (i * step));\n}\n\nexport function isValidNumber(num: any) {\n return !!num && (num !== Infinity) && (num !== -Infinity) && !Number.isNaN(num) || num === 0;\n}\n\nexport function isValidProbablitiy(num: any) {\n return isValidNumber(num) && num >= 0 && num <= 1.0;\n}\n", "import { isValidNumber } from '../utils/index';\n\nexport interface IDimensions {\n width: number\n height: number\n}\n\nexport class Dimensions implements IDimensions {\n private _width: number\n\n private _height: number\n\n constructor(width: number, height: number) {\n if (!isValidNumber(width) || !isValidNumber(height)) {\n throw new Error(`Dimensions.constructor - expected width and height to be valid numbers, instead have ${JSON.stringify({ width, height })}`);\n }\n\n this._width = width;\n this._height = height;\n }\n\n public get width(): number { return this._width; }\n\n public get height(): number { return this._height; }\n\n public reverse(): Dimensions {\n return new Dimensions(1 / this.width, 1 / this.height);\n }\n}\n", "export interface IPoint {\n x: number\n y: number\n}\n\nexport class Point implements IPoint {\n private _x: number\n\n private _y: number\n\n constructor(x: number, y: number) {\n this._x = x;\n this._y = y;\n }\n\n get x(): number { return this._x; }\n\n get y(): number { return this._y; }\n\n public add(pt: IPoint): Point {\n return new Point(this.x + pt.x, this.y + pt.y);\n }\n\n public sub(pt: IPoint): Point {\n return new Point(this.x - pt.x, this.y - pt.y);\n }\n\n public mul(pt: IPoint): Point {\n return new Point(this.x * pt.x, this.y * pt.y);\n }\n\n public div(pt: IPoint): Point {\n return new Point(this.x / pt.x, this.y / pt.y);\n }\n\n public abs(): Point {\n return new Point(Math.abs(this.x), Math.abs(this.y));\n }\n\n public magnitude(): number {\n return Math.sqrt((this.x ** 2) + (this.y ** 2));\n }\n\n public floor(): Point {\n return new Point(Math.floor(this.x), Math.floor(this.y));\n }\n}\n", "import { isDimensions, isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { IDimensions } from './Dimensions';\nimport { Point } from './Point';\nimport { IRect } from './Rect';\n\nexport class Box implements IBoundingBox, IRect {\n public static isRect(rect: any): boolean {\n return !!rect && [rect.x, rect.y, rect.width, rect.height].every(isValidNumber);\n }\n\n public static assertIsValidBox(box: any, callee: string, allowNegativeDimensions: boolean = false) {\n if (!Box.isRect(box)) {\n throw new Error(`${callee} - invalid box: ${JSON.stringify(box)}, expected object with properties x, y, width, height`);\n }\n\n if (!allowNegativeDimensions && (box.width < 0 || box.height < 0)) {\n throw new Error(`${callee} - width (${box.width}) and height (${box.height}) must be positive numbers`);\n }\n }\n\n private _x: number\n\n private _y: number\n\n private _width: number\n\n private _height: number\n\n constructor(_box: IBoundingBox | IRect, allowNegativeDimensions: boolean = true) {\n const box = (_box || {}) as any;\n\n const isBbox = [box.left, box.top, box.right, box.bottom].every(isValidNumber);\n const isRect = [box.x, box.y, box.width, box.height].every(isValidNumber);\n\n if (!isRect && !isBbox) {\n throw new Error(`Box.constructor - expected box to be IBoundingBox | IRect, instead have ${JSON.stringify(box)}`);\n }\n\n const [x, y, width, height] = isRect\n ? [box.x, box.y, box.width, box.height]\n : [box.left, box.top, box.right - box.left, box.bottom - box.top];\n\n Box.assertIsValidBox({\n x, y, width, height,\n }, 'Box.constructor', allowNegativeDimensions);\n\n this._x = x;\n this._y = y;\n this._width = width;\n this._height = height;\n }\n\n public get x(): number { return this._x; }\n\n public get y(): number { return this._y; }\n\n public get width(): number { return this._width; }\n\n public get height(): number { return this._height; }\n\n public get left(): number { return this.x; }\n\n public get top(): number { return this.y; }\n\n public get right(): number { return this.x + this.width; }\n\n public get bottom(): number { return this.y + this.height; }\n\n public get area(): number { return this.width * this.height; }\n\n public get topLeft(): Point { return new Point(this.left, this.top); }\n\n public get topRight(): Point { return new Point(this.right, this.top); }\n\n public get bottomLeft(): Point { return new Point(this.left, this.bottom); }\n\n public get bottomRight(): Point { return new Point(this.right, this.bottom); }\n\n public round(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map((val) => Math.round(val));\n return new Box({\n x, y, width, height,\n });\n }\n\n public floor(): Box {\n const [x, y, width, height] = [this.x, this.y, this.width, this.height]\n .map((val) => Math.floor(val));\n return new Box({\n x, y, width, height,\n });\n }\n\n public toSquare(): Box {\n let {\n x, y, width, height,\n } = this;\n const diff = Math.abs(width - height);\n if (width < height) {\n x -= (diff / 2);\n width += diff;\n }\n if (height < width) {\n y -= (diff / 2);\n height += diff;\n }\n\n return new Box({ x, y, width, height });\n }\n\n public rescale(s: IDimensions | number): Box {\n const scaleX = isDimensions(s) ? (s as IDimensions).width : s as number;\n const scaleY = isDimensions(s) ? (s as IDimensions).height : s as number;\n return new Box({\n x: this.x * scaleX,\n y: this.y * scaleY,\n width: this.width * scaleX,\n height: this.height * scaleY,\n });\n }\n\n public pad(padX: number, padY: number): Box {\n const [x, y, width, height] = [\n this.x - (padX / 2),\n this.y - (padY / 2),\n this.width + padX,\n this.height + padY,\n ];\n return new Box({\n x, y, width, height,\n });\n }\n\n public clipAtImageBorders(imgWidth: number, imgHeight: number): Box {\n const { x, y, right, bottom } = this;\n const clippedX = Math.max(x, 0);\n const clippedY = Math.max(y, 0);\n\n const newWidth = right - clippedX;\n const newHeight = bottom - clippedY;\n const clippedWidth = Math.min(newWidth, imgWidth - clippedX);\n const clippedHeight = Math.min(newHeight, imgHeight - clippedY);\n\n return (new Box({\n x: clippedX, y: clippedY, width: clippedWidth, height: clippedHeight,\n })).floor();\n }\n\n public shift(sx: number, sy: number): Box {\n const { width, height } = this;\n const x = this.x + sx;\n const y = this.y + sy;\n\n return new Box({\n x, y, width, height,\n });\n }\n\n public padAtBorders(imageHeight: number, imageWidth: number) {\n const w = this.width + 1;\n const h = this.height + 1;\n\n const dx = 1;\n const dy = 1;\n let edx = w;\n let edy = h;\n\n let x = this.left;\n let y = this.top;\n let ex = this.right;\n let ey = this.bottom;\n\n if (ex > imageWidth) {\n edx = -ex + imageWidth + w;\n ex = imageWidth;\n }\n if (ey > imageHeight) {\n edy = -ey + imageHeight + h;\n ey = imageHeight;\n }\n if (x < 1) {\n edy = 2 - x;\n x = 1;\n }\n if (y < 1) {\n edy = 2 - y;\n y = 1;\n }\n\n return {\n dy, edy, dx, edx, y, ey, x, ex, w, h,\n };\n }\n\n public calibrate(region: Box) {\n return new Box({\n left: this.left + (region.left * this.width),\n top: this.top + (region.top * this.height),\n right: this.right + (region.right * this.width),\n bottom: this.bottom + (region.bottom * this.height),\n }).toSquare().round();\n }\n}\n", "import { Box } from './Box';\n\nexport interface IBoundingBox {\n left: number\n top: number\n right: number\n bottom: number\n}\n\nexport class BoundingBox extends Box implements IBoundingBox {\n constructor(left: number, top: number, right: number, bottom: number, allowNegativeDimensions: boolean = false) {\n super({\n left, top, right, bottom,\n }, allowNegativeDimensions);\n }\n}\n", "import { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { IRect, Rect } from './Rect';\n\nexport class ObjectDetection {\n private _score: number\n\n private _classScore: number\n\n private _className: string\n\n private _box: Rect\n\n private _imageDims: Dimensions\n\n constructor(\n score: number,\n classScore: number,\n className: string,\n relativeBox: IRect,\n imageDims: IDimensions,\n ) {\n this._imageDims = new Dimensions(imageDims.width, imageDims.height);\n this._score = score;\n this._classScore = classScore;\n this._className = className;\n this._box = new Box(relativeBox).rescale(this._imageDims);\n }\n\n public get score(): number { return this._score; }\n\n public get classScore(): number { return this._classScore; }\n\n public get className(): string { return this._className; }\n\n public get box(): Box { return this._box; }\n\n public get imageDims(): Dimensions { return this._imageDims; }\n\n public get imageWidth(): number { return this.imageDims.width; }\n\n public get imageHeight(): number { return this.imageDims.height; }\n\n public get relativeBox(): Box { return new Box(this._box).rescale(this.imageDims.reverse()); }\n\n public forSize(width: number, height: number): ObjectDetection {\n return new ObjectDetection(\n this.score,\n this.classScore,\n this.className,\n this.relativeBox,\n { width, height },\n );\n }\n}\n", "import { Box } from './Box';\nimport { IDimensions } from './Dimensions';\nimport { ObjectDetection } from './ObjectDetection';\nimport { Rect } from './Rect';\n\nexport interface IFaceDetecion {\n score: number\n box: Box\n}\n\nexport class FaceDetection extends ObjectDetection implements IFaceDetecion {\n constructor(\n score: number,\n relativeBox: Rect,\n imageDims: IDimensions,\n ) {\n super(score, score, '', relativeBox, imageDims);\n }\n\n public forSize(width: number, height: number): FaceDetection {\n const { score, relativeBox, imageDims } = super.forSize(width, height);\n return new FaceDetection(score, relativeBox, imageDims);\n }\n}\n", "import { Box } from '../classes/Box';\n\nexport function iou(box1: Box, box2: Box, isIOU: boolean = true) {\n const width = Math.max(0.0, Math.min(box1.right, box2.right) - Math.max(box1.left, box2.left));\n const height = Math.max(0.0, Math.min(box1.bottom, box2.bottom) - Math.max(box1.top, box2.top));\n const interSection = width * height;\n\n return isIOU\n ? interSection / (box1.area + box2.area - interSection)\n : interSection / Math.min(box1.area, box2.area);\n}\n", "import { BoundingBox, IPoint } from '../classes/index';\n\nexport function minBbox(pts: IPoint[]): BoundingBox {\n const xs = pts.map((pt) => pt.x);\n const ys = pts.map((pt) => pt.y);\n const minX = xs.reduce((min, x) => (x < min ? x : min), Infinity);\n const minY = ys.reduce((min, y) => (y < min ? y : min), Infinity);\n const maxX = xs.reduce((max, x) => (max < x ? x : max), 0);\n const maxY = ys.reduce((max, y) => (max < y ? y : max), 0);\n\n return new BoundingBox(minX, minY, maxX, maxY);\n}\n", "import { Box } from '../classes/Box';\nimport { iou } from './iou';\n\nexport function nonMaxSuppression(\n boxes: Box[],\n scores: number[],\n iouThreshold: number,\n isIOU: boolean = true,\n): number[] {\n let indicesSortedByScore = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .sort((c1, c2) => c1.score - c2.score)\n .map((c) => c.boxIndex);\n\n const pick: number[] = [];\n\n while (indicesSortedByScore.length > 0) {\n const curr = indicesSortedByScore.pop() as number;\n pick.push(curr);\n\n const indices = indicesSortedByScore;\n\n const outputs: number[] = [];\n for (let i = 0; i < indices.length; i++) {\n const idx = indices[i];\n\n const currBox = boxes[curr];\n const idxBox = boxes[idx];\n\n outputs.push(iou(currBox, idxBox, isIOU));\n }\n\n indicesSortedByScore = indicesSortedByScore.filter(\n (_, j) => outputs[j] <= iouThreshold,\n );\n }\n\n return pick;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function normalize(x: tf.Tensor4D, meanRgb: number[]): tf.Tensor4D {\n return tf.tidy(() => {\n const [r, g, b] = meanRgb;\n const avg_r = tf.fill([...x.shape.slice(0, 3), 1], r, 'float32');\n const avg_g = tf.fill([...x.shape.slice(0, 3), 1], g, 'float32');\n const avg_b = tf.fill([...x.shape.slice(0, 3), 1], b, 'float32');\n const avg_rgb = tf.concat([avg_r, avg_g, avg_b], 3);\n\n return tf.sub(x, avg_rgb);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\n/**\n * Pads the smaller dimension of an image tensor with zeros, such that width === height.\n *\n * @param imgTensor The image tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The padded tensor with width === height.\n */\nexport function padToSquare(\n imgTensor: tf.Tensor4D,\n isCenterImage: boolean = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const [height, width] = imgTensor.shape.slice(1);\n if (height === width) {\n return imgTensor;\n }\n\n const dimDiff = Math.abs(height - width);\n const paddingAmount = Math.round(dimDiff * (isCenterImage ? 0.5 : 1));\n const paddingAxis = height > width ? 2 : 1;\n\n const createPaddingTensor = (paddingAmountLocal: number): tf.Tensor => {\n const paddingTensorShape = imgTensor.shape.slice();\n paddingTensorShape[paddingAxis] = paddingAmountLocal;\n return tf.fill(paddingTensorShape, 0, 'float32');\n };\n\n const paddingTensorAppend = createPaddingTensor(paddingAmount);\n const remainingPaddingAmount = dimDiff - (paddingTensorAppend.shape[paddingAxis] as number);\n\n const paddingTensorPrepend = isCenterImage && remainingPaddingAmount\n ? createPaddingTensor(remainingPaddingAmount)\n : null;\n\n const tensorsToStack = [\n paddingTensorPrepend,\n imgTensor,\n paddingTensorAppend,\n ]\n .filter((t) => !!t)\n .map((t: tf.Tensor) => tf.cast(t, 'float32')) as tf.Tensor4D[];\n return tf.concat(tensorsToStack, paddingAxis);\n });\n}\n", "export function shuffleArray(inputArray: any[]) {\n const array = inputArray.slice();\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const x = array[i];\n array[i] = array[j];\n array[j] = x;\n }\n return array;\n}\n", "export * from './iou';\nexport * from './minBbox';\nexport * from './nonMaxSuppression';\nexport * from './normalize';\nexport * from './padToSquare';\nexport * from './shuffleArray';\n\nexport function sigmoid(x: number) {\n return 1 / (1 + Math.exp(-x));\n}\n\nexport function inverseSigmoid(x: number) {\n return Math.log(x / (1 - x));\n}\n", "import { Box } from './Box';\n\nexport interface IRect {\n x: number\n y: number\n width: number\n height: number\n}\n\nexport class Rect extends Box implements IRect {\n constructor(x: number, y: number, width: number, height: number, allowNegativeDimensions: boolean = false) {\n super({\n x, y, width, height,\n }, allowNegativeDimensions);\n }\n}\n", "import { minBbox } from '../ops/index';\nimport { getCenterPoint } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { Dimensions, IDimensions } from './Dimensions';\nimport { FaceDetection } from './FaceDetection';\nimport { Point } from './Point';\nimport { IRect, Rect } from './Rect';\n\n// face alignment constants\nconst relX = 0.5;\nconst relY = 0.43;\nconst relScale = 0.45;\n\nexport interface IFaceLandmarks {\n positions: Point[]\n shift: Point\n}\n\nexport class FaceLandmarks implements IFaceLandmarks {\n protected _shift: Point\n\n protected _positions: Point[]\n\n protected _imgDims: Dimensions\n\n constructor(\n relativeFaceLandmarkPositions: Point[],\n imgDims: IDimensions,\n shift: Point = new Point(0, 0),\n ) {\n const { width, height } = imgDims;\n this._imgDims = new Dimensions(width, height);\n this._shift = shift;\n this._positions = relativeFaceLandmarkPositions.map(\n (pt) => pt.mul(new Point(width, height)).add(shift),\n );\n }\n\n public get shift(): Point { return new Point(this._shift.x, this._shift.y); }\n\n public get imageWidth(): number { return this._imgDims.width; }\n\n public get imageHeight(): number { return this._imgDims.height; }\n\n public get positions(): Point[] { return this._positions; }\n\n public get relativePositions(): Point[] {\n return this._positions.map(\n (pt) => pt.sub(this._shift).div(new Point(this.imageWidth, this.imageHeight)),\n );\n }\n\n public forSize(width: number, height: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n { width, height },\n );\n }\n\n public shiftBy(x: number, y: number): T {\n return new (this.constructor as any)(\n this.relativePositions,\n this._imgDims,\n new Point(x, y),\n );\n }\n\n public shiftByPoint(pt: Point): T {\n return this.shiftBy(pt.x, pt.y);\n }\n\n /**\n * Aligns the face landmarks after face detection from the relative positions of the faces\n * bounding box, or it's current shift. This function should be used to align the face images\n * after face detection has been performed, before they are passed to the face recognition net.\n * This will make the computed face descriptor more accurate.\n *\n * @param detection (optional) The bounding box of the face or the face detection result. If\n * no argument was passed the position of the face landmarks are assumed to be relative to\n * it's current shift.\n * @returns The bounding box of the aligned face.\n */\n public align(\n detection?: FaceDetection | IRect | IBoundingBox | null,\n options: { useDlibAlignment?: boolean, minBoxPadding?: number } = { },\n ): Box {\n if (detection) {\n const box = detection instanceof FaceDetection\n ? detection.box.floor()\n : new Box(detection);\n\n return this.shiftBy(box.x, box.y).align(null, options);\n }\n\n const { useDlibAlignment, minBoxPadding } = { useDlibAlignment: false, minBoxPadding: 0.2, ...options };\n\n if (useDlibAlignment) {\n return this.alignDlib();\n }\n\n return this.alignMinBbox(minBoxPadding);\n }\n\n private alignDlib(): Box {\n const centers = this.getRefPointsForAlignment();\n\n const [leftEyeCenter, rightEyeCenter, mouthCenter] = centers;\n const distToMouth = (pt: Point) => mouthCenter.sub(pt).magnitude();\n const eyeToMouthDist = (distToMouth(leftEyeCenter) + distToMouth(rightEyeCenter)) / 2;\n\n const size = Math.floor(eyeToMouthDist / relScale);\n\n const refPoint = getCenterPoint(centers);\n // TODO: pad in case rectangle is out of image bounds\n const x = Math.floor(Math.max(0, refPoint.x - (relX * size)));\n const y = Math.floor(Math.max(0, refPoint.y - (relY * size)));\n\n return new Rect(x, y, Math.min(size, this.imageWidth + x), Math.min(size, this.imageHeight + y));\n }\n\n private alignMinBbox(padding: number): Box {\n const box = minBbox(this.positions);\n return box.pad(box.width * padding, box.height * padding);\n }\n\n protected getRefPointsForAlignment(): Point[] {\n throw new Error('getRefPointsForAlignment not implemented by base class');\n }\n}\n", "import { getCenterPoint } from '../utils/index';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks5 extends FaceLandmarks {\n protected getRefPointsForAlignment(): Point[] {\n const pts = this.positions;\n return [\n pts[0],\n pts[1],\n getCenterPoint([pts[3], pts[4]]),\n ];\n }\n}\n", "import { getCenterPoint } from '../utils/index';\nimport { FaceLandmarks } from './FaceLandmarks';\nimport { Point } from './Point';\n\nexport class FaceLandmarks68 extends FaceLandmarks {\n public getJawOutline(): Point[] {\n return this.positions.slice(0, 17);\n }\n\n public getLeftEyeBrow(): Point[] {\n return this.positions.slice(17, 22);\n }\n\n public getRightEyeBrow(): Point[] {\n return this.positions.slice(22, 27);\n }\n\n public getNose(): Point[] {\n return this.positions.slice(27, 36);\n }\n\n public getLeftEye(): Point[] {\n return this.positions.slice(36, 42);\n }\n\n public getRightEye(): Point[] {\n return this.positions.slice(42, 48);\n }\n\n public getMouth(): Point[] {\n return this.positions.slice(48, 68);\n }\n\n protected getRefPointsForAlignment(): Point[] {\n return [\n this.getLeftEye(),\n this.getRightEye(),\n this.getMouth(),\n ].map(getCenterPoint);\n }\n}\n", "import { round } from '../utils/index';\n\nexport interface IFaceMatch {\n label: string\n distance: number\n}\n\nexport class FaceMatch implements IFaceMatch {\n private _label: string\n\n private _distance: number\n\n constructor(label: string, distance: number) {\n this._label = label;\n this._distance = distance;\n }\n\n public get label(): string { return this._label; }\n\n public get distance(): number { return this._distance; }\n\n public toString(withDistance: boolean = true): string {\n return `${this.label}${withDistance ? ` (${round(this.distance)})` : ''}`;\n }\n}\n", "import { isValidNumber } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { Box } from './Box';\nimport { IRect } from './Rect';\n\nexport class LabeledBox extends Box {\n public static assertIsValidLabeledBox(box: any, callee: string) {\n Box.assertIsValidBox(box, callee);\n\n if (!isValidNumber(box.label)) {\n throw new Error(`${callee} - expected property label (${box.label}) to be a number`);\n }\n }\n\n private _label: number\n\n constructor(box: IBoundingBox | IRect | any, label: number) {\n super(box);\n this._label = label;\n }\n\n public get label(): number { return this._label; }\n}\n", "export class LabeledFaceDescriptors {\n private _label: string\n\n private _descriptors: Float32Array[]\n\n constructor(label: string, descriptors: Float32Array[]) {\n if (!(typeof label === 'string')) {\n throw new Error('LabeledFaceDescriptors - constructor expected label to be a string');\n }\n\n if (!Array.isArray(descriptors) || descriptors.some((desc) => !(desc instanceof Float32Array))) {\n throw new Error('LabeledFaceDescriptors - constructor expected descriptors to be an array of Float32Array');\n }\n\n this._label = label;\n this._descriptors = descriptors;\n }\n\n public get label(): string { return this._label; }\n\n public get descriptors(): Float32Array[] { return this._descriptors; }\n\n public toJSON(): any {\n return {\n label: this.label,\n descriptors: this.descriptors.map((d) => Array.from(d)),\n };\n }\n\n public static fromJSON(json: any): LabeledFaceDescriptors {\n const descriptors = json.descriptors.map((d: any) => new Float32Array(d));\n return new LabeledFaceDescriptors(json.label, descriptors);\n }\n}\n", "import { isValidProbablitiy } from '../utils/index';\nimport { IBoundingBox } from './BoundingBox';\nimport { LabeledBox } from './LabeledBox';\nimport { IRect } from './Rect';\n\nexport class PredictedBox extends LabeledBox {\n public static assertIsValidPredictedBox(box: any, callee: string) {\n LabeledBox.assertIsValidLabeledBox(box, callee);\n\n if (\n !isValidProbablitiy(box.score)\n || !isValidProbablitiy(box.classScore)\n ) {\n throw new Error(`${callee} - expected properties score (${box.score}) and (${box.classScore}) to be a number between [0, 1]`);\n }\n }\n\n private _score: number\n\n private _classScore: number\n\n constructor(box: IBoundingBox | IRect | any, label: number, score: number, classScore: number) {\n super(box, label);\n this._score = score;\n this._classScore = classScore;\n }\n\n public get score(): number { return this._score; }\n\n public get classScore(): number { return this._classScore; }\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\n\nexport type WithFaceDetection = TSource & {\n detection: FaceDetection\n}\n\nexport function isWithFaceDetection(obj: any): obj is WithFaceDetection<{}> {\n return obj.detection instanceof FaceDetection;\n}\n\nexport function extendWithFaceDetection(sourceObj: TSource, detection: FaceDetection): WithFaceDetection {\n const extension = { detection };\n return { ...sourceObj, ...extension };\n}\n", "import { Environment } from './types';\n\nexport function createBrowserEnv(): Environment {\n const fetch = window.fetch;\n if (!fetch) throw new Error('fetch - missing fetch implementation for browser environment');\n\n const readFile = () => {\n throw new Error('readFile - filesystem not available for browser environment');\n };\n\n return {\n Canvas: HTMLCanvasElement,\n CanvasRenderingContext2D,\n Image: HTMLImageElement,\n ImageData,\n Video: HTMLVideoElement,\n createCanvasElement: () => document.createElement('canvas'),\n createImageElement: () => document.createElement('img'),\n fetch,\n readFile,\n };\n}\n", "import { FileSystem } from './types';\n\nexport function createFileSystem(fs?: any): FileSystem {\n let requireFsError = '';\n\n if (!fs) {\n try {\n // eslint-disable-next-line global-require\n fs = require('fs');\n } catch (err) {\n requireFsError = err.toString();\n }\n }\n\n const readFile = fs\n ? (filePath: string) => new Promise((resolve, reject) => {\n fs.readFile(filePath, (err: any, buffer: Buffer) => (err ? reject(err) : resolve(buffer)));\n })\n : () => {\n throw new Error(`readFile - failed to require fs in nodejs environment with error: ${requireFsError}`);\n };\n\n return {\n readFile,\n };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { createFileSystem } from './createFileSystem';\nimport { Environment } from './types';\n\nexport function createNodejsEnv(): Environment {\n // eslint-disable-next-line dot-notation\n const Canvas = global['Canvas'] || global.HTMLCanvasElement;\n const Image = global.Image || global.HTMLImageElement;\n\n const createCanvasElement = () => {\n if (Canvas) return new Canvas();\n throw new Error('createCanvasElement - missing Canvas implementation for nodejs environment');\n };\n\n const createImageElement = () => {\n if (Image) return new Image();\n throw new Error('createImageElement - missing Image implementation for nodejs environment');\n };\n\n const fetch = global.fetch;\n // if (!fetch) throw new Error('fetch - missing fetch implementation for nodejs environment');\n\n const fileSystem = createFileSystem();\n\n return {\n Canvas: Canvas || class {},\n CanvasRenderingContext2D: global.CanvasRenderingContext2D || class {},\n Image: Image || class {},\n ImageData: global.ImageData || class {},\n Video: global.HTMLVideoElement || class {},\n createCanvasElement,\n createImageElement,\n fetch,\n ...fileSystem,\n };\n}\n", "export function isBrowser(): boolean {\n return typeof window === 'object'\n && typeof document !== 'undefined'\n && typeof HTMLImageElement !== 'undefined'\n && typeof HTMLCanvasElement !== 'undefined'\n && typeof HTMLVideoElement !== 'undefined'\n && typeof ImageData !== 'undefined'\n && typeof CanvasRenderingContext2D !== 'undefined';\n}\n", "export function isNodejs(): boolean {\n return typeof global === 'object'\n && typeof require === 'function'\n && typeof module !== 'undefined'\n && typeof process !== 'undefined' && !!process.version;\n}\n", "import { createBrowserEnv } from './createBrowserEnv';\nimport { createFileSystem } from './createFileSystem';\nimport { createNodejsEnv } from './createNodejsEnv';\nimport { isBrowser } from './isBrowser';\nimport { isNodejs } from './isNodejs';\nimport { Environment } from './types';\n\nlet environment: Environment | null;\n\nfunction getEnv(): Environment {\n if (!environment) {\n throw new Error('getEnv - environment is not defined, check isNodejs() and isBrowser()');\n }\n return environment;\n}\n\nfunction setEnv(env: Environment) {\n environment = env;\n}\n\nfunction initialize() {\n // check for isBrowser() first to prevent electron renderer process\n // to be initialized with wrong environment due to isNodejs() returning true\n if (isBrowser()) return setEnv(createBrowserEnv());\n if (isNodejs()) return setEnv(createNodejsEnv());\n return null;\n}\n\nfunction monkeyPatch(env: Partial) {\n if (!environment) {\n initialize();\n }\n\n if (!environment) {\n throw new Error('monkeyPatch - environment is not defined, check isNodejs() and isBrowser()');\n }\n\n const { Canvas = environment.Canvas, Image = environment.Image } = env;\n environment.Canvas = Canvas;\n environment.Image = Image;\n environment.createCanvasElement = env.createCanvasElement || (() => new Canvas());\n environment.createImageElement = env.createImageElement || (() => new Image());\n\n environment.ImageData = env.ImageData || environment.ImageData;\n environment.Video = env.Video || environment.Video;\n environment.fetch = env.fetch || environment.fetch;\n environment.readFile = env.readFile || environment.readFile;\n}\n\nexport const env = {\n getEnv,\n setEnv,\n initialize,\n createBrowserEnv,\n createFileSystem,\n createNodejsEnv,\n monkeyPatch,\n isBrowser,\n isNodejs,\n};\n\ninitialize();\n\nexport * from './types';\n", "import { env } from '../env/index';\n\nexport function resolveInput(arg: string | any) {\n if (!env.isNodejs() && typeof arg === 'string') {\n return document.getElementById(arg);\n }\n return arg;\n}\n", "import { env } from '../env/index';\nimport { resolveInput } from './resolveInput';\n\nexport function getContext2dOrThrow(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D): CanvasRenderingContext2D {\n const { Canvas, CanvasRenderingContext2D } = env.getEnv();\n\n if (canvasArg instanceof CanvasRenderingContext2D) {\n return canvasArg;\n }\n\n const canvas = resolveInput(canvasArg);\n\n if (!(canvas instanceof Canvas)) {\n throw new Error('resolveContext2d - expected canvas to be of instance of Canvas');\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('resolveContext2d - canvas 2d context is null');\n }\n\n return ctx;\n}\n", "/* eslint-disable max-classes-per-file */\nimport { IDimensions, IPoint } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { resolveInput } from '../dom/resolveInput';\n\n// eslint-disable-next-line no-shadow\nexport enum AnchorPosition {\n // eslint-disable-next-line no-unused-vars\n TOP_LEFT = 'TOP_LEFT',\n // eslint-disable-next-line no-unused-vars\n TOP_RIGHT = 'TOP_RIGHT',\n // eslint-disable-next-line no-unused-vars\n BOTTOM_LEFT = 'BOTTOM_LEFT',\n // eslint-disable-next-line no-unused-vars\n BOTTOM_RIGHT = 'BOTTOM_RIGHT'\n}\n\nexport interface IDrawTextFieldOptions {\n anchorPosition?: AnchorPosition\n backgroundColor?: string\n fontColor?: string\n fontSize?: number\n fontStyle?: string\n padding?: number\n}\n\nexport class DrawTextFieldOptions implements IDrawTextFieldOptions {\n public anchorPosition: AnchorPosition\n\n public backgroundColor: string\n\n public fontColor: string\n\n public fontSize: number\n\n public fontStyle: string\n\n public padding: number\n\n constructor(options: IDrawTextFieldOptions = {}) {\n const {\n anchorPosition, backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = options;\n this.anchorPosition = anchorPosition || AnchorPosition.TOP_LEFT;\n this.backgroundColor = backgroundColor || 'rgba(0, 0, 0, 0.5)';\n this.fontColor = fontColor || 'rgba(255, 255, 255, 1)';\n this.fontSize = fontSize || 14;\n this.fontStyle = fontStyle || 'Georgia';\n this.padding = padding || 4;\n }\n}\n\nexport class DrawTextField {\n public text: string[]\n\n public anchor : IPoint\n\n public options: DrawTextFieldOptions\n\n constructor(\n text: string | string[] | DrawTextField,\n anchor: IPoint,\n options: IDrawTextFieldOptions = {},\n ) {\n // eslint-disable-next-line no-nested-ternary\n this.text = typeof text === 'string'\n ? [text]\n : (text instanceof DrawTextField ? text.text : text);\n this.anchor = anchor;\n this.options = new DrawTextFieldOptions(options);\n }\n\n measureWidth(ctx: CanvasRenderingContext2D): number {\n const { padding } = this.options;\n return this.text.map((l) => ctx.measureText(l).width).reduce((w0, w1) => (w0 < w1 ? w1 : w0), 0) + (2 * padding);\n }\n\n measureHeight(): number {\n const { fontSize, padding } = this.options;\n return this.text.length * fontSize + (2 * padding);\n }\n\n getUpperLeft(ctx: CanvasRenderingContext2D, canvasDims?: IDimensions): IPoint {\n const { anchorPosition } = this.options;\n const isShiftLeft = anchorPosition === AnchorPosition.BOTTOM_RIGHT || anchorPosition === AnchorPosition.TOP_RIGHT;\n const isShiftTop = anchorPosition === AnchorPosition.BOTTOM_LEFT || anchorPosition === AnchorPosition.BOTTOM_RIGHT;\n\n const textFieldWidth = this.measureWidth(ctx);\n const textFieldHeight = this.measureHeight();\n const x = (isShiftLeft ? this.anchor.x - textFieldWidth : this.anchor.x);\n const y = isShiftTop ? this.anchor.y - textFieldHeight : this.anchor.y;\n\n // adjust anchor if text box exceeds canvas borders\n if (canvasDims) {\n const { width, height } = canvasDims;\n const newX = Math.max(Math.min(x, width - textFieldWidth), 0);\n const newY = Math.max(Math.min(y, height - textFieldHeight), 0);\n return { x: newX, y: newY };\n }\n return { x, y };\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const canvas = resolveInput(canvasArg);\n const ctx = getContext2dOrThrow(canvas);\n\n const {\n backgroundColor, fontColor, fontSize, fontStyle, padding,\n } = this.options;\n\n ctx.font = `${fontSize}px ${fontStyle}`;\n const maxTextWidth = this.measureWidth(ctx);\n const textHeight = this.measureHeight();\n\n ctx.fillStyle = backgroundColor;\n const upperLeft = this.getUpperLeft(ctx, canvas);\n ctx.fillRect(upperLeft.x, upperLeft.y, maxTextWidth, textHeight);\n\n ctx.fillStyle = fontColor;\n this.text.forEach((textLine, i) => {\n const x = padding + upperLeft.x;\n const y = padding + upperLeft.y + ((i + 1) * fontSize);\n ctx.fillText(textLine, x, y);\n });\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { Box, IBoundingBox, IRect } from '../classes/index';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { AnchorPosition, DrawTextField, DrawTextFieldOptions, IDrawTextFieldOptions } from './DrawTextField';\n\nexport interface IDrawBoxOptions {\n boxColor?: string\n lineWidth?: number\n drawLabelOptions?: IDrawTextFieldOptions\n label?: string\n}\n\nexport class DrawBoxOptions {\n public boxColor: string\n\n public lineWidth: number\n\n public drawLabelOptions: DrawTextFieldOptions\n\n public label?: string\n\n constructor(options: IDrawBoxOptions = {}) {\n const {\n boxColor, lineWidth, label, drawLabelOptions,\n } = options;\n this.boxColor = boxColor || 'rgba(0, 0, 255, 1)';\n this.lineWidth = lineWidth || 2;\n this.label = label;\n\n const defaultDrawLabelOptions = {\n anchorPosition: AnchorPosition.BOTTOM_LEFT,\n backgroundColor: this.boxColor,\n };\n this.drawLabelOptions = new DrawTextFieldOptions({ ...defaultDrawLabelOptions, ...drawLabelOptions });\n }\n}\n\nexport class DrawBox {\n public box: Box\n\n public options: DrawBoxOptions\n\n constructor(\n box: IBoundingBox | IRect,\n options: IDrawBoxOptions = {},\n ) {\n this.box = new Box(box);\n this.options = new DrawBoxOptions(options);\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg);\n\n const { boxColor, lineWidth } = this.options;\n\n const {\n x, y, width, height,\n } = this.box;\n ctx.strokeStyle = boxColor;\n ctx.lineWidth = lineWidth;\n ctx.strokeRect(x, y, width, height);\n\n const { label } = this.options;\n if (label) {\n new DrawTextField([label], { x: x - (lineWidth / 2), y }, this.options.drawLabelOptions).draw(canvasArg);\n }\n }\n}\n", "import { Box, IBoundingBox, IRect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { round } from '../utils/index';\nimport { DrawBox } from './DrawBox';\n\nexport type TDrawDetectionsInput = IRect | IBoundingBox | FaceDetection | WithFaceDetection<{}>\n\nexport function drawDetections(\n canvasArg: string | HTMLCanvasElement,\n detections: TDrawDetectionsInput | Array,\n) {\n const detectionsArray = Array.isArray(detections) ? detections : [detections];\n\n detectionsArray.forEach((det) => {\n // eslint-disable-next-line no-nested-ternary\n const score = det instanceof FaceDetection\n ? det.score\n : (isWithFaceDetection(det) ? det.detection.score : undefined);\n\n // eslint-disable-next-line no-nested-ternary\n const box = det instanceof FaceDetection\n ? det.box\n : (isWithFaceDetection(det) ? det.detection.box : new Box(det));\n\n const label = score ? `${round(score)}` : undefined;\n new DrawBox(box, { label }).draw(canvasArg);\n });\n}\n", "import { env } from '../env/index';\n\nexport function isMediaLoaded(media: HTMLImageElement | HTMLVideoElement) : boolean {\n const { Image, Video } = env.getEnv();\n\n return (media instanceof Image && media.complete)\n || (media instanceof Video && media.readyState >= 3);\n}\n", "import { env } from '../env/index';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function awaitMediaLoaded(media: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement) {\n // eslint-disable-next-line consistent-return\n return new Promise((resolve, reject) => {\n if (media instanceof env.getEnv().Canvas || isMediaLoaded(media)) return resolve(null);\n\n function onError(e: Event) {\n if (!e.currentTarget) return;\n // eslint-disable-next-line no-use-before-define\n e.currentTarget.removeEventListener('load', onLoad);\n e.currentTarget.removeEventListener('error', onError);\n reject(e);\n }\n\n function onLoad(e: Event) {\n if (!e.currentTarget) return;\n e.currentTarget.removeEventListener('load', onLoad);\n e.currentTarget.removeEventListener('error', onError);\n resolve(e);\n }\n\n media.addEventListener('load', onLoad);\n media.addEventListener('error', onError);\n });\n}\n", "import { env } from '../env/index';\n\nexport function bufferToImage(buf: Blob): Promise {\n return new Promise((resolve, reject) => {\n if (!(buf instanceof Blob)) reject(new Error('bufferToImage - expected buf to be of type: Blob'));\n const reader = new FileReader();\n reader.onload = () => {\n if (typeof reader.result !== 'string') reject(new Error('bufferToImage - expected reader.result to be a string, in onload'));\n const img = env.getEnv().createImageElement();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = reader.result as string;\n };\n reader.onerror = reject;\n reader.readAsDataURL(buf);\n });\n}\n", "import { Dimensions, IDimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\n\nexport function getMediaDimensions(input: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | IDimensions): Dimensions {\n const { Image, Video } = env.getEnv();\n\n if (input instanceof Image) {\n return new Dimensions(input.naturalWidth, input.naturalHeight);\n }\n if (input instanceof Video) {\n return new Dimensions(input.videoWidth, input.videoHeight);\n }\n return new Dimensions(input.width, input.height);\n}\n", "import { IDimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\nimport { isMediaLoaded } from './isMediaLoaded';\n\nexport function createCanvas({ width, height }: IDimensions): HTMLCanvasElement {\n const { createCanvasElement } = env.getEnv();\n const canvas = createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n\nexport function createCanvasFromMedia(media: HTMLImageElement | HTMLVideoElement | ImageData, dims?: IDimensions): HTMLCanvasElement {\n const { ImageData } = env.getEnv();\n\n if (!(media instanceof ImageData) && !isMediaLoaded(media)) {\n throw new Error('createCanvasFromMedia - media has not finished loading yet');\n }\n\n const { width, height } = dims || getMediaDimensions(media);\n const canvas = createCanvas({ width, height });\n\n if (media instanceof ImageData) {\n getContext2dOrThrow(canvas).putImageData(media, 0, 0);\n } else {\n getContext2dOrThrow(canvas).drawImage(media, 0, 0, width, height);\n }\n return canvas;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { env } from '../env/index';\nimport { isTensor4D } from '../utils/index';\n\nexport async function imageTensorToCanvas(\n imgTensor: tf.Tensor,\n canvas?: HTMLCanvasElement,\n): Promise {\n const targetCanvas = canvas || env.getEnv().createCanvasElement();\n\n const [height, width, numChannels] = imgTensor.shape.slice(isTensor4D(imgTensor) ? 1 : 0);\n const imgTensor3D = tf.tidy(() => imgTensor.as3D(height, width, numChannels).toInt());\n await tf.browser.toPixels(imgTensor3D, targetCanvas);\n\n imgTensor3D.dispose();\n\n return targetCanvas;\n}\n", "import { env } from '../env/index';\n\nexport function isMediaElement(input: any) {\n const { Image, Canvas, Video } = env.getEnv();\n\n return input instanceof Image\n || input instanceof Canvas\n || input instanceof Video;\n}\n", "import { env } from '../env/index';\nimport { createCanvas, createCanvasFromMedia } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function imageToSquare(input: HTMLImageElement | HTMLCanvasElement, inputSize: number, centerImage: boolean = false) {\n const { Image, Canvas } = env.getEnv();\n\n if (!(input instanceof Image || input instanceof Canvas)) {\n throw new Error('imageToSquare - expected arg0 to be HTMLImageElement | HTMLCanvasElement');\n }\n\n if (inputSize <= 0) return createCanvas({ width: 1, height: 1 });\n const dims = getMediaDimensions(input);\n const scale = inputSize / Math.max(dims.height, dims.width);\n const width = scale * dims.width;\n const height = scale * dims.height;\n\n const targetCanvas = createCanvas({ width: inputSize, height: inputSize });\n const inputCanvas = input instanceof Canvas ? input : createCanvasFromMedia(input);\n\n const offset = Math.abs(width - height) / 2;\n const dx = centerImage && width < height ? offset : 0;\n const dy = centerImage && height < width ? offset : 0;\n if (inputCanvas.width > 0 && inputCanvas.height > 0) getContext2dOrThrow(targetCanvas).drawImage(inputCanvas, dx, dy, width, height);\n\n return targetCanvas;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Dimensions } from '../classes/Dimensions';\nimport { env } from '../env/index';\nimport { padToSquare } from '../ops/padToSquare';\nimport { computeReshapedDimensions, isTensor3D, isTensor4D, range } from '../utils/index';\nimport { createCanvasFromMedia } from './createCanvas';\nimport { imageToSquare } from './imageToSquare';\nimport { TResolvedNetInput } from './types';\n\nexport class NetInput {\n private _imageTensors: Array = []\n\n private _canvases: HTMLCanvasElement[] = []\n\n private _batchSize: number\n\n private _treatAsBatchInput: boolean = false\n\n private _inputDimensions: number[][] = []\n\n private _inputSize: number\n\n constructor(inputs: Array, treatAsBatchInput: boolean = false) {\n if (!Array.isArray(inputs)) {\n throw new Error(`NetInput.constructor - expected inputs to be an Array of TResolvedNetInput or to be instanceof tf.Tensor4D, instead have ${inputs}`);\n }\n\n this._treatAsBatchInput = treatAsBatchInput;\n this._batchSize = inputs.length;\n\n inputs.forEach((input, idx) => {\n if (isTensor3D(input)) {\n this._imageTensors[idx] = input;\n this._inputDimensions[idx] = input.shape;\n return;\n }\n\n if (isTensor4D(input)) {\n const batchSize = (input as any).shape[0];\n if (batchSize !== 1) {\n throw new Error(`NetInput - tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);\n }\n\n this._imageTensors[idx] = input;\n this._inputDimensions[idx] = (input as any).shape.slice(1);\n return;\n }\n\n const canvas = (input as any) instanceof env.getEnv().Canvas ? input : createCanvasFromMedia(input);\n this._canvases[idx] = canvas;\n this._inputDimensions[idx] = [canvas.height, canvas.width, 3];\n });\n }\n\n public get imageTensors(): Array {\n return this._imageTensors;\n }\n\n public get canvases(): HTMLCanvasElement[] {\n return this._canvases;\n }\n\n public get isBatchInput(): boolean {\n return this.batchSize > 1 || this._treatAsBatchInput;\n }\n\n public get batchSize(): number {\n return this._batchSize;\n }\n\n public get inputDimensions(): number[][] {\n return this._inputDimensions;\n }\n\n public get inputSize(): number | undefined {\n return this._inputSize;\n }\n\n public get reshapedInputDimensions(): Dimensions[] {\n return range(this.batchSize, 0, 1).map(\n (_, batchIdx) => this.getReshapedInputDimensions(batchIdx),\n );\n }\n\n public getInput(batchIdx: number): tf.Tensor3D | tf.Tensor4D | HTMLCanvasElement {\n return this.canvases[batchIdx] || this.imageTensors[batchIdx];\n }\n\n public getInputDimensions(batchIdx: number): number[] {\n return this._inputDimensions[batchIdx];\n }\n\n public getInputHeight(batchIdx: number): number {\n return this._inputDimensions[batchIdx][0];\n }\n\n public getInputWidth(batchIdx: number): number {\n return this._inputDimensions[batchIdx][1];\n }\n\n public getReshapedInputDimensions(batchIdx: number): Dimensions {\n if (typeof this.inputSize !== 'number') {\n throw new Error('getReshapedInputDimensions - inputSize not set, toBatchTensor has not been called yet');\n }\n\n const width = this.getInputWidth(batchIdx);\n const height = this.getInputHeight(batchIdx);\n return computeReshapedDimensions({ width, height }, this.inputSize);\n }\n\n /**\n * Create a batch tensor from all input canvases and tensors\n * with size [batchSize, inputSize, inputSize, 3].\n *\n * @param inputSize Height and width of the tensor.\n * @param isCenterImage (optional, default: false) If true, add an equal amount of padding on\n * both sides of the minor dimension oof the image.\n * @returns The batch tensor.\n */\n public toBatchTensor(inputSize: number, isCenterInputs: boolean = true): tf.Tensor4D {\n this._inputSize = inputSize;\n\n return tf.tidy(() => {\n const inputTensors = range(this.batchSize, 0, 1).map((batchIdx) => {\n const input = this.getInput(batchIdx);\n\n if (input instanceof tf.Tensor) {\n let imgTensor = isTensor4D(input) ? input : tf.expandDims(input);\n imgTensor = padToSquare(imgTensor, isCenterInputs);\n\n if (imgTensor.shape[1] !== inputSize || imgTensor.shape[2] !== inputSize) {\n imgTensor = tf.image.resizeBilinear(imgTensor, [inputSize, inputSize], false, false);\n }\n\n return imgTensor.as3D(inputSize, inputSize, 3);\n }\n\n if (input instanceof env.getEnv().Canvas) {\n return tf.browser.fromPixels(imageToSquare(input, inputSize, isCenterInputs));\n }\n\n throw new Error(`toBatchTensor - at batchIdx ${batchIdx}, expected input to be instanceof tf.Tensor or instanceof HTMLCanvasElement, instead have ${input}`);\n });\n\n const batchTensor = tf.stack(inputTensors.map((t) => tf.cast(t, 'float32'))).as4D(this.batchSize, inputSize, inputSize, 3);\n\n return batchTensor;\n });\n }\n}\n", "import { isTensor3D, isTensor4D } from '../utils/index';\nimport { awaitMediaLoaded } from './awaitMediaLoaded';\nimport { isMediaElement } from './isMediaElement';\nimport { NetInput } from './NetInput';\nimport { resolveInput } from './resolveInput';\nimport { TNetInput } from './types';\n\n/**\n * Validates the input to make sure, they are valid net inputs and awaits all media elements\n * to be finished loading.\n *\n * @param input The input, which can be a media element or an array of different media elements.\n * @returns A NetInput instance, which can be passed into one of the neural networks.\n */\nexport async function toNetInput(inputs: TNetInput): Promise {\n if (inputs instanceof NetInput) return inputs;\n const inputArgArray = Array.isArray(inputs) ? inputs : [inputs];\n if (!inputArgArray.length) throw new Error('toNetInput - empty array passed as input');\n const getIdxHint = (idx: number) => (Array.isArray(inputs) ? ` at input index ${idx}:` : '');\n const inputArray = inputArgArray.map(resolveInput);\n inputArray.forEach((input, i) => {\n if (!isMediaElement(input) && !isTensor3D(input) && !isTensor4D(input)) {\n if (typeof inputArgArray[i] === 'string') throw new Error(`toNetInput -${getIdxHint(i)} string passed, but could not resolve HTMLElement for element id ${inputArgArray[i]}`);\n throw new Error(`toNetInput -${getIdxHint(i)} expected media to be of type HTMLImageElement | HTMLVideoElement | HTMLCanvasElement | tf.Tensor3D, or to be an element id`);\n }\n if (isTensor4D(input)) {\n // if tf.Tensor4D is passed in the input array, the batch size has to be 1\n const batchSize = input.shape[0];\n if (batchSize !== 1) throw new Error(`toNetInput -${getIdxHint(i)} tf.Tensor4D with batchSize ${batchSize} passed, but not supported in input array`);\n }\n });\n // wait for all media elements being loaded\n await Promise.all(inputArray.map((input) => isMediaElement(input) && awaitMediaLoaded(input)));\n return new NetInput(inputArray, Array.isArray(inputs));\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\nimport { Rect } from '../classes/Rect';\nimport { env } from '../env/index';\nimport { createCanvas } from './createCanvas';\nimport { getContext2dOrThrow } from './getContext2dOrThrow';\nimport { imageTensorToCanvas } from './imageTensorToCanvas';\nimport { toNetInput } from './toNetInput';\nimport { TNetInput } from './types';\n\n/**\n * Extracts the image regions containing the detected faces.\n *\n * @param input The image that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns The Canvases of the corresponding image region for each detected face.\n */\nexport async function extractFaces(input: TNetInput, detections: Array): Promise {\n const { Canvas } = env.getEnv();\n let canvas = input as HTMLCanvasElement;\n if (!(input instanceof Canvas)) {\n const netInput = await toNetInput(input);\n if (netInput.batchSize > 1) throw new Error('extractFaces - batchSize > 1 not supported');\n const tensorOrCanvas = netInput.getInput(0);\n canvas = tensorOrCanvas instanceof Canvas ? tensorOrCanvas : await imageTensorToCanvas(tensorOrCanvas);\n }\n const ctx = getContext2dOrThrow(canvas);\n const boxes = detections\n .map((det) => (det instanceof FaceDetection ? det.forSize(canvas.width, canvas.height).box.floor() : det))\n .map((box) => box.clipAtImageBorders(canvas.width, canvas.height));\n return boxes.map(({ x, y, width, height }) => {\n const faceImg = createCanvas({ width, height });\n if (width > 0 && height > 0) getContext2dOrThrow(faceImg).putImageData(ctx.getImageData(x, y, width, height), 0, 0);\n return faceImg;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { isTensor3D, isTensor4D } from '../utils/index';\n\n/**\n * Extracts the tensors of the image regions containing the detected faces.\n * Useful if you want to compute the face descriptors for the face images.\n * Using this method is faster then extracting a canvas for each face and\n * converting them to tensors individually.\n *\n * @param imageTensor The image tensor that face detection has been performed on.\n * @param detections The face detection results or face bounding boxes for that image.\n * @returns Tensors of the corresponding image region for each detected face.\n */\nexport async function extractFaceTensors(imageTensor: tf.Tensor3D | tf.Tensor4D, detections: Array): Promise {\n if (!isTensor3D(imageTensor) && !isTensor4D(imageTensor)) {\n throw new Error('extractFaceTensors - expected image tensor to be 3D or 4D');\n }\n\n if (isTensor4D(imageTensor) && imageTensor.shape[0] > 1) {\n throw new Error('extractFaceTensors - batchSize > 1 not supported');\n }\n\n return tf.tidy(() => {\n const [imgHeight, imgWidth, numChannels] = imageTensor.shape.slice(isTensor4D(imageTensor) ? 1 : 0);\n\n const boxes = detections\n .map((det) => (det instanceof FaceDetection\n ? det.forSize(imgWidth, imgHeight).box\n : det))\n .map((box) => box.clipAtImageBorders(imgWidth, imgHeight));\n\n const faceTensors = boxes.map(({\n x, y, width, height,\n }) => tf.slice3d(imageTensor.as3D(imgHeight, imgWidth, numChannels), [y, x, 0], [height, width, numChannels]));\n\n return faceTensors;\n });\n}\n", "import { env } from '../env/index';\n\nexport async function fetchOrThrow(\n url: string,\n // eslint-disable-next-line no-undef\n init?: RequestInit,\n): Promise {\n const { fetch } = env.getEnv();\n const res = await fetch(url, init);\n if (!(res.status < 400)) {\n throw new Error(`failed to fetch: (${res.status}) ${res.statusText}, from url: ${res.url}`);\n }\n return res;\n}\n", "import { bufferToImage } from './bufferToImage';\nimport { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchImage(uri: string): Promise {\n const res = await fetchOrThrow(uri);\n const blob = await (res).blob();\n\n if (!blob.type.startsWith('image/')) {\n throw new Error(`fetchImage - expected blob type to be of type image/*, instead have: ${blob.type}, for url: ${res.url}`);\n }\n return bufferToImage(blob);\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchJson(uri: string): Promise {\n return (await fetchOrThrow(uri)).json();\n}\n", "import { fetchOrThrow } from './fetchOrThrow';\n\nexport async function fetchNetWeights(uri: string): Promise {\n return new Float32Array(await (await fetchOrThrow(uri)).arrayBuffer());\n}\n", "export function getModelUris(uri: string | undefined, defaultModelName: string) {\n const defaultManifestFilename = `${defaultModelName}-weights_manifest.json`;\n\n if (!uri) {\n return {\n modelBaseUri: '',\n manifestUri: defaultManifestFilename,\n };\n }\n\n if (uri === '/') {\n return {\n modelBaseUri: '/',\n manifestUri: `/${defaultManifestFilename}`,\n };\n }\n // eslint-disable-next-line no-nested-ternary\n const protocol = uri.startsWith('http://') ? 'http://' : uri.startsWith('https://') ? 'https://' : '';\n uri = uri.replace(protocol, '');\n\n const parts = uri.split('/').filter((s) => s);\n\n const manifestFile = uri.endsWith('.json')\n ? parts[parts.length - 1]\n : defaultManifestFilename;\n\n let modelBaseUri = protocol + (uri.endsWith('.json') ? parts.slice(0, parts.length - 1) : parts).join('/');\n modelBaseUri = uri.startsWith('/') ? `/${modelBaseUri}` : modelBaseUri;\n\n return {\n modelBaseUri,\n manifestUri: modelBaseUri === '/' ? `/${manifestFile}` : `${modelBaseUri}/${manifestFile}`,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { getModelUris } from '../common/getModelUris';\nimport { fetchJson } from './fetchJson';\n\nexport async function loadWeightMap(\n uri: string | undefined,\n defaultModelName: string,\n): Promise {\n const { manifestUri, modelBaseUri } = getModelUris(uri, defaultModelName);\n const manifest = await fetchJson(manifestUri);\n // if (manifest['weightsManifest']) manifest = manifest['weightsManifest'];\n return tf.io.loadWeights(manifest, modelBaseUri);\n}\n", "import { IDimensions } from '../classes/index';\nimport { getMediaDimensions } from './getMediaDimensions';\n\nexport function matchDimensions(input: IDimensions, reference: IDimensions, useMediaDimensions: boolean = false) {\n const { width, height } = useMediaDimensions\n ? getMediaDimensions(reference)\n : reference;\n input.width = width;\n input.height = height;\n return { width, height };\n}\n", "import * as tf from '../dist/tfjs.esm';\n\nimport { ParamMapping } from './common/index';\nimport { getModelUris } from './common/getModelUris';\nimport { loadWeightMap } from './dom/index';\nimport { env } from './env/index';\n\nexport abstract class NeuralNetwork {\n constructor(name: string) {\n this._name = name;\n }\n\n protected _params: TNetParams | undefined = undefined\n\n protected _paramMappings: ParamMapping[] = []\n\n public _name: any;\n\n public get params(): TNetParams | undefined { return this._params; }\n\n public get paramMappings(): ParamMapping[] { return this._paramMappings; }\n\n public get isLoaded(): boolean { return !!this.params; }\n\n public getParamFromPath(paramPath: string): tf.Tensor {\n const { obj, objProp } = this.traversePropertyPath(paramPath);\n return obj[objProp];\n }\n\n public reassignParamFromPath(paramPath: string, tensor: tf.Tensor) {\n const { obj, objProp } = this.traversePropertyPath(paramPath);\n obj[objProp].dispose();\n obj[objProp] = tensor;\n }\n\n public getParamList() {\n return this._paramMappings.map(({ paramPath }) => ({\n path: paramPath,\n tensor: this.getParamFromPath(paramPath),\n }));\n }\n\n public getTrainableParams() {\n return this.getParamList().filter((param) => param.tensor instanceof tf.Variable);\n }\n\n public getFrozenParams() {\n return this.getParamList().filter((param) => !(param.tensor instanceof tf.Variable));\n }\n\n public variable() {\n this.getFrozenParams().forEach(({ path, tensor }) => {\n this.reassignParamFromPath(path, tensor.variable());\n });\n }\n\n public freeze() {\n this.getTrainableParams().forEach(({ path, tensor: variable }) => {\n const tensor = tf.tensor(variable.dataSync());\n variable.dispose();\n this.reassignParamFromPath(path, tensor);\n });\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.getParamList().forEach((param) => {\n if (throwOnRedispose && param.tensor.isDisposed) {\n throw new Error(`param tensor has already been disposed for path ${param.path}`);\n }\n param.tensor.dispose();\n });\n this._params = undefined;\n }\n\n public serializeParams(): Float32Array {\n return new Float32Array(\n this.getParamList()\n .map(({ tensor }) => Array.from(tensor.dataSync()) as number[])\n .reduce((flat, arr) => flat.concat(arr)),\n );\n }\n\n public async load(weightsOrUrl: Float32Array | string | undefined): Promise {\n if (weightsOrUrl instanceof Float32Array) {\n this.extractWeights(weightsOrUrl);\n return;\n }\n await this.loadFromUri(weightsOrUrl);\n }\n\n public async loadFromUri(uri: string | undefined) {\n if (uri && typeof uri !== 'string') {\n throw new Error(`${this._name}.loadFromUri - expected model uri`);\n }\n const weightMap = await loadWeightMap(uri, this.getDefaultModelName());\n this.loadFromWeightMap(weightMap);\n }\n\n public async loadFromDisk(filePath: string | undefined) {\n if (filePath && typeof filePath !== 'string') {\n throw new Error(`${this._name}.loadFromDisk - expected model file path`);\n }\n const { readFile } = env.getEnv();\n const { manifestUri, modelBaseUri } = getModelUris(filePath, this.getDefaultModelName());\n const fetchWeightsFromDisk = (filePaths: string[]) => Promise.all(filePaths.map((fp) => readFile(fp).then((buf) => buf.buffer)));\n const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk);\n const manifest = JSON.parse((await readFile(manifestUri)).toString());\n const weightMap = await loadWeights(manifest, modelBaseUri);\n this.loadFromWeightMap(weightMap);\n }\n\n public loadFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { paramMappings, params } = this.extractParamsFromWeightMap(weightMap);\n this._paramMappings = paramMappings;\n this._params = params;\n }\n\n public extractWeights(weights: Float32Array) {\n const { paramMappings, params } = this.extractParams(weights);\n this._paramMappings = paramMappings;\n this._params = params;\n }\n\n private traversePropertyPath(paramPath: string) {\n if (!this.params) {\n throw new Error('traversePropertyPath - model has no loaded params');\n }\n\n const result = paramPath.split('/').reduce((res: { nextObj: any, obj?: any, objProp?: string }, objProp) => {\n // eslint-disable-next-line no-prototype-builtins\n if (!res.nextObj.hasOwnProperty(objProp)) {\n throw new Error(`traversePropertyPath - object does not have property ${objProp}, for path ${paramPath}`);\n }\n return { obj: res.nextObj, objProp, nextObj: res.nextObj[objProp] };\n }, { nextObj: this.params });\n\n const { obj, objProp } = result;\n if (!obj || !objProp || !(obj[objProp] instanceof tf.Tensor)) {\n throw new Error(`traversePropertyPath - parameter is not a tensor, for path ${paramPath}`);\n }\n\n return { obj, objProp };\n }\n\n protected abstract getDefaultModelName(): string\n\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TNetParams, paramMappings: ParamMapping[] }\n\n // eslint-disable-next-line no-unused-vars\n protected abstract extractParams(weights: Float32Array): { params: TNetParams, paramMappings: ParamMapping[] }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { SeparableConvParams } from './types';\n\nexport function depthwiseSeparableConv(\n x: tf.Tensor4D,\n params: SeparableConvParams,\n stride: [number, number],\n): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.separableConv2d(x, params.depthwise_filter, params.pointwise_filter, stride, 'same');\n out = tf.add(out, params.bias);\n return out;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, SeparableConvParams } from '../common/index';\nimport { depthwiseSeparableConv } from '../common/depthwiseSeparableConv';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function denseBlock3(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock3Params,\n isFirstLayer: boolean = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, [2, 2], 'same'),\n denseBlockParams.conv0.bias,\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, [2, 2]),\n ) as tf.Tensor4D;\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]);\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D;\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]);\n\n return tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D;\n });\n}\n\nexport function denseBlock4(\n x: tf.Tensor4D,\n denseBlockParams: DenseBlock4Params,\n isFirstLayer: boolean = false,\n isScaleDown: boolean = true,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out1 = tf.relu(\n isFirstLayer\n ? tf.add(\n tf.conv2d(x, (denseBlockParams.conv0 as ConvParams).filters, isScaleDown ? [2, 2] : [1, 1], 'same'),\n denseBlockParams.conv0.bias,\n )\n : depthwiseSeparableConv(x, denseBlockParams.conv0 as SeparableConvParams, isScaleDown ? [2, 2] : [1, 1]),\n ) as tf.Tensor4D;\n const out2 = depthwiseSeparableConv(out1, denseBlockParams.conv1, [1, 1]);\n\n const in3 = tf.relu(tf.add(out1, out2)) as tf.Tensor4D;\n const out3 = depthwiseSeparableConv(in3, denseBlockParams.conv2, [1, 1]);\n\n const in4 = tf.relu(tf.add(out1, tf.add(out2, out3))) as tf.Tensor4D;\n const out4 = depthwiseSeparableConv(in4, denseBlockParams.conv3, [1, 1]);\n\n return tf.relu(tf.add(out1, tf.add(out2, tf.add(out3, out4)))) as tf.Tensor4D;\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from './types';\n\nexport function convLayer(\n x: tf.Tensor4D,\n params: ConvParams,\n padding: 'valid' | 'same' = 'same',\n withRelu: boolean = false,\n): tf.Tensor4D {\n return tf.tidy(() => {\n const out = tf.add(\n tf.conv2d(x, params.filters, [1, 1], padding),\n params.bias,\n ) as tf.Tensor4D;\n\n return withRelu ? tf.relu(out) : out;\n });\n}\n", "import { ParamMapping } from './types';\n\nexport function disposeUnusedWeightTensors(weightMap: any, paramMappings: ParamMapping[]) {\n Object.keys(weightMap).forEach((path) => {\n if (!paramMappings.some((pm) => pm.originalPath === path)) {\n weightMap[path].dispose();\n }\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, ExtractWeightsFunction, ParamMapping } from './types';\n\nexport function extractConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvParams => {\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut],\n );\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return { filters, bias };\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, FCParams, ParamMapping } from './types';\n\nexport function extractFCParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string,\n ): FCParams => {\n const fc_weights = tf.tensor2d(extractWeights(channelsIn * channelsOut), [channelsIn, channelsOut]);\n const fc_bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return {\n weights: fc_weights,\n bias: fc_bias,\n };\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\n// eslint-disable-next-line no-unused-vars\nexport type ExtractWeightsFunction = (numWeights: number) => Float32Array\n\nexport type ParamMapping = {\n originalPath?: string\n paramPath: string\n}\n\nexport type ConvParams = {\n filters: tf.Tensor4D\n bias: tf.Tensor1D\n}\n\nexport type FCParams = {\n weights: tf.Tensor2D\n bias: tf.Tensor1D\n}\n\nexport class SeparableConvParams {\n // eslint-disable-next-line no-useless-constructor\n constructor(\n // eslint-disable-next-line no-unused-vars\n public depthwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public pointwise_filter: tf.Tensor4D,\n // eslint-disable-next-line no-unused-vars\n public bias: tf.Tensor1D,\n // eslint-disable-next-line no-empty-function\n ) {}\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, ParamMapping, SeparableConvParams } from './types';\n\nexport function extractSeparableConvParamsFactory(\n extractWeights: ExtractWeightsFunction,\n paramMappings: ParamMapping[],\n) {\n return (channelsIn: number, channelsOut: number, mappedPrefix: string): SeparableConvParams => {\n const depthwise_filter = tf.tensor4d(extractWeights(3 * 3 * channelsIn), [3, 3, channelsIn, 1]);\n const pointwise_filter = tf.tensor4d(extractWeights(channelsIn * channelsOut), [1, 1, channelsIn, channelsOut]);\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/depthwise_filter` },\n { paramPath: `${mappedPrefix}/pointwise_filter` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias,\n );\n };\n}\n\nexport function loadSeparableConvParamsFactory(\n // eslint-disable-next-line no-unused-vars\n extractWeightEntry: (originalPath: string, paramRank: number) => T,\n) {\n return (prefix: string): SeparableConvParams => {\n const depthwise_filter = extractWeightEntry(`${prefix}/depthwise_filter`, 4);\n const pointwise_filter = extractWeightEntry(`${prefix}/pointwise_filter`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n\n return new SeparableConvParams(\n depthwise_filter,\n pointwise_filter,\n bias,\n );\n };\n}\n", "import { isTensor } from '../utils/index';\nimport { ParamMapping } from './types';\n\nexport function extractWeightEntryFactory(weightMap: any, paramMappings: ParamMapping[]) {\n return (originalPath: string, paramRank: number, mappedPath?: string) => {\n const tensor = weightMap[originalPath];\n\n if (!isTensor(tensor, paramRank)) {\n throw new Error(`expected weightMap[${originalPath}] to be a Tensor${paramRank}D, instead have ${tensor}`);\n }\n\n paramMappings.push(\n { originalPath, paramPath: mappedPath || originalPath },\n );\n\n return tensor;\n };\n}\n", "export function extractWeightsFactory(weights: Float32Array) {\n let remainingWeights = weights;\n\n function extractWeights(numWeights: number): Float32Array {\n const ret = remainingWeights.slice(0, numWeights);\n remainingWeights = remainingWeights.slice(numWeights);\n return ret;\n }\n\n function getRemainingWeights(): Float32Array {\n return remainingWeights;\n }\n\n return {\n extractWeights,\n getRemainingWeights,\n };\n}\n", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, ExtractWeightsFunction, ParamMapping } from '../common/index';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n function extractDenseBlock3Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock3Params {\n const conv0 = isFirstLayer\n ? extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv0`)\n : extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/conv0`);\n const conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv1`);\n const conv2 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv2`);\n\n return { conv0, conv1, conv2 };\n }\n\n function extractDenseBlock4Params(channelsIn: number, channelsOut: number, mappedPrefix: string, isFirstLayer: boolean = false): DenseBlock4Params {\n const { conv0, conv1, conv2 } = extractDenseBlock3Params(channelsIn, channelsOut, mappedPrefix, isFirstLayer);\n const conv3 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/conv3`);\n\n return {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractDenseBlock4Params,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const dense0 = extractDenseBlock4Params(3, 32, 'dense0', true);\n const dense1 = extractDenseBlock4Params(32, 64, 'dense1');\n const dense2 = extractDenseBlock4Params(64, 128, 'dense2');\n const dense3 = extractDenseBlock4Params(128, 256, 'dense3');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: {\n dense0, dense1, dense2, dense3,\n },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from './types';\n\n// eslint-disable-next-line no-unused-vars\nexport function loadConvParamsFactory(extractWeightEntry: (originalPath: string, paramRank: number) => T) {\n return (prefix: string): ConvParams => {\n const filters = extractWeightEntry(`${prefix}/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n\n return { filters, bias };\n };\n}\n", "import { extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { DenseBlock3Params, DenseBlock4Params } from './types';\n\nexport function loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry);\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n\n function extractDenseBlock3Params(prefix: string, isFirstLayer: boolean = false): DenseBlock3Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`);\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`);\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`);\n\n return { conv0, conv1, conv2 };\n }\n\n function extractDenseBlock4Params(prefix: string, isFirstLayer: boolean = false): DenseBlock4Params {\n const conv0 = isFirstLayer\n ? extractConvParams(`${prefix}/conv0`)\n : extractSeparableConvParams(`${prefix}/conv0`);\n const conv1 = extractSeparableConvParams(`${prefix}/conv1`);\n const conv2 = extractSeparableConvParams(`${prefix}/conv2`);\n const conv3 = extractSeparableConvParams(`${prefix}/conv3`);\n\n return {\n conv0, conv1, conv2, conv3,\n };\n }\n\n return {\n extractDenseBlock3Params,\n extractDenseBlock4Params,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { FaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: FaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractDenseBlock4Params,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const params = {\n dense0: extractDenseBlock4Params('dense0', true),\n dense1: extractDenseBlock4Params('dense1'),\n dense2: extractDenseBlock4Params('dense2'),\n dense3: extractDenseBlock4Params('dense3'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { denseBlock4 } from './denseBlock';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { FaceFeatureExtractorParams, IFaceFeatureExtractor } from './types';\n\nexport class FaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n constructor() {\n super('FaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('FaceFeatureExtractor - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = denseBlock4(normalized, params.dense0, true);\n out = denseBlock4(out, params.dense1);\n out = denseBlock4(out, params.dense2);\n out = denseBlock4(out, params.dense3);\n out = tf.avgPool(out, [7, 7], [2, 2], 'valid');\n\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from './types';\n\nexport function fullyConnectedLayer(\n x: tf.Tensor2D,\n params: FCParams,\n): tf.Tensor2D {\n return tf.tidy(() => tf.add(\n tf.matMul(x, params.weights),\n params.bias,\n ));\n}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array, channelsIn: number, channelsOut: number): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings);\n\n const fc = extractFCParams(channelsIn, channelsOut, 'fc');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { fc },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { weights, bias };\n }\n\n const params = {\n fc: extractFcParams('fc'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function seperateWeightMaps(weightMap: tf.NamedTensorMap) {\n const featureExtractorMap: tf.NamedTensorMap = {};\n const classifierMap: tf.NamedTensorMap = {};\n\n Object.keys(weightMap).forEach((key) => {\n const map = key.startsWith('fc') ? classifierMap : featureExtractorMap;\n map[key] = weightMap[key];\n });\n\n return { featureExtractorMap, classifierMap };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { NetInput } from '../dom/index';\nimport { FaceFeatureExtractorParams, IFaceFeatureExtractor, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { NetParams } from './types';\nimport { seperateWeightMaps } from './util';\n\nexport abstract class FaceProcessor<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends NeuralNetwork {\n protected _faceFeatureExtractor: IFaceFeatureExtractor\n\n constructor(_name: string, faceFeatureExtractor: IFaceFeatureExtractor) {\n super(_name);\n this._faceFeatureExtractor = faceFeatureExtractor;\n }\n\n public get faceFeatureExtractor(): IFaceFeatureExtractor {\n return this._faceFeatureExtractor;\n }\n\n protected abstract getDefaultModelName(): string\n\n protected abstract getClassifierChannelsIn(): number\n\n protected abstract getClassifierChannelsOut(): number\n\n public runNet(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n const { params } = this;\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`);\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input;\n return fullyConnectedLayer(bottleneckFeatures.as2D(bottleneckFeatures.shape[0], -1), params.fc);\n });\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose);\n super.dispose(throwOnRedispose);\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights);\n this._params = params;\n this._paramMappings = paramMappings;\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights, this.getClassifierChannelsIn(), this.getClassifierChannelsOut());\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeightMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\n const cIn = this.getClassifierChannelsIn();\n const cOut = this.getClassifierChannelsOut();\n const classifierWeightSize = (cOut * cIn) + cOut;\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize);\n const classifierWeights = weights.slice(weights.length - classifierWeightSize);\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights);\n return this.extractClassifierParams(classifierWeights);\n }\n}\n", "export const FACE_EXPRESSION_LABELS = ['neutral', 'happy', 'sad', 'angry', 'fearful', 'disgusted', 'surprised'];\n\nexport class FaceExpressions {\n public neutral: number\n\n public happy: number\n\n public sad: number\n\n public angry: number\n\n public fearful: number\n\n public disgusted: number\n\n public surprised: number\n\n constructor(probabilities: number[] | Float32Array) {\n if (probabilities.length !== 7) {\n throw new Error(`FaceExpressions.constructor - expected probabilities.length to be 7, have: ${probabilities.length}`);\n }\n\n FACE_EXPRESSION_LABELS.forEach((expression, idx) => {\n this[expression] = probabilities[idx];\n });\n }\n\n asSortedArray() {\n return FACE_EXPRESSION_LABELS\n .map((expression) => ({ expression, probability: this[expression] as number }))\n .sort((e0, e1) => e1.probability - e0.probability);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { FaceExpressions } from './FaceExpressions';\n\nexport class FaceExpressionNet extends FaceProcessor {\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceExpressionNet', faceFeatureExtractor);\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): tf.Tensor2D {\n return tf.tidy(() => tf.softmax(this.runNet(input)));\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async predictExpressions(input: TNetInput) {\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput);\n const probabilitesByBatch = await Promise.all(tf.unstack(out).map(async (t) => {\n const data = t.dataSync();\n t.dispose();\n return data;\n }));\n out.dispose();\n\n const predictionsByBatch = probabilitesByBatch\n .map((probabilites) => new FaceExpressions(probabilites as Float32Array));\n\n return netInput.isBatchInput\n ? predictionsByBatch\n : predictionsByBatch[0];\n }\n\n protected getDefaultModelName(): string {\n return 'face_expression_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 256;\n }\n\n protected getClassifierChannelsOut(): number {\n return 7;\n }\n}\n", "import { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\n\nexport type WithFaceExpressions = TSource & {\n expressions: FaceExpressions\n}\n\nexport function isWithFaceExpressions(obj: any): obj is WithFaceExpressions<{}> {\n return obj.expressions instanceof FaceExpressions;\n}\n\nexport function extendWithFaceExpressions<\n TSource\n>(\n sourceObj: TSource,\n expressions: FaceExpressions,\n): WithFaceExpressions {\n const extension = { expressions };\n return { ...sourceObj, ...extension };\n}\n", "import { IPoint, Point } from '../classes/index';\nimport { FaceExpressions } from '../faceExpressionNet/index';\nimport { isWithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { round } from '../utils/index';\nimport { DrawTextField } from './DrawTextField';\n\nexport type DrawFaceExpressionsInput = FaceExpressions | WithFaceExpressions<{}>\n\nexport function drawFaceExpressions(\n canvasArg: string | HTMLCanvasElement,\n faceExpressions: DrawFaceExpressionsInput | Array,\n minConfidence = 0.1,\n textFieldAnchor?: IPoint,\n) {\n const faceExpressionsArray = Array.isArray(faceExpressions) ? faceExpressions : [faceExpressions];\n\n faceExpressionsArray.forEach((e) => {\n // eslint-disable-next-line no-nested-ternary\n const expr = e instanceof FaceExpressions\n ? e\n : (isWithFaceExpressions(e) ? e.expressions : undefined);\n if (!expr) {\n throw new Error('drawFaceExpressions - expected faceExpressions to be FaceExpressions | WithFaceExpressions<{}> or array thereof');\n }\n\n const sorted = expr.asSortedArray();\n const resultsToDisplay = sorted.filter((exprLocal) => exprLocal.probability > minConfidence);\n\n const anchor = isWithFaceDetection(e)\n ? e.detection.box.bottomLeft\n : (textFieldAnchor || new Point(0, 0));\n\n const drawTextField = new DrawTextField(\n resultsToDisplay.map((exprLocal) => `${exprLocal.expression} (${round(exprLocal.probability)})`),\n anchor,\n );\n drawTextField.draw(canvasArg);\n });\n}\n", "import { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { isWithFaceDetection, WithFaceDetection } from './WithFaceDetection';\n\nexport type WithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 > = TSource & {\n landmarks: TFaceLandmarks,\n unshiftedLandmarks: TFaceLandmarks,\n alignedRect: FaceDetection,\n angle: { roll: number | undefined, pitch: number | undefined, yaw: number | undefined },\n }\n\nexport function isWithFaceLandmarks(obj: any): obj is WithFaceLandmarks, FaceLandmarks> {\n return isWithFaceDetection(obj)\n // eslint-disable-next-line dot-notation\n && obj['landmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['unshiftedLandmarks'] instanceof FaceLandmarks\n // eslint-disable-next-line dot-notation\n && obj['alignedRect'] instanceof FaceDetection;\n}\n\nfunction calculateFaceAngle(mesh) {\n // returns the angle in the plane (in radians) between the positive x-axis and the ray from (0,0) to the point (x,y)\n const radians = (a1, a2, b1, b2) => (Math.atan2(b2 - a2, b1 - a1) % Math.PI);\n // convert radians to degrees\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n const degrees = (theta) => (theta * 180) / Math.PI;\n\n const angle = { roll: undefined, pitch: undefined, yaw: undefined };\n\n if (!mesh || !mesh._positions || mesh._positions.length !== 68) return angle;\n const pt = mesh._positions;\n\n // values are in radians in range of -pi/2 to pi/2 which is -90 to +90 degrees\n // value of 0 means center\n\n // roll is face lean from left to right\n // comparing x,y of outside corners of leftEye and rightEye\n angle.roll = -radians(pt[36]._x, pt[36]._y, pt[45]._x, pt[45]._y);\n\n // pitch is face turn from left right\n // comparing x distance of top of nose to left and right edge of face\n // precision is lacking since coordinates are not precise enough\n angle.pitch = radians(0, Math.abs(pt[0]._x - pt[30]._x) / pt[30]._x, Math.PI, Math.abs(pt[16]._x - pt[30]._x) / pt[30]._x);\n\n // yaw is face move from up to down\n // comparing size of the box around the face with top and bottom of detected landmarks\n // silly hack, but this gives us face compression on y-axis\n // e.g., tilting head up hides the forehead that doesn't have any landmarks so ratio drops\n const bottom = pt.reduce((prev, cur) => (prev < cur._y ? prev : cur._y), +Infinity);\n const top = pt.reduce((prev, cur) => (prev > cur._y ? prev : cur._y), -Infinity);\n angle.yaw = Math.PI * (mesh._imgDims._height / (top - bottom) / 1.40 - 1);\n\n return angle;\n}\n\nexport function extendWithFaceLandmarks<\n TSource extends WithFaceDetection<{}>,\n TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 >(sourceObj: TSource, unshiftedLandmarks: TFaceLandmarks): WithFaceLandmarks {\n const { box: shift } = sourceObj.detection;\n const landmarks = unshiftedLandmarks.shiftBy(shift.x, shift.y);\n\n const rect = landmarks.align();\n const { imageDims } = sourceObj.detection;\n const alignedRect = new FaceDetection(sourceObj.detection.score, rect.rescale(imageDims.reverse()), imageDims);\n const angle = calculateFaceAngle(unshiftedLandmarks);\n\n const extension = {\n landmarks,\n unshiftedLandmarks,\n alignedRect,\n angle,\n };\n\n return { ...sourceObj, ...extension };\n}\n", "/* eslint-disable max-classes-per-file */\nimport { IPoint } from '../classes/index';\nimport { FaceLandmarks } from '../classes/FaceLandmarks';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { getContext2dOrThrow } from '../dom/getContext2dOrThrow';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { drawContour } from './drawContour';\n\nexport interface IDrawFaceLandmarksOptions {\n drawLines?: boolean\n drawPoints?: boolean\n lineWidth?: number\n pointSize?: number\n lineColor?: string\n pointColor?: string\n}\n\nexport class DrawFaceLandmarksOptions {\n public drawLines: boolean\n\n public drawPoints: boolean\n\n public lineWidth: number\n\n public pointSize: number\n\n public lineColor: string\n\n public pointColor: string\n\n constructor(options: IDrawFaceLandmarksOptions = {}) {\n const {\n drawLines = true, drawPoints = true, lineWidth, lineColor, pointSize, pointColor,\n } = options;\n this.drawLines = drawLines;\n this.drawPoints = drawPoints;\n this.lineWidth = lineWidth || 1;\n this.pointSize = pointSize || 2;\n this.lineColor = lineColor || 'rgba(0, 255, 255, 1)';\n this.pointColor = pointColor || 'rgba(255, 0, 255, 1)';\n }\n}\n\nexport class DrawFaceLandmarks {\n public faceLandmarks: FaceLandmarks\n\n public options: DrawFaceLandmarksOptions\n\n constructor(\n faceLandmarks: FaceLandmarks,\n options: IDrawFaceLandmarksOptions = {},\n ) {\n this.faceLandmarks = faceLandmarks;\n this.options = new DrawFaceLandmarksOptions(options);\n }\n\n draw(canvasArg: string | HTMLCanvasElement | CanvasRenderingContext2D) {\n const ctx = getContext2dOrThrow(canvasArg);\n\n const {\n drawLines, drawPoints, lineWidth, lineColor, pointSize, pointColor,\n } = this.options;\n\n if (drawLines && this.faceLandmarks instanceof FaceLandmarks68) {\n ctx.strokeStyle = lineColor;\n ctx.lineWidth = lineWidth;\n drawContour(ctx, this.faceLandmarks.getJawOutline());\n drawContour(ctx, this.faceLandmarks.getLeftEyeBrow());\n drawContour(ctx, this.faceLandmarks.getRightEyeBrow());\n drawContour(ctx, this.faceLandmarks.getNose());\n drawContour(ctx, this.faceLandmarks.getLeftEye(), true);\n drawContour(ctx, this.faceLandmarks.getRightEye(), true);\n drawContour(ctx, this.faceLandmarks.getMouth(), true);\n }\n\n if (drawPoints) {\n ctx.strokeStyle = pointColor;\n ctx.fillStyle = pointColor;\n\n const drawPoint = (pt: IPoint) => {\n ctx.beginPath();\n ctx.arc(pt.x, pt.y, pointSize, 0, 2 * Math.PI);\n ctx.fill();\n };\n this.faceLandmarks.positions.forEach(drawPoint);\n }\n }\n}\n\nexport type DrawFaceLandmarksInput = FaceLandmarks | WithFaceLandmarks>\n\nexport function drawFaceLandmarks(\n canvasArg: string | HTMLCanvasElement,\n faceLandmarks: DrawFaceLandmarksInput | Array,\n) {\n const faceLandmarksArray = Array.isArray(faceLandmarks) ? faceLandmarks : [faceLandmarks];\n faceLandmarksArray.forEach((f) => {\n // eslint-disable-next-line no-nested-ternary\n const landmarks = f instanceof FaceLandmarks\n ? f\n : (isWithFaceLandmarks(f) ? f.landmarks : undefined);\n if (!landmarks) {\n throw new Error('drawFaceLandmarks - expected faceExpressions to be FaceLandmarks | WithFaceLandmarks> or array thereof');\n }\n\n new DrawFaceLandmarks(landmarks).draw(canvasArg);\n });\n}\n", "import { extractConvParamsFactory, extractSeparableConvParamsFactory, extractWeightsFactory } from '../common/index';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n function extractReductionBlockParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ReductionBlockParams {\n const separable_conv0 = extractSeparableConvParams(channelsIn, channelsOut, `${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(channelsOut, channelsOut, `${mappedPrefix}/separable_conv1`);\n const expansion_conv = extractConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/expansion_conv`);\n\n return { separable_conv0, separable_conv1, expansion_conv };\n }\n\n function extractMainBlockParams(channels: number, mappedPrefix: string): MainBlockParams {\n const separable_conv0 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv1`);\n const separable_conv2 = extractSeparableConvParams(channels, channels, `${mappedPrefix}/separable_conv2`);\n\n return { separable_conv0, separable_conv1, separable_conv2 };\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n };\n}\n\nexport function extractParams(weights: Float32Array, numMainBlocks: number): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const entry_flow_conv_in = extractConvParams(3, 32, 3, 'entry_flow/conv_in');\n const entry_flow_reduction_block_0 = extractReductionBlockParams(32, 64, 'entry_flow/reduction_block_0');\n const entry_flow_reduction_block_1 = extractReductionBlockParams(64, 128, 'entry_flow/reduction_block_1');\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1,\n };\n\n const middle_flow = {};\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(128, `middle_flow/main_block_${idx}`);\n });\n\n const exit_flow_reduction_block = extractReductionBlockParams(128, 256, 'exit_flow/reduction_block');\n const exit_flow_separable_conv = extractSeparableConvParams(256, 512, 'exit_flow/separable_conv');\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv,\n };\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { entry_flow, middle_flow, exit_flow },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, loadSeparableConvParamsFactory, ParamMapping } from '../common/index';\nimport { loadConvParamsFactory } from '../common/loadConvParamsFactory';\nimport { range } from '../utils/index';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction loadParamsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n const extractConvParams = loadConvParamsFactory(extractWeightEntry);\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n\n function extractReductionBlockParams(mappedPrefix: string): ReductionBlockParams {\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`);\n const expansion_conv = extractConvParams(`${mappedPrefix}/expansion_conv`);\n\n return { separable_conv0, separable_conv1, expansion_conv };\n }\n\n function extractMainBlockParams(mappedPrefix: string): MainBlockParams {\n const separable_conv0 = extractSeparableConvParams(`${mappedPrefix}/separable_conv0`);\n const separable_conv1 = extractSeparableConvParams(`${mappedPrefix}/separable_conv1`);\n const separable_conv2 = extractSeparableConvParams(`${mappedPrefix}/separable_conv2`);\n\n return { separable_conv0, separable_conv1, separable_conv2 };\n }\n\n return {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n numMainBlocks: number,\n): { params: TinyXceptionParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvParams,\n extractSeparableConvParams,\n extractReductionBlockParams,\n extractMainBlockParams,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const entry_flow_conv_in = extractConvParams('entry_flow/conv_in');\n const entry_flow_reduction_block_0 = extractReductionBlockParams('entry_flow/reduction_block_0');\n const entry_flow_reduction_block_1 = extractReductionBlockParams('entry_flow/reduction_block_1');\n\n const entry_flow = {\n conv_in: entry_flow_conv_in,\n reduction_block_0: entry_flow_reduction_block_0,\n reduction_block_1: entry_flow_reduction_block_1,\n };\n\n const middle_flow = {};\n range(numMainBlocks, 0, 1).forEach((idx) => {\n middle_flow[`main_block_${idx}`] = extractMainBlockParams(`middle_flow/main_block_${idx}`);\n });\n\n const exit_flow_reduction_block = extractReductionBlockParams('exit_flow/reduction_block');\n const exit_flow_separable_conv = extractSeparableConvParams('exit_flow/separable_conv');\n\n const exit_flow = {\n reduction_block: exit_flow_reduction_block,\n separable_conv: exit_flow_separable_conv,\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params: { entry_flow, middle_flow, exit_flow }, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, depthwiseSeparableConv } from '../common/index';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { range } from '../utils/index';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { MainBlockParams, ReductionBlockParams, TinyXceptionParams } from './types';\n\nfunction conv(x: tf.Tensor4D, params: ConvParams, stride: [number, number]): tf.Tensor4D {\n return tf.add(tf.conv2d(x, params.filters, stride, 'same'), params.bias);\n}\n\nfunction reductionBlock(x: tf.Tensor4D, params: ReductionBlockParams, isActivateInput: boolean = true): tf.Tensor4D {\n let out = isActivateInput ? tf.relu(x) : x;\n out = depthwiseSeparableConv(out, params.separable_conv0, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1]);\n out = tf.maxPool(out, [3, 3], [2, 2], 'same');\n out = tf.add(out, conv(x, params.expansion_conv, [2, 2]));\n return out;\n}\n\nfunction mainBlock(x: tf.Tensor4D, params: MainBlockParams): tf.Tensor4D {\n let out = depthwiseSeparableConv(tf.relu(x), params.separable_conv0, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv1, [1, 1]);\n out = depthwiseSeparableConv(tf.relu(out), params.separable_conv2, [1, 1]);\n out = tf.add(out, x);\n return out;\n}\n\nexport class TinyXception extends NeuralNetwork {\n private _numMainBlocks: number\n\n constructor(numMainBlocks: number) {\n super('TinyXception');\n this._numMainBlocks = numMainBlocks;\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n if (!params) {\n throw new Error('TinyXception - load model before inference');\n }\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n let out = tf.relu(conv(normalized, params.entry_flow.conv_in, [2, 2]));\n out = reductionBlock(out, params.entry_flow.reduction_block_0, false);\n out = reductionBlock(out, params.entry_flow.reduction_block_1);\n range(this._numMainBlocks, 0, 1).forEach((idx) => {\n out = mainBlock(out, params.middle_flow[`main_block_${idx}`]);\n });\n out = reductionBlock(out, params.exit_flow.reduction_block);\n out = tf.relu(depthwiseSeparableConv(out, params.exit_flow.separable_conv, [1, 1]));\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'tiny_xception_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap, this._numMainBlocks);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights, this._numMainBlocks);\n }\n}\n", "import { extractFCParamsFactory, extractWeightsFactory, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const extractFCParams = extractFCParamsFactory(extractWeights, paramMappings);\n\n const age = extractFCParams(512, 1, 'fc/age');\n const gender = extractFCParams(512, 2, 'fc/gender');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { fc: { age, gender } },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, FCParams, ParamMapping } from '../common/index';\nimport { NetParams } from './types';\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractFcParams(prefix: string): FCParams {\n const weights = extractWeightEntry(`${prefix}/weights`, 2);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { weights, bias };\n }\n\n const params = {\n fc: {\n age: extractFcParams('fc/age'),\n gender: extractFcParams('fc/gender'),\n },\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FCParams } from '../common/index';\n\n// eslint-disable-next-line no-shadow\nexport enum Gender {\n // eslint-disable-next-line no-unused-vars\n FEMALE = 'female',\n // eslint-disable-next-line no-unused-vars\n MALE = 'male'\n}\n\nexport type AgeAndGenderPrediction = {\n age: number\n gender: Gender\n genderProbability: number\n}\n\nexport type NetOutput = { age: tf.Tensor1D, gender: tf.Tensor2D }\n\nexport type NetParams = {\n fc: {\n age: FCParams\n gender: FCParams\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { fullyConnectedLayer } from '../common/fullyConnectedLayer';\nimport { seperateWeightMaps } from '../faceProcessor/util';\nimport { TinyXception } from '../xception/TinyXception';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { AgeAndGenderPrediction, Gender, NetOutput, NetParams } from './types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\n\nexport class AgeGenderNet extends NeuralNetwork {\n private _faceFeatureExtractor: TinyXception\n\n constructor(faceFeatureExtractor: TinyXception = new TinyXception(2)) {\n super('AgeGenderNet');\n this._faceFeatureExtractor = faceFeatureExtractor;\n }\n\n public get faceFeatureExtractor(): TinyXception {\n return this._faceFeatureExtractor;\n }\n\n public runNet(input: NetInput | tf.Tensor4D): NetOutput {\n const { params } = this;\n\n if (!params) {\n throw new Error(`${this._name} - load model before inference`);\n }\n\n return tf.tidy(() => {\n const bottleneckFeatures = input instanceof NetInput\n ? this.faceFeatureExtractor.forwardInput(input)\n : input;\n\n const pooled = tf.avgPool(bottleneckFeatures, [7, 7], [2, 2], 'valid').as2D(bottleneckFeatures.shape[0], -1);\n const age = fullyConnectedLayer(pooled, params.fc.age).as1D();\n const gender = fullyConnectedLayer(pooled, params.fc.gender);\n return { age, gender };\n });\n }\n\n public forwardInput(input: NetInput | tf.Tensor4D): NetOutput {\n return tf.tidy(() => {\n const { age, gender } = this.runNet(input);\n return { age, gender: tf.softmax(gender) };\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async predictAgeAndGender(input: TNetInput): Promise {\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput);\n\n const ages = tf.unstack(out.age);\n const genders = tf.unstack(out.gender);\n const ageAndGenderTensors = ages.map((ageTensor, i) => ({\n ageTensor,\n genderTensor: genders[i],\n }));\n\n const predictionsByBatch = await Promise.all(\n ageAndGenderTensors.map(async ({ ageTensor, genderTensor }) => {\n const age = (ageTensor.dataSync())[0];\n const probMale = (genderTensor.dataSync())[0];\n const isMale = probMale > 0.5;\n const gender = isMale ? Gender.MALE : Gender.FEMALE;\n const genderProbability = isMale ? probMale : (1 - probMale);\n\n ageTensor.dispose();\n genderTensor.dispose();\n return { age, gender, genderProbability };\n }),\n );\n out.age.dispose();\n out.gender.dispose();\n\n return netInput.isBatchInput ? predictionsByBatch as AgeAndGenderPrediction[] : predictionsByBatch[0] as AgeAndGenderPrediction;\n }\n\n protected getDefaultModelName(): string {\n return 'age_gender_model';\n }\n\n public dispose(throwOnRedispose: boolean = true) {\n this.faceFeatureExtractor.dispose(throwOnRedispose);\n super.dispose(throwOnRedispose);\n }\n\n public loadClassifierParams(weights: Float32Array) {\n const { params, paramMappings } = this.extractClassifierParams(weights);\n this._params = params;\n this._paramMappings = paramMappings;\n }\n\n public extractClassifierParams(weights: Float32Array) {\n return extractParams(weights);\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n const { featureExtractorMap, classifierMap } = seperateWeightMaps(weightMap);\n\n this.faceFeatureExtractor.loadFromWeightMap(featureExtractorMap);\n\n return extractParamsFromWeightMap(classifierMap);\n }\n\n protected extractParams(weights: Float32Array) {\n const classifierWeightSize = (512 * 1 + 1) + (512 * 2 + 2);\n\n const featureExtractorWeights = weights.slice(0, weights.length - classifierWeightSize);\n const classifierWeights = weights.slice(weights.length - classifierWeightSize);\n\n this.faceFeatureExtractor.extractWeights(featureExtractorWeights);\n return this.extractClassifierParams(classifierWeights);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { IDimensions, Point } from '../classes/index';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { FaceFeatureExtractorParams, TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceProcessor } from '../faceProcessor/FaceProcessor';\nimport { isEven } from '../utils/index';\n\nexport abstract class FaceLandmark68NetBase<\n TExtractorParams extends FaceFeatureExtractorParams | TinyFaceFeatureExtractorParams\n>\n extends FaceProcessor {\n public postProcess(output: tf.Tensor2D, inputSize: number, originalDimensions: IDimensions[]): tf.Tensor2D {\n const inputDimensions = originalDimensions.map(({ width, height }) => {\n const scale = inputSize / Math.max(height, width);\n return {\n width: width * scale,\n height: height * scale,\n };\n });\n\n const batchSize = inputDimensions.length;\n\n return tf.tidy(() => {\n const createInterleavedTensor = (fillX: number, fillY: number) => tf.stack([tf.fill([68], fillX, 'float32'), tf.fill([68], fillY, 'float32')], 1).as2D(1, 136).as1D();\n\n // eslint-disable-next-line no-unused-vars\n const getPadding = (batchIdx: number, cond: (w: number, h: number) => boolean): number => {\n const { width, height } = inputDimensions[batchIdx];\n return cond(width, height) ? Math.abs(width - height) / 2 : 0;\n };\n\n const getPaddingX = (batchIdx: number) => getPadding(batchIdx, (w, h) => w < h);\n const getPaddingY = (batchIdx: number) => getPadding(batchIdx, (w, h) => h < w);\n\n const landmarkTensors = output\n .mul(tf.fill([batchSize, 136], inputSize, 'float32'))\n .sub(tf.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(\n getPaddingX(batchIdx),\n getPaddingY(batchIdx),\n ))))\n .div(tf.stack(Array.from(Array(batchSize), (_, batchIdx) => createInterleavedTensor(\n inputDimensions[batchIdx].width,\n inputDimensions[batchIdx].height,\n ))));\n\n return landmarkTensors as tf.Tensor2D;\n });\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n return tf.tidy(() => {\n const out = this.runNet(input);\n return this.postProcess(\n out,\n input.inputSize as number,\n input.inputDimensions.map(([height, width]) => ({ height, width })),\n );\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async detectLandmarks(input: TNetInput): Promise {\n const netInput = await toNetInput(input);\n const landmarkTensors = tf.tidy(\n () => tf.unstack(this.forwardInput(netInput)),\n );\n\n const landmarksForBatch = await Promise.all(landmarkTensors.map(\n async (landmarkTensor, batchIdx) => {\n const landmarksArray = Array.from(landmarkTensor.dataSync());\n const xCoords = landmarksArray.filter((_, i) => isEven(i));\n const yCoords = landmarksArray.filter((_, i) => !isEven(i));\n\n return new FaceLandmarks68(\n Array(68).fill(0).map((_, i) => new Point(xCoords[i] as number, yCoords[i] as number)),\n {\n height: netInput.getInputHeight(batchIdx),\n width: netInput.getInputWidth(batchIdx),\n },\n );\n },\n ));\n\n landmarkTensors.forEach((t) => t.dispose());\n\n return netInput.isBatchInput ? landmarksForBatch as FaceLandmarks68[] : landmarksForBatch[0] as FaceLandmarks68;\n }\n\n protected getClassifierChannelsOut(): number {\n return 136;\n }\n}\n", "import { FaceFeatureExtractor } from '../faceFeatureExtractor/FaceFeatureExtractor';\nimport { FaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68Net extends FaceLandmark68NetBase {\n constructor(faceFeatureExtractor: FaceFeatureExtractor = new FaceFeatureExtractor()) {\n super('FaceLandmark68Net', faceFeatureExtractor);\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 256;\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, ParamMapping } from '../common/index';\nimport { loadParamsFactory } from './loadParamsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsFromWeightMapTiny(\n weightMap: tf.NamedTensorMap,\n): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractDenseBlock3Params,\n } = loadParamsFactory(weightMap, paramMappings);\n\n const params = {\n dense0: extractDenseBlock3Params('dense0', true),\n dense1: extractDenseBlock3Params('dense1'),\n dense2: extractDenseBlock3Params('dense2'),\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import { extractWeightsFactory, ParamMapping } from '../common/index';\nimport { extractorsFactory } from './extractorsFactory';\nimport { TinyFaceFeatureExtractorParams } from './types';\n\nexport function extractParamsTiny(weights: Float32Array): { params: TinyFaceFeatureExtractorParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const {\n extractDenseBlock3Params,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const dense0 = extractDenseBlock3Params(3, 32, 'dense0', true);\n const dense1 = extractDenseBlock3Params(32, 64, 'dense1');\n const dense2 = extractDenseBlock3Params(64, 128, 'dense2');\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n paramMappings,\n params: { dense0, dense1, dense2 },\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { denseBlock3 } from './denseBlock';\nimport { extractParamsFromWeightMapTiny } from './extractParamsFromWeightMapTiny';\nimport { extractParamsTiny } from './extractParamsTiny';\nimport { IFaceFeatureExtractor, TinyFaceFeatureExtractorParams } from './types';\n\nexport class TinyFaceFeatureExtractor extends NeuralNetwork implements IFaceFeatureExtractor {\n constructor() {\n super('TinyFaceFeatureExtractor');\n }\n\n public forwardInput(input: NetInput): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('TinyFaceFeatureExtractor - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(112, true), 'float32');\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = denseBlock3(normalized, params.dense0, true);\n out = denseBlock3(out, params.dense1);\n out = denseBlock3(out, params.dense2);\n out = tf.avgPool(out, [14, 14], [2, 2], 'valid');\n\n return out;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n protected getDefaultModelName(): string {\n return 'face_feature_extractor_tiny_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMapTiny(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParamsTiny(weights);\n }\n}\n", "import { TinyFaceFeatureExtractor } from '../faceFeatureExtractor/TinyFaceFeatureExtractor';\nimport { TinyFaceFeatureExtractorParams } from '../faceFeatureExtractor/types';\nimport { FaceLandmark68NetBase } from './FaceLandmark68NetBase';\n\nexport class FaceLandmark68TinyNet extends FaceLandmark68NetBase {\n constructor(faceFeatureExtractor: TinyFaceFeatureExtractor = new TinyFaceFeatureExtractor()) {\n super('FaceLandmark68TinyNet', faceFeatureExtractor);\n }\n\n protected getDefaultModelName(): string {\n return 'face_landmark_68_tiny_model';\n }\n\n protected getClassifierChannelsIn(): number {\n return 128;\n }\n}\n", "import { FaceLandmark68Net } from './FaceLandmark68Net';\n\nexport * from './FaceLandmark68Net';\nexport * from './FaceLandmark68TinyNet';\nexport class FaceLandmarkNet extends FaceLandmark68Net {}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ScaleLayerParams } from './types';\n\nexport function scale(x: tf.Tensor4D, params: ScaleLayerParams): tf.Tensor4D {\n return tf.add(tf.mul(x, params.weights), params.biases);\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { scale } from './scaleLayer';\nimport { ConvLayerParams } from './types';\n\nfunction convLayer(\n x: tf.Tensor4D,\n params: ConvLayerParams,\n strides: [number, number],\n withRelu: boolean,\n padding: 'valid' | 'same' = 'same',\n): tf.Tensor4D {\n const { filters, bias } = params.conv;\n\n let out = tf.conv2d(x, filters, strides, padding);\n out = tf.add(out, bias);\n out = scale(out, params.scale);\n return withRelu ? tf.relu(out) : out;\n}\n\nexport function conv(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], true);\n}\n\nexport function convNoRelu(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [1, 1], false);\n}\n\nexport function convDown(x: tf.Tensor4D, params: ConvLayerParams) {\n return convLayer(x, params, [2, 2], true, 'valid');\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, extractWeightsFactory, ExtractWeightsFunction, ParamMapping } from '../common/index';\nimport { isFloat } from '../utils/index';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n function extractFilterValues(numFilterValues: number, numFilters: number, filterSize: number): tf.Tensor4D {\n const weights = extractWeights(numFilterValues);\n const depth = weights.length / (numFilters * filterSize * filterSize);\n\n if (isFloat(depth)) {\n throw new Error(`depth has to be an integer: ${depth}, weights.length: ${weights.length}, numFilters: ${numFilters}, filterSize: ${filterSize}`);\n }\n\n return tf.tidy(\n () => tf.transpose(\n tf.tensor4d(weights, [numFilters, depth, filterSize, filterSize]),\n [2, 3, 1, 0],\n ),\n );\n }\n\n function extractConvParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvParams {\n const filters = extractFilterValues(numFilterValues, numFilters, filterSize);\n const bias = tf.tensor1d(extractWeights(numFilters));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/bias` },\n );\n\n return { filters, bias };\n }\n\n function extractScaleLayerParams(numWeights: number, mappedPrefix: string): ScaleLayerParams {\n const weights = tf.tensor1d(extractWeights(numWeights));\n const biases = tf.tensor1d(extractWeights(numWeights));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/weights` },\n { paramPath: `${mappedPrefix}/biases` },\n );\n\n return {\n weights,\n biases,\n };\n }\n\n function extractConvLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n ): ConvLayerParams {\n const conv = extractConvParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv`);\n const scale = extractScaleLayerParams(numFilters, `${mappedPrefix}/scale`);\n\n return { conv, scale };\n }\n\n function extractResidualLayerParams(\n numFilterValues: number,\n numFilters: number,\n filterSize: number,\n mappedPrefix: string,\n isDown: boolean = false,\n ): ResidualLayerParams {\n const conv1 = extractConvLayerParams((isDown ? 0.5 : 1) * numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv1`);\n const conv2 = extractConvLayerParams(numFilterValues, numFilters, filterSize, `${mappedPrefix}/conv2`);\n\n return { conv1, conv2 };\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams,\n };\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams,\n } = extractorsFactory(extractWeights, paramMappings);\n\n const conv32_down = extractConvLayerParams(4704, 32, 7, 'conv32_down');\n const conv32_1 = extractResidualLayerParams(9216, 32, 3, 'conv32_1');\n const conv32_2 = extractResidualLayerParams(9216, 32, 3, 'conv32_2');\n const conv32_3 = extractResidualLayerParams(9216, 32, 3, 'conv32_3');\n\n const conv64_down = extractResidualLayerParams(36864, 64, 3, 'conv64_down', true);\n const conv64_1 = extractResidualLayerParams(36864, 64, 3, 'conv64_1');\n const conv64_2 = extractResidualLayerParams(36864, 64, 3, 'conv64_2');\n const conv64_3 = extractResidualLayerParams(36864, 64, 3, 'conv64_3');\n\n const conv128_down = extractResidualLayerParams(147456, 128, 3, 'conv128_down', true);\n const conv128_1 = extractResidualLayerParams(147456, 128, 3, 'conv128_1');\n const conv128_2 = extractResidualLayerParams(147456, 128, 3, 'conv128_2');\n\n const conv256_down = extractResidualLayerParams(589824, 256, 3, 'conv256_down', true);\n const conv256_1 = extractResidualLayerParams(589824, 256, 3, 'conv256_1');\n const conv256_2 = extractResidualLayerParams(589824, 256, 3, 'conv256_2');\n const conv256_down_out = extractResidualLayerParams(589824, 256, 3, 'conv256_down_out');\n\n const fc = tf.tidy(\n () => tf.transpose(tf.tensor2d(extractWeights(256 * 128), [128, 256]), [1, 0]),\n );\n paramMappings.push({ paramPath: 'fc' });\n\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc,\n };\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common/index';\nimport { isTensor2D } from '../utils/index';\nimport { ConvLayerParams, NetParams, ResidualLayerParams, ScaleLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractScaleLayerParams(prefix: string): ScaleLayerParams {\n const weights = extractWeightEntry(`${prefix}/scale/weights`, 1);\n const biases = extractWeightEntry(`${prefix}/scale/biases`, 1);\n\n return { weights, biases };\n }\n\n function extractConvLayerParams(prefix: string): ConvLayerParams {\n const filters = extractWeightEntry(`${prefix}/conv/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/conv/bias`, 1);\n const scale = extractScaleLayerParams(prefix);\n\n return { conv: { filters, bias }, scale };\n }\n\n function extractResidualLayerParams(prefix: string): ResidualLayerParams {\n return {\n conv1: extractConvLayerParams(`${prefix}/conv1`),\n conv2: extractConvLayerParams(`${prefix}/conv2`),\n };\n }\n\n return {\n extractConvLayerParams,\n extractResidualLayerParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvLayerParams,\n extractResidualLayerParams,\n } = extractorsFactory(weightMap, paramMappings);\n\n const conv32_down = extractConvLayerParams('conv32_down');\n const conv32_1 = extractResidualLayerParams('conv32_1');\n const conv32_2 = extractResidualLayerParams('conv32_2');\n const conv32_3 = extractResidualLayerParams('conv32_3');\n\n const conv64_down = extractResidualLayerParams('conv64_down');\n const conv64_1 = extractResidualLayerParams('conv64_1');\n const conv64_2 = extractResidualLayerParams('conv64_2');\n const conv64_3 = extractResidualLayerParams('conv64_3');\n\n const conv128_down = extractResidualLayerParams('conv128_down');\n const conv128_1 = extractResidualLayerParams('conv128_1');\n const conv128_2 = extractResidualLayerParams('conv128_2');\n\n const conv256_down = extractResidualLayerParams('conv256_down');\n const conv256_1 = extractResidualLayerParams('conv256_1');\n const conv256_2 = extractResidualLayerParams('conv256_2');\n const conv256_down_out = extractResidualLayerParams('conv256_down_out');\n\n const { fc } = weightMap;\n paramMappings.push({ originalPath: 'fc', paramPath: 'fc' });\n\n if (!isTensor2D(fc)) {\n throw new Error(`expected weightMap[fc] to be a Tensor2D, instead have ${fc}`);\n }\n\n const params = {\n conv32_down,\n conv32_1,\n conv32_2,\n conv32_3,\n conv64_down,\n conv64_1,\n conv64_2,\n conv64_3,\n conv128_down,\n conv128_1,\n conv128_2,\n conv256_down,\n conv256_1,\n conv256_2,\n conv256_down_out,\n fc,\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { conv, convDown, convNoRelu } from './convLayer';\nimport { ResidualLayerParams } from './types';\n\nexport function residual(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = conv(x, params.conv1);\n out = convNoRelu(out, params.conv2);\n out = tf.add(out, x);\n out = tf.relu(out);\n return out;\n}\n\nexport function residualDown(x: tf.Tensor4D, params: ResidualLayerParams): tf.Tensor4D {\n let out = convDown(x, params.conv1);\n out = convNoRelu(out, params.conv2);\n\n let pooled = tf.avgPool(x, 2, 2, 'valid') as tf.Tensor4D;\n const zeros = tf.zeros(pooled.shape);\n const isPad = pooled.shape[3] !== out.shape[3];\n const isAdjustShape = pooled.shape[1] !== out.shape[1] || pooled.shape[2] !== out.shape[2];\n\n if (isAdjustShape) {\n const padShapeX = [...out.shape] as [number, number, number, number];\n padShapeX[1] = 1;\n const zerosW = tf.zeros(padShapeX);\n out = tf.concat([out, zerosW], 1);\n\n const padShapeY = [...out.shape] as [number, number, number, number];\n padShapeY[2] = 1;\n const zerosH = tf.zeros(padShapeY);\n out = tf.concat([out, zerosH], 2);\n }\n\n pooled = isPad ? tf.concat([pooled, zeros], 3) : pooled;\n out = tf.add(pooled, out) as tf.Tensor4D;\n\n out = tf.relu(out);\n return out;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { normalize } from '../ops/index';\nimport { convDown } from './convLayer';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { residual, residualDown } from './residualLayer';\nimport { NetParams } from './types';\n\nexport class FaceRecognitionNet extends NeuralNetwork {\n constructor() {\n super('FaceRecognitionNet');\n }\n\n public forwardInput(input: NetInput): tf.Tensor2D {\n const { params } = this;\n\n if (!params) {\n throw new Error('FaceRecognitionNet - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(150, true), 'float32');\n\n const meanRgb = [122.782, 117.001, 104.298];\n const normalized = normalize(batchTensor, meanRgb).div(255) as tf.Tensor4D;\n\n let out = convDown(normalized, params.conv32_down);\n out = tf.maxPool(out, 3, 2, 'valid');\n\n out = residual(out, params.conv32_1);\n out = residual(out, params.conv32_2);\n out = residual(out, params.conv32_3);\n\n out = residualDown(out, params.conv64_down);\n out = residual(out, params.conv64_1);\n out = residual(out, params.conv64_2);\n out = residual(out, params.conv64_3);\n\n out = residualDown(out, params.conv128_down);\n out = residual(out, params.conv128_1);\n out = residual(out, params.conv128_2);\n\n out = residualDown(out, params.conv256_down);\n out = residual(out, params.conv256_1);\n out = residual(out, params.conv256_2);\n out = residualDown(out, params.conv256_down_out);\n\n const globalAvg = out.mean([1, 2]) as tf.Tensor2D;\n const fullyConnected = tf.matMul(globalAvg, params.fc);\n\n return fullyConnected;\n });\n }\n\n public async forward(input: TNetInput): Promise {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async computeFaceDescriptor(input: TNetInput): Promise {\n if (input?.shape?.some((dim) => dim <= 0)) return new Float32Array(128);\n const netInput = await toNetInput(input);\n const faceDescriptorTensors = tf.tidy(() => tf.unstack(this.forwardInput(netInput)));\n const faceDescriptorsForBatch = await Promise.all(faceDescriptorTensors.map((t) => t.data())) as Float32Array[];\n faceDescriptorTensors.forEach((t) => t.dispose());\n return netInput.isBatchInput ? faceDescriptorsForBatch : faceDescriptorsForBatch[0];\n }\n\n protected getDefaultModelName(): string {\n return 'face_recognition_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import { FaceRecognitionNet } from './FaceRecognitionNet';\n\nexport * from './FaceRecognitionNet';\n\nexport function createFaceRecognitionNet(weights: Float32Array) {\n const net = new FaceRecognitionNet();\n net.extractWeights(weights);\n return net;\n}\n", "export type WithFaceDescriptor = TSource & {\n descriptor: Float32Array\n}\n\nexport function extendWithFaceDescriptor<\n TSource\n>(\n sourceObj: TSource,\n descriptor: Float32Array,\n): WithFaceDescriptor {\n const extension = { descriptor };\n return { ...sourceObj, ...extension };\n}\n", "export type WithAge = TSource & {\n age: number\n}\n\nexport function isWithAge(obj: any): obj is WithAge<{}> {\n return typeof obj.age === 'number';\n}\n\nexport function extendWithAge<\n TSource\n>(\n sourceObj: TSource,\n age: number,\n): WithAge {\n const extension = { age };\n return { ...sourceObj, ...extension };\n}\n", "import { Gender } from '../ageGenderNet/types';\nimport { isValidProbablitiy } from '../utils/index';\n\nexport type WithGender = TSource & {\n gender: Gender\n genderProbability: number\n}\n\nexport function isWithGender(obj: any): obj is WithGender<{}> {\n return (obj.gender === Gender.MALE || obj.gender === Gender.FEMALE)\n && isValidProbablitiy(obj.genderProbability);\n}\n\nexport function extendWithGender<\n TSource\n>(\n sourceObj: TSource,\n gender: Gender,\n genderProbability: number,\n): WithGender {\n const extension = { gender, genderProbability };\n return { ...sourceObj, ...extension };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ExtractWeightsFunction, ParamMapping, ConvParams, extractWeightsFactory } from '../common/index';\nimport { MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n function extractDepthwiseConvParams(numChannels: number, mappedPrefix: string): MobileNetV1.DepthwiseConvParams {\n const filters = tf.tensor4d(extractWeights(3 * 3 * numChannels), [3, 3, numChannels, 1]);\n const batch_norm_scale = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_offset = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_mean = tf.tensor1d(extractWeights(numChannels));\n const batch_norm_variance = tf.tensor1d(extractWeights(numChannels));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/batch_norm_scale` },\n { paramPath: `${mappedPrefix}/batch_norm_offset` },\n { paramPath: `${mappedPrefix}/batch_norm_mean` },\n { paramPath: `${mappedPrefix}/batch_norm_variance` },\n );\n\n return {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance,\n };\n }\n\n function extractConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n isPointwiseConv?: boolean,\n ): ConvParams {\n const filters = tf.tensor4d(\n extractWeights(channelsIn * channelsOut * filterSize * filterSize),\n [filterSize, filterSize, channelsIn, channelsOut],\n );\n const bias = tf.tensor1d(extractWeights(channelsOut));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/filters` },\n { paramPath: `${mappedPrefix}/${isPointwiseConv ? 'batch_norm_offset' : 'bias'}` },\n );\n\n return { filters, bias };\n }\n\n function extractPointwiseConvParams(\n channelsIn: number,\n channelsOut: number,\n filterSize: number,\n mappedPrefix: string,\n ): PointwiseConvParams {\n const {\n filters,\n bias,\n } = extractConvParams(channelsIn, channelsOut, filterSize, mappedPrefix, true);\n\n return {\n filters,\n batch_norm_offset: bias,\n };\n }\n\n function extractConvPairParams(\n channelsIn: number,\n channelsOut: number,\n mappedPrefix: string,\n ): MobileNetV1.ConvPairParams {\n const depthwise_conv = extractDepthwiseConvParams(channelsIn, `${mappedPrefix}/depthwise_conv`);\n const pointwise_conv = extractPointwiseConvParams(channelsIn, channelsOut, 1, `${mappedPrefix}/pointwise_conv`);\n\n return { depthwise_conv, pointwise_conv };\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n const conv_0 = extractPointwiseConvParams(3, 32, 3, 'mobilenetv1/conv_0');\n const conv_1 = extractConvPairParams(32, 64, 'mobilenetv1/conv_1');\n const conv_2 = extractConvPairParams(64, 128, 'mobilenetv1/conv_2');\n const conv_3 = extractConvPairParams(128, 128, 'mobilenetv1/conv_3');\n const conv_4 = extractConvPairParams(128, 256, 'mobilenetv1/conv_4');\n const conv_5 = extractConvPairParams(256, 256, 'mobilenetv1/conv_5');\n const conv_6 = extractConvPairParams(256, 512, 'mobilenetv1/conv_6');\n const conv_7 = extractConvPairParams(512, 512, 'mobilenetv1/conv_7');\n const conv_8 = extractConvPairParams(512, 512, 'mobilenetv1/conv_8');\n const conv_9 = extractConvPairParams(512, 512, 'mobilenetv1/conv_9');\n const conv_10 = extractConvPairParams(512, 512, 'mobilenetv1/conv_10');\n const conv_11 = extractConvPairParams(512, 512, 'mobilenetv1/conv_11');\n const conv_12 = extractConvPairParams(512, 1024, 'mobilenetv1/conv_12');\n const conv_13 = extractConvPairParams(1024, 1024, 'mobilenetv1/conv_13');\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n conv_8,\n conv_9,\n conv_10,\n conv_11,\n conv_12,\n conv_13,\n };\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n const conv_0 = extractPointwiseConvParams(1024, 256, 1, 'prediction_layer/conv_0');\n const conv_1 = extractPointwiseConvParams(256, 512, 3, 'prediction_layer/conv_1');\n const conv_2 = extractPointwiseConvParams(512, 128, 1, 'prediction_layer/conv_2');\n const conv_3 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_3');\n const conv_4 = extractPointwiseConvParams(256, 128, 1, 'prediction_layer/conv_4');\n const conv_5 = extractPointwiseConvParams(128, 256, 3, 'prediction_layer/conv_5');\n const conv_6 = extractPointwiseConvParams(256, 64, 1, 'prediction_layer/conv_6');\n const conv_7 = extractPointwiseConvParams(64, 128, 3, 'prediction_layer/conv_7');\n const box_encoding_0_predictor = extractConvParams(512, 12, 1, 'prediction_layer/box_predictor_0/box_encoding_predictor');\n const class_predictor_0 = extractConvParams(512, 9, 1, 'prediction_layer/box_predictor_0/class_predictor');\n const box_encoding_1_predictor = extractConvParams(1024, 24, 1, 'prediction_layer/box_predictor_1/box_encoding_predictor');\n const class_predictor_1 = extractConvParams(1024, 18, 1, 'prediction_layer/box_predictor_1/class_predictor');\n const box_encoding_2_predictor = extractConvParams(512, 24, 1, 'prediction_layer/box_predictor_2/box_encoding_predictor');\n const class_predictor_2 = extractConvParams(512, 18, 1, 'prediction_layer/box_predictor_2/class_predictor');\n const box_encoding_3_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_3/box_encoding_predictor');\n const class_predictor_3 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_3/class_predictor');\n const box_encoding_4_predictor = extractConvParams(256, 24, 1, 'prediction_layer/box_predictor_4/box_encoding_predictor');\n const class_predictor_4 = extractConvParams(256, 18, 1, 'prediction_layer/box_predictor_4/class_predictor');\n const box_encoding_5_predictor = extractConvParams(128, 24, 1, 'prediction_layer/box_predictor_5/box_encoding_predictor');\n const class_predictor_5 = extractConvParams(128, 18, 1, 'prediction_layer/box_predictor_5/class_predictor');\n\n const box_predictor_0 = {\n box_encoding_predictor: box_encoding_0_predictor,\n class_predictor: class_predictor_0,\n };\n const box_predictor_1 = {\n box_encoding_predictor: box_encoding_1_predictor,\n class_predictor: class_predictor_1,\n };\n const box_predictor_2 = {\n box_encoding_predictor: box_encoding_2_predictor,\n class_predictor: class_predictor_2,\n };\n const box_predictor_3 = {\n box_encoding_predictor: box_encoding_3_predictor,\n class_predictor: class_predictor_3,\n };\n const box_predictor_4 = {\n box_encoding_predictor: box_encoding_4_predictor,\n class_predictor: class_predictor_4,\n };\n const box_predictor_5 = {\n box_encoding_predictor: box_encoding_5_predictor,\n class_predictor: class_predictor_5,\n };\n return {\n conv_0,\n conv_1,\n conv_2,\n conv_3,\n conv_4,\n conv_5,\n conv_6,\n conv_7,\n box_predictor_0,\n box_predictor_1,\n box_predictor_2,\n box_predictor_3,\n box_predictor_4,\n box_predictor_5,\n };\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n };\n}\n\nexport function extractParams(weights: Float32Array): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n } = extractorsFactory(extractWeights, paramMappings);\n const mobilenetv1 = extractMobilenetV1Params();\n const prediction_layer = extractPredictionLayerParams();\n const extra_dim = tf.tensor3d(\n extractWeights(5118 * 4),\n [1, 5118, 4],\n );\n const output_layer = {\n extra_dim,\n };\n paramMappings.push({ paramPath: 'output_layer/extra_dim' });\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n\n return {\n params: {\n mobilenetv1,\n prediction_layer,\n output_layer,\n },\n paramMappings,\n };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams, disposeUnusedWeightTensors, extractWeightEntryFactory, ParamMapping } from '../common/index';\nimport { isTensor3D } from '../utils/index';\nimport { BoxPredictionParams, MobileNetV1, NetParams, PointwiseConvParams, PredictionLayerParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractPointwiseConvParams(prefix: string, idx: number, mappedPrefix: string): PointwiseConvParams {\n const filters = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/weights`, 4, `${mappedPrefix}/filters`);\n const batch_norm_offset = extractWeightEntry(`${prefix}/Conv2d_${idx}_pointwise/convolution_bn_offset`, 1, `${mappedPrefix}/batch_norm_offset`);\n return { filters, batch_norm_offset };\n }\n\n function extractConvPairParams(idx: number): MobileNetV1.ConvPairParams {\n const mappedPrefix = `mobilenetv1/conv_${idx}`;\n const prefixDepthwiseConv = `MobilenetV1/Conv2d_${idx}_depthwise`;\n const mappedPrefixDepthwiseConv = `${mappedPrefix}/depthwise_conv`;\n const mappedPrefixPointwiseConv = `${mappedPrefix}/pointwise_conv`;\n\n const filters = extractWeightEntry(`${prefixDepthwiseConv}/depthwise_weights`, 4, `${mappedPrefixDepthwiseConv}/filters`);\n const batch_norm_scale = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/gamma`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_scale`);\n const batch_norm_offset = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/beta`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_offset`);\n const batch_norm_mean = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_mean`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_mean`);\n const batch_norm_variance = extractWeightEntry(`${prefixDepthwiseConv}/BatchNorm/moving_variance`, 1, `${mappedPrefixDepthwiseConv}/batch_norm_variance`);\n\n return {\n depthwise_conv: {\n filters,\n batch_norm_scale,\n batch_norm_offset,\n batch_norm_mean,\n batch_norm_variance,\n },\n pointwise_conv: extractPointwiseConvParams('MobilenetV1', idx, mappedPrefixPointwiseConv),\n };\n }\n\n function extractMobilenetV1Params(): MobileNetV1.Params {\n return {\n conv_0: extractPointwiseConvParams('MobilenetV1', 0, 'mobilenetv1/conv_0'),\n conv_1: extractConvPairParams(1),\n conv_2: extractConvPairParams(2),\n conv_3: extractConvPairParams(3),\n conv_4: extractConvPairParams(4),\n conv_5: extractConvPairParams(5),\n conv_6: extractConvPairParams(6),\n conv_7: extractConvPairParams(7),\n conv_8: extractConvPairParams(8),\n conv_9: extractConvPairParams(9),\n conv_10: extractConvPairParams(10),\n conv_11: extractConvPairParams(11),\n conv_12: extractConvPairParams(12),\n conv_13: extractConvPairParams(13),\n };\n }\n\n function extractConvParams(prefix: string, mappedPrefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/weights`, 4, `${mappedPrefix}/filters`);\n const bias = extractWeightEntry(`${prefix}/biases`, 1, `${mappedPrefix}/bias`);\n return { filters, bias };\n }\n\n function extractBoxPredictorParams(idx: number): BoxPredictionParams {\n const box_encoding_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/BoxEncodingPredictor`,\n `prediction_layer/box_predictor_${idx}/box_encoding_predictor`,\n );\n const class_predictor = extractConvParams(\n `Prediction/BoxPredictor_${idx}/ClassPredictor`,\n `prediction_layer/box_predictor_${idx}/class_predictor`,\n );\n return { box_encoding_predictor, class_predictor };\n }\n\n function extractPredictionLayerParams(): PredictionLayerParams {\n return {\n conv_0: extractPointwiseConvParams('Prediction', 0, 'prediction_layer/conv_0'),\n conv_1: extractPointwiseConvParams('Prediction', 1, 'prediction_layer/conv_1'),\n conv_2: extractPointwiseConvParams('Prediction', 2, 'prediction_layer/conv_2'),\n conv_3: extractPointwiseConvParams('Prediction', 3, 'prediction_layer/conv_3'),\n conv_4: extractPointwiseConvParams('Prediction', 4, 'prediction_layer/conv_4'),\n conv_5: extractPointwiseConvParams('Prediction', 5, 'prediction_layer/conv_5'),\n conv_6: extractPointwiseConvParams('Prediction', 6, 'prediction_layer/conv_6'),\n conv_7: extractPointwiseConvParams('Prediction', 7, 'prediction_layer/conv_7'),\n box_predictor_0: extractBoxPredictorParams(0),\n box_predictor_1: extractBoxPredictorParams(1),\n box_predictor_2: extractBoxPredictorParams(2),\n box_predictor_3: extractBoxPredictorParams(3),\n box_predictor_4: extractBoxPredictorParams(4),\n box_predictor_5: extractBoxPredictorParams(5),\n };\n }\n\n return {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n): { params: NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n const {\n extractMobilenetV1Params,\n extractPredictionLayerParams,\n } = extractorsFactory(weightMap, paramMappings);\n const extra_dim = weightMap['Output/extra_dim'];\n paramMappings.push({ originalPath: 'Output/extra_dim', paramPath: 'output_layer/extra_dim' });\n if (!isTensor3D(extra_dim)) {\n throw new Error(`expected weightMap['Output/extra_dim'] to be a Tensor3D, instead have ${extra_dim}`);\n }\n\n const params = {\n mobilenetv1: extractMobilenetV1Params(),\n prediction_layer: extractPredictionLayerParams(),\n output_layer: {\n extra_dim,\n },\n };\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { PointwiseConvParams } from './types';\n\nexport function pointwiseConvLayer(x: tf.Tensor4D, params: PointwiseConvParams, strides: [number, number]) {\n return tf.tidy(() => {\n let out = tf.conv2d(x, params.filters, strides, 'same');\n /*\n if (x.shape[1] === 512 && x.shape[3] === 3) {\n console.log('Input:', x.shape, x.size, 'sum:', x.reshape([786432]).sum().dataSync()[0]); // input does not change (checked values)\n console.log('Filter:', params.filters.shape, params.filters.size, 'sum:', params.filters.reshape([864]).sum().dataSync()[0]); // params do not change (checked values)\n console.log('Strides', strides);\n console.log('Conv2d 1st 5 values:', out.shape, out.size, out.dataSync().slice(0, 5)); // output has different values!\n console.log('Conv2D sum of all values:', tf.reshape(out, [2097152]).sum().dataSync()[0]); // silly sum just to see how much results diverged\n }\n */\n out = tf.add(out, params.batch_norm_offset);\n return tf.clipByValue(out, 0, 6);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { MobileNetV1 } from './types';\n\nconst epsilon = 0.0010000000474974513;\n\nfunction depthwiseConvLayer(x: tf.Tensor4D, params: MobileNetV1.DepthwiseConvParams, strides: [number, number]) {\n return tf.tidy(() => {\n let out = tf.depthwiseConv2d(x, params.filters, strides, 'same');\n out = tf.batchNorm(\n out,\n params.batch_norm_mean,\n params.batch_norm_variance,\n params.batch_norm_offset,\n params.batch_norm_scale,\n epsilon,\n );\n return tf.clipByValue(out, 0, 6);\n });\n}\n\nfunction getStridesForLayerIdx(layerIdx: number): [number, number] {\n return [2, 4, 6, 12].some((idx) => idx === layerIdx) ? [2, 2] : [1, 1];\n}\n\nexport function mobileNetV1(x: tf.Tensor4D, params: MobileNetV1.Params) {\n return tf.tidy(() => {\n let conv11;\n let out = pointwiseConvLayer(x, params.conv_0, [2, 2]);\n\n const convPairParams = [\n params.conv_1,\n params.conv_2,\n params.conv_3,\n params.conv_4,\n params.conv_5,\n params.conv_6,\n params.conv_7,\n params.conv_8,\n params.conv_9,\n params.conv_10,\n params.conv_11,\n params.conv_12,\n params.conv_13,\n ];\n\n convPairParams.forEach((param, i) => {\n const layerIdx = i + 1;\n const depthwiseConvStrides = getStridesForLayerIdx(layerIdx);\n out = depthwiseConvLayer(out, param.depthwise_conv, depthwiseConvStrides);\n out = pointwiseConvLayer(out, param.pointwise_conv, [1, 1]);\n if (layerIdx === 11) conv11 = out;\n });\n\n if (conv11 === null) {\n throw new Error('mobileNetV1 - output of conv layer 11 is null');\n }\n\n return {\n out,\n conv11: conv11 as any,\n };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nfunction IOU(boxes: tf.Tensor2D, i: number, j: number) {\n const boxesData = boxes.arraySync();\n const yminI = Math.min(boxesData[i][0], boxesData[i][2]);\n const xminI = Math.min(boxesData[i][1], boxesData[i][3]);\n const ymaxI = Math.max(boxesData[i][0], boxesData[i][2]);\n const xmaxI = Math.max(boxesData[i][1], boxesData[i][3]);\n const yminJ = Math.min(boxesData[j][0], boxesData[j][2]);\n const xminJ = Math.min(boxesData[j][1], boxesData[j][3]);\n const ymaxJ = Math.max(boxesData[j][0], boxesData[j][2]);\n const xmaxJ = Math.max(boxesData[j][1], boxesData[j][3]);\n const areaI = (ymaxI - yminI) * (xmaxI - xminI);\n const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);\n if (areaI <= 0 || areaJ <= 0) return 0.0;\n const intersectionYmin = Math.max(yminI, yminJ);\n const intersectionXmin = Math.max(xminI, xminJ);\n const intersectionYmax = Math.min(ymaxI, ymaxJ);\n const intersectionXmax = Math.min(xmaxI, xmaxJ);\n const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) * Math.max(intersectionXmax - intersectionXmin, 0.0);\n return intersectionArea / (areaI + areaJ - intersectionArea);\n}\n\nexport function nonMaxSuppression(\n boxes: tf.Tensor2D,\n scores: number[],\n maxOutputSize: number,\n iouThreshold: number,\n scoreThreshold: number,\n): number[] {\n const numBoxes = boxes.shape[0];\n const outputSize = Math.min(maxOutputSize, numBoxes);\n\n const candidates = scores\n .map((score, boxIndex) => ({ score, boxIndex }))\n .filter((c) => c.score > scoreThreshold)\n .sort((c1, c2) => c2.score - c1.score);\n\n const suppressFunc = (x: number) => (x <= iouThreshold ? 1 : 0);\n const selected: number[] = [];\n\n candidates.forEach((c) => {\n if (selected.length >= outputSize) return;\n const originalScore = c.score;\n for (let j = selected.length - 1; j >= 0; --j) {\n const iou = IOU(boxes, c.boxIndex, selected[j]);\n if (iou === 0.0) continue;\n c.score *= suppressFunc(iou);\n if (c.score <= scoreThreshold) break;\n }\n if (originalScore === c.score) {\n selected.push(c.boxIndex);\n }\n });\n return selected;\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { OutputLayerParams } from './types';\n\nfunction getCenterCoordinatesAndSizesLayer(x: tf.Tensor2D) {\n const vec = tf.unstack(tf.transpose(x, [1, 0]));\n\n const sizes = [\n tf.sub(vec[2], vec[0]),\n tf.sub(vec[3], vec[1]),\n ];\n const centers = [\n tf.add(vec[0], tf.div(sizes[0], 2)),\n tf.add(vec[1], tf.div(sizes[1], 2)),\n ];\n return { sizes, centers };\n}\n\nfunction decodeBoxesLayer(x0: tf.Tensor2D, x1: tf.Tensor2D) {\n const { sizes, centers } = getCenterCoordinatesAndSizesLayer(x0);\n\n const vec = tf.unstack(tf.transpose(x1, [1, 0]));\n const div0_out = tf.div(tf.mul(tf.exp(tf.div(vec[2], 5)), sizes[0]), 2);\n const add0_out = tf.add(tf.mul(tf.div(vec[0], 10), sizes[0]), centers[0]);\n const div1_out = tf.div(tf.mul(tf.exp(tf.div(vec[3], 5)), sizes[1]), 2);\n const add1_out = tf.add(tf.mul(tf.div(vec[1], 10), sizes[1]), centers[1]);\n\n return tf.transpose(\n tf.stack([\n tf.sub(add0_out, div0_out),\n tf.sub(add1_out, div1_out),\n tf.add(add0_out, div0_out),\n tf.add(add1_out, div1_out),\n ]),\n [1, 0],\n );\n}\n\nexport function outputLayer(boxPredictions: tf.Tensor4D, classPredictions: tf.Tensor4D, params: OutputLayerParams) {\n return tf.tidy(() => {\n const batchSize = boxPredictions.shape[0];\n\n let boxes = decodeBoxesLayer(\n tf.reshape(tf.tile(params.extra_dim, [batchSize, 1, 1]), [-1, 4]) as tf.Tensor2D,\n tf.reshape(boxPredictions, [-1, 4]) as tf.Tensor2D,\n );\n boxes = tf.reshape(boxes, [batchSize, (boxes.shape[0] / batchSize), 4]);\n\n const scoresAndClasses = tf.sigmoid(tf.slice(classPredictions, [0, 0, 1], [-1, -1, -1]));\n let scores = tf.slice(scoresAndClasses, [0, 0, 0], [-1, -1, 1]) as tf.Tensor;\n\n scores = tf.reshape(scores, [batchSize, scores.shape[1] as number]);\n\n const boxesByBatch = tf.unstack(boxes) as tf.Tensor2D[];\n const scoresByBatch = tf.unstack(scores) as tf.Tensor1D[];\n\n return { boxes: boxesByBatch, scores: scoresByBatch };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { convLayer } from '../common/index';\nimport { BoxPredictionParams } from './types';\n\nexport function boxPredictionLayer(\n x: tf.Tensor4D,\n params: BoxPredictionParams,\n) {\n return tf.tidy(() => {\n const batchSize = x.shape[0];\n const boxPredictionEncoding = tf.reshape(\n convLayer(x, params.box_encoding_predictor),\n [batchSize, -1, 1, 4],\n );\n const classPrediction = tf.reshape(\n convLayer(x, params.class_predictor),\n [batchSize, -1, 3],\n );\n return { boxPredictionEncoding, classPrediction };\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { boxPredictionLayer } from './boxPredictionLayer';\nimport { pointwiseConvLayer } from './pointwiseConvLayer';\nimport { PredictionLayerParams } from './types';\n\nexport function predictionLayer(\n x: tf.Tensor4D,\n conv11: tf.Tensor4D,\n params: PredictionLayerParams,\n) {\n return tf.tidy(() => {\n const conv0 = pointwiseConvLayer(x, params.conv_0, [1, 1]);\n const conv1 = pointwiseConvLayer(conv0, params.conv_1, [2, 2]);\n const conv2 = pointwiseConvLayer(conv1, params.conv_2, [1, 1]);\n const conv3 = pointwiseConvLayer(conv2, params.conv_3, [2, 2]);\n const conv4 = pointwiseConvLayer(conv3, params.conv_4, [1, 1]);\n const conv5 = pointwiseConvLayer(conv4, params.conv_5, [2, 2]);\n const conv6 = pointwiseConvLayer(conv5, params.conv_6, [1, 1]);\n const conv7 = pointwiseConvLayer(conv6, params.conv_7, [2, 2]);\n\n const boxPrediction0 = boxPredictionLayer(conv11, params.box_predictor_0);\n const boxPrediction1 = boxPredictionLayer(x, params.box_predictor_1);\n const boxPrediction2 = boxPredictionLayer(conv1, params.box_predictor_2);\n const boxPrediction3 = boxPredictionLayer(conv3, params.box_predictor_3);\n const boxPrediction4 = boxPredictionLayer(conv5, params.box_predictor_4);\n const boxPrediction5 = boxPredictionLayer(conv7, params.box_predictor_5);\n\n const boxPredictions = tf.concat([\n boxPrediction0.boxPredictionEncoding,\n boxPrediction1.boxPredictionEncoding,\n boxPrediction2.boxPredictionEncoding,\n boxPrediction3.boxPredictionEncoding,\n boxPrediction4.boxPredictionEncoding,\n boxPrediction5.boxPredictionEncoding,\n ], 1) as tf.Tensor4D;\n\n const classPredictions = tf.concat([\n boxPrediction0.classPrediction,\n boxPrediction1.classPrediction,\n boxPrediction2.classPrediction,\n boxPrediction3.classPrediction,\n boxPrediction4.classPrediction,\n boxPrediction5.classPrediction,\n ], 1) as tf.Tensor4D;\n\n return {\n boxPredictions,\n classPredictions,\n };\n });\n}\n", "export interface ISsdMobilenetv1Options {\n minConfidence?: number\n maxResults?: number\n}\n\nexport class SsdMobilenetv1Options {\n protected _name: string = 'SsdMobilenetv1Options'\n\n private _minConfidence: number\n\n private _maxResults: number\n\n constructor({ minConfidence, maxResults }: ISsdMobilenetv1Options = {}) {\n this._minConfidence = minConfidence || 0.5;\n this._maxResults = maxResults || 100;\n\n if (typeof this._minConfidence !== 'number' || this._minConfidence <= 0 || this._minConfidence >= 1) {\n throw new Error(`${this._name} - expected minConfidence to be a number between 0 and 1`);\n }\n\n if (typeof this._maxResults !== 'number') {\n throw new Error(`${this._name} - expected maxResults to be a number`);\n }\n }\n\n get minConfidence(): number { return this._minConfidence; }\n\n get maxResults(): number { return this._maxResults; }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { Rect } from '../classes/index';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { NetInput, TNetInput, toNetInput } from '../dom/index';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { mobileNetV1 } from './mobileNetV1';\nimport { nonMaxSuppression } from './nonMaxSuppression';\nimport { outputLayer } from './outputLayer';\nimport { predictionLayer } from './predictionLayer';\nimport { ISsdMobilenetv1Options, SsdMobilenetv1Options } from './SsdMobilenetv1Options';\nimport { NetParams } from './types';\n\nexport class SsdMobilenetv1 extends NeuralNetwork {\n constructor() {\n super('SsdMobilenetv1');\n }\n\n public forwardInput(input: NetInput) {\n const { params } = this;\n\n if (!params) {\n throw new Error('SsdMobilenetv1 - load model before inference');\n }\n\n return tf.tidy(() => {\n const batchTensor = tf.cast(input.toBatchTensor(512, false), 'float32');\n const x = tf.sub(tf.div(batchTensor, 127.5), 1) as tf.Tensor4D; // input is normalized -1..1\n const features = mobileNetV1(x, params.mobilenetv1);\n const { boxPredictions, classPredictions } = predictionLayer(features.out, features.conv11, params.prediction_layer);\n\n return outputLayer(boxPredictions, classPredictions, params.output_layer);\n });\n }\n\n public async forward(input: TNetInput) {\n return this.forwardInput(await toNetInput(input));\n }\n\n public async locateFaces(input: TNetInput, options: ISsdMobilenetv1Options = {}): Promise {\n const { maxResults, minConfidence } = new SsdMobilenetv1Options(options);\n const netInput = await toNetInput(input);\n\n const { boxes: _boxes, scores: _scores } = this.forwardInput(netInput);\n\n const boxes = _boxes[0];\n const scores = _scores[0];\n for (let i = 1; i < _boxes.length; i++) {\n _boxes[i].dispose();\n _scores[i].dispose();\n }\n\n const scoresData = Array.from(scores.dataSync());\n const iouThreshold = 0.5;\n const indices = nonMaxSuppression(boxes, scoresData as number[], maxResults, iouThreshold, minConfidence);\n\n const reshapedDims = netInput.getReshapedInputDimensions(0);\n const inputSize = netInput.inputSize as number;\n const padX = inputSize / reshapedDims.width;\n const padY = inputSize / reshapedDims.height;\n\n const boxesData = boxes.arraySync();\n const results = indices\n .map((idx) => {\n const [top, bottom] = [\n Math.max(0, boxesData[idx][0]),\n Math.min(1.0, boxesData[idx][2]),\n ].map((val) => val * padY);\n const [left, right] = [\n Math.max(0, boxesData[idx][1]),\n Math.min(1.0, boxesData[idx][3]),\n ].map((val) => val * padX);\n return new FaceDetection(\n scoresData[idx] as number,\n new Rect(left, top, right - left, bottom - top),\n { height: netInput.getInputHeight(0), width: netInput.getInputWidth(0) },\n );\n });\n\n boxes.dispose();\n scores.dispose();\n return results;\n }\n\n protected getDefaultModelName(): string {\n return 'ssd_mobilenetv1_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap);\n }\n\n protected extractParams(weights: Float32Array) {\n return extractParams(weights);\n }\n}\n", "import { SsdMobilenetv1 } from './SsdMobilenetv1';\n\nexport * from './SsdMobilenetv1';\nexport * from './SsdMobilenetv1Options';\n\nexport function createSsdMobilenetv1(weights: Float32Array) {\n const net = new SsdMobilenetv1();\n net.extractWeights(weights);\n return net;\n}\n\nexport function createFaceDetectionNet(weights: Float32Array) {\n return createSsdMobilenetv1(weights);\n}\n\n// alias for backward compatibily\nexport class FaceDetectionNet extends SsdMobilenetv1 {}\n", "import { Point } from '../classes/index';\n\nexport const IOU_THRESHOLD = 0.4;\n\nexport const BOX_ANCHORS = [\n new Point(0.738768, 0.874946),\n new Point(2.42204, 2.65704),\n new Point(4.30971, 7.04493),\n new Point(10.246, 4.59428),\n new Point(12.6868, 11.8741),\n];\n\nexport const BOX_ANCHORS_SEPARABLE = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308),\n];\n\nexport const MEAN_RGB_SEPARABLE: [number, number, number] = [117.001, 114.697, 97.404];\n\nexport const DEFAULT_MODEL_NAME = 'tiny_yolov2_model';\nexport const DEFAULT_MODEL_NAME_SEPARABLE_CONV = 'tiny_yolov2_separable_conv_model';\n", "import { Point } from '../classes/Point';\n\nexport type TinyYolov2Config = {\n withSeparableConvs: boolean\n iouThreshold: number\n anchors: Point[]\n classes: string[]\n meanRgb?: [number, number, number]\n withClassScores?: boolean,\n filterSizes?: number[]\n isFirstLayerConv2d?: boolean\n}\n\nconst isNumber = (arg: any) => typeof arg === 'number';\n\nexport function validateConfig(config: any) {\n if (!config) {\n throw new Error(`invalid config: ${config}`);\n }\n\n if (typeof config.withSeparableConvs !== 'boolean') {\n throw new Error(`config.withSeparableConvs has to be a boolean, have: ${config.withSeparableConvs}`);\n }\n\n if (!isNumber(config.iouThreshold) || config.iouThreshold < 0 || config.iouThreshold > 1.0) {\n throw new Error(`config.iouThreshold has to be a number between [0, 1], have: ${config.iouThreshold}`);\n }\n\n if (\n !Array.isArray(config.classes)\n || !config.classes.length\n || !config.classes.every((c: any) => typeof c === 'string')\n ) {\n throw new Error(`config.classes has to be an array class names: string[], have: ${JSON.stringify(config.classes)}`);\n }\n\n if (\n !Array.isArray(config.anchors)\n || !config.anchors.length\n || !config.anchors.map((a: any) => a || {}).every((a: any) => isNumber(a.x) && isNumber(a.y))\n ) {\n throw new Error(`config.anchors has to be an array of { x: number, y: number }, have: ${JSON.stringify(config.anchors)}`);\n }\n\n if (config.meanRgb && (\n !Array.isArray(config.meanRgb)\n || config.meanRgb.length !== 3\n || !config.meanRgb.every(isNumber)\n )) {\n throw new Error(`config.meanRgb has to be an array of shape [number, number, number], have: ${JSON.stringify(config.meanRgb)}`);\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nexport function leaky(x: tf.Tensor4D): tf.Tensor4D {\n return tf.tidy(() => {\n const min = tf.mul(x, tf.scalar(0.10000000149011612));\n return tf.add(tf.relu(tf.sub(x, min)), min);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { leaky } from './leaky';\nimport { ConvWithBatchNorm } from './types';\n\nexport function convWithBatchNorm(x: tf.Tensor4D, params: ConvWithBatchNorm): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D;\n out = tf.conv2d(out, params.conv.filters, [1, 1], 'valid');\n out = tf.sub(out, params.bn.sub);\n out = tf.mul(out, params.bn.truediv);\n out = tf.add(out, params.conv.bias);\n return leaky(out);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { SeparableConvParams } from '../common/types';\nimport { leaky } from './leaky';\n\nexport function depthwiseSeparableConv(x: tf.Tensor4D, params: SeparableConvParams): tf.Tensor4D {\n return tf.tidy(() => {\n let out = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) as tf.Tensor4D;\n out = tf.separableConv2d(out, params.depthwise_filter, params.pointwise_filter, [1, 1], 'valid');\n out = tf.add(out, params.bias);\n return leaky(out);\n });\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { extractConvParamsFactory } from '../common/index';\nimport { extractSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightsFactory } from '../common/extractWeightsFactory';\nimport { ExtractWeightsFunction, ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(extractWeights: ExtractWeightsFunction, paramMappings: ParamMapping[]) {\n const extractConvParams = extractConvParamsFactory(extractWeights, paramMappings);\n\n function extractBatchNormParams(size: number, mappedPrefix: string): BatchNorm {\n const sub = tf.tensor1d(extractWeights(size));\n const truediv = tf.tensor1d(extractWeights(size));\n\n paramMappings.push(\n { paramPath: `${mappedPrefix}/sub` },\n { paramPath: `${mappedPrefix}/truediv` },\n );\n return { sub, truediv };\n }\n\n function extractConvWithBatchNormParams(channelsIn: number, channelsOut: number, mappedPrefix: string): ConvWithBatchNorm {\n const conv = extractConvParams(channelsIn, channelsOut, 3, `${mappedPrefix}/conv`);\n const bn = extractBatchNormParams(channelsOut, `${mappedPrefix}/bn`);\n return { conv, bn };\n }\n const extractSeparableConvParams = extractSeparableConvParamsFactory(extractWeights, paramMappings);\n\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n };\n}\n\nexport function extractParams(\n weights: Float32Array,\n config: TinyYolov2Config,\n boxEncodingSize: number,\n filterSizes: number[],\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n const {\n extractWeights,\n getRemainingWeights,\n } = extractWeightsFactory(weights);\n\n const paramMappings: ParamMapping[] = [];\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n } = extractorsFactory(extractWeights, paramMappings);\n let params: TinyYolov2NetParams;\n\n if (config.withSeparableConvs) {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes;\n const conv0 = config.isFirstLayerConv2d\n ? extractConvParams(s0, s1, 3, 'conv0')\n : extractSeparableConvParams(s0, s1, 'conv0');\n const conv1 = extractSeparableConvParams(s1, s2, 'conv1');\n const conv2 = extractSeparableConvParams(s2, s3, 'conv2');\n const conv3 = extractSeparableConvParams(s3, s4, 'conv3');\n const conv4 = extractSeparableConvParams(s4, s5, 'conv4');\n const conv5 = extractSeparableConvParams(s5, s6, 'conv5');\n const conv6 = s7 ? extractSeparableConvParams(s6, s7, 'conv6') : undefined;\n const conv7 = s8 ? extractSeparableConvParams(s7, s8, 'conv7') : undefined;\n const conv8 = extractConvParams(s8 || s7 || s6, 5 * boxEncodingSize, 1, 'conv8');\n params = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\n } else {\n const [s0, s1, s2, s3, s4, s5, s6, s7, s8] = filterSizes;\n const conv0 = extractConvWithBatchNormParams(s0, s1, 'conv0');\n const conv1 = extractConvWithBatchNormParams(s1, s2, 'conv1');\n const conv2 = extractConvWithBatchNormParams(s2, s3, 'conv2');\n const conv3 = extractConvWithBatchNormParams(s3, s4, 'conv3');\n const conv4 = extractConvWithBatchNormParams(s4, s5, 'conv4');\n const conv5 = extractConvWithBatchNormParams(s5, s6, 'conv5');\n const conv6 = extractConvWithBatchNormParams(s6, s7, 'conv6');\n const conv7 = extractConvWithBatchNormParams(s7, s8, 'conv7');\n const conv8 = extractConvParams(s8, 5 * boxEncodingSize, 1, 'conv8');\n params = {\n conv0, conv1, conv2, conv3, conv4, conv5, conv6, conv7, conv8,\n };\n }\n if (getRemainingWeights().length !== 0) {\n throw new Error(`weights remaing after extract: ${getRemainingWeights().length}`);\n }\n return { params, paramMappings };\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { ConvParams } from '../common/index';\nimport { disposeUnusedWeightTensors } from '../common/disposeUnusedWeightTensors';\nimport { loadSeparableConvParamsFactory } from '../common/extractSeparableConvParamsFactory';\nimport { extractWeightEntryFactory } from '../common/extractWeightEntryFactory';\nimport { ParamMapping } from '../common/types';\nimport { TinyYolov2Config } from './config';\nimport { BatchNorm, ConvWithBatchNorm, TinyYolov2NetParams } from './types';\n\nfunction extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {\n const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings);\n\n function extractBatchNormParams(prefix: string): BatchNorm {\n const sub = extractWeightEntry(`${prefix}/sub`, 1);\n const truediv = extractWeightEntry(`${prefix}/truediv`, 1);\n return { sub, truediv };\n }\n\n function extractConvParams(prefix: string): ConvParams {\n const filters = extractWeightEntry(`${prefix}/filters`, 4);\n const bias = extractWeightEntry(`${prefix}/bias`, 1);\n return { filters, bias };\n }\n\n function extractConvWithBatchNormParams(prefix: string): ConvWithBatchNorm {\n const conv = extractConvParams(`${prefix}/conv`);\n const bn = extractBatchNormParams(`${prefix}/bn`);\n return { conv, bn };\n }\n\n const extractSeparableConvParams = loadSeparableConvParamsFactory(extractWeightEntry);\n return {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n };\n}\n\nexport function extractParamsFromWeightMap(\n weightMap: tf.NamedTensorMap,\n config: TinyYolov2Config,\n): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n const paramMappings: ParamMapping[] = [];\n\n const {\n extractConvParams,\n extractConvWithBatchNormParams,\n extractSeparableConvParams,\n } = extractorsFactory(weightMap, paramMappings);\n\n let params: TinyYolov2NetParams;\n\n if (config.withSeparableConvs) {\n // eslint-disable-next-line no-mixed-operators\n const numFilters = (config.filterSizes && config.filterSizes.length || 9);\n params = {\n conv0: config.isFirstLayerConv2d ? extractConvParams('conv0') : extractSeparableConvParams('conv0'),\n conv1: extractSeparableConvParams('conv1'),\n conv2: extractSeparableConvParams('conv2'),\n conv3: extractSeparableConvParams('conv3'),\n conv4: extractSeparableConvParams('conv4'),\n conv5: extractSeparableConvParams('conv5'),\n conv6: numFilters > 7 ? extractSeparableConvParams('conv6') : undefined,\n conv7: numFilters > 8 ? extractSeparableConvParams('conv7') : undefined,\n conv8: extractConvParams('conv8'),\n };\n } else {\n params = {\n conv0: extractConvWithBatchNormParams('conv0'),\n conv1: extractConvWithBatchNormParams('conv1'),\n conv2: extractConvWithBatchNormParams('conv2'),\n conv3: extractConvWithBatchNormParams('conv3'),\n conv4: extractConvWithBatchNormParams('conv4'),\n conv5: extractConvWithBatchNormParams('conv5'),\n conv6: extractConvWithBatchNormParams('conv6'),\n conv7: extractConvWithBatchNormParams('conv7'),\n conv8: extractConvParams('conv8'),\n };\n }\n\n disposeUnusedWeightTensors(weightMap, paramMappings);\n return { params, paramMappings };\n}\n", "export interface ITinyYolov2Options {\n inputSize?: number\n scoreThreshold?: number\n}\n\nexport class TinyYolov2Options {\n protected _name: string = 'TinyYolov2Options'\n\n private _inputSize: number\n\n private _scoreThreshold: number\n\n constructor({ inputSize, scoreThreshold }: ITinyYolov2Options = {}) {\n this._inputSize = inputSize || 416;\n this._scoreThreshold = scoreThreshold || 0.5;\n\n if (typeof this._inputSize !== 'number' || this._inputSize % 32 !== 0) {\n throw new Error(`${this._name} - expected inputSize to be a number divisible by 32`);\n }\n\n if (typeof this._scoreThreshold !== 'number' || this._scoreThreshold <= 0 || this._scoreThreshold >= 1) {\n throw new Error(`${this._name} - expected scoreThreshold to be a number between 0 and 1`);\n }\n }\n\n get inputSize(): number { return this._inputSize; }\n\n get scoreThreshold(): number { return this._scoreThreshold; }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { BoundingBox } from '../classes/BoundingBox';\nimport { Dimensions } from '../classes/Dimensions';\nimport { ObjectDetection } from '../classes/ObjectDetection';\nimport { convLayer } from '../common/index';\nimport { ConvParams, SeparableConvParams } from '../common/types';\nimport { toNetInput } from '../dom/index';\nimport { NetInput } from '../dom/NetInput';\nimport { TNetInput } from '../dom/types';\nimport { NeuralNetwork } from '../NeuralNetwork';\nimport { sigmoid } from '../ops/index';\nimport { nonMaxSuppression } from '../ops/nonMaxSuppression';\nimport { normalize } from '../ops/normalize';\nimport { TinyYolov2Config, validateConfig } from './config';\nimport { convWithBatchNorm } from './convWithBatchNorm';\nimport { depthwiseSeparableConv } from './depthwiseSeparableConv';\nimport { extractParams } from './extractParams';\nimport { extractParamsFromWeightMap } from './extractParamsFromWeightMap';\nimport { leaky } from './leaky';\nimport { ITinyYolov2Options, TinyYolov2Options } from './TinyYolov2Options';\nimport { DefaultTinyYolov2NetParams, MobilenetParams, TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2Base extends NeuralNetwork {\n public static DEFAULT_FILTER_SIZES = [3, 16, 32, 64, 128, 256, 512, 1024, 1024];\n\n private _config: TinyYolov2Config\n\n constructor(config: TinyYolov2Config) {\n super('TinyYolov2');\n validateConfig(config);\n this._config = config;\n }\n\n public get config(): TinyYolov2Config {\n return this._config;\n }\n\n public get withClassScores(): boolean {\n return this.config.withClassScores || this.config.classes.length > 1;\n }\n\n public get boxEncodingSize(): number {\n return 5 + (this.withClassScores ? this.config.classes.length : 0);\n }\n\n public runTinyYolov2(x: tf.Tensor4D, params: DefaultTinyYolov2NetParams): tf.Tensor4D {\n let out = convWithBatchNorm(x, params.conv0);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv1);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv2);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv3);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv4);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = convWithBatchNorm(out, params.conv5);\n out = tf.maxPool(out, [2, 2], [1, 1], 'same');\n out = convWithBatchNorm(out, params.conv6);\n out = convWithBatchNorm(out, params.conv7);\n return convLayer(out, params.conv8, 'valid', false);\n }\n\n public runMobilenet(x: tf.Tensor4D, params: MobilenetParams): tf.Tensor4D {\n let out = this.config.isFirstLayerConv2d\n ? leaky(convLayer(x, params.conv0 as ConvParams, 'valid', false))\n : depthwiseSeparableConv(x, params.conv0 as SeparableConvParams);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv1);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv2);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv3);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv4);\n out = tf.maxPool(out, [2, 2], [2, 2], 'same');\n out = depthwiseSeparableConv(out, params.conv5);\n out = tf.maxPool(out, [2, 2], [1, 1], 'same');\n out = params.conv6 ? depthwiseSeparableConv(out, params.conv6) : out;\n out = params.conv7 ? depthwiseSeparableConv(out, params.conv7) : out;\n return convLayer(out, params.conv8, 'valid', false);\n }\n\n public forwardInput(input: NetInput, inputSize: number): tf.Tensor4D {\n const { params } = this;\n\n if (!params) {\n throw new Error('TinyYolov2 - load model before inference');\n }\n\n return tf.tidy(() => {\n let batchTensor = tf.cast(input.toBatchTensor(inputSize, false), 'float32');\n batchTensor = this.config.meanRgb\n ? normalize(batchTensor, this.config.meanRgb)\n : batchTensor;\n batchTensor = batchTensor.div(255) as tf.Tensor4D;\n return this.config.withSeparableConvs\n ? this.runMobilenet(batchTensor, params as MobilenetParams)\n : this.runTinyYolov2(batchTensor, params as DefaultTinyYolov2NetParams);\n });\n }\n\n public async forward(input: TNetInput, inputSize: number): Promise {\n return this.forwardInput(await toNetInput(input), inputSize);\n }\n\n public async detect(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise {\n const { inputSize, scoreThreshold } = new TinyYolov2Options(forwardParams);\n const netInput = await toNetInput(input);\n const out = await this.forwardInput(netInput, inputSize);\n const out0 = tf.tidy(() => tf.unstack(out)[0].expandDims()) as tf.Tensor4D;\n const inputDimensions = {\n width: netInput.getInputWidth(0),\n height: netInput.getInputHeight(0),\n };\n\n const results = await this.extractBoxes(out0, netInput.getReshapedInputDimensions(0), scoreThreshold);\n out.dispose();\n out0.dispose();\n\n const boxes = results.map((res) => res.box);\n const scores = results.map((res) => res.score);\n const classScores = results.map((res) => res.classScore);\n const classNames = results.map((res) => this.config.classes[res.label]);\n\n const indices = nonMaxSuppression(\n boxes.map((box) => box.rescale(inputSize)),\n scores,\n this.config.iouThreshold,\n true,\n );\n\n const detections = indices.map((idx) => new ObjectDetection(\n scores[idx],\n classScores[idx],\n classNames[idx],\n boxes[idx],\n inputDimensions,\n ));\n return detections;\n }\n\n protected getDefaultModelName(): string {\n return '';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap) {\n return extractParamsFromWeightMap(weightMap, this.config);\n }\n\n protected extractParams(weights: Float32Array) {\n const filterSizes = this.config.filterSizes || TinyYolov2Base.DEFAULT_FILTER_SIZES;\n\n const numFilters = filterSizes ? filterSizes.length : undefined;\n if (numFilters !== 7 && numFilters !== 8 && numFilters !== 9) {\n throw new Error(`TinyYolov2 - expected 7 | 8 | 9 convolutional filters, but found ${numFilters} filterSizes in config`);\n }\n return extractParams(weights, this.config, this.boxEncodingSize, filterSizes);\n }\n\n protected async extractBoxes(\n outputTensor: tf.Tensor4D,\n inputBlobDimensions: Dimensions,\n scoreThreshold?: number,\n ) {\n const { width, height } = inputBlobDimensions;\n const inputSize = Math.max(width, height);\n const correctionFactorX = inputSize / width;\n const correctionFactorY = inputSize / height;\n\n const numCells = outputTensor.shape[1];\n const numBoxes = this.config.anchors.length;\n\n const [boxesTensor, scoresTensor, classScoresTensor] = tf.tidy(() => {\n const reshaped = outputTensor.reshape([numCells, numCells, numBoxes, this.boxEncodingSize]);\n\n const boxes = reshaped.slice([0, 0, 0, 0], [numCells, numCells, numBoxes, 4]);\n const scores = reshaped.slice([0, 0, 0, 4], [numCells, numCells, numBoxes, 1]);\n const classScores = this.withClassScores\n ? tf.softmax(reshaped.slice([0, 0, 0, 5], [numCells, numCells, numBoxes, this.config.classes.length]), 3)\n : tf.scalar(0);\n return [boxes, scores, classScores];\n });\n\n const results = [] as any;\n const scoresData = await scoresTensor.array();\n const boxesData = await boxesTensor.array();\n for (let row = 0; row < numCells; row++) {\n for (let col = 0; col < numCells; col++) {\n for (let anchor = 0; anchor < numBoxes; anchor++) {\n const score = sigmoid(scoresData[row][col][anchor][0]);\n if (!scoreThreshold || score > scoreThreshold) {\n const ctX = ((col + sigmoid(boxesData[row][col][anchor][0])) / numCells) * correctionFactorX;\n const ctY = ((row + sigmoid(boxesData[row][col][anchor][1])) / numCells) * correctionFactorY;\n const widthLocal = ((Math.exp(boxesData[row][col][anchor][2]) * this.config.anchors[anchor].x) / numCells) * correctionFactorX;\n const heightLocal = ((Math.exp(boxesData[row][col][anchor][3]) * this.config.anchors[anchor].y) / numCells) * correctionFactorY;\n const x = (ctX - (widthLocal / 2));\n const y = (ctY - (heightLocal / 2));\n const pos = { row, col, anchor };\n const { classScore, label } = this.withClassScores\n ? await this.extractPredictedClass(classScoresTensor as tf.Tensor4D, pos)\n : { classScore: 1, label: 0 };\n results.push({\n box: new BoundingBox(x, y, x + widthLocal, y + heightLocal),\n score,\n classScore: score * classScore,\n label,\n ...pos,\n });\n }\n }\n }\n }\n\n boxesTensor.dispose();\n scoresTensor.dispose();\n classScoresTensor.dispose();\n return results;\n }\n\n private async extractPredictedClass(classesTensor: tf.Tensor4D, pos: { row: number, col: number, anchor: number }) {\n const { row, col, anchor } = pos;\n const classesData = await classesTensor.array();\n return Array(this.config.classes.length).fill(0)\n .map((_, i) => classesData[row][col][anchor][i])\n .map((classScore, label) => ({\n classScore,\n label,\n }))\n .reduce((max, curr) => (max.classScore > curr.classScore ? max : curr));\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\nimport { ParamMapping } from '../common/types';\nimport { TNetInput } from '../dom/types';\nimport {\n BOX_ANCHORS,\n BOX_ANCHORS_SEPARABLE,\n DEFAULT_MODEL_NAME,\n DEFAULT_MODEL_NAME_SEPARABLE_CONV,\n IOU_THRESHOLD,\n MEAN_RGB_SEPARABLE,\n} from './const';\nimport { TinyYolov2Base } from './TinyYolov2Base';\nimport { ITinyYolov2Options } from './TinyYolov2Options';\nimport { TinyYolov2NetParams } from './types';\n\nexport class TinyYolov2 extends TinyYolov2Base {\n constructor(withSeparableConvs: boolean = true) {\n const config = {\n withSeparableConvs,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\n ...(withSeparableConvs\n ? {\n anchors: BOX_ANCHORS_SEPARABLE,\n meanRgb: MEAN_RGB_SEPARABLE,\n }\n : {\n anchors: BOX_ANCHORS,\n withClassScores: true,\n }),\n };\n\n super(config);\n }\n\n public get withSeparableConvs(): boolean {\n return this.config.withSeparableConvs;\n }\n\n public get anchors(): Point[] {\n return this.config.anchors;\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams);\n return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }));\n }\n\n protected getDefaultModelName(): string {\n return this.withSeparableConvs ? DEFAULT_MODEL_NAME_SEPARABLE_CONV : DEFAULT_MODEL_NAME;\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeightMap(weightMap);\n }\n}\n", "import { TinyYolov2 } from './TinyYolov2';\n\nexport * from './TinyYolov2Options';\nexport * from './config';\nexport * from './types';\nexport { TinyYolov2 };\n\nexport function createTinyYolov2(weights: Float32Array, withSeparableConvs: boolean = true) {\n const net = new TinyYolov2(withSeparableConvs);\n net.extractWeights(weights);\n return net;\n}\n", "import { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\n\nexport interface ITinyFaceDetectorOptions extends ITinyYolov2Options {}\n\nexport class TinyFaceDetectorOptions extends TinyYolov2Options {\n protected _name: string = 'TinyFaceDetectorOptions'\n}\n", "export class ComposableTask {\n public async then(\n // eslint-disable-next-line no-unused-vars\n onfulfilled: (value: T) => T | PromiseLike,\n ): Promise {\n return onfulfilled(await this.run());\n }\n\n public async run(): Promise {\n throw new Error('ComposableTask - run is not implemented');\n }\n}\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { isWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\n\nexport async function extractAllFacesAndComputeResults, TResult>(\n parentResults: TSource[],\n input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n computeResults: (faces: Array) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment: (parentResult: WithFaceLandmarks) => FaceDetection = ({ alignedRect }) => alignedRect,\n) {\n const faceBoxes = parentResults.map((parentResult) => (isWithFaceLandmarks(parentResult)\n ? getRectForAlignment(parentResult)\n : parentResult.detection));\n\n const faces: Array = extractedFaces || (\n input instanceof tf.Tensor\n ? await extractFaceTensors(input, faceBoxes)\n : await extractFaces(input, faceBoxes)\n );\n\n const results = await computeResults(faces);\n\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n\n return results;\n}\n\nexport async function extractSingleFaceAndComputeResult, TResult>(\n parentResult: TSource,\n input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n computeResult: (face: HTMLCanvasElement | tf.Tensor3D) => Promise,\n extractedFaces?: Array | null,\n // eslint-disable-next-line no-unused-vars\n getRectForAlignment?: (parentResultLocal: WithFaceLandmarks) => FaceDetection,\n) {\n return extractAllFacesAndComputeResults(\n [parentResult],\n input,\n async (faces) => computeResult(faces[0]),\n extractedFaces,\n getRectForAlignment,\n );\n}\n", "import { Point } from '../classes/index';\n\nexport const IOU_THRESHOLD = 0.4;\n\nexport const BOX_ANCHORS = [\n new Point(1.603231, 2.094468),\n new Point(6.041143, 7.080126),\n new Point(2.882459, 3.518061),\n new Point(4.266906, 5.178857),\n new Point(9.041765, 10.66308),\n];\n\nexport const MEAN_RGB: [number, number, number] = [117.001, 114.697, 97.404];\n", "import * as tf from '../../dist/tfjs.esm';\n\nimport { FaceDetection, Point } from '../classes/index';\nimport { ParamMapping } from '../common/index';\nimport { TNetInput } from '../dom/index';\nimport { ITinyYolov2Options } from '../tinyYolov2/index';\nimport { TinyYolov2Base } from '../tinyYolov2/TinyYolov2Base';\nimport { TinyYolov2NetParams } from '../tinyYolov2/types';\nimport { BOX_ANCHORS, IOU_THRESHOLD, MEAN_RGB } from './const';\n\nexport class TinyFaceDetector extends TinyYolov2Base {\n constructor() {\n const config = {\n withSeparableConvs: true,\n iouThreshold: IOU_THRESHOLD,\n classes: ['face'],\n anchors: BOX_ANCHORS,\n meanRgb: MEAN_RGB,\n isFirstLayerConv2d: true,\n filterSizes: [3, 16, 32, 64, 128, 256, 512],\n };\n\n super(config);\n }\n\n public get anchors(): Point[] {\n return this.config.anchors;\n }\n\n public async locateFaces(input: TNetInput, forwardParams: ITinyYolov2Options): Promise {\n const objectDetections = await this.detect(input, forwardParams);\n return objectDetections.map((det) => new FaceDetection(det.score, det.relativeBox, { width: det.imageWidth, height: det.imageHeight }));\n }\n\n protected getDefaultModelName(): string {\n return 'tiny_face_detector_model';\n }\n\n protected extractParamsFromWeightMap(weightMap: tf.NamedTensorMap): { params: TinyYolov2NetParams, paramMappings: ParamMapping[] } {\n return super.extractParamsFromWeightMap(weightMap);\n }\n}\n", "import { AgeGenderNet } from '../ageGenderNet/AgeGenderNet';\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { TNetInput } from '../dom/index';\nimport { FaceExpressionNet } from '../faceExpressionNet/FaceExpressionNet';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { FaceRecognitionNet } from '../faceRecognitionNet/FaceRecognitionNet';\nimport { SsdMobilenetv1 } from '../ssdMobilenetv1/SsdMobilenetv1';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetector } from '../tinyFaceDetector/TinyFaceDetector';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { ITinyYolov2Options, TinyYolov2 } from '../tinyYolov2/index';\n\nexport const nets = {\n ssdMobilenetv1: new SsdMobilenetv1(),\n tinyFaceDetector: new TinyFaceDetector(),\n tinyYolov2: new TinyYolov2(),\n faceLandmark68Net: new FaceLandmark68Net(),\n faceLandmark68TinyNet: new FaceLandmark68TinyNet(),\n faceRecognitionNet: new FaceRecognitionNet(),\n faceExpressionNet: new FaceExpressionNet(),\n ageGenderNet: new AgeGenderNet(),\n};\n\n/**\n * Attempts to detect all faces in an image using SSD Mobilenetv1 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see SsdMobilenetv1Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const ssdMobilenetv1 = (input: TNetInput, options: SsdMobilenetv1Options): Promise => nets.ssdMobilenetv1.locateFaces(input, options);\n\n/**\n * Attempts to detect all faces in an image using the Tiny Face Detector.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyFaceDetectorOptions constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyFaceDetector = (input: TNetInput, options: TinyFaceDetectorOptions): Promise => nets.tinyFaceDetector.locateFaces(input, options);\n\n/**\n * Attempts to detect all faces in an image using the Tiny Yolov2 Network.\n *\n * @param input The input image.\n * @param options (optional, default: see TinyYolov2Options constructor for default parameters).\n * @returns Bounding box of each face with score.\n */\nexport const tinyYolov2 = (input: TNetInput, options: ITinyYolov2Options): Promise => nets.tinyYolov2.locateFaces(input, options);\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarks = (input: TNetInput): Promise => nets.faceLandmark68Net.detectLandmarks(input);\n\n/**\n * Detects the 68 point face landmark positions of the face shown in an image\n * using a tinier version of the 68 point face landmark model, which is slightly\n * faster at inference, but also slightly less accurate.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns 68 point face landmarks or array thereof in case of batch input.\n */\nexport const detectFaceLandmarksTiny = (input: TNetInput): Promise => nets.faceLandmark68TinyNet.detectLandmarks(input);\n\n/**\n * Computes a 128 entry vector (face descriptor / face embeddings) from the face shown in an image,\n * which uniquely represents the features of that persons face. The computed face descriptor can\n * be used to measure the similarity between faces, by computing the euclidean distance of two\n * face descriptors.\n *\n * @param inputs The face image extracted from the aligned bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Face descriptor with 128 entries or array thereof in case of batch input.\n */\nexport const computeFaceDescriptor = (input: TNetInput): Promise => nets.faceRecognitionNet.computeFaceDescriptor(input);\n\n/**\n * Recognizes the facial expressions from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Facial expressions with corresponding probabilities or array thereof in case of batch input.\n */\nexport const recognizeFaceExpressions = (input: TNetInput): Promise => nets.faceExpressionNet.predictExpressions(input);\n\n/**\n * Predicts age and gender from a face image.\n *\n * @param inputs The face image extracted from the bounding box of a face. Can\n * also be an array of input images, which will be batch processed.\n * @returns Predictions with age, gender and gender probability or array thereof in case of batch input.\n */\nexport const predictAgeAndGender = (input: TNetInput): Promise => nets.ageGenderNet.predictAgeAndGender(input);\n\nexport const loadSsdMobilenetv1Model = (url: string) => nets.ssdMobilenetv1.load(url);\nexport const loadTinyFaceDetectorModel = (url: string) => nets.tinyFaceDetector.load(url);\nexport const loadTinyYolov2Model = (url: string) => nets.tinyYolov2.load(url);\nexport const loadFaceLandmarkModel = (url: string) => nets.faceLandmark68Net.load(url);\nexport const loadFaceLandmarkTinyModel = (url: string) => nets.faceLandmark68TinyNet.load(url);\nexport const loadFaceRecognitionModel = (url: string) => nets.faceRecognitionNet.load(url);\nexport const loadFaceExpressionModel = (url: string) => nets.faceExpressionNet.load(url);\nexport const loadAgeGenderModel = (url: string) => nets.ageGenderNet.load(url);\n\n// backward compatibility\nexport const loadFaceDetectionModel = loadSsdMobilenetv1Model;\nexport const locateFaces = ssdMobilenetv1;\nexport const detectLandmarks = detectFaceLandmarks;\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { TNetInput } from '../dom/index';\nimport { FaceExpressions } from '../faceExpressionNet/FaceExpressions';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceExpressions, WithFaceExpressions } from '../factories/WithFaceExpressions';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderTask, PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\n\nexport class PredictFaceExpressionsTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllFaceExpressionsTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictFaceExpressionsTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n\n const faceExpressionsByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => Promise.all(faces.map(\n (face) => nets.faceExpressionNet.predictExpressions(face) as Promise,\n )),\n this.extractedFaces,\n );\n\n return parentResults.map(\n (parentResult, i) => extendWithFaceExpressions(parentResult, faceExpressionsByFace[i]),\n );\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(this, this.input);\n }\n}\n\nexport class PredictSingleFaceExpressionsTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictFaceExpressionsTaskBase | undefined, TSource | undefined> {\n public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n\n const faceExpressions = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.faceExpressionNet.predictExpressions(face) as Promise,\n this.extractedFaces,\n );\n\n return extendWithFaceExpressions(parentResult, faceExpressions);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(this, this.input);\n }\n}\n\nexport class PredictAllFaceExpressionsWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictAllFaceExpressionsTask {\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class PredictSingleFaceExpressionsWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictSingleFaceExpressionsTask {\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { AgeAndGenderPrediction } from '../ageGenderNet/types';\nimport { TNetInput } from '../dom/index';\nimport { extendWithAge, WithAge } from '../factories/WithAge';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { extendWithGender, WithGender } from '../factories/WithGender';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllFaceExpressionsTask, PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class PredictAgeAndGenderTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected extractedFaces?: Array,\n ) {\n super();\n }\n}\n\nexport class PredictAllAgeAndGenderTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictAgeAndGenderTaskBase>[], TSource[]> {\n public async run(): Promise>[]> {\n const parentResults = await this.parentTask;\n\n const ageAndGenderByFace = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n async (faces) => Promise.all(faces.map(\n (face) => nets.ageGenderNet.predictAgeAndGender(face) as Promise,\n )),\n this.extractedFaces,\n );\n\n return parentResults.map((parentResult, i) => {\n const { age, gender, genderProbability } = ageAndGenderByFace[i];\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age);\n });\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask(this, this.input);\n }\n}\n\nexport class PredictSingleAgeAndGenderTask<\n TSource extends WithFaceDetection<{}>\n> extends PredictAgeAndGenderTaskBase> | undefined, TSource | undefined> {\n public async run(): Promise> | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n\n const { age, gender, genderProbability } = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.ageGenderNet.predictAgeAndGender(face) as Promise,\n this.extractedFaces,\n );\n\n return extendWithAge(extendWithGender(parentResult, gender, genderProbability), age);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(this, this.input);\n }\n}\n\nexport class PredictAllAgeAndGenderWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictAllAgeAndGenderTask {\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class PredictSingleAgeAndGenderWithFaceAlignmentTask<\n TSource extends WithFaceLandmarks>\n> extends PredictSingleAgeAndGenderTask {\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { TNetInput } from '../dom/index';\nimport { extendWithFaceDescriptor, WithFaceDescriptor } from '../factories/WithFaceDescriptor';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { extractAllFacesAndComputeResults, extractSingleFaceAndComputeResult } from './extractFacesAndComputeResults';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class ComputeFaceDescriptorsTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n ) {\n super();\n }\n}\n\nexport class ComputeAllFaceDescriptorsTask<\n TSource extends WithFaceLandmarks>\n> extends ComputeFaceDescriptorsTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n\n const descriptors = await extractAllFacesAndComputeResults(\n parentResults,\n this.input,\n (faces) => Promise.all(faces.map((face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise)),\n null,\n (parentResult) => parentResult.landmarks.align(null, { useDlibAlignment: true }),\n );\n\n return descriptors.map((descriptor, i) => extendWithFaceDescriptor(parentResults[i], descriptor));\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n}\n\nexport class ComputeSingleFaceDescriptorTask<\n TSource extends WithFaceLandmarks>\n> extends ComputeFaceDescriptorsTaskBase | undefined, TSource | undefined> {\n public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n const descriptor = await extractSingleFaceAndComputeResult(\n parentResult,\n this.input,\n (face) => nets.faceRecognitionNet.computeFaceDescriptor(face) as Promise,\n null,\n // eslint-disable-next-line no-shadow\n (parentResult) => parentResult.landmarks.align(null, { useDlibAlignment: true }),\n );\n\n return extendWithFaceDescriptor(parentResult, descriptor);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport * as tf from '../../dist/tfjs.esm';\n\nimport { FaceLandmarks68 } from '../classes/FaceLandmarks68';\nimport { extractFaces, extractFaceTensors, TNetInput } from '../dom/index';\nimport { FaceLandmark68Net } from '../faceLandmarkNet/FaceLandmark68Net';\nimport { FaceLandmark68TinyNet } from '../faceLandmarkNet/FaceLandmark68TinyNet';\nimport { WithFaceDetection } from '../factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, WithFaceLandmarks } from '../factories/WithFaceLandmarks';\nimport { ComposableTask } from './ComposableTask';\nimport { ComputeAllFaceDescriptorsTask, ComputeSingleFaceDescriptorTask } from './ComputeFaceDescriptorsTasks';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderWithFaceAlignmentTask, PredictSingleAgeAndGenderWithFaceAlignmentTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsWithFaceAlignmentTask, PredictSingleFaceExpressionsWithFaceAlignmentTask } from './PredictFaceExpressionsTask';\n\nexport class DetectFaceLandmarksTaskBase extends ComposableTask {\n constructor(\n // eslint-disable-next-line no-unused-vars\n protected parentTask: ComposableTask | Promise,\n // eslint-disable-next-line no-unused-vars\n protected input: TNetInput,\n // eslint-disable-next-line no-unused-vars\n protected useTinyLandmarkNet: boolean,\n ) {\n super();\n }\n\n protected get landmarkNet(): FaceLandmark68Net | FaceLandmark68TinyNet {\n return this.useTinyLandmarkNet\n ? nets.faceLandmark68TinyNet\n : nets.faceLandmark68Net;\n }\n}\n\nexport class DetectAllFaceLandmarksTask<\n TSource extends WithFaceDetection<{}>\n> extends DetectFaceLandmarksTaskBase[], TSource[]> {\n public async run(): Promise[]> {\n const parentResults = await this.parentTask;\n const detections = parentResults.map((res) => res.detection);\n\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, detections)\n : await extractFaces(this.input, detections);\n\n const faceLandmarksByFace = await Promise.all(faces.map(\n (face) => this.landmarkNet.detectLandmarks(face),\n )) as FaceLandmarks68[];\n\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n\n return parentResults.map((parentResult, i) => extendWithFaceLandmarks(parentResult, faceLandmarksByFace[i]));\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptors() {\n return new ComputeAllFaceDescriptorsTask(this, this.input);\n }\n}\n\nexport class DetectSingleFaceLandmarksTask> extends DetectFaceLandmarksTaskBase | undefined, TSource | undefined> {\n public async run(): Promise | undefined> {\n const parentResult = await this.parentTask;\n if (!parentResult) {\n return undefined;\n }\n\n const { detection } = parentResult;\n const faces: Array = this.input instanceof tf.Tensor\n ? await extractFaceTensors(this.input, [detection])\n : await extractFaces(this.input, [detection]);\n\n const landmarks = await this.landmarkNet.detectLandmarks(faces[0]) as FaceLandmarks68;\n\n faces.forEach((f) => f instanceof tf.Tensor && f.dispose());\n\n return extendWithFaceLandmarks(parentResult, landmarks);\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsWithFaceAlignmentTask(this, this.input);\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderWithFaceAlignmentTask(this, this.input);\n }\n\n withFaceDescriptor() {\n return new ComputeSingleFaceDescriptorTask(this, this.input);\n }\n}\n", "/* eslint-disable max-classes-per-file */\nimport { FaceDetection } from '../classes/FaceDetection';\nimport { TNetInput } from '../dom/index';\nimport { extendWithFaceDetection, WithFaceDetection } from '../factories/WithFaceDetection';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { TinyFaceDetectorOptions } from '../tinyFaceDetector/TinyFaceDetectorOptions';\nimport { TinyYolov2Options } from '../tinyYolov2/index';\nimport { ComposableTask } from './ComposableTask';\nimport { DetectAllFaceLandmarksTask, DetectSingleFaceLandmarksTask } from './DetectFaceLandmarksTasks';\nimport { nets } from './nets';\nimport { PredictAllAgeAndGenderTask, PredictSingleAgeAndGenderTask } from './PredictAgeAndGenderTask';\nimport { PredictAllFaceExpressionsTask, PredictSingleFaceExpressionsTask } from './PredictFaceExpressionsTask';\nimport { FaceDetectionOptions } from './types';\n\nexport class DetectFacesTaskBase extends ComposableTask {\n // eslint-disable-next-line no-unused-vars\n constructor(protected input: TNetInput, protected options: FaceDetectionOptions = new SsdMobilenetv1Options()) {\n super();\n }\n}\n\nexport class DetectAllFacesTask extends DetectFacesTaskBase {\n public async run(): Promise {\n const { input, options } = this;\n let result;\n if (options instanceof TinyFaceDetectorOptions) result = nets.tinyFaceDetector.locateFaces(input, options);\n else if (options instanceof SsdMobilenetv1Options) result = nets.ssdMobilenetv1.locateFaces(input, options);\n else if (options instanceof TinyYolov2Options) result = nets.tinyYolov2.locateFaces(input, options);\n else throw new Error('detectFaces - expected options to be instance of TinyFaceDetectorOptions | SsdMobilenetv1Options | TinyYolov2Options');\n\n return result;\n }\n\n private runAndExtendWithFaceDetections(): Promise[]> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise[]>(async (resolve) => {\n const detections = await this.run();\n resolve(detections.map((detection) => extendWithFaceDetection({}, detection)));\n });\n }\n\n withFaceLandmarks(useTinyLandmarkNet: boolean = false) {\n return new DetectAllFaceLandmarksTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n useTinyLandmarkNet,\n );\n }\n\n withFaceExpressions() {\n return new PredictAllFaceExpressionsTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n );\n }\n\n withAgeAndGender() {\n return new PredictAllAgeAndGenderTask(\n this.runAndExtendWithFaceDetections(),\n this.input,\n );\n }\n}\n\nexport class DetectSingleFaceTask extends DetectFacesTaskBase {\n public async run(): Promise {\n const faceDetections = await new DetectAllFacesTask(this.input, this.options);\n let faceDetectionWithHighestScore = faceDetections[0];\n faceDetections.forEach((faceDetection) => {\n if (faceDetection.score > faceDetectionWithHighestScore.score) faceDetectionWithHighestScore = faceDetection;\n });\n return faceDetectionWithHighestScore;\n }\n\n private runAndExtendWithFaceDetection(): Promise | undefined> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise | undefined>(async (resolve) => {\n const detection = await this.run();\n resolve(detection ? extendWithFaceDetection<{}>({}, detection) : undefined);\n });\n }\n\n withFaceLandmarks(useTinyLandmarkNet: boolean = false) {\n return new DetectSingleFaceLandmarksTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n useTinyLandmarkNet,\n );\n }\n\n withFaceExpressions() {\n return new PredictSingleFaceExpressionsTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n );\n }\n\n withAgeAndGender() {\n return new PredictSingleAgeAndGenderTask(\n this.runAndExtendWithFaceDetection(),\n this.input,\n );\n }\n}\n", "import { TNetInput } from '../dom/index';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/SsdMobilenetv1Options';\nimport { DetectAllFacesTask, DetectSingleFaceTask } from './DetectFacesTasks';\nimport { FaceDetectionOptions } from './types';\n\nexport function detectSingleFace(input: TNetInput, options: FaceDetectionOptions = new SsdMobilenetv1Options()): DetectSingleFaceTask {\n return new DetectSingleFaceTask(input, options);\n}\n\nexport function detectAllFaces(input: TNetInput, options: FaceDetectionOptions = new SsdMobilenetv1Options()): DetectAllFacesTask {\n return new DetectAllFacesTask(input, options);\n}\n", "import { TNetInput } from '../dom/index';\nimport { WithFaceDescriptor, WithFaceDetection, WithFaceLandmarks } from '../factories/index';\nimport { SsdMobilenetv1Options } from '../ssdMobilenetv1/index';\nimport { ITinyYolov2Options, TinyYolov2Options } from '../tinyYolov2/index';\nimport { detectAllFaces } from './detectFaces';\n\nexport async function allFacesSsdMobilenetv1(input: TNetInput, minConfidence?: number): Promise>>[]> {\n return detectAllFaces(input, new SsdMobilenetv1Options(minConfidence ? { minConfidence } : {}))\n .withFaceLandmarks()\n .withFaceDescriptors();\n}\n\nexport async function allFacesTinyYolov2(input: TNetInput, forwardParams: ITinyYolov2Options = {}): Promise>>[]> {\n return detectAllFaces(input, new TinyYolov2Options(forwardParams))\n .withFaceLandmarks()\n .withFaceDescriptors();\n}\n\nexport const allFaces = allFacesSsdMobilenetv1;\n", "export function euclideanDistance(arr1: number[] | Float32Array, arr2: number[] | Float32Array) {\n if (arr1.length !== arr2.length) throw new Error('euclideanDistance: arr1.length !== arr2.length');\n\n const desc1 = Array.from(arr1);\n const desc2 = Array.from(arr2);\n\n return Math.sqrt(\n desc1\n .map((val, i) => val - desc2[i])\n .reduce((res, diff) => res + (diff ** 2), 0),\n );\n}\n", "import { FaceMatch } from '../classes/FaceMatch';\nimport { LabeledFaceDescriptors } from '../classes/LabeledFaceDescriptors';\nimport { euclideanDistance } from '../euclideanDistance';\nimport { WithFaceDescriptor } from '../factories/index';\n\nexport class FaceMatcher {\n private _labeledDescriptors: LabeledFaceDescriptors[]\n\n private _distanceThreshold: number\n\n constructor(\n inputs: LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>,\n distanceThreshold: number = 0.6,\n ) {\n this._distanceThreshold = distanceThreshold;\n\n const inputArray = Array.isArray(inputs) ? inputs : [inputs];\n\n if (!inputArray.length) {\n throw new Error('FaceRecognizer.constructor - expected atleast one input');\n }\n\n let count = 1;\n const createUniqueLabel = () => `person ${count++}`;\n\n this._labeledDescriptors = inputArray.map((desc) => {\n if (desc instanceof LabeledFaceDescriptors) {\n return desc;\n }\n\n if (desc instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc]);\n }\n\n if (desc.descriptor && desc.descriptor instanceof Float32Array) {\n return new LabeledFaceDescriptors(createUniqueLabel(), [desc.descriptor]);\n }\n\n throw new Error('FaceRecognizer.constructor - expected inputs to be of type LabeledFaceDescriptors | WithFaceDescriptor | Float32Array | Array | Float32Array>');\n });\n }\n\n public get labeledDescriptors(): LabeledFaceDescriptors[] { return this._labeledDescriptors; }\n\n public get distanceThreshold(): number { return this._distanceThreshold; }\n\n public computeMeanDistance(queryDescriptor: Float32Array, descriptors: Float32Array[]): number {\n return descriptors\n .map((d) => euclideanDistance(d, queryDescriptor))\n .reduce((d1, d2) => d1 + d2, 0)\n / (descriptors.length || 1);\n }\n\n public matchDescriptor(queryDescriptor: Float32Array): FaceMatch {\n return this.labeledDescriptors\n .map(({ descriptors, label }) => new FaceMatch(\n label,\n this.computeMeanDistance(queryDescriptor, descriptors),\n ))\n .reduce((best, curr) => (best.distance < curr.distance ? best : curr));\n }\n\n public findBestMatch(queryDescriptor: Float32Array): FaceMatch {\n const bestMatch = this.matchDescriptor(queryDescriptor);\n return bestMatch.distance < this.distanceThreshold\n ? bestMatch\n : new FaceMatch('unknown', bestMatch.distance);\n }\n\n public toJSON(): any {\n return {\n distanceThreshold: this.distanceThreshold,\n labeledDescriptors: this.labeledDescriptors.map((ld) => ld.toJSON()),\n };\n }\n\n public static fromJSON(json: any): FaceMatcher {\n const labeledDescriptors = json.labeledDescriptors\n .map((ld: any) => LabeledFaceDescriptors.fromJSON(ld));\n return new FaceMatcher(labeledDescriptors, json.distanceThreshold);\n }\n}\n", "import { TinyFaceDetector } from './TinyFaceDetector';\n\nexport * from './TinyFaceDetector';\nexport * from './TinyFaceDetectorOptions';\n\nexport function createTinyFaceDetector(weights: Float32Array) {\n const net = new TinyFaceDetector();\n net.extractWeights(weights);\n return net;\n}\n", "import { Dimensions, IDimensions } from './classes/index';\nimport { FaceDetection } from './classes/FaceDetection';\nimport { FaceLandmarks } from './classes/FaceLandmarks';\nimport { extendWithFaceDetection, isWithFaceDetection } from './factories/WithFaceDetection';\nimport { extendWithFaceLandmarks, isWithFaceLandmarks } from './factories/WithFaceLandmarks';\n\nexport function resizeResults(results: T, dimensions: IDimensions): T {\n const { width, height } = new Dimensions(dimensions.width, dimensions.height);\n\n if (width <= 0 || height <= 0) {\n throw new Error(`resizeResults - invalid dimensions: ${JSON.stringify({ width, height })}`);\n }\n\n if (Array.isArray(results)) {\n // return results.map(obj => resizeResults(obj, { width, height })) as any as T\n return (results as Array).map((obj) => resizeResults(obj, { width, height } as IDimensions)) as any as T;\n }\n\n if (isWithFaceLandmarks(results)) {\n const resizedDetection = results.detection.forSize(width, height);\n const resizedLandmarks = results.unshiftedLandmarks.forSize(resizedDetection.box.width, resizedDetection.box.height);\n return extendWithFaceLandmarks(extendWithFaceDetection(results, resizedDetection), resizedLandmarks);\n }\n\n if (isWithFaceDetection(results)) {\n return extendWithFaceDetection(results, results.detection.forSize(width, height));\n }\n\n if (results instanceof FaceLandmarks || results instanceof FaceDetection) {\n return (results as any).forSize(width, height);\n }\n\n return results;\n}\n", "import * as tf from '../dist/tfjs.esm';\nimport * as draw from './draw/index';\nimport * as utils from './utils/index';\nimport * as pkg from '../package.json';\n\nexport { tf, draw, utils };\n\nexport * from './ageGenderNet/index';\nexport * from './classes/index';\nexport * from './dom/index';\nexport * from './env/index';\nexport * from './faceExpressionNet/index';\nexport * from './faceLandmarkNet/index';\nexport * from './faceRecognitionNet/index';\nexport * from './factories/index';\nexport * from './globalApi/index';\nexport * from './ops/index';\nexport * from './ssdMobilenetv1/index';\nexport * from './tinyFaceDetector/index';\nexport * from './tinyYolov2/index';\nexport * from './euclideanDistance';\nexport * from './NeuralNetwork';\nexport * from './resizeResults';\n\nconst node = (typeof process !== 'undefined');\nconst browser = (typeof navigator !== 'undefined') && (typeof navigator.userAgent !== 'undefined');\nexport const version = { faceapi: pkg.version as string, node, browser };\n"], + "mappings": ";;;;;;;kYAKA,SACA,SADA,kDACA,iDCNA,mRCEO,WACL,EACA,EACA,EAAoB,GACpB,CASA,GARA,EAAI,YAEJ,EAAO,MAAM,GAAG,QAAQ,CAAC,CAAE,IAAG,KAAK,IAAY,CAC7C,GAAM,GAAO,EAAO,GACpB,EAAI,OAAO,EAAK,EAAG,EAAK,GACxB,EAAI,OAAO,EAAG,KAGZ,EAAU,CACZ,GAAM,GAAO,EAAO,EAAO,OAAS,GAC9B,EAAK,EAAO,GAClB,GAAI,CAAC,GAAQ,CAAC,EACZ,OAGF,EAAI,OAAO,EAAK,EAAG,EAAK,GACxB,EAAI,OAAO,EAAG,EAAG,EAAG,GAGtB,EAAI,SC1BN,wRCOO,WAAwC,CAK7C,YAAY,EAAe,EAAgB,CACzC,GAAI,CAAC,EAAc,IAAU,CAAC,EAAc,GAC1C,KAAM,IAAI,OAAM,wFAAwF,KAAK,UAAU,CAAE,QAAO,cAGlI,KAAK,OAAS,EACd,KAAK,QAAU,KAGN,QAAgB,CAAE,MAAO,MAAK,UAE9B,SAAiB,CAAE,MAAO,MAAK,QAEnC,SAAsB,CAC3B,MAAO,IAAI,GAAW,EAAI,KAAK,MAAO,EAAI,KAAK,UDrB5C,YAAkB,EAAa,EAAa,CACjD,MAAO,aAAqB,WAAU,EAAO,MAAM,SAAW,EAGzD,YAAoB,EAAoC,CAC7D,MAAO,IAAS,EAAQ,GAGnB,YAAoB,EAAoC,CAC7D,MAAO,IAAS,EAAQ,GAGnB,WAAoB,EAAoC,CAC7D,MAAO,IAAS,EAAQ,GAGnB,WAAoB,EAAoC,CAC7D,MAAO,IAAS,EAAQ,GAGnB,YAAiB,EAAa,CACnC,MAAO,GAAM,GAAM,EAGd,YAAgB,EAAa,CAClC,MAAO,GAAM,GAAM,EAGd,YAAe,EAAa,EAAe,EAAG,CACnD,GAAM,GAAI,IAAM,EAChB,MAAO,MAAK,MAAM,EAAM,GAAK,EAGxB,YAAsB,EAAmB,CAC9C,MAAO,IAAO,EAAI,OAAS,EAAI,OAG1B,YAAmC,CAAE,QAAO,UAAuB,EAAmB,CAC3F,GAAM,GAAQ,EAAY,KAAK,IAAI,EAAQ,GAC3C,MAAO,IAAI,GAAW,KAAK,MAAM,EAAQ,GAAQ,KAAK,MAAM,EAAS,IAGhE,YAAwB,EAAqB,CAClD,MAAO,GAAI,OAAO,CAAC,EAAK,IAAO,EAAI,IAAI,GAAK,GAAI,GAAM,EAAG,IACtD,IAAI,GAAI,GAAM,EAAI,OAAQ,EAAI,SAG5B,WAAe,EAAa,EAAe,EAAwB,CACxE,MAAO,OAAM,GAAK,KAAK,GAAG,IAAI,CAAC,EAAG,IAAM,EAAS,EAAI,GAGhD,WAAuB,EAAU,CACtC,MAAO,CAAC,CAAC,GAAQ,IAAQ,UAAc,IAAQ,WAAc,CAAC,OAAO,MAAM,IAAQ,IAAQ,EAGtF,YAA4B,EAAU,CAC3C,MAAO,GAAc,IAAQ,GAAO,GAAK,GAAO,EExD3C,WAA8B,CAKnC,YAAY,EAAW,EAAW,CAChC,KAAK,GAAK,EACV,KAAK,GAAK,KAGR,IAAY,CAAE,MAAO,MAAK,MAE1B,IAAY,CAAE,MAAO,MAAK,GAEvB,IAAI,EAAmB,CAC5B,MAAO,IAAI,GAAM,KAAK,EAAI,EAAG,EAAG,KAAK,EAAI,EAAG,GAGvC,IAAI,EAAmB,CAC5B,MAAO,IAAI,GAAM,KAAK,EAAI,EAAG,EAAG,KAAK,EAAI,EAAG,GAGvC,IAAI,EAAmB,CAC5B,MAAO,IAAI,GAAM,KAAK,EAAI,EAAG,EAAG,KAAK,EAAI,EAAG,GAGvC,IAAI,EAAmB,CAC5B,MAAO,IAAI,GAAM,KAAK,EAAI,EAAG,EAAG,KAAK,EAAI,EAAG,GAGvC,KAAa,CAClB,MAAO,IAAI,GAAM,KAAK,IAAI,KAAK,GAAI,KAAK,IAAI,KAAK,IAG5C,WAAoB,CACzB,MAAO,MAAK,KAAM,KAAK,GAAK,EAAM,KAAK,GAAK,GAGvC,OAAe,CACpB,MAAO,IAAI,GAAM,KAAK,MAAM,KAAK,GAAI,KAAK,MAAM,KAAK,MCtClD,WAAwD,OAC/C,QAAO,EAAoB,CACvC,MAAO,CAAC,CAAC,GAAQ,CAAC,EAAK,EAAG,EAAK,EAAG,EAAK,MAAO,EAAK,QAAQ,MAAM,SAGrD,kBAAiB,EAAU,EAAgB,EAAmC,GAAO,CACjG,GAAI,CAAC,EAAI,OAAO,GACd,KAAM,IAAI,OAAM,GAAG,oBAAyB,KAAK,UAAU,2DAG7D,GAAI,CAAC,GAA4B,GAAI,MAAQ,GAAK,EAAI,OAAS,GAC7D,KAAM,IAAI,OAAM,GAAG,cAAmB,EAAI,sBAAsB,EAAI,oCAYxE,YAAY,EAA4B,EAAmC,GAAM,CAC/E,GAAM,GAAO,GAAQ,GAEf,EAAS,CAAC,EAAI,KAAM,EAAI,IAAK,EAAI,MAAO,EAAI,QAAQ,MAAM,GAC1D,EAAS,CAAC,EAAI,EAAG,EAAI,EAAG,EAAI,MAAO,EAAI,QAAQ,MAAM,GAE3D,GAAI,CAAC,GAAU,CAAC,EACd,KAAM,IAAI,OAAM,2EAA2E,KAAK,UAAU,MAG5G,GAAM,CAAC,EAAG,EAAG,EAAO,GAAU,EAC1B,CAAC,EAAI,EAAG,EAAI,EAAG,EAAI,MAAO,EAAI,QAC9B,CAAC,EAAI,KAAM,EAAI,IAAK,EAAI,MAAQ,EAAI,KAAM,EAAI,OAAS,EAAI,KAE/D,EAAI,iBAAiB,CACnB,IAAG,IAAG,QAAO,UACZ,kBAAmB,GAEtB,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,OAAS,EACd,KAAK,QAAU,KAGN,IAAY,CAAE,MAAO,MAAK,MAE1B,IAAY,CAAE,MAAO,MAAK,MAE1B,QAAgB,CAAE,MAAO,MAAK,UAE9B,SAAiB,CAAE,MAAO,MAAK,WAE/B,OAAe,CAAE,MAAO,MAAK,KAE7B,MAAc,CAAE,MAAO,MAAK,KAE5B,QAAgB,CAAE,MAAO,MAAK,EAAI,KAAK,SAEvC,SAAiB,CAAE,MAAO,MAAK,EAAI,KAAK,UAExC,OAAe,CAAE,MAAO,MAAK,MAAQ,KAAK,UAE1C,UAAiB,CAAE,MAAO,IAAI,GAAM,KAAK,KAAM,KAAK,QAEpD,WAAkB,CAAE,MAAO,IAAI,GAAM,KAAK,MAAO,KAAK,QAEtD,aAAoB,CAAE,MAAO,IAAI,GAAM,KAAK,KAAM,KAAK,WAEvD,cAAqB,CAAE,MAAO,IAAI,GAAM,KAAK,MAAO,KAAK,QAE7D,OAAsB,CAC3B,GAAM,CAAC,EAAG,EAAG,EAAO,GAAU,CAAC,KAAK,EAAG,KAAK,EAAG,KAAK,MAAO,KAAK,QAC7D,IAAI,AAAC,GAAQ,KAAK,MAAM,IAC3B,MAAO,IAAI,GAAI,CACb,IAAG,IAAG,QAAO,WAIV,OAAsB,CAC3B,GAAM,CAAC,EAAG,EAAG,EAAO,GAAU,CAAC,KAAK,EAAG,KAAK,EAAG,KAAK,MAAO,KAAK,QAC7D,IAAI,AAAC,GAAQ,KAAK,MAAM,IAC3B,MAAO,IAAI,GAAI,CACb,IAAG,IAAG,QAAO,WAIV,UAAyB,CAC9B,GAAI,CACF,IAAG,IAAG,QAAO,UACX,KACE,EAAO,KAAK,IAAI,EAAQ,GAC9B,MAAI,GAAQ,GACV,IAAM,EAAO,EACb,GAAS,GAEP,EAAS,GACX,IAAM,EAAO,EACb,GAAU,GAGL,GAAI,GAAI,CAAE,IAAG,IAAG,QAAO,WAGzB,QAAQ,EAAuC,CACpD,GAAM,GAAS,GAAa,GAAM,EAAkB,MAAQ,EACtD,EAAS,GAAa,GAAM,EAAkB,OAAS,EAC7D,MAAO,IAAI,GAAI,CACb,EAAG,KAAK,EAAI,EACZ,EAAG,KAAK,EAAI,EACZ,MAAO,KAAK,MAAQ,EACpB,OAAQ,KAAK,OAAS,IAInB,IAAI,EAAc,EAA4B,CACnD,GAAM,CAAC,EAAG,EAAG,EAAO,GAAU,CAC5B,KAAK,EAAK,EAAO,EACjB,KAAK,EAAK,EAAO,EACjB,KAAK,MAAQ,EACb,KAAK,OAAS,GAEhB,MAAO,IAAI,GAAI,CACb,IAAG,IAAG,QAAO,WAIV,mBAAmB,EAAkB,EAAiC,CAC3E,GAAM,CAAE,IAAG,IAAG,QAAO,UAAW,KAC1B,EAAW,KAAK,IAAI,EAAG,GACvB,EAAW,KAAK,IAAI,EAAG,GAEvB,EAAW,EAAQ,EACnB,EAAY,EAAS,EACrB,EAAe,KAAK,IAAI,EAAU,EAAW,GAC7C,EAAgB,KAAK,IAAI,EAAW,EAAY,GAEtD,MAAQ,IAAI,GAAI,CACd,EAAG,EAAU,EAAG,EAAU,MAAO,EAAc,OAAQ,IACrD,QAGC,MAAM,EAAY,EAA0B,CACjD,GAAM,CAAE,QAAO,UAAW,KACpB,EAAI,KAAK,EAAI,EACb,EAAI,KAAK,EAAI,EAEnB,MAAO,IAAI,GAAI,CACb,IAAG,IAAG,QAAO,WAIV,aAAa,EAAqB,EAAoB,CAC3D,GAAM,GAAI,KAAK,MAAQ,EACjB,EAAI,KAAK,OAAS,EAElB,EAAK,EACL,EAAK,EACP,EAAM,EACN,EAAM,EAEN,EAAI,KAAK,KACT,EAAI,KAAK,IACT,EAAK,KAAK,MACV,EAAK,KAAK,OAEd,MAAI,GAAK,GACP,GAAM,CAAC,EAAK,EAAa,EACzB,EAAK,GAEH,EAAK,GACP,GAAM,CAAC,EAAK,EAAc,EAC1B,EAAK,GAEH,EAAI,GACN,GAAM,EAAI,EACV,EAAI,GAEF,EAAI,GACN,GAAM,EAAI,EACV,EAAI,GAGC,CACL,KAAI,MAAK,KAAI,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAIhC,UAAU,EAAa,CAC5B,MAAO,IAAI,GAAI,CACb,KAAM,KAAK,KAAQ,EAAO,KAAO,KAAK,MACtC,IAAK,KAAK,IAAO,EAAO,IAAM,KAAK,OACnC,MAAO,KAAK,MAAS,EAAO,MAAQ,KAAK,MACzC,OAAQ,KAAK,OAAU,EAAO,OAAS,KAAK,SAC3C,WAAW,UCjMX,oBAA0B,EAAyC,CACxE,YAAY,EAAc,EAAa,EAAe,EAAgB,EAAmC,GAAO,CAC9G,MAAM,CACJ,OAAM,MAAK,QAAO,UACjB,KCTA,YAAsB,CAW3B,YACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,WAAa,GAAI,GAAW,EAAU,MAAO,EAAU,QAC5D,KAAK,OAAS,EACd,KAAK,YAAc,EACnB,KAAK,WAAa,EAClB,KAAK,KAAO,GAAI,GAAI,GAAa,QAAQ,KAAK,eAGrC,QAAgB,CAAE,MAAO,MAAK,UAE9B,aAAqB,CAAE,MAAO,MAAK,eAEnC,YAAoB,CAAE,MAAO,MAAK,cAElC,MAAW,CAAE,MAAO,MAAK,QAEzB,YAAwB,CAAE,MAAO,MAAK,cAEtC,aAAqB,CAAE,MAAO,MAAK,UAAU,SAE7C,cAAsB,CAAE,MAAO,MAAK,UAAU,UAE9C,cAAmB,CAAE,MAAO,IAAI,GAAI,KAAK,MAAM,QAAQ,KAAK,UAAU,WAE1E,QAAQ,EAAe,EAAiC,CAC7D,MAAO,IAAI,IACT,KAAK,MACL,KAAK,WACL,KAAK,UACL,KAAK,YACL,CAAE,QAAO,aCzCR,mBAA4B,GAAyC,CAC1E,YACE,EACA,EACA,EACA,CACA,MAAM,EAAO,EAAO,GAAI,EAAa,GAGhC,QAAQ,EAAe,EAA+B,CAC3D,GAAM,CAAE,QAAO,cAAa,aAAc,MAAM,QAAQ,EAAO,GAC/D,MAAO,IAAI,GAAc,EAAO,EAAa,KCnB1C,YAAa,EAAW,EAAW,EAAiB,GAAM,CAC/D,GAAM,GAAQ,KAAK,IAAI,EAAK,KAAK,IAAI,EAAK,MAAO,EAAK,OAAS,KAAK,IAAI,EAAK,KAAM,EAAK,OAClF,EAAS,KAAK,IAAI,EAAK,KAAK,IAAI,EAAK,OAAQ,EAAK,QAAU,KAAK,IAAI,EAAK,IAAK,EAAK,MACpF,EAAe,EAAQ,EAE7B,MAAO,GACH,EAAgB,GAAK,KAAO,EAAK,KAAO,GACxC,EAAe,KAAK,IAAI,EAAK,KAAM,EAAK,MCPvC,YAAiB,EAA4B,CAClD,GAAM,GAAK,EAAI,IAAI,AAAC,GAAO,EAAG,GACxB,EAAK,EAAI,IAAI,AAAC,GAAO,EAAG,GACxB,EAAO,EAAG,OAAO,CAAC,EAAK,IAAO,EAAI,EAAM,EAAI,EAAM,UAClD,EAAO,EAAG,OAAO,CAAC,EAAK,IAAO,EAAI,EAAM,EAAI,EAAM,UAClD,EAAO,EAAG,OAAO,CAAC,EAAK,IAAO,EAAM,EAAI,EAAI,EAAM,GAClD,EAAO,EAAG,OAAO,CAAC,EAAK,IAAO,EAAM,EAAI,EAAI,EAAM,GAExD,MAAO,IAAI,IAAY,EAAM,EAAM,EAAM,GCPpC,YACL,EACA,EACA,EACA,EAAiB,GACP,CACV,GAAI,GAAuB,EACxB,IAAI,CAAC,EAAO,IAAc,EAAE,QAAO,cACnC,KAAK,CAAC,EAAI,IAAO,EAAG,MAAQ,EAAG,OAC/B,IAAI,AAAC,GAAM,EAAE,UAEV,EAAiB,GAEvB,KAAO,EAAqB,OAAS,GAAG,CACtC,GAAM,GAAO,EAAqB,MAClC,EAAK,KAAK,GAEV,GAAM,GAAU,EAEV,EAAoB,GAC1B,OAAS,GAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,GAAM,GAAM,EAAQ,GAEd,EAAU,EAAM,GAChB,EAAS,EAAM,GAErB,EAAQ,KAAK,GAAI,EAAS,EAAQ,IAGpC,EAAuB,EAAqB,OAC1C,CAAC,EAAG,IAAM,EAAQ,IAAM,GAI5B,MAAO,GCnCF,WAAmB,EAAgB,EAAgC,CACxE,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,CAAC,EAAG,EAAG,GAAK,EACZ,EAAQ,AAAG,OAAK,CAAC,GAAG,EAAE,MAAM,MAAM,EAAG,GAAI,GAAI,EAAG,WAChD,EAAQ,AAAG,OAAK,CAAC,GAAG,EAAE,MAAM,MAAM,EAAG,GAAI,GAAI,EAAG,WAChD,EAAQ,AAAG,OAAK,CAAC,GAAG,EAAE,MAAM,MAAM,EAAG,GAAI,GAAI,EAAG,WAChD,EAAU,AAAG,SAAO,CAAC,EAAO,EAAO,GAAQ,GAEjD,MAAO,AAAG,OAAI,EAAG,KCAd,YACL,EACA,EAAyB,GACZ,CACb,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,CAAC,EAAQ,GAAS,EAAU,MAAM,MAAM,GAC9C,GAAI,IAAW,EACb,MAAO,GAGT,GAAM,GAAU,KAAK,IAAI,EAAS,GAC5B,EAAgB,KAAK,MAAM,EAAW,GAAgB,GAAM,IAC5D,EAAc,EAAS,EAAQ,EAAI,EAEnC,EAAsB,AAAC,GAA0C,CACrE,GAAM,GAAqB,EAAU,MAAM,QAC3C,SAAmB,GAAe,EAC3B,AAAG,OAAK,EAAoB,EAAG,YAGlC,EAAsB,EAAoB,GAC1C,EAAyB,EAAW,EAAoB,MAAM,GAM9D,EAAiB,CAJM,GAAiB,EAC1C,EAAoB,GACpB,KAIF,EACA,GAEC,OAAO,AAAC,GAAM,CAAC,CAAC,GAChB,IAAI,AAAC,GAAiB,AAAG,OAAK,EAAG,YACpC,MAAO,AAAG,UAAO,EAAgB,KC5C9B,YAAsB,EAAmB,CAC9C,GAAM,GAAQ,EAAW,QACzB,OAAS,GAAI,EAAM,OAAS,EAAG,EAAI,EAAG,IAAK,CACzC,GAAM,GAAI,KAAK,MAAM,KAAK,SAAY,GAAI,IACpC,EAAI,EAAM,GAChB,EAAM,GAAK,EAAM,GACjB,EAAM,GAAK,EAEb,MAAO,GCDF,YAAiB,EAAW,CACjC,MAAO,GAAK,GAAI,KAAK,IAAI,CAAC,IAGrB,YAAwB,EAAW,CACxC,MAAO,MAAK,IAAI,EAAK,GAAI,ICHpB,oBAAmB,EAA2B,CACnD,YAAY,EAAW,EAAW,EAAe,EAAgB,EAAmC,GAAO,CACzG,MAAM,CACJ,IAAG,IAAG,QAAO,UACZ,KCHP,GAAM,IAAO,GACP,GAAO,IACP,GAAW,IAOV,OAA8C,CAOnD,YACE,EACA,EACA,EAAe,GAAI,GAAM,EAAG,GAC5B,CACA,GAAM,CAAE,QAAO,UAAW,EAC1B,KAAK,SAAW,GAAI,GAAW,EAAO,GACtC,KAAK,OAAS,EACd,KAAK,WAAa,EAA8B,IAC9C,AAAC,GAAO,EAAG,IAAI,GAAI,GAAM,EAAO,IAAS,IAAI,OAItC,QAAe,CAAE,MAAO,IAAI,GAAM,KAAK,OAAO,EAAG,KAAK,OAAO,MAE7D,aAAqB,CAAE,MAAO,MAAK,SAAS,SAE5C,cAAsB,CAAE,MAAO,MAAK,SAAS,UAE7C,YAAqB,CAAE,MAAO,MAAK,cAEnC,oBAA6B,CACtC,MAAO,MAAK,WAAW,IACrB,AAAC,GAAO,EAAG,IAAI,KAAK,QAAQ,IAAI,GAAI,GAAM,KAAK,WAAY,KAAK,eAI7D,QAAiC,EAAe,EAAmB,CACxE,MAAO,IAAK,MAAK,YACf,KAAK,kBACL,CAAE,QAAO,WAIN,QAAiC,EAAW,EAAc,CAC/D,MAAO,IAAK,MAAK,YACf,KAAK,kBACL,KAAK,SACL,GAAI,GAAM,EAAG,IAIV,aAAsC,EAAc,CACzD,MAAO,MAAK,QAAQ,EAAG,EAAG,EAAG,GAcxB,MACL,EACA,EAAkE,GAC7D,CACL,GAAI,EAAW,CACb,GAAM,GAAM,YAAqB,GAC7B,EAAU,IAAI,QACd,GAAI,GAAI,GAEZ,MAAO,MAAK,QAAQ,EAAI,EAAG,EAAI,GAAG,MAAM,KAAM,GAGhD,GAAM,CAAE,mBAAkB,iBAAkB,CAAE,iBAAkB,GAAO,cAAe,MAAQ,GAE9F,MAAI,GACK,KAAK,YAGP,KAAK,aAAa,GAGnB,WAAiB,CACvB,GAAM,GAAU,KAAK,2BAEf,CAAC,EAAe,EAAgB,GAAe,EAC/C,EAAc,AAAC,GAAc,EAAY,IAAI,GAAI,YACjD,EAAkB,GAAY,GAAiB,EAAY,IAAmB,EAE9E,EAAO,KAAK,MAAM,EAAiB,IAEnC,EAAW,GAAe,GAE1B,EAAI,KAAK,MAAM,KAAK,IAAI,EAAG,EAAS,EAAK,GAAO,IAChD,EAAI,KAAK,MAAM,KAAK,IAAI,EAAG,EAAS,EAAK,GAAO,IAEtD,MAAO,IAAI,IAAK,EAAG,EAAG,KAAK,IAAI,EAAM,KAAK,WAAa,GAAI,KAAK,IAAI,EAAM,KAAK,YAAc,IAGvF,aAAa,EAAsB,CACzC,GAAM,GAAM,GAAQ,KAAK,WACzB,MAAO,GAAI,IAAI,EAAI,MAAQ,EAAS,EAAI,OAAS,GAGzC,0BAAoC,CAC5C,KAAM,IAAI,OAAM,4DC3Hb,oBAA6B,EAAc,CACtC,0BAAoC,CAC5C,GAAM,GAAM,KAAK,UACjB,MAAO,CACL,EAAI,GACJ,EAAI,GACJ,GAAe,CAAC,EAAI,GAAI,EAAI,QCN3B,oBAA8B,EAAc,CAC1C,eAAyB,CAC9B,MAAO,MAAK,UAAU,MAAM,EAAG,IAG1B,gBAA0B,CAC/B,MAAO,MAAK,UAAU,MAAM,GAAI,IAG3B,iBAA2B,CAChC,MAAO,MAAK,UAAU,MAAM,GAAI,IAG3B,SAAmB,CACxB,MAAO,MAAK,UAAU,MAAM,GAAI,IAG3B,YAAsB,CAC3B,MAAO,MAAK,UAAU,MAAM,GAAI,IAG3B,aAAuB,CAC5B,MAAO,MAAK,UAAU,MAAM,GAAI,IAG3B,UAAoB,CACzB,MAAO,MAAK,UAAU,MAAM,GAAI,IAGxB,0BAAoC,CAC5C,MAAO,CACL,KAAK,aACL,KAAK,cACL,KAAK,YACL,IAAI,MC/BH,YAAsC,CAK3C,YAAY,EAAe,EAAkB,CAC3C,KAAK,OAAS,EACd,KAAK,UAAY,KAGR,QAAgB,CAAE,MAAO,MAAK,UAE9B,WAAmB,CAAE,MAAO,MAAK,UAErC,SAAS,EAAwB,GAAc,CACpD,MAAO,GAAG,KAAK,QAAQ,EAAe,KAAK,GAAM,KAAK,aAAe,OCjBlE,oBAAyB,EAAgB,OAChC,yBAAwB,EAAU,EAAgB,CAG9D,GAFA,EAAI,iBAAiB,EAAK,GAEtB,CAAC,EAAc,EAAI,OACrB,KAAM,IAAI,OAAM,GAAG,gCAAqC,EAAI,yBAMhE,YAAY,EAAiC,EAAe,CAC1D,MAAM,GACN,KAAK,OAAS,KAGL,QAAgB,CAAE,MAAO,MAAK,SCrBpC,YAA6B,CAKlC,YAAY,EAAe,EAA6B,CACtD,GAAM,MAAO,IAAU,SACrB,KAAM,IAAI,OAAM,sEAGlB,GAAI,CAAC,MAAM,QAAQ,IAAgB,EAAY,KAAK,AAAC,GAAS,CAAE,aAAgB,gBAC9E,KAAM,IAAI,OAAM,4FAGlB,KAAK,OAAS,EACd,KAAK,aAAe,KAGX,QAAgB,CAAE,MAAO,MAAK,UAE9B,cAA8B,CAAE,MAAO,MAAK,aAEhD,QAAc,CACnB,MAAO,CACL,MAAO,KAAK,MACZ,YAAa,KAAK,YAAY,IAAI,AAAC,GAAM,MAAM,KAAK,WAI1C,UAAS,EAAmC,CACxD,GAAM,GAAc,EAAK,YAAY,IAAI,AAAC,GAAW,GAAI,cAAa,IACtE,MAAO,IAAI,IAAuB,EAAK,MAAO,KC1B3C,oBAA2B,GAAW,OAC7B,2BAA0B,EAAU,EAAgB,CAGhE,GAFA,GAAW,wBAAwB,EAAK,GAGtC,CAAC,GAAmB,EAAI,QACrB,CAAC,GAAmB,EAAI,YAE3B,KAAM,IAAI,OAAM,GAAG,kCAAuC,EAAI,eAAe,EAAI,6CAQrF,YAAY,EAAiC,EAAe,EAAe,EAAoB,CAC7F,MAAM,EAAK,GACX,KAAK,OAAS,EACd,KAAK,YAAc,KAGV,QAAgB,CAAE,MAAO,MAAK,UAE9B,aAAqB,CAAE,MAAO,MAAK,cCvBzC,WAA6B,EAAwC,CAC1E,MAAO,GAAI,oBAAqB,GAG3B,YAA0C,EAAoB,EAAsD,CAEzH,MAAO,IAAK,KADM,CAAE,cCTf,aAAyC,CAC9C,GAAM,GAAQ,OAAO,MACrB,GAAI,CAAC,EAAO,KAAM,IAAI,OAAM,gEAM5B,MAAO,CACL,OAAQ,kBACR,yBACA,MAAO,iBACP,UACA,MAAO,iBACP,oBAAqB,IAAM,SAAS,cAAc,UAClD,mBAAoB,IAAM,SAAS,cAAc,OACjD,QACA,SAbe,IAAM,CACrB,KAAM,IAAI,OAAM,iECLb,YAA0B,EAAsB,CACrD,GAAI,GAAiB,GAErB,GAAI,CAAC,EACH,GAAI,CAEF,EAAK,QAAQ,YACN,EAAP,CACA,EAAiB,EAAI,WAYzB,MAAO,CACL,SATe,EACb,AAAC,GAAqB,GAAI,SAAgB,CAAC,EAAS,IAAW,CAC/D,EAAG,SAAS,EAAU,CAAC,EAAU,IAAoB,EAAM,EAAO,GAAO,EAAQ,MAEjF,IAAM,CACN,KAAM,IAAI,OAAM,qEAAqE,OCfpF,aAAwC,CAE7C,GAAM,GAAS,OAAO,QAAa,OAAO,kBACpC,EAAQ,OAAO,OAAS,OAAO,iBAE/B,EAAsB,IAAM,CAChC,GAAI,EAAQ,MAAO,IAAI,GACvB,KAAM,IAAI,OAAM,+EAGZ,EAAqB,IAAM,CAC/B,GAAI,EAAO,MAAO,IAAI,GACtB,KAAM,IAAI,OAAM,6EAGZ,EAAQ,OAAO,MAGf,EAAa,KAEnB,MAAO,CACL,OAAQ,GAAU,KAAM,GACxB,yBAA0B,OAAO,0BAA4B,KAAM,GACnE,MAAO,GAAS,KAAM,GACtB,UAAW,OAAO,WAAa,KAAM,GACrC,MAAO,OAAO,kBAAoB,KAAM,GACxC,sBACA,qBACA,WACG,GCjCA,aAA8B,CACnC,MAAO,OAAO,SAAW,UACpB,MAAO,WAAa,aACpB,MAAO,mBAAqB,aAC5B,MAAO,oBAAsB,aAC7B,MAAO,mBAAqB,aAC5B,MAAO,YAAc,aACrB,MAAO,2BAA6B,YCPpC,aAA6B,CAClC,MAAO,OAAO,SAAW,UACpB,IACA,MAAO,SAAW,aAClB,MAAO,UAAY,aAAe,CAAC,CAAC,QAAQ,QCGnD,GAAI,GAEJ,aAA+B,CAC7B,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,yEAElB,MAAO,GAGT,YAAgB,EAAkB,CAChC,EAAc,EAGhB,aAAsB,CAGpB,MAAI,MAAoB,GAAO,MAC3B,KAAmB,GAAO,MACvB,KAGT,YAAqB,EAA2B,CAK9C,GAJK,GACH,KAGE,CAAC,EACH,KAAM,IAAI,OAAM,8EAGlB,GAAM,CAAE,SAAS,EAAY,OAAQ,QAAQ,EAAY,OAAU,EACnE,EAAY,OAAS,EACrB,EAAY,MAAQ,EACpB,EAAY,oBAAsB,EAAI,qBAAwB,KAAM,GAAI,IACxE,EAAY,mBAAqB,EAAI,oBAAuB,KAAM,GAAI,IAEtE,EAAY,UAAY,EAAI,WAAa,EAAY,UACrD,EAAY,MAAQ,EAAI,OAAS,EAAY,MAC7C,EAAY,MAAQ,EAAI,OAAS,EAAY,MAC7C,EAAY,SAAW,EAAI,UAAY,EAAY,SAG9C,GAAM,GAAM,CACjB,UACA,UACA,cACA,oBACA,oBACA,mBACA,eACA,aACA,aAGF,KC3DO,YAAsB,EAAmB,CAC9C,MAAI,CAAC,EAAI,YAAc,MAAO,IAAQ,SAC7B,SAAS,eAAe,GAE1B,ECHF,WAA6B,EAA4F,CAC9H,GAAM,CAAE,SAAQ,4BAA6B,EAAI,SAEjD,GAAI,YAAqB,GACvB,MAAO,GAGT,GAAM,GAAS,GAAa,GAE5B,GAAI,CAAE,aAAkB,IACtB,KAAM,IAAI,OAAM,kEAGlB,GAAM,GAAM,EAAO,WAAW,MAC9B,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,gDAGlB,MAAO,GCfF,GAAK,GAAL,UAAK,EAAL,CAEL,WAAW,WAEX,YAAY,YAEZ,cAAc,cAEd,eAAe,iBARL,WAoBL,YAA4D,CAajE,YAAY,EAAiC,GAAI,CAC/C,GAAM,CACJ,iBAAgB,kBAAiB,YAAW,WAAU,YAAW,WAC/D,EACJ,KAAK,eAAiB,GAAkB,EAAe,SACvD,KAAK,gBAAkB,GAAmB,qBAC1C,KAAK,UAAY,GAAa,yBAC9B,KAAK,SAAW,GAAY,GAC5B,KAAK,UAAY,GAAa,UAC9B,KAAK,QAAU,GAAW,IAIvB,QAAoB,CAOzB,YACE,EACA,EACA,EAAiC,GACjC,CAEA,KAAK,KAAO,MAAO,IAAS,SACxB,CAAC,GACA,YAAgB,IAAgB,EAAK,KAAO,EACjD,KAAK,OAAS,EACd,KAAK,QAAU,GAAI,IAAqB,GAG1C,aAAa,EAAuC,CAClD,GAAM,CAAE,WAAY,KAAK,QACzB,MAAO,MAAK,KAAK,IAAI,AAAC,GAAM,EAAI,YAAY,GAAG,OAAO,OAAO,CAAC,EAAI,IAAQ,EAAK,EAAK,EAAK,EAAK,GAAM,EAAI,EAG1G,eAAwB,CACtB,GAAM,CAAE,WAAU,WAAY,KAAK,QACnC,MAAO,MAAK,KAAK,OAAS,EAAY,EAAI,EAG5C,aAAa,EAA+B,EAAkC,CAC5E,GAAM,CAAE,kBAAmB,KAAK,QAC1B,EAAc,IAAmB,EAAe,cAAgB,IAAmB,EAAe,UAClG,EAAa,IAAmB,EAAe,aAAe,IAAmB,EAAe,aAEhG,EAAiB,KAAK,aAAa,GACnC,EAAkB,KAAK,gBACvB,EAAK,EAAc,KAAK,OAAO,EAAI,EAAiB,KAAK,OAAO,EAChE,EAAI,EAAa,KAAK,OAAO,EAAI,EAAkB,KAAK,OAAO,EAGrE,GAAI,EAAY,CACd,GAAM,CAAE,QAAO,UAAW,EACpB,EAAO,KAAK,IAAI,KAAK,IAAI,EAAG,EAAQ,GAAiB,GACrD,EAAO,KAAK,IAAI,KAAK,IAAI,EAAG,EAAS,GAAkB,GAC7D,MAAO,CAAE,EAAG,EAAM,EAAG,GAEvB,MAAO,CAAE,IAAG,KAGd,KAAK,EAAkE,CACrE,GAAM,GAAS,GAAa,GACtB,EAAM,EAAoB,GAE1B,CACJ,kBAAiB,YAAW,WAAU,YAAW,WAC/C,KAAK,QAET,EAAI,KAAO,GAAG,OAAc,IAC5B,GAAM,GAAe,KAAK,aAAa,GACjC,EAAa,KAAK,gBAExB,EAAI,UAAY,EAChB,GAAM,GAAY,KAAK,aAAa,EAAK,GACzC,EAAI,SAAS,EAAU,EAAG,EAAU,EAAG,EAAc,GAErD,EAAI,UAAY,EAChB,KAAK,KAAK,QAAQ,CAAC,EAAU,IAAM,CACjC,GAAM,GAAI,EAAU,EAAU,EACxB,EAAI,EAAU,EAAU,EAAM,GAAI,GAAK,EAC7C,EAAI,SAAS,EAAU,EAAG,OC9GzB,YAAqB,CAS1B,YAAY,EAA2B,GAAI,CACzC,GAAM,CACJ,WAAU,YAAW,QAAO,oBAC1B,EACJ,KAAK,SAAW,GAAY,qBAC5B,KAAK,UAAY,GAAa,EAC9B,KAAK,MAAQ,EAEb,GAAM,GAA0B,CAC9B,eAAgB,EAAe,YAC/B,gBAAiB,KAAK,UAExB,KAAK,iBAAmB,GAAI,IAAqB,IAAK,KAA4B,MAI/E,QAAc,CAKnB,YACE,EACA,EAA2B,GAC3B,CACA,KAAK,IAAM,GAAI,GAAI,GACnB,KAAK,QAAU,GAAI,IAAe,GAGpC,KAAK,EAAkE,CACrE,GAAM,GAAM,EAAoB,GAE1B,CAAE,WAAU,aAAc,KAAK,QAE/B,CACJ,IAAG,IAAG,QAAO,UACX,KAAK,IACT,EAAI,YAAc,EAClB,EAAI,UAAY,EAChB,EAAI,WAAW,EAAG,EAAG,EAAO,GAE5B,GAAM,CAAE,SAAU,KAAK,QACvB,AAAI,GACF,GAAI,IAAc,CAAC,GAAQ,CAAE,EAAG,EAAK,EAAY,EAAI,KAAK,KAAK,QAAQ,kBAAkB,KAAK,KCxD7F,YACL,EACA,EACA,CAGA,AAFwB,OAAM,QAAQ,GAAc,EAAa,CAAC,IAElD,QAAQ,AAAC,GAAQ,CAE/B,GAAM,GAAQ,YAAe,GACzB,EAAI,MACH,EAAoB,GAAO,EAAI,UAAU,MAAQ,OAGhD,EAAM,YAAe,GACvB,EAAI,IACH,EAAoB,GAAO,EAAI,UAAU,IAAM,GAAI,GAAI,GAEtD,EAAQ,EAAQ,GAAG,GAAM,KAAW,OAC1C,GAAI,IAAQ,EAAK,CAAE,UAAS,KAAK,KCxB9B,YAAuB,EAAsD,CAClF,GAAM,CAAE,QAAO,SAAU,EAAI,SAE7B,MAAQ,aAAiB,IAAS,EAAM,UAClC,YAAiB,IAAS,EAAM,YAAc,ECH/C,YAA0B,EAAgE,CAE/F,MAAO,IAAI,SAAQ,CAAC,EAAS,IAAW,CACtC,GAAI,YAAiB,GAAI,SAAS,QAAU,GAAc,GAAQ,MAAO,GAAQ,MAEjF,WAAiB,EAAU,CACzB,AAAI,CAAC,EAAE,eAEP,GAAE,cAAc,oBAAoB,OAAQ,GAC5C,EAAE,cAAc,oBAAoB,QAAS,GAC7C,EAAO,IAGT,WAAgB,EAAU,CACxB,AAAI,CAAC,EAAE,eACP,GAAE,cAAc,oBAAoB,OAAQ,GAC5C,EAAE,cAAc,oBAAoB,QAAS,GAC7C,EAAQ,IAGV,EAAM,iBAAiB,OAAQ,GAC/B,EAAM,iBAAiB,QAAS,KCtB7B,YAAuB,EAAsC,CAClE,MAAO,IAAI,SAAQ,CAAC,EAAS,IAAW,CACtC,AAAM,YAAe,OAAO,EAAO,GAAI,OAAM,qDAC7C,GAAM,GAAS,GAAI,YACnB,EAAO,OAAS,IAAM,CACpB,AAAI,MAAO,GAAO,QAAW,UAAU,EAAO,GAAI,OAAM,qEACxD,GAAM,GAAM,EAAI,SAAS,qBACzB,EAAI,OAAS,IAAM,EAAQ,GAC3B,EAAI,QAAU,EACd,EAAI,IAAM,EAAO,QAEnB,EAAO,QAAU,EACjB,EAAO,cAAc,KCXlB,YAA4B,EAA0F,CAC3H,GAAM,CAAE,QAAO,SAAU,EAAI,SAE7B,MAAI,aAAiB,GACZ,GAAI,GAAW,EAAM,aAAc,EAAM,eAE9C,YAAiB,GACZ,GAAI,GAAW,EAAM,WAAY,EAAM,aAEzC,GAAI,GAAW,EAAM,MAAO,EAAM,QCNpC,YAAsB,CAAE,QAAO,UAA0C,CAC9E,GAAM,CAAE,uBAAwB,EAAI,SAC9B,EAAS,IACf,SAAO,MAAQ,EACf,EAAO,OAAS,EACT,EAGF,YAA+B,EAAwD,EAAuC,CACnI,GAAM,CAAE,aAAc,EAAI,SAE1B,GAAI,CAAE,aAAiB,KAAc,CAAC,GAAc,GAClD,KAAM,IAAI,OAAM,8DAGlB,GAAM,CAAE,QAAO,UAAW,GAAQ,GAAmB,GAC/C,EAAS,GAAa,CAAE,QAAO,WAErC,MAAI,aAAiB,GACnB,EAAoB,GAAQ,aAAa,EAAO,EAAG,GAEnD,EAAoB,GAAQ,UAAU,EAAO,EAAG,EAAG,EAAO,GAErD,ECxBT,kBACE,EACA,EAC4B,CAC5B,GAAM,GAAe,GAAU,EAAI,SAAS,sBAEtC,CAAC,EAAQ,EAAO,GAAe,EAAU,MAAM,MAAM,EAAW,GAAa,EAAI,GACjF,EAAc,AAAG,OAAK,IAAM,EAAU,KAAK,EAAQ,EAAO,GAAa,SAC7E,YAAM,AAAG,WAAQ,SAAS,EAAa,GAEvC,EAAY,UAEL,ECfF,YAAwB,EAAY,CACzC,GAAM,CAAE,QAAO,SAAQ,SAAU,EAAI,SAErC,MAAO,aAAiB,IACnB,YAAiB,IACjB,YAAiB,GCFjB,YAAuB,EAA6C,EAAmB,EAAuB,GAAO,CAC1H,GAAM,CAAE,QAAO,UAAW,EAAI,SAE9B,GAAI,CAAE,aAAiB,IAAS,YAAiB,IAC/C,KAAM,IAAI,OAAM,4EAGlB,GAAI,GAAa,EAAG,MAAO,IAAa,CAAE,MAAO,EAAG,OAAQ,IAC5D,GAAM,GAAO,GAAmB,GAC1B,EAAQ,EAAY,KAAK,IAAI,EAAK,OAAQ,EAAK,OAC/C,EAAQ,EAAQ,EAAK,MACrB,EAAS,EAAQ,EAAK,OAEtB,EAAe,GAAa,CAAE,MAAO,EAAW,OAAQ,IACxD,EAAc,YAAiB,GAAS,EAAQ,GAAsB,GAEtE,EAAS,KAAK,IAAI,EAAQ,GAAU,EACpC,EAAK,GAAe,EAAQ,EAAS,EAAS,EAC9C,EAAK,GAAe,EAAS,EAAQ,EAAS,EACpD,MAAI,GAAY,MAAQ,GAAK,EAAY,OAAS,GAAG,EAAoB,GAAc,UAAU,EAAa,EAAI,EAAI,EAAO,GAEtH,EChBF,YAAe,CAapB,YAAY,EAAkC,EAA6B,GAAO,CAZ1E,mBAAkD,GAElD,eAAiC,GAIjC,wBAA8B,GAE9B,sBAA+B,GAKrC,GAAI,CAAC,MAAM,QAAQ,GACjB,KAAM,IAAI,OAAM,4HAA4H,KAG9I,KAAK,mBAAqB,EAC1B,KAAK,WAAa,EAAO,OAEzB,EAAO,QAAQ,CAAC,EAAO,IAAQ,CAC7B,GAAI,EAAW,GAAQ,CACrB,KAAK,cAAc,GAAO,EAC1B,KAAK,iBAAiB,GAAO,EAAM,MACnC,OAGF,GAAI,EAAW,GAAQ,CACrB,GAAM,GAAa,EAAc,MAAM,GACvC,GAAI,IAAc,EAChB,KAAM,IAAI,OAAM,yCAAyC,8CAG3D,KAAK,cAAc,GAAO,EAC1B,KAAK,iBAAiB,GAAQ,EAAc,MAAM,MAAM,GACxD,OAGF,GAAM,GAAU,YAAyB,GAAI,SAAS,OAAS,EAAQ,GAAsB,GAC7F,KAAK,UAAU,GAAO,EACtB,KAAK,iBAAiB,GAAO,CAAC,EAAO,OAAQ,EAAO,MAAO,QAIpD,eAAiD,CAC1D,MAAO,MAAK,iBAGH,WAAgC,CACzC,MAAO,MAAK,aAGH,eAAwB,CACjC,MAAO,MAAK,UAAY,GAAK,KAAK,sBAGzB,YAAoB,CAC7B,MAAO,MAAK,cAGH,kBAA8B,CACvC,MAAO,MAAK,oBAGH,YAAgC,CACzC,MAAO,MAAK,cAGH,0BAAwC,CACjD,MAAO,GAAM,KAAK,UAAW,EAAG,GAAG,IACjC,CAAC,EAAG,IAAa,KAAK,2BAA2B,IAI9C,SAAS,EAAiE,CAC/E,MAAO,MAAK,SAAS,IAAa,KAAK,aAAa,GAG/C,mBAAmB,EAA4B,CACpD,MAAO,MAAK,iBAAiB,GAGxB,eAAe,EAA0B,CAC9C,MAAO,MAAK,iBAAiB,GAAU,GAGlC,cAAc,EAA0B,CAC7C,MAAO,MAAK,iBAAiB,GAAU,GAGlC,2BAA2B,EAA8B,CAC9D,GAAI,MAAO,MAAK,WAAc,SAC5B,KAAM,IAAI,OAAM,yFAGlB,GAAM,GAAQ,KAAK,cAAc,GAC3B,EAAS,KAAK,eAAe,GACnC,MAAO,IAA0B,CAAE,QAAO,UAAU,KAAK,WAYpD,cAAc,EAAmB,EAA0B,GAAmB,CACnF,YAAK,WAAa,EAEX,AAAG,OAAK,IAAM,CACnB,GAAM,GAAe,EAAM,KAAK,UAAW,EAAG,GAAG,IAAI,AAAC,GAAa,CACjE,GAAM,GAAQ,KAAK,SAAS,GAE5B,GAAI,YAAoB,UAAQ,CAC9B,GAAI,GAAY,EAAW,GAAS,EAAQ,AAAG,aAAW,GAC1D,SAAY,GAAY,EAAW,GAE/B,GAAU,MAAM,KAAO,GAAa,EAAU,MAAM,KAAO,IAC7D,GAAY,AAAG,QAAM,eAAe,EAAW,CAAC,EAAW,GAAY,GAAO,KAGzE,EAAU,KAAK,EAAW,EAAW,GAG9C,GAAI,YAAiB,GAAI,SAAS,OAChC,MAAO,AAAG,WAAQ,WAAW,GAAc,EAAO,EAAW,IAG/D,KAAM,IAAI,OAAM,+BAA+B,8FAAqG,OAKtJ,MAFoB,AAAG,SAAM,EAAa,IAAI,AAAC,GAAM,AAAG,OAAK,EAAG,aAAa,KAAK,KAAK,UAAW,EAAW,EAAW,OCnI9H,iBAAiC,EAAsC,CACrE,GAAI,YAAkB,IAAU,MAAO,GACvC,GAAM,GAAgB,MAAM,QAAQ,GAAU,EAAS,CAAC,GACxD,GAAI,CAAC,EAAc,OAAQ,KAAM,IAAI,OAAM,4CAC3C,GAAM,GAAa,AAAC,GAAiB,MAAM,QAAQ,GAAU,mBAAmB,KAAS,GACnF,EAAa,EAAc,IAAI,IACrC,SAAW,QAAQ,CAAC,EAAO,IAAM,CAC/B,GAAI,CAAC,GAAe,IAAU,CAAC,EAAW,IAAU,CAAC,EAAW,GAC9D,KAAI,OAAO,GAAc,IAAO,SAAgB,GAAI,OAAM,eAAe,EAAW,sEAAsE,EAAc,MAClK,GAAI,OAAM,eAAe,EAAW,iIAE5C,GAAI,EAAW,GAAQ,CAErB,GAAM,GAAY,EAAM,MAAM,GAC9B,GAAI,IAAc,EAAG,KAAM,IAAI,OAAM,eAAe,EAAW,iCAAiC,iDAIpG,KAAM,SAAQ,IAAI,EAAW,IAAI,AAAC,GAAU,GAAe,IAAU,GAAiB,KAC/E,GAAI,IAAS,EAAY,MAAM,QAAQ,ICjBhD,kBAAmC,EAAkB,EAAuE,CAC1H,GAAM,CAAE,UAAW,EAAI,SACnB,EAAS,EACb,GAAI,CAAE,aAAiB,IAAS,CAC9B,GAAM,GAAW,KAAM,GAAW,GAClC,GAAI,EAAS,UAAY,EAAG,KAAM,IAAI,OAAM,8CAC5C,GAAM,GAAiB,EAAS,SAAS,GACzC,EAAS,YAA0B,GAAS,EAAiB,KAAM,IAAoB,GAEzF,GAAM,GAAM,EAAoB,GAIhC,MAAO,AAHO,GACX,IAAI,AAAC,GAAS,YAAe,GAAgB,EAAI,QAAQ,EAAO,MAAO,EAAO,QAAQ,IAAI,QAAU,GACpG,IAAI,AAAC,GAAQ,EAAI,mBAAmB,EAAO,MAAO,EAAO,SAC/C,IAAI,CAAC,CAAE,IAAG,IAAG,QAAO,YAAa,CAC5C,GAAM,GAAU,GAAa,CAAE,QAAO,WACtC,MAAI,GAAQ,GAAK,EAAS,GAAG,EAAoB,GAAS,aAAa,EAAI,aAAa,EAAG,EAAG,EAAO,GAAS,EAAG,GAC1G,IChBX,kBAAyC,EAAwC,EAAiE,CAChJ,GAAI,CAAC,EAAW,IAAgB,CAAC,EAAW,GAC1C,KAAM,IAAI,OAAM,6DAGlB,GAAI,EAAW,IAAgB,EAAY,MAAM,GAAK,EACpD,KAAM,IAAI,OAAM,oDAGlB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,CAAC,EAAW,EAAU,GAAe,EAAY,MAAM,MAAM,EAAW,GAAe,EAAI,GAYjG,MAJoB,AANN,GACX,IAAI,AAAC,GAAS,YAAe,GAC1B,EAAI,QAAQ,EAAU,GAAW,IACjC,GACH,IAAI,AAAC,GAAQ,EAAI,mBAAmB,EAAU,IAEvB,IAAI,CAAC,CAC7B,IAAG,IAAG,QAAO,YACT,AAAG,UAAQ,EAAY,KAAK,EAAW,EAAU,GAAc,CAAC,EAAG,EAAG,GAAI,CAAC,EAAQ,EAAO,OClCpG,kBACE,EAEA,EACmB,CACnB,GAAM,CAAE,SAAU,EAAI,SAChB,EAAM,KAAM,GAAM,EAAK,GAC7B,GAAI,CAAE,GAAI,OAAS,KACjB,KAAM,IAAI,OAAM,qBAAqB,EAAI,WAAW,EAAI,yBAAyB,EAAI,OAEvF,MAAO,GCTT,kBAAiC,EAAwC,CACvE,GAAM,GAAM,KAAM,IAAa,GACzB,EAAO,KAAO,GAAK,OAEzB,GAAI,CAAC,EAAK,KAAK,WAAW,UACxB,KAAM,IAAI,OAAM,wEAAwE,EAAK,kBAAkB,EAAI,OAErH,MAAO,IAAc,GCRvB,kBAAmC,EAAyB,CAC1D,MAAQ,MAAM,IAAa,IAAM,OCDnC,kBAAsC,EAAoC,CACxE,MAAO,IAAI,cAAa,KAAO,MAAM,IAAa,IAAM,eCHnD,YAAsB,EAAyB,EAA0B,CAC9E,GAAM,GAA0B,GAAG,0BAEnC,GAAI,CAAC,EACH,MAAO,CACL,aAAc,GACd,YAAa,GAIjB,GAAI,IAAQ,IACV,MAAO,CACL,aAAc,IACd,YAAa,IAAI,KAIrB,GAAM,GAAW,EAAI,WAAW,WAAa,UAAY,EAAI,WAAW,YAAc,WAAa,GACnG,EAAM,EAAI,QAAQ,EAAU,IAE5B,GAAM,GAAQ,EAAI,MAAM,KAAK,OAAO,AAAC,GAAM,GAErC,EAAe,EAAI,SAAS,SAC9B,EAAM,EAAM,OAAS,GACrB,EAEA,EAAe,EAAY,GAAI,SAAS,SAAW,EAAM,MAAM,EAAG,EAAM,OAAS,GAAK,GAAO,KAAK,KACtG,SAAe,EAAI,WAAW,KAAO,IAAI,IAAiB,EAEnD,CACL,eACA,YAAa,IAAiB,IAAM,IAAI,IAAiB,GAAG,KAAgB,KC1BhF,kBACE,EACA,EAC4B,CAC5B,GAAM,CAAE,cAAa,gBAAiB,GAAa,EAAK,GAClD,EAAW,KAAM,IAAuC,GAE9D,MAAO,AAAG,MAAG,YAAY,EAAU,GCT9B,YAAyB,EAAoB,EAAwB,EAA8B,GAAO,CAC/G,GAAM,CAAE,QAAO,UAAW,EACtB,GAAmB,GACnB,EACJ,SAAM,MAAQ,EACd,EAAM,OAAS,EACR,CAAE,QAAO,UCFX,WAAyC,CAC9C,YAAY,EAAc,CAIhB,aAAkC,OAElC,oBAAiC,GALzC,KAAK,MAAQ,KASJ,SAAiC,CAAE,MAAO,MAAK,WAE/C,gBAAgC,CAAE,MAAO,MAAK,kBAE9C,WAAoB,CAAE,MAAO,CAAC,CAAC,KAAK,OAExC,iBAAiB,EAA8B,CACpD,GAAM,CAAE,MAAK,WAAY,KAAK,qBAAqB,GACnD,MAAO,GAAI,GAGN,sBAAsB,EAAmB,EAAmB,CACjE,GAAM,CAAE,MAAK,WAAY,KAAK,qBAAqB,GACnD,EAAI,GAAS,UACb,EAAI,GAAW,EAGV,cAAe,CACpB,MAAO,MAAK,eAAe,IAAI,CAAC,CAAE,eAAiB,EACjD,KAAM,EACN,OAAQ,KAAK,iBAAiB,MAI3B,oBAAqB,CAC1B,MAAO,MAAK,eAAe,OAAO,AAAC,GAAU,EAAM,iBAAqB,aAGnE,iBAAkB,CACvB,MAAO,MAAK,eAAe,OAAO,AAAC,GAAU,CAAE,GAAM,iBAAqB,cAGrE,UAAW,CAChB,KAAK,kBAAkB,QAAQ,CAAC,CAAE,OAAM,YAAa,CACnD,KAAK,sBAAsB,EAAM,EAAO,cAIrC,QAAS,CACd,KAAK,qBAAqB,QAAQ,CAAC,CAAE,OAAM,OAAQ,KAAe,CAChE,GAAM,GAAS,AAAG,SAAO,EAAS,YAClC,EAAS,UACT,KAAK,sBAAsB,EAAM,KAI9B,QAAQ,EAA4B,GAAM,CAC/C,KAAK,eAAe,QAAQ,AAAC,GAAU,CACrC,GAAI,GAAoB,EAAM,OAAO,WACnC,KAAM,IAAI,OAAM,mDAAmD,EAAM,QAE3E,EAAM,OAAO,YAEf,KAAK,QAAU,OAGV,iBAAgC,CACrC,MAAO,IAAI,cACT,KAAK,eACF,IAAI,CAAC,CAAE,YAAa,MAAM,KAAK,EAAO,aACtC,OAAO,CAAC,EAAM,IAAQ,EAAK,OAAO,UAI5B,MAAK,EAAgE,CAChF,GAAI,YAAwB,cAAc,CACxC,KAAK,eAAe,GACpB,OAEF,KAAM,MAAK,YAAY,QAGZ,aAAY,EAAyB,CAChD,GAAI,GAAO,MAAO,IAAQ,SACxB,KAAM,IAAI,OAAM,GAAG,KAAK,0CAE1B,GAAM,GAAY,KAAM,IAAc,EAAK,KAAK,uBAChD,KAAK,kBAAkB,QAGZ,cAAa,EAA8B,CACtD,GAAI,GAAY,MAAO,IAAa,SAClC,KAAM,IAAI,OAAM,GAAG,KAAK,iDAE1B,GAAM,CAAE,YAAa,EAAI,SACnB,CAAE,cAAa,gBAAiB,GAAa,EAAU,KAAK,uBAC5D,EAAuB,AAAC,GAAwB,QAAQ,IAAI,EAAU,IAAI,AAAC,GAAO,EAAS,GAAI,KAAK,AAAC,GAAQ,EAAI,UACjH,EAAc,AAAG,KAAG,qBAAqB,GACzC,EAAW,KAAK,MAAO,MAAM,GAAS,IAAc,YACpD,EAAY,KAAM,GAAY,EAAU,GAC9C,KAAK,kBAAkB,GAGlB,kBAAkB,EAA8B,CACrD,GAAM,CAAE,gBAAe,UAAW,KAAK,2BAA2B,GAClE,KAAK,eAAiB,EACtB,KAAK,QAAU,EAGV,eAAe,EAAuB,CAC3C,GAAM,CAAE,gBAAe,UAAW,KAAK,cAAc,GACrD,KAAK,eAAiB,EACtB,KAAK,QAAU,EAGT,qBAAqB,EAAmB,CAC9C,GAAI,CAAC,KAAK,OACR,KAAM,IAAI,OAAM,qDAGlB,GAAM,GAAS,EAAU,MAAM,KAAK,OAAO,CAAC,EAAoD,IAAY,CAE1G,GAAI,CAAC,EAAI,QAAQ,eAAe,GAC9B,KAAM,IAAI,OAAM,wDAAwD,eAAqB,KAE/F,MAAO,CAAE,IAAK,EAAI,QAAS,UAAS,QAAS,EAAI,QAAQ,KACxD,CAAE,QAAS,KAAK,SAEb,CAAE,MAAK,WAAY,EACzB,GAAI,CAAC,GAAO,CAAC,GAAW,CAAE,GAAI,YAAuB,WACnD,KAAM,IAAI,OAAM,8DAA8D,KAGhF,MAAO,CAAE,MAAK,aCzIX,WACL,EACA,EACA,EACa,CACb,MAAO,AAAG,QAAK,IAAM,CACnB,GAAI,GAAM,AAAG,kBAAgB,EAAG,EAAO,iBAAkB,EAAO,iBAAkB,EAAQ,QAC1F,SAAM,AAAG,MAAI,EAAK,EAAO,MAClB,ICNJ,YACL,EACA,EACA,EAAwB,GACX,CACb,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAO,AAAG,OACd,EACI,AAAG,MACH,AAAG,SAAO,EAAI,EAAiB,MAAqB,QAAS,CAAC,EAAG,GAAI,QACrE,EAAiB,MAAM,MAEvB,EAAuB,EAAG,EAAiB,MAA8B,CAAC,EAAG,KAE7E,EAAO,EAAuB,EAAM,EAAiB,MAAO,CAAC,EAAG,IAEhE,EAAM,AAAG,OAAK,AAAG,MAAI,EAAM,IAC3B,EAAO,EAAuB,EAAK,EAAiB,MAAO,CAAC,EAAG,IAErE,MAAO,AAAG,QAAK,AAAG,MAAI,EAAM,AAAG,MAAI,EAAM,OAItC,YACL,EACA,EACA,EAAwB,GACxB,EAAuB,GACV,CACb,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAO,AAAG,OACd,EACI,AAAG,MACH,AAAG,SAAO,EAAI,EAAiB,MAAqB,QAAS,EAAc,CAAC,EAAG,GAAK,CAAC,EAAG,GAAI,QAC5F,EAAiB,MAAM,MAEvB,EAAuB,EAAG,EAAiB,MAA8B,EAAc,CAAC,EAAG,GAAK,CAAC,EAAG,KAEpG,EAAO,EAAuB,EAAM,EAAiB,MAAO,CAAC,EAAG,IAEhE,EAAM,AAAG,OAAK,AAAG,MAAI,EAAM,IAC3B,EAAO,EAAuB,EAAK,EAAiB,MAAO,CAAC,EAAG,IAE/D,EAAM,AAAG,OAAK,AAAG,MAAI,EAAM,AAAG,MAAI,EAAM,KACxC,EAAO,EAAuB,EAAK,EAAiB,MAAO,CAAC,EAAG,IAErE,MAAO,AAAG,QAAK,AAAG,MAAI,EAAM,AAAG,MAAI,EAAM,AAAG,MAAI,EAAM,QChDnD,YACL,EACA,EACA,EAA4B,OAC5B,EAAoB,GACP,CACb,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAM,AAAG,MACb,AAAG,SAAO,EAAG,EAAO,QAAS,CAAC,EAAG,GAAI,GACrC,EAAO,MAGT,MAAO,GAAW,AAAG,OAAK,GAAO,ICd9B,WAAoC,EAAgB,EAA+B,CACxF,OAAO,KAAK,GAAW,QAAQ,AAAC,GAAS,CACvC,AAAK,EAAc,KAAK,AAAC,GAAO,EAAG,eAAiB,IAClD,EAAU,GAAM,YCDf,YACL,EACA,EACA,CACA,MAAO,CACL,EACA,EACA,EACA,IACe,CACf,GAAM,GAAU,AAAG,WACjB,EAAe,EAAa,EAAc,EAAa,GACvD,CAAC,EAAY,EAAY,EAAY,IAEjC,EAAO,AAAG,WAAS,EAAe,IAExC,SAAc,KACZ,CAAE,UAAW,GAAG,aAChB,CAAE,UAAW,GAAG,WAGX,CAAE,UAAS,SCrBf,YACL,EACA,EACA,CACA,MAAO,CACL,EACA,EACA,IACa,CACb,GAAM,GAAa,AAAG,WAAS,EAAe,EAAa,GAAc,CAAC,EAAY,IAChF,EAAU,AAAG,WAAS,EAAe,IAE3C,SAAc,KACZ,CAAE,UAAW,GAAG,aAChB,CAAE,UAAW,GAAG,WAGX,CACL,QAAS,EACT,KAAM,ICHL,YAA0B,CAE/B,YAES,EAEA,EAEA,EAEP,CANO,wBAEA,wBAEA,cCxBJ,YACL,EACA,EACA,CACA,MAAO,CAAC,EAAoB,EAAqB,IAA8C,CAC7F,GAAM,GAAmB,AAAG,WAAS,EAAe,EAAI,EAAI,GAAa,CAAC,EAAG,EAAG,EAAY,IACtF,EAAmB,AAAG,WAAS,EAAe,EAAa,GAAc,CAAC,EAAG,EAAG,EAAY,IAC5F,EAAO,AAAG,WAAS,EAAe,IAExC,SAAc,KACZ,CAAE,UAAW,GAAG,sBAChB,CAAE,UAAW,GAAG,sBAChB,CAAE,UAAW,GAAG,WAGX,GAAI,IACT,EACA,EACA,IAKC,YAEL,EACA,CACA,MAAO,AAAC,IAAwC,CAC9C,GAAM,GAAmB,EAAgC,GAAG,qBAA2B,GACjF,EAAmB,EAAgC,GAAG,qBAA2B,GACjF,EAAO,EAAgC,GAAG,SAAe,GAE/D,MAAO,IAAI,IACT,EACA,EACA,ICpCC,WAAmC,EAAgB,EAA+B,CACvF,MAAO,CAAC,EAAsB,EAAmB,IAAwB,CACvE,GAAM,GAAS,EAAU,GAEzB,GAAI,CAAC,GAAS,EAAQ,GACpB,KAAM,IAAI,OAAM,sBAAsB,oBAA+B,oBAA4B,KAGnG,SAAc,KACZ,CAAE,eAAc,UAAW,GAAc,IAGpC,GCfJ,WAA+B,EAAuB,CAC3D,GAAI,GAAmB,EAEvB,WAAwB,EAAkC,CACxD,GAAM,GAAM,EAAiB,MAAM,EAAG,GACtC,SAAmB,EAAiB,MAAM,GACnC,EAGT,YAA6C,CAC3C,MAAO,GAGT,MAAO,CACL,iBACA,uBCZG,YAA2B,EAAwC,EAA+B,CACvG,GAAM,GAAoB,GAAyB,EAAgB,GAC7D,EAA6B,GAAkC,EAAgB,GAErF,WAAkC,EAAoB,EAAqB,EAAsB,EAAwB,GAA0B,CACjJ,GAAM,GAAQ,EACV,EAAkB,EAAY,EAAa,EAAG,GAAG,WACjD,EAA2B,EAAY,EAAa,GAAG,WACrD,EAAQ,EAA2B,EAAa,EAAa,GAAG,WAChE,EAAQ,EAA2B,EAAa,EAAa,GAAG,WAEtE,MAAO,CAAE,QAAO,QAAO,SAGzB,WAAkC,EAAoB,EAAqB,EAAsB,EAAwB,GAA0B,CACjJ,GAAM,CAAE,QAAO,QAAO,SAAU,EAAyB,EAAY,EAAa,EAAc,GAC1F,EAAQ,EAA2B,EAAa,EAAa,GAAG,WAEtE,MAAO,CACL,QAAO,QAAO,QAAO,SAIzB,MAAO,CACL,2BACA,4BCxBG,YAAuB,EAA8F,CAC1H,GAAM,GAAgC,GAEhC,CACJ,iBACA,uBACE,EAAsB,GAEpB,CACJ,4BACE,GAAkB,EAAgB,GAEhC,EAAS,EAAyB,EAAG,GAAI,SAAU,IACnD,EAAS,EAAyB,GAAI,GAAI,UAC1C,EAAS,EAAyB,GAAI,IAAK,UAC3C,EAAS,EAAyB,IAAK,IAAK,UAElD,GAAI,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAG1E,MAAO,CACL,gBACA,OAAQ,CACN,SAAQ,SAAQ,SAAQ,WCvBvB,YAA+B,EAAuE,CAC3G,MAAO,AAAC,IAA+B,CACrC,GAAM,GAAU,EAAgC,GAAG,YAAkB,GAC/D,EAAO,EAAgC,GAAG,SAAe,GAE/D,MAAO,CAAE,UAAS,SCNf,YAA2B,EAAgB,EAA+B,CAC/E,GAAM,GAAqB,EAA0B,EAAW,GAE1D,EAAoB,GAAsB,GAC1C,EAA6B,GAA+B,GAElE,WAAkC,EAAgB,EAAwB,GAA0B,CAClG,GAAM,GAAQ,EACV,EAAkB,GAAG,WACrB,EAA2B,GAAG,WAC5B,EAAQ,EAA2B,GAAG,WACtC,EAAQ,EAA2B,GAAG,WAE5C,MAAO,CAAE,QAAO,QAAO,SAGzB,WAAkC,EAAgB,EAAwB,GAA0B,CAClG,GAAM,GAAQ,EACV,EAAkB,GAAG,WACrB,EAA2B,GAAG,WAC5B,EAAQ,EAA2B,GAAG,WACtC,EAAQ,EAA2B,GAAG,WACtC,EAAQ,EAA2B,GAAG,WAE5C,MAAO,CACL,QAAO,QAAO,QAAO,SAIzB,MAAO,CACL,2BACA,4BC7BG,YACL,EACuE,CACvE,GAAM,GAAgC,GAEhC,CACJ,4BACE,GAAkB,EAAW,GAE3B,EAAS,CACb,OAAQ,EAAyB,SAAU,IAC3C,OAAQ,EAAyB,UACjC,OAAQ,EAAyB,UACjC,OAAQ,EAAyB,WAGnC,SAA2B,EAAW,GAE/B,CAAE,SAAQ,iBCdZ,oBAAmC,EAAuG,CAC/I,aAAc,CACZ,MAAM,wBAGD,aAAa,EAA8B,CAChD,GAAM,CAAE,UAAW,KAEnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,sDAGlB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAc,AAAG,OAAK,EAAM,cAAc,IAAK,IAAO,WAEtD,EAAa,EAAU,EADb,CAAC,QAAS,QAAS,UACgB,IAAI,KAEnD,EAAM,GAAY,EAAY,EAAO,OAAQ,IACjD,SAAM,GAAY,EAAK,EAAO,QAC9B,EAAM,GAAY,EAAK,EAAO,QAC9B,EAAM,GAAY,EAAK,EAAO,QAC9B,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,SAE/B,SAIE,SAAQ,EAAwC,CAC3D,MAAO,MAAK,aAAa,KAAM,GAAW,IAGlC,qBAA8B,CACtC,MAAO,+BAGC,2BAA2B,EAA8B,CACjE,MAAO,IAA2B,GAG1B,cAAc,EAAuB,CAC7C,MAAO,IAAc,KC9ClB,YACL,EACA,EACa,CACb,MAAO,AAAG,QAAK,IAAM,AAAG,MACtB,AAAG,SAAO,EAAG,EAAO,SACpB,EAAO,OCPJ,YAAuB,EAAuB,EAAoB,EAA2E,CAClJ,GAAM,GAAgC,GAEhC,CACJ,iBACA,uBACE,EAAsB,GAIpB,EAAK,AAFa,GAAuB,EAAgB,GAEpC,EAAY,EAAa,MAEpD,GAAI,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAG1E,MAAO,CACL,gBACA,OAAQ,CAAE,OChBP,YACL,EACsD,CACtD,GAAM,GAAgC,GAEhC,EAAqB,EAA0B,EAAW,GAEhE,WAAyB,EAA0B,CACjD,GAAM,GAAU,EAAmB,GAAG,YAAkB,GAClD,EAAO,EAAmB,GAAG,SAAe,GAClD,MAAO,CAAE,UAAS,QAGpB,GAAM,GAAS,CACb,GAAI,EAAgB,OAGtB,SAA2B,EAAW,GAE/B,CAAE,SAAQ,iBCtBZ,YAA4B,EAA8B,CAC/D,GAAM,GAAyC,GACzC,EAAmC,GAEzC,cAAO,KAAK,GAAW,QAAQ,AAAC,GAAQ,CACtC,GAAM,GAAM,EAAI,WAAW,MAAQ,EAAgB,EACnD,EAAI,GAAO,EAAU,KAGhB,CAAE,sBAAqB,iBCAzB,oBAGG,EAAyB,CAGjC,YAAY,EAAe,EAA+D,CACxF,MAAM,GACN,KAAK,sBAAwB,KAGpB,uBAAgE,CACzE,MAAO,MAAK,sBASP,OAAO,EAA4C,CACxD,GAAM,CAAE,UAAW,KAEnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,GAAG,KAAK,uCAG1B,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAqB,YAAiB,IACxC,KAAK,qBAAqB,aAAa,GACvC,EACJ,MAAO,IAAoB,EAAmB,KAAK,EAAmB,MAAM,GAAI,IAAK,EAAO,MAIzF,QAAQ,EAA4B,GAAM,CAC/C,KAAK,qBAAqB,QAAQ,GAClC,MAAM,QAAQ,GAGT,qBAAqB,EAAuB,CACjD,GAAM,CAAE,SAAQ,iBAAkB,KAAK,wBAAwB,GAC/D,KAAK,QAAU,EACf,KAAK,eAAiB,EAGjB,wBAAwB,EAAuB,CACpD,MAAO,IAAc,EAAS,KAAK,0BAA2B,KAAK,4BAG3D,2BAA2B,EAA8B,CACjE,GAAM,CAAE,sBAAqB,iBAAkB,GAAmB,GAElE,YAAK,qBAAqB,kBAAkB,GAErC,GAA2B,GAG1B,cAAc,EAAuB,CAC7C,GAAM,GAAM,KAAK,0BACX,EAAO,KAAK,2BACZ,EAAwB,EAAO,EAAO,EAEtC,EAA0B,EAAQ,MAAM,EAAG,EAAQ,OAAS,GAC5D,EAAoB,EAAQ,MAAM,EAAQ,OAAS,GAEzD,YAAK,qBAAqB,eAAe,GAClC,KAAK,wBAAwB,KC/EjC,GAAM,IAAyB,CAAC,UAAW,QAAS,MAAO,QAAS,UAAW,YAAa,aAE5F,QAAsB,CAe3B,YAAY,EAAwC,CAClD,GAAI,EAAc,SAAW,EAC3B,KAAM,IAAI,OAAM,8EAA8E,EAAc,UAG9G,GAAuB,QAAQ,CAAC,EAAY,IAAQ,CAClD,KAAK,GAAc,EAAc,KAIrC,eAAgB,CACd,MAAO,IACJ,IAAI,AAAC,GAAgB,EAAE,aAAY,YAAa,KAAK,MACrD,KAAK,CAAC,EAAI,IAAO,EAAG,YAAc,EAAG,eCtBrC,oBAAgC,GAA0C,CAC/E,YAAY,EAA6C,GAAI,IAAwB,CACnF,MAAM,oBAAqB,GAGtB,aAAa,EAA4C,CAC9D,MAAO,AAAG,QAAK,IAAM,AAAG,UAAQ,KAAK,OAAO,UAGjC,SAAQ,EAAwC,CAC3D,MAAO,MAAK,aAAa,KAAM,GAAW,SAG/B,oBAAmB,EAAkB,CAChD,GAAM,GAAW,KAAM,GAAW,GAC5B,EAAM,KAAM,MAAK,aAAa,GAC9B,EAAsB,KAAM,SAAQ,IAAI,AAAG,UAAQ,GAAK,IAAI,KAAO,IAAM,CAC7E,GAAM,GAAO,EAAE,WACf,SAAE,UACK,KAET,EAAI,UAEJ,GAAM,GAAqB,EACxB,IAAI,AAAC,GAAiB,GAAI,IAAgB,IAE7C,MAAO,GAAS,aACZ,EACA,EAAmB,GAGf,qBAA8B,CACtC,MAAO,wBAGC,yBAAkC,CAC1C,MAAO,KAGC,0BAAmC,CAC3C,MAAO,KC1CJ,YAA+B,EAA0C,CAC9E,MAAO,GAAI,sBAAuB,IAG7B,YAGL,EACA,EAC8B,CAE9B,MAAO,IAAK,KADM,CAAE,gBCPf,YACL,EACA,EACA,EAAgB,GAChB,EACA,CAGA,AAF6B,OAAM,QAAQ,GAAmB,EAAkB,CAAC,IAE5D,QAAQ,AAAC,GAAM,CAElC,GAAM,GAAO,YAAa,IACtB,EACC,GAAsB,GAAK,EAAE,YAAc,OAChD,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,mHAIlB,GAAM,GAAmB,AADV,EAAK,gBACY,OAAO,AAAC,GAAc,EAAU,YAAc,GAExE,EAAS,EAAoB,GAC/B,EAAE,UAAU,IAAI,WACf,GAAmB,GAAI,GAAM,EAAG,GAMrC,AAJsB,GAAI,IACxB,EAAiB,IAAI,AAAC,GAAc,GAAG,EAAU,eAAe,GAAM,EAAU,iBAChF,GAEY,KAAK,KCvBhB,YAA6B,EAA0E,CAC5G,MAAO,GAAoB,IAEtB,EAAI,oBAAwB,IAE5B,EAAI,6BAAiC,IAErC,EAAI,sBAA0B,GAGrC,YAA4B,EAAM,CAEhC,GAAM,GAAU,CAAC,EAAI,EAAI,EAAI,IAAQ,KAAK,MAAM,EAAK,EAAI,EAAK,GAAM,KAAK,GAGnE,EAAU,AAAC,GAAW,EAAQ,IAAO,KAAK,GAE1C,EAAQ,CAAE,KAA0B,OAAW,MAA2B,OAAW,IAAyB,QAEpH,GAAI,CAAC,GAAQ,CAAC,EAAK,YAAc,EAAK,WAAW,SAAW,GAAI,MAAO,GACvE,GAAM,GAAK,EAAK,WAOhB,EAAM,KAAO,CAAC,EAAQ,EAAG,IAAI,GAAI,EAAG,IAAI,GAAI,EAAG,IAAI,GAAI,EAAG,IAAI,IAK9D,EAAM,MAAQ,EAAQ,EAAG,KAAK,IAAI,EAAG,GAAG,GAAK,EAAG,IAAI,IAAM,EAAG,IAAI,GAAI,KAAK,GAAI,KAAK,IAAI,EAAG,IAAI,GAAK,EAAG,IAAI,IAAM,EAAG,IAAI,IAMvH,GAAM,GAAS,EAAG,OAAO,CAAC,EAAM,IAAS,EAAO,EAAI,GAAK,EAAO,EAAI,GAAK,UACnE,EAAM,EAAG,OAAO,CAAC,EAAM,IAAS,EAAO,EAAI,GAAK,EAAO,EAAI,GAAK,WACtE,SAAM,IAAM,KAAK,GAAM,GAAK,SAAS,QAAW,GAAM,GAAU,IAAO,GAEhE,EAGF,YAEoD,EAAoB,EAAgF,CAC7J,GAAM,CAAE,IAAK,GAAU,EAAU,UAC3B,EAAY,EAAmB,QAAwB,EAAM,EAAG,EAAM,GAEtE,EAAO,EAAU,QACjB,CAAE,aAAc,EAAU,UAC1B,EAAc,GAAI,GAAc,EAAU,UAAU,MAAO,EAAK,QAAQ,EAAU,WAAY,GAC9F,EAAQ,GAAmB,GASjC,MAAO,IAAK,KAPM,CAChB,YACA,qBACA,cACA,UCxDG,YAA+B,CAapC,YAAY,EAAqC,GAAI,CACnD,GAAM,CACJ,YAAY,GAAM,aAAa,GAAM,YAAW,YAAW,YAAW,cACpE,EACJ,KAAK,UAAY,EACjB,KAAK,WAAa,EAClB,KAAK,UAAY,GAAa,EAC9B,KAAK,UAAY,GAAa,EAC9B,KAAK,UAAY,GAAa,uBAC9B,KAAK,WAAa,GAAc,yBAI7B,QAAwB,CAK7B,YACE,EACA,EAAqC,GACrC,CACA,KAAK,cAAgB,EACrB,KAAK,QAAU,GAAI,IAAyB,GAG9C,KAAK,EAAkE,CACrE,GAAM,GAAM,EAAoB,GAE1B,CACJ,YAAW,aAAY,YAAW,YAAW,YAAW,cACtD,KAAK,QAcT,GAZI,GAAa,KAAK,wBAAyB,KAC7C,GAAI,YAAc,EAClB,EAAI,UAAY,EAChB,EAAY,EAAK,KAAK,cAAc,iBACpC,EAAY,EAAK,KAAK,cAAc,kBACpC,EAAY,EAAK,KAAK,cAAc,mBACpC,EAAY,EAAK,KAAK,cAAc,WACpC,EAAY,EAAK,KAAK,cAAc,aAAc,IAClD,EAAY,EAAK,KAAK,cAAc,cAAe,IACnD,EAAY,EAAK,KAAK,cAAc,WAAY,KAG9C,EAAY,CACd,EAAI,YAAc,EAClB,EAAI,UAAY,EAEhB,GAAM,GAAY,AAAC,GAAe,CAChC,EAAI,YACJ,EAAI,IAAI,EAAG,EAAG,EAAG,EAAG,EAAW,EAAG,EAAI,KAAK,IAC3C,EAAI,QAEN,KAAK,cAAc,UAAU,QAAQ,MAOpC,YACL,EACA,EACA,CAEA,AAD2B,OAAM,QAAQ,GAAiB,EAAgB,CAAC,IACxD,QAAQ,AAAC,GAAM,CAEhC,GAAM,GAAY,YAAa,GAC3B,EACC,GAAoB,GAAK,EAAE,UAAY,OAC5C,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,gIAGlB,GAAI,IAAkB,GAAW,KAAK,oBCrG1C,YAA2B,EAAwC,EAA+B,CAChG,GAAM,GAAoB,GAAyB,EAAgB,GAC7D,EAA6B,GAAkC,EAAgB,GAErF,WAAqC,EAAoB,EAAqB,EAA4C,CACxH,GAAM,GAAkB,EAA2B,EAAY,EAAa,GAAG,qBACzE,EAAkB,EAA2B,EAAa,EAAa,GAAG,qBAC1E,EAAiB,EAAkB,EAAY,EAAa,EAAG,GAAG,oBAExE,MAAO,CAAE,kBAAiB,kBAAiB,kBAG7C,WAAgC,EAAkB,EAAuC,CACvF,GAAM,GAAkB,EAA2B,EAAU,EAAU,GAAG,qBACpE,EAAkB,EAA2B,EAAU,EAAU,GAAG,qBACpE,EAAkB,EAA2B,EAAU,EAAU,GAAG,qBAE1E,MAAO,CAAE,kBAAiB,kBAAiB,mBAG7C,MAAO,CACL,oBACA,6BACA,8BACA,0BAIG,YAAuB,EAAuB,EAAsF,CACzI,GAAM,GAAgC,GAEhC,CACJ,iBACA,uBACE,EAAsB,GAEpB,CACJ,oBACA,6BACA,8BACA,0BACE,GAAkB,EAAgB,GAEhC,EAAqB,EAAkB,EAAG,GAAI,EAAG,sBACjD,EAA+B,EAA4B,GAAI,GAAI,gCACnE,EAA+B,EAA4B,GAAI,IAAK,gCAEpE,EAAa,CACjB,QAAS,EACT,kBAAmB,EACnB,kBAAmB,GAGf,EAAc,GACpB,EAAM,EAAe,EAAG,GAAG,QAAQ,AAAC,GAAQ,CAC1C,EAAY,cAAc,KAAS,EAAuB,IAAK,0BAA0B,OAG3F,GAAM,GAA4B,EAA4B,IAAK,IAAK,6BAClE,EAA2B,EAA2B,IAAK,IAAK,4BAEhE,EAAY,CAChB,gBAAiB,EACjB,eAAgB,GAGlB,GAAI,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAG1E,MAAO,CACL,gBACA,OAAQ,CAAE,aAAY,cAAa,cCtEvC,YAA2B,EAAgB,EAA+B,CACxE,GAAM,GAAqB,EAA0B,EAAW,GAE1D,EAAoB,GAAsB,GAC1C,EAA6B,GAA+B,GAElE,WAAqC,EAA4C,CAC/E,GAAM,GAAkB,EAA2B,GAAG,qBAChD,EAAkB,EAA2B,GAAG,qBAChD,EAAiB,EAAkB,GAAG,oBAE5C,MAAO,CAAE,kBAAiB,kBAAiB,kBAG7C,WAAgC,EAAuC,CACrE,GAAM,GAAkB,EAA2B,GAAG,qBAChD,EAAkB,EAA2B,GAAG,qBAChD,EAAkB,EAA2B,GAAG,qBAEtD,MAAO,CAAE,kBAAiB,kBAAiB,mBAG7C,MAAO,CACL,oBACA,6BACA,8BACA,0BAIG,YACL,EACA,EAC+D,CAC/D,GAAM,GAAgC,GAEhC,CACJ,oBACA,6BACA,8BACA,0BACE,GAAkB,EAAW,GAE3B,EAAqB,EAAkB,sBACvC,EAA+B,EAA4B,gCAC3D,EAA+B,EAA4B,gCAE3D,EAAa,CACjB,QAAS,EACT,kBAAmB,EACnB,kBAAmB,GAGf,EAAc,GACpB,EAAM,EAAe,EAAG,GAAG,QAAQ,AAAC,GAAQ,CAC1C,EAAY,cAAc,KAAS,EAAuB,0BAA0B,OAGtF,GAAM,GAA4B,EAA4B,6BACxD,EAA2B,EAA2B,4BAEtD,EAAY,CAChB,gBAAiB,EACjB,eAAgB,GAGlB,SAA2B,EAAW,GAE/B,CAAE,OAAQ,CAAE,aAAY,cAAa,aAAa,iBChE3D,YAAc,EAAgB,EAAoB,EAAuC,CACvF,MAAO,AAAG,OAAI,AAAG,SAAO,EAAG,EAAO,QAAS,EAAQ,QAAS,EAAO,MAGrE,YAAwB,EAAgB,EAA8B,EAA2B,GAAmB,CAClH,GAAI,GAAM,EAAkB,AAAG,OAAK,GAAK,EACzC,SAAM,EAAuB,EAAK,EAAO,gBAAiB,CAAC,EAAG,IAC9D,EAAM,EAAuB,AAAG,OAAK,GAAM,EAAO,gBAAiB,CAAC,EAAG,IACvE,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,AAAG,MAAI,EAAK,GAAK,EAAG,EAAO,eAAgB,CAAC,EAAG,KAC9C,EAGT,YAAmB,EAAgB,EAAsC,CACvE,GAAI,GAAM,EAAuB,AAAG,OAAK,GAAI,EAAO,gBAAiB,CAAC,EAAG,IACzE,SAAM,EAAuB,AAAG,OAAK,GAAM,EAAO,gBAAiB,CAAC,EAAG,IACvE,EAAM,EAAuB,AAAG,OAAK,GAAM,EAAO,gBAAiB,CAAC,EAAG,IACvE,EAAM,AAAG,MAAI,EAAK,GACX,EAGF,oBAA2B,EAAkC,CAGlE,YAAY,EAAuB,CACjC,MAAM,gBACN,KAAK,eAAiB,EAGjB,aAAa,EAA8B,CAChD,GAAM,CAAE,UAAW,KACnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,8CAElB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAc,AAAG,OAAK,EAAM,cAAc,IAAK,IAAO,WAEtD,EAAa,EAAU,EADb,CAAC,QAAS,QAAS,UACgB,IAAI,KACnD,EAAM,AAAG,OAAK,GAAK,EAAY,EAAO,WAAW,QAAS,CAAC,EAAG,KAClE,SAAM,GAAe,EAAK,EAAO,WAAW,kBAAmB,IAC/D,EAAM,GAAe,EAAK,EAAO,WAAW,mBAC5C,EAAM,KAAK,eAAgB,EAAG,GAAG,QAAQ,AAAC,GAAQ,CAChD,EAAM,GAAU,EAAK,EAAO,YAAY,cAAc,QAExD,EAAM,GAAe,EAAK,EAAO,UAAU,iBAC3C,EAAM,AAAG,OAAK,EAAuB,EAAK,EAAO,UAAU,eAAgB,CAAC,EAAG,KACxE,SAIE,SAAQ,EAAwC,CAC3D,MAAO,MAAK,aAAa,KAAM,GAAW,IAGlC,qBAA8B,CACtC,MAAO,sBAGC,2BAA2B,EAA8B,CACjE,MAAO,IAA2B,EAAW,KAAK,gBAG1C,cAAc,EAAuB,CAC7C,MAAO,IAAc,EAAS,KAAK,kBCvEhC,YAAuB,EAA6E,CACzG,GAAM,GAAgC,GAEhC,CACJ,iBACA,uBACE,EAAsB,GAEpB,EAAkB,GAAuB,EAAgB,GAEzD,EAAM,EAAgB,IAAK,EAAG,UAC9B,EAAS,EAAgB,IAAK,EAAG,aAEvC,GAAI,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAG1E,MAAO,CACL,gBACA,OAAQ,CAAE,GAAI,CAAE,MAAK,YCjBlB,YACL,EACsD,CACtD,GAAM,GAAgC,GAEhC,EAAqB,EAA0B,EAAW,GAEhE,WAAyB,EAA0B,CACjD,GAAM,GAAU,EAAmB,GAAG,YAAkB,GAClD,EAAO,EAAmB,GAAG,SAAe,GAClD,MAAO,CAAE,UAAS,QAGpB,GAAM,GAAS,CACb,GAAI,CACF,IAAK,EAAgB,UACrB,OAAQ,EAAgB,eAI5B,SAA2B,EAAW,GAE/B,CAAE,SAAQ,iBCtBZ,GAAK,IAAL,UAAK,EAAL,CAEL,SAAS,SAET,OAAO,SAJG,aCML,oBAA2B,EAAyB,CAGzD,YAAY,EAAqC,GAAI,IAAa,GAAI,CACpE,MAAM,gBACN,KAAK,sBAAwB,KAGpB,uBAAqC,CAC9C,MAAO,MAAK,sBAGP,OAAO,EAA0C,CACtD,GAAM,CAAE,UAAW,KAEnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,GAAG,KAAK,uCAG1B,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAqB,YAAiB,IACxC,KAAK,qBAAqB,aAAa,GACvC,EAEE,EAAS,AAAG,UAAQ,EAAoB,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,SAAS,KAAK,EAAmB,MAAM,GAAI,IACnG,EAAM,GAAoB,EAAQ,EAAO,GAAG,KAAK,OACjD,EAAS,GAAoB,EAAQ,EAAO,GAAG,QACrD,MAAO,CAAE,MAAK,YAIX,aAAa,EAA0C,CAC5D,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,CAAE,MAAK,UAAW,KAAK,OAAO,GACpC,MAAO,CAAE,MAAK,OAAQ,AAAG,UAAQ,WAIxB,SAAQ,EAAsC,CACzD,MAAO,MAAK,aAAa,KAAM,GAAW,SAG/B,qBAAoB,EAA8E,CAC7G,GAAM,GAAW,KAAM,GAAW,GAC5B,EAAM,KAAM,MAAK,aAAa,GAE9B,EAAO,AAAG,UAAQ,EAAI,KACtB,EAAU,AAAG,UAAQ,EAAI,QACzB,EAAsB,EAAK,IAAI,CAAC,EAAW,IAAO,EACtD,YACA,aAAc,EAAQ,MAGlB,EAAqB,KAAM,SAAQ,IACvC,EAAoB,IAAI,MAAO,CAAE,YAAW,kBAAmB,CAC7D,GAAM,GAAO,EAAU,WAAY,GAC7B,EAAY,EAAa,WAAY,GACrC,EAAS,EAAW,GACpB,EAAS,EAAS,GAAO,KAAO,GAAO,OACvC,EAAoB,EAAS,EAAY,EAAI,EAEnD,SAAU,UACV,EAAa,UACN,CAAE,MAAK,SAAQ,wBAG1B,SAAI,IAAI,UACR,EAAI,OAAO,UAEJ,EAAS,aAAe,EAAiD,EAAmB,GAG3F,qBAA8B,CACtC,MAAO,mBAGF,QAAQ,EAA4B,GAAM,CAC/C,KAAK,qBAAqB,QAAQ,GAClC,MAAM,QAAQ,GAGT,qBAAqB,EAAuB,CACjD,GAAM,CAAE,SAAQ,iBAAkB,KAAK,wBAAwB,GAC/D,KAAK,QAAU,EACf,KAAK,eAAiB,EAGjB,wBAAwB,EAAuB,CACpD,MAAO,IAAc,GAGb,2BAA2B,EAA8B,CACjE,GAAM,CAAE,sBAAqB,iBAAkB,GAAmB,GAElE,YAAK,qBAAqB,kBAAkB,GAErC,GAA2B,GAG1B,cAAc,EAAuB,CAC7C,GAAM,GAAwB,IAAM,EAAI,EAAM,KAAM,EAAI,GAElD,EAA0B,EAAQ,MAAM,EAAG,EAAQ,OAAS,GAC5D,EAAoB,EAAQ,MAAM,EAAQ,OAAS,GAEzD,YAAK,qBAAqB,eAAe,GAClC,KAAK,wBAAwB,KC5GjC,oBAGG,GAAgC,CACjC,YAAY,EAAqB,EAAmB,EAAgD,CACzG,GAAM,GAAkB,EAAmB,IAAI,CAAC,CAAE,QAAO,YAAa,CACpE,GAAM,GAAQ,EAAY,KAAK,IAAI,EAAQ,GAC3C,MAAO,CACL,MAAO,EAAQ,EACf,OAAQ,EAAS,KAIf,EAAY,EAAgB,OAElC,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAA0B,CAAC,EAAe,IAAkB,AAAG,QAAM,CAAC,AAAG,OAAK,CAAC,IAAK,EAAO,WAAY,AAAG,OAAK,CAAC,IAAK,EAAO,YAAa,GAAG,KAAK,EAAG,KAAK,OAGzJ,EAAa,CAAC,EAAkB,IAAoD,CACxF,GAAM,CAAE,QAAO,UAAW,EAAgB,GAC1C,MAAO,GAAK,EAAO,GAAU,KAAK,IAAI,EAAQ,GAAU,EAAI,GAGxD,EAAc,AAAC,GAAqB,EAAW,EAAU,CAAC,EAAG,IAAM,EAAI,GACvE,EAAc,AAAC,GAAqB,EAAW,EAAU,CAAC,EAAG,IAAM,EAAI,GAa7E,MAXwB,GACrB,IAAI,AAAG,OAAK,CAAC,EAAW,KAAM,EAAW,YACzC,IAAI,AAAG,QAAM,MAAM,KAAK,MAAM,GAAY,CAAC,EAAG,IAAa,EAC1D,EAAY,GACZ,EAAY,OAEb,IAAI,AAAG,QAAM,MAAM,KAAK,MAAM,GAAY,CAAC,EAAG,IAAa,EAC1D,EAAgB,GAAU,MAC1B,EAAgB,GAAU,aAO3B,aAAa,EAA8B,CAChD,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAM,KAAK,OAAO,GACxB,MAAO,MAAK,YACV,EACA,EAAM,UACN,EAAM,gBAAgB,IAAI,CAAC,CAAC,EAAQ,KAAY,EAAE,SAAQ,mBAKnD,SAAQ,EAAwC,CAC3D,MAAO,MAAK,aAAa,KAAM,GAAW,SAG/B,iBAAgB,EAAgE,CAC3F,GAAM,GAAW,KAAM,GAAW,GAC5B,EAAkB,AAAG,OACzB,IAAM,AAAG,UAAQ,KAAK,aAAa,KAG/B,EAAoB,KAAM,SAAQ,IAAI,EAAgB,IAC1D,MAAO,EAAgB,IAAa,CAClC,GAAM,GAAiB,MAAM,KAAK,EAAe,YAC3C,EAAU,EAAe,OAAO,CAAC,EAAG,IAAM,GAAO,IACjD,EAAU,EAAe,OAAO,CAAC,EAAG,IAAM,CAAC,GAAO,IAExD,MAAO,IAAI,IACT,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC,EAAG,IAAM,GAAI,GAAM,EAAQ,GAAc,EAAQ,KACxE,CACE,OAAQ,EAAS,eAAe,GAChC,MAAO,EAAS,cAAc,QAMtC,SAAgB,QAAQ,AAAC,GAAM,EAAE,WAE1B,EAAS,aAAe,EAAyC,EAAkB,GAGlF,0BAAmC,CAC3C,MAAO,OC1FJ,oBAAgC,GAAkD,CACvF,YAAY,EAA6C,GAAI,IAAwB,CACnF,MAAM,oBAAqB,GAGnB,qBAA8B,CACtC,MAAO,yBAGC,yBAAkC,CAC1C,MAAO,OCRJ,YACL,EAC2E,CAC3E,GAAM,GAAgC,GAEhC,CACJ,4BACE,GAAkB,EAAW,GAE3B,EAAS,CACb,OAAQ,EAAyB,SAAU,IAC3C,OAAQ,EAAyB,UACjC,OAAQ,EAAyB,WAGnC,SAA2B,EAAW,GAE/B,CAAE,SAAQ,iBCnBZ,YAA2B,EAAkG,CAClI,GAAM,GAAgC,GAEhC,CACJ,iBACA,uBACE,EAAsB,GAEpB,CACJ,4BACE,GAAkB,EAAgB,GAEhC,EAAS,EAAyB,EAAG,GAAI,SAAU,IACnD,EAAS,EAAyB,GAAI,GAAI,UAC1C,EAAS,EAAyB,GAAI,IAAK,UAEjD,GAAI,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAG1E,MAAO,CACL,gBACA,OAAQ,CAAE,SAAQ,SAAQ,WChBvB,oBAAuC,EAA+G,CAC3J,aAAc,CACZ,MAAM,4BAGD,aAAa,EAA8B,CAChD,GAAM,CAAE,UAAW,KAEnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,0DAGlB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAc,AAAG,OAAK,EAAM,cAAc,IAAK,IAAO,WAEtD,EAAa,EAAU,EADb,CAAC,QAAS,QAAS,UACgB,IAAI,KAEnD,EAAM,GAAY,EAAY,EAAO,OAAQ,IACjD,SAAM,GAAY,EAAK,EAAO,QAC9B,EAAM,GAAY,EAAK,EAAO,QAC9B,EAAM,AAAG,UAAQ,EAAK,CAAC,GAAI,IAAK,CAAC,EAAG,GAAI,SAEjC,SAIE,SAAQ,EAAwC,CAC3D,MAAO,MAAK,aAAa,KAAM,GAAW,IAGlC,qBAA8B,CACtC,MAAO,oCAGC,2BAA2B,EAA8B,CACjE,MAAO,IAA+B,GAG9B,cAAc,EAAuB,CAC7C,MAAO,IAAkB,KC7CtB,oBAAoC,GAAsD,CAC/F,YAAY,EAAiD,GAAI,IAA4B,CAC3F,MAAM,wBAAyB,GAGvB,qBAA8B,CACtC,MAAO,8BAGC,yBAAkC,CAC1C,MAAO,OCVJ,oBAA8B,GAAkB,GCAhD,YAAe,EAAgB,EAAuC,CAC3E,MAAO,AAAG,OAAI,AAAG,MAAI,EAAG,EAAO,SAAU,EAAO,QCAlD,YACE,EACA,EACA,EACA,EACA,EAA4B,OACf,CACb,GAAM,CAAE,UAAS,QAAS,EAAO,KAE7B,EAAM,AAAG,SAAO,EAAG,EAAS,EAAS,GACzC,SAAM,AAAG,MAAI,EAAK,GAClB,EAAM,GAAM,EAAK,EAAO,OACjB,EAAW,AAAG,OAAK,GAAO,EAG5B,YAAc,EAAgB,EAAyB,CAC5D,MAAO,IAAU,EAAG,EAAQ,CAAC,EAAG,GAAI,IAG/B,YAAoB,EAAgB,EAAyB,CAClE,MAAO,IAAU,EAAG,EAAQ,CAAC,EAAG,GAAI,IAG/B,YAAkB,EAAgB,EAAyB,CAChE,MAAO,IAAU,EAAG,EAAQ,CAAC,EAAG,GAAI,GAAM,SCvB5C,YAA2B,EAAwC,EAA+B,CAChG,WAA6B,EAAyB,EAAoB,EAAiC,CACzG,GAAM,GAAU,EAAe,GACzB,EAAQ,EAAQ,OAAU,GAAa,EAAa,GAE1D,GAAI,GAAQ,GACV,KAAM,IAAI,OAAM,+BAA+B,sBAA0B,EAAQ,uBAAuB,kBAA2B,KAGrI,MAAO,AAAG,QACR,IAAM,AAAG,YACP,AAAG,WAAS,EAAS,CAAC,EAAY,EAAO,EAAY,IACrD,CAAC,EAAG,EAAG,EAAG,KAKhB,WACE,EACA,EACA,EACA,EACY,CACZ,GAAM,GAAU,EAAoB,EAAiB,EAAY,GAC3D,EAAO,AAAG,WAAS,EAAe,IAExC,SAAc,KACZ,CAAE,UAAW,GAAG,aAChB,CAAE,UAAW,GAAG,WAGX,CAAE,UAAS,QAGpB,WAAiC,EAAoB,EAAwC,CAC3F,GAAM,GAAU,AAAG,WAAS,EAAe,IACrC,EAAS,AAAG,WAAS,EAAe,IAE1C,SAAc,KACZ,CAAE,UAAW,GAAG,aAChB,CAAE,UAAW,GAAG,aAGX,CACL,UACA,UAIJ,WACE,EACA,EACA,EACA,EACiB,CACjB,GAAM,GAAO,EAAkB,EAAiB,EAAY,EAAY,GAAG,UACrE,EAAQ,EAAwB,EAAY,GAAG,WAErD,MAAO,CAAE,OAAM,SAGjB,WACE,EACA,EACA,EACA,EACA,EAAkB,GACG,CACrB,GAAM,GAAQ,EAAwB,GAAS,GAAM,GAAK,EAAiB,EAAY,EAAY,GAAG,WAChG,EAAQ,EAAuB,EAAiB,EAAY,EAAY,GAAG,WAEjF,MAAO,CAAE,QAAO,SAGlB,MAAO,CACL,yBACA,8BAIG,YAAuB,EAA6E,CACzG,GAAM,CACJ,iBACA,uBACE,EAAsB,GAEpB,EAAgC,GAEhC,CACJ,yBACA,8BACE,GAAkB,EAAgB,GAEhC,EAAc,EAAuB,KAAM,GAAI,EAAG,eAClD,EAAW,EAA2B,KAAM,GAAI,EAAG,YACnD,EAAW,EAA2B,KAAM,GAAI,EAAG,YACnD,EAAW,EAA2B,KAAM,GAAI,EAAG,YAEnD,EAAc,EAA2B,MAAO,GAAI,EAAG,cAAe,IACtE,EAAW,EAA2B,MAAO,GAAI,EAAG,YACpD,EAAW,EAA2B,MAAO,GAAI,EAAG,YACpD,EAAW,EAA2B,MAAO,GAAI,EAAG,YAEpD,EAAe,EAA2B,OAAQ,IAAK,EAAG,eAAgB,IAC1E,EAAY,EAA2B,OAAQ,IAAK,EAAG,aACvD,EAAY,EAA2B,OAAQ,IAAK,EAAG,aAEvD,EAAe,EAA2B,OAAQ,IAAK,EAAG,eAAgB,IAC1E,EAAY,EAA2B,OAAQ,IAAK,EAAG,aACvD,EAAY,EAA2B,OAAQ,IAAK,EAAG,aACvD,EAAmB,EAA2B,OAAQ,IAAK,EAAG,oBAE9D,EAAK,AAAG,OACZ,IAAM,AAAG,YAAU,AAAG,WAAS,EAAe,IAAM,KAAM,CAAC,IAAK,MAAO,CAAC,EAAG,KAI7E,GAFA,EAAc,KAAK,CAAE,UAAW,OAE5B,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAsB1E,MAAO,CAAE,OAnBM,CACb,cACA,WACA,WACA,WACA,cACA,WACA,WACA,WACA,eACA,YACA,YACA,eACA,YACA,YACA,mBACA,MAGe,iBC5InB,YAA2B,EAAgB,EAA+B,CACxE,GAAM,GAAqB,EAA0B,EAAW,GAEhE,WAAiC,EAAkC,CACjE,GAAM,GAAU,EAAmB,GAAG,kBAAwB,GACxD,EAAS,EAAmB,GAAG,iBAAuB,GAE5D,MAAO,CAAE,UAAS,UAGpB,WAAgC,EAAiC,CAC/D,GAAM,GAAU,EAAmB,GAAG,iBAAuB,GACvD,EAAO,EAAmB,GAAG,cAAoB,GACjD,EAAQ,EAAwB,GAEtC,MAAO,CAAE,KAAM,CAAE,UAAS,QAAQ,SAGpC,WAAoC,EAAqC,CACvE,MAAO,CACL,MAAO,EAAuB,GAAG,WACjC,MAAO,EAAuB,GAAG,YAIrC,MAAO,CACL,yBACA,8BAIG,YACL,EACsD,CACtD,GAAM,GAAgC,GAEhC,CACJ,yBACA,8BACE,GAAkB,EAAW,GAE3B,EAAc,EAAuB,eACrC,EAAW,EAA2B,YACtC,EAAW,EAA2B,YACtC,EAAW,EAA2B,YAEtC,EAAc,EAA2B,eACzC,EAAW,EAA2B,YACtC,EAAW,EAA2B,YACtC,EAAW,EAA2B,YAEtC,EAAe,EAA2B,gBAC1C,EAAY,EAA2B,aACvC,EAAY,EAA2B,aAEvC,EAAe,EAA2B,gBAC1C,EAAY,EAA2B,aACvC,EAAY,EAA2B,aACvC,EAAmB,EAA2B,oBAE9C,CAAE,MAAO,EAGf,GAFA,EAAc,KAAK,CAAE,aAAc,KAAM,UAAW,OAEhD,CAAC,GAAW,GACd,KAAM,IAAI,OAAM,yDAAyD,KAG3E,GAAM,GAAS,CACb,cACA,WACA,WACA,WACA,cACA,WACA,WACA,WACA,eACA,YACA,YACA,eACA,YACA,YACA,mBACA,MAGF,SAA2B,EAAW,GAE/B,CAAE,SAAQ,iBCzFZ,WAAkB,EAAgB,EAA0C,CACjF,GAAI,GAAM,GAAK,EAAG,EAAO,OACzB,SAAM,GAAW,EAAK,EAAO,OAC7B,EAAM,AAAG,MAAI,EAAK,GAClB,EAAM,AAAG,OAAK,GACP,EAGF,YAAsB,EAAgB,EAA0C,CACrF,GAAI,GAAM,GAAS,EAAG,EAAO,OAC7B,EAAM,GAAW,EAAK,EAAO,OAE7B,GAAI,GAAS,AAAG,UAAQ,EAAG,EAAG,EAAG,SAC3B,EAAQ,AAAG,QAAkB,EAAO,OACpC,EAAQ,EAAO,MAAM,KAAO,EAAI,MAAM,GAG5C,GAFsB,EAAO,MAAM,KAAO,EAAI,MAAM,IAAM,EAAO,MAAM,KAAO,EAAI,MAAM,GAErE,CACjB,GAAM,GAAY,CAAC,GAAG,EAAI,OAC1B,EAAU,GAAK,EACf,GAAM,GAAS,AAAG,QAAkB,GACpC,EAAM,AAAG,SAAO,CAAC,EAAK,GAAS,GAE/B,GAAM,GAAY,CAAC,GAAG,EAAI,OAC1B,EAAU,GAAK,EACf,GAAM,GAAS,AAAG,QAAkB,GACpC,EAAM,AAAG,SAAO,CAAC,EAAK,GAAS,GAGjC,SAAS,EAAQ,AAAG,SAAO,CAAC,EAAQ,GAAQ,GAAK,EACjD,EAAM,AAAG,MAAI,EAAQ,GAErB,EAAM,AAAG,OAAK,GACP,EC3BF,oBAAiC,EAAyB,CAC/D,aAAc,CACZ,MAAM,sBAGD,aAAa,EAA8B,CAChD,GAAM,CAAE,UAAW,KAEnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,oDAGlB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAc,AAAG,OAAK,EAAM,cAAc,IAAK,IAAO,WAGtD,EAAa,EAAU,EADb,CAAC,QAAS,QAAS,UACgB,IAAI,KAEnD,EAAM,GAAS,EAAY,EAAO,aACtC,EAAM,AAAG,UAAQ,EAAK,EAAG,EAAG,SAE5B,EAAM,EAAS,EAAK,EAAO,UAC3B,EAAM,EAAS,EAAK,EAAO,UAC3B,EAAM,EAAS,EAAK,EAAO,UAE3B,EAAM,GAAa,EAAK,EAAO,aAC/B,EAAM,EAAS,EAAK,EAAO,UAC3B,EAAM,EAAS,EAAK,EAAO,UAC3B,EAAM,EAAS,EAAK,EAAO,UAE3B,EAAM,GAAa,EAAK,EAAO,cAC/B,EAAM,EAAS,EAAK,EAAO,WAC3B,EAAM,EAAS,EAAK,EAAO,WAE3B,EAAM,GAAa,EAAK,EAAO,cAC/B,EAAM,EAAS,EAAK,EAAO,WAC3B,EAAM,EAAS,EAAK,EAAO,WAC3B,EAAM,GAAa,EAAK,EAAO,kBAE/B,GAAM,GAAY,EAAI,KAAK,CAAC,EAAG,IAG/B,MAFuB,AAAG,UAAO,EAAW,EAAO,WAM1C,SAAQ,EAAwC,CAC3D,MAAO,MAAK,aAAa,KAAM,GAAW,SAG/B,uBAAsB,EAAwD,CA7D7F,MA8DI,GAAI,oBAAO,QAAP,cAAc,KAAK,AAAC,GAAQ,GAAO,GAAI,MAAO,IAAI,cAAa,KACnE,GAAM,GAAW,KAAM,GAAW,GAC5B,EAAwB,AAAG,OAAK,IAAM,AAAG,UAAQ,KAAK,aAAa,KACnE,EAA0B,KAAM,SAAQ,IAAI,EAAsB,IAAI,AAAC,GAAM,EAAE,SACrF,SAAsB,QAAQ,AAAC,GAAM,EAAE,WAChC,EAAS,aAAe,EAA0B,EAAwB,GAGzE,qBAA8B,CACtC,MAAO,yBAGC,2BAA2B,EAA8B,CACjE,MAAO,IAA2B,GAG1B,cAAc,EAAuB,CAC7C,MAAO,IAAc,KC3ElB,YAAkC,EAAuB,CAC9D,GAAM,GAAM,GAAI,IAChB,SAAI,eAAe,GACZ,ECHF,YAGL,EACA,EAC6B,CAE7B,MAAO,IAAK,KADM,CAAE,eCNf,YAAmB,EAA8B,CACtD,MAAO,OAAO,GAAI,KAAQ,SAGrB,YAGL,EACA,EACkB,CAElB,MAAO,IAAK,KADM,CAAE,QCNf,YAAsB,EAAiC,CAC5D,MAAQ,GAAI,SAAW,GAAO,MAAQ,EAAI,SAAW,GAAO,SACvD,GAAmB,EAAI,mBAGvB,YAGL,EACA,EACA,EACqB,CAErB,MAAO,IAAK,KADM,CAAE,SAAQ,sBCf9B,YAA2B,EAAwC,EAA+B,CAChG,WAAoC,EAAqB,EAAuD,CAC9G,GAAM,GAAU,AAAG,WAAS,EAAe,EAAI,EAAI,GAAc,CAAC,EAAG,EAAG,EAAa,IAC/E,EAAmB,AAAG,WAAS,EAAe,IAC9C,EAAoB,AAAG,WAAS,EAAe,IAC/C,EAAkB,AAAG,WAAS,EAAe,IAC7C,EAAsB,AAAG,WAAS,EAAe,IAEvD,SAAc,KACZ,CAAE,UAAW,GAAG,aAChB,CAAE,UAAW,GAAG,sBAChB,CAAE,UAAW,GAAG,uBAChB,CAAE,UAAW,GAAG,qBAChB,CAAE,UAAW,GAAG,0BAGX,CACL,UACA,mBACA,oBACA,kBACA,uBAIJ,WACE,EACA,EACA,EACA,EACA,EACY,CACZ,GAAM,GAAU,AAAG,WACjB,EAAe,EAAa,EAAc,EAAa,GACvD,CAAC,EAAY,EAAY,EAAY,IAEjC,EAAO,AAAG,WAAS,EAAe,IAExC,SAAc,KACZ,CAAE,UAAW,GAAG,aAChB,CAAE,UAAW,GAAG,KAAgB,EAAkB,oBAAsB,WAGnE,CAAE,UAAS,QAGpB,WACE,EACA,EACA,EACA,EACqB,CACrB,GAAM,CACJ,UACA,QACE,EAAkB,EAAY,EAAa,EAAY,EAAc,IAEzE,MAAO,CACL,UACA,kBAAmB,GAIvB,WACE,EACA,EACA,EAC4B,CAC5B,GAAM,GAAiB,EAA2B,EAAY,GAAG,oBAC3D,EAAiB,EAA2B,EAAY,EAAa,EAAG,GAAG,oBAEjF,MAAO,CAAE,iBAAgB,kBAG3B,YAAwD,CACtD,GAAM,GAAS,EAA2B,EAAG,GAAI,EAAG,sBAC9C,EAAS,EAAsB,GAAI,GAAI,sBACvC,EAAS,EAAsB,GAAI,IAAK,sBACxC,EAAS,EAAsB,IAAK,IAAK,sBACzC,EAAS,EAAsB,IAAK,IAAK,sBACzC,EAAS,EAAsB,IAAK,IAAK,sBACzC,EAAS,EAAsB,IAAK,IAAK,sBACzC,EAAS,EAAsB,IAAK,IAAK,sBACzC,EAAS,EAAsB,IAAK,IAAK,sBACzC,EAAS,EAAsB,IAAK,IAAK,sBACzC,EAAU,EAAsB,IAAK,IAAK,uBAC1C,EAAU,EAAsB,IAAK,IAAK,uBAC1C,EAAU,EAAsB,IAAK,KAAM,uBAC3C,EAAU,EAAsB,KAAM,KAAM,uBAClD,MAAO,CACL,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,UACA,UACA,WAIJ,YAA+D,CAC7D,GAAM,GAAS,EAA2B,KAAM,IAAK,EAAG,2BAClD,EAAS,EAA2B,IAAK,IAAK,EAAG,2BACjD,EAAS,EAA2B,IAAK,IAAK,EAAG,2BACjD,EAAS,EAA2B,IAAK,IAAK,EAAG,2BACjD,EAAS,EAA2B,IAAK,IAAK,EAAG,2BACjD,EAAS,EAA2B,IAAK,IAAK,EAAG,2BACjD,EAAS,EAA2B,IAAK,GAAI,EAAG,2BAChD,EAAS,EAA2B,GAAI,IAAK,EAAG,2BAChD,EAA2B,EAAkB,IAAK,GAAI,EAAG,2DACzD,EAAoB,EAAkB,IAAK,EAAG,EAAG,oDACjD,EAA2B,EAAkB,KAAM,GAAI,EAAG,2DAC1D,EAAoB,EAAkB,KAAM,GAAI,EAAG,oDACnD,EAA2B,EAAkB,IAAK,GAAI,EAAG,2DACzD,EAAoB,EAAkB,IAAK,GAAI,EAAG,oDAClD,EAA2B,EAAkB,IAAK,GAAI,EAAG,2DACzD,EAAoB,EAAkB,IAAK,GAAI,EAAG,oDAClD,EAA2B,EAAkB,IAAK,GAAI,EAAG,2DACzD,GAAoB,EAAkB,IAAK,GAAI,EAAG,oDAClD,GAA2B,EAAkB,IAAK,GAAI,EAAG,2DACzD,GAAoB,EAAkB,IAAK,GAAI,EAAG,oDA0BxD,MAAO,CACL,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,gBAjCsB,CACtB,uBAAwB,EACxB,gBAAiB,GAgCjB,gBA9BsB,CACtB,uBAAwB,EACxB,gBAAiB,GA6BjB,gBA3BsB,CACtB,uBAAwB,EACxB,gBAAiB,GA0BjB,gBAxBsB,CACtB,uBAAwB,EACxB,gBAAiB,GAuBjB,gBArBsB,CACtB,uBAAwB,EACxB,gBAAiB,IAoBjB,gBAlBsB,CACtB,uBAAwB,GACxB,gBAAiB,KAoBrB,MAAO,CACL,2BACA,gCAIG,YAAuB,EAA6E,CACzG,GAAM,GAAgC,GAChC,CACJ,iBACA,uBACE,EAAsB,GACpB,CACJ,2BACA,gCACE,GAAkB,EAAgB,GAChC,EAAc,IACd,EAAmB,IAKnB,EAAe,CACnB,UALgB,AAAG,WACnB,EAAe,KAAO,GACtB,CAAC,EAAG,KAAM,KAMZ,GADA,EAAc,KAAK,CAAE,UAAW,2BAC5B,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAG1E,MAAO,CACL,OAAQ,CACN,cACA,mBACA,gBAEF,iBC9MJ,YAA2B,EAAgB,EAA+B,CACxE,GAAM,GAAqB,EAA0B,EAAW,GAEhE,WAAoC,EAAgB,EAAa,EAA2C,CAC1G,GAAM,GAAU,EAAmB,GAAG,YAAiB,sBAAyB,EAAG,GAAG,aAChF,EAAoB,EAAmB,GAAG,YAAiB,oCAAuC,EAAG,GAAG,uBAC9G,MAAO,CAAE,UAAS,qBAGpB,WAA+B,EAAyC,CACtE,GAAM,GAAe,oBAAoB,IACnC,EAAsB,sBAAsB,cAC5C,EAA4B,GAAG,mBAC/B,EAA4B,GAAG,mBAE/B,EAAU,EAAmB,GAAG,sBAAyC,EAAG,GAAG,aAC/E,EAAmB,EAAmB,GAAG,oBAAuC,EAAG,GAAG,sBACtF,EAAoB,EAAmB,GAAG,mBAAsC,EAAG,GAAG,uBACtF,EAAkB,EAAmB,GAAG,0BAA6C,EAAG,GAAG,qBAC3F,EAAsB,EAAmB,GAAG,8BAAiD,EAAG,GAAG,yBAEzG,MAAO,CACL,eAAgB,CACd,UACA,mBACA,oBACA,kBACA,uBAEF,eAAgB,EAA2B,cAAe,EAAK,IAInE,YAAwD,CACtD,MAAO,CACL,OAAQ,EAA2B,cAAe,EAAG,sBACrD,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,OAAQ,EAAsB,GAC9B,QAAS,EAAsB,IAC/B,QAAS,EAAsB,IAC/B,QAAS,EAAsB,IAC/B,QAAS,EAAsB,KAInC,WAA2B,EAAgB,EAAkC,CAC3E,GAAM,GAAU,EAAmB,GAAG,YAAkB,EAAG,GAAG,aACxD,EAAO,EAAmB,GAAG,WAAiB,EAAG,GAAG,UAC1D,MAAO,CAAE,UAAS,QAGpB,WAAmC,EAAkC,CACnE,GAAM,GAAyB,EAC7B,2BAA2B,yBAC3B,kCAAkC,4BAE9B,EAAkB,EACtB,2BAA2B,mBAC3B,kCAAkC,qBAEpC,MAAO,CAAE,yBAAwB,mBAGnC,YAA+D,CAC7D,MAAO,CACL,OAAQ,EAA2B,aAAc,EAAG,2BACpD,OAAQ,EAA2B,aAAc,EAAG,2BACpD,OAAQ,EAA2B,aAAc,EAAG,2BACpD,OAAQ,EAA2B,aAAc,EAAG,2BACpD,OAAQ,EAA2B,aAAc,EAAG,2BACpD,OAAQ,EAA2B,aAAc,EAAG,2BACpD,OAAQ,EAA2B,aAAc,EAAG,2BACpD,OAAQ,EAA2B,aAAc,EAAG,2BACpD,gBAAiB,EAA0B,GAC3C,gBAAiB,EAA0B,GAC3C,gBAAiB,EAA0B,GAC3C,gBAAiB,EAA0B,GAC3C,gBAAiB,EAA0B,GAC3C,gBAAiB,EAA0B,IAI/C,MAAO,CACL,2BACA,gCAIG,YACL,EACsD,CACtD,GAAM,GAAgC,GAChC,CACJ,2BACA,gCACE,GAAkB,EAAW,GAC3B,EAAY,EAAU,oBAE5B,GADA,EAAc,KAAK,CAAE,aAAc,mBAAoB,UAAW,2BAC9D,CAAC,EAAW,GACd,KAAM,IAAI,OAAM,yEAAyE,KAG3F,GAAM,GAAS,CACb,YAAa,IACb,iBAAkB,IAClB,aAAc,CACZ,cAIJ,SAA2B,EAAW,GAC/B,CAAE,SAAQ,iBCxHZ,WAA4B,EAAgB,EAA6B,EAA2B,CACzG,MAAO,AAAG,QAAK,IAAM,CACnB,GAAI,GAAM,AAAG,SAAO,EAAG,EAAO,QAAS,EAAS,QAUhD,SAAM,AAAG,MAAI,EAAK,EAAO,mBAClB,AAAG,cAAY,EAAK,EAAG,KCZlC,GAAM,IAAU,qBAEhB,YAA4B,EAAgB,EAAyC,EAA2B,CAC9G,MAAO,AAAG,QAAK,IAAM,CACnB,GAAI,GAAM,AAAG,kBAAgB,EAAG,EAAO,QAAS,EAAS,QACzD,SAAM,AAAG,YACP,EACA,EAAO,gBACP,EAAO,oBACP,EAAO,kBACP,EAAO,iBACP,IAEK,AAAG,cAAY,EAAK,EAAG,KAIlC,YAA+B,EAAoC,CACjE,MAAO,CAAC,EAAG,EAAG,EAAG,IAAI,KAAK,AAAC,GAAQ,IAAQ,GAAY,CAAC,EAAG,GAAK,CAAC,EAAG,GAG/D,YAAqB,EAAgB,EAA4B,CACtE,MAAO,AAAG,QAAK,IAAM,CACnB,GAAI,GACA,EAAM,EAAmB,EAAG,EAAO,OAAQ,CAAC,EAAG,IA0BnD,GARA,AAhBuB,CACrB,EAAO,OACP,EAAO,OACP,EAAO,OACP,EAAO,OACP,EAAO,OACP,EAAO,OACP,EAAO,OACP,EAAO,OACP,EAAO,OACP,EAAO,QACP,EAAO,QACP,EAAO,QACP,EAAO,SAGM,QAAQ,CAAC,EAAO,IAAM,CACnC,GAAM,GAAW,EAAI,EACf,EAAuB,GAAsB,GACnD,EAAM,GAAmB,EAAK,EAAM,eAAgB,GACpD,EAAM,EAAmB,EAAK,EAAM,eAAgB,CAAC,EAAG,IACpD,IAAa,IAAI,GAAS,KAG5B,IAAW,KACb,KAAM,IAAI,OAAM,iDAGlB,MAAO,CACL,MACA,OAAQ,KC3Dd,YAAa,EAAoB,EAAW,EAAW,CACrD,GAAM,GAAY,EAAM,YAClB,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAQ,KAAK,IAAI,EAAU,GAAG,GAAI,EAAU,GAAG,IAC/C,EAAS,GAAQ,GAAU,GAAQ,GACnC,EAAS,GAAQ,GAAU,GAAQ,GACzC,GAAI,GAAS,GAAK,GAAS,EAAG,MAAO,GACrC,GAAM,GAAmB,KAAK,IAAI,EAAO,GACnC,EAAmB,KAAK,IAAI,EAAO,GACnC,EAAmB,KAAK,IAAI,EAAO,GACnC,EAAmB,KAAK,IAAI,EAAO,GACnC,EAAmB,KAAK,IAAI,EAAmB,EAAkB,GAAO,KAAK,IAAI,EAAmB,EAAkB,GAC5H,MAAO,GAAoB,GAAQ,EAAQ,GAGtC,YACL,EACA,EACA,EACA,EACA,EACU,CACV,GAAM,GAAW,EAAM,MAAM,GACvB,EAAa,KAAK,IAAI,EAAe,GAErC,EAAa,EAChB,IAAI,CAAC,EAAO,IAAc,EAAE,QAAO,cACnC,OAAO,AAAC,GAAM,EAAE,MAAQ,GACxB,KAAK,CAAC,EAAI,IAAO,EAAG,MAAQ,EAAG,OAE5B,EAAe,AAAC,GAAe,GAAK,EAAe,EAAI,EACvD,EAAqB,GAE3B,SAAW,QAAQ,AAAC,GAAM,CACxB,GAAI,EAAS,QAAU,EAAY,OACnC,GAAM,GAAgB,EAAE,MACxB,OAAS,GAAI,EAAS,OAAS,EAAG,GAAK,EAAG,EAAE,EAAG,CAC7C,GAAM,GAAM,GAAI,EAAO,EAAE,SAAU,EAAS,IAC5C,GAAI,IAAQ,GACZ,GAAE,OAAS,EAAa,GACpB,EAAE,OAAS,GAAgB,MAEjC,AAAI,IAAkB,EAAE,OACtB,EAAS,KAAK,EAAE,YAGb,EClDT,YAA2C,EAAgB,CACzD,GAAM,GAAM,AAAG,UAAQ,AAAG,YAAU,EAAG,CAAC,EAAG,KAErC,EAAQ,CACZ,AAAG,MAAI,EAAI,GAAI,EAAI,IACnB,AAAG,MAAI,EAAI,GAAI,EAAI,KAEf,EAAU,CACd,AAAG,MAAI,EAAI,GAAI,AAAG,MAAI,EAAM,GAAI,IAChC,AAAG,MAAI,EAAI,GAAI,AAAG,MAAI,EAAM,GAAI,KAElC,MAAO,CAAE,QAAO,WAGlB,YAA0B,EAAiB,EAAiB,CAC1D,GAAM,CAAE,QAAO,WAAY,GAAkC,GAEvD,EAAM,AAAG,UAAQ,AAAG,YAAU,EAAI,CAAC,EAAG,KACtC,EAAW,AAAG,MAAI,AAAG,MAAI,AAAG,MAAI,AAAG,MAAI,EAAI,GAAI,IAAK,EAAM,IAAK,GAC/D,EAAW,AAAG,MAAI,AAAG,MAAI,AAAG,MAAI,EAAI,GAAI,IAAK,EAAM,IAAK,EAAQ,IAChE,EAAW,AAAG,MAAI,AAAG,MAAI,AAAG,MAAI,AAAG,MAAI,EAAI,GAAI,IAAK,EAAM,IAAK,GAC/D,EAAW,AAAG,MAAI,AAAG,MAAI,AAAG,MAAI,EAAI,GAAI,IAAK,EAAM,IAAK,EAAQ,IAEtE,MAAO,AAAG,aACR,AAAG,QAAM,CACP,AAAG,MAAI,EAAU,GACjB,AAAG,MAAI,EAAU,GACjB,AAAG,MAAI,EAAU,GACjB,AAAG,MAAI,EAAU,KAEnB,CAAC,EAAG,IAID,YAAqB,EAA6B,EAA+B,EAA2B,CACjH,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAY,EAAe,MAAM,GAEnC,EAAQ,GACV,AAAG,UAAQ,AAAG,OAAK,EAAO,UAAW,CAAC,EAAW,EAAG,IAAK,CAAC,GAAI,IAC9D,AAAG,UAAQ,EAAgB,CAAC,GAAI,KAElC,EAAQ,AAAG,UAAQ,EAAO,CAAC,EAAY,EAAM,MAAM,GAAK,EAAY,IAEpE,GAAM,GAAmB,AAAG,UAAQ,AAAG,QAAM,EAAkB,CAAC,EAAG,EAAG,GAAI,CAAC,GAAI,GAAI,MAC/E,EAAS,AAAG,QAAM,EAAkB,CAAC,EAAG,EAAG,GAAI,CAAC,GAAI,GAAI,IAE5D,EAAS,AAAG,UAAQ,EAAQ,CAAC,EAAW,EAAO,MAAM,KAErD,GAAM,GAAe,AAAG,UAAQ,GAC1B,EAAgB,AAAG,UAAQ,GAEjC,MAAO,CAAE,MAAO,EAAc,OAAQ,KCnDnC,YACL,EACA,EACA,CACA,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAY,EAAE,MAAM,GACpB,EAAwB,AAAG,UAC/B,GAAU,EAAG,EAAO,wBACpB,CAAC,EAAW,GAAI,EAAG,IAEf,EAAkB,AAAG,UACzB,GAAU,EAAG,EAAO,iBACpB,CAAC,EAAW,GAAI,IAElB,MAAO,CAAE,wBAAuB,qBCb7B,YACL,EACA,EACA,EACA,CACA,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAQ,EAAmB,EAAG,EAAO,OAAQ,CAAC,EAAG,IACjD,EAAQ,EAAmB,EAAO,EAAO,OAAQ,CAAC,EAAG,IACrD,EAAQ,EAAmB,EAAO,EAAO,OAAQ,CAAC,EAAG,IACrD,EAAQ,EAAmB,EAAO,EAAO,OAAQ,CAAC,EAAG,IACrD,EAAQ,EAAmB,EAAO,EAAO,OAAQ,CAAC,EAAG,IACrD,EAAQ,EAAmB,EAAO,EAAO,OAAQ,CAAC,EAAG,IACrD,EAAQ,EAAmB,EAAO,EAAO,OAAQ,CAAC,EAAG,IACrD,EAAQ,EAAmB,EAAO,EAAO,OAAQ,CAAC,EAAG,IAErD,EAAiB,GAAmB,EAAQ,EAAO,iBACnD,EAAiB,GAAmB,EAAG,EAAO,iBAC9C,EAAiB,GAAmB,EAAO,EAAO,iBAClD,EAAiB,GAAmB,EAAO,EAAO,iBAClD,EAAiB,GAAmB,EAAO,EAAO,iBAClD,EAAiB,GAAmB,EAAO,EAAO,iBAElD,EAAiB,AAAG,SAAO,CAC/B,EAAe,sBACf,EAAe,sBACf,EAAe,sBACf,EAAe,sBACf,EAAe,sBACf,EAAe,uBACd,GAEG,EAAmB,AAAG,SAAO,CACjC,EAAe,gBACf,EAAe,gBACf,EAAe,gBACf,EAAe,gBACf,EAAe,gBACf,EAAe,iBACd,GAEH,MAAO,CACL,iBACA,sBC3CC,WAA4B,CAOjC,YAAY,CAAE,gBAAe,cAAuC,GAAI,CAN9D,WAAgB,wBAUxB,GAHA,KAAK,eAAiB,GAAiB,GACvC,KAAK,YAAc,GAAc,IAE7B,MAAO,MAAK,gBAAmB,UAAY,KAAK,gBAAkB,GAAK,KAAK,gBAAkB,EAChG,KAAM,IAAI,OAAM,GAAG,KAAK,iEAG1B,GAAI,MAAO,MAAK,aAAgB,SAC9B,KAAM,IAAI,OAAM,GAAG,KAAK,iDAIxB,gBAAwB,CAAE,MAAO,MAAK,kBAEtC,aAAqB,CAAE,MAAO,MAAK,cCZlC,oBAA6B,EAAyB,CAC3D,aAAc,CACZ,MAAM,kBAGD,aAAa,EAAiB,CACnC,GAAM,CAAE,UAAW,KAEnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,gDAGlB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAc,AAAG,OAAK,EAAM,cAAc,IAAK,IAAQ,WACvD,EAAI,AAAG,MAAI,AAAG,MAAI,EAAa,OAAQ,GACvC,EAAW,GAAY,EAAG,EAAO,aACjC,CAAE,iBAAgB,oBAAqB,GAAgB,EAAS,IAAK,EAAS,OAAQ,EAAO,kBAEnG,MAAO,IAAY,EAAgB,EAAkB,EAAO,qBAInD,SAAQ,EAAkB,CACrC,MAAO,MAAK,aAAa,KAAM,GAAW,SAG/B,aAAY,EAAkB,EAAkC,GAA8B,CACzG,GAAM,CAAE,aAAY,iBAAkB,GAAI,GAAsB,GAC1D,EAAW,KAAM,GAAW,GAE5B,CAAE,MAAO,EAAQ,OAAQ,GAAY,KAAK,aAAa,GAEvD,EAAQ,EAAO,GACf,EAAS,EAAQ,GACvB,OAAS,GAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,EAAO,GAAG,UACV,EAAQ,GAAG,UAGb,GAAM,GAAa,MAAM,KAAK,EAAO,YAE/B,EAAU,GAAkB,EAAO,EAAwB,EAD5C,GACsE,GAErF,EAAe,EAAS,2BAA2B,GACnD,EAAY,EAAS,UACrB,EAAO,EAAY,EAAa,MAChC,EAAO,EAAY,EAAa,OAEhC,EAAY,EAAM,YAClB,EAAU,EACb,IAAI,AAAC,GAAQ,CACZ,GAAM,CAAC,EAAK,GAAU,CACpB,KAAK,IAAI,EAAG,EAAU,GAAK,IAC3B,KAAK,IAAI,EAAK,EAAU,GAAK,KAC7B,IAAI,AAAC,GAAQ,EAAM,GACf,CAAC,EAAM,GAAS,CACpB,KAAK,IAAI,EAAG,EAAU,GAAK,IAC3B,KAAK,IAAI,EAAK,EAAU,GAAK,KAC7B,IAAI,AAAC,GAAQ,EAAM,GACrB,MAAO,IAAI,GACT,EAAW,GACX,GAAI,IAAK,EAAM,EAAK,EAAQ,EAAM,EAAS,GAC3C,CAAE,OAAQ,EAAS,eAAe,GAAI,MAAO,EAAS,cAAc,OAI1E,SAAM,UACN,EAAO,UACA,EAGC,qBAA8B,CACtC,MAAO,wBAGC,2BAA2B,EAA8B,CACjE,MAAO,IAA2B,GAG1B,cAAc,EAAuB,CAC7C,MAAO,IAAc,KC1FlB,YAA8B,EAAuB,CAC1D,GAAM,GAAM,GAAI,IAChB,SAAI,eAAe,GACZ,EAGF,YAAgC,EAAuB,CAC5D,MAAO,IAAqB,GAIvB,oBAA+B,GAAe,GCd9C,GAAM,IAAgB,GAEhB,GAAc,CACzB,GAAI,GAAM,QAAU,SACpB,GAAI,GAAM,QAAS,SACnB,GAAI,GAAM,QAAS,SACnB,GAAI,GAAM,OAAQ,SAClB,GAAI,GAAM,QAAS,UAGR,GAAwB,CACnC,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,WAGT,GAA+C,CAAC,QAAS,QAAS,QAElE,GAAqB,oBACrB,GAAoC,mCCVjD,GAAM,IAAW,AAAC,GAAa,MAAO,IAAQ,SAEvC,YAAwB,EAAa,CAC1C,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,mBAAmB,KAGrC,GAAI,MAAO,GAAO,oBAAuB,UACvC,KAAM,IAAI,OAAM,wDAAwD,EAAO,sBAGjF,GAAI,CAAC,GAAS,EAAO,eAAiB,EAAO,aAAe,GAAK,EAAO,aAAe,EACrF,KAAM,IAAI,OAAM,gEAAgE,EAAO,gBAGzF,GACE,CAAC,MAAM,QAAQ,EAAO,UACnB,CAAC,EAAO,QAAQ,QAChB,CAAC,EAAO,QAAQ,MAAM,AAAC,GAAW,MAAO,IAAM,UAElD,KAAM,IAAI,OAAM,kEAAkE,KAAK,UAAU,EAAO,YAG1G,GACE,CAAC,MAAM,QAAQ,EAAO,UACnB,CAAC,EAAO,QAAQ,QAChB,CAAC,EAAO,QAAQ,IAAI,AAAC,GAAW,GAAK,IAAI,MAAM,AAAC,GAAW,GAAS,EAAE,IAAM,GAAS,EAAE,IAE1F,KAAM,IAAI,OAAM,wEAAwE,KAAK,UAAU,EAAO,YAGhH,GAAI,EAAO,SACT,EAAC,MAAM,QAAQ,EAAO,UACnB,EAAO,QAAQ,SAAW,GAC1B,CAAC,EAAO,QAAQ,MAAM,KAEzB,KAAM,IAAI,OAAM,8EAA8E,KAAK,UAAU,EAAO,YC/CjH,YAAe,EAA6B,CACjD,MAAO,AAAG,QAAK,IAAM,CACnB,GAAM,GAAM,AAAG,MAAI,EAAG,AAAG,SAAO,qBAChC,MAAO,AAAG,OAAI,AAAG,OAAK,AAAG,MAAI,EAAG,IAAO,KCApC,WAA2B,EAAgB,EAAwC,CACxF,MAAO,AAAG,QAAK,IAAM,CACnB,GAAI,GAAM,AAAG,MAAI,EAAG,CAAC,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,KACjD,SAAM,AAAG,SAAO,EAAK,EAAO,KAAK,QAAS,CAAC,EAAG,GAAI,SAClD,EAAM,AAAG,MAAI,EAAK,EAAO,GAAG,KAC5B,EAAM,AAAG,MAAI,EAAK,EAAO,GAAG,SAC5B,EAAM,AAAG,MAAI,EAAK,EAAO,KAAK,MACvB,GAAM,KCPV,YAAgC,EAAgB,EAA0C,CAC/F,MAAO,AAAG,QAAK,IAAM,CACnB,GAAI,GAAM,AAAG,MAAI,EAAG,CAAC,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,CAAC,EAAG,KACjD,SAAM,AAAG,kBAAgB,EAAK,EAAO,iBAAkB,EAAO,iBAAkB,CAAC,EAAG,GAAI,SACxF,EAAM,AAAG,MAAI,EAAK,EAAO,MAClB,GAAM,KCDjB,YAA2B,EAAwC,EAA+B,CAChG,GAAM,GAAoB,GAAyB,EAAgB,GAEnE,WAAgC,EAAc,EAAiC,CAC7E,GAAM,GAAM,AAAG,WAAS,EAAe,IACjC,EAAU,AAAG,WAAS,EAAe,IAE3C,SAAc,KACZ,CAAE,UAAW,GAAG,SAChB,CAAE,UAAW,GAAG,cAEX,CAAE,MAAK,WAGhB,WAAwC,EAAoB,EAAqB,EAAyC,CACxH,GAAM,GAAO,EAAkB,EAAY,EAAa,EAAG,GAAG,UACxD,EAAK,EAAuB,EAAa,GAAG,QAClD,MAAO,CAAE,OAAM,MAEjB,GAAM,GAA6B,GAAkC,EAAgB,GAErF,MAAO,CACL,oBACA,iCACA,8BAIG,YACL,EACA,EACA,EACA,EACgE,CAChE,GAAM,CACJ,iBACA,uBACE,EAAsB,GAEpB,EAAgC,GAChC,CACJ,oBACA,iCACA,8BACE,GAAkB,EAAgB,GAClC,EAEJ,GAAI,EAAO,mBAAoB,CAC7B,GAAM,CAAC,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAM,EACvC,EAAQ,EAAO,mBACjB,EAAkB,EAAI,EAAI,EAAG,SAC7B,EAA2B,EAAI,EAAI,SACjC,EAAQ,EAA2B,EAAI,EAAI,SAC3C,EAAQ,EAA2B,EAAI,EAAI,SAC3C,EAAQ,EAA2B,EAAI,EAAI,SAC3C,EAAQ,EAA2B,EAAI,EAAI,SAC3C,GAAQ,EAA2B,EAAI,EAAI,SAC3C,GAAQ,EAAK,EAA2B,EAAI,EAAI,SAAW,OAC3D,GAAQ,EAAK,EAA2B,EAAI,EAAI,SAAW,OAC3D,GAAQ,EAAkB,GAAM,GAAM,EAAI,EAAI,EAAiB,EAAG,SACxE,EAAS,CACP,QAAO,QAAO,QAAO,QAAO,QAAO,SAAO,SAAO,SAAO,cAErD,CACL,GAAM,CAAC,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,GAAM,EACvC,EAAQ,EAA+B,EAAI,EAAI,SAC/C,EAAQ,EAA+B,EAAI,EAAI,SAC/C,EAAQ,EAA+B,EAAI,EAAI,SAC/C,EAAQ,EAA+B,EAAI,EAAI,SAC/C,EAAQ,EAA+B,EAAI,EAAI,SAC/C,GAAQ,EAA+B,EAAI,EAAI,SAC/C,GAAQ,EAA+B,EAAI,EAAI,SAC/C,GAAQ,EAA+B,EAAI,EAAI,SAC/C,GAAQ,EAAkB,EAAI,EAAI,EAAiB,EAAG,SAC5D,EAAS,CACP,QAAO,QAAO,QAAO,QAAO,QAAO,SAAO,SAAO,SAAO,UAG5D,GAAI,IAAsB,SAAW,EACnC,KAAM,IAAI,OAAM,kCAAkC,IAAsB,UAE1E,MAAO,CAAE,SAAQ,iBChFnB,YAA2B,EAAgB,EAA+B,CACxE,GAAM,GAAqB,EAA0B,EAAW,GAEhE,WAAgC,EAA2B,CACzD,GAAM,GAAM,EAAmB,GAAG,QAAc,GAC1C,EAAU,EAAmB,GAAG,YAAkB,GACxD,MAAO,CAAE,MAAK,WAGhB,WAA2B,EAA4B,CACrD,GAAM,GAAU,EAAmB,GAAG,YAAkB,GAClD,EAAO,EAAmB,GAAG,SAAe,GAClD,MAAO,CAAE,UAAS,QAGpB,WAAwC,EAAmC,CACzE,GAAM,GAAO,EAAkB,GAAG,UAC5B,EAAK,EAAuB,GAAG,QACrC,MAAO,CAAE,OAAM,MAGjB,GAAM,GAA6B,GAA+B,GAClE,MAAO,CACL,oBACA,iCACA,8BAIG,YACL,EACA,EACgE,CAChE,GAAM,GAAgC,GAEhC,CACJ,oBACA,iCACA,8BACE,GAAkB,EAAW,GAE7B,EAEJ,GAAI,EAAO,mBAAoB,CAE7B,GAAM,GAAc,EAAO,aAAe,EAAO,YAAY,QAAU,EACvE,EAAS,CACP,MAAO,EAAO,mBAAqB,EAAkB,SAAW,EAA2B,SAC3F,MAAO,EAA2B,SAClC,MAAO,EAA2B,SAClC,MAAO,EAA2B,SAClC,MAAO,EAA2B,SAClC,MAAO,EAA2B,SAClC,MAAO,EAAa,EAAI,EAA2B,SAAW,OAC9D,MAAO,EAAa,EAAI,EAA2B,SAAW,OAC9D,MAAO,EAAkB,cAG3B,GAAS,CACP,MAAO,EAA+B,SACtC,MAAO,EAA+B,SACtC,MAAO,EAA+B,SACtC,MAAO,EAA+B,SACtC,MAAO,EAA+B,SACtC,MAAO,EAA+B,SACtC,MAAO,EAA+B,SACtC,MAAO,EAA+B,SACtC,MAAO,EAAkB,UAI7B,SAA2B,EAAW,GAC/B,CAAE,SAAQ,iBC7EZ,YAAwB,CAO7B,YAAY,CAAE,YAAW,kBAAuC,GAAI,CAN1D,WAAgB,oBAUxB,GAHA,KAAK,WAAa,GAAa,IAC/B,KAAK,gBAAkB,GAAkB,GAErC,MAAO,MAAK,YAAe,UAAY,KAAK,WAAa,IAAO,EAClE,KAAM,IAAI,OAAM,GAAG,KAAK,6DAG1B,GAAI,MAAO,MAAK,iBAAoB,UAAY,KAAK,iBAAmB,GAAK,KAAK,iBAAmB,EACnG,KAAM,IAAI,OAAM,GAAG,KAAK,qEAIxB,YAAoB,CAAE,MAAO,MAAK,cAElC,iBAAyB,CAAE,MAAO,MAAK,kBCJtC,oBAA6B,EAAmC,CAKrE,YAAY,EAA0B,CACpC,MAAM,cACN,GAAe,GACf,KAAK,QAAU,KAGN,SAA2B,CACpC,MAAO,MAAK,WAGH,kBAA2B,CACpC,MAAO,MAAK,OAAO,iBAAmB,KAAK,OAAO,QAAQ,OAAS,KAG1D,kBAA0B,CACnC,MAAO,GAAK,MAAK,gBAAkB,KAAK,OAAO,QAAQ,OAAS,GAG3D,cAAc,EAAgB,EAAiD,CACpF,GAAI,GAAM,EAAkB,EAAG,EAAO,OACtC,SAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,EAAkB,EAAK,EAAO,OACpC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,EAAkB,EAAK,EAAO,OACpC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,EAAkB,EAAK,EAAO,OACpC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,EAAkB,EAAK,EAAO,OACpC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,EAAkB,EAAK,EAAO,OACpC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,EAAkB,EAAK,EAAO,OACpC,EAAM,EAAkB,EAAK,EAAO,OAC7B,GAAU,EAAK,EAAO,MAAO,QAAS,IAGxC,aAAa,EAAgB,EAAsC,CACxE,GAAI,GAAM,KAAK,OAAO,mBAClB,GAAM,GAAU,EAAG,EAAO,MAAqB,QAAS,KACxD,GAAuB,EAAG,EAAO,OACrC,SAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,GAAuB,EAAK,EAAO,OACzC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,GAAuB,EAAK,EAAO,OACzC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,GAAuB,EAAK,EAAO,OACzC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,GAAuB,EAAK,EAAO,OACzC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,GAAuB,EAAK,EAAO,OACzC,EAAM,AAAG,UAAQ,EAAK,CAAC,EAAG,GAAI,CAAC,EAAG,GAAI,QACtC,EAAM,EAAO,MAAQ,GAAuB,EAAK,EAAO,OAAS,EACjE,EAAM,EAAO,MAAQ,GAAuB,EAAK,EAAO,OAAS,EAC1D,GAAU,EAAK,EAAO,MAAO,QAAS,IAGxC,aAAa,EAAiB,EAAgC,CACnE,GAAM,CAAE,UAAW,KAEnB,GAAI,CAAC,EACH,KAAM,IAAI,OAAM,4CAGlB,MAAO,AAAG,QAAK,IAAM,CACnB,GAAI,GAAc,AAAG,OAAK,EAAM,cAAc,EAAW,IAAQ,WACjE,SAAc,KAAK,OAAO,QACtB,EAAU,EAAa,KAAK,OAAO,SACnC,EACJ,EAAc,EAAY,IAAI,KACvB,KAAK,OAAO,mBACf,KAAK,aAAa,EAAa,GAC/B,KAAK,cAAc,EAAa,UAI3B,SAAQ,EAAkB,EAAyC,CAC9E,MAAO,MAAK,aAAa,KAAM,GAAW,GAAQ,QAGvC,QAAO,EAAkB,EAAoC,GAAgC,CACxG,GAAM,CAAE,YAAW,kBAAmB,GAAI,IAAkB,GACtD,EAAW,KAAM,GAAW,GAC5B,EAAM,KAAM,MAAK,aAAa,EAAU,GACxC,EAAO,AAAG,OAAK,IAAM,AAAG,UAAQ,GAAK,GAAG,cACxC,EAAkB,CACtB,MAAO,EAAS,cAAc,GAC9B,OAAQ,EAAS,eAAe,IAG5B,EAAU,KAAM,MAAK,aAAa,EAAM,EAAS,2BAA2B,GAAI,GACtF,EAAI,UACJ,EAAK,UAEL,GAAM,GAAQ,EAAQ,IAAI,AAAC,GAAQ,EAAI,KACjC,EAAS,EAAQ,IAAI,AAAC,GAAQ,EAAI,OAClC,EAAc,EAAQ,IAAI,AAAC,GAAQ,EAAI,YACvC,EAAa,EAAQ,IAAI,AAAC,GAAQ,KAAK,OAAO,QAAQ,EAAI,QAgBhE,MAPmB,AAPH,IACd,EAAM,IAAI,AAAC,GAAQ,EAAI,QAAQ,IAC/B,EACA,KAAK,OAAO,aACZ,IAGyB,IAAI,AAAC,GAAQ,GAAI,IAC1C,EAAO,GACP,EAAY,GACZ,EAAW,GACX,EAAM,GACN,IAKM,qBAA8B,CACtC,MAAO,GAGC,2BAA2B,EAA8B,CACjE,MAAO,IAA2B,EAAW,KAAK,QAG1C,cAAc,EAAuB,CAC7C,GAAM,GAAc,KAAK,OAAO,aAAe,GAAe,qBAExD,EAAa,EAAc,EAAY,OAAS,OACtD,GAAI,IAAe,GAAK,IAAe,GAAK,IAAe,EACzD,KAAM,IAAI,OAAM,oEAAoE,2BAEtF,MAAO,IAAc,EAAS,KAAK,OAAQ,KAAK,gBAAiB,QAGnD,cACd,EACA,EACA,EACA,CACA,GAAM,CAAE,QAAO,UAAW,EACpB,EAAY,KAAK,IAAI,EAAO,GAC5B,EAAoB,EAAY,EAChC,EAAoB,EAAY,EAEhC,EAAW,EAAa,MAAM,GAC9B,EAAW,KAAK,OAAO,QAAQ,OAE/B,CAAC,EAAa,EAAc,GAAqB,AAAG,OAAK,IAAM,CACnE,GAAM,GAAW,EAAa,QAAQ,CAAC,EAAU,EAAU,EAAU,KAAK,kBAEpE,EAAQ,EAAS,MAAM,CAAC,EAAG,EAAG,EAAG,GAAI,CAAC,EAAU,EAAU,EAAU,IACpE,EAAS,EAAS,MAAM,CAAC,EAAG,EAAG,EAAG,GAAI,CAAC,EAAU,EAAU,EAAU,IACrE,EAAc,KAAK,gBACrB,AAAG,UAAQ,EAAS,MAAM,CAAC,EAAG,EAAG,EAAG,GAAI,CAAC,EAAU,EAAU,EAAU,KAAK,OAAO,QAAQ,SAAU,GACrG,AAAG,SAAO,GACd,MAAO,CAAC,EAAO,EAAQ,KAGnB,EAAU,GACV,EAAa,KAAM,GAAa,QAChC,EAAY,KAAM,GAAY,QACpC,OAAS,GAAM,EAAG,EAAM,EAAU,IAChC,OAAS,GAAM,EAAG,EAAM,EAAU,IAChC,OAAS,GAAS,EAAG,EAAS,EAAU,IAAU,CAChD,GAAM,GAAQ,GAAQ,EAAW,GAAK,GAAK,GAAQ,IACnD,GAAI,CAAC,GAAkB,EAAQ,EAAgB,CAC7C,GAAM,GAAQ,GAAM,GAAQ,EAAU,GAAK,GAAK,GAAQ,KAAO,EAAY,EACrE,EAAQ,GAAM,GAAQ,EAAU,GAAK,GAAK,GAAQ,KAAO,EAAY,EACrE,EAAe,KAAK,IAAI,EAAU,GAAK,GAAK,GAAQ,IAAM,KAAK,OAAO,QAAQ,GAAQ,EAAK,EAAY,EACvG,EAAgB,KAAK,IAAI,EAAU,GAAK,GAAK,GAAQ,IAAM,KAAK,OAAO,QAAQ,GAAQ,EAAK,EAAY,EACxG,GAAK,EAAO,EAAa,EACzB,GAAK,EAAO,EAAc,EAC1B,GAAM,CAAE,MAAK,MAAK,UAClB,CAAE,cAAY,UAAU,KAAK,gBAC/B,KAAM,MAAK,sBAAsB,EAAkC,IACnE,CAAE,WAAY,EAAG,MAAO,GAC5B,EAAQ,KAAK,CACX,IAAK,GAAI,IAAY,GAAG,GAAG,GAAI,EAAY,GAAI,GAC/C,QACA,WAAY,EAAQ,GACpB,YACG,MAOb,SAAY,UACZ,EAAa,UACb,EAAkB,UACX,OAGK,uBAAsB,EAA4B,EAAmD,CACjH,GAAM,CAAE,MAAK,MAAK,UAAW,EACvB,EAAc,KAAM,GAAc,QACxC,MAAO,OAAM,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAC3C,IAAI,CAAC,EAAG,IAAM,EAAY,GAAK,GAAK,GAAQ,IAC5C,IAAI,CAAC,EAAY,IAAW,EAC3B,aACA,WAED,OAAO,CAAC,EAAK,IAAU,EAAI,WAAa,EAAK,WAAa,EAAM,KA/MhE,MACS,AADT,GACS,qBAAuB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,KAAM,MCPrE,oBAAyB,GAAe,CAC7C,YAAY,EAA8B,GAAM,CAC9C,GAAM,GAAS,CACb,qBACA,aAAc,GACd,QAAS,CAAC,WACN,EACA,CACA,QAAS,GACT,QAAS,IAET,CACA,QAAS,GACT,gBAAiB,KAIvB,MAAM,MAGG,qBAA8B,CACvC,MAAO,MAAK,OAAO,sBAGV,UAAmB,CAC5B,MAAO,MAAK,OAAO,aAGR,aAAY,EAAkB,EAA6D,CAEtG,MAAO,AADkB,MAAM,MAAK,OAAO,EAAO,IAC1B,IAAI,AAAC,GAAQ,GAAI,GAAc,EAAI,MAAO,EAAI,YAAa,CAAE,MAAO,EAAI,WAAY,OAAQ,EAAI,eAGhH,qBAA8B,CACtC,MAAO,MAAK,mBAAqB,GAAoC,GAG7D,2BAA2B,EAA8F,CACjI,MAAO,OAAM,2BAA2B,KChDrC,YAA0B,EAAuB,EAA8B,GAAM,CAC1F,GAAM,GAAM,GAAI,IAAW,GAC3B,SAAI,eAAe,GACZ,ECNF,oBAAsC,GAAkB,CAAxD,aAJP,CAIO,oBACK,WAAgB,4BCLrB,WAAwB,MAChB,MAEX,EACY,CACZ,MAAO,GAAY,KAAM,MAAK,YAGnB,MAAkB,CAC7B,KAAM,IAAI,OAAM,6CCFpB,kBACE,EACA,EAEA,EACA,EAEA,EAAwF,CAAC,CAAE,iBAAkB,EAC7G,CACA,GAAM,GAAY,EAAc,IAAI,AAAC,GAAkB,GAAoB,GACvE,EAAoB,GACpB,EAAa,WAEX,EAAgD,GACpD,aAAoB,UAChB,KAAM,IAAmB,EAAO,GAChC,KAAM,IAAa,EAAO,IAG1B,EAAU,KAAM,GAAe,GAErC,SAAM,QAAQ,AAAC,GAAM,YAAgB,WAAU,EAAE,WAE1C,EAGT,kBACE,EACA,EAEA,EACA,EAEA,EACA,CACA,MAAO,IACL,CAAC,GACD,EACA,KAAO,IAAU,EAAc,EAAM,IACrC,EACA,GC7CG,GAAM,IAAgB,GAEhB,GAAc,CACzB,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,UACpB,GAAI,GAAM,SAAU,WAGT,GAAqC,CAAC,QAAS,QAAS,QCF9D,oBAA+B,GAAe,CACnD,aAAc,CACZ,GAAM,GAAS,CACb,mBAAoB,GACpB,aAAc,GACd,QAAS,CAAC,QACV,QAAS,GACT,QAAS,GACT,mBAAoB,GACpB,YAAa,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,MAGzC,MAAM,MAGG,UAAmB,CAC5B,MAAO,MAAK,OAAO,aAGR,aAAY,EAAkB,EAA6D,CAEtG,MAAO,AADkB,MAAM,MAAK,OAAO,EAAO,IAC1B,IAAI,AAAC,GAAQ,GAAI,GAAc,EAAI,MAAO,EAAI,YAAa,CAAE,MAAO,EAAI,WAAY,OAAQ,EAAI,eAGhH,qBAA8B,CACtC,MAAO,2BAGC,2BAA2B,EAA8F,CACjI,MAAO,OAAM,2BAA2B,KCvBrC,GAAM,GAAO,CAClB,eAAgB,GAAI,IACpB,iBAAkB,GAAI,IACtB,WAAY,GAAI,IAChB,kBAAmB,GAAI,IACvB,sBAAuB,GAAI,IAC3B,mBAAoB,GAAI,IACxB,kBAAmB,GAAI,IACvB,aAAc,GAAI,KAUP,GAAiB,CAAC,EAAkB,IAA6D,EAAK,eAAe,YAAY,EAAO,GASxI,GAAmB,CAAC,EAAkB,IAA+D,EAAK,iBAAiB,YAAY,EAAO,GAS9I,GAAa,CAAC,EAAkB,IAA0D,EAAK,WAAW,YAAY,EAAO,GAS7H,GAAsB,AAAC,GAAmE,EAAK,kBAAkB,gBAAgB,GAWjI,GAA0B,AAAC,GAAmE,EAAK,sBAAsB,gBAAgB,GAYzI,GAAwB,AAAC,GAA6D,EAAK,mBAAmB,sBAAsB,GASpI,GAA2B,AAAC,GAAmE,EAAK,kBAAkB,mBAAmB,GASzI,GAAsB,AAAC,GAAiF,EAAK,aAAa,oBAAoB,GAE9I,GAA0B,AAAC,GAAgB,EAAK,eAAe,KAAK,GACpE,GAA4B,AAAC,GAAgB,EAAK,iBAAiB,KAAK,GACxE,GAAsB,AAAC,GAAgB,EAAK,WAAW,KAAK,GAC5D,GAAwB,AAAC,GAAgB,EAAK,kBAAkB,KAAK,GACrE,GAA4B,AAAC,GAAgB,EAAK,sBAAsB,KAAK,GAC7E,GAA2B,AAAC,GAAgB,EAAK,mBAAmB,KAAK,GACzE,GAA0B,AAAC,GAAgB,EAAK,kBAAkB,KAAK,GACvE,GAAqB,AAAC,GAAgB,EAAK,aAAa,KAAK,GAG7D,GAAyB,GACzB,GAAc,GACd,GAAkB,GCtGxB,oBAAqE,EAAwB,CAClG,YAEY,EAEA,EAEA,EACV,CACA,QANU,kBAEA,aAEA,wBAMP,gBAEG,GAA0E,MACrE,MAA+C,CAC1D,GAAM,GAAgB,KAAM,MAAK,WAE3B,EAAwB,KAAM,IAClC,EACA,KAAK,MACL,KAAO,IAAU,QAAQ,IAAI,EAAM,IACjC,AAAC,GAAS,EAAK,kBAAkB,mBAAmB,KAEtD,KAAK,gBAGP,MAAO,GAAc,IACnB,CAAC,EAAc,IAAM,GAAmC,EAAc,EAAsB,KAIhG,kBAAmB,CACjB,MAAO,IAAI,IAA2B,KAAM,KAAK,SAI9C,gBAEG,GAA8F,MACzF,MAAyD,CACpE,GAAM,GAAe,KAAM,MAAK,WAChC,GAAI,CAAC,EACH,OAGF,GAAM,GAAkB,KAAM,IAC5B,EACA,KAAK,MACL,AAAC,GAAS,EAAK,kBAAkB,mBAAmB,GACpD,KAAK,gBAGP,MAAO,IAA0B,EAAc,GAGjD,kBAAmB,CACjB,MAAO,IAAI,IAA8B,KAAM,KAAK,SAIjD,gBAEG,GAAuC,CAC/C,kBAAmB,CACjB,MAAO,IAAI,IAA4C,KAAM,KAAK,OAGpE,qBAAsB,CACpB,MAAO,IAAI,IAA8B,KAAM,KAAK,SAIjD,gBAEG,GAA0C,CAClD,kBAAmB,CACjB,MAAO,IAAI,IAA+C,KAAM,KAAK,OAGvE,oBAAqB,CACnB,MAAO,IAAI,IAAgC,KAAM,KAAK,SCjFnD,oBAAkE,EAAwB,CAC/F,YAEY,EAEA,EAEA,EACV,CACA,QANU,kBAEA,aAEA,wBAMP,gBAEG,GAAuE,MAClE,MAA+C,CAC1D,GAAM,GAAgB,KAAM,MAAK,WAE3B,EAAqB,KAAM,IAC/B,EACA,KAAK,MACL,KAAO,IAAU,QAAQ,IAAI,EAAM,IACjC,AAAC,GAAS,EAAK,aAAa,oBAAoB,KAElD,KAAK,gBAGP,MAAO,GAAc,IAAI,CAAC,EAAc,IAAM,CAC5C,GAAM,CAAE,MAAK,SAAQ,qBAAsB,EAAmB,GAC9D,MAAO,IAAc,GAAiB,EAAc,EAAQ,GAAoB,KAIpF,qBAAsB,CACpB,MAAO,IAAI,IAA8B,KAAM,KAAK,SAIjD,gBAEG,GAA2F,MACtF,MAAyD,CACpE,GAAM,GAAe,KAAM,MAAK,WAChC,GAAI,CAAC,EACH,OAGF,GAAM,CAAE,MAAK,SAAQ,qBAAsB,KAAM,IAC/C,EACA,KAAK,MACL,AAAC,GAAS,EAAK,aAAa,oBAAoB,GAChD,KAAK,gBAGP,MAAO,IAAc,GAAiB,EAAc,EAAQ,GAAoB,GAGlF,qBAAsB,CACpB,MAAO,IAAI,IAAiC,KAAM,KAAK,SAIpD,gBAEG,GAAoC,CAC5C,qBAAsB,CACpB,MAAO,IAAI,IAA+C,KAAM,KAAK,OAGvE,qBAAsB,CACpB,MAAO,IAAI,IAA8B,KAAM,KAAK,SAIjD,gBAEG,GAAuC,CAC/C,qBAAsB,CACpB,MAAO,IAAI,IAAkD,KAAM,KAAK,OAG1E,oBAAqB,CACnB,MAAO,IAAI,IAAgC,KAAM,KAAK,SCvFnD,oBAAqE,EAAwB,CAClG,YAEY,EAEA,EACV,CACA,QAJU,kBAEA,eAMP,gBAEG,GAAyE,MACpE,MAA8C,CACzD,GAAM,GAAgB,KAAM,MAAK,WAUjC,MAAO,AARa,MAAM,IACxB,EACA,KAAK,MACL,AAAC,GAAU,QAAQ,IAAI,EAAM,IAAI,AAAC,GAAS,EAAK,mBAAmB,sBAAsB,KACzF,KACA,AAAC,GAAiB,EAAa,UAAU,MAAM,KAAM,CAAE,iBAAkB,OAGxD,IAAI,CAAC,EAAY,IAAM,GAAkC,EAAc,GAAI,IAGhG,qBAAsB,CACpB,MAAO,IAAI,IAA+C,KAAM,KAAK,OAGvE,kBAAmB,CACjB,MAAO,IAAI,IAA4C,KAAM,KAAK,SAI/D,gBAEG,GAA6F,MACxF,MAAwD,CACnE,GAAM,GAAe,KAAM,MAAK,WAChC,GAAI,CAAC,EACH,OAEF,GAAM,GAAa,KAAM,IACvB,EACA,KAAK,MACL,AAAC,GAAS,EAAK,mBAAmB,sBAAsB,GACxD,KAEA,AAAC,GAAiB,EAAa,UAAU,MAAM,KAAM,CAAE,iBAAkB,MAG3E,MAAO,IAAyB,EAAc,GAGhD,qBAAsB,CACpB,MAAO,IAAI,IAAkD,KAAM,KAAK,OAG1E,kBAAmB,CACjB,MAAO,IAAI,IAA+C,KAAM,KAAK,SC1DlE,oBAAkE,EAAwB,CAC/F,YAEY,EAEA,EAEA,EACV,CACA,QANU,kBAEA,aAEA,6BAKE,cAAyD,CACrE,MAAO,MAAK,mBACR,EAAK,sBACL,EAAK,oBAIN,gBAEG,GAAqE,MAChE,MAA6C,CACxD,GAAM,GAAgB,KAAM,MAAK,WAC3B,EAAa,EAAc,IAAI,AAAC,GAAQ,EAAI,WAE5C,EAAgD,KAAK,gBAAoB,UAC3E,KAAM,IAAmB,KAAK,MAAO,GACrC,KAAM,IAAa,KAAK,MAAO,GAE7B,EAAsB,KAAM,SAAQ,IAAI,EAAM,IAClD,AAAC,GAAS,KAAK,YAAY,gBAAgB,KAG7C,SAAM,QAAQ,AAAC,GAAM,YAAgB,WAAU,EAAE,WAE1C,EAAc,IAAI,CAAC,EAAc,IAAM,GAAiC,EAAc,EAAoB,KAGnH,qBAAsB,CACpB,MAAO,IAAI,IAA+C,KAAM,KAAK,OAGvE,kBAAmB,CACjB,MAAO,IAAI,IAA4C,KAAM,KAAK,OAGpE,qBAAsB,CACpB,MAAO,IAAI,IAA8B,KAAM,KAAK,SAIjD,gBAAmF,GAAyF,MACpK,MAAuD,CAClE,GAAM,GAAe,KAAM,MAAK,WAChC,GAAI,CAAC,EACH,OAGF,GAAM,CAAE,aAAc,EAChB,EAAgD,KAAK,gBAAoB,UAC3E,KAAM,IAAmB,KAAK,MAAO,CAAC,IACtC,KAAM,IAAa,KAAK,MAAO,CAAC,IAE9B,EAAY,KAAM,MAAK,YAAY,gBAAgB,EAAM,IAE/D,SAAM,QAAQ,AAAC,GAAM,YAAgB,WAAU,EAAE,WAE1C,GAAiC,EAAc,GAGxD,qBAAsB,CACpB,MAAO,IAAI,IAAkD,KAAM,KAAK,OAG1E,kBAAmB,CACjB,MAAO,IAAI,IAA+C,KAAM,KAAK,OAGvE,oBAAqB,CACnB,MAAO,IAAI,IAAgC,KAAM,KAAK,SCjFnD,oBAA2C,EAAwB,CAExE,YAAsB,EAA4B,EAAgC,GAAI,GAAyB,CAC7G,QADoB,aAA4B,iBAK7C,gBAAiC,GAAqC,MAC9D,MAAgC,CAC3C,GAAM,CAAE,QAAO,WAAY,KACvB,EACJ,GAAI,YAAmB,IAAyB,EAAS,EAAK,iBAAiB,YAAY,EAAO,WACzF,YAAmB,GAAuB,EAAS,EAAK,eAAe,YAAY,EAAO,WAC1F,YAAmB,IAAmB,EAAS,EAAK,WAAW,YAAY,EAAO,OACtF,MAAM,IAAI,OAAM,wHAErB,MAAO,GAGD,gCAAmE,CAEzE,MAAO,IAAI,SAAiC,KAAO,IAAY,CAC7D,GAAM,GAAa,KAAM,MAAK,MAC9B,EAAQ,EAAW,IAAI,AAAC,GAAc,GAAwB,GAAI,OAItE,kBAAkB,EAA8B,GAAO,CACrD,MAAO,IAAI,IACT,KAAK,iCACL,KAAK,MACL,GAIJ,qBAAsB,CACpB,MAAO,IAAI,IACT,KAAK,iCACL,KAAK,OAIT,kBAAmB,CACjB,MAAO,IAAI,IACT,KAAK,iCACL,KAAK,SAKJ,gBAAmC,GAA+C,MAC1E,MAA0C,CACrD,GAAM,GAAiB,KAAM,IAAI,IAAmB,KAAK,MAAO,KAAK,SACjE,EAAgC,EAAe,GACnD,SAAe,QAAQ,AAAC,GAAkB,CACxC,AAAI,EAAc,MAAQ,EAA8B,OAAO,GAAgC,KAE1F,EAGD,+BAA4E,CAElF,MAAO,IAAI,SAA2C,KAAO,IAAY,CACvE,GAAM,GAAY,KAAM,MAAK,MAC7B,EAAQ,EAAY,GAA4B,GAAI,GAAa,UAIrE,kBAAkB,EAA8B,GAAO,CACrD,MAAO,IAAI,IACT,KAAK,gCACL,KAAK,MACL,GAIJ,qBAAsB,CACpB,MAAO,IAAI,IACT,KAAK,gCACL,KAAK,OAIT,kBAAmB,CACjB,MAAO,IAAI,IACT,KAAK,gCACL,KAAK,SC/FJ,YAA0B,EAAkB,EAAgC,GAAI,GAA+C,CACpI,MAAO,IAAI,IAAqB,EAAO,GAGlC,YAAwB,EAAkB,EAAgC,GAAI,GAA6C,CAChI,MAAO,IAAI,IAAmB,EAAO,GCJvC,kBAA6C,EAAkB,EAAiG,CAC9J,MAAO,IAAe,EAAO,GAAI,GAAsB,EAAgB,CAAE,iBAAkB,KACxF,oBACA,sBAGL,kBAAyC,EAAkB,EAAoC,GAA6E,CAC1K,MAAO,IAAe,EAAO,GAAI,IAAkB,IAChD,oBACA,sBAGE,GAAM,IAAW,GClBjB,YAA2B,EAA+B,EAA+B,CAC9F,GAAI,EAAK,SAAW,EAAK,OAAQ,KAAM,IAAI,OAAM,kDAEjD,GAAM,GAAQ,MAAM,KAAK,GACnB,EAAQ,MAAM,KAAK,GAEzB,MAAO,MAAK,KACV,EACG,IAAI,CAAC,EAAK,IAAM,EAAM,EAAM,IAC5B,OAAO,CAAC,EAAK,IAAS,EAAO,GAAQ,EAAI,ICJzC,YAAkB,CAKvB,YACE,EACA,EAA4B,GAC5B,CACA,KAAK,mBAAqB,EAE1B,GAAM,GAAa,MAAM,QAAQ,GAAU,EAAS,CAAC,GAErD,GAAI,CAAC,EAAW,OACd,KAAM,IAAI,OAAM,2DAGlB,GAAI,GAAQ,EACN,EAAoB,IAAM,UAAU,MAE1C,KAAK,oBAAsB,EAAW,IAAI,AAAC,GAAS,CAClD,GAAI,YAAgB,IAClB,MAAO,GAGT,GAAI,YAAgB,cAClB,MAAO,IAAI,IAAuB,IAAqB,CAAC,IAG1D,GAAI,EAAK,YAAc,EAAK,qBAAsB,cAChD,MAAO,IAAI,IAAuB,IAAqB,CAAC,EAAK,aAG/D,KAAM,IAAI,OAAM,4MAIT,qBAA+C,CAAE,MAAO,MAAK,uBAE7D,oBAA4B,CAAE,MAAO,MAAK,mBAE9C,oBAAoB,EAA+B,EAAqC,CAC7F,MAAO,GACJ,IAAI,AAAC,GAAM,GAAkB,EAAG,IAChC,OAAO,CAAC,EAAI,IAAO,EAAK,EAAI,GACxB,GAAY,QAAU,GAGxB,gBAAgB,EAA0C,CAC/D,MAAO,MAAK,mBACT,IAAI,CAAC,CAAE,cAAa,WAAY,GAAI,IACnC,EACA,KAAK,oBAAoB,EAAiB,KAE3C,OAAO,CAAC,EAAM,IAAU,EAAK,SAAW,EAAK,SAAW,EAAO,GAG7D,cAAc,EAA0C,CAC7D,GAAM,GAAY,KAAK,gBAAgB,GACvC,MAAO,GAAU,SAAW,KAAK,kBAC7B,EACA,GAAI,IAAU,UAAW,EAAU,UAGlC,QAAc,CACnB,MAAO,CACL,kBAAmB,KAAK,kBACxB,mBAAoB,KAAK,mBAAmB,IAAI,AAAC,GAAO,EAAG,iBAIjD,UAAS,EAAwB,CAC7C,GAAM,GAAqB,EAAK,mBAC7B,IAAI,AAAC,GAAY,GAAuB,SAAS,IACpD,MAAO,IAAI,IAAY,EAAoB,EAAK,qBC1E7C,YAAgC,EAAuB,CAC5D,GAAM,GAAM,GAAI,IAChB,SAAI,eAAe,GACZ,ECFF,YAA0B,EAAY,EAA4B,CACvE,GAAM,CAAE,QAAO,UAAW,GAAI,GAAW,EAAW,MAAO,EAAW,QAEtE,GAAI,GAAS,GAAK,GAAU,EAC1B,KAAM,IAAI,OAAM,uCAAuC,KAAK,UAAU,CAAE,QAAO,cAGjF,GAAI,MAAM,QAAQ,GAEhB,MAAQ,GAAuB,IAAI,AAAC,GAAQ,GAAc,EAAK,CAAE,QAAO,YAG1E,GAAI,GAAoB,GAAU,CAChC,GAAM,GAAmB,EAAQ,UAAU,QAAQ,EAAO,GACpD,EAAmB,EAAQ,mBAAmB,QAAQ,EAAiB,IAAI,MAAO,EAAiB,IAAI,QAC7G,MAAO,IAAwB,GAAwB,EAAS,GAAmB,GAGrF,MAAI,GAAoB,GACf,GAAwB,EAAS,EAAQ,UAAU,QAAQ,EAAO,IAGvE,YAAmB,IAAiB,YAAmB,GACjD,EAAgB,QAAQ,EAAO,GAGlC,ECRT,GAAM,IAAQ,MAAO,UAAY,YAC3B,GAAW,MAAO,YAAc,aAAiB,MAAO,WAAU,WAAc,YACzE,GAAU,CAAE,QAAa,GAAmB,QAAM", "names": [] } diff --git a/dist/face-api.esm.js b/dist/face-api.esm.js index 3c0c67c..34a3a26 100644 --- a/dist/face-api.esm.js +++ b/dist/face-api.esm.js @@ -5,54320 +5,43 @@ author: ' */ -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, all4) => { - for (var name in all4) - __defProp(target, name, {get: all4[name], enumerable: true}); -}; -var __exportStar = (target, module, desc) => { - if (module && 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) => { - return __exportStar(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); -}; - -// src/env/isNodejs.ts -var require_isNodejs = __commonJS((exports, module) => { - __markAsModule(exports); - __export(exports, { - isNodejs: () => isNodejs2 - }); - function isNodejs2() { - return typeof global === "object" && true && typeof module !== "undefined" && typeof process !== "undefined" && !!process.version; - } -}); - -// dist/tfjs.esm.js -var tfjs_esm_exports = {}; -__export(tfjs_esm_exports, { - 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, - AvgPool3DGrad: () => AvgPool3DGrad, - AvgPoolGrad: () => AvgPoolGrad, - BackendWasm: () => BackendWasm, - BatchMatMul: () => BatchMatMul, - BatchToSpaceND: () => BatchToSpaceND, - Bincount: () => Bincount, - BroadcastTo: () => BroadcastTo, - Callback: () => Callback, - CallbackList: () => CallbackList, - Cast: () => Cast, - Ceil: () => Ceil, - ClipByValue: () => ClipByValue, - Complex: () => Complex, - ComplexAbs: () => ComplexAbs, - 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, - DenseBincount: () => DenseBincount, - DepthToSpace: () => DepthToSpace, - DepthwiseConv2dNative: () => DepthwiseConv2dNative, - DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, - DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, - Diag: () => Diag, - Dilation2D: () => Dilation2D, - Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, - Dilation2DBackpropInput: () => Dilation2DBackpropInput, - ENV: () => ENV, - EarlyStopping: () => EarlyStopping, - Elu: () => Elu, - EluGrad: () => EluGrad, - Environment: () => Environment, - Equal: () => Equal, - Erf: () => Erf, - Exp: () => Exp, - ExpandDims: () => ExpandDims, - 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, - LRNGrad: () => LRNGrad, - LayerVariable: () => LayerVariable, - LayersModel: () => LayersModel, - LeakyRelu: () => LeakyRelu, - Less: () => Less, - LessEqual: () => LessEqual, - LinSpace: () => LinSpace, - Log: () => Log, - Log1p: () => Log1p, - LogSoftmax: () => LogSoftmax, - LogicalAnd: () => LogicalAnd, - LogicalNot: () => LogicalNot, - LogicalOr: () => LogicalOr, - Max: () => Max, - MaxPool: () => MaxPool, - MaxPool3D: () => MaxPool3D, - MaxPool3DGrad: () => MaxPool3DGrad, - MaxPoolGrad: () => MaxPoolGrad, - MaxPoolWithArgmax: () => MaxPoolWithArgmax, - Maximum: () => Maximum, - Mean: () => Mean, - Min: () => Min, - Minimum: () => Minimum, - MirrorPad: () => MirrorPad, - Mod: () => Mod, - MomentumOptimizer: () => MomentumOptimizer, - Multinomial: () => Multinomial, - Multiply: () => Multiply, - Neg: () => Neg, - NonMaxSuppressionV3: () => NonMaxSuppressionV3, - NonMaxSuppressionV4: () => NonMaxSuppressionV4, - NonMaxSuppressionV5: () => NonMaxSuppressionV5, - NotEqual: () => NotEqual, - OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, - OneHot: () => OneHot, - OnesLike: () => OnesLike, - Optimizer: () => Optimizer, - Pack: () => Pack, - PadV2: () => PadV2, - Pool: () => Pool, - Pow: () => Pow, - Prelu: () => Prelu, - Prod: () => Prod, - RMSPropOptimizer: () => RMSPropOptimizer, - RNN: () => RNN, - Range: () => Range, - Rank: () => Rank, - Real: () => Real, - RealDiv: () => RealDiv, - 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, - Select: () => Select, - 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, - Transform: () => Transform, - Transpose: () => Transpose, - Unique: () => Unique, - Unpack: () => Unpack, - UnsortedSegmentSum: () => UnsortedSegmentSum, - Variable: () => Variable, - ZerosLike: () => ZerosLike, - _FusedMatMul: () => _FusedMatMul, - abs: () => abs, - acos: () => acos, - acosh: () => acosh, - add: () => add2, - addN: () => addN, - all: () => all, - any: () => any, - argMax: () => argMax, - argMin: () => argMin, - asin: () => asin, - asinh: () => asinh, - atan: () => atan, - atan2: () => atan2, - atanh: () => atanh, - avgPool: () => avgPool, - avgPool3d: () => avgPool3d, - backend: () => backend, - backend_util: () => backend_util_exports, - basicLSTMCell: () => basicLSTMCell, - batchNorm: () => batchNorm, - batchNorm2d: () => batchNorm2d, - batchNorm3d: () => batchNorm3d, - batchNorm4d: () => batchNorm4d, - batchToSpaceND: () => batchToSpaceND, - bincount: () => bincount, - 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, - denseBincount: () => denseBincount, - 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, - dot: () => dot, - dropout: () => dropout, - elu: () => elu, - enableDebugMode: () => enableDebugMode, - enableProdMode: () => enableProdMode, - enclosingPowerOfTwo: () => enclosingPowerOfTwo, - engine: () => engine, - env: () => env, - equal: () => equal, - 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, - 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, - 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, - mean: () => mean, - memory: () => memory, - metrics: () => exports_metrics_exports, - min: () => min, - minimum: () => minimum, - mirrorPad: () => mirrorPad, - mod: () => mod, - model: () => model, - models: () => exports_models_exports, - moments: () => moments, - movingAverage: () => movingAverage, - mul: () => mul, - multiRNNCell: () => multiRNNCell, - multinomial: () => multinomial, - neg: () => neg, - nextFrame: () => nextFrame, - norm: () => norm, - notEqual: () => notEqual, - oneHot: () => oneHot, - ones: () => ones2, - onesLike: () => onesLike, - op: () => op, - outerProduct: () => outerProduct, - pad: () => pad, - pad1d: () => pad1d, - pad2d: () => pad2d, - pad3d: () => pad3d, - pad4d: () => pad4d, - pool: () => pool, - pow: () => pow, - 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: () => round2, - 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, - setWasmPath: () => setWasmPath, - setWasmPaths: () => setWasmPaths, - 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, - squeeze: () => squeeze, - stack: () => stack, - step: () => step, - stridedSlice: () => stridedSlice, - sub: () => sub, - sum: () => sum2, - sumOutType: () => sumOutType, - tan: () => tan, - tanh: () => tanh2, - tensor: () => tensor, - 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: () => version8, - version_converter: () => version3, - version_core: () => version, - version_layers: () => version2, - version_wasm: () => version9, - where: () => where, - whereAsync: () => whereAsync, - zeros: () => zeros, - zerosLike: () => zerosLike -}); -var __create2 = Object.create; -var __defProp2 = Object.defineProperty; -var __getProtoOf2 = Object.getPrototypeOf; -var __hasOwnProp2 = Object.prototype.hasOwnProperty; -var __getOwnPropNames2 = Object.getOwnPropertyNames; -var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; -var __markAsModule2 = (target) => __defProp2(target, "__esModule", {value: true}); -var __commonJS2 = (callback, module) => () => { - if (!module) { - module = {exports: {}}; - callback(module.exports, module); - } - return module.exports; -}; -var __export2 = (target, all4) => { - for (var name in all4) - __defProp2(target, name, {get: all4[name], enumerable: true}); -}; -var __exportStar2 = (target, module, desc) => { - if (module && typeof module === "object" || typeof module === "function") { - for (let key of __getOwnPropNames2(module)) - if (!__hasOwnProp2.call(target, key) && key !== "default") - __defProp2(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc2(module, key)) || desc.enumerable}); - } - return target; -}; -var __toModule2 = (module) => { - return __exportStar2(__markAsModule2(__defProp2(module != null ? __create2(__getProtoOf2(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); -}; -var require_browser = __commonJS2(() => { -}); -var require_alea = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xor128 = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xorwow = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xorshift7 = __commonJS2((exports, 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), state = 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 (state) { - if (state.x) - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xor4096 = __commonJS2((exports, 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), state = 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 (state) { - if (state.X) - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_tychei = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_crypto = __commonJS2(() => { -}); -var require_seedrandom = __commonJS2((exports, 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 seedrandom5(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, state) { - if (state) { - if (state.S) { - copy(state, 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] = seedrandom5; - 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 browser2 = global2.navigator, plugins = browser2 && browser2.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 = seedrandom5; - try { - nodecrypto = require_crypto(); - } catch (ex) { - } - } else if (typeof define == "function" && define.amd) { - define(function() { - return seedrandom5; - }); - } - })([], Math); -}); -var require_seedrandom2 = __commonJS2((exports, module) => { - var alea5 = 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 = alea5; - sr.xor128 = xor128; - sr.xorwow = xorwow; - sr.xorshift7 = xorshift7; - sr.xor4096 = xor4096; - sr.tychei = tychei; - module.exports = sr; -}); -var require_alea2 = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xor1282 = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xorwow2 = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xorshift72 = __commonJS2((exports, 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), state = 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 (state) { - if (state.x) - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_xor40962 = __commonJS2((exports, 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), state = 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 (state) { - if (state.X) - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_tychei2 = __commonJS2((exports, 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), state = 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 (state) { - if (typeof state == "object") - copy(state, 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; - } - })(exports, typeof module == "object" && module, typeof define == "function" && define); -}); -var require_seedrandom3 = __commonJS2((exports, 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 seedrandom5(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, state) { - if (state) { - if (state.S) { - copy(state, 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 browser2 = global2.navigator, plugins = browser2 && browser2.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 = seedrandom5; - try { - nodecrypto = require_crypto(); - } catch (ex) { - } - } else if (typeof define == "function" && define.amd) { - define(function() { - return seedrandom5; - }); - } else { - math["seed" + rngname] = seedrandom5; - } - })(typeof self !== "undefined" ? self : exports, [], Math); -}); -var require_seedrandom4 = __commonJS2((exports, module) => { - var alea5 = 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 = alea5; - sr.xor128 = xor128; - sr.xorwow = xorwow; - sr.xorshift7 = xorshift7; - sr.xor4096 = xor4096; - sr.tychei = tychei; - module.exports = sr; -}); -var require_string_decoder = __commonJS2(() => { -}); -var require_path = __commonJS2(() => { -}); -var require_worker_threads = __commonJS2(() => { -}); -var require_perf_hooks = __commonJS2(() => { -}); -var require_tfjs_backend_wasm_threaded_simd = __commonJS2((exports, 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 != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAP8; - } - function GROWABLE_HEAP_U8() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPU8; - } - function GROWABLE_HEAP_I32() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAP32; - } - function GROWABLE_HEAP_U32() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPU32; - } - function GROWABLE_HEAP_F64() { - if (wasmMemory.buffer != buffer2) { - updateGlobalBufferAndViews(wasmMemory.buffer); - } - return HEAPF64; - } - var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; - var readyPromiseResolve, readyPromiseReject; - Module["ready"] = new Promise(function(resolve, reject) { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - 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) { - buffer2 = Module["buffer"]; - } - 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; - } - global.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 (typeof document !== "undefined" && document.currentScript) { - scriptDirectory = document.currentScript.src; - } - if (typeof _scriptDir !== "undefined" && _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(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.send(null); - return xhr.responseText; - }; - if (ENVIRONMENT_IS_WORKER) { - readBinary = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.responseType = "arraybuffer"; - xhr.send(null); - return new Uint8Array(xhr.response); - }; - } - readAsync = function(url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, true); - xhr.responseType = "arraybuffer"; - xhr.onload = function() { - 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") { - global.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 = Module["noExitRuntime"] || true; - if (typeof WebAssembly !== "object") { - abort("no native wasm support detected"); - } - var wasmMemory; - var wasmModule; - var ABORT = false; - var EXITSTATUS; - 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 stack2 = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack2 === 0) - stack2 = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func2.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack2 !== 0) - stackRestore(stack2); - 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, buffer3) { - GROWABLE_HEAP_I8().set(array2, buffer3); - } - function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; - } - var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; - function updateGlobalBufferAndViews(buf) { - buffer2 = 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_MEMORY = Module["INITIAL_MEMORY"] || 16777216; - if (ENVIRONMENT_IS_PTHREAD) { - wasmMemory = Module["wasmMemory"]; - buffer2 = Module["buffer"]; - } else { - if (Module["wasmMemory"]) { - wasmMemory = Module["wasmMemory"]; - } else { - wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536, 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) { - buffer2 = wasmMemory.buffer; - } - INITIAL_MEMORY = buffer2.byteLength; - updateGlobalBufferAndViews(buffer2); - var wasmTable; - var __ATPRERUN__ = []; - var __ATINIT__ = []; - var __ATMAIN__ = []; - var __ATEXIT__ = []; - var __ATPOSTRUN__ = []; - var runtimeInitialized = false; - var runtimeExited = false; - if (!ENVIRONMENT_IS_PTHREAD) - __ATINIT__.push({func: function() { - ___wasm_call_ctors(); - }}); - 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 exitRuntime() { - if (ENVIRONMENT_IS_PTHREAD) - return; - runtimeExited = true; - } - 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 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 += ""; - err(what); - ABORT = true; - EXITSTATUS = 1; - what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - 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(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } 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)) { - if (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(wasmBinaryFile); - }); - } else { - if (readAsync) { - return new Promise(function(resolve, reject) { - readAsync(wasmBinaryFile, function(response) { - resolve(new Uint8Array(response)); - }, reject); - }); - } - } - } - return Promise.resolve().then(function() { - return getBinary(wasmBinaryFile); - }); - } - function createWasm() { - var info = {a: asmLibraryArg}; - function receiveInstance(instance, module2) { - var exports3 = instance.exports; - Module["asm"] = exports3; - wasmTable = Module["asm"]["F"]; - 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") { - return 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"); - return instantiateArrayBuffer(receiveInstantiatedSource); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiatedSource); - } - } - if (Module["instantiateWasm"]) { - try { - var exports2 = Module["instantiateWasm"](info, receiveInstance); - return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); - return false; - } - } - instantiateAsync().catch(readyPromiseReject); - return {}; - } - var ASM_CONSTS = {8991: function($0, $1) { - setTimeout(function() { - __emscripten_do_dispatch_to_thread($0, $1); - }, 0); - }}; - function initPthreadsJS() { - PThread.initRuntime(); - } - function callRuntimeCallbacks(callbacks2) { - while (callbacks2.length > 0) { - var callback = callbacks2.shift(); - if (typeof callback == "function") { - callback(Module); - continue; - } - var func2 = callback.func; - if (typeof func2 === "number") { - if (callback.arg === void 0) { - wasmTable.get(func2)(); - } else { - wasmTable.get(func2)(callback.arg); - } - } else { - func2(callback.arg === void 0 ? null : callback.arg); - } - } - } - 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(), __emscripten_main_thread_futex >> 2); - var mainThreadWoken = 0; - if (mainThreadWaitAddress == addr) { - var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 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 killThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! killThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in killThread!"; - 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 cancelThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! cancelThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in cancelThread!"; - var pthread = PThread.pthreads[pthread_ptr]; - pthread.worker.postMessage({cmd: "cancel"}); - } - function cleanupThread(pthread_ptr) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; - if (!pthread_ptr) - throw "Internal Error! Null pthread_ptr in cleanupThread!"; - 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 = {unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { - var pthreadPoolSize = 8; - for (var i = 0; i < pthreadPoolSize; ++i) { - PThread.allocateUnusedWorker(); - } - }, initRuntime: function() { - var tb = _malloc(228); - for (var i = 0; i < 228 / 4; ++i) - GROWABLE_HEAP_U32()[tb / 4 + i] = 0; - GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; - var headPtr = tb + 152; - GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; - var tlsMemory = _malloc(512); - for (var i = 0; i < 128; ++i) - GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; - Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); - Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); - __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); - _emscripten_register_main_browser_thread_id(tb); - }, initWorker: function() { - }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { - }, runExitHandlers: function() { - while (PThread.threadExitHandlers.length > 0) { - PThread.threadExitHandlers.pop()(); - } - if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) - ___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 + 56 >> 2, 1); - Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); - PThread.runExitHandlers(); - _emscripten_futex_wake(tb + 0, 2147483647); - __emscripten_thread_init(0, 0, 0); - if (ENVIRONMENT_IS_PTHREAD) { - postMessage({cmd: "exit"}); - } - } - }, threadCancel: function() { - PThread.runExitHandlers(); - var tb = _pthread_self(); - Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, -1); - Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); - _emscripten_futex_wake(tb + 0, 2147483647); - __emscripten_thread_init(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 + 100 >> 2]; - GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 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) { - PThread.runWithoutMainThreadQueuedCalls(function() { - delete PThread.pthreads[worker.pthread.threadInfoStruct]; - PThread.unusedWorkers.push(worker); - PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); - PThread.freeThreadData(worker.pthread); - worker.pthread = void 0; - }); - }, runWithoutMainThreadQueuedCalls: function(func2) { - GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; - try { - func2(); - } finally { - GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; - } - }, 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") { - spawnThread(e.data); - } else if (cmd === "cleanupThread") { - cleanupThread(d["thread"]); - } else if (cmd === "killThread") { - killThread(d["thread"]); - } else if (cmd === "cancelThread") { - cancelThread(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.threadInfoStruct + 64 >> 2); - if (detached) { - PThread.returnWorkerToPool(worker); - } - } else if (cmd === "exitProcess") { - try { - exit(d["returnCode"]); - } catch (e2) { - if (e2 instanceof ExitStatus) - return; - throw e2; - } - } 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) { - }); - } - worker.postMessage({cmd: "load", urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, wasmMemory, wasmModule}); - }, 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) { - _emscripten_stack_set_limits(stackTop, stackMax); - stackRestore(stackTop); - } - Module["establishStackSpace"] = establishStackSpace; - function getNoExitRuntime() { - return noExitRuntime; - } - Module["getNoExitRuntime"] = getNoExitRuntime; - function invokeEntryPoint(ptr, arg) { - return wasmTable.get(ptr)(arg); - } - Module["invokeEntryPoint"] = invokeEntryPoint; - 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); - } - 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_asm_const_int(code, sigPtr, argbuf) { - var args = readAsmConstArgs(sigPtr, argbuf); - return ASM_CONSTS[code].apply(null, args); - } - function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { - } - function _emscripten_futex_wait(addr, val, timeout) { - if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) - return -28; - if (!ENVIRONMENT_IS_WEB) { - 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 { - if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { - return -6; - } - var tNow = performance.now(); - var tEnd = tNow + timeout; - var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); - while (1) { - tNow = performance.now(); - if (tNow > tEnd) { - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); - return -73; - } - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); - if (lastAddr == 0) { - break; - } - _emscripten_main_thread_process_queued_calls(); - if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { - return -6; - } - lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); - } - return 0; - } - } - function _emscripten_memcpy_big(dest, src, num) { - GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); - } - function _emscripten_num_logical_cores() { - if (ENVIRONMENT_IS_NODE) - return require("os").cpus().length; - return navigator["hardwareConcurrency"]; - } - function _emscripten_proxy_to_main_thread_js(index, sync) { - var numCallArgs = arguments.length - 2; - var stack2 = stackSave(); - var serializedNumCallArgs = numCallArgs; - var args = stackAlloc(serializedNumCallArgs * 8); - var b = args >> 3; - for (var i = 0; i < numCallArgs; i++) { - var arg = arguments[2 + i]; - GROWABLE_HEAP_F64()[b + i] = arg; - } - var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); - stackRestore(stack2); - return ret; - } - var _emscripten_receive_on_main_thread_js_callArgs = []; - var readAsmConstArgsArray = []; - function readAsmConstArgs(sigPtr, buf) { - readAsmConstArgsArray.length = 0; - var ch; - buf >>= 2; - while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { - var double = ch < 105; - if (double && buf & 1) - buf++; - readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); - ++buf; - } - return readAsmConstArgsArray; - } - 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]; - 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 - buffer2.byteLength + 65535 >>> 16); - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1; - } catch (e) { - } - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = _emscripten_get_heap_size(); - if (requestedSize <= oldSize) { - return false; - } - var maxHeapSize = 2147483648; - if (requestedSize > maxHeapSize) { - return false; - } - 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(requestedSize, overGrownHeapSize), 65536)); - var replacement = emscripten_realloc_buffer(newSize); - if (replacement) { - return true; - } - } - return false; - } - var JSEvents = {inEventHandler: 0, 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); - } - }, 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_call_on_thread(0, 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_call_on_thread(0, 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) { - } - function _emscripten_set_thread_name(threadId, name) { - } - 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; - } - } - function __webgl_enable_WEBGL_multi_draw(ctx) { - return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); - } - var GL = {counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, 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; - }, 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"); - __webgl_enable_WEBGL_multi_draw(GLctx2); - var exts = GLctx2.getSupportedExtensions() || []; - exts.forEach(function(ext) { - if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { - GLctx2.getExtension(ext); - } - }); - }, populateUniformTable: function(program) { - var p2 = GL.programs[program]; - var ptable = GL.programInfos[program] = {uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1}; - var utable = ptable.uniforms; - var numUniforms = GLctx.getProgramParameter(p2, 35718); - for (var i = 0; i < numUniforms; ++i) { - var u = GLctx.getActiveUniform(p2, 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(p2, 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(p2, 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 a = attributes >> 2; - var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; - var contextAttributes = {alpha: !!GROWABLE_HEAP_I32()[a + (0 >> 2)], depth: !!GROWABLE_HEAP_I32()[a + (4 >> 2)], stencil: !!GROWABLE_HEAP_I32()[a + (8 >> 2)], antialias: !!GROWABLE_HEAP_I32()[a + (12 >> 2)], premultipliedAlpha: !!GROWABLE_HEAP_I32()[a + (16 >> 2)], preserveDrawingBuffer: !!GROWABLE_HEAP_I32()[a + (20 >> 2)], powerPreference: __emscripten_webgl_power_preferences[powerPreference], failIfMajorPerformanceCaveat: !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)]}; - var canvas = findCanvasEventTarget(target); - if (!canvas) { - return 0; - } - if (contextAttributes.explicitSwapControl) { - return 0; - } - var contextHandle = GL.createContext(canvas, contextAttributes); - return contextHandle; - } - function _emscripten_webgl_create_context(a0, a12) { - return _emscripten_webgl_do_create_context(a0, a12); - } - var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { - var buffer3 = SYSCALLS.buffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); - buffer3.length = 0; - } else { - buffer3.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.threadExitHandlers.pop(); - if (execute2) - routine(); - } - function _pthread_cleanup_push(routine, arg) { - PThread.threadExitHandlers.push(function() { - wasmTable.get(routine)(arg); - }); - } - function spawnThread(threadParams) { - if (ENVIRONMENT_IS_PTHREAD) - throw "Internal Error! spawnThread() 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, threadInfoStruct: threadParams.pthread_ptr}; - var tis = pthread.threadInfoStruct >> 2; - Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); - Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); - Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); - Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); - Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); - Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); - var global_libc = _emscripten_get_global_libc(); - var global_locale = global_libc + 40; - Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); - worker.pthread = pthread; - var msg = {cmd: "run", start_routine: threadParams.startRoutine, arg: threadParams.arg, threadInfoStruct: threadParams.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_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; - if (attr && attr != -1) { - stackSize = GROWABLE_HEAP_I32()[attr >> 2]; - stackSize += 81920; - stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; - detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; - } else { - stackSize = 2097152; - } - var allocatedOwnStack = stackBase == 0; - if (allocatedOwnStack) { - stackBase = _memalign(16, stackSize); - } else { - stackBase -= stackSize; - assert3(stackBase > 0); - } - var threadInfoStruct = _malloc(228); - for (var i = 0; i < 228 >> 2; ++i) - GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; - GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; - GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; - var headPtr = threadInfoStruct + 152; - GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; - var threadParams = {stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList}; - if (ENVIRONMENT_IS_PTHREAD) { - threadParams.cmd = "spawnThread"; - postMessage(threadParams, transferList); - } else { - spawnThread(threadParams); - } - return 0; - } - 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 82: - case 68: - case 67: - case 164: - case 11: - case 29: - case 47: - case 48: - case 95: - case 52: - case 51: - case 46: - 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: - case 80: - case 81: - case 79: - 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(); - var GLctx; - 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, x: __emscripten_notify_thread_queue, b: _abort, y: _emscripten_asm_const_int, j: _emscripten_conditional_set_current_thread_status, c: _emscripten_futex_wait, d: _emscripten_futex_wake, f: _emscripten_get_now, p: _emscripten_memcpy_big, z: _emscripten_num_logical_cores, u: _emscripten_receive_on_main_thread_js, q: _emscripten_resize_heap, v: _emscripten_set_canvas_element_size, i: _emscripten_set_current_thread_status, t: _emscripten_set_thread_name, w: _emscripten_webgl_create_context, m: _fd_close, n: _fd_seek, g: _fd_write, o: initPthreadsJS, a: wasmMemory || Module["wasmMemory"], k: _pthread_cleanup_pop, l: _pthread_cleanup_push, h: _pthread_create, s: _sysconf}; - var asm = createWasm(); - var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { - return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); - }; - var _init = Module["_init"] = function() { - return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); - }; - var _register_tensor = Module["_register_tensor"] = function() { - return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); - }; - var _dispose_data = Module["_dispose_data"] = function() { - return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); - }; - var _dispose = Module["_dispose"] = function() { - return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); - }; - var _Abs = Module["_Abs"] = function() { - return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); - }; - var _Add = Module["_Add"] = function() { - return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); - }; - var _AddN = Module["_AddN"] = function() { - return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); - }; - var _ArgMax = Module["_ArgMax"] = function() { - return (_ArgMax = Module["_ArgMax"] = Module["asm"]["J"]).apply(null, arguments); - }; - var _AvgPool = Module["_AvgPool"] = function() { - return (_AvgPool = Module["_AvgPool"] = Module["asm"]["K"]).apply(null, arguments); - }; - var _BatchMatMul = Module["_BatchMatMul"] = function() { - return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["L"]).apply(null, arguments); - }; - var _Ceil = Module["_Ceil"] = function() { - return (_Ceil = Module["_Ceil"] = 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 _Equal = Module["_Equal"] = function() { - return (_Equal = Module["_Equal"] = Module["asm"]["V"]).apply(null, arguments); - }; - var _Exp = Module["_Exp"] = function() { - return (_Exp = Module["_Exp"] = Module["asm"]["W"]).apply(null, arguments); - }; - var _FlipLeftRight = Module["_FlipLeftRight"] = function() { - return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["X"]).apply(null, arguments); - }; - var _Floor = Module["_Floor"] = function() { - return (_Floor = Module["_Floor"] = 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 _LeakyRelu = Module["_LeakyRelu"] = function() { - return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["fa"]).apply(null, arguments); - }; - var _Less = Module["_Less"] = function() { - return (_Less = Module["_Less"] = Module["asm"]["ga"]).apply(null, arguments); - }; - var _LessEqual = Module["_LessEqual"] = function() { - return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ha"]).apply(null, arguments); - }; - var _Log = Module["_Log"] = function() { - return (_Log = Module["_Log"] = Module["asm"]["ia"]).apply(null, arguments); - }; - var _LogicalAnd = Module["_LogicalAnd"] = function() { - return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["ja"]).apply(null, arguments); - }; - var _Max = Module["_Max"] = function() { - return (_Max = Module["_Max"] = Module["asm"]["ka"]).apply(null, arguments); - }; - var _MaxPool = Module["_MaxPool"] = function() { - return (_MaxPool = Module["_MaxPool"] = Module["asm"]["la"]).apply(null, arguments); - }; - var _Maximum = Module["_Maximum"] = function() { - return (_Maximum = Module["_Maximum"] = Module["asm"]["ma"]).apply(null, arguments); - }; - var _Mean = Module["_Mean"] = function() { - return (_Mean = Module["_Mean"] = Module["asm"]["na"]).apply(null, arguments); - }; - var _Min = Module["_Min"] = function() { - return (_Min = Module["_Min"] = Module["asm"]["oa"]).apply(null, arguments); - }; - var _Minimum = Module["_Minimum"] = function() { - return (_Minimum = Module["_Minimum"] = Module["asm"]["pa"]).apply(null, arguments); - }; - var _Multiply = Module["_Multiply"] = function() { - return (_Multiply = Module["_Multiply"] = Module["asm"]["qa"]).apply(null, arguments); - }; - var _Neg = Module["_Neg"] = function() { - return (_Neg = Module["_Neg"] = Module["asm"]["ra"]).apply(null, arguments); - }; - var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { - return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["sa"]).apply(null, arguments); - }; - var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { - return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ta"]).apply(null, arguments); - }; - var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { - return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ua"]).apply(null, arguments); - }; - var _NotEqual = Module["_NotEqual"] = function() { - return (_NotEqual = Module["_NotEqual"] = Module["asm"]["va"]).apply(null, arguments); - }; - var _OneHot = Module["_OneHot"] = function() { - return (_OneHot = Module["_OneHot"] = Module["asm"]["wa"]).apply(null, arguments); - }; - var _PadV2 = Module["_PadV2"] = function() { - return (_PadV2 = Module["_PadV2"] = Module["asm"]["xa"]).apply(null, arguments); - }; - var _Pow = Module["_Pow"] = function() { - return (_Pow = Module["_Pow"] = Module["asm"]["ya"]).apply(null, arguments); - }; - var _Prelu = Module["_Prelu"] = function() { - return (_Prelu = Module["_Prelu"] = Module["asm"]["za"]).apply(null, arguments); - }; - var _Prod = Module["_Prod"] = function() { - return (_Prod = Module["_Prod"] = Module["asm"]["Aa"]).apply(null, arguments); - }; - var _RealDiv = Module["_RealDiv"] = function() { - return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ba"]).apply(null, arguments); - }; - var _Relu = Module["_Relu"] = function() { - return (_Relu = Module["_Relu"] = Module["asm"]["Ca"]).apply(null, arguments); - }; - var _Relu6 = Module["_Relu6"] = function() { - return (_Relu6 = Module["_Relu6"] = Module["asm"]["Da"]).apply(null, arguments); - }; - var _ResizeBilinear = Module["_ResizeBilinear"] = function() { - return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ea"]).apply(null, arguments); - }; - var _Reverse = Module["_Reverse"] = function() { - return (_Reverse = Module["_Reverse"] = Module["asm"]["Fa"]).apply(null, arguments); - }; - var _RotateWithOffset = Module["_RotateWithOffset"] = function() { - return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ga"]).apply(null, arguments); - }; - var _Round = Module["_Round"] = function() { - return (_Round = Module["_Round"] = Module["asm"]["Ha"]).apply(null, arguments); - }; - var _Rsqrt = Module["_Rsqrt"] = function() { - return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Ia"]).apply(null, arguments); - }; - var _ScatterNd = Module["_ScatterNd"] = function() { - return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ja"]).apply(null, arguments); - }; - var _SelectV2 = Module["_SelectV2"] = function() { - return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Ka"]).apply(null, arguments); - }; - var _Sigmoid = Module["_Sigmoid"] = function() { - return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["La"]).apply(null, arguments); - }; - var _Sin = Module["_Sin"] = function() { - return (_Sin = Module["_Sin"] = Module["asm"]["Ma"]).apply(null, arguments); - }; - var _Softmax = Module["_Softmax"] = function() { - return (_Softmax = Module["_Softmax"] = Module["asm"]["Na"]).apply(null, arguments); - }; - var _Sqrt = Module["_Sqrt"] = function() { - return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Oa"]).apply(null, arguments); - }; - var _Square = Module["_Square"] = function() { - return (_Square = Module["_Square"] = Module["asm"]["Pa"]).apply(null, arguments); - }; - var _SquaredDifference = Module["_SquaredDifference"] = function() { - return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Qa"]).apply(null, arguments); - }; - var _Step = Module["_Step"] = function() { - return (_Step = Module["_Step"] = Module["asm"]["Ra"]).apply(null, arguments); - }; - var _StridedSlice = Module["_StridedSlice"] = function() { - return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Sa"]).apply(null, arguments); - }; - var _Sub = Module["_Sub"] = function() { - return (_Sub = Module["_Sub"] = Module["asm"]["Ta"]).apply(null, arguments); - }; - var _Sum = Module["_Sum"] = function() { - return (_Sum = Module["_Sum"] = Module["asm"]["Ua"]).apply(null, arguments); - }; - var _Tanh = Module["_Tanh"] = function() { - return (_Tanh = Module["_Tanh"] = Module["asm"]["Va"]).apply(null, arguments); - }; - var _Tile = Module["_Tile"] = function() { - return (_Tile = Module["_Tile"] = Module["asm"]["Wa"]).apply(null, arguments); - }; - var _TopK = Module["_TopK"] = function() { - return (_TopK = Module["_TopK"] = Module["asm"]["Xa"]).apply(null, arguments); - }; - var _Transpose = Module["_Transpose"] = function() { - return (_Transpose = Module["_Transpose"] = Module["asm"]["Ya"]).apply(null, arguments); - }; - var __FusedMatMul = Module["__FusedMatMul"] = function() { - return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Za"]).apply(null, arguments); - }; - var _malloc = Module["_malloc"] = function() { - return (_malloc = Module["_malloc"] = Module["asm"]["_a"]).apply(null, arguments); - }; - var _free = Module["_free"] = function() { - return (_free = Module["_free"] = Module["asm"]["$a"]).apply(null, arguments); - }; - var ___errno_location = Module["___errno_location"] = function() { - return (___errno_location = Module["___errno_location"] = Module["asm"]["ab"]).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"]["bb"]).apply(null, arguments); - }; - var _pthread_self = Module["_pthread_self"] = function() { - return (_pthread_self = Module["_pthread_self"] = Module["asm"]["cb"]).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"]["db"]).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"]["eb"]).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"]["fb"]).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"]["gb"]).apply(null, arguments); - }; - var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { - return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["hb"]).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"]["ib"]).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"]["jb"]).apply(null, arguments); - }; - var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { - return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["kb"]).apply(null, arguments); - }; - var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { - return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["lb"]).apply(null, arguments); - }; - var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { - return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["mb"]).apply(null, arguments); - }; - var stackSave = Module["stackSave"] = function() { - return (stackSave = Module["stackSave"] = Module["asm"]["nb"]).apply(null, arguments); - }; - var stackRestore = Module["stackRestore"] = function() { - return (stackRestore = Module["stackRestore"] = Module["asm"]["ob"]).apply(null, arguments); - }; - var stackAlloc = Module["stackAlloc"] = function() { - return (stackAlloc = Module["stackAlloc"] = Module["asm"]["pb"]).apply(null, arguments); - }; - var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { - return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["qb"]).apply(null, arguments); - }; - var _memalign = Module["_memalign"] = function() { - return (_memalign = Module["_memalign"] = Module["asm"]["rb"]).apply(null, arguments); - }; - var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9880; - var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11368; - Module["cwrap"] = cwrap; - Module["PThread"] = PThread; - Module["PThread"] = PThread; - Module["wasmMemory"] = wasmMemory; - Module["ExitStatus"] = ExitStatus; - var calledRun; - 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; - } - if (ENVIRONMENT_IS_PTHREAD) { - readyPromiseResolve(Module); - postMessage({cmd: "loaded"}); - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) - return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) - return; - initRuntime(); - preMain(); - readyPromiseResolve(Module); - 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; - function exit(status, implicit) { - if (implicit && noExitRuntime && status === 0) { - return; - } - if (!implicit) { - if (ENVIRONMENT_IS_PTHREAD) { - postMessage({cmd: "exitProcess", returnCode: status}); - throw new ExitStatus(status); - } else { - } - } - if (noExitRuntime) { - } else { - PThread.terminateAllThreads(); - EXITSTATUS = status; - exitRuntime(); - if (Module["onExit"]) - Module["onExit"](status); - ABORT = true; - } - 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()(); - } - } - if (ENVIRONMENT_IS_PTHREAD) { - noExitRuntime = false; - PThread.initWorker(); - } - run(); - return WasmBackendModuleThreadedSimd2.ready; - }; - }(); - if (typeof exports === "object" && typeof module === "object") - module.exports = WasmBackendModuleThreadedSimd; - else if (typeof define === "function" && define["amd"]) - define([], function() { - return WasmBackendModuleThreadedSimd; - }); - else if (typeof exports === "object") - exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; -}); -var require_tfjs_backend_wasm = __commonJS2((exports, 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 readyPromiseResolve, readyPromiseReject; - Module["ready"] = new Promise(function(resolve, reject) { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - 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 (typeof document !== "undefined" && 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(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.send(null); - return xhr.responseText; - }; - if (ENVIRONMENT_IS_WORKER) { - readBinary = function(url) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, false); - xhr.responseType = "arraybuffer"; - xhr.send(null); - return new Uint8Array(xhr.response); - }; - } - readAsync = function(url, onload, onerror) { - var xhr = new XMLHttpRequest(); - xhr.open("GET", url, true); - xhr.responseType = "arraybuffer"; - xhr.onload = function() { - 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 = Module["noExitRuntime"] || true; - if (typeof WebAssembly !== "object") { - abort("no native wasm support detected"); - } - var wasmMemory; - var ABORT = false; - var EXITSTATUS; - 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 stack2 = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack2 === 0) - stack2 = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func2.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack2 !== 0) - stackRestore(stack2); - 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, buffer3) { - HEAP8.set(array2, buffer3); - } - function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; - } - var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; - function updateGlobalBufferAndViews(buf) { - buffer2 = 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_MEMORY = Module["INITIAL_MEMORY"] || 16777216; - var wasmTable; - var __ATPRERUN__ = []; - var __ATINIT__ = []; - var __ATMAIN__ = []; - var __ATPOSTRUN__ = []; - var runtimeInitialized = false; - __ATINIT__.push({func: function() { - ___wasm_call_ctors(); - }}); - 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 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 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 += ""; - err(what); - ABORT = true; - EXITSTATUS = 1; - what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - 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(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - if (readBinary) { - return readBinary(file); - } 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)) { - if (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(wasmBinaryFile); - }); - } else { - if (readAsync) { - return new Promise(function(resolve, reject) { - readAsync(wasmBinaryFile, function(response) { - resolve(new Uint8Array(response)); - }, reject); - }); - } - } - } - return Promise.resolve().then(function() { - return getBinary(wasmBinaryFile); - }); - } - function createWasm() { - var info = {a: asmLibraryArg}; - function receiveInstance(instance, module2) { - var exports3 = instance.exports; - Module["asm"] = exports3; - wasmMemory = Module["asm"]["g"]; - updateGlobalBufferAndViews(wasmMemory.buffer); - wasmTable = Module["asm"]["m"]; - 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") { - return 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"); - return instantiateArrayBuffer(receiveInstantiatedSource); - }); - }); - } else { - return instantiateArrayBuffer(receiveInstantiatedSource); - } - } - if (Module["instantiateWasm"]) { - try { - var exports2 = Module["instantiateWasm"](info, receiveInstance); - return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); - return false; - } - } - instantiateAsync().catch(readyPromiseReject); - return {}; - } - function callRuntimeCallbacks(callbacks2) { - while (callbacks2.length > 0) { - var callback = callbacks2.shift(); - if (typeof callback == "function") { - callback(Module); - continue; - } - var func2 = callback.func; - if (typeof func2 === "number") { - if (callback.arg === void 0) { - wasmTable.get(func2)(); - } else { - wasmTable.get(func2)(callback.arg); - } - } else { - func2(callback.arg === void 0 ? null : callback.arg); - } - } - } - function _abort() { - abort(); - } - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } - function _emscripten_get_heap_size() { - return HEAPU8.length; - } - function emscripten_realloc_buffer(size) { - try { - wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1; - } catch (e) { - } - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = _emscripten_get_heap_size(); - var maxHeapSize = 2147483648; - if (requestedSize > maxHeapSize) { - return false; - } - 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(requestedSize, overGrownHeapSize), 65536)); - var replacement = emscripten_realloc_buffer(newSize); - if (replacement) { - return true; - } - } - return false; - } - var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { - var buffer3 = SYSCALLS.buffers[stream]; - if (curr === 0 || curr === 10) { - (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); - buffer3.length = 0; - } else { - buffer3.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; - } - var asmLibraryArg = {a: _abort, d: _emscripten_memcpy_big, e: _emscripten_resize_heap, f: _fd_close, c: _fd_seek, b: _fd_write}; - var asm = createWasm(); - var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { - return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["h"]).apply(null, arguments); - }; - var _init = Module["_init"] = function() { - return (_init = Module["_init"] = Module["asm"]["i"]).apply(null, arguments); - }; - var _register_tensor = Module["_register_tensor"] = function() { - return (_register_tensor = Module["_register_tensor"] = Module["asm"]["j"]).apply(null, arguments); - }; - var _dispose_data = Module["_dispose_data"] = function() { - return (_dispose_data = Module["_dispose_data"] = Module["asm"]["k"]).apply(null, arguments); - }; - var _dispose = Module["_dispose"] = function() { - return (_dispose = Module["_dispose"] = Module["asm"]["l"]).apply(null, arguments); - }; - var _Abs = Module["_Abs"] = function() { - return (_Abs = Module["_Abs"] = Module["asm"]["n"]).apply(null, arguments); - }; - var _Add = Module["_Add"] = function() { - return (_Add = Module["_Add"] = Module["asm"]["o"]).apply(null, arguments); - }; - var _AddN = Module["_AddN"] = function() { - return (_AddN = Module["_AddN"] = Module["asm"]["p"]).apply(null, arguments); - }; - var _ArgMax = Module["_ArgMax"] = function() { - return (_ArgMax = Module["_ArgMax"] = Module["asm"]["q"]).apply(null, arguments); - }; - var _AvgPool = Module["_AvgPool"] = function() { - return (_AvgPool = Module["_AvgPool"] = Module["asm"]["r"]).apply(null, arguments); - }; - var _BatchMatMul = Module["_BatchMatMul"] = function() { - return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["s"]).apply(null, arguments); - }; - var _Ceil = Module["_Ceil"] = function() { - return (_Ceil = Module["_Ceil"] = Module["asm"]["t"]).apply(null, arguments); - }; - var _ClipByValue = Module["_ClipByValue"] = function() { - return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["u"]).apply(null, arguments); - }; - var _Conv2D = Module["_Conv2D"] = function() { - return (_Conv2D = Module["_Conv2D"] = Module["asm"]["v"]).apply(null, arguments); - }; - var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { - return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["w"]).apply(null, arguments); - }; - var _Cos = Module["_Cos"] = function() { - return (_Cos = Module["_Cos"] = Module["asm"]["x"]).apply(null, arguments); - }; - var _CropAndResize = Module["_CropAndResize"] = function() { - return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["y"]).apply(null, arguments); - }; - var _Cumsum = Module["_Cumsum"] = function() { - return (_Cumsum = Module["_Cumsum"] = Module["asm"]["z"]).apply(null, arguments); - }; - var _DepthToSpace = Module["_DepthToSpace"] = function() { - return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["A"]).apply(null, arguments); - }; - var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { - return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["B"]).apply(null, arguments); - }; - var _Equal = Module["_Equal"] = function() { - return (_Equal = Module["_Equal"] = Module["asm"]["C"]).apply(null, arguments); - }; - var _Exp = Module["_Exp"] = function() { - return (_Exp = Module["_Exp"] = Module["asm"]["D"]).apply(null, arguments); - }; - var _FlipLeftRight = Module["_FlipLeftRight"] = function() { - return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["E"]).apply(null, arguments); - }; - var _Floor = Module["_Floor"] = function() { - return (_Floor = Module["_Floor"] = Module["asm"]["F"]).apply(null, arguments); - }; - var _FloorDiv = Module["_FloorDiv"] = function() { - return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["G"]).apply(null, arguments); - }; - var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { - return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["H"]).apply(null, arguments); - }; - var _FusedConv2D = Module["_FusedConv2D"] = function() { - return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["I"]).apply(null, arguments); - }; - var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { - return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["J"]).apply(null, arguments); - }; - var _Gather = Module["_Gather"] = function() { - return (_Gather = Module["_Gather"] = Module["asm"]["K"]).apply(null, arguments); - }; - var _GatherNd = Module["_GatherNd"] = function() { - return (_GatherNd = Module["_GatherNd"] = Module["asm"]["L"]).apply(null, arguments); - }; - var _Greater = Module["_Greater"] = function() { - return (_Greater = Module["_Greater"] = Module["asm"]["M"]).apply(null, arguments); - }; - var _GreaterEqual = Module["_GreaterEqual"] = function() { - return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["N"]).apply(null, arguments); - }; - var _LeakyRelu = Module["_LeakyRelu"] = function() { - return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["O"]).apply(null, arguments); - }; - var _Less = Module["_Less"] = function() { - return (_Less = Module["_Less"] = Module["asm"]["P"]).apply(null, arguments); - }; - var _LessEqual = Module["_LessEqual"] = function() { - return (_LessEqual = Module["_LessEqual"] = Module["asm"]["Q"]).apply(null, arguments); - }; - var _Log = Module["_Log"] = function() { - return (_Log = Module["_Log"] = Module["asm"]["R"]).apply(null, arguments); - }; - var _LogicalAnd = Module["_LogicalAnd"] = function() { - return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["S"]).apply(null, arguments); - }; - var _Max = Module["_Max"] = function() { - return (_Max = Module["_Max"] = Module["asm"]["T"]).apply(null, arguments); - }; - var _MaxPool = Module["_MaxPool"] = function() { - return (_MaxPool = Module["_MaxPool"] = Module["asm"]["U"]).apply(null, arguments); - }; - var _Maximum = Module["_Maximum"] = function() { - return (_Maximum = Module["_Maximum"] = Module["asm"]["V"]).apply(null, arguments); - }; - var _Mean = Module["_Mean"] = function() { - return (_Mean = Module["_Mean"] = Module["asm"]["W"]).apply(null, arguments); - }; - var _Min = Module["_Min"] = function() { - return (_Min = Module["_Min"] = Module["asm"]["X"]).apply(null, arguments); - }; - var _Minimum = Module["_Minimum"] = function() { - return (_Minimum = Module["_Minimum"] = Module["asm"]["Y"]).apply(null, arguments); - }; - var _Multiply = Module["_Multiply"] = function() { - return (_Multiply = Module["_Multiply"] = Module["asm"]["Z"]).apply(null, arguments); - }; - var _Neg = Module["_Neg"] = function() { - return (_Neg = Module["_Neg"] = Module["asm"]["_"]).apply(null, arguments); - }; - var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { - return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["$"]).apply(null, arguments); - }; - var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { - return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["aa"]).apply(null, arguments); - }; - var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { - return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ba"]).apply(null, arguments); - }; - var _NotEqual = Module["_NotEqual"] = function() { - return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ca"]).apply(null, arguments); - }; - var _OneHot = Module["_OneHot"] = function() { - return (_OneHot = Module["_OneHot"] = Module["asm"]["da"]).apply(null, arguments); - }; - var _PadV2 = Module["_PadV2"] = function() { - return (_PadV2 = Module["_PadV2"] = Module["asm"]["ea"]).apply(null, arguments); - }; - var _Pow = Module["_Pow"] = function() { - return (_Pow = Module["_Pow"] = Module["asm"]["fa"]).apply(null, arguments); - }; - var _Prelu = Module["_Prelu"] = function() { - return (_Prelu = Module["_Prelu"] = Module["asm"]["ga"]).apply(null, arguments); - }; - var _Prod = Module["_Prod"] = function() { - return (_Prod = Module["_Prod"] = Module["asm"]["ha"]).apply(null, arguments); - }; - var _RealDiv = Module["_RealDiv"] = function() { - return (_RealDiv = Module["_RealDiv"] = Module["asm"]["ia"]).apply(null, arguments); - }; - var _Relu = Module["_Relu"] = function() { - return (_Relu = Module["_Relu"] = Module["asm"]["ja"]).apply(null, arguments); - }; - var _Relu6 = Module["_Relu6"] = function() { - return (_Relu6 = Module["_Relu6"] = Module["asm"]["ka"]).apply(null, arguments); - }; - var _ResizeBilinear = Module["_ResizeBilinear"] = function() { - return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["la"]).apply(null, arguments); - }; - var _Reverse = Module["_Reverse"] = function() { - return (_Reverse = Module["_Reverse"] = Module["asm"]["ma"]).apply(null, arguments); - }; - var _RotateWithOffset = Module["_RotateWithOffset"] = function() { - return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["na"]).apply(null, arguments); - }; - var _Round = Module["_Round"] = function() { - return (_Round = Module["_Round"] = Module["asm"]["oa"]).apply(null, arguments); - }; - var _Rsqrt = Module["_Rsqrt"] = function() { - return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["pa"]).apply(null, arguments); - }; - var _ScatterNd = Module["_ScatterNd"] = function() { - return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["qa"]).apply(null, arguments); - }; - var _SelectV2 = Module["_SelectV2"] = function() { - return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ra"]).apply(null, arguments); - }; - var _Sigmoid = Module["_Sigmoid"] = function() { - return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["sa"]).apply(null, arguments); - }; - var _Sin = Module["_Sin"] = function() { - return (_Sin = Module["_Sin"] = Module["asm"]["ta"]).apply(null, arguments); - }; - var _Softmax = Module["_Softmax"] = function() { - return (_Softmax = Module["_Softmax"] = Module["asm"]["ua"]).apply(null, arguments); - }; - var _Sqrt = Module["_Sqrt"] = function() { - return (_Sqrt = Module["_Sqrt"] = Module["asm"]["va"]).apply(null, arguments); - }; - var _Square = Module["_Square"] = function() { - return (_Square = Module["_Square"] = Module["asm"]["wa"]).apply(null, arguments); - }; - var _SquaredDifference = Module["_SquaredDifference"] = function() { - return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["xa"]).apply(null, arguments); - }; - var _Step = Module["_Step"] = function() { - return (_Step = Module["_Step"] = Module["asm"]["ya"]).apply(null, arguments); - }; - var _StridedSlice = Module["_StridedSlice"] = function() { - return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["za"]).apply(null, arguments); - }; - var _Sub = Module["_Sub"] = function() { - return (_Sub = Module["_Sub"] = Module["asm"]["Aa"]).apply(null, arguments); - }; - var _Sum = Module["_Sum"] = function() { - return (_Sum = Module["_Sum"] = Module["asm"]["Ba"]).apply(null, arguments); - }; - var _Tanh = Module["_Tanh"] = function() { - return (_Tanh = Module["_Tanh"] = Module["asm"]["Ca"]).apply(null, arguments); - }; - var _Tile = Module["_Tile"] = function() { - return (_Tile = Module["_Tile"] = Module["asm"]["Da"]).apply(null, arguments); - }; - var _TopK = Module["_TopK"] = function() { - return (_TopK = Module["_TopK"] = Module["asm"]["Ea"]).apply(null, arguments); - }; - var _Transpose = Module["_Transpose"] = function() { - return (_Transpose = Module["_Transpose"] = Module["asm"]["Fa"]).apply(null, arguments); - }; - var __FusedMatMul = Module["__FusedMatMul"] = function() { - return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Ga"]).apply(null, arguments); - }; - var _malloc = Module["_malloc"] = function() { - return (_malloc = Module["_malloc"] = Module["asm"]["Ha"]).apply(null, arguments); - }; - var _free = Module["_free"] = function() { - return (_free = Module["_free"] = Module["asm"]["Ia"]).apply(null, arguments); - }; - var stackSave = Module["stackSave"] = function() { - return (stackSave = Module["stackSave"] = Module["asm"]["Ja"]).apply(null, arguments); - }; - var stackRestore = Module["stackRestore"] = function() { - return (stackRestore = Module["stackRestore"] = Module["asm"]["Ka"]).apply(null, arguments); - }; - var stackAlloc = Module["stackAlloc"] = function() { - return (stackAlloc = Module["stackAlloc"] = Module["asm"]["La"]).apply(null, arguments); - }; - Module["cwrap"] = cwrap; - var calledRun; - 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(); - readyPromiseResolve(Module); - 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()(); - } - } - run(); - return WasmBackendModule2.ready; - }; - }(); - if (typeof exports === "object" && typeof module === "object") - module.exports = WasmBackendModule; - else if (typeof define === "function" && define["amd"]) - define([], function() { - return WasmBackendModule; - }); - else if (typeof exports === "object") - exports["WasmBackendModule"] = WasmBackendModule; -}); -/** - * @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. - * ============================================================================= - */ -var EPSILON_FLOAT32 = 1e-7; -var EPSILON_FLOAT16 = 1e-4; -var DataStorage = class { - constructor(backend2, dataMover) { - this.backend = backend2; - 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; - } -}; -var KernelBackend = class { - refCount(dataId) { - return notYetImplemented("refCount"); - } - incRef(dataId) { - return notYetImplemented("incRef"); - } - timerAvailable() { - return true; - } - time(f) { - return notYetImplemented("time"); - } - read(dataId) { - return notYetImplemented("read"); - } - readSync(dataId) { - return notYetImplemented("readSync"); - } - numDataIds() { - return notYetImplemented("numDataIds"); - } - disposeData(dataId, force) { - return notYetImplemented("disposeData"); - } - write(values, shape, dtype) { - return notYetImplemented("write"); - } - move(dataId, values, shape, dtype, refCount) { - return notYetImplemented("move"); - } - memory() { - return notYetImplemented("memory"); - } - floatPrecision() { - return notYetImplemented("floatPrecision"); - } - epsilon() { - return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; - } - 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`); -} -/** - * @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 shuffleCombo(array2, array22) { - if (array2.length !== array22.length) { - throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); - } - let counter = array2.length; - let temp, temp2; - let index = 0; - while (counter > 0) { - index = Math.random() * counter | 0; - counter--; - temp = array2[counter]; - temp2 = array22[counter]; - array2[counter] = array2[index]; - array22[counter] = array22[index]; - array2[index] = temp; - array22[index] = temp2; - } -} -function clamp(min6, x, max6) { - return Math.max(min6, Math.min(x, max6)); -} -function nearestLargerEven(val) { - return val % 2 === 0 ? val : val + 1; -} -function sum(arr) { - let sum6 = 0; - for (let i = 0; i < arr.length; i++) { - sum6 += arr[i]; - } - return sum6; -} -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"; -} -/** - * @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 TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; -var Environment = class { - 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(flags) { - this.flags = Object.assign({}, flags); - } - 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; -} -var ENV = null; -function setEnvironmentGlobal(environment2) { - ENV = environment2; -} -/** - * @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. - * ============================================================================= - */ -var 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); - } -} -var Abs = "Abs"; -var Acos = "Acos"; -var Acosh = "Acosh"; -var Add = "Add"; -var AddN = "AddN"; -var All = "All"; -var Any = "Any"; -var ArgMax = "ArgMax"; -var ArgMin = "ArgMin"; -var Asin = "Asin"; -var Asinh = "Asinh"; -var Atan = "Atan"; -var Atanh = "Atanh"; -var Atan2 = "Atan2"; -var AvgPool = "AvgPool"; -var AvgPoolGrad = "AvgPoolGrad"; -var AvgPool3D = "AvgPool3D"; -var AvgPool3DGrad = "AvgPool3DGrad"; -var BatchMatMul = "BatchMatMul"; -var BatchToSpaceND = "BatchToSpaceND"; -var Bincount = "Bincount"; -var BroadcastTo = "BroadcastTo"; -var Cast = "Cast"; -var Ceil = "Ceil"; -var ClipByValue = "ClipByValue"; -var Complex = "Complex"; -var ComplexAbs = "ComplexAbs"; -var Concat = "Concat"; -var Conv2D = "Conv2D"; -var Conv2DBackpropFilter = "Conv2DBackpropFilter"; -var Conv2DBackpropInput = "Conv2DBackpropInput"; -var Conv3D = "Conv3D"; -var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; -var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; -var Cos = "Cos"; -var Cosh = "Cosh"; -var Cumsum = "Cumsum"; -var CropAndResize = "CropAndResize"; -var DenseBincount = "DenseBincount"; -var DepthToSpace = "DepthToSpace"; -var DepthwiseConv2dNative = "DepthwiseConv2dNative"; -var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; -var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; -var Diag = "Diag"; -var Dilation2D = "Dilation2D"; -var Dilation2DBackpropInput = "Dilation2DBackpropInput"; -var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; -var RealDiv = "RealDiv"; -var Elu = "Elu"; -var EluGrad = "EluGrad"; -var Erf = "Erf"; -var Equal = "Equal"; -var Exp = "Exp"; -var ExpandDims = "ExpandDims"; -var Expm1 = "Expm1"; -var FFT = "FFT"; -var Fill = "Fill"; -var FlipLeftRight = "FlipLeftRight"; -var Floor = "Floor"; -var FloorDiv = "FloorDiv"; -var FusedBatchNorm = "FusedBatchNorm"; -var GatherV2 = "GatherV2"; -var GatherNd = "GatherNd"; -var Greater = "Greater"; -var GreaterEqual = "GreaterEqual"; -var Identity = "Identity"; -var IFFT = "IFFT"; -var Imag = "Imag"; -var IsFinite = "IsFinite"; -var IsInf = "IsInf"; -var IsNan = "IsNan"; -var LeakyRelu = "LeakyRelu"; -var Less = "Less"; -var LessEqual = "LessEqual"; -var LinSpace = "LinSpace"; -var Log = "Log"; -var Log1p = "Log1p"; -var LogicalAnd = "LogicalAnd"; -var LogicalNot = "LogicalNot"; -var LogicalOr = "LogicalOr"; -var LogSoftmax = "LogSoftmax"; -var LRN = "LRN"; -var LRNGrad = "LRNGrad"; -var Max = "Max"; -var Maximum = "Maximum"; -var MaxPool = "MaxPool"; -var MaxPoolGrad = "MaxPoolGrad"; -var MaxPool3D = "MaxPool3D"; -var MaxPool3DGrad = "MaxPool3DGrad"; -var MaxPoolWithArgmax = "MaxPoolWithArgmax"; -var Mean = "Mean"; -var Min = "Min"; -var Minimum = "Minimum"; -var MirrorPad = "MirrorPad"; -var Mod = "Mod"; -var Multinomial = "Multinomial"; -var Multiply = "Multiply"; -var Neg = "Neg"; -var NotEqual = "NotEqual"; -var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; -var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; -var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; -var OnesLike = "OnesLike"; -var OneHot = "OneHot"; -var Pack = "Pack"; -var PadV2 = "PadV2"; -var Pool = "Pool"; -var Pow = "Pow"; -var Prelu = "Prelu"; -var Prod = "Prod"; -var Range = "Range"; -var Real = "Real"; -var Reciprocal = "Reciprocal"; -var Relu = "Relu"; -var Reshape = "Reshape"; -var ResizeNearestNeighbor = "ResizeNearestNeighbor"; -var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; -var ResizeBilinear = "ResizeBilinear"; -var ResizeBilinearGrad = "ResizeBilinearGrad"; -var Relu6 = "Relu6"; -var Reverse = "Reverse"; -var Round = "Round"; -var Rsqrt = "Rsqrt"; -var ScatterNd = "ScatterNd"; -var Select = "Select"; -var Selu = "Selu"; -var Slice = "Slice"; -var Sin = "Sin"; -var Sinh = "Sinh"; -var Sign = "Sign"; -var Sigmoid = "Sigmoid"; -var Softplus = "Softplus"; -var Sqrt = "Sqrt"; -var Sum = "Sum"; -var SpaceToBatchND = "SpaceToBatchND"; -var SplitV = "SplitV"; -var Softmax = "Softmax"; -var SquaredDifference = "SquaredDifference"; -var Square = "Square"; -var Sub = "Sub"; -var SparseToDense = "SparseToDense"; -var StridedSlice = "StridedSlice"; -var Tan = "Tan"; -var Tanh = "Tanh"; -var Tile = "Tile"; -var TopK = "TopK"; -var Transform = "Transform"; -var Transpose = "Transpose"; -var Unique = "Unique"; -var Unpack = "Unpack"; -var UnsortedSegmentSum = "UnsortedSegmentSum"; -var ZerosLike = "ZerosLike"; -var Step = "Step"; -var FromPixels = "FromPixels"; -var RotateWithOffset = "RotateWithOffset"; -var _FusedMatMul = "_FusedMatMul"; -var FusedConv2D = "FusedConv2D"; -var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; -/** - * @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. - * ============================================================================= - */ -var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); -var 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 [backend2] = key.split("_"); - if (backend2 === 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}`; -} -var util_exports = {}; -__export2(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, - shuffleCombo: () => shuffleCombo, - 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); -} -/** - * @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. - * ============================================================================= - */ -var Profiler = class { - 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(); - }; - let timer; - const start = now(); - if (this.backendTimer.timerAvailable()) { - timer = this.backendTimer.time(holdResultWrapperFn); - } else { - holdResultWrapperFn(); - for (const output of outputs) { - output.dataSync(); - } - timer = Promise.resolve({kernelMs: now() - start}); - } - if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { - 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; -} -var Logger = class { - 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"); - } -}; -/** - * @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(tape, xs, y) { - const tensorsFromX = {}; - const nodesFromX = {}; - for (let i = 0; i < xs.length; i++) { - tensorsFromX[xs[i].id] = true; - } - for (let i = 0; i < tape.length; i++) { - const node2 = tape[i]; - const nodeInputs = node2.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]) { - node2.outputs.forEach((output) => tensorsFromX[output.id] = true); - anyInputFromX = true; - nodesFromX[node2.id] = true; - break; - } - } - if (anyInputFromX) { - break; - } - } - } - const tensorsLeadToY = {}; - tensorsLeadToY[y.id] = true; - const nodesToY = {}; - for (let i = tape.length - 1; i >= 0; i--) { - const node2 = tape[i]; - const nodeInputs = node2.inputs; - for (let j = 0; j < node2.outputs.length; j++) { - if (tensorsLeadToY[node2.outputs[j].id]) { - for (const inputName in nodeInputs) { - tensorsLeadToY[nodeInputs[inputName].id] = true; - nodesToY[node2.id] = true; - } - break; - } - } - } - const filteredTape = []; - for (let i = 0; i < tape.length; i++) { - const node2 = tape[i]; - if (nodesFromX[node2.id] && nodesToY[node2.id]) { - const prunedInputs = {}; - for (const inputName in node2.inputs) { - const nodeInput = node2.inputs[inputName]; - if (tensorsFromX[nodeInput.id]) { - prunedInputs[inputName] = nodeInput; - } - } - const prunedNode = Object.assign({}, node2); - prunedNode.inputs = prunedInputs; - prunedNode.outputs = node2.outputs; - filteredTape.push(prunedNode); - } - } - return filteredTape; -} -function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { - for (let i = filteredTape.length - 1; i >= 0; i--) { - const node2 = filteredTape[i]; - const dys = []; - node2.outputs.forEach((o) => { - const gradTensor = tensorAccumulatedGradientMap[o.id]; - if (gradTensor != null) { - dys.push(gradTensor); - } else { - dys.push(null); - } - }); - if (node2.gradient == null) { - throw new Error(`Cannot compute gradient: gradient function not found for ${node2.kernelName}.`); - } - const inputGradients = node2.gradient(dys); - for (const inputName in node2.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 ${node2.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); - } - const x = node2.inputs[inputName]; - if (!arraysEqual(dx.shape, x.shape)) { - throw new Error(`Error in gradient for op ${node2.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] = add5(curGradient, dx); - curGradient.dispose(); - } - } - } -} -/** - * @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. - * ============================================================================= - */ -var FORMAT_LIMIT_NUM_VALS = 20; -var FORMAT_NUM_FIRST_LAST_VALS = 3; -var 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, pad3, 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, pad3); -} -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; -} -/** - * @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 TensorBuffer = class { - 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); - } -}; -var trackerFn = null; -var opHandler = null; -var deprecationWarningFn = null; -function setTensorTracker(fn) { - trackerFn = fn; -} -function setOpHandler(handler) { - opHandler = handler; -} -function setDeprecationWarningFn(fn) { - deprecationWarningFn = fn; -} -var Tensor = class { - 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; - } -}); -function getGlobalTensorClass() { - return getGlobal("Tensor", () => { - return Tensor; - }); -} -getGlobalTensorClass(); -var Variable = class 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; - } -}); -var tensor_util_exports = {}; -__export2(tensor_util_exports, { - assertTypesMatch: () => assertTypesMatch, - getTensorsInContainer: () => getTensorsInContainer, - isTensorInList: () => isTensorInList, - makeTypesMatch: () => makeTypesMatch -}); -/** - * @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 = {})); -var 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"); -} -/** - * @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(tensor2, tensorList) { - return tensorList.some((x) => x.id === tensor2.id); -} -function getTensorsInContainer(result) { - const list = []; - const seen = new Set(); - walkTensorContainer(result, list, seen); - return list; -} -function walkTensorContainer(container, list, seen) { - if (container == null) { - return; - } - if (container instanceof Tensor) { - list.push(container); - return; - } - if (!isIterable(container)) { - return; - } - const iterable = container; - 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"; -} -/** - * @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 isRegisteredKernelInvocation(kernelInvocation) { - return kernelInvocation.kernelName != null; -} -var EngineState = class { - 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, - get kernelNames() { - return Array.from(new Set(this.kernels.map((k) => k.name))); - } - }; - } - dispose() { - for (const variableName in this.registeredVariables) { - this.registeredVariables[variableName].dispose(); - } - } -}; -var Engine = class { - constructor(ENV5) { - this.ENV = ENV5; - 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 backend2 = registryFactoryEntry.factory(); - if (backend2 && !(backend2 instanceof KernelBackend) && typeof backend2.then === "function") { - const promiseId = ++this.pendingBackendInitId; - const success = backend2.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] = backend2; - 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(backend2, dataId) { - const info = this.state.tensorInfo.get(dataId); - const srcBackend = info.backend; - const values = this.readSync(dataId); - const refCount = srcBackend.refCount(dataId); - srcBackend.disposeData(dataId, true); - info.backend = backend2; - backend2.move(dataId, values, info.shape, info.dtype, refCount); - 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 = ENGINE.runKernel(Identity, {x}); - const inputs = {x}; - const grad2 = (dy) => ({ - x: () => { - const dtype = "float32"; - const gradInputs = {x: dy}; - const attrs = {dtype}; - return ENGINE.runKernel(Cast, gradInputs, attrs); - } - }); - const saved = []; - this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); - return y; - } - runKernel(kernelName, inputs, attrs) { - const hasKernel = getKernel(kernelName, this.backendName) != null; - if (!hasKernel) { - throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); - } - return this.runKernelFunc({kernelName, inputs, attrs}); - } - 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(kernelParams) { - let outputs; - let saved = []; - const isTapeOn = this.isTapeOn(); - const startingBytecount = this.state.numBytes; - const startingNumTensors = this.state.numTensors; - if (this.shouldCheckForMemLeaks()) { - this.state.numDataMovesStack.push(0); - } - let kernelFunc3; - if (this.backendName == null) { - this.backend; - } - let out; - const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; - if (isRegisteredKernelInvocation(kernelParams)) { - const {kernelName, inputs: inputs2, attrs: attrs2} = kernelParams; - if (this.backendName == null) { - this.backend; - } - const kernel = getKernel(kernelName, this.backendName); - assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); - kernelFunc3 = () => { - const numDataIdsBefore = this.backend.numDataIds(); - out = kernel.kernelFunc({inputs: inputs2, attrs: attrs2, backend: this.backend}); - const outInfos = Array.isArray(out) ? out : [out]; - if (this.shouldCheckForMemLeaks()) { - this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); - } - const outTensors = outInfos.map((outInfo) => { - if (outInfo.rank != null) { - return outInfo; - } - const {dataId, shape, dtype} = outInfo; - return this.makeTensorFromDataId(dataId, shape, dtype); - }); - if (isTapeOn) { - const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); - saved = this.saveTensorsForBackwardMode(tensorsToSave); - } - return outTensors; - }; - } else { - const {forwardFunc} = kernelParams; - const saveFunc = (tensors) => { - if (!isTapeOn) { - return; - } - saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); - }; - 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(kernelOrScopeName, numDataIdsBefore, outs); - } - return outs; - }; - } - const {inputs, attrs} = kernelParams; - const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; - 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(kernelOrScopeName, inputs, () => kernelFunc3()); - if (this.ENV.getBool("DEBUG")) { - this.profiler.logKernelProfile(kernelProfile); - } - outputs = kernelProfile.outputs; - } - }); - if (isTapeOn) { - this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); - } - if (this.state.profiling) { - this.state.activeProfile.kernels.push({ - name: kernelOrScopeName, - 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((tensor2) => this.keep(this.clone(tensor2))); - 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 []; - } - makeTensor(values, shape, dtype, backend2) { - if (values == null) { - throw new Error("Values passed to engine.makeTensor() are null"); - } - dtype = dtype || "float32"; - backend2 = backend2 || this.backend; - let backendVals = values; - if (dtype === "string" && isString(values[0])) { - backendVals = values.map((d) => encodeString(d)); - } - const dataId = backend2.write(backendVals, shape, dtype); - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend2); - 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, backend2) { - dtype = dtype || "float32"; - const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); - this.trackTensor(t, backend2); - 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; - } - trackTensor(a, backend2) { - this.state.numTensors++; - if (a.dtype === "string") { - this.state.numStringTensors++; - } - let bytes = 0; - if (a.dtype !== "complex64" && a.dtype !== "string") { - bytes = a.size * bytesPerElement(a.dtype); - } - this.state.numBytes += bytes; - if (!this.state.tensorInfo.has(a.dataId)) { - this.state.numDataBuffers++; - this.state.tensorInfo.set(a.dataId, { - backend: backend2 || this.backend, - dtype: a.dtype, - shape: a.shape, - bytes - }); - } - if (!(a instanceof Variable)) { - this.track(a); - } - } - incRef(a, backend2) { - this.trackTensor(a, backend2); - this.backend.incRef(a.dataId); - } - removeDataId(dataId, backend2) { - if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend2) { - this.state.tensorInfo.delete(dataId); - this.state.numDataBuffers--; - } - } - disposeTensor(a) { - if (!this.state.tensorInfo.has(a.dataId)) { - return; - } - const info = this.state.tensorInfo.get(a.dataId); - this.state.numTensors--; - if (a.dtype === "string") { - this.state.numStringTensors--; - this.state.numBytes -= info.bytes; - } - if (a.dtype !== "complex64" && a.dtype !== "string") { - const bytes = a.size * bytesPerElement(a.dtype); - this.state.numBytes -= bytes; - } - if (info.backend.disposeData(a.dataId)) { - this.removeDataId(a.dataId, info.backend); - } - } - 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 tensor2 = this.state.activeScope.track[i]; - if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { - tensor2.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((tensor2) => { - if (!tensor2.kept && tensor2.scopeId === oldScope.id) { - this.track(tensor2); - } - }); - } - 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((node2) => { - for (const tensor2 of node2.saved) { - tensor2.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; - }); - const forwardFunc = (_, 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; - }; - const backwardsFunc = (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; - }; - return this.runKernelFunc({ - forwardFunc, - backwardsFunc, - inputs: inputMap - }); - }; - } - 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 environment2 = new Environment(ns); - ns._tfengine = new Engine(environment2); - } - setEnvironmentGlobal(ns._tfengine.ENV); - setTensorTracker(() => ns._tfengine); - return ns._tfengine; -} -var ENGINE = getOrMakeEngine(); -function add(a, b) { - const inputs = {a, b}; - return ENGINE.runKernel(Add, inputs); -} -var device_util_exports = {}; -__export2(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"; -} -/** - * @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. - * ============================================================================= - */ -var 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); -ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); -ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); -/** - * @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 === "string_or_numeric") { - return; - } - if (expectedDtype == null) { - throw new Error(`Expected dtype cannot be null.`); - } - 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)); -} -/** - * @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. - * ============================================================================= - */ -var 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; -} -/** - * @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_(real4, imag4) { - const $real = convertToTensor(real4, "real", "complex"); - const $imag = convertToTensor(imag4, "imag", "complex"); - assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); - const inputs = {real: $real, imag: $imag}; - return ENGINE.runKernel(Complex, inputs); -} -var complex = op({complex_}); -/** - * @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); -} -/** - * @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 tensor(values, shape, dtype) { - const inferredShape = inferShape(values, dtype); - return makeTensor(values, shape, inferredShape, dtype); -} -/** - * @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. - * ============================================================================= - */ -var DTYPE_VALUE_SIZE_MAP = { - float32: 4, - float16: 2, - int32: 4, - uint16: 2, - uint8: 1, - bool: 1, - complex64: 8 -}; -/** - * @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. - * ============================================================================= - */ -var NUM_BYTES_STRING_LENGTH = 4; -async function encodeWeights(tensors, group) { - const specs = []; - const dataPromises = []; - const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.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((p2, c) => p2 + 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(buffer2, 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 = buffer2.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(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; - offset += NUM_BYTES_STRING_LENGTH; - const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); - values.push(bytes); - offset += byteLength; - } - } else { - const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; - const byteBuffer = buffer2.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 real4 = new Float32Array(values.length / 2); - const image3 = new Float32Array(values.length / 2); - for (let i = 0; i < real4.length; i++) { - real4[i] = values[i * 2]; - image3[i] = values[i * 2 + 1]; - } - const realTensor = tensor(real4, shape, "float32"); - const imageTensor = tensor(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] = tensor(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; -} -var 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 arrayBufferToBase64String(buffer2) { - if (useNodeBuffer) { - return Buffer.from(buffer2).toString("base64"); - } - const buf = new Uint8Array(buffer2); - let s = ""; - for (let i = 0, l = buf.length; i < l; i++) { - s += String.fromCharCode(buf[i]); - } - return btoa(s); -} -function base64StringToArrayBuffer(str) { - if (useNodeBuffer) { - const buf = Buffer.from(str, "base64"); - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - } - const s = atob(str); - const buffer2 = new Uint8Array(s.length); - for (let i = 0; i < s.length; ++i) { - buffer2.set([s.charCodeAt(i)], i); - } - return buffer2.buffer; -} -function concatenateArrayBuffers(buffers) { - if (buffers.length === 1) { - return buffers[0]; - } - let totalByteLength = 0; - buffers.forEach((buffer2) => { - totalByteLength += buffer2.byteLength; - }); - const temp = new Uint8Array(totalByteLength); - let offset = 0; - buffers.forEach((buffer2) => { - temp.set(new Uint8Array(buffer2), offset); - offset += buffer2.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 buffer2 = new ArrayBuffer(4 * quantizedArray.length); - const bufferUint32View = new Uint32Array(buffer2); - 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(buffer2); - }; -} -/** - * @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. - * ============================================================================= - */ -var IORouterRegistry = class { - 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; - } -}; -var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); -var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); -var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); -var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); -/** - * @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. - * ============================================================================= - */ -var DATABASE_NAME = "tensorflowjs"; -var DATABASE_VERSION = 1; -var MODEL_STORE_NAME = "models_store"; -var INFO_STORE_NAME = "model_info_store"; -function getIndexedDBFactory() { - if (!env().getBool("IS_BROWSER")) { - throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); - } - const theWindow = typeof window === "undefined" ? self : window; - const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; - if (factory == null) { - throw new Error("The current browser does not appear to support IndexedDB."); - } - return factory; -} -function setUpDatabase(openRequest) { - const db = openRequest.result; - db.createObjectStore(MODEL_STORE_NAME, {keyPath: "modelPath"}); - db.createObjectStore(INFO_STORE_NAME, {keyPath: "modelPath"}); -} -var BrowserIndexedDB = class { - constructor(modelPath) { - this.indexedDB = getIndexedDBFactory(); - if (modelPath == null || !modelPath) { - throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); - } - this.modelPath = modelPath; - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); - } - return this.databaseAction(this.modelPath, modelArtifacts); - } - async load() { - return this.databaseAction(this.modelPath); - } - databaseAction(modelPath, modelArtifacts) { - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - if (modelArtifacts == null) { - const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const getRequest = modelStore.get(this.modelPath); - getRequest.onsuccess = () => { - if (getRequest.result == null) { - db.close(); - return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); - } else { - resolve(getRequest.result.modelArtifacts); - } - }; - getRequest.onerror = (error) => { - db.close(); - return reject(getRequest.error); - }; - modelTx.oncomplete = () => db.close(); - } else { - const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); - const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); - let infoStore = infoTx.objectStore(INFO_STORE_NAME); - const putInfoRequest = infoStore.put({modelPath: this.modelPath, modelArtifactsInfo}); - let modelTx; - putInfoRequest.onsuccess = () => { - modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const putModelRequest = modelStore.put({ - modelPath: this.modelPath, - modelArtifacts, - modelArtifactsInfo - }); - putModelRequest.onsuccess = () => resolve({modelArtifactsInfo}); - putModelRequest.onerror = (error) => { - infoStore = infoTx.objectStore(INFO_STORE_NAME); - const deleteInfoRequest = infoStore.delete(this.modelPath); - deleteInfoRequest.onsuccess = () => { - db.close(); - return reject(putModelRequest.error); - }; - deleteInfoRequest.onerror = (error2) => { - db.close(); - return reject(putModelRequest.error); - }; - }; - }; - putInfoRequest.onerror = (error) => { - db.close(); - return reject(putInfoRequest.error); - }; - infoTx.oncomplete = () => { - if (modelTx == null) { - db.close(); - } else { - modelTx.oncomplete = () => db.close(); - } - }; - } - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } -}; -BrowserIndexedDB.URL_SCHEME = "indexeddb://"; -var indexedDBRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { - return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); - } else { - return null; - } - } -}; -IORouterRegistry.registerSaveRouter(indexedDBRouter); -IORouterRegistry.registerLoadRouter(indexedDBRouter); -function browserIndexedDB(modelPath) { - return new BrowserIndexedDB(modelPath); -} -function maybeStripScheme(key) { - return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; -} -var BrowserIndexedDBManager = class { - constructor() { - this.indexedDB = getIndexedDBFactory(); - } - async listModels() { - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - const tx = db.transaction(INFO_STORE_NAME, "readonly"); - const store = tx.objectStore(INFO_STORE_NAME); - const getAllInfoRequest = store.getAll(); - getAllInfoRequest.onsuccess = () => { - const out = {}; - for (const item of getAllInfoRequest.result) { - out[item.modelPath] = item.modelArtifactsInfo; - } - resolve(out); - }; - getAllInfoRequest.onerror = (error) => { - db.close(); - return reject(getAllInfoRequest.error); - }; - tx.oncomplete = () => db.close(); - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } - async removeModel(path) { - path = maybeStripScheme(path); - return new Promise((resolve, reject) => { - const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); - openRequest.onupgradeneeded = () => setUpDatabase(openRequest); - openRequest.onsuccess = () => { - const db = openRequest.result; - const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); - const infoStore = infoTx.objectStore(INFO_STORE_NAME); - const getInfoRequest = infoStore.get(path); - let modelTx; - getInfoRequest.onsuccess = () => { - if (getInfoRequest.result == null) { - db.close(); - return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); - } else { - const deleteInfoRequest = infoStore.delete(path); - const deleteModelData = () => { - modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); - const modelStore = modelTx.objectStore(MODEL_STORE_NAME); - const deleteModelRequest = modelStore.delete(path); - deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); - deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); - }; - deleteInfoRequest.onsuccess = deleteModelData; - deleteInfoRequest.onerror = (error) => { - deleteModelData(); - db.close(); - return reject(getInfoRequest.error); - }; - } - }; - getInfoRequest.onerror = (error) => { - db.close(); - return reject(getInfoRequest.error); - }; - infoTx.oncomplete = () => { - if (modelTx == null) { - db.close(); - } else { - modelTx.oncomplete = () => db.close(); - } - }; - }; - openRequest.onerror = (error) => reject(openRequest.error); - }); - } -}; -/** - * @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. - * ============================================================================= - */ -var PATH_SEPARATOR = "/"; -var PATH_PREFIX = "tensorflowjs_models"; -var INFO_SUFFIX = "info"; -var MODEL_TOPOLOGY_SUFFIX = "model_topology"; -var WEIGHT_SPECS_SUFFIX = "weight_specs"; -var WEIGHT_DATA_SUFFIX = "weight_data"; -var MODEL_METADATA_SUFFIX = "model_metadata"; -function getModelKeys(path) { - return { - info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), - topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), - weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), - weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), - modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) - }; -} -function getModelPathFromKey(key) { - const items = key.split(PATH_SEPARATOR); - if (items.length < 3) { - throw new Error(`Invalid key format: ${key}`); - } - return items.slice(1, items.length - 1).join(PATH_SEPARATOR); -} -function maybeStripScheme2(key) { - return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; -} -var BrowserLocalStorage = class { - constructor(modelPath) { - if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { - throw new Error("The current environment does not support local storage."); - } - this.LS = window.localStorage; - if (modelPath == null || !modelPath) { - throw new Error("For local storage, modelPath must not be null, undefined or empty."); - } - this.modelPath = modelPath; - this.keys = getModelKeys(this.modelPath); - } - async save(modelArtifacts) { - if (modelArtifacts.modelTopology instanceof ArrayBuffer) { - throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); - } else { - const topology = JSON.stringify(modelArtifacts.modelTopology); - const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); - const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); - try { - this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); - this.LS.setItem(this.keys.topology, topology); - this.LS.setItem(this.keys.weightSpecs, weightSpecs); - this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); - const result = { - format: modelArtifacts.format, - generatedBy: modelArtifacts.generatedBy, - convertedBy: modelArtifacts.convertedBy - }; - if (modelArtifacts.signature != null) { - result.signature = modelArtifacts.signature; - } - if (modelArtifacts.userDefinedMetadata != null) { - result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; - } - if (modelArtifacts.modelInitializer != null) { - result.modelInitializer = modelArtifacts.modelInitializer; - } - this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); - return {modelArtifactsInfo}; - } catch (err) { - this.LS.removeItem(this.keys.info); - this.LS.removeItem(this.keys.topology); - this.LS.removeItem(this.keys.weightSpecs); - this.LS.removeItem(this.keys.weightData); - this.LS.removeItem(this.keys.modelMetadata); - throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); - } - } - } - async load() { - const info = JSON.parse(this.LS.getItem(this.keys.info)); - if (info == null) { - throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); - } - if (info.modelTopologyType !== "JSON") { - throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); - } - const out = {}; - const topology = JSON.parse(this.LS.getItem(this.keys.topology)); - if (topology == null) { - throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); - } - out.modelTopology = topology; - const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); - if (weightSpecs == null) { - throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); - } - out.weightSpecs = weightSpecs; - const metadataString = this.LS.getItem(this.keys.modelMetadata); - if (metadataString != null) { - const metadata = JSON.parse(metadataString); - out.format = metadata["format"]; - out.generatedBy = metadata["generatedBy"]; - out.convertedBy = metadata["convertedBy"]; - if (metadata["signature"] != null) { - out.signature = metadata["signature"]; - } - if (metadata["userDefinedMetadata"] != null) { - out.userDefinedMetadata = metadata["userDefinedMetadata"]; - } - if (metadata["modelInitializer"] != null) { - out.modelInitializer = metadata["modelInitializer"]; - } - } - const weightDataBase64 = this.LS.getItem(this.keys.weightData); - if (weightDataBase64 == null) { - throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); - } - out.weightData = base64StringToArrayBuffer(weightDataBase64); - return out; - } -}; -BrowserLocalStorage.URL_SCHEME = "localstorage://"; -var localStorageRouter = (url) => { - if (!env().getBool("IS_BROWSER")) { - return null; - } else { - if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { - return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); - } else { - return null; - } - } -}; -IORouterRegistry.registerSaveRouter(localStorageRouter); -IORouterRegistry.registerLoadRouter(localStorageRouter); -function browserLocalStorage(modelPath) { - return new BrowserLocalStorage(modelPath); -} -var BrowserLocalStorageManager = class { - constructor() { - assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); - assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); - this.LS = window.localStorage; - } - async listModels() { - const out = {}; - const prefix = PATH_PREFIX + PATH_SEPARATOR; - const suffix = PATH_SEPARATOR + INFO_SUFFIX; - for (let i = 0; i < this.LS.length; ++i) { - const key = this.LS.key(i); - if (key.startsWith(prefix) && key.endsWith(suffix)) { - const modelPath = getModelPathFromKey(key); - out[modelPath] = JSON.parse(this.LS.getItem(key)); - } - } - return out; - } - async removeModel(path) { - path = maybeStripScheme2(path); - const keys = getModelKeys(path); - if (this.LS.getItem(keys.info) == null) { - throw new Error(`Cannot find model at path '${path}'`); - } - const info = JSON.parse(this.LS.getItem(keys.info)); - this.LS.removeItem(keys.info); - this.LS.removeItem(keys.topology); - this.LS.removeItem(keys.weightSpecs); - this.LS.removeItem(keys.weightData); - return info; - } -}; -/** - * @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. - * ============================================================================= - */ -var URL_SCHEME_SUFFIX = "://"; -var ModelStoreManagerRegistry = class { - 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); -} -/** - * @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. - * ============================================================================= - */ -var PlatformBrowser = class { - fetch(path, init2) { - return fetch(path, init2); - } - now() { - return performance.now(); - } - encode(text, encoding) { - if (encoding !== "utf-8" && encoding !== "utf8") { - throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); - } - if (this.textEncoder == null) { - this.textEncoder = new TextEncoder(); - } - return this.textEncoder.encode(text); - } - decode(bytes, encoding) { - return new TextDecoder(encoding).decode(bytes); - } -}; -if (env().get("IS_BROWSER")) { - env().setPlatform("browser", new PlatformBrowser()); - try { - ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); - } catch (err) { - } - try { - ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); - } catch (err) { - } -} -/** - * @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. - * ============================================================================= - */ -var getNodeFetch = { - importFetch: () => require_browser() -}; -var systemFetch; -var PlatformNode = class { - constructor() { - this.util = require("util"); - this.textEncoder = new this.util.TextEncoder(); - } - fetch(path, requestInits) { - if (env().global.fetch != null) { - return env().global.fetch(path, requestInits); - } - if (systemFetch == null) { - systemFetch = getNodeFetch.importFetch(); - } - return systemFetch(path, requestInits); - } - now() { - const time2 = process.hrtime(); - return time2[0] * 1e3 + time2[1] / 1e6; - } - encode(text, encoding) { - if (encoding !== "utf-8" && encoding !== "utf8") { - throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); - } - return this.textEncoder.encode(text); - } - decode(bytes, encoding) { - if (bytes.length === 0) { - return ""; - } - return new this.util.TextDecoder(encoding).decode(bytes); - } -}; -if (env().get("IS_NODE")) { - env().setPlatform("node", new PlatformNode()); -} -/** - * @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); -} -/** - * @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.runKernel(Cast, inputs, attrs); -} -var cast = op({cast_}); -/** - * @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", "string_or_numeric"); - const inputs = {x: $x}; - return ENGINE.runKernel(Identity, inputs); -} -var clone = op({clone_}); -/** - * @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)); -} -/** - * @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. - * ============================================================================= - */ -getOrMakeEngine(); -var opHandler2 = { - buffer, - cast, - clone, - print: print2 -}; -setOpHandler(opHandler2); -var io_exports = {}; -__export2(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 -}); -/** - * @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. - * ============================================================================= - */ -var DEFAULT_FILE_NAME_PREFIX = "model"; -var DEFAULT_JSON_EXTENSION_NAME = ".json"; -var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; -function defer(f) { - return new Promise((resolve) => setTimeout(resolve)).then(f); -} -var BrowserDownloads = class { - 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 - }; - if (modelArtifacts.signature != null) { - modelTopologyAndWeightManifest.signature = modelArtifacts.signature; - } - if (modelArtifacts.userDefinedMetadata != null) { - modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; - } - if (modelArtifacts.modelInitializer != null) { - modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; - } - 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://"; -var BrowserFiles = class { - 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) { - const result = { - modelTopology, - weightSpecs, - weightData: concatenateArrayBuffers(perFileBuffers), - format: modelJSON.format, - generatedBy: modelJSON.generatedBy, - convertedBy: modelJSON.convertedBy - }; - if (modelJSON.signature != null) { - result.signature = modelJSON.signature; - } - if (modelJSON.userDefinedMetadata != null) { - result.userDefinedMetadata = modelJSON.userDefinedMetadata; - } - if (modelJSON.modelInitializer != null) { - result.modelInitializer = modelJSON.modelInitializer; - } - resolve(result); - } - }; - 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; - } -}; -var 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); -} -/** - * @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)); -} -/** - * @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 buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); - groupByteBuffer.set(buffer2, groupBufferOffset); - groupBufferOffset += buffer2.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; - }; -} -/** - * @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. - * ============================================================================= - */ -var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; -var JSON_TYPE = "application/json"; -var HTTPRequest = class { - 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, - weightsManifest - }; - if (modelArtifacts.signature != null) { - modelTopologyAndWeightManifest.signature = modelArtifacts.signature; - } - if (modelArtifacts.userDefinedMetadata != null) { - modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; - } - if (modelArtifacts.modelInitializer != null) { - modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; - } - 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 signature = modelConfig.signature; - 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, - generatedBy, - convertedBy, - format - }; - if (signature != null) { - artifacts.signature = signature; - } - if (userDefinedMetadata != null) { - artifacts.userDefinedMetadata = userDefinedMetadata; - } - 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; -} -var 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); -} -/** - * @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. - * ============================================================================= - */ -var PassthroughLoader = class { - constructor(modelArtifacts) { - this.modelArtifacts = modelArtifacts; - } - async load() { - return this.modelArtifacts; - } -}; -var PassthroughSaver = class { - 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); -} -/** - * @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. - * ============================================================================= - */ -var math_exports = {}; -__export2(math_exports, { - confusionMatrix: () => confusionMatrix -}); -/** - * @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 inputs = {a: $a, b: $b}; - const attrs = {transposeA, transposeB}; - return ENGINE.runKernel(BatchMatMul, inputs, attrs); -} -var matMul = op({matMul_}); -/** - * @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 inputs = {indices: $indices}; - const attrs = {depth, onValue, offValue}; - return ENGINE.runKernel(OneHot, inputs, attrs); -} -var oneHot = op({oneHot_}); -/** - * @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.runKernel(Transpose, inputs, attrs); -} -var transpose = op({transpose_}); -/** - * @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"); -} -var confusionMatrix = op({confusionMatrix_}); -/** - * @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. - * ============================================================================= - */ -var browser_exports = {}; -__export2(browser_exports, { - fromPixels: () => fromPixels, - fromPixelsAsync: () => fromPixelsAsync, - toPixels: () => toPixels -}); -/** - * @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); -} -/** - * @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. - * ============================================================================= - */ -var 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 isPixelData2 = false; - let isImageData = false; - let isVideo = false; - let isImage = false; - let isCanvasLike = false; - let isImageBitmap = false; - if (pixels.data instanceof Uint8Array) { - isPixelData2 = 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 if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { - isImageBitmap = 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