diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f66ffe2..9fe82647 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,9 @@ ## Changelog -### **HEAD -> main** 2022/11/28 mandic00@live.com +### **HEAD -> main** 2022/12/29 mandic00@live.com +- default face.rotation disabled ### **release: 3.0.1** 2022/11/22 mandic00@live.com diff --git a/demo/faceid/index.js b/demo/faceid/index.js index 635d01de..37f2e0ac 100644 --- a/demo/faceid/index.js +++ b/demo/faceid/index.js @@ -4,6 +4,6 @@ author: ' */ -import*as S from"../../dist/human.esm.js";var l,F="human",f="person",v=(...a)=>console.log("indexdb",...a);async function h(){return l?!0:new Promise(a=>{let n=indexedDB.open(F,1);n.onerror=o=>v("error:",o),n.onupgradeneeded=o=>{v("create:",o.target),l=o.target.result,l.createObjectStore(f,{keyPath:"id",autoIncrement:!0})},n.onsuccess=o=>{l=o.target.result,v("open:",l),a(!0)}})}async function C(){let a=[];return l||await h(),new Promise(n=>{let o=l.transaction([f],"readwrite").objectStore(f).openCursor(null,"next");o.onerror=i=>v("load error:",i),o.onsuccess=i=>{i.target.result?(a.push(i.target.result.value),i.target.result.continue()):n(a)}})}async function b(){return l||await h(),new Promise(a=>{let n=l.transaction([f],"readwrite").objectStore(f).count();n.onerror=o=>v("count error:",o),n.onsuccess=()=>a(n.result)})}async function x(a){l||await h();let n={name:a.name,descriptor:a.descriptor,image:a.image};l.transaction([f],"readwrite").objectStore(f).put(n),v("save:",n)}async function D(a){l||await h(),l.transaction([f],"readwrite").objectStore(f).delete(a.id),v("delete:",a)}var g={cacheSensitivity:0,modelBasePath:"../../models",filter:{enabled:!0,equalization:!0},debug:!0,face:{enabled:!0,detector:{rotation:!0,return:!0,cropFactor:1.6,mask:!1},description:{enabled:!0},iris:{enabled:!0},emotion:{enabled:!1},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!1},hand:{enabled:!1},object:{enabled:!1},gesture:{enabled:!0}},B={order:2,multiplier:25,min:.2,max:.8},r={minConfidence:.6,minSize:224,maxTime:3e4,blinkMin:10,blinkMax:800,threshold:.5,distanceMin:.4,distanceMax:1,mask:g.face.detector.mask,rotation:g.face.detector.rotation,cropFactor:g.face.detector.cropFactor,...B},e={faceCount:{status:!1,val:0},faceConfidence:{status:!1,val:0},facingCenter:{status:!1,val:0},lookingCenter:{status:!1,val:0},blinkDetected:{status:!1,val:0},faceSize:{status:!1,val:0},antispoofCheck:{status:!1,val:0},livenessCheck:{status:!1,val:0},distance:{status:!1,val:0},age:{status:!1,val:0},gender:{status:!1,val:0},timeout:{status:!0,val:0},descriptor:{status:!1,val:0},elapsedMs:{status:void 0,val:0},detectFPS:{status:void 0,val:0},drawFPS:{status:void 0,val:0}},E=()=>e.faceCount.status&&e.faceSize.status&&e.blinkDetected.status&&e.facingCenter.status&&e.lookingCenter.status&&e.faceConfidence.status&&e.antispoofCheck.status&&e.livenessCheck.status&&e.distance.status&&e.descriptor.status&&e.age.status&&e.gender.status,c={face:null,record:null},u={start:0,end:0,time:0},s=new S.Human(g);s.env.perfadd=!1;s.draw.options.font='small-caps 18px "Lato"';s.draw.options.lineHeight=20;var t={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("fps"),match:document.getElementById("match"),name:document.getElementById("name"),save:document.getElementById("save"),delete:document.getElementById("delete"),retry:document.getElementById("retry"),source:document.getElementById("source"),ok:document.getElementById("ok")},y={detect:0,draw:0},I=0,d=(...a)=>{t.log.innerText+=a.join(" ")+` -`,console.log(...a)};async function H(){let a={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth}}},n=await navigator.mediaDevices.getUserMedia(a),o=new Promise(i=>{t.video.onloadeddata=()=>i(!0)});t.video.srcObject=n,t.video.play(),await o,t.canvas.width=t.video.videoWidth,t.canvas.height=t.video.videoHeight,t.canvas.style.width="50%",t.canvas.style.height="50%",s.env.initial&&d("video:",t.video.videoWidth,t.video.videoHeight,"|",n.getVideoTracks()[0].label),t.canvas.onclick=()=>{t.video.paused?t.video.play():t.video.pause()}}async function T(){var a;if(!t.video.paused){(a=c.face)!=null&&a.tensor&&s.tf.dispose(c.face.tensor),await s.detect(t.video);let n=s.now();e.detectFPS.val=Math.round(1e4/(n-y.detect))/10,y.detect=n,requestAnimationFrame(T)}}function P(){let a=32;for(let[n,o]of Object.entries(e)){let i=document.getElementById(`ok-${n}`);i||(i=document.createElement("div"),i.id=`ok-${n}`,i.innerText=n,i.className="ok",i.style.top=`${a}px`,t.ok.appendChild(i)),typeof o.status=="boolean"&&(i.style.backgroundColor=o.status?"lightgreen":"lightcoral");let m=o.status?"ok":"fail";i.innerText=`${n}: ${o.val===0?m:o.val}`,a+=28}}async function R(){var o;let a=s.next(s.result);s.draw.canvas(t.video,t.canvas),await s.draw.all(t.canvas,a);let n=s.now();if(e.drawFPS.val=Math.round(1e4/(n-y.draw))/10,y.draw=n,e.faceCount.val=s.result.face.length,e.faceCount.status=e.faceCount.val===1,e.faceCount.status){let i=Object.values(s.result.gesture).map(m=>m.gesture);(i.includes("blink left eye")||i.includes("blink right eye"))&&(u.start=s.now()),u.start>0&&!i.includes("blink left eye")&&!i.includes("blink right eye")&&(u.end=s.now()),e.blinkDetected.status=e.blinkDetected.status||Math.abs(u.end-u.start)>r.blinkMin&&Math.abs(u.end-u.start)=r.minConfidence,e.antispoofCheck.val=s.result.face[0].real||0,e.antispoofCheck.status=e.antispoofCheck.val>=r.minConfidence,e.livenessCheck.val=s.result.face[0].live||0,e.livenessCheck.status=e.livenessCheck.val>=r.minConfidence,e.faceSize.val=Math.min(s.result.face[0].box[2],s.result.face[0].box[3]),e.faceSize.status=e.faceSize.val>=r.minSize,e.distance.val=s.result.face[0].distance||0,e.distance.status=e.distance.val>=r.distanceMin&&e.distance.val<=r.distanceMax,e.descriptor.val=((o=s.result.face[0].embedding)==null?void 0:o.length)||0,e.descriptor.status=e.descriptor.val>0,e.age.val=s.result.face[0].age||0,e.age.status=e.age.val>0,e.gender.val=s.result.face[0].genderScore||0,e.gender.status=e.gender.val>=r.minConfidence}return e.timeout.status=e.elapsedMs.val<=r.maxTime,P(),E()||!e.timeout.status?(t.video.pause(),s.result.face[0]):(e.elapsedMs.val=Math.trunc(s.now()-I),new Promise(i=>{setTimeout(async()=>{await R(),i(s.result.face[0])},30)}))}async function z(){var a,n,o,i;if(t.name.value.length>0){let m=(a=t.canvas.getContext("2d"))==null?void 0:a.getImageData(0,0,t.canvas.width,t.canvas.height),p={id:0,name:t.name.value,descriptor:(n=c.face)==null?void 0:n.embedding,image:m};await x(p),d("saved face record:",p.name,"descriptor length:",(i=(o=c.face)==null?void 0:o.embedding)==null?void 0:i.length),d("known face records:",await b())}else d("invalid name")}async function j(){c.record&&c.record.id>0&&await D(c.record)}async function $(){var i,m,p,k;if(t.canvas.style.height="",(i=t.canvas.getContext("2d"))==null||i.clearRect(0,0,r.minSize,r.minSize),!((m=c==null?void 0:c.face)!=null&&m.tensor)||!((p=c==null?void 0:c.face)!=null&&p.embedding))return!1;if(console.log("face record:",c.face),d(`detected face: ${c.face.gender} ${c.face.age||0}y distance ${100*(c.face.distance||0)}cm/${Math.round(100*(c.face.distance||0)/2.54)}in`),await s.tf.browser.toPixels(c.face.tensor,t.canvas),await b()===0)return d("face database is empty: nothing to compare face with"),document.body.style.background="black",t.delete.style.display="none",!1;let a=await C(),n=a.map(w=>w.descriptor).filter(w=>w.length>0),o=s.match.find(c.face.embedding,n,B);return c.record=a[o.index]||null,c.record&&(d(`best match: ${c.record.name} | id: ${c.record.id} | similarity: ${Math.round(1e3*o.similarity)/10}%`),t.name.value=c.record.name,t.source.style.display="",(k=t.source.getContext("2d"))==null||k.putImageData(c.record.image,0,0)),document.body.style.background=o.similarity>r.threshold?"darkgreen":"maroon",o.similarity>r.threshold}async function M(){var a,n,o,i;return e.faceCount.status=!1,e.faceConfidence.status=!1,e.facingCenter.status=!1,e.blinkDetected.status=!1,e.faceSize.status=!1,e.antispoofCheck.status=!1,e.livenessCheck.status=!1,e.age.status=!1,e.gender.status=!1,e.elapsedMs.val=0,t.match.style.display="none",t.retry.style.display="none",t.source.style.display="none",t.canvas.style.height="50%",document.body.style.background="black",await H(),await T(),I=s.now(),c.face=await R(),t.canvas.width=((n=(a=c.face)==null?void 0:a.tensor)==null?void 0:n.shape[1])||r.minSize,t.canvas.height=((i=(o=c.face)==null?void 0:o.tensor)==null?void 0:i.shape[0])||r.minSize,t.source.width=t.canvas.width,t.source.height=t.canvas.height,t.canvas.style.width="",t.match.style.display="flex",t.save.style.display="flex",t.delete.style.display="flex",t.retry.style.display="block",E()?$():(d("did not find valid face"),!1)}async function q(){var a,n;d("human version:",s.version,"| tfjs version:",s.tf.version["tfjs-core"]),d("options:",JSON.stringify(r).replace(/{|}|"|\[|\]/g,"").replace(/,/g," ")),d("initializing webcam..."),await H(),d("loading human models..."),await s.load(),d("initializing human..."),d("face embedding model:",g.face.description.enabled?"faceres":"",(a=g.face.mobilefacenet)!=null&&a.enabled?"mobilefacenet":"",(n=g.face.insightface)!=null&&n.enabled?"insightface":""),d("loading face database..."),d("known face records:",await b()),t.retry.addEventListener("click",M),t.save.addEventListener("click",z),t.delete.addEventListener("click",j),await s.warmup(),await M()}window.onload=q; +import*as S from"../../dist/human.esm.js";var l,L="human",f="person",v=(...a)=>console.log("indexdb",...a);async function h(){return l?!0:new Promise(a=>{let n=indexedDB.open(L,1);n.onerror=o=>v("error:",o),n.onupgradeneeded=o=>{v("create:",o.target),l=o.target.result,l.createObjectStore(f,{keyPath:"id",autoIncrement:!0})},n.onsuccess=o=>{l=o.target.result,v("open:",l),a(!0)}})}async function C(){let a=[];return l||await h(),new Promise(n=>{let o=l.transaction([f],"readwrite").objectStore(f).openCursor(null,"next");o.onerror=i=>v("load error:",i),o.onsuccess=i=>{i.target.result?(a.push(i.target.result.value),i.target.result.continue()):n(a)}})}async function b(){return l||await h(),new Promise(a=>{let n=l.transaction([f],"readwrite").objectStore(f).count();n.onerror=o=>v("count error:",o),n.onsuccess=()=>a(n.result)})}async function x(a){l||await h();let n={name:a.name,descriptor:a.descriptor,image:a.image};l.transaction([f],"readwrite").objectStore(f).put(n),v("save:",n)}async function D(a){l||await h(),l.transaction([f],"readwrite").objectStore(f).delete(a.id),v("delete:",a)}var g={cacheSensitivity:0,modelBasePath:"../../models",filter:{enabled:!0,equalization:!0},debug:!0,face:{enabled:!0,detector:{rotation:!0,return:!0,mask:!1},description:{enabled:!0},iris:{enabled:!0},emotion:{enabled:!1},antispoof:{enabled:!0},liveness:{enabled:!0}},body:{enabled:!1},hand:{enabled:!1},object:{enabled:!1},gesture:{enabled:!0}},B={order:2,multiplier:25,min:.2,max:.8},r={minConfidence:.6,minSize:224,maxTime:3e4,blinkMin:10,blinkMax:800,threshold:.5,distanceMin:.4,distanceMax:1,mask:g.face.detector.mask,rotation:g.face.detector.rotation,...B},e={faceCount:{status:!1,val:0},faceConfidence:{status:!1,val:0},facingCenter:{status:!1,val:0},lookingCenter:{status:!1,val:0},blinkDetected:{status:!1,val:0},faceSize:{status:!1,val:0},antispoofCheck:{status:!1,val:0},livenessCheck:{status:!1,val:0},distance:{status:!1,val:0},age:{status:!1,val:0},gender:{status:!1,val:0},timeout:{status:!0,val:0},descriptor:{status:!1,val:0},elapsedMs:{status:void 0,val:0},detectFPS:{status:void 0,val:0},drawFPS:{status:void 0,val:0}},E=()=>e.faceCount.status&&e.faceSize.status&&e.blinkDetected.status&&e.facingCenter.status&&e.lookingCenter.status&&e.faceConfidence.status&&e.antispoofCheck.status&&e.livenessCheck.status&&e.distance.status&&e.descriptor.status&&e.age.status&&e.gender.status,c={face:null,record:null},u={start:0,end:0,time:0},s=new S.Human(g);s.env.perfadd=!1;s.draw.options.font='small-caps 18px "Lato"';s.draw.options.lineHeight=20;var t={video:document.getElementById("video"),canvas:document.getElementById("canvas"),log:document.getElementById("log"),fps:document.getElementById("fps"),match:document.getElementById("match"),name:document.getElementById("name"),save:document.getElementById("save"),delete:document.getElementById("delete"),retry:document.getElementById("retry"),source:document.getElementById("source"),ok:document.getElementById("ok")},y={detect:0,draw:0},I=0,d=(...a)=>{t.log.innerText+=a.join(" ")+` +`,console.log(...a)};async function H(){let a={audio:!1,video:{facingMode:"user",resizeMode:"none",width:{ideal:document.body.clientWidth}}},n=await navigator.mediaDevices.getUserMedia(a),o=new Promise(i=>{t.video.onloadeddata=()=>i(!0)});t.video.srcObject=n,t.video.play(),await o,t.canvas.width=t.video.videoWidth,t.canvas.height=t.video.videoHeight,t.canvas.style.width="50%",t.canvas.style.height="50%",s.env.initial&&d("video:",t.video.videoWidth,t.video.videoHeight,"|",n.getVideoTracks()[0].label),t.canvas.onclick=()=>{t.video.paused?t.video.play():t.video.pause()}}async function T(){var a;if(!t.video.paused){(a=c.face)!=null&&a.tensor&&s.tf.dispose(c.face.tensor),await s.detect(t.video);let n=s.now();e.detectFPS.val=Math.round(1e4/(n-y.detect))/10,y.detect=n,requestAnimationFrame(T)}}function z(){let a=32;for(let[n,o]of Object.entries(e)){let i=document.getElementById(`ok-${n}`);i||(i=document.createElement("div"),i.id=`ok-${n}`,i.innerText=n,i.className="ok",i.style.top=`${a}px`,t.ok.appendChild(i)),typeof o.status=="boolean"&&(i.style.backgroundColor=o.status?"lightgreen":"lightcoral");let m=o.status?"ok":"fail";i.innerText=`${n}: ${o.val===0?m:o.val}`,a+=28}}async function R(){var o;let a=s.next(s.result);s.draw.canvas(t.video,t.canvas),await s.draw.all(t.canvas,a);let n=s.now();if(e.drawFPS.val=Math.round(1e4/(n-y.draw))/10,y.draw=n,e.faceCount.val=s.result.face.length,e.faceCount.status=e.faceCount.val===1,e.faceCount.status){let i=Object.values(s.result.gesture).map(m=>m.gesture);(i.includes("blink left eye")||i.includes("blink right eye"))&&(u.start=s.now()),u.start>0&&!i.includes("blink left eye")&&!i.includes("blink right eye")&&(u.end=s.now()),e.blinkDetected.status=e.blinkDetected.status||Math.abs(u.end-u.start)>r.blinkMin&&Math.abs(u.end-u.start)=r.minConfidence,e.antispoofCheck.val=s.result.face[0].real||0,e.antispoofCheck.status=e.antispoofCheck.val>=r.minConfidence,e.livenessCheck.val=s.result.face[0].live||0,e.livenessCheck.status=e.livenessCheck.val>=r.minConfidence,e.faceSize.val=Math.min(s.result.face[0].box[2],s.result.face[0].box[3]),e.faceSize.status=e.faceSize.val>=r.minSize,e.distance.val=s.result.face[0].distance||0,e.distance.status=e.distance.val>=r.distanceMin&&e.distance.val<=r.distanceMax,e.descriptor.val=((o=s.result.face[0].embedding)==null?void 0:o.length)||0,e.descriptor.status=e.descriptor.val>0,e.age.val=s.result.face[0].age||0,e.age.status=e.age.val>0,e.gender.val=s.result.face[0].genderScore||0,e.gender.status=e.gender.val>=r.minConfidence}return e.timeout.status=e.elapsedMs.val<=r.maxTime,z(),E()||!e.timeout.status?(t.video.pause(),s.result.face[0]):(e.elapsedMs.val=Math.trunc(s.now()-I),new Promise(i=>{setTimeout(async()=>{await R(),i(s.result.face[0])},30)}))}async function F(){var a,n,o,i;if(t.name.value.length>0){let m=(a=t.canvas.getContext("2d"))==null?void 0:a.getImageData(0,0,t.canvas.width,t.canvas.height),p={id:0,name:t.name.value,descriptor:(n=c.face)==null?void 0:n.embedding,image:m};await x(p),d("saved face record:",p.name,"descriptor length:",(i=(o=c.face)==null?void 0:o.embedding)==null?void 0:i.length),d("known face records:",await b())}else d("invalid name")}async function j(){c.record&&c.record.id>0&&await D(c.record)}async function $(){var i,m,p,k;if(t.canvas.style.height="",(i=t.canvas.getContext("2d"))==null||i.clearRect(0,0,r.minSize,r.minSize),!((m=c==null?void 0:c.face)!=null&&m.tensor)||!((p=c==null?void 0:c.face)!=null&&p.embedding))return!1;if(console.log("face record:",c.face),d(`detected face: ${c.face.gender} ${c.face.age||0}y distance ${100*(c.face.distance||0)}cm/${Math.round(100*(c.face.distance||0)/2.54)}in`),await s.tf.browser.toPixels(c.face.tensor,t.canvas),await b()===0)return d("face database is empty: nothing to compare face with"),document.body.style.background="black",t.delete.style.display="none",!1;let a=await C(),n=a.map(w=>w.descriptor).filter(w=>w.length>0),o=s.match.find(c.face.embedding,n,B);return c.record=a[o.index]||null,c.record&&(d(`best match: ${c.record.name} | id: ${c.record.id} | similarity: ${Math.round(1e3*o.similarity)/10}%`),t.name.value=c.record.name,t.source.style.display="",(k=t.source.getContext("2d"))==null||k.putImageData(c.record.image,0,0)),document.body.style.background=o.similarity>r.threshold?"darkgreen":"maroon",o.similarity>r.threshold}async function M(){var a,n,o,i;return e.faceCount.status=!1,e.faceConfidence.status=!1,e.facingCenter.status=!1,e.blinkDetected.status=!1,e.faceSize.status=!1,e.antispoofCheck.status=!1,e.livenessCheck.status=!1,e.age.status=!1,e.gender.status=!1,e.elapsedMs.val=0,t.match.style.display="none",t.retry.style.display="none",t.source.style.display="none",t.canvas.style.height="50%",document.body.style.background="black",await H(),await T(),I=s.now(),c.face=await R(),t.canvas.width=((n=(a=c.face)==null?void 0:a.tensor)==null?void 0:n.shape[1])||r.minSize,t.canvas.height=((i=(o=c.face)==null?void 0:o.tensor)==null?void 0:i.shape[0])||r.minSize,t.source.width=t.canvas.width,t.source.height=t.canvas.height,t.canvas.style.width="",t.match.style.display="flex",t.save.style.display="flex",t.delete.style.display="flex",t.retry.style.display="block",E()?$():(d("did not find valid face"),!1)}async function q(){var a,n;d("human version:",s.version,"| tfjs version:",s.tf.version["tfjs-core"]),d("options:",JSON.stringify(r).replace(/{|}|"|\[|\]/g,"").replace(/,/g," ")),d("initializing webcam..."),await H(),d("loading human models..."),await s.load(),d("initializing human..."),d("face embedding model:",g.face.description.enabled?"faceres":"",(a=g.face.mobilefacenet)!=null&&a.enabled?"mobilefacenet":"",(n=g.face.insightface)!=null&&n.enabled?"insightface":""),d("loading face database..."),d("known face records:",await b()),t.retry.addEventListener("click",M),t.save.addEventListener("click",F),t.delete.addEventListener("click",j),await s.warmup(),await M()}window.onload=q; //# sourceMappingURL=index.js.map diff --git a/demo/faceid/index.js.map b/demo/faceid/index.js.map index e15df82b..a089c033 100644 --- a/demo/faceid/index.js.map +++ b/demo/faceid/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["index.ts", "indexdb.ts"], - "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport * as H from '../../dist/human.esm.js'; // equivalent of @vladmandic/Human\nimport * as indexDb from './indexdb'; // methods to deal with indexdb\n\nconst humanConfig = { // user configuration for human, used to fine-tune behavior\n cacheSensitivity: 0,\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: true }, // lets run with histogram equilizer\n debug: true,\n face: {\n enabled: true,\n detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, // return tensor is used to get detected face image\n description: { enabled: true }, // default model for face descriptor extraction is faceres\n // mobilefacenet: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model\n // insightface: { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }, // alternative model\n iris: { enabled: true }, // needed to determine gaze direction\n emotion: { enabled: false }, // not needed\n antispoof: { enabled: true }, // enable optional antispoof module\n liveness: { enabled: true }, // enable optional liveness module\n },\n body: { enabled: false },\n hand: { enabled: false },\n object: { enabled: false },\n gesture: { enabled: true }, // parses face and iris gestures\n};\n\n// const matchOptions = { order: 2, multiplier: 1000, min: 0.0, max: 1.0 }; // for embedding model\nconst matchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }; // for faceres model\n\nconst options = {\n minConfidence: 0.6, // overal face confidence for box, face, gender, real, live\n minSize: 224, // min input to face descriptor model before degradation\n maxTime: 30000, // max time before giving up\n blinkMin: 10, // minimum duration of a valid blink\n blinkMax: 800, // maximum duration of a valid blink\n threshold: 0.5, // minimum similarity\n distanceMin: 0.4, // closest that face is allowed to be to the cammera in cm\n distanceMax: 1.0, // farthest that face is allowed to be to the cammera in cm\n mask: humanConfig.face.detector.mask,\n rotation: humanConfig.face.detector.rotation,\n cropFactor: humanConfig.face.detector.cropFactor,\n ...matchOptions,\n};\n\nconst ok: Record = { // must meet all rules\n faceCount: { status: false, val: 0 },\n faceConfidence: { status: false, val: 0 },\n facingCenter: { status: false, val: 0 },\n lookingCenter: { status: false, val: 0 },\n blinkDetected: { status: false, val: 0 },\n faceSize: { status: false, val: 0 },\n antispoofCheck: { status: false, val: 0 },\n livenessCheck: { status: false, val: 0 },\n distance: { status: false, val: 0 },\n age: { status: false, val: 0 },\n gender: { status: false, val: 0 },\n timeout: { status: true, val: 0 },\n descriptor: { status: false, val: 0 },\n elapsedMs: { status: undefined, val: 0 }, // total time while waiting for valid face\n detectFPS: { status: undefined, val: 0 }, // mark detection fps performance\n drawFPS: { status: undefined, val: 0 }, // mark redraw fps performance\n};\n\nconst allOk = () => ok.faceCount.status\n && ok.faceSize.status\n && ok.blinkDetected.status\n && ok.facingCenter.status\n && ok.lookingCenter.status\n && ok.faceConfidence.status\n && ok.antispoofCheck.status\n && ok.livenessCheck.status\n && ok.distance.status\n && ok.descriptor.status\n && ok.age.status\n && ok.gender.status;\n\nconst current: { face: H.FaceResult | null, record: indexDb.FaceRecord | null } = { face: null, record: null }; // current face record and matched database record\n\nconst blink = { // internal timers for blink start/end/duration\n start: 0,\n end: 0,\n time: 0,\n};\n\n// let db: Array<{ name: string, source: string, embedding: number[] }> = []; // holds loaded face descriptor database\nconst human = new H.Human(humanConfig); // create instance of human with overrides from user configuration\n\nhuman.env.perfadd = false; // is performance data showing instant or total values\nhuman.draw.options.font = 'small-caps 18px \"Lato\"'; // set font used to draw labels when using draw methods\nhuman.draw.options.lineHeight = 20;\n\nconst dom = { // grab instances of dom objects so we dont have to look them up later\n video: document.getElementById('video') as HTMLVideoElement,\n canvas: document.getElementById('canvas') as HTMLCanvasElement,\n log: document.getElementById('log') as HTMLPreElement,\n fps: document.getElementById('fps') as HTMLPreElement,\n match: document.getElementById('match') as HTMLDivElement,\n name: document.getElementById('name') as HTMLInputElement,\n save: document.getElementById('save') as HTMLSpanElement,\n delete: document.getElementById('delete') as HTMLSpanElement,\n retry: document.getElementById('retry') as HTMLDivElement,\n source: document.getElementById('source') as HTMLCanvasElement,\n ok: document.getElementById('ok') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0 }; // holds information used to calculate performance and possible memory leaks\nlet startTime = 0;\n\nconst log = (...msg) => { // helper method to output messages\n dom.log.innerText += msg.join(' ') + '\\n';\n console.log(...msg); // eslint-disable-line no-console\n};\n\nasync function webCam() { // initialize webcam\n // @ts-ignore resizeMode is not yet defined in tslib\n const cameraOptions: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(cameraOptions);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n void dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n dom.canvas.style.width = '50%';\n dom.canvas.style.height = '50%';\n if (human.env.initial) log('video:', dom.video.videoWidth, dom.video.videoHeight, '|', stream.getVideoTracks()[0].label);\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) void dom.video.play();\n else dom.video.pause();\n };\n}\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (current.face?.tensor) human.tf.dispose(current.face.tensor); // dispose previous tensor\n await human.detect(dom.video); // actual detection; were not capturing output in a local variable as it can also be reached via human.result\n const now = human.now();\n ok.detectFPS.val = Math.round(10000 / (now - timestamp.detect)) / 10;\n timestamp.detect = now;\n requestAnimationFrame(detectionLoop); // start new frame immediately\n }\n}\n\nfunction drawValidationTests() {\n let y = 32;\n for (const [key, val] of Object.entries(ok)) {\n let el = document.getElementById(`ok-${key}`);\n if (!el) {\n el = document.createElement('div');\n el.id = `ok-${key}`;\n el.innerText = key;\n el.className = 'ok';\n el.style.top = `${y}px`;\n dom.ok.appendChild(el);\n }\n if (typeof val.status === 'boolean') el.style.backgroundColor = val.status ? 'lightgreen' : 'lightcoral';\n const status = val.status ? 'ok' : 'fail';\n el.innerText = `${key}: ${val.val === 0 ? status : val.val}`;\n y += 28;\n }\n}\n\nasync function validationLoop(): Promise { // main screen refresh loop\n const interpolated = human.next(human.result); // smoothen result using last-known results\n human.draw.canvas(dom.video, dom.canvas); // draw canvas to screen\n await human.draw.all(dom.canvas, interpolated); // draw labels, boxes, lines, etc.\n const now = human.now();\n ok.drawFPS.val = Math.round(10000 / (now - timestamp.draw)) / 10;\n timestamp.draw = now;\n ok.faceCount.val = human.result.face.length;\n ok.faceCount.status = ok.faceCount.val === 1; // must be exactly detected face\n if (ok.faceCount.status) { // skip the rest if no face\n const gestures: string[] = Object.values(human.result.gesture).map((gesture: H.GestureResult) => gesture.gesture); // flatten all gestures\n if (gestures.includes('blink left eye') || gestures.includes('blink right eye')) blink.start = human.now(); // blink starts when eyes get closed\n if (blink.start > 0 && !gestures.includes('blink left eye') && !gestures.includes('blink right eye')) blink.end = human.now(); // if blink started how long until eyes are back open\n ok.blinkDetected.status = ok.blinkDetected.status || (Math.abs(blink.end - blink.start) > options.blinkMin && Math.abs(blink.end - blink.start) < options.blinkMax);\n if (ok.blinkDetected.status && blink.time === 0) blink.time = Math.trunc(blink.end - blink.start);\n ok.facingCenter.status = gestures.includes('facing center');\n ok.lookingCenter.status = gestures.includes('looking center'); // must face camera and look at camera\n ok.faceConfidence.val = human.result.face[0].faceScore || human.result.face[0].boxScore || 0;\n ok.faceConfidence.status = ok.faceConfidence.val >= options.minConfidence;\n ok.antispoofCheck.val = human.result.face[0].real || 0;\n ok.antispoofCheck.status = ok.antispoofCheck.val >= options.minConfidence;\n ok.livenessCheck.val = human.result.face[0].live || 0;\n ok.livenessCheck.status = ok.livenessCheck.val >= options.minConfidence;\n ok.faceSize.val = Math.min(human.result.face[0].box[2], human.result.face[0].box[3]);\n ok.faceSize.status = ok.faceSize.val >= options.minSize;\n ok.distance.val = human.result.face[0].distance || 0;\n ok.distance.status = (ok.distance.val >= options.distanceMin) && (ok.distance.val <= options.distanceMax);\n ok.descriptor.val = human.result.face[0].embedding?.length || 0;\n ok.descriptor.status = ok.descriptor.val > 0;\n ok.age.val = human.result.face[0].age || 0;\n ok.age.status = ok.age.val > 0;\n ok.gender.val = human.result.face[0].genderScore || 0;\n ok.gender.status = ok.gender.val >= options.minConfidence;\n }\n // run again\n ok.timeout.status = ok.elapsedMs.val <= options.maxTime;\n drawValidationTests();\n if (allOk() || !ok.timeout.status) { // all criteria met\n dom.video.pause();\n return human.result.face[0];\n }\n ok.elapsedMs.val = Math.trunc(human.now() - startTime);\n return new Promise((resolve) => {\n setTimeout(async () => {\n await validationLoop(); // run validation loop until conditions are met\n resolve(human.result.face[0]); // recursive promise resolve\n }, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n });\n}\n\nasync function saveRecords() {\n if (dom.name.value.length > 0) {\n const image = dom.canvas.getContext('2d')?.getImageData(0, 0, dom.canvas.width, dom.canvas.height) as ImageData;\n const rec = { id: 0, name: dom.name.value, descriptor: current.face?.embedding as number[], image };\n await indexDb.save(rec);\n log('saved face record:', rec.name, 'descriptor length:', current.face?.embedding?.length);\n log('known face records:', await indexDb.count());\n } else {\n log('invalid name');\n }\n}\n\nasync function deleteRecord() {\n if (current.record && current.record.id > 0) {\n await indexDb.remove(current.record);\n }\n}\n\nasync function detectFace() {\n dom.canvas.style.height = '';\n dom.canvas.getContext('2d')?.clearRect(0, 0, options.minSize, options.minSize);\n if (!current?.face?.tensor || !current?.face?.embedding) return false;\n console.log('face record:', current.face); // eslint-disable-line no-console\n log(`detected face: ${current.face.gender} ${current.face.age || 0}y distance ${100 * (current.face.distance || 0)}cm/${Math.round(100 * (current.face.distance || 0) / 2.54)}in`);\n await human.tf.browser.toPixels(current.face.tensor, dom.canvas);\n if (await indexDb.count() === 0) {\n log('face database is empty: nothing to compare face with');\n document.body.style.background = 'black';\n dom.delete.style.display = 'none';\n return false;\n }\n const db = await indexDb.load();\n const descriptors = db.map((rec) => rec.descriptor).filter((desc) => desc.length > 0);\n const res = human.match.find(current.face.embedding, descriptors, matchOptions);\n current.record = db[res.index] || null;\n if (current.record) {\n log(`best match: ${current.record.name} | id: ${current.record.id} | similarity: ${Math.round(1000 * res.similarity) / 10}%`);\n dom.name.value = current.record.name;\n dom.source.style.display = '';\n dom.source.getContext('2d')?.putImageData(current.record.image, 0, 0);\n }\n document.body.style.background = res.similarity > options.threshold ? 'darkgreen' : 'maroon';\n return res.similarity > options.threshold;\n}\n\nasync function main() { // main entry point\n ok.faceCount.status = false;\n ok.faceConfidence.status = false;\n ok.facingCenter.status = false;\n ok.blinkDetected.status = false;\n ok.faceSize.status = false;\n ok.antispoofCheck.status = false;\n ok.livenessCheck.status = false;\n ok.age.status = false;\n ok.gender.status = false;\n ok.elapsedMs.val = 0;\n dom.match.style.display = 'none';\n dom.retry.style.display = 'none';\n dom.source.style.display = 'none';\n dom.canvas.style.height = '50%';\n document.body.style.background = 'black';\n await webCam();\n await detectionLoop(); // start detection loop\n startTime = human.now();\n current.face = await validationLoop(); // start validation loop\n dom.canvas.width = current.face?.tensor?.shape[1] || options.minSize;\n dom.canvas.height = current.face?.tensor?.shape[0] || options.minSize;\n dom.source.width = dom.canvas.width;\n dom.source.height = dom.canvas.height;\n dom.canvas.style.width = '';\n dom.match.style.display = 'flex';\n dom.save.style.display = 'flex';\n dom.delete.style.display = 'flex';\n dom.retry.style.display = 'block';\n if (!allOk()) { // is all criteria met?\n log('did not find valid face');\n return false;\n }\n return detectFace();\n}\n\nasync function init() {\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('options:', JSON.stringify(options).replace(/{|}|\"|\\[|\\]/g, '').replace(/,/g, ' '));\n log('initializing webcam...');\n await webCam(); // start webcam\n log('loading human models...');\n await human.load(); // preload all models\n log('initializing human...');\n log('face embedding model:', humanConfig.face.description.enabled ? 'faceres' : '', humanConfig.face['mobilefacenet']?.enabled ? 'mobilefacenet' : '', humanConfig.face['insightface']?.enabled ? 'insightface' : '');\n log('loading face database...');\n log('known face records:', await indexDb.count());\n dom.retry.addEventListener('click', main);\n dom.save.addEventListener('click', saveRecords);\n dom.delete.addEventListener('click', deleteRecord);\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await main();\n}\n\nwindow.onload = init;\n", "let db: IDBDatabase; // instance of indexdb\n\nconst database = 'human';\nconst table = 'person';\n\nexport interface FaceRecord { id: number, name: string, descriptor: number[], image: ImageData }\n\nconst log = (...msg) => console.log('indexdb', ...msg); // eslint-disable-line no-console\n\nexport async function open() {\n if (db) return true;\n return new Promise((resolve) => {\n const request: IDBOpenDBRequest = indexedDB.open(database, 1);\n request.onerror = (evt) => log('error:', evt);\n request.onupgradeneeded = (evt: IDBVersionChangeEvent) => { // create if doesnt exist\n log('create:', evt.target);\n db = (evt.target as IDBOpenDBRequest).result;\n db.createObjectStore(table, { keyPath: 'id', autoIncrement: true });\n };\n request.onsuccess = (evt) => { // open\n db = (evt.target as IDBOpenDBRequest).result;\n log('open:', db);\n resolve(true);\n };\n });\n}\n\nexport async function load(): Promise {\n const faceDB: FaceRecord[] = [];\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const cursor: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).openCursor(null, 'next');\n cursor.onerror = (evt) => log('load error:', evt);\n cursor.onsuccess = (evt) => {\n if ((evt.target as IDBRequest).result) {\n faceDB.push((evt.target as IDBRequest).result.value);\n (evt.target as IDBRequest).result.continue();\n } else {\n resolve(faceDB);\n }\n };\n });\n}\n\nexport async function count(): Promise {\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const store: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).count();\n store.onerror = (evt) => log('count error:', evt);\n store.onsuccess = () => resolve(store.result);\n });\n}\n\nexport async function save(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n const newRecord = { name: faceRecord.name, descriptor: faceRecord.descriptor, image: faceRecord.image }; // omit id as its autoincrement\n db.transaction([table], 'readwrite').objectStore(table).put(newRecord);\n log('save:', newRecord);\n}\n\nexport async function remove(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n db.transaction([table], 'readwrite').objectStore(table).delete(faceRecord.id); // delete based on id\n log('delete:', faceRecord);\n}\n"], - "mappings": ";;;;;;AASA,UAAYA,MAAO,0BCTnB,IAAIC,EAEEC,EAAW,QACXC,EAAQ,SAIRC,EAAM,IAAIC,IAAQ,QAAQ,IAAI,UAAW,GAAGA,CAAG,EAErD,eAAsBC,GAAO,CAC3B,OAAIL,EAAW,GACR,IAAI,QAASM,GAAY,CAC9B,IAAMC,EAA4B,UAAU,KAAKN,EAAU,CAAC,EAC5DM,EAAQ,QAAWC,GAAQL,EAAI,SAAUK,CAAG,EAC5CD,EAAQ,gBAAmBC,GAA+B,CACxDL,EAAI,UAAWK,EAAI,MAAM,EACzBR,EAAMQ,EAAI,OAA4B,OACtCR,EAAG,kBAAkBE,EAAO,CAAE,QAAS,KAAM,cAAe,EAAK,CAAC,CACpE,EACAK,EAAQ,UAAaC,GAAQ,CAC3BR,EAAMQ,EAAI,OAA4B,OACtCL,EAAI,QAASH,CAAE,EACfM,EAAQ,EAAI,CACd,CACF,CAAC,CACH,CAEA,eAAsBG,GAA8B,CAClD,IAAMC,EAAuB,CAAC,EAC9B,OAAKV,GAAI,MAAMK,EAAK,EACb,IAAI,QAASC,GAAY,CAC9B,IAAMK,EAAqBX,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,WAAW,KAAM,MAAM,EAC1GS,EAAO,QAAWH,GAAQL,EAAI,cAAeK,CAAG,EAChDG,EAAO,UAAaH,GAAQ,CACrBA,EAAI,OAAsB,QAC7BE,EAAO,KAAMF,EAAI,OAAsB,OAAO,KAAK,EAClDA,EAAI,OAAsB,OAAO,SAAS,GAE3CF,EAAQI,CAAM,CAElB,CACF,CAAC,CACH,CAEA,eAAsBE,GAAyB,CAC7C,OAAKZ,GAAI,MAAMK,EAAK,EACb,IAAI,QAASC,GAAY,CAC9B,IAAMO,EAAoBb,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,MAAM,EACxFW,EAAM,QAAWL,GAAQL,EAAI,eAAgBK,CAAG,EAChDK,EAAM,UAAY,IAAMP,EAAQO,EAAM,MAAM,CAC9C,CAAC,CACH,CAEA,eAAsBC,EAAKC,EAAwB,CAC5Cf,GAAI,MAAMK,EAAK,EACpB,IAAMW,EAAY,CAAE,KAAMD,EAAW,KAAM,WAAYA,EAAW,WAAY,MAAOA,EAAW,KAAM,EACtGf,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,IAAIc,CAAS,EACrEb,EAAI,QAASa,CAAS,CACxB,CAEA,eAAsBC,EAAOF,EAAwB,CAC9Cf,GAAI,MAAMK,EAAK,EACpBL,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,OAAOa,EAAW,EAAE,EAC5EZ,EAAI,UAAWY,CAAU,CAC3B,CDpDA,IAAMG,EAAc,CAClB,iBAAkB,EAClB,cAAe,eACf,OAAQ,CAAE,QAAS,GAAM,aAAc,EAAK,EAC5C,MAAO,GACP,KAAM,CACJ,QAAS,GACT,SAAU,CAAE,SAAU,GAAM,OAAQ,GAAM,WAAY,IAAK,KAAM,EAAM,EACvE,YAAa,CAAE,QAAS,EAAK,EAG7B,KAAM,CAAE,QAAS,EAAK,EACtB,QAAS,CAAE,QAAS,EAAM,EAC1B,UAAW,CAAE,QAAS,EAAK,EAC3B,SAAU,CAAE,QAAS,EAAK,CAC5B,EACA,KAAM,CAAE,QAAS,EAAM,EACvB,KAAM,CAAE,QAAS,EAAM,EACvB,OAAQ,CAAE,QAAS,EAAM,EACzB,QAAS,CAAE,QAAS,EAAK,CAC3B,EAGMC,EAAe,CAAE,MAAO,EAAG,WAAY,GAAI,IAAK,GAAK,IAAK,EAAI,EAE9DC,EAAU,CACd,cAAe,GACf,QAAS,IACT,QAAS,IACT,SAAU,GACV,SAAU,IACV,UAAW,GACX,YAAa,GACb,YAAa,EACb,KAAMF,EAAY,KAAK,SAAS,KAChC,SAAUA,EAAY,KAAK,SAAS,SACpC,WAAYA,EAAY,KAAK,SAAS,WACtC,GAAGC,CACL,EAEME,EAAmE,CACvE,UAAW,CAAE,OAAQ,GAAO,IAAK,CAAE,EACnC,eAAgB,CAAE,OAAQ,GAAO,IAAK,CAAE,EACxC,aAAc,CAAE,OAAQ,GAAO,IAAK,CAAE,EACtC,cAAe,CAAE,OAAQ,GAAO,IAAK,CAAE,EACvC,cAAe,CAAE,OAAQ,GAAO,IAAK,CAAE,EACvC,SAAU,CAAE,OAAQ,GAAO,IAAK,CAAE,EAClC,eAAgB,CAAE,OAAQ,GAAO,IAAK,CAAE,EACxC,cAAe,CAAE,OAAQ,GAAO,IAAK,CAAE,EACvC,SAAU,CAAE,OAAQ,GAAO,IAAK,CAAE,EAClC,IAAK,CAAE,OAAQ,GAAO,IAAK,CAAE,EAC7B,OAAQ,CAAE,OAAQ,GAAO,IAAK,CAAE,EAChC,QAAS,CAAE,OAAQ,GAAM,IAAK,CAAE,EAChC,WAAY,CAAE,OAAQ,GAAO,IAAK,CAAE,EACpC,UAAW,CAAE,OAAQ,OAAW,IAAK,CAAE,EACvC,UAAW,CAAE,OAAQ,OAAW,IAAK,CAAE,EACvC,QAAS,CAAE,OAAQ,OAAW,IAAK,CAAE,CACvC,EAEMC,EAAQ,IAAMD,EAAG,UAAU,QAC5BA,EAAG,SAAS,QACZA,EAAG,cAAc,QACjBA,EAAG,aAAa,QAChBA,EAAG,cAAc,QACjBA,EAAG,eAAe,QAClBA,EAAG,eAAe,QAClBA,EAAG,cAAc,QACjBA,EAAG,SAAS,QACZA,EAAG,WAAW,QACdA,EAAG,IAAI,QACPA,EAAG,OAAO,OAETE,EAA4E,CAAE,KAAM,KAAM,OAAQ,IAAK,EAEvGC,EAAQ,CACZ,MAAO,EACP,IAAK,EACL,KAAM,CACR,EAGMC,EAAQ,IAAM,QAAMP,CAAW,EAErCO,EAAM,IAAI,QAAU,GACpBA,EAAM,KAAK,QAAQ,KAAO,yBAC1BA,EAAM,KAAK,QAAQ,WAAa,GAEhC,IAAMC,EAAM,CACV,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,IAAK,SAAS,eAAe,KAAK,EAClC,IAAK,SAAS,eAAe,KAAK,EAClC,MAAO,SAAS,eAAe,OAAO,EACtC,KAAM,SAAS,eAAe,MAAM,EACpC,KAAM,SAAS,eAAe,MAAM,EACpC,OAAQ,SAAS,eAAe,QAAQ,EACxC,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,GAAI,SAAS,eAAe,IAAI,CAClC,EACMC,EAAY,CAAE,OAAQ,EAAG,KAAM,CAAE,EACnCC,EAAY,EAEVC,EAAM,IAAIC,IAAQ,CACtBJ,EAAI,IAAI,WAAaI,EAAI,KAAK,GAAG,EAAI;AAAA,EACrC,QAAQ,IAAI,GAAGA,CAAG,CACpB,EAEA,eAAeC,GAAS,CAEtB,IAAMC,EAAwC,CAAE,MAAO,GAAO,MAAO,CAAE,WAAY,OAAQ,WAAY,OAAQ,MAAO,CAAE,MAAO,SAAS,KAAK,WAAY,CAAE,CAAE,EACvJC,EAAsB,MAAM,UAAU,aAAa,aAAaD,CAAa,EAC7EE,EAAQ,IAAI,QAASC,GAAY,CAAET,EAAI,MAAM,aAAe,IAAMS,EAAQ,EAAI,CAAG,CAAC,EACxFT,EAAI,MAAM,UAAYO,EACjBP,EAAI,MAAM,KAAK,EACpB,MAAMQ,EACNR,EAAI,OAAO,MAAQA,EAAI,MAAM,WAC7BA,EAAI,OAAO,OAASA,EAAI,MAAM,YAC9BA,EAAI,OAAO,MAAM,MAAQ,MACzBA,EAAI,OAAO,MAAM,OAAS,MACtBD,EAAM,IAAI,SAASI,EAAI,SAAUH,EAAI,MAAM,WAAYA,EAAI,MAAM,YAAa,IAAKO,EAAO,eAAe,EAAE,GAAG,KAAK,EACvHP,EAAI,OAAO,QAAU,IAAM,CACrBA,EAAI,MAAM,OAAaA,EAAI,MAAM,KAAK,EACrCA,EAAI,MAAM,MAAM,CACvB,CACF,CAEA,eAAeU,GAAgB,CA3I/B,IAAAC,EA4IE,GAAI,CAACX,EAAI,MAAM,OAAQ,EACjBW,EAAAd,EAAQ,OAAR,MAAAc,EAAc,QAAQZ,EAAM,GAAG,QAAQF,EAAQ,KAAK,MAAM,EAC9D,MAAME,EAAM,OAAOC,EAAI,KAAK,EAC5B,IAAMY,EAAMb,EAAM,IAAI,EACtBJ,EAAG,UAAU,IAAM,KAAK,MAAM,KAASiB,EAAMX,EAAU,OAAO,EAAI,GAClEA,EAAU,OAASW,EACnB,sBAAsBF,CAAa,CACrC,CACF,CAEA,SAASG,GAAsB,CAC7B,IAAIC,EAAI,GACR,OAAW,CAACC,EAAKC,CAAG,IAAK,OAAO,QAAQrB,CAAE,EAAG,CAC3C,IAAIsB,EAAK,SAAS,eAAe,MAAMF,GAAK,EACvCE,IACHA,EAAK,SAAS,cAAc,KAAK,EACjCA,EAAG,GAAK,MAAMF,IACdE,EAAG,UAAYF,EACfE,EAAG,UAAY,KACfA,EAAG,MAAM,IAAM,GAAGH,MAClBd,EAAI,GAAG,YAAYiB,CAAE,GAEnB,OAAOD,EAAI,QAAW,YAAWC,EAAG,MAAM,gBAAkBD,EAAI,OAAS,aAAe,cAC5F,IAAME,EAASF,EAAI,OAAS,KAAO,OACnCC,EAAG,UAAY,GAAGF,MAAQC,EAAI,MAAQ,EAAIE,EAASF,EAAI,MACvDF,GAAK,EACP,CACF,CAEA,eAAeK,GAAwC,CAzKvD,IAAAR,EA0KE,IAAMS,EAAerB,EAAM,KAAKA,EAAM,MAAM,EAC5CA,EAAM,KAAK,OAAOC,EAAI,MAAOA,EAAI,MAAM,EACvC,MAAMD,EAAM,KAAK,IAAIC,EAAI,OAAQoB,CAAY,EAC7C,IAAMR,EAAMb,EAAM,IAAI,EAKtB,GAJAJ,EAAG,QAAQ,IAAM,KAAK,MAAM,KAASiB,EAAMX,EAAU,KAAK,EAAI,GAC9DA,EAAU,KAAOW,EACjBjB,EAAG,UAAU,IAAMI,EAAM,OAAO,KAAK,OACrCJ,EAAG,UAAU,OAASA,EAAG,UAAU,MAAQ,EACvCA,EAAG,UAAU,OAAQ,CACvB,IAAM0B,EAAqB,OAAO,OAAOtB,EAAM,OAAO,OAAO,EAAE,IAAKuB,GAA6BA,EAAQ,OAAO,GAC5GD,EAAS,SAAS,gBAAgB,GAAKA,EAAS,SAAS,iBAAiB,KAAGvB,EAAM,MAAQC,EAAM,IAAI,GACrGD,EAAM,MAAQ,GAAK,CAACuB,EAAS,SAAS,gBAAgB,GAAK,CAACA,EAAS,SAAS,iBAAiB,IAAGvB,EAAM,IAAMC,EAAM,IAAI,GAC5HJ,EAAG,cAAc,OAASA,EAAG,cAAc,QAAW,KAAK,IAAIG,EAAM,IAAMA,EAAM,KAAK,EAAIJ,EAAQ,UAAY,KAAK,IAAII,EAAM,IAAMA,EAAM,KAAK,EAAIJ,EAAQ,SACtJC,EAAG,cAAc,QAAUG,EAAM,OAAS,IAAGA,EAAM,KAAO,KAAK,MAAMA,EAAM,IAAMA,EAAM,KAAK,GAChGH,EAAG,aAAa,OAAS0B,EAAS,SAAS,eAAe,EAC1D1B,EAAG,cAAc,OAAS0B,EAAS,SAAS,gBAAgB,EAC5D1B,EAAG,eAAe,IAAMI,EAAM,OAAO,KAAK,GAAG,WAAaA,EAAM,OAAO,KAAK,GAAG,UAAY,EAC3FJ,EAAG,eAAe,OAASA,EAAG,eAAe,KAAOD,EAAQ,cAC5DC,EAAG,eAAe,IAAMI,EAAM,OAAO,KAAK,GAAG,MAAQ,EACrDJ,EAAG,eAAe,OAASA,EAAG,eAAe,KAAOD,EAAQ,cAC5DC,EAAG,cAAc,IAAMI,EAAM,OAAO,KAAK,GAAG,MAAQ,EACpDJ,EAAG,cAAc,OAASA,EAAG,cAAc,KAAOD,EAAQ,cAC1DC,EAAG,SAAS,IAAM,KAAK,IAAII,EAAM,OAAO,KAAK,GAAG,IAAI,GAAIA,EAAM,OAAO,KAAK,GAAG,IAAI,EAAE,EACnFJ,EAAG,SAAS,OAASA,EAAG,SAAS,KAAOD,EAAQ,QAChDC,EAAG,SAAS,IAAMI,EAAM,OAAO,KAAK,GAAG,UAAY,EACnDJ,EAAG,SAAS,OAAUA,EAAG,SAAS,KAAOD,EAAQ,aAAiBC,EAAG,SAAS,KAAOD,EAAQ,YAC7FC,EAAG,WAAW,MAAMgB,EAAAZ,EAAM,OAAO,KAAK,GAAG,YAArB,YAAAY,EAAgC,SAAU,EAC9DhB,EAAG,WAAW,OAASA,EAAG,WAAW,IAAM,EAC3CA,EAAG,IAAI,IAAMI,EAAM,OAAO,KAAK,GAAG,KAAO,EACzCJ,EAAG,IAAI,OAASA,EAAG,IAAI,IAAM,EAC7BA,EAAG,OAAO,IAAMI,EAAM,OAAO,KAAK,GAAG,aAAe,EACpDJ,EAAG,OAAO,OAASA,EAAG,OAAO,KAAOD,EAAQ,aAC9C,CAIA,OAFAC,EAAG,QAAQ,OAASA,EAAG,UAAU,KAAOD,EAAQ,QAChDmB,EAAoB,EAChBjB,EAAM,GAAK,CAACD,EAAG,QAAQ,QACzBK,EAAI,MAAM,MAAM,EACTD,EAAM,OAAO,KAAK,KAE3BJ,EAAG,UAAU,IAAM,KAAK,MAAMI,EAAM,IAAI,EAAIG,CAAS,EAC9C,IAAI,QAASO,GAAY,CAC9B,WAAW,SAAY,CACrB,MAAMU,EAAe,EACrBV,EAAQV,EAAM,OAAO,KAAK,EAAE,CAC9B,EAAG,EAAE,CACP,CAAC,EACH,CAEA,eAAewB,GAAc,CA3N7B,IAAAZ,EAAAa,EAAAC,EAAAC,EA4NE,GAAI1B,EAAI,KAAK,MAAM,OAAS,EAAG,CAC7B,IAAM2B,GAAQhB,EAAAX,EAAI,OAAO,WAAW,IAAI,IAA1B,YAAAW,EAA6B,aAAa,EAAG,EAAGX,EAAI,OAAO,MAAOA,EAAI,OAAO,QACrF4B,EAAM,CAAE,GAAI,EAAG,KAAM5B,EAAI,KAAK,MAAO,YAAYwB,EAAA3B,EAAQ,OAAR,YAAA2B,EAAc,UAAuB,MAAAG,CAAM,EAClG,MAAcE,EAAKD,CAAG,EACtBzB,EAAI,qBAAsByB,EAAI,KAAM,sBAAsBF,GAAAD,EAAA5B,EAAQ,OAAR,YAAA4B,EAAc,YAAd,YAAAC,EAAyB,MAAM,EACzFvB,EAAI,sBAAuB,MAAc2B,EAAM,CAAC,CAClD,MACE3B,EAAI,cAAc,CAEtB,CAEA,eAAe4B,GAAe,CACxBlC,EAAQ,QAAUA,EAAQ,OAAO,GAAK,GACxC,MAAcmC,EAAOnC,EAAQ,MAAM,CAEvC,CAEA,eAAeoC,GAAa,CA7O5B,IAAAtB,EAAAa,EAAAC,EAAAC,EAgPE,GAFA1B,EAAI,OAAO,MAAM,OAAS,IAC1BW,EAAAX,EAAI,OAAO,WAAW,IAAI,IAA1B,MAAAW,EAA6B,UAAU,EAAG,EAAGjB,EAAQ,QAASA,EAAQ,SAClE,GAAC8B,EAAA3B,GAAA,YAAAA,EAAS,OAAT,MAAA2B,EAAe,SAAU,GAACC,EAAA5B,GAAA,YAAAA,EAAS,OAAT,MAAA4B,EAAe,WAAW,MAAO,GAIhE,GAHA,QAAQ,IAAI,eAAgB5B,EAAQ,IAAI,EACxCM,EAAI,kBAAkBN,EAAQ,KAAK,UAAUA,EAAQ,KAAK,KAAO,eAAe,KAAOA,EAAQ,KAAK,UAAY,QAAQ,KAAK,MAAM,KAAOA,EAAQ,KAAK,UAAY,GAAK,IAAI,KAAK,EACjL,MAAME,EAAM,GAAG,QAAQ,SAASF,EAAQ,KAAK,OAAQG,EAAI,MAAM,EAC3D,MAAc8B,EAAM,IAAM,EAC5B,OAAA3B,EAAI,sDAAsD,EAC1D,SAAS,KAAK,MAAM,WAAa,QACjCH,EAAI,OAAO,MAAM,QAAU,OACpB,GAET,IAAMkC,EAAK,MAAcC,EAAK,EACxBC,EAAcF,EAAG,IAAKN,GAAQA,EAAI,UAAU,EAAE,OAAQS,GAASA,EAAK,OAAS,CAAC,EAC9EC,EAAMvC,EAAM,MAAM,KAAKF,EAAQ,KAAK,UAAWuC,EAAa3C,CAAY,EAC9E,OAAAI,EAAQ,OAASqC,EAAGI,EAAI,QAAU,KAC9BzC,EAAQ,SACVM,EAAI,eAAeN,EAAQ,OAAO,cAAcA,EAAQ,OAAO,oBAAoB,KAAK,MAAM,IAAOyC,EAAI,UAAU,EAAI,KAAK,EAC5HtC,EAAI,KAAK,MAAQH,EAAQ,OAAO,KAChCG,EAAI,OAAO,MAAM,QAAU,IAC3B0B,EAAA1B,EAAI,OAAO,WAAW,IAAI,IAA1B,MAAA0B,EAA6B,aAAa7B,EAAQ,OAAO,MAAO,EAAG,IAErE,SAAS,KAAK,MAAM,WAAayC,EAAI,WAAa5C,EAAQ,UAAY,YAAc,SAC7E4C,EAAI,WAAa5C,EAAQ,SAClC,CAEA,eAAe6C,GAAO,CAxQtB,IAAA5B,EAAAa,EAAAC,EAAAC,EAqSE,OA5BA/B,EAAG,UAAU,OAAS,GACtBA,EAAG,eAAe,OAAS,GAC3BA,EAAG,aAAa,OAAS,GACzBA,EAAG,cAAc,OAAS,GAC1BA,EAAG,SAAS,OAAS,GACrBA,EAAG,eAAe,OAAS,GAC3BA,EAAG,cAAc,OAAS,GAC1BA,EAAG,IAAI,OAAS,GAChBA,EAAG,OAAO,OAAS,GACnBA,EAAG,UAAU,IAAM,EACnBK,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,OAAO,MAAM,QAAU,OAC3BA,EAAI,OAAO,MAAM,OAAS,MAC1B,SAAS,KAAK,MAAM,WAAa,QACjC,MAAMK,EAAO,EACb,MAAMK,EAAc,EACpBR,EAAYH,EAAM,IAAI,EACtBF,EAAQ,KAAO,MAAMsB,EAAe,EACpCnB,EAAI,OAAO,QAAQwB,GAAAb,EAAAd,EAAQ,OAAR,YAAAc,EAAc,SAAd,YAAAa,EAAsB,MAAM,KAAM9B,EAAQ,QAC7DM,EAAI,OAAO,SAAS0B,GAAAD,EAAA5B,EAAQ,OAAR,YAAA4B,EAAc,SAAd,YAAAC,EAAsB,MAAM,KAAMhC,EAAQ,QAC9DM,EAAI,OAAO,MAAQA,EAAI,OAAO,MAC9BA,EAAI,OAAO,OAASA,EAAI,OAAO,OAC/BA,EAAI,OAAO,MAAM,MAAQ,GACzBA,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,KAAK,MAAM,QAAU,OACzBA,EAAI,OAAO,MAAM,QAAU,OAC3BA,EAAI,MAAM,MAAM,QAAU,QACrBJ,EAAM,EAIJqC,EAAW,GAHhB9B,EAAI,yBAAyB,EACtB,GAGX,CAEA,eAAeqC,GAAO,CA5StB,IAAA7B,EAAAa,EA6SErB,EAAI,iBAAkBJ,EAAM,QAAS,kBAAmBA,EAAM,GAAG,QAAQ,YAAY,EACrFI,EAAI,WAAY,KAAK,UAAUT,CAAO,EAAE,QAAQ,eAAgB,EAAE,EAAE,QAAQ,KAAM,GAAG,CAAC,EACtFS,EAAI,wBAAwB,EAC5B,MAAME,EAAO,EACbF,EAAI,yBAAyB,EAC7B,MAAMJ,EAAM,KAAK,EACjBI,EAAI,uBAAuB,EAC3BA,EAAI,wBAAyBX,EAAY,KAAK,YAAY,QAAU,UAAY,IAAImB,EAAAnB,EAAY,KAAK,gBAAjB,MAAAmB,EAAmC,QAAU,gBAAkB,IAAIa,EAAAhC,EAAY,KAAK,cAAjB,MAAAgC,EAAiC,QAAU,cAAgB,EAAE,EACpNrB,EAAI,0BAA0B,EAC9BA,EAAI,sBAAuB,MAAc2B,EAAM,CAAC,EAChD9B,EAAI,MAAM,iBAAiB,QAASuC,CAAI,EACxCvC,EAAI,KAAK,iBAAiB,QAASuB,CAAW,EAC9CvB,EAAI,OAAO,iBAAiB,QAAS+B,CAAY,EACjD,MAAMhC,EAAM,OAAO,EACnB,MAAMwC,EAAK,CACb,CAEA,OAAO,OAASC", + "sourcesContent": ["/**\n * Human demo for browsers\n * @default Human Library\n * @summary \n * @author \n * @copyright \n * @license MIT\n */\n\nimport * as H from '../../dist/human.esm.js'; // equivalent of @vladmandic/Human\nimport * as indexDb from './indexdb'; // methods to deal with indexdb\n\nconst humanConfig = { // user configuration for human, used to fine-tune behavior\n cacheSensitivity: 0,\n modelBasePath: '../../models',\n filter: { enabled: true, equalization: true }, // lets run with histogram equilizer\n debug: true,\n face: {\n enabled: true,\n detector: { rotation: true, return: true, mask: false }, // return tensor is used to get detected face image\n description: { enabled: true }, // default model for face descriptor extraction is faceres\n // mobilefacenet: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model\n // insightface: { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }, // alternative model\n iris: { enabled: true }, // needed to determine gaze direction\n emotion: { enabled: false }, // not needed\n antispoof: { enabled: true }, // enable optional antispoof module\n liveness: { enabled: true }, // enable optional liveness module\n },\n body: { enabled: false },\n hand: { enabled: false },\n object: { enabled: false },\n gesture: { enabled: true }, // parses face and iris gestures\n};\n\n// const matchOptions = { order: 2, multiplier: 1000, min: 0.0, max: 1.0 }; // for embedding model\nconst matchOptions = { order: 2, multiplier: 25, min: 0.2, max: 0.8 }; // for faceres model\n\nconst options = {\n minConfidence: 0.6, // overal face confidence for box, face, gender, real, live\n minSize: 224, // min input to face descriptor model before degradation\n maxTime: 30000, // max time before giving up\n blinkMin: 10, // minimum duration of a valid blink\n blinkMax: 800, // maximum duration of a valid blink\n threshold: 0.5, // minimum similarity\n distanceMin: 0.4, // closest that face is allowed to be to the cammera in cm\n distanceMax: 1.0, // farthest that face is allowed to be to the cammera in cm\n mask: humanConfig.face.detector.mask,\n rotation: humanConfig.face.detector.rotation,\n ...matchOptions,\n};\n\nconst ok: Record = { // must meet all rules\n faceCount: { status: false, val: 0 },\n faceConfidence: { status: false, val: 0 },\n facingCenter: { status: false, val: 0 },\n lookingCenter: { status: false, val: 0 },\n blinkDetected: { status: false, val: 0 },\n faceSize: { status: false, val: 0 },\n antispoofCheck: { status: false, val: 0 },\n livenessCheck: { status: false, val: 0 },\n distance: { status: false, val: 0 },\n age: { status: false, val: 0 },\n gender: { status: false, val: 0 },\n timeout: { status: true, val: 0 },\n descriptor: { status: false, val: 0 },\n elapsedMs: { status: undefined, val: 0 }, // total time while waiting for valid face\n detectFPS: { status: undefined, val: 0 }, // mark detection fps performance\n drawFPS: { status: undefined, val: 0 }, // mark redraw fps performance\n};\n\nconst allOk = () => ok.faceCount.status\n && ok.faceSize.status\n && ok.blinkDetected.status\n && ok.facingCenter.status\n && ok.lookingCenter.status\n && ok.faceConfidence.status\n && ok.antispoofCheck.status\n && ok.livenessCheck.status\n && ok.distance.status\n && ok.descriptor.status\n && ok.age.status\n && ok.gender.status;\n\nconst current: { face: H.FaceResult | null, record: indexDb.FaceRecord | null } = { face: null, record: null }; // current face record and matched database record\n\nconst blink = { // internal timers for blink start/end/duration\n start: 0,\n end: 0,\n time: 0,\n};\n\n// let db: Array<{ name: string, source: string, embedding: number[] }> = []; // holds loaded face descriptor database\nconst human = new H.Human(humanConfig); // create instance of human with overrides from user configuration\n\nhuman.env.perfadd = false; // is performance data showing instant or total values\nhuman.draw.options.font = 'small-caps 18px \"Lato\"'; // set font used to draw labels when using draw methods\nhuman.draw.options.lineHeight = 20;\n\nconst dom = { // grab instances of dom objects so we dont have to look them up later\n video: document.getElementById('video') as HTMLVideoElement,\n canvas: document.getElementById('canvas') as HTMLCanvasElement,\n log: document.getElementById('log') as HTMLPreElement,\n fps: document.getElementById('fps') as HTMLPreElement,\n match: document.getElementById('match') as HTMLDivElement,\n name: document.getElementById('name') as HTMLInputElement,\n save: document.getElementById('save') as HTMLSpanElement,\n delete: document.getElementById('delete') as HTMLSpanElement,\n retry: document.getElementById('retry') as HTMLDivElement,\n source: document.getElementById('source') as HTMLCanvasElement,\n ok: document.getElementById('ok') as HTMLDivElement,\n};\nconst timestamp = { detect: 0, draw: 0 }; // holds information used to calculate performance and possible memory leaks\nlet startTime = 0;\n\nconst log = (...msg) => { // helper method to output messages\n dom.log.innerText += msg.join(' ') + '\\n';\n console.log(...msg); // eslint-disable-line no-console\n};\n\nasync function webCam() { // initialize webcam\n // @ts-ignore resizeMode is not yet defined in tslib\n const cameraOptions: MediaStreamConstraints = { audio: false, video: { facingMode: 'user', resizeMode: 'none', width: { ideal: document.body.clientWidth } } };\n const stream: MediaStream = await navigator.mediaDevices.getUserMedia(cameraOptions);\n const ready = new Promise((resolve) => { dom.video.onloadeddata = () => resolve(true); });\n dom.video.srcObject = stream;\n void dom.video.play();\n await ready;\n dom.canvas.width = dom.video.videoWidth;\n dom.canvas.height = dom.video.videoHeight;\n dom.canvas.style.width = '50%';\n dom.canvas.style.height = '50%';\n if (human.env.initial) log('video:', dom.video.videoWidth, dom.video.videoHeight, '|', stream.getVideoTracks()[0].label);\n dom.canvas.onclick = () => { // pause when clicked on screen and resume on next click\n if (dom.video.paused) void dom.video.play();\n else dom.video.pause();\n };\n}\n\nasync function detectionLoop() { // main detection loop\n if (!dom.video.paused) {\n if (current.face?.tensor) human.tf.dispose(current.face.tensor); // dispose previous tensor\n await human.detect(dom.video); // actual detection; were not capturing output in a local variable as it can also be reached via human.result\n const now = human.now();\n ok.detectFPS.val = Math.round(10000 / (now - timestamp.detect)) / 10;\n timestamp.detect = now;\n requestAnimationFrame(detectionLoop); // start new frame immediately\n }\n}\n\nfunction drawValidationTests() {\n let y = 32;\n for (const [key, val] of Object.entries(ok)) {\n let el = document.getElementById(`ok-${key}`);\n if (!el) {\n el = document.createElement('div');\n el.id = `ok-${key}`;\n el.innerText = key;\n el.className = 'ok';\n el.style.top = `${y}px`;\n dom.ok.appendChild(el);\n }\n if (typeof val.status === 'boolean') el.style.backgroundColor = val.status ? 'lightgreen' : 'lightcoral';\n const status = val.status ? 'ok' : 'fail';\n el.innerText = `${key}: ${val.val === 0 ? status : val.val}`;\n y += 28;\n }\n}\n\nasync function validationLoop(): Promise { // main screen refresh loop\n const interpolated = human.next(human.result); // smoothen result using last-known results\n human.draw.canvas(dom.video, dom.canvas); // draw canvas to screen\n await human.draw.all(dom.canvas, interpolated); // draw labels, boxes, lines, etc.\n const now = human.now();\n ok.drawFPS.val = Math.round(10000 / (now - timestamp.draw)) / 10;\n timestamp.draw = now;\n ok.faceCount.val = human.result.face.length;\n ok.faceCount.status = ok.faceCount.val === 1; // must be exactly detected face\n if (ok.faceCount.status) { // skip the rest if no face\n const gestures: string[] = Object.values(human.result.gesture).map((gesture: H.GestureResult) => gesture.gesture); // flatten all gestures\n if (gestures.includes('blink left eye') || gestures.includes('blink right eye')) blink.start = human.now(); // blink starts when eyes get closed\n if (blink.start > 0 && !gestures.includes('blink left eye') && !gestures.includes('blink right eye')) blink.end = human.now(); // if blink started how long until eyes are back open\n ok.blinkDetected.status = ok.blinkDetected.status || (Math.abs(blink.end - blink.start) > options.blinkMin && Math.abs(blink.end - blink.start) < options.blinkMax);\n if (ok.blinkDetected.status && blink.time === 0) blink.time = Math.trunc(blink.end - blink.start);\n ok.facingCenter.status = gestures.includes('facing center');\n ok.lookingCenter.status = gestures.includes('looking center'); // must face camera and look at camera\n ok.faceConfidence.val = human.result.face[0].faceScore || human.result.face[0].boxScore || 0;\n ok.faceConfidence.status = ok.faceConfidence.val >= options.minConfidence;\n ok.antispoofCheck.val = human.result.face[0].real || 0;\n ok.antispoofCheck.status = ok.antispoofCheck.val >= options.minConfidence;\n ok.livenessCheck.val = human.result.face[0].live || 0;\n ok.livenessCheck.status = ok.livenessCheck.val >= options.minConfidence;\n ok.faceSize.val = Math.min(human.result.face[0].box[2], human.result.face[0].box[3]);\n ok.faceSize.status = ok.faceSize.val >= options.minSize;\n ok.distance.val = human.result.face[0].distance || 0;\n ok.distance.status = (ok.distance.val >= options.distanceMin) && (ok.distance.val <= options.distanceMax);\n ok.descriptor.val = human.result.face[0].embedding?.length || 0;\n ok.descriptor.status = ok.descriptor.val > 0;\n ok.age.val = human.result.face[0].age || 0;\n ok.age.status = ok.age.val > 0;\n ok.gender.val = human.result.face[0].genderScore || 0;\n ok.gender.status = ok.gender.val >= options.minConfidence;\n }\n // run again\n ok.timeout.status = ok.elapsedMs.val <= options.maxTime;\n drawValidationTests();\n if (allOk() || !ok.timeout.status) { // all criteria met\n dom.video.pause();\n return human.result.face[0];\n }\n ok.elapsedMs.val = Math.trunc(human.now() - startTime);\n return new Promise((resolve) => {\n setTimeout(async () => {\n await validationLoop(); // run validation loop until conditions are met\n resolve(human.result.face[0]); // recursive promise resolve\n }, 30); // use to slow down refresh from max refresh rate to target of 30 fps\n });\n}\n\nasync function saveRecords() {\n if (dom.name.value.length > 0) {\n const image = dom.canvas.getContext('2d')?.getImageData(0, 0, dom.canvas.width, dom.canvas.height) as ImageData;\n const rec = { id: 0, name: dom.name.value, descriptor: current.face?.embedding as number[], image };\n await indexDb.save(rec);\n log('saved face record:', rec.name, 'descriptor length:', current.face?.embedding?.length);\n log('known face records:', await indexDb.count());\n } else {\n log('invalid name');\n }\n}\n\nasync function deleteRecord() {\n if (current.record && current.record.id > 0) {\n await indexDb.remove(current.record);\n }\n}\n\nasync function detectFace() {\n dom.canvas.style.height = '';\n dom.canvas.getContext('2d')?.clearRect(0, 0, options.minSize, options.minSize);\n if (!current?.face?.tensor || !current?.face?.embedding) return false;\n console.log('face record:', current.face); // eslint-disable-line no-console\n log(`detected face: ${current.face.gender} ${current.face.age || 0}y distance ${100 * (current.face.distance || 0)}cm/${Math.round(100 * (current.face.distance || 0) / 2.54)}in`);\n await human.tf.browser.toPixels(current.face.tensor, dom.canvas);\n if (await indexDb.count() === 0) {\n log('face database is empty: nothing to compare face with');\n document.body.style.background = 'black';\n dom.delete.style.display = 'none';\n return false;\n }\n const db = await indexDb.load();\n const descriptors = db.map((rec) => rec.descriptor).filter((desc) => desc.length > 0);\n const res = human.match.find(current.face.embedding, descriptors, matchOptions);\n current.record = db[res.index] || null;\n if (current.record) {\n log(`best match: ${current.record.name} | id: ${current.record.id} | similarity: ${Math.round(1000 * res.similarity) / 10}%`);\n dom.name.value = current.record.name;\n dom.source.style.display = '';\n dom.source.getContext('2d')?.putImageData(current.record.image, 0, 0);\n }\n document.body.style.background = res.similarity > options.threshold ? 'darkgreen' : 'maroon';\n return res.similarity > options.threshold;\n}\n\nasync function main() { // main entry point\n ok.faceCount.status = false;\n ok.faceConfidence.status = false;\n ok.facingCenter.status = false;\n ok.blinkDetected.status = false;\n ok.faceSize.status = false;\n ok.antispoofCheck.status = false;\n ok.livenessCheck.status = false;\n ok.age.status = false;\n ok.gender.status = false;\n ok.elapsedMs.val = 0;\n dom.match.style.display = 'none';\n dom.retry.style.display = 'none';\n dom.source.style.display = 'none';\n dom.canvas.style.height = '50%';\n document.body.style.background = 'black';\n await webCam();\n await detectionLoop(); // start detection loop\n startTime = human.now();\n current.face = await validationLoop(); // start validation loop\n dom.canvas.width = current.face?.tensor?.shape[1] || options.minSize;\n dom.canvas.height = current.face?.tensor?.shape[0] || options.minSize;\n dom.source.width = dom.canvas.width;\n dom.source.height = dom.canvas.height;\n dom.canvas.style.width = '';\n dom.match.style.display = 'flex';\n dom.save.style.display = 'flex';\n dom.delete.style.display = 'flex';\n dom.retry.style.display = 'block';\n if (!allOk()) { // is all criteria met?\n log('did not find valid face');\n return false;\n }\n return detectFace();\n}\n\nasync function init() {\n log('human version:', human.version, '| tfjs version:', human.tf.version['tfjs-core']);\n log('options:', JSON.stringify(options).replace(/{|}|\"|\\[|\\]/g, '').replace(/,/g, ' '));\n log('initializing webcam...');\n await webCam(); // start webcam\n log('loading human models...');\n await human.load(); // preload all models\n log('initializing human...');\n log('face embedding model:', humanConfig.face.description.enabled ? 'faceres' : '', humanConfig.face['mobilefacenet']?.enabled ? 'mobilefacenet' : '', humanConfig.face['insightface']?.enabled ? 'insightface' : '');\n log('loading face database...');\n log('known face records:', await indexDb.count());\n dom.retry.addEventListener('click', main);\n dom.save.addEventListener('click', saveRecords);\n dom.delete.addEventListener('click', deleteRecord);\n await human.warmup(); // warmup function to initialize backend for future faster detection\n await main();\n}\n\nwindow.onload = init;\n", "let db: IDBDatabase; // instance of indexdb\n\nconst database = 'human';\nconst table = 'person';\n\nexport interface FaceRecord { id: number, name: string, descriptor: number[], image: ImageData }\n\nconst log = (...msg) => console.log('indexdb', ...msg); // eslint-disable-line no-console\n\nexport async function open() {\n if (db) return true;\n return new Promise((resolve) => {\n const request: IDBOpenDBRequest = indexedDB.open(database, 1);\n request.onerror = (evt) => log('error:', evt);\n request.onupgradeneeded = (evt: IDBVersionChangeEvent) => { // create if doesnt exist\n log('create:', evt.target);\n db = (evt.target as IDBOpenDBRequest).result;\n db.createObjectStore(table, { keyPath: 'id', autoIncrement: true });\n };\n request.onsuccess = (evt) => { // open\n db = (evt.target as IDBOpenDBRequest).result;\n log('open:', db);\n resolve(true);\n };\n });\n}\n\nexport async function load(): Promise {\n const faceDB: FaceRecord[] = [];\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const cursor: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).openCursor(null, 'next');\n cursor.onerror = (evt) => log('load error:', evt);\n cursor.onsuccess = (evt) => {\n if ((evt.target as IDBRequest).result) {\n faceDB.push((evt.target as IDBRequest).result.value);\n (evt.target as IDBRequest).result.continue();\n } else {\n resolve(faceDB);\n }\n };\n });\n}\n\nexport async function count(): Promise {\n if (!db) await open(); // open or create if not already done\n return new Promise((resolve) => {\n const store: IDBRequest = db.transaction([table], 'readwrite').objectStore(table).count();\n store.onerror = (evt) => log('count error:', evt);\n store.onsuccess = () => resolve(store.result);\n });\n}\n\nexport async function save(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n const newRecord = { name: faceRecord.name, descriptor: faceRecord.descriptor, image: faceRecord.image }; // omit id as its autoincrement\n db.transaction([table], 'readwrite').objectStore(table).put(newRecord);\n log('save:', newRecord);\n}\n\nexport async function remove(faceRecord: FaceRecord) {\n if (!db) await open(); // open or create if not already done\n db.transaction([table], 'readwrite').objectStore(table).delete(faceRecord.id); // delete based on id\n log('delete:', faceRecord);\n}\n"], + "mappings": ";;;;;;AASA,UAAYA,MAAO,0BCTnB,IAAIC,EAEEC,EAAW,QACXC,EAAQ,SAIRC,EAAM,IAAIC,IAAQ,QAAQ,IAAI,UAAW,GAAGA,CAAG,EAErD,eAAsBC,GAAO,CAC3B,OAAIL,EAAW,GACR,IAAI,QAASM,GAAY,CAC9B,IAAMC,EAA4B,UAAU,KAAKN,EAAU,CAAC,EAC5DM,EAAQ,QAAWC,GAAQL,EAAI,SAAUK,CAAG,EAC5CD,EAAQ,gBAAmBC,GAA+B,CACxDL,EAAI,UAAWK,EAAI,MAAM,EACzBR,EAAMQ,EAAI,OAA4B,OACtCR,EAAG,kBAAkBE,EAAO,CAAE,QAAS,KAAM,cAAe,EAAK,CAAC,CACpE,EACAK,EAAQ,UAAaC,GAAQ,CAC3BR,EAAMQ,EAAI,OAA4B,OACtCL,EAAI,QAASH,CAAE,EACfM,EAAQ,EAAI,CACd,CACF,CAAC,CACH,CAEA,eAAsBG,GAA8B,CAClD,IAAMC,EAAuB,CAAC,EAC9B,OAAKV,GAAI,MAAMK,EAAK,EACb,IAAI,QAASC,GAAY,CAC9B,IAAMK,EAAqBX,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,WAAW,KAAM,MAAM,EAC1GS,EAAO,QAAWH,GAAQL,EAAI,cAAeK,CAAG,EAChDG,EAAO,UAAaH,GAAQ,CACrBA,EAAI,OAAsB,QAC7BE,EAAO,KAAMF,EAAI,OAAsB,OAAO,KAAK,EAClDA,EAAI,OAAsB,OAAO,SAAS,GAE3CF,EAAQI,CAAM,CAElB,CACF,CAAC,CACH,CAEA,eAAsBE,GAAyB,CAC7C,OAAKZ,GAAI,MAAMK,EAAK,EACb,IAAI,QAASC,GAAY,CAC9B,IAAMO,EAAoBb,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,MAAM,EACxFW,EAAM,QAAWL,GAAQL,EAAI,eAAgBK,CAAG,EAChDK,EAAM,UAAY,IAAMP,EAAQO,EAAM,MAAM,CAC9C,CAAC,CACH,CAEA,eAAsBC,EAAKC,EAAwB,CAC5Cf,GAAI,MAAMK,EAAK,EACpB,IAAMW,EAAY,CAAE,KAAMD,EAAW,KAAM,WAAYA,EAAW,WAAY,MAAOA,EAAW,KAAM,EACtGf,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,IAAIc,CAAS,EACrEb,EAAI,QAASa,CAAS,CACxB,CAEA,eAAsBC,EAAOF,EAAwB,CAC9Cf,GAAI,MAAMK,EAAK,EACpBL,EAAG,YAAY,CAACE,CAAK,EAAG,WAAW,EAAE,YAAYA,CAAK,EAAE,OAAOa,EAAW,EAAE,EAC5EZ,EAAI,UAAWY,CAAU,CAC3B,CDpDA,IAAMG,EAAc,CAClB,iBAAkB,EAClB,cAAe,eACf,OAAQ,CAAE,QAAS,GAAM,aAAc,EAAK,EAC5C,MAAO,GACP,KAAM,CACJ,QAAS,GACT,SAAU,CAAE,SAAU,GAAM,OAAQ,GAAM,KAAM,EAAM,EACtD,YAAa,CAAE,QAAS,EAAK,EAG7B,KAAM,CAAE,QAAS,EAAK,EACtB,QAAS,CAAE,QAAS,EAAM,EAC1B,UAAW,CAAE,QAAS,EAAK,EAC3B,SAAU,CAAE,QAAS,EAAK,CAC5B,EACA,KAAM,CAAE,QAAS,EAAM,EACvB,KAAM,CAAE,QAAS,EAAM,EACvB,OAAQ,CAAE,QAAS,EAAM,EACzB,QAAS,CAAE,QAAS,EAAK,CAC3B,EAGMC,EAAe,CAAE,MAAO,EAAG,WAAY,GAAI,IAAK,GAAK,IAAK,EAAI,EAE9DC,EAAU,CACd,cAAe,GACf,QAAS,IACT,QAAS,IACT,SAAU,GACV,SAAU,IACV,UAAW,GACX,YAAa,GACb,YAAa,EACb,KAAMF,EAAY,KAAK,SAAS,KAChC,SAAUA,EAAY,KAAK,SAAS,SACpC,GAAGC,CACL,EAEME,EAAmE,CACvE,UAAW,CAAE,OAAQ,GAAO,IAAK,CAAE,EACnC,eAAgB,CAAE,OAAQ,GAAO,IAAK,CAAE,EACxC,aAAc,CAAE,OAAQ,GAAO,IAAK,CAAE,EACtC,cAAe,CAAE,OAAQ,GAAO,IAAK,CAAE,EACvC,cAAe,CAAE,OAAQ,GAAO,IAAK,CAAE,EACvC,SAAU,CAAE,OAAQ,GAAO,IAAK,CAAE,EAClC,eAAgB,CAAE,OAAQ,GAAO,IAAK,CAAE,EACxC,cAAe,CAAE,OAAQ,GAAO,IAAK,CAAE,EACvC,SAAU,CAAE,OAAQ,GAAO,IAAK,CAAE,EAClC,IAAK,CAAE,OAAQ,GAAO,IAAK,CAAE,EAC7B,OAAQ,CAAE,OAAQ,GAAO,IAAK,CAAE,EAChC,QAAS,CAAE,OAAQ,GAAM,IAAK,CAAE,EAChC,WAAY,CAAE,OAAQ,GAAO,IAAK,CAAE,EACpC,UAAW,CAAE,OAAQ,OAAW,IAAK,CAAE,EACvC,UAAW,CAAE,OAAQ,OAAW,IAAK,CAAE,EACvC,QAAS,CAAE,OAAQ,OAAW,IAAK,CAAE,CACvC,EAEMC,EAAQ,IAAMD,EAAG,UAAU,QAC5BA,EAAG,SAAS,QACZA,EAAG,cAAc,QACjBA,EAAG,aAAa,QAChBA,EAAG,cAAc,QACjBA,EAAG,eAAe,QAClBA,EAAG,eAAe,QAClBA,EAAG,cAAc,QACjBA,EAAG,SAAS,QACZA,EAAG,WAAW,QACdA,EAAG,IAAI,QACPA,EAAG,OAAO,OAETE,EAA4E,CAAE,KAAM,KAAM,OAAQ,IAAK,EAEvGC,EAAQ,CACZ,MAAO,EACP,IAAK,EACL,KAAM,CACR,EAGMC,EAAQ,IAAM,QAAMP,CAAW,EAErCO,EAAM,IAAI,QAAU,GACpBA,EAAM,KAAK,QAAQ,KAAO,yBAC1BA,EAAM,KAAK,QAAQ,WAAa,GAEhC,IAAMC,EAAM,CACV,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,IAAK,SAAS,eAAe,KAAK,EAClC,IAAK,SAAS,eAAe,KAAK,EAClC,MAAO,SAAS,eAAe,OAAO,EACtC,KAAM,SAAS,eAAe,MAAM,EACpC,KAAM,SAAS,eAAe,MAAM,EACpC,OAAQ,SAAS,eAAe,QAAQ,EACxC,MAAO,SAAS,eAAe,OAAO,EACtC,OAAQ,SAAS,eAAe,QAAQ,EACxC,GAAI,SAAS,eAAe,IAAI,CAClC,EACMC,EAAY,CAAE,OAAQ,EAAG,KAAM,CAAE,EACnCC,EAAY,EAEVC,EAAM,IAAIC,IAAQ,CACtBJ,EAAI,IAAI,WAAaI,EAAI,KAAK,GAAG,EAAI;AAAA,EACrC,QAAQ,IAAI,GAAGA,CAAG,CACpB,EAEA,eAAeC,GAAS,CAEtB,IAAMC,EAAwC,CAAE,MAAO,GAAO,MAAO,CAAE,WAAY,OAAQ,WAAY,OAAQ,MAAO,CAAE,MAAO,SAAS,KAAK,WAAY,CAAE,CAAE,EACvJC,EAAsB,MAAM,UAAU,aAAa,aAAaD,CAAa,EAC7EE,EAAQ,IAAI,QAASC,GAAY,CAAET,EAAI,MAAM,aAAe,IAAMS,EAAQ,EAAI,CAAG,CAAC,EACxFT,EAAI,MAAM,UAAYO,EACjBP,EAAI,MAAM,KAAK,EACpB,MAAMQ,EACNR,EAAI,OAAO,MAAQA,EAAI,MAAM,WAC7BA,EAAI,OAAO,OAASA,EAAI,MAAM,YAC9BA,EAAI,OAAO,MAAM,MAAQ,MACzBA,EAAI,OAAO,MAAM,OAAS,MACtBD,EAAM,IAAI,SAASI,EAAI,SAAUH,EAAI,MAAM,WAAYA,EAAI,MAAM,YAAa,IAAKO,EAAO,eAAe,EAAE,GAAG,KAAK,EACvHP,EAAI,OAAO,QAAU,IAAM,CACrBA,EAAI,MAAM,OAAaA,EAAI,MAAM,KAAK,EACrCA,EAAI,MAAM,MAAM,CACvB,CACF,CAEA,eAAeU,GAAgB,CA1I/B,IAAAC,EA2IE,GAAI,CAACX,EAAI,MAAM,OAAQ,EACjBW,EAAAd,EAAQ,OAAR,MAAAc,EAAc,QAAQZ,EAAM,GAAG,QAAQF,EAAQ,KAAK,MAAM,EAC9D,MAAME,EAAM,OAAOC,EAAI,KAAK,EAC5B,IAAMY,EAAMb,EAAM,IAAI,EACtBJ,EAAG,UAAU,IAAM,KAAK,MAAM,KAASiB,EAAMX,EAAU,OAAO,EAAI,GAClEA,EAAU,OAASW,EACnB,sBAAsBF,CAAa,CACrC,CACF,CAEA,SAASG,GAAsB,CAC7B,IAAIC,EAAI,GACR,OAAW,CAACC,EAAKC,CAAG,IAAK,OAAO,QAAQrB,CAAE,EAAG,CAC3C,IAAIsB,EAAK,SAAS,eAAe,MAAMF,GAAK,EACvCE,IACHA,EAAK,SAAS,cAAc,KAAK,EACjCA,EAAG,GAAK,MAAMF,IACdE,EAAG,UAAYF,EACfE,EAAG,UAAY,KACfA,EAAG,MAAM,IAAM,GAAGH,MAClBd,EAAI,GAAG,YAAYiB,CAAE,GAEnB,OAAOD,EAAI,QAAW,YAAWC,EAAG,MAAM,gBAAkBD,EAAI,OAAS,aAAe,cAC5F,IAAME,EAASF,EAAI,OAAS,KAAO,OACnCC,EAAG,UAAY,GAAGF,MAAQC,EAAI,MAAQ,EAAIE,EAASF,EAAI,MACvDF,GAAK,EACP,CACF,CAEA,eAAeK,GAAwC,CAxKvD,IAAAR,EAyKE,IAAMS,EAAerB,EAAM,KAAKA,EAAM,MAAM,EAC5CA,EAAM,KAAK,OAAOC,EAAI,MAAOA,EAAI,MAAM,EACvC,MAAMD,EAAM,KAAK,IAAIC,EAAI,OAAQoB,CAAY,EAC7C,IAAMR,EAAMb,EAAM,IAAI,EAKtB,GAJAJ,EAAG,QAAQ,IAAM,KAAK,MAAM,KAASiB,EAAMX,EAAU,KAAK,EAAI,GAC9DA,EAAU,KAAOW,EACjBjB,EAAG,UAAU,IAAMI,EAAM,OAAO,KAAK,OACrCJ,EAAG,UAAU,OAASA,EAAG,UAAU,MAAQ,EACvCA,EAAG,UAAU,OAAQ,CACvB,IAAM0B,EAAqB,OAAO,OAAOtB,EAAM,OAAO,OAAO,EAAE,IAAKuB,GAA6BA,EAAQ,OAAO,GAC5GD,EAAS,SAAS,gBAAgB,GAAKA,EAAS,SAAS,iBAAiB,KAAGvB,EAAM,MAAQC,EAAM,IAAI,GACrGD,EAAM,MAAQ,GAAK,CAACuB,EAAS,SAAS,gBAAgB,GAAK,CAACA,EAAS,SAAS,iBAAiB,IAAGvB,EAAM,IAAMC,EAAM,IAAI,GAC5HJ,EAAG,cAAc,OAASA,EAAG,cAAc,QAAW,KAAK,IAAIG,EAAM,IAAMA,EAAM,KAAK,EAAIJ,EAAQ,UAAY,KAAK,IAAII,EAAM,IAAMA,EAAM,KAAK,EAAIJ,EAAQ,SACtJC,EAAG,cAAc,QAAUG,EAAM,OAAS,IAAGA,EAAM,KAAO,KAAK,MAAMA,EAAM,IAAMA,EAAM,KAAK,GAChGH,EAAG,aAAa,OAAS0B,EAAS,SAAS,eAAe,EAC1D1B,EAAG,cAAc,OAAS0B,EAAS,SAAS,gBAAgB,EAC5D1B,EAAG,eAAe,IAAMI,EAAM,OAAO,KAAK,GAAG,WAAaA,EAAM,OAAO,KAAK,GAAG,UAAY,EAC3FJ,EAAG,eAAe,OAASA,EAAG,eAAe,KAAOD,EAAQ,cAC5DC,EAAG,eAAe,IAAMI,EAAM,OAAO,KAAK,GAAG,MAAQ,EACrDJ,EAAG,eAAe,OAASA,EAAG,eAAe,KAAOD,EAAQ,cAC5DC,EAAG,cAAc,IAAMI,EAAM,OAAO,KAAK,GAAG,MAAQ,EACpDJ,EAAG,cAAc,OAASA,EAAG,cAAc,KAAOD,EAAQ,cAC1DC,EAAG,SAAS,IAAM,KAAK,IAAII,EAAM,OAAO,KAAK,GAAG,IAAI,GAAIA,EAAM,OAAO,KAAK,GAAG,IAAI,EAAE,EACnFJ,EAAG,SAAS,OAASA,EAAG,SAAS,KAAOD,EAAQ,QAChDC,EAAG,SAAS,IAAMI,EAAM,OAAO,KAAK,GAAG,UAAY,EACnDJ,EAAG,SAAS,OAAUA,EAAG,SAAS,KAAOD,EAAQ,aAAiBC,EAAG,SAAS,KAAOD,EAAQ,YAC7FC,EAAG,WAAW,MAAMgB,EAAAZ,EAAM,OAAO,KAAK,GAAG,YAArB,YAAAY,EAAgC,SAAU,EAC9DhB,EAAG,WAAW,OAASA,EAAG,WAAW,IAAM,EAC3CA,EAAG,IAAI,IAAMI,EAAM,OAAO,KAAK,GAAG,KAAO,EACzCJ,EAAG,IAAI,OAASA,EAAG,IAAI,IAAM,EAC7BA,EAAG,OAAO,IAAMI,EAAM,OAAO,KAAK,GAAG,aAAe,EACpDJ,EAAG,OAAO,OAASA,EAAG,OAAO,KAAOD,EAAQ,aAC9C,CAIA,OAFAC,EAAG,QAAQ,OAASA,EAAG,UAAU,KAAOD,EAAQ,QAChDmB,EAAoB,EAChBjB,EAAM,GAAK,CAACD,EAAG,QAAQ,QACzBK,EAAI,MAAM,MAAM,EACTD,EAAM,OAAO,KAAK,KAE3BJ,EAAG,UAAU,IAAM,KAAK,MAAMI,EAAM,IAAI,EAAIG,CAAS,EAC9C,IAAI,QAASO,GAAY,CAC9B,WAAW,SAAY,CACrB,MAAMU,EAAe,EACrBV,EAAQV,EAAM,OAAO,KAAK,EAAE,CAC9B,EAAG,EAAE,CACP,CAAC,EACH,CAEA,eAAewB,GAAc,CA1N7B,IAAAZ,EAAAa,EAAAC,EAAAC,EA2NE,GAAI1B,EAAI,KAAK,MAAM,OAAS,EAAG,CAC7B,IAAM2B,GAAQhB,EAAAX,EAAI,OAAO,WAAW,IAAI,IAA1B,YAAAW,EAA6B,aAAa,EAAG,EAAGX,EAAI,OAAO,MAAOA,EAAI,OAAO,QACrF4B,EAAM,CAAE,GAAI,EAAG,KAAM5B,EAAI,KAAK,MAAO,YAAYwB,EAAA3B,EAAQ,OAAR,YAAA2B,EAAc,UAAuB,MAAAG,CAAM,EAClG,MAAcE,EAAKD,CAAG,EACtBzB,EAAI,qBAAsByB,EAAI,KAAM,sBAAsBF,GAAAD,EAAA5B,EAAQ,OAAR,YAAA4B,EAAc,YAAd,YAAAC,EAAyB,MAAM,EACzFvB,EAAI,sBAAuB,MAAc2B,EAAM,CAAC,CAClD,MACE3B,EAAI,cAAc,CAEtB,CAEA,eAAe4B,GAAe,CACxBlC,EAAQ,QAAUA,EAAQ,OAAO,GAAK,GACxC,MAAcmC,EAAOnC,EAAQ,MAAM,CAEvC,CAEA,eAAeoC,GAAa,CA5O5B,IAAAtB,EAAAa,EAAAC,EAAAC,EA+OE,GAFA1B,EAAI,OAAO,MAAM,OAAS,IAC1BW,EAAAX,EAAI,OAAO,WAAW,IAAI,IAA1B,MAAAW,EAA6B,UAAU,EAAG,EAAGjB,EAAQ,QAASA,EAAQ,SAClE,GAAC8B,EAAA3B,GAAA,YAAAA,EAAS,OAAT,MAAA2B,EAAe,SAAU,GAACC,EAAA5B,GAAA,YAAAA,EAAS,OAAT,MAAA4B,EAAe,WAAW,MAAO,GAIhE,GAHA,QAAQ,IAAI,eAAgB5B,EAAQ,IAAI,EACxCM,EAAI,kBAAkBN,EAAQ,KAAK,UAAUA,EAAQ,KAAK,KAAO,eAAe,KAAOA,EAAQ,KAAK,UAAY,QAAQ,KAAK,MAAM,KAAOA,EAAQ,KAAK,UAAY,GAAK,IAAI,KAAK,EACjL,MAAME,EAAM,GAAG,QAAQ,SAASF,EAAQ,KAAK,OAAQG,EAAI,MAAM,EAC3D,MAAc8B,EAAM,IAAM,EAC5B,OAAA3B,EAAI,sDAAsD,EAC1D,SAAS,KAAK,MAAM,WAAa,QACjCH,EAAI,OAAO,MAAM,QAAU,OACpB,GAET,IAAMkC,EAAK,MAAcC,EAAK,EACxBC,EAAcF,EAAG,IAAKN,GAAQA,EAAI,UAAU,EAAE,OAAQS,GAASA,EAAK,OAAS,CAAC,EAC9EC,EAAMvC,EAAM,MAAM,KAAKF,EAAQ,KAAK,UAAWuC,EAAa3C,CAAY,EAC9E,OAAAI,EAAQ,OAASqC,EAAGI,EAAI,QAAU,KAC9BzC,EAAQ,SACVM,EAAI,eAAeN,EAAQ,OAAO,cAAcA,EAAQ,OAAO,oBAAoB,KAAK,MAAM,IAAOyC,EAAI,UAAU,EAAI,KAAK,EAC5HtC,EAAI,KAAK,MAAQH,EAAQ,OAAO,KAChCG,EAAI,OAAO,MAAM,QAAU,IAC3B0B,EAAA1B,EAAI,OAAO,WAAW,IAAI,IAA1B,MAAA0B,EAA6B,aAAa7B,EAAQ,OAAO,MAAO,EAAG,IAErE,SAAS,KAAK,MAAM,WAAayC,EAAI,WAAa5C,EAAQ,UAAY,YAAc,SAC7E4C,EAAI,WAAa5C,EAAQ,SAClC,CAEA,eAAe6C,GAAO,CAvQtB,IAAA5B,EAAAa,EAAAC,EAAAC,EAoSE,OA5BA/B,EAAG,UAAU,OAAS,GACtBA,EAAG,eAAe,OAAS,GAC3BA,EAAG,aAAa,OAAS,GACzBA,EAAG,cAAc,OAAS,GAC1BA,EAAG,SAAS,OAAS,GACrBA,EAAG,eAAe,OAAS,GAC3BA,EAAG,cAAc,OAAS,GAC1BA,EAAG,IAAI,OAAS,GAChBA,EAAG,OAAO,OAAS,GACnBA,EAAG,UAAU,IAAM,EACnBK,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,OAAO,MAAM,QAAU,OAC3BA,EAAI,OAAO,MAAM,OAAS,MAC1B,SAAS,KAAK,MAAM,WAAa,QACjC,MAAMK,EAAO,EACb,MAAMK,EAAc,EACpBR,EAAYH,EAAM,IAAI,EACtBF,EAAQ,KAAO,MAAMsB,EAAe,EACpCnB,EAAI,OAAO,QAAQwB,GAAAb,EAAAd,EAAQ,OAAR,YAAAc,EAAc,SAAd,YAAAa,EAAsB,MAAM,KAAM9B,EAAQ,QAC7DM,EAAI,OAAO,SAAS0B,GAAAD,EAAA5B,EAAQ,OAAR,YAAA4B,EAAc,SAAd,YAAAC,EAAsB,MAAM,KAAMhC,EAAQ,QAC9DM,EAAI,OAAO,MAAQA,EAAI,OAAO,MAC9BA,EAAI,OAAO,OAASA,EAAI,OAAO,OAC/BA,EAAI,OAAO,MAAM,MAAQ,GACzBA,EAAI,MAAM,MAAM,QAAU,OAC1BA,EAAI,KAAK,MAAM,QAAU,OACzBA,EAAI,OAAO,MAAM,QAAU,OAC3BA,EAAI,MAAM,MAAM,QAAU,QACrBJ,EAAM,EAIJqC,EAAW,GAHhB9B,EAAI,yBAAyB,EACtB,GAGX,CAEA,eAAeqC,GAAO,CA3StB,IAAA7B,EAAAa,EA4SErB,EAAI,iBAAkBJ,EAAM,QAAS,kBAAmBA,EAAM,GAAG,QAAQ,YAAY,EACrFI,EAAI,WAAY,KAAK,UAAUT,CAAO,EAAE,QAAQ,eAAgB,EAAE,EAAE,QAAQ,KAAM,GAAG,CAAC,EACtFS,EAAI,wBAAwB,EAC5B,MAAME,EAAO,EACbF,EAAI,yBAAyB,EAC7B,MAAMJ,EAAM,KAAK,EACjBI,EAAI,uBAAuB,EAC3BA,EAAI,wBAAyBX,EAAY,KAAK,YAAY,QAAU,UAAY,IAAImB,EAAAnB,EAAY,KAAK,gBAAjB,MAAAmB,EAAmC,QAAU,gBAAkB,IAAIa,EAAAhC,EAAY,KAAK,cAAjB,MAAAgC,EAAiC,QAAU,cAAgB,EAAE,EACpNrB,EAAI,0BAA0B,EAC9BA,EAAI,sBAAuB,MAAc2B,EAAM,CAAC,EAChD9B,EAAI,MAAM,iBAAiB,QAASuC,CAAI,EACxCvC,EAAI,KAAK,iBAAiB,QAASuB,CAAW,EAC9CvB,EAAI,OAAO,iBAAiB,QAAS+B,CAAY,EACjD,MAAMhC,EAAM,OAAO,EACnB,MAAMwC,EAAK,CACb,CAEA,OAAO,OAASC", "names": ["H", "db", "database", "table", "log", "msg", "open", "resolve", "request", "evt", "load", "faceDB", "cursor", "count", "store", "save", "faceRecord", "newRecord", "remove", "humanConfig", "matchOptions", "options", "ok", "allOk", "current", "blink", "human", "dom", "timestamp", "startTime", "log", "msg", "webCam", "cameraOptions", "stream", "ready", "resolve", "detectionLoop", "_a", "now", "drawValidationTests", "y", "key", "val", "el", "status", "validationLoop", "interpolated", "gestures", "gesture", "saveRecords", "_b", "_c", "_d", "image", "rec", "save", "count", "deleteRecord", "remove", "detectFace", "db", "load", "descriptors", "desc", "res", "main", "init"] } diff --git a/demo/faceid/index.ts b/demo/faceid/index.ts index 522e3a9a..d460ecf2 100644 --- a/demo/faceid/index.ts +++ b/demo/faceid/index.ts @@ -17,7 +17,7 @@ const humanConfig = { // user configuration for human, used to fine-tune behavio debug: true, face: { enabled: true, - detector: { rotation: true, return: true, cropFactor: 1.6, mask: false }, // return tensor is used to get detected face image + detector: { rotation: true, return: true, mask: false }, // return tensor is used to get detected face image description: { enabled: true }, // default model for face descriptor extraction is faceres // mobilefacenet: { enabled: true, modelPath: 'https://vladmandic.github.io/human-models/models/mobilefacenet.json' }, // alternative model // insightface: { enabled: true, modelPath: 'https://vladmandic.github.io/insightface/models/insightface-mobilenet-swish.json' }, // alternative model @@ -46,7 +46,6 @@ const options = { distanceMax: 1.0, // farthest that face is allowed to be to the cammera in cm mask: humanConfig.face.detector.mask, rotation: humanConfig.face.detector.rotation, - cropFactor: humanConfig.face.detector.cropFactor, ...matchOptions, }; diff --git a/dist/human.esm-nobundle.js b/dist/human.esm-nobundle.js index 6ab16362..5482a91f 100644 --- a/dist/human.esm-nobundle.js +++ b/dist/human.esm-nobundle.js @@ -96,8 +96,8 @@ var st=Object.defineProperty;var Zn=Object.getOwnPropertyDescriptor;var Xn=Objec c31 * m[6] + c32 * m[7] + c33 * m[8]; gl_FragColor.a = c22.a; } -`;var at=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(s,A)=>(n[A]=0,s))},it=class{constructor(t,n,o){E(this,"uniform",{});E(this,"attribute",{});E(this,"gl");E(this,"id");E(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(h(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(h("filter: could not create shader"),null)});this.gl=t;let s=this.compile(n,this.gl.VERTEX_SHADER),A=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!s||!A)){if(!this.id){h("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,s),this.gl.attachShader(this.id,A),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){h(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),at(n,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);at(n,"uniform",this.uniform),at(o,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function K5(){let e=0,t=null,n=!1,o=-1,s=[null,null],A=[],a=null,i=null,c=L0(100,100),x={},y={INTERMEDIATE:1},l=c.getContext("webgl");if(!l){h("filter: cannot get webgl context");return}this.gl=l;function f(v,p){if(!(v===c.width&&p===c.height)){if(c.width=v,c.height=p,!a){let b=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);a=l.createBuffer(),l.bindBuffer(l.ARRAY_BUFFER,a),l.bufferData(l.ARRAY_BUFFER,b,l.STATIC_DRAW),l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}l.viewport(0,0,c.width,c.height),s=[null,null]}}function d(v,p){let b=l.createFramebuffer();l.bindFramebuffer(l.FRAMEBUFFER,b);let j=l.createRenderbuffer();l.bindRenderbuffer(l.RENDERBUFFER,j);let k=l.createTexture();return l.bindTexture(l.TEXTURE_2D,k),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,v,p,0,l.RGBA,l.UNSIGNED_BYTE,null),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,l.TEXTURE_2D,k,0),l.bindTexture(l.TEXTURE_2D,null),l.bindFramebuffer(l.FRAMEBUFFER,null),{fbo:b,texture:k}}function u(v){return s[v]=s[v]||d(c.width,c.height),s[v]}function m(v=0){if(!i)return;let p=null,b=null,j=!1;e===0?p=t:p=u(o).texture||null,e++,n&&!(v&y.INTERMEDIATE)?(b=null,j=e%2===0):(o=(o+1)%2,b=u(o).fbo||null),l.bindTexture(l.TEXTURE_2D,p),l.bindFramebuffer(l.FRAMEBUFFER,b),l.uniform1f(i.uniform.flipY,j?-1:1),l.drawArrays(l.TRIANGLES,0,6)}function g(v){if(x[v])return i=x[v],l.useProgram((i?i.id:null)||null),i;if(i=new it(l,V5,v),!i)return h("filter: could not get webgl program"),null;let p=Float32Array.BYTES_PER_ELEMENT,b=4*p;return l.enableVertexAttribArray(i.attribute.pos),l.vertexAttribPointer(i.attribute.pos,2,l.FLOAT,!1,b,0*p),l.enableVertexAttribArray(i.attribute.uv),l.vertexAttribPointer(i.attribute.uv,2,l.FLOAT,!1,b,2*p),x[v]=i,i}let P={colorMatrix:v=>{let p=new Float32Array(v);p[4]/=255,p[9]/=255,p[14]/=255,p[19]/=255;let b=p[18]===1&&p[3]===0&&p[8]===0&&p[13]===0&&p[15]===0&&p[16]===0&&p[17]===0&&p[19]===0?X5:Z5,j=g(b);!j||(l.uniform1fv(j.uniform.m,p),m())},brightness:v=>{let p=(v||0)+1;P.colorMatrix([p,0,0,0,0,0,p,0,0,0,0,0,p,0,0,0,0,0,1,0])},saturation:v=>{let p=(v||0)*2/3+1,b=(p-1)*-.5;P.colorMatrix([p,b,b,0,0,b,p,b,0,0,b,b,p,0,0,0,0,0,1,0])},desaturate:()=>{P.saturation(-1)},contrast:v=>{let p=(v||0)+1,b=-128*(p-1);P.colorMatrix([p,0,0,0,b,0,p,0,0,b,0,0,p,0,b,0,0,0,1,0])},negative:()=>{P.contrast(-2)},hue:v=>{v=(v||0)/180*Math.PI;let p=Math.cos(v),b=Math.sin(v),j=.213,k=.715,N=.072;P.colorMatrix([j+p*(1-j)+b*-j,k+p*-k+b*-k,N+p*-N+b*(1-N),0,0,j+p*-j+b*.143,k+p*(1-k)+b*.14,N+p*-N+b*-.283,0,0,j+p*-j+b*-(1-j),k+p*-k+b*k,N+p*(1-N)+b*N,0,0,0,0,0,1,0])},desaturateLuminance:()=>{P.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{P.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{P.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{P.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{P.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{P.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{P.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{P.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:v=>{let p=new Float32Array(v),b=1/c.width,j=1/c.height,k=g(Y5);!k||(l.uniform1fv(k.uniform.m,p),l.uniform2f(k.uniform.px,b,j),m())},detectEdges:()=>{P.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{P.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{P.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:v=>{let p=v||1;P.convolution.call(this,[0,-1*p,0,-1*p,1+4*p,-1*p,0,-1*p,0])},emboss:v=>{let p=v||1;P.convolution.call(this,[-2*p,-1*p,0,-1*p,1,1*p,0,1*p,2*p])},blur:v=>{let p=v/7/c.width,b=v/7/c.height,j=g(U5);!j||(l.uniform2f(j.uniform.px,0,b),m(y.INTERMEDIATE),l.uniform2f(j.uniform.px,p,0),m())},pixelate:v=>{let p=v/c.width,b=v/c.height,j=g(q5);!j||(l.uniform2f(j.uniform.size,p,b),m())}};this.add=function(v){let p=Array.prototype.slice.call(arguments,1),b=P[v];A.push({func:b,args:p})},this.reset=function(){A=[]},this.get=function(){return A},this.apply=function(v){f(v.width,v.height),e=0,t||(t=l.createTexture()),l.bindTexture(l.TEXTURE_2D,t),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.NEAREST),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.NEAREST),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,l.RGBA,l.UNSIGNED_BYTE,v);for(let p=0;py.data())),a=Math.max(A[0][0],A[1][0],A[2][0]),c=(a>1?255:1)/a,x;if(c>1){let y=[r.sub(n[0],o[0]),r.sub(n[1],o[1]),r.sub(n[2],o[2])],l=[r.sub(s[0],o[0]),r.sub(s[1],o[1]),r.sub(s[2],o[2])],f=[r.mul(y[0],c),r.mul(y[1],c),r.mul(y[2],c)],d=r.stack([f[0],f[1],f[2]],2);x=r.reshape(d,[1,t.shape[0]||0,t.shape[1]||0,3]),r.dispose([...y,...l,...f])}else x=r.expandDims(t,0);return r.dispose([...n,...o,...s,n,t,e]),x}var x2=3840,l0=null,c0=null,Oe=null,X,z0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function lt(){z0.inputSum=0,z0.cacheDiff=1,z0.sumMethod=0,z0.inputTensor=void 0}function L0(e,t){let n;if(M.browser)if(M.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof M.Canvas!="undefined"?n=new M.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function d2(e,t){let n=t||L0(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function y2(e,t,n=!0){var f,d,u;if(!e)return t.debug&&h("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof r.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type not recognized");if(e instanceof r.Tensor){let m=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)m=r.expandDims(e,0);else if(e.shape[2]===4){let g=r.slice3d(e,[0,0,0],[-1,-1,3]);m=r.expandDims(g,0),r.dispose(g)}}else e.shape.length===4&&(e.shape[3]===3?m=r.clone(e):e.shape[3]===4&&(m=r.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(m==null||m.shape.length!==4||m.shape[0]!==1||m.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(m.dtype==="int32"){let g=r.cast(m,"float32");r.dispose(m),m=g}return{tensor:m,canvas:t.filter.return?c0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&h("input stream is not ready"),{tensor:null,canvas:l0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,s=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!s)return t.debug&&h("cannot determine input dimensions"),{tensor:null,canvas:l0};let A=o,a=s;if(A>x2&&(A=x2,a=Math.trunc(A*s/o)),a>x2&&(a=x2,A=Math.trunc(a*o/s)),(((f=t.filter)==null?void 0:f.width)||0)>0?A=t.filter.width:(((d=t.filter)==null?void 0:d.height)||0)>0&&(A=o*((t.filter.height||0)/s)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=s*((t.filter.width||0)/o)),!A||!a)throw new Error("input error: cannot determine dimension");(!l0||l0.width!==A||l0.height!==a)&&(l0=L0(A,a));let i=l0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(o,0),i.scale(-1,1),i.drawImage(e,0,0,o,s,0,0,l0.width,l0.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,o,s,0,0,l0.width,l0.height),(!c0||l0.width!==c0.width||l0.height!==c0.height)&&(c0=L0(l0.width,l0.height)),t.filter.enabled&&M.webgl.supported?(X||(X=M.browser?new K5:null),M.filter=!!X,X!=null&&X.add?(X.reset(),t.filter.brightness!==0&&X.add("brightness",t.filter.brightness),t.filter.contrast!==0&&X.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&X.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&X.add("blur",t.filter.blur),t.filter.saturation!==0&&X.add("saturation",t.filter.saturation),t.filter.hue!==0&&X.add("hue",t.filter.hue),t.filter.negative&&X.add("negative"),t.filter.sepia&&X.add("sepia"),t.filter.vintage&&X.add("brownie"),t.filter.sepia&&X.add("sepia"),t.filter.kodachrome&&X.add("kodachrome"),t.filter.technicolor&&X.add("technicolor"),t.filter.polaroid&&X.add("polaroid"),t.filter.pixelate!==0&&X.add("pixelate",t.filter.pixelate),((u=X.get())==null?void 0:u.length)>1?c0=X.apply(l0):c0=X.draw(l0)):(t.debug&&h("input process error: cannot initialize filters"),M.webgl.supported=!1,t.filter.enabled=!1,d2(l0,c0))):(d2(l0,c0),X&&(X=null),M.filter=!!X),!n)return{tensor:null,canvas:c0};if(!c0)throw new Error("canvas error: cannot create output");let c,x=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(M.browser&&r.browser)c=r.browser?r.browser.fromPixels(e):null;else{x=e.data.length/e.height/e.width;let m=new Uint8Array(e.data.buffer);c=r.tensor(m,[e.height,e.width,x],"int32")}else if((!Oe||c0.width!==Oe.width||c0.height!==Oe.height)&&(Oe=L0(c0.width,c0.height)),r.browser&&M.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?c=r.browser.fromPixels(c0):(Oe=d2(c0),c=r.browser.fromPixels(Oe));else{let P=d2(c0).getContext("2d").getImageData(0,0,A,a);x=P.data.length/A/a;let v=new Uint8Array(P.data.buffer);c=r.tensor(v,[A,a,x])}if(x===4){let m=r.slice3d(c,[0,0,0],[-1,-1,3]);r.dispose(c),c=m}if(!c)throw new Error("input error: cannot create tensor");let y=r.cast(c,"float32"),l=t.filter.equalization?await c2(y):r.expandDims(y,0);if(r.dispose([c,y]),t.filter.autoBrightness){let m=r.max(l),g=await m.data();t.filter.brightness=g[0]>1?1-g[0]/255:1-g[0],r.dispose(m)}return{tensor:l,canvas:t.filter.return?c0:null}}async function J5(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!z0.inputTensor)z0.inputTensor=r.clone(t);else if(z0.inputTensor.shape[1]!==t.shape[1]||z0.inputTensor.shape[2]!==t.shape[2])r.dispose(z0.inputTensor),z0.inputTensor=r.clone(t);else{let o={};o.diff=r.sub(t,z0.inputTensor),o.squared=r.mul(o.diff,o.diff),o.sum=r.sum(o.squared);let A=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;r.dispose([z0.inputTensor,o.diff,o.squared,o.sum]),z0.inputTensor=r.clone(t),n=A<=(e.cacheSensitivity||0)}return n}async function Q5(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||h("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||h("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=r.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?r.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):r.clone(n),o.diff=r.sub(o.input1,o.input2),o.squared=r.mul(o.diff,o.diff),o.sum=r.sum(o.squared);let A=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return r.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),A}var Je,Qe,_e,m2=class{constructor(){E(this,"browser");E(this,"node");E(this,"worker");E(this,"platform","");E(this,"agent","");E(this,"backends",[]);E(this,"initial");E(this,"filter");E(this,"tfjs");E(this,"offscreen");E(this,"perfadd",!1);E(this,"tensorflow",{version:void 0,gpu:void 0});E(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});E(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});E(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});E(this,"cpu",{model:void 0,flags:[]});E(this,"kernels",[]);Z0(this,Je,void 0);Z0(this,Qe,void 0);Z0(this,_e,void 0);if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:Ke["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}get Canvas(){return v0(this,Je)}set Canvas(t){Y0(this,Je,t),globalThis.Canvas=t}get Image(){return v0(this,Qe)}set Image(t){Y0(this,Qe,t),globalThis.Image=t}get ImageData(){return v0(this,_e)}set ImageData(t){Y0(this,_e,t),globalThis.ImageData=t}async updateBackend(){this.backends=Object.keys(r.engine().registryFactory);try{this.tensorflow={version:r.backend().binding?r.backend().binding.TF_Version:void 0,gpu:r.backend().binding?r.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=L0(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=r.getKernelsForBackend(r.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}};Je=new WeakMap,Qe=new WeakMap,_e=new WeakMap;var M=new m2;var p2=class{constructor(){E(this,"config");E(this,"element");E(this,"stream");E(this,"devices",[]);E(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});E(this,"start",async t=>{var s,A;if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let a=document.getElementById(t.element);if(a&&a instanceof HTMLVideoElement)this.element=a;else{this.config.debug&&h("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&h("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none"}};if(((s=this.config)==null?void 0:s.width)>0&&(n.video.width={ideal:this.config.width}),((A=this.config)==null?void 0:A.height)>0&&(n.video.height={ideal:this.config.height}),this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&h("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&h("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&h("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(a){h("webcam",a);return}if(!this.stream){this.config.debug&&h("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(a=>{this.element?this.element.onloadeddata=()=>a(!0):a(!1)}),await this.element.play(),this.config.debug&&h("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});E(this,"pause",()=>{this.element&&this.element.pause()});E(this,"play",async()=>{this.element&&await this.element.play()});E(this,"stop",()=>{this.config.debug&&h("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var ct={};oe(ct,{age:()=>mo,"anti-spoofing":()=>Xo,antispoof:()=>no,blazeface:()=>oo,"blazeface-back":()=>po,"blazeface-front":()=>uo,"blazepose-detector":()=>ho,"blazepose-full":()=>bo,"blazepose-heavy":()=>go,"blazepose-lite":()=>To,centernet:()=>ro,default:()=>rr,efficientpose:()=>vo,"efficientpose-i-lite":()=>qo,"efficientpose-ii-lite":()=>Uo,"efficientpose-iv":()=>Yo,emotion:()=>so,faceboxes:()=>Ro,facemesh:()=>Ao,"facemesh-attention":()=>Po,"facemesh-attention-pinto":()=>Mo,"facemesh-detection-full":()=>ko,"facemesh-detection-short":()=>wo,faceres:()=>ao,"faceres-deep":()=>Eo,gear:()=>zo,gender:()=>jo,"gender-ssrnet-imdb":()=>So,handdetect:()=>Io,"handlandmark-full":()=>No,"handlandmark-lite":()=>io,"handlandmark-sparse":()=>Lo,handskeleton:()=>Oo,handtrack:()=>lo,"insightface-efficientnet-b0":()=>Ko,"insightface-ghostnet-strides1":()=>Jo,"insightface-ghostnet-strides2":()=>Qo,"insightface-mobilenet-emore":()=>_o,"insightface-mobilenet-swish":()=>$o,iris:()=>co,liveness:()=>xo,meet:()=>Co,mobileface:()=>Wo,mobilefacenet:()=>Do,models:()=>yo,"movenet-lightning":()=>fo,"movenet-multipose":()=>Fo,"movenet-thunder":()=>Bo,nanodet:()=>Ho,"nanodet-e":()=>er,"nanodet-g":()=>tr,"nanodet-m":()=>nr,"nanodet-t":()=>or,posenet:()=>Go,rvm:()=>Vo,selfie:()=>Zo});var no=853098,oo=538928,ro=4030290,so=820516,Ao=1477958,ao=6978814,io=2023432,lo=2964837,co=2599092,xo=592976,yo=0,fo=4650216,mo=161240,po=538928,uo=402048,ho=5928856,bo=6339202,go=27502466,To=2726402,vo=5651240,Ro=2013002,Mo=2387598,Po=2382414,ko=1026192,wo=201268,Eo=13957620,zo=1498916,So=161236,jo=201808,Io=3515612,No=5431368,Lo=5286322,Oo=5502280,Co=372228,Wo=2183192,Do=5171976,Fo=9448838,Bo=12477112,Ho=7574558,Go=5032780,Vo=3739355,Zo=212886,Xo=853098,qo=2269064,Uo=5651240,Yo=25643252,Ko=13013224,Jo=8093408,Qo=8049584,_o=6938536,$o=12168584,er=12319156,tr=7574558,nr=1887474,or=5294216,rr={antispoof:no,blazeface:oo,centernet:ro,emotion:so,facemesh:Ao,faceres:ao,"handlandmark-lite":io,handtrack:lo,iris:co,liveness:xo,models:yo,"movenet-lightning":fo,age:mo,"blazeface-back":po,"blazeface-front":uo,"blazepose-detector":ho,"blazepose-full":bo,"blazepose-heavy":go,"blazepose-lite":To,efficientpose:vo,faceboxes:Ro,"facemesh-attention-pinto":Mo,"facemesh-attention":Po,"facemesh-detection-full":ko,"facemesh-detection-short":wo,"faceres-deep":Eo,gear:zo,"gender-ssrnet-imdb":So,gender:jo,handdetect:Io,"handlandmark-full":No,"handlandmark-sparse":Lo,handskeleton:Oo,meet:Co,mobileface:Wo,mobilefacenet:Do,"movenet-multipose":Fo,"movenet-thunder":Bo,nanodet:Ho,posenet:Go,rvm:Vo,selfie:Zo,"anti-spoofing":Xo,"efficientpose-i-lite":qo,"efficientpose-ii-lite":Uo,"efficientpose-iv":Yo,"insightface-efficientnet-b0":Ko,"insightface-ghostnet-strides1":Jo,"insightface-ghostnet-strides2":Qo,"insightface-mobilenet-emore":_o,"insightface-mobilenet-swish":$o,"nanodet-e":er,"nanodet-g":tr,"nanodet-m":nr,"nanodet-t":or};var u0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},y0={};async function sr(e,t){return u0.debug&&h("load model fetch:",e,t),fetch(e,t)}function _5(e){u0.cacheModels=e.cacheModels,u0.verbose=e.debug,u0.modelBasePath=e.modelBasePath}async function L(e){var x,y,l,f;let t=G5(u0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),s="indexeddb://"+o;y0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:ct[o],inCache:!1,url:""},u0.cacheSupported=typeof indexedDB!="undefined";let A={};try{A=u0.cacheSupported&&u0.cacheModels?await r.io.listModels():{}}catch(d){u0.cacheSupported=!1}y0[o].inCache=u0.cacheSupported&&u0.cacheModels&&Object.keys(A).includes(s),y0[o].url=y0[o].inCache?s:t;let a=typeof fetch=="undefined"?{}:{fetchFunc:(d,u)=>sr(d,u)},i=new r.GraphModel(y0[o].url,a),c=!1;try{i.findIOHandler(),u0.debug&&h("model load handler:",i.handler)}catch(d){h("error finding model i/o handler:",t,d)}try{let d=await((x=i.handler)==null?void 0:x.load())||null;y0[o].sizeFromManifest=((y=d==null?void 0:d.weightData)==null?void 0:y.byteLength)||0,d?i.loadSync(d):i=await r.loadGraphModel(y0[o].inCache?s:t,a),y0[o].sizeLoadedWeights=((f=(l=i.artifacts)==null?void 0:l.weightData)==null?void 0:f.byteLength)||0,u0.verbose&&h("load:",{model:o,url:i.modelUrl,bytes:y0[o].sizeLoadedWeights}),c=!0}catch(d){h("error loading model:",t,d)}if(c&&u0.cacheModels&&u0.cacheSupported&&!y0[o].inCache)try{let d=await i.save(s);u0.debug&&h("model saved:",s,d)}catch(d){h("error saving model:",t,d)}return i}var xt="3.0.1";var Y={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function ir(){let e=Y.gl;!e||(Y.extensions=e.getSupportedExtensions())}function $5(e){var t;if(e.config.backend==="humangl"&&(Y.name in r.engine().registry&&!((t=Y==null?void 0:Y.gl)!=null&&t.getParameter(Y.gl.VERSION))&&(h("humangl error: backend invalid context"),e.models.reset()),!r.findBackend(Y.name))){try{Y.canvas=L0(100,100)}catch(s){h("humangl error: cannot create canvas:",s);return}try{if(Y.gl=Y.canvas.getContext("webgl2",Y.webGLattr),!Y.gl){h("humangl error: cannot get webgl context");return}if(!Y.gl.getParameter(Y.gl.VERSION).includes("2.0")){h("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}Y.canvas&&(Y.canvas.addEventListener("webglcontextlost",A=>{throw h("humangl error:",A.type),h("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),Y.canvas.addEventListener("webglcontextrestored",A=>{h("humangl error: context restored:",A)}),Y.canvas.addEventListener("webglcontextcreationerror",A=>{h("humangl error: context create:",A)}))}catch(s){h("humangl error: cannot get webgl context:",s);return}try{r.setWebGLContext(2,Y.gl)}catch(s){h("humangl error: cannot set webgl context:",s);return}try{let s=new r.GPGPUContext(Y.gl);r.registerBackend(Y.name,()=>new r.MathBackendWebGL(s),Y.priority)}catch(s){h("humangl error: cannot register webgl backend:",s);return}try{r.getKernelsForBackend("webgl").forEach(A=>{let a={...A,backendName:Y.name};r.registerKernel(a)})}catch(s){h("humangl error: cannot update webgl backend registration:",s);return}try{r.env().flagRegistry.WEBGL_VERSION&&r.env().set("WEBGL_VERSION",2)}catch(s){h("humangl error: cannot set WebGL backend flags:",s);return}ir();let n=r.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&h("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):h("humangl error: no current gl context:",o,Y.gl)}}var O={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function e1(){O.tf255=r.scalar(255,"float32"),O.tf1=r.scalar(1,"float32"),O.tf2=r.scalar(2,"float32"),O.tf05=r.scalar(.5,"float32"),O.tf127=r.scalar(127.5,"float32"),O.rgb=r.tensor1d([.2989,.587,.114],"float32")}async function xr(){var e;return await M.updateBackend(),(e=M.tensorflow)!=null&&e.version?"tensorflow":M.webgpu.supported&&M.webgpu.backend?"webgpu":M.webgl.supported&&M.webgl.backend?"webgl":M.wasm.supported&&M.wasm.backend?"wasm":"cpu"}function dr(e){let t=[];if(!M.kernels.includes("mod")){let n={kernelName:"Mod",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>r.sub(o.inputs.a,r.mul(r.div(o.inputs.a,o.inputs.b),o.inputs.b)))};r.registerKernel(n),M.kernels.push("mod"),t.push("mod")}if(!M.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>r.add(r.mul(r.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),r.mod(o.inputs.a,o.inputs.b)))};r.registerKernel(n),M.kernels.push("floormod"),t.push("floormod")}if(!M.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>{let s=r.getBackend();r.setBackend("cpu");let A=r.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return r.setBackend(s),A})};r.registerKernel(n),M.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&h("registered kernels:",t)}var t1={};async function $e(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await xr()),t||M.initial||e.config.backend&&e.config.backend.length>0&&r.getBackend()!==e.config.backend){let o=T();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&h("running inside web worker"),M.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&h("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),M.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&h(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),M.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")h("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let A=await navigator.gpu.requestAdapter();if(e.config.debug&&h("enumerated webgpu adapter:",A),!A)h("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let a="requestAdapterInfo"in A?await A.requestAdapterInfo():void 0;h("webgpu adapter info:",a)}}let s=Object.keys(r.engine().registryFactory);if(e.config.backend==="humangl"&&!s.includes("humangl")&&($5(e),s=Object.keys(r.engine().registryFactory)),e.config.debug&&h("available backends:",s),s.includes(e.config.backend)||(h(`error: backend ${e.config.backend} not found in registry`),e.config.backend=M.node?"tensorflow":"webgl",e.config.debug&&h(`override: setting backend ${e.config.backend}`)),e.config.debug&&h("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(r.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&r.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&h("wasm path:",e.config.wasmPath),typeof r.setWasmPaths!="undefined")r.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let A=!1,a=!1;try{A=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),a=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&h(`wasm execution: ${a?"simd":"no simd"} ${A?"multithreaded":"singlethreaded"}`),e.config.debug&&!a&&h("warning: wasm simd support is not enabled")}catch(i){h("wasm detection failed")}}try{await r.setBackend(e.config.backend),await r.ready()}catch(A){return h("error: cannot set backend:",e.config.backend,A),!1}e.config.debug&&(t1=JSON.parse(JSON.stringify(r.env().flags)))}if((r.getBackend()==="humangl"||r.getBackend()==="webgl")&&(r.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&r.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),r.env().flagRegistry.WEBGL_EXP_CONV&&r.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(h("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),r.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),r.getBackend(),e.config.debug){let s=r.env().flags,A={};for(let a of Object.keys(s))t1[a]!==s[a]&&(A[a]=s[a]);e.config.debug&&Object.keys(A).length>0&&h("backend:",r.getBackend(),"flags:",A)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&h("flags:",e.config.flags);for(let[s,A]of Object.entries(e.config.flags))r.env().set(s,A)}r.enableProdMode(),e1(),e.performance.initBackend=Math.trunc(T()-o),e.config.backend=r.getBackend(),await M.updateBackend(),dr(e.config),M.initial=!1}return!0}function u2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:s=>{var A;return t.debug&&h("kernelFunc",n,t.backend,s),(A=s==null?void 0:s.inputs)==null?void 0:A.info}};r.registerKernel(o)}M.kernels=r.getKernelsForBackend(r.getBackend()).map(n=>n.kernelName.toLowerCase())}var bt={};oe(bt,{all:()=>Vr,body:()=>b2,canvas:()=>Gr,face:()=>h2,gesture:()=>v2,hand:()=>g2,init:()=>ht,object:()=>T2,options:()=>e0,person:()=>Hr});var S0=e=>{if(!e)h("draw error: invalid canvas");else if(!e.getContext)h("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)h("draw error: cannot get canvas context");else return t}return null},be=e=>Math.round(e*180/Math.PI),V=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),ge=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function O0(e,t,n,o,s){let A=t.replace(/\[.*\]/g,"").split(` -`).map(i=>i.trim()),a=Math.max(0,n);for(let i=A.length-1;i>=0;i--){let c=i*s.lineHeight+o;s.shadowColor&&s.shadowColor!==""&&(e.fillStyle=s.shadowColor,e.fillText(A[i],a+5,c+16)),e.fillStyle=s.labelColor,e.fillText(A[i],a+4,c+15)}}function K0(e,t,n,o,s){e.fillStyle=ge(o,s),e.beginPath(),e.arc(t,n,s.pointSize,0,2*Math.PI),e.fill()}function X0(e,t,n,o,s,A){if(e.beginPath(),e.lineWidth=A.lineWidth,A.useCurves){let a=(t+t+o)/2,i=(n+n+s)/2;e.ellipse(a,i,o/2,s/2,0,0,2*Math.PI)}else e.moveTo(t+A.roundRect,n),e.lineTo(t+o-A.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+A.roundRect),e.lineTo(t+o,n+s-A.roundRect),e.quadraticCurveTo(t+o,n+s,t+o-A.roundRect,n+s),e.lineTo(t+A.roundRect,n+s),e.quadraticCurveTo(t,n+s,t,n+s-A.roundRect),e.lineTo(t,n+A.roundRect),e.quadraticCurveTo(t,n,t+A.roundRect,n),e.closePath();e.stroke()}function dt(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=ge(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function o1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){dt(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oe2[e]),HA=fr.map(e=>e2[e]),GA=mr.map(e=>e2[e]);function re(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var pr=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ur=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],hr=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],br=[[474,475],[475,476],[476,477],[477,474]],gr=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],Tr=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],vr=[[469,470],[470,471],[471,472],[472,469]],Rr=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],VA={lips:re(pr),leftEye:re(ur),leftEyebrow:re(hr),leftIris:re(br),rightEye:re(gr),rightEyebrow:re(Tr),rightIris:re(vr),faceOval:re(Rr)};var Mr=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Pr=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],kr=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],wr=[[474,475],[475,476],[476,477],[477,474]],Er=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],zr=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Sr=[[469,470],[470,471],[471,472],[472,469]],jr=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function se(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Ir={lips:se(Mr),leftEye:se(Pr),leftEyebrow:se(kr),leftIris:se(wr),rightEye:se(Er),rightEyebrow:se(zr),rightIris:se(Sr),faceOval:se(jr)},Nr=Object.entries(Ir).map(([e,t])=>t.map(n=>[n,e])).flat(),ZA=new Map(Nr),t2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],Re=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],Me=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var G;function Lr(e,t){var o,s,A,a,i,c,x,y,l;if(!G.drawLabels||((o=G.faceLabels)==null?void 0:o.length)===0)return;let n=G.faceLabels.slice();if(e.score&&(n=V(n,"[score]",100*e.score)),e.gender&&(n=V(n,"[gender]",e.gender)),e.genderScore&&(n=V(n,"[genderScore]",100*e.genderScore)),e.age&&(n=V(n,"[age]",e.age)),e.distance&&(n=V(n,"[distance]",100*e.distance)),e.real&&(n=V(n,"[real]",100*e.real)),e.live&&(n=V(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let f=e.emotion.map(d=>`${Math.trunc(100*d.score)}% ${d.emotion}`);f.length>3&&(f.length=3),n=V(n,"[emotions]",f.join(" "))}(A=(s=e.rotation)==null?void 0:s.angle)!=null&&A.roll&&(n=V(n,"[roll]",be(e.rotation.angle.roll))),(i=(a=e.rotation)==null?void 0:a.angle)!=null&&i.yaw&&(n=V(n,"[yaw]",be(e.rotation.angle.yaw))),(x=(c=e.rotation)==null?void 0:c.angle)!=null&&x.pitch&&(n=V(n,"[pitch]",be(e.rotation.angle.pitch))),(l=(y=e.rotation)==null?void 0:y.gaze)!=null&&l.bearing&&(n=V(n,"[gaze]",be(e.rotation.gaze.bearing))),O0(t,n,e.box[0],e.box[1],G)}function Or(e,t){var n,o,s,A;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=G.useDepth?"rgba(255, 200, 255, 0.3)":G.color,t.beginPath();let a=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,i=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],a,i,0,0,2*Math.PI),t.stroke(),G.fillPolygons&&(t.fillStyle=G.useDepth?"rgba(255, 255, 200, 0.3)":G.color,t.fill())}if(((s=e.annotations)==null?void 0:s.rightEyeIris)&&((A=e.annotations)==null?void 0:A.rightEyeIris[0])){t.strokeStyle=G.useDepth?"rgba(255, 200, 255, 0.3)":G.color,t.beginPath();let a=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,i=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],a,i,0,0,2*Math.PI),t.stroke(),G.fillPolygons&&(t.fillStyle=G.useDepth?"rgba(255, 255, 200, 0.3)":G.color,t.fill())}}function Cr(e,t){var n;if(G.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*be(e.rotation.angle.yaw)/90,s=e.box[1]+e.box[3]/2+e.box[2]*be(e.rotation.angle.pitch)/90,A=new Path2D(` +`;var at=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(s,A)=>(n[A]=0,s))},it=class{constructor(t,n,o){E(this,"uniform",{});E(this,"attribute",{});E(this,"gl");E(this,"id");E(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(h(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(h("filter: could not create shader"),null)});this.gl=t;let s=this.compile(n,this.gl.VERTEX_SHADER),A=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!s||!A)){if(!this.id){h("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,s),this.gl.attachShader(this.id,A),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){h(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),at(n,"attribute",this.attribute);for(let a in this.attribute)this.attribute[a]=this.gl.getAttribLocation(this.id,a);at(n,"uniform",this.uniform),at(o,"uniform",this.uniform);for(let a in this.uniform)this.uniform[a]=this.gl.getUniformLocation(this.id,a)}}};function K5(){let e=0,t=null,n=!1,o=-1,s=[null,null],A=[],a=null,i=null,c=L0(100,100),d={},y={INTERMEDIATE:1},l=c.getContext("webgl");if(!l){h("filter: cannot get webgl context");return}this.gl=l;function f(v,p){if(!(v===c.width&&p===c.height)){if(c.width=v,c.height=p,!a){let b=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);a=l.createBuffer(),l.bindBuffer(l.ARRAY_BUFFER,a),l.bufferData(l.ARRAY_BUFFER,b,l.STATIC_DRAW),l.pixelStorei(l.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}l.viewport(0,0,c.width,c.height),s=[null,null]}}function x(v,p){let b=l.createFramebuffer();l.bindFramebuffer(l.FRAMEBUFFER,b);let j=l.createRenderbuffer();l.bindRenderbuffer(l.RENDERBUFFER,j);let k=l.createTexture();return l.bindTexture(l.TEXTURE_2D,k),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,v,p,0,l.RGBA,l.UNSIGNED_BYTE,null),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.LINEAR),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.framebufferTexture2D(l.FRAMEBUFFER,l.COLOR_ATTACHMENT0,l.TEXTURE_2D,k,0),l.bindTexture(l.TEXTURE_2D,null),l.bindFramebuffer(l.FRAMEBUFFER,null),{fbo:b,texture:k}}function u(v){return s[v]=s[v]||x(c.width,c.height),s[v]}function m(v=0){if(!i)return;let p=null,b=null,j=!1;e===0?p=t:p=u(o).texture||null,e++,n&&!(v&y.INTERMEDIATE)?(b=null,j=e%2===0):(o=(o+1)%2,b=u(o).fbo||null),l.bindTexture(l.TEXTURE_2D,p),l.bindFramebuffer(l.FRAMEBUFFER,b),l.uniform1f(i.uniform.flipY,j?-1:1),l.drawArrays(l.TRIANGLES,0,6)}function g(v){if(d[v])return i=d[v],l.useProgram((i?i.id:null)||null),i;if(i=new it(l,V5,v),!i)return h("filter: could not get webgl program"),null;let p=Float32Array.BYTES_PER_ELEMENT,b=4*p;return l.enableVertexAttribArray(i.attribute.pos),l.vertexAttribPointer(i.attribute.pos,2,l.FLOAT,!1,b,0*p),l.enableVertexAttribArray(i.attribute.uv),l.vertexAttribPointer(i.attribute.uv,2,l.FLOAT,!1,b,2*p),d[v]=i,i}let P={colorMatrix:v=>{let p=new Float32Array(v);p[4]/=255,p[9]/=255,p[14]/=255,p[19]/=255;let b=p[18]===1&&p[3]===0&&p[8]===0&&p[13]===0&&p[15]===0&&p[16]===0&&p[17]===0&&p[19]===0?X5:Z5,j=g(b);!j||(l.uniform1fv(j.uniform.m,p),m())},brightness:v=>{let p=(v||0)+1;P.colorMatrix([p,0,0,0,0,0,p,0,0,0,0,0,p,0,0,0,0,0,1,0])},saturation:v=>{let p=(v||0)*2/3+1,b=(p-1)*-.5;P.colorMatrix([p,b,b,0,0,b,p,b,0,0,b,b,p,0,0,0,0,0,1,0])},desaturate:()=>{P.saturation(-1)},contrast:v=>{let p=(v||0)+1,b=-128*(p-1);P.colorMatrix([p,0,0,0,b,0,p,0,0,b,0,0,p,0,b,0,0,0,1,0])},negative:()=>{P.contrast(-2)},hue:v=>{v=(v||0)/180*Math.PI;let p=Math.cos(v),b=Math.sin(v),j=.213,k=.715,N=.072;P.colorMatrix([j+p*(1-j)+b*-j,k+p*-k+b*-k,N+p*-N+b*(1-N),0,0,j+p*-j+b*.143,k+p*(1-k)+b*.14,N+p*-N+b*-.283,0,0,j+p*-j+b*-(1-j),k+p*-k+b*k,N+p*(1-N)+b*N,0,0,0,0,0,1,0])},desaturateLuminance:()=>{P.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{P.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{P.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{P.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{P.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{P.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{P.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{P.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:v=>{let p=new Float32Array(v),b=1/c.width,j=1/c.height,k=g(Y5);!k||(l.uniform1fv(k.uniform.m,p),l.uniform2f(k.uniform.px,b,j),m())},detectEdges:()=>{P.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{P.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{P.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:v=>{let p=v||1;P.convolution.call(this,[0,-1*p,0,-1*p,1+4*p,-1*p,0,-1*p,0])},emboss:v=>{let p=v||1;P.convolution.call(this,[-2*p,-1*p,0,-1*p,1,1*p,0,1*p,2*p])},blur:v=>{let p=v/7/c.width,b=v/7/c.height,j=g(U5);!j||(l.uniform2f(j.uniform.px,0,b),m(y.INTERMEDIATE),l.uniform2f(j.uniform.px,p,0),m())},pixelate:v=>{let p=v/c.width,b=v/c.height,j=g(q5);!j||(l.uniform2f(j.uniform.size,p,b),m())}};this.add=function(v){let p=Array.prototype.slice.call(arguments,1),b=P[v];A.push({func:b,args:p})},this.reset=function(){A=[]},this.get=function(){return A},this.apply=function(v){f(v.width,v.height),e=0,t||(t=l.createTexture()),l.bindTexture(l.TEXTURE_2D,t),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_S,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_WRAP_T,l.CLAMP_TO_EDGE),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MIN_FILTER,l.NEAREST),l.texParameteri(l.TEXTURE_2D,l.TEXTURE_MAG_FILTER,l.NEAREST),l.texImage2D(l.TEXTURE_2D,0,l.RGBA,l.RGBA,l.UNSIGNED_BYTE,v);for(let p=0;py.data())),a=Math.max(A[0][0],A[1][0],A[2][0]),c=(a>1?255:1)/a,d;if(c>1){let y=[r.sub(n[0],o[0]),r.sub(n[1],o[1]),r.sub(n[2],o[2])],l=[r.sub(s[0],o[0]),r.sub(s[1],o[1]),r.sub(s[2],o[2])],f=[r.mul(y[0],c),r.mul(y[1],c),r.mul(y[2],c)],x=r.stack([f[0],f[1],f[2]],2);d=r.reshape(x,[1,t.shape[0]||0,t.shape[1]||0,3]),r.dispose([...y,...l,...f])}else d=r.expandDims(t,0);return r.dispose([...n,...o,...s,n,t,e]),d}var d2=3840,l0=null,c0=null,Oe=null,X,z0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function lt(){z0.inputSum=0,z0.cacheDiff=1,z0.sumMethod=0,z0.inputTensor=void 0}function L0(e,t){let n;if(M.browser)if(M.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof M.Canvas!="undefined"?n=new M.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function x2(e,t){let n=t||L0(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function y2(e,t,n=!0){var f,x,u;if(!e)return t.debug&&h("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof r.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type not recognized");if(e instanceof r.Tensor){let m=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)m=r.expandDims(e,0);else if(e.shape[2]===4){let g=r.slice3d(e,[0,0,0],[-1,-1,3]);m=r.expandDims(g,0),r.dispose(g)}}else e.shape.length===4&&(e.shape[3]===3?m=r.clone(e):e.shape[3]===4&&(m=r.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(m==null||m.shape.length!==4||m.shape[0]!==1||m.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(m.dtype==="int32"){let g=r.cast(m,"float32");r.dispose(m),m=g}return{tensor:m,canvas:t.filter.return?c0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&h("input stream is not ready"),{tensor:null,canvas:l0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,s=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!s)return t.debug&&h("cannot determine input dimensions"),{tensor:null,canvas:l0};let A=o,a=s;if(A>d2&&(A=d2,a=Math.trunc(A*s/o)),a>d2&&(a=d2,A=Math.trunc(a*o/s)),(((f=t.filter)==null?void 0:f.width)||0)>0?A=t.filter.width:(((x=t.filter)==null?void 0:x.height)||0)>0&&(A=o*((t.filter.height||0)/s)),(t.filter.height||0)>0?a=t.filter.height:(t.filter.width||0)>0&&(a=s*((t.filter.width||0)/o)),!A||!a)throw new Error("input error: cannot determine dimension");(!l0||l0.width!==A||l0.height!==a)&&(l0=L0(A,a));let i=l0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?i.putImageData(e,0,0):t.filter.flip&&typeof i.translate!="undefined"?(i.translate(o,0),i.scale(-1,1),i.drawImage(e,0,0,o,s,0,0,l0.width,l0.height),i.setTransform(1,0,0,1,0,0)):i.drawImage(e,0,0,o,s,0,0,l0.width,l0.height),(!c0||l0.width!==c0.width||l0.height!==c0.height)&&(c0=L0(l0.width,l0.height)),t.filter.enabled&&M.webgl.supported?(X||(X=M.browser?new K5:null),M.filter=!!X,X!=null&&X.add?(X.reset(),t.filter.brightness!==0&&X.add("brightness",t.filter.brightness),t.filter.contrast!==0&&X.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&X.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&X.add("blur",t.filter.blur),t.filter.saturation!==0&&X.add("saturation",t.filter.saturation),t.filter.hue!==0&&X.add("hue",t.filter.hue),t.filter.negative&&X.add("negative"),t.filter.sepia&&X.add("sepia"),t.filter.vintage&&X.add("brownie"),t.filter.sepia&&X.add("sepia"),t.filter.kodachrome&&X.add("kodachrome"),t.filter.technicolor&&X.add("technicolor"),t.filter.polaroid&&X.add("polaroid"),t.filter.pixelate!==0&&X.add("pixelate",t.filter.pixelate),((u=X.get())==null?void 0:u.length)>1?c0=X.apply(l0):c0=X.draw(l0)):(t.debug&&h("input process error: cannot initialize filters"),M.webgl.supported=!1,t.filter.enabled=!1,x2(l0,c0))):(x2(l0,c0),X&&(X=null),M.filter=!!X),!n)return{tensor:null,canvas:c0};if(!c0)throw new Error("canvas error: cannot create output");let c,d=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(M.browser&&r.browser)c=r.browser?r.browser.fromPixels(e):null;else{d=e.data.length/e.height/e.width;let m=new Uint8Array(e.data.buffer);c=r.tensor(m,[e.height,e.width,d],"int32")}else if((!Oe||c0.width!==Oe.width||c0.height!==Oe.height)&&(Oe=L0(c0.width,c0.height)),r.browser&&M.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?c=r.browser.fromPixels(c0):(Oe=x2(c0),c=r.browser.fromPixels(Oe));else{let P=x2(c0).getContext("2d").getImageData(0,0,A,a);d=P.data.length/A/a;let v=new Uint8Array(P.data.buffer);c=r.tensor(v,[A,a,d])}if(d===4){let m=r.slice3d(c,[0,0,0],[-1,-1,3]);r.dispose(c),c=m}if(!c)throw new Error("input error: cannot create tensor");let y=r.cast(c,"float32"),l=t.filter.equalization?await c2(y):r.expandDims(y,0);if(r.dispose([c,y]),t.filter.autoBrightness){let m=r.max(l),g=await m.data();t.filter.brightness=g[0]>1?1-g[0]/255:1-g[0],r.dispose(m)}return{tensor:l,canvas:t.filter.return?c0:null}}async function J5(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!z0.inputTensor)z0.inputTensor=r.clone(t);else if(z0.inputTensor.shape[1]!==t.shape[1]||z0.inputTensor.shape[2]!==t.shape[2])r.dispose(z0.inputTensor),z0.inputTensor=r.clone(t);else{let o={};o.diff=r.sub(t,z0.inputTensor),o.squared=r.mul(o.diff,o.diff),o.sum=r.sum(o.squared);let A=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;r.dispose([z0.inputTensor,o.diff,o.squared,o.sum]),z0.inputTensor=r.clone(t),n=A<=(e.cacheSensitivity||0)}return n}async function Q5(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||h("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||h("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=r.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?r.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):r.clone(n),o.diff=r.sub(o.input1,o.input2),o.squared=r.mul(o.diff,o.diff),o.sum=r.sum(o.squared);let A=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return r.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),A}var Je,Qe,_e,m2=class{constructor(){E(this,"browser");E(this,"node");E(this,"worker");E(this,"platform","");E(this,"agent","");E(this,"backends",[]);E(this,"initial");E(this,"filter");E(this,"tfjs");E(this,"offscreen");E(this,"perfadd",!1);E(this,"tensorflow",{version:void 0,gpu:void 0});E(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});E(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});E(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});E(this,"cpu",{model:void 0,flags:[]});E(this,"kernels",[]);Z0(this,Je,void 0);Z0(this,Qe,void 0);Z0(this,_e,void 0);if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:Ke["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}get Canvas(){return v0(this,Je)}set Canvas(t){Y0(this,Je,t),globalThis.Canvas=t}get Image(){return v0(this,Qe)}set Image(t){Y0(this,Qe,t),globalThis.Image=t}get ImageData(){return v0(this,_e)}set ImageData(t){Y0(this,_e,t),globalThis.ImageData=t}async updateBackend(){this.backends=Object.keys(r.engine().registryFactory);try{this.tensorflow={version:r.backend().binding?r.backend().binding.TF_Version:void 0,gpu:r.backend().binding?r.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=L0(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=r.getKernelsForBackend(r.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}};Je=new WeakMap,Qe=new WeakMap,_e=new WeakMap;var M=new m2;var p2=class{constructor(){E(this,"config");E(this,"element");E(this,"stream");E(this,"devices",[]);E(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});E(this,"start",async t=>{var s,A;if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let a=document.getElementById(t.element);if(a&&a instanceof HTMLVideoElement)this.element=a;else{this.config.debug&&h("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&h("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none"}};if(((s=this.config)==null?void 0:s.width)>0&&(n.video.width={ideal:this.config.width}),((A=this.config)==null?void 0:A.height)>0&&(n.video.height={ideal:this.config.height}),this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&h("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&h("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&h("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(a){h("webcam",a);return}if(!this.stream){this.config.debug&&h("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(a=>{this.element?this.element.onloadeddata=()=>a(!0):a(!1)}),await this.element.play(),this.config.debug&&h("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});E(this,"pause",()=>{this.element&&this.element.pause()});E(this,"play",async()=>{this.element&&await this.element.play()});E(this,"stop",()=>{this.config.debug&&h("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var ct={};oe(ct,{age:()=>mo,"anti-spoofing":()=>Xo,antispoof:()=>no,blazeface:()=>oo,"blazeface-back":()=>po,"blazeface-front":()=>uo,"blazepose-detector":()=>ho,"blazepose-full":()=>bo,"blazepose-heavy":()=>go,"blazepose-lite":()=>To,centernet:()=>ro,default:()=>rr,efficientpose:()=>vo,"efficientpose-i-lite":()=>qo,"efficientpose-ii-lite":()=>Uo,"efficientpose-iv":()=>Yo,emotion:()=>so,faceboxes:()=>Ro,facemesh:()=>Ao,"facemesh-attention":()=>Po,"facemesh-attention-pinto":()=>Mo,"facemesh-detection-full":()=>ko,"facemesh-detection-short":()=>wo,faceres:()=>ao,"faceres-deep":()=>Eo,gear:()=>zo,gender:()=>jo,"gender-ssrnet-imdb":()=>So,handdetect:()=>Io,"handlandmark-full":()=>No,"handlandmark-lite":()=>io,"handlandmark-sparse":()=>Lo,handskeleton:()=>Oo,handtrack:()=>lo,"insightface-efficientnet-b0":()=>Ko,"insightface-ghostnet-strides1":()=>Jo,"insightface-ghostnet-strides2":()=>Qo,"insightface-mobilenet-emore":()=>_o,"insightface-mobilenet-swish":()=>$o,iris:()=>co,liveness:()=>xo,meet:()=>Co,mobileface:()=>Wo,mobilefacenet:()=>Do,models:()=>yo,"movenet-lightning":()=>fo,"movenet-multipose":()=>Fo,"movenet-thunder":()=>Bo,nanodet:()=>Ho,"nanodet-e":()=>er,"nanodet-g":()=>tr,"nanodet-m":()=>nr,"nanodet-t":()=>or,posenet:()=>Go,rvm:()=>Vo,selfie:()=>Zo});var no=853098,oo=538928,ro=4030290,so=820516,Ao=1477958,ao=6978814,io=2023432,lo=2964837,co=2599092,xo=592976,yo=0,fo=4650216,mo=161240,po=538928,uo=402048,ho=5928856,bo=6339202,go=27502466,To=2726402,vo=5651240,Ro=2013002,Mo=2387598,Po=2382414,ko=1026192,wo=201268,Eo=13957620,zo=1498916,So=161236,jo=201808,Io=3515612,No=5431368,Lo=5286322,Oo=5502280,Co=372228,Wo=2183192,Do=5171976,Fo=9448838,Bo=12477112,Ho=7574558,Go=5032780,Vo=3739355,Zo=212886,Xo=853098,qo=2269064,Uo=5651240,Yo=25643252,Ko=13013224,Jo=8093408,Qo=8049584,_o=6938536,$o=12168584,er=12319156,tr=7574558,nr=1887474,or=5294216,rr={antispoof:no,blazeface:oo,centernet:ro,emotion:so,facemesh:Ao,faceres:ao,"handlandmark-lite":io,handtrack:lo,iris:co,liveness:xo,models:yo,"movenet-lightning":fo,age:mo,"blazeface-back":po,"blazeface-front":uo,"blazepose-detector":ho,"blazepose-full":bo,"blazepose-heavy":go,"blazepose-lite":To,efficientpose:vo,faceboxes:Ro,"facemesh-attention-pinto":Mo,"facemesh-attention":Po,"facemesh-detection-full":ko,"facemesh-detection-short":wo,"faceres-deep":Eo,gear:zo,"gender-ssrnet-imdb":So,gender:jo,handdetect:Io,"handlandmark-full":No,"handlandmark-sparse":Lo,handskeleton:Oo,meet:Co,mobileface:Wo,mobilefacenet:Do,"movenet-multipose":Fo,"movenet-thunder":Bo,nanodet:Ho,posenet:Go,rvm:Vo,selfie:Zo,"anti-spoofing":Xo,"efficientpose-i-lite":qo,"efficientpose-ii-lite":Uo,"efficientpose-iv":Yo,"insightface-efficientnet-b0":Ko,"insightface-ghostnet-strides1":Jo,"insightface-ghostnet-strides2":Qo,"insightface-mobilenet-emore":_o,"insightface-mobilenet-swish":$o,"nanodet-e":er,"nanodet-g":tr,"nanodet-m":nr,"nanodet-t":or};var u0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},y0={};async function sr(e,t){return u0.debug&&h("load model fetch:",e,t),fetch(e,t)}function _5(e){u0.cacheModels=e.cacheModels,u0.verbose=e.debug,u0.modelBasePath=e.modelBasePath}async function L(e){var d,y,l,f;let t=G5(u0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),s="indexeddb://"+o;y0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:ct[o],inCache:!1,url:""},u0.cacheSupported=typeof indexedDB!="undefined";let A={};try{A=u0.cacheSupported&&u0.cacheModels?await r.io.listModels():{}}catch(x){u0.cacheSupported=!1}y0[o].inCache=u0.cacheSupported&&u0.cacheModels&&Object.keys(A).includes(s),y0[o].url=y0[o].inCache?s:t;let a=typeof fetch=="undefined"?{}:{fetchFunc:(x,u)=>sr(x,u)},i=new r.GraphModel(y0[o].url,a),c=!1;try{i.findIOHandler(),u0.debug&&h("model load handler:",i.handler)}catch(x){h("error finding model i/o handler:",t,x)}try{let x=await((d=i.handler)==null?void 0:d.load())||null;y0[o].sizeFromManifest=((y=x==null?void 0:x.weightData)==null?void 0:y.byteLength)||0,x?i.loadSync(x):i=await r.loadGraphModel(y0[o].inCache?s:t,a),y0[o].sizeLoadedWeights=((f=(l=i.artifacts)==null?void 0:l.weightData)==null?void 0:f.byteLength)||0,u0.verbose&&h("load:",{model:o,url:i.modelUrl,bytes:y0[o].sizeLoadedWeights}),c=!0}catch(x){h("error loading model:",t,x)}if(c&&u0.cacheModels&&u0.cacheSupported&&!y0[o].inCache)try{let x=await i.save(s);u0.debug&&h("model saved:",s,x)}catch(x){h("error saving model:",t,x)}return i}var dt="3.0.1";var Y={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function ir(){let e=Y.gl;!e||(Y.extensions=e.getSupportedExtensions())}function $5(e){var t;if(e.config.backend==="humangl"&&(Y.name in r.engine().registry&&!((t=Y==null?void 0:Y.gl)!=null&&t.getParameter(Y.gl.VERSION))&&(h("humangl error: backend invalid context"),e.models.reset()),!r.findBackend(Y.name))){try{Y.canvas=L0(100,100)}catch(s){h("humangl error: cannot create canvas:",s);return}try{if(Y.gl=Y.canvas.getContext("webgl2",Y.webGLattr),!Y.gl){h("humangl error: cannot get webgl context");return}if(!Y.gl.getParameter(Y.gl.VERSION).includes("2.0")){h("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}Y.canvas&&(Y.canvas.addEventListener("webglcontextlost",A=>{throw h("humangl error:",A.type),h("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),Y.canvas.addEventListener("webglcontextrestored",A=>{h("humangl error: context restored:",A)}),Y.canvas.addEventListener("webglcontextcreationerror",A=>{h("humangl error: context create:",A)}))}catch(s){h("humangl error: cannot get webgl context:",s);return}try{r.setWebGLContext(2,Y.gl)}catch(s){h("humangl error: cannot set webgl context:",s);return}try{let s=new r.GPGPUContext(Y.gl);r.registerBackend(Y.name,()=>new r.MathBackendWebGL(s),Y.priority)}catch(s){h("humangl error: cannot register webgl backend:",s);return}try{r.getKernelsForBackend("webgl").forEach(A=>{let a={...A,backendName:Y.name};r.registerKernel(a)})}catch(s){h("humangl error: cannot update webgl backend registration:",s);return}try{r.env().flagRegistry.WEBGL_VERSION&&r.env().set("WEBGL_VERSION",2)}catch(s){h("humangl error: cannot set WebGL backend flags:",s);return}ir();let n=r.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&h("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):h("humangl error: no current gl context:",o,Y.gl)}}var O={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function e1(){O.tf255=r.scalar(255,"float32"),O.tf1=r.scalar(1,"float32"),O.tf2=r.scalar(2,"float32"),O.tf05=r.scalar(.5,"float32"),O.tf127=r.scalar(127.5,"float32"),O.rgb=r.tensor1d([.2989,.587,.114],"float32")}async function dr(){var e;return await M.updateBackend(),(e=M.tensorflow)!=null&&e.version?"tensorflow":M.webgpu.supported&&M.webgpu.backend?"webgpu":M.webgl.supported&&M.webgl.backend?"webgl":M.wasm.supported&&M.wasm.backend?"wasm":"cpu"}function xr(e){let t=[];if(!M.kernels.includes("mod")){let n={kernelName:"Mod",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>r.sub(o.inputs.a,r.mul(r.div(o.inputs.a,o.inputs.b),o.inputs.b)))};r.registerKernel(n),M.kernels.push("mod"),t.push("mod")}if(!M.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>r.add(r.mul(r.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),r.mod(o.inputs.a,o.inputs.b)))};r.registerKernel(n),M.kernels.push("floormod"),t.push("floormod")}if(!M.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:r.getBackend(),kernelFunc:o=>r.tidy(()=>{let s=r.getBackend();r.setBackend("cpu");let A=r.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return r.setBackend(s),A})};r.registerKernel(n),M.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&h("registered kernels:",t)}var t1={};async function $e(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await dr()),t||M.initial||e.config.backend&&e.config.backend.length>0&&r.getBackend()!==e.config.backend){let o=T();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&h("running inside web worker"),M.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&h("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),M.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&h(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),M.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")h("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let A=await navigator.gpu.requestAdapter();if(e.config.debug&&h("enumerated webgpu adapter:",A),!A)h("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let a="requestAdapterInfo"in A?await A.requestAdapterInfo():void 0;h("webgpu adapter info:",a)}}let s=Object.keys(r.engine().registryFactory);if(e.config.backend==="humangl"&&!s.includes("humangl")&&($5(e),s=Object.keys(r.engine().registryFactory)),e.config.debug&&h("available backends:",s),s.includes(e.config.backend)||(h(`error: backend ${e.config.backend} not found in registry`),e.config.backend=M.node?"tensorflow":"webgl",e.config.debug&&h(`override: setting backend ${e.config.backend}`)),e.config.debug&&h("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(r.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&r.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&h("wasm path:",e.config.wasmPath),typeof r.setWasmPaths!="undefined")r.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let A=!1,a=!1;try{A=await r.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),a=await r.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&h(`wasm execution: ${a?"simd":"no simd"} ${A?"multithreaded":"singlethreaded"}`),e.config.debug&&!a&&h("warning: wasm simd support is not enabled")}catch(i){h("wasm detection failed")}}try{await r.setBackend(e.config.backend),await r.ready()}catch(A){return h("error: cannot set backend:",e.config.backend,A),!1}e.config.debug&&(t1=JSON.parse(JSON.stringify(r.env().flags)))}if((r.getBackend()==="humangl"||r.getBackend()==="webgl")&&(r.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&r.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),r.env().flagRegistry.WEBGL_EXP_CONV&&r.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(h("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),r.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),r.getBackend(),e.config.debug){let s=r.env().flags,A={};for(let a of Object.keys(s))t1[a]!==s[a]&&(A[a]=s[a]);e.config.debug&&Object.keys(A).length>0&&h("backend:",r.getBackend(),"flags:",A)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&h("flags:",e.config.flags);for(let[s,A]of Object.entries(e.config.flags))r.env().set(s,A)}r.enableProdMode(),e1(),e.performance.initBackend=Math.trunc(T()-o),e.config.backend=r.getBackend(),await M.updateBackend(),xr(e.config),M.initial=!1}return!0}function u2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:s=>{var A;return t.debug&&h("kernelFunc",n,t.backend,s),(A=s==null?void 0:s.inputs)==null?void 0:A.info}};r.registerKernel(o)}M.kernels=r.getKernelsForBackend(r.getBackend()).map(n=>n.kernelName.toLowerCase())}var bt={};oe(bt,{all:()=>Vr,body:()=>b2,canvas:()=>Gr,face:()=>h2,gesture:()=>v2,hand:()=>g2,init:()=>ht,object:()=>T2,options:()=>e0,person:()=>Hr});var S0=e=>{if(!e)h("draw error: invalid canvas");else if(!e.getContext)h("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)h("draw error: cannot get canvas context");else return t}return null},be=e=>Math.round(e*180/Math.PI),V=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),ge=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function O0(e,t,n,o,s){let A=t.replace(/\[.*\]/g,"").split(` +`).map(i=>i.trim()),a=Math.max(0,n);for(let i=A.length-1;i>=0;i--){let c=i*s.lineHeight+o;s.shadowColor&&s.shadowColor!==""&&(e.fillStyle=s.shadowColor,e.fillText(A[i],a+5,c+16)),e.fillStyle=s.labelColor,e.fillText(A[i],a+4,c+15)}}function K0(e,t,n,o,s){e.fillStyle=ge(o,s),e.beginPath(),e.arc(t,n,s.pointSize,0,2*Math.PI),e.fill()}function X0(e,t,n,o,s,A){if(e.beginPath(),e.lineWidth=A.lineWidth,A.useCurves){let a=(t+t+o)/2,i=(n+n+s)/2;e.ellipse(a,i,o/2,s/2,0,0,2*Math.PI)}else e.moveTo(t+A.roundRect,n),e.lineTo(t+o-A.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+A.roundRect),e.lineTo(t+o,n+s-A.roundRect),e.quadraticCurveTo(t+o,n+s,t+o-A.roundRect,n+s),e.lineTo(t+A.roundRect,n+s),e.quadraticCurveTo(t,n+s,t,n+s-A.roundRect),e.lineTo(t,n+A.roundRect),e.quadraticCurveTo(t,n,t+A.roundRect,n),e.closePath();e.stroke()}function xt(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=ge(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function o1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){xt(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oe2[e]),HA=fr.map(e=>e2[e]),GA=mr.map(e=>e2[e]);function re(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var pr=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ur=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],hr=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],br=[[474,475],[475,476],[476,477],[477,474]],gr=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],Tr=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],vr=[[469,470],[470,471],[471,472],[472,469]],Rr=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],VA={lips:re(pr),leftEye:re(ur),leftEyebrow:re(hr),leftIris:re(br),rightEye:re(gr),rightEyebrow:re(Tr),rightIris:re(vr),faceOval:re(Rr)};var Mr=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Pr=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],kr=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],wr=[[474,475],[475,476],[476,477],[477,474]],Er=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],zr=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Sr=[[469,470],[470,471],[471,472],[472,469]],jr=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function se(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Ir={lips:se(Mr),leftEye:se(Pr),leftEyebrow:se(kr),leftIris:se(wr),rightEye:se(Er),rightEyebrow:se(zr),rightIris:se(Sr),faceOval:se(jr)},Nr=Object.entries(Ir).map(([e,t])=>t.map(n=>[n,e])).flat(),ZA=new Map(Nr),t2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],Re=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],Me=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var G;function Lr(e,t){var o,s,A,a,i,c,d,y,l;if(!G.drawLabels||((o=G.faceLabels)==null?void 0:o.length)===0)return;let n=G.faceLabels.slice();if(e.score&&(n=V(n,"[score]",100*e.score)),e.gender&&(n=V(n,"[gender]",e.gender)),e.genderScore&&(n=V(n,"[genderScore]",100*e.genderScore)),e.age&&(n=V(n,"[age]",e.age)),e.distance&&(n=V(n,"[distance]",100*e.distance)),e.real&&(n=V(n,"[real]",100*e.real)),e.live&&(n=V(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let f=e.emotion.map(x=>`${Math.trunc(100*x.score)}% ${x.emotion}`);f.length>3&&(f.length=3),n=V(n,"[emotions]",f.join(" "))}(A=(s=e.rotation)==null?void 0:s.angle)!=null&&A.roll&&(n=V(n,"[roll]",be(e.rotation.angle.roll))),(i=(a=e.rotation)==null?void 0:a.angle)!=null&&i.yaw&&(n=V(n,"[yaw]",be(e.rotation.angle.yaw))),(d=(c=e.rotation)==null?void 0:c.angle)!=null&&d.pitch&&(n=V(n,"[pitch]",be(e.rotation.angle.pitch))),(l=(y=e.rotation)==null?void 0:y.gaze)!=null&&l.bearing&&(n=V(n,"[gaze]",be(e.rotation.gaze.bearing))),O0(t,n,e.box[0],e.box[1],G)}function Or(e,t){var n,o,s,A;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=G.useDepth?"rgba(255, 200, 255, 0.3)":G.color,t.beginPath();let a=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,i=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],a,i,0,0,2*Math.PI),t.stroke(),G.fillPolygons&&(t.fillStyle=G.useDepth?"rgba(255, 255, 200, 0.3)":G.color,t.fill())}if(((s=e.annotations)==null?void 0:s.rightEyeIris)&&((A=e.annotations)==null?void 0:A.rightEyeIris[0])){t.strokeStyle=G.useDepth?"rgba(255, 200, 255, 0.3)":G.color,t.beginPath();let a=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,i=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],a,i,0,0,2*Math.PI),t.stroke(),G.fillPolygons&&(t.fillStyle=G.useDepth?"rgba(255, 255, 200, 0.3)":G.color,t.fill())}}function Cr(e,t){var n;if(G.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*be(e.rotation.angle.yaw)/90,s=e.box[1]+e.box[3]/2+e.box[2]*be(e.rotation.angle.pitch)/90,A=new Path2D(` M ${e.box[0]+e.box[2]/2} ${e.box[1]} C ${o} ${e.box[1]}, @@ -109,7 +109,7 @@ var st=Object.defineProperty;var Zn=Object.getOwnPropertyDescriptor;var Xn=Objec ${e.box[0]} ${s}, ${e.box[0]+e.box[2]} ${s}, ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} - `);t.stroke(a),t.stroke(A)}}function Wr(e,t){var n;if(G.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];yt(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let s=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];yt(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[s[0],s[1]],4)}}function Dr(e,t){if(G.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;ne.mesh[s]);dt(t,o,G)}Or(e,t)}}function Fr(e,t){if(G.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Fr(s,o),Dr(s,o),Cr(s,o),Wr(s,o))}}function b2(e,t,n){var A,a;let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round";for(let i=0;i0)){let c=o.bodyLabels.slice();c=V(c,"[score]",100*t[i].score),O0(s,c,t[i].box[0],t[i].box[1],o)}if(o.drawPoints&&t[i].keypoints)for(let c=0;c0&&t[i].keypoints){s.font=o.font;for(let c of t[i].keypoints){if(!c.score||c.score===0)continue;let x=o.bodyPartLabels.slice();x=V(x,"[label]",c.part),x=V(x,"[score]",100*c.score),O0(s,x,c.position[0],c.position[1],o)}}if(o.drawPolygons&&t[i].keypoints&&t[i].annotations)for(let c of Object.values(t[i].annotations))for(let x of c)o1(s,x,o)}}}function g2(e,t,n){var A,a;let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let i of t){if(o.drawBoxes){if(s.strokeStyle=o.color,s.fillStyle=o.color,X0(s,i.box[0],i.box[1],i.box[2],i.box[3],o),o.drawLabels&&((A=o.handLabels)==null?void 0:A.length)>0){let c=o.handLabels.slice();c=V(c,"[label]",i.label),c=V(c,"[score]",100*i.score),O0(s,c,i.box[0],i.box[1],o)}s.stroke()}if(o.drawPoints&&i.keypoints&&i.keypoints.length>0)for(let c of i.keypoints)s.fillStyle=ge(c[2],o),K0(s,c[0],c[1],0,o);if(o.drawLabels&&i.annotations&&((a=o.fingerLabels)==null?void 0:a.length)>0)for(let[c,x]of Object.entries(i.annotations)){let y=o.fingerLabels.slice();y=V(y,"[label]",c),O0(s,y,x[x.length-1][0],x[x.length-1][1],o)}if(o.drawPolygons&&i.annotations){let c=x=>{if(!(!x||x.length===0||!x[0]))for(let y=0;y0?y-1:0][0],x[y>0?y-1:0][1]),s.lineTo(x[y][0],x[y][1]),s.stroke()}};s.lineWidth=o.lineWidth,c(i.annotations.index),c(i.annotations.middle),c(i.annotations.ring),c(i.annotations.pinky),c(i.annotations.thumb)}}}}function T2(e,t,n){var A;let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let a of t)if(o.drawBoxes){if(s.strokeStyle=o.color,s.fillStyle=o.color,X0(s,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((A=o.objectLabels)==null?void 0:A.length)>0){let i=o.objectLabels.slice();i=V(i,"[label]",a.label),i=V(i,"[score]",100*a.score),O0(s,i,a.box[0],a.box[1],o)}s.stroke()}}}function v2(e,t,n){var s;let o=Q(e0,n);if(!(!t||!e)&&o.drawGestures&&((s=o.gestureLabels)==null?void 0:s.length)>0){let A=S0(e);if(!A)return;A.font=o.font,A.fillStyle=o.color;let a=1;for(let i=0;i1&&x[1].length>0){let y=c[1]>0?`#${c[1]}`:"",l=o.gestureLabels.slice();l=V(l,"[where]",c[0]),l=V(l,"[who]",y),l=V(l,"[what]",x[1]),O0(A,l,8,2+a*o.lineHeight,o),a+=1}}}}var Ae={face:`face + `);t.stroke(a),t.stroke(A)}}function Wr(e,t){var n;if(G.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];yt(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let s=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];yt(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[s[0],s[1]],4)}}function Dr(e,t){if(G.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;ne.mesh[s]);xt(t,o,G)}Or(e,t)}}function Fr(e,t){if(G.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Fr(s,o),Dr(s,o),Cr(s,o),Wr(s,o))}}function b2(e,t,n){var A,a;let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round";for(let i=0;i0)){let c=o.bodyLabels.slice();c=V(c,"[score]",100*t[i].score),O0(s,c,t[i].box[0],t[i].box[1],o)}if(o.drawPoints&&t[i].keypoints)for(let c=0;c0&&t[i].keypoints){s.font=o.font;for(let c of t[i].keypoints){if(!c.score||c.score===0)continue;let d=o.bodyPartLabels.slice();d=V(d,"[label]",c.part),d=V(d,"[score]",100*c.score),O0(s,d,c.position[0],c.position[1],o)}}if(o.drawPolygons&&t[i].keypoints&&t[i].annotations)for(let c of Object.values(t[i].annotations))for(let d of c)o1(s,d,o)}}}function g2(e,t,n){var A,a;let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let i of t){if(o.drawBoxes){if(s.strokeStyle=o.color,s.fillStyle=o.color,X0(s,i.box[0],i.box[1],i.box[2],i.box[3],o),o.drawLabels&&((A=o.handLabels)==null?void 0:A.length)>0){let c=o.handLabels.slice();c=V(c,"[label]",i.label),c=V(c,"[score]",100*i.score),O0(s,c,i.box[0],i.box[1],o)}s.stroke()}if(o.drawPoints&&i.keypoints&&i.keypoints.length>0)for(let c of i.keypoints)s.fillStyle=ge(c[2],o),K0(s,c[0],c[1],0,o);if(o.drawLabels&&i.annotations&&((a=o.fingerLabels)==null?void 0:a.length)>0)for(let[c,d]of Object.entries(i.annotations)){let y=o.fingerLabels.slice();y=V(y,"[label]",c),O0(s,y,d[d.length-1][0],d[d.length-1][1],o)}if(o.drawPolygons&&i.annotations){let c=d=>{if(!(!d||d.length===0||!d[0]))for(let y=0;y0?y-1:0][0],d[y>0?y-1:0][1]),s.lineTo(d[y][0],d[y][1]),s.stroke()}};s.lineWidth=o.lineWidth,c(i.annotations.index),c(i.annotations.middle),c(i.annotations.ring),c(i.annotations.pinky),c(i.annotations.thumb)}}}}function T2(e,t,n){var A;let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let a of t)if(o.drawBoxes){if(s.strokeStyle=o.color,s.fillStyle=o.color,X0(s,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((A=o.objectLabels)==null?void 0:A.length)>0){let i=o.objectLabels.slice();i=V(i,"[label]",a.label),i=V(i,"[score]",100*a.score),O0(s,i,a.box[0],a.box[1],o)}s.stroke()}}}function v2(e,t,n){var s;let o=Q(e0,n);if(!(!t||!e)&&o.drawGestures&&((s=o.gestureLabels)==null?void 0:s.length)>0){let A=S0(e);if(!A)return;A.font=o.font,A.fillStyle=o.color;let a=1;for(let i=0;i1&&d[1].length>0){let y=c[1]>0?`#${c[1]}`:"",l=o.gestureLabels.slice();l=V(l,"[where]",c[0]),l=V(l,"[who]",y),l=V(l,"[what]",d[1]),O0(A,l,8,2+a*o.lineHeight,o),a+=1}}}}var Ae={face:`face confidence: [score]% [gender] [genderScore]% age: [age] years @@ -118,7 +118,7 @@ var st=Object.defineProperty;var Zn=Object.getOwnPropertyDescriptor;var Xn=Objec live: [live]% [emotions] roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 - gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var ut=0;function Hr(e,t,n){let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let A=0;ATt,kpt:()=>gt});var gt=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],Tt={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var j0,Pe=224,A1,Zr=5,M2=[8,16,32,32,32];function Xr(){let e=[],t=0;for(;tn.x)),y:r.tensor1d(e.map(n=>n.y))}}async function a1(e){if(M.initial&&(j0=null),!j0&&e.body.detector&&e.body.detector.modelPath){j0=await L(e.body.detector.modelPath);let t=j0!=null&&j0.executor?Object.values(j0.modelSignature.inputs):void 0;Pe=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&j0&&h("cached model:",j0.modelUrl);return Xr(),j0}var s1=[5,5];function qr(e,t){return r.tidy(()=>{let n=r.split(e,12,1),o=r.squeeze(n[0]),s=r.squeeze(n[1]),A=r.squeeze(n[2]),a=r.squeeze(n[3]);o=r.add(r.div(o,Pe),t.x),s=r.add(r.div(s,Pe),t.y),A=r.mul(r.div(A,Pe),s1[0]),a=r.mul(r.div(a,Pe),s1[1]);let i=r.sub(o,r.div(A,2)),c=r.sub(s,r.div(a,2)),x=r.add(i,A),y=r.add(c,a);return r.stack([i,c,x,y],1)})}async function Ur(e,t,n,o){var x,y;let s=[],A={};A.boxes=qr(e,A1),A.scores=r.sigmoid(t),A.nms=await r.image.nonMaxSuppressionAsync(A.boxes,A.scores,1,((x=n.body.detector)==null?void 0:x.minConfidence)||.1,((y=n.body.detector)==null?void 0:y.iouThreshold)||.1);let a=await A.nms.data(),i=await A.scores.data(),c=await A.boxes.array();for(let l of Array.from(a)){let f=i[l],d=c[l],u=[Math.round(d[0]*o[0]),Math.round(d[1]*o[1]),Math.round(d[2]*o[0]),Math.round(d[3]*o[1])],m={score:f,boxRaw:d,box:u};s.push(m)}return Object.keys(A).forEach(l=>r.dispose(A[l])),s}async function i1(e,t,n){let o={};o.res=j0==null?void 0:j0.execute(e,["Identity"]),o.logitsRaw=r.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=r.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=r.squeeze(o.logitsRaw),o.boxes=r.squeeze(o.boxesRaw);let s=await Ur(o.boxes,o.logits,t,n);return Object.keys(o).forEach(A=>r.dispose(o[A])),s}function J0(e,t=[1,1]){let n=[e.map(i=>i[0]),e.map(i=>i[1])],o=[Math.min(...n[0]),Math.min(...n[1])],s=[Math.max(...n[0]),Math.max(...n[1])],A=[o[0],o[1],s[0]-o[0],s[1]-o[1]],a=[A[0]/t[0],A[1]/t[1],A[2]/t[0],A[3]/t[1]];return{box:A,boxRaw:a}}function l1(e,t=[1,1]){let n=[e.map(x=>x[0]),e.map(x=>x[1])],o=[Math.min(...n[0]),Math.min(...n[1])],s=[Math.max(...n[0]),Math.max(...n[1])],A=[(o[0]+s[0])/2,(o[1]+s[1])/2],a=Math.max(A[0]-o[0],A[1]-o[1],-A[0]+s[0],-A[1]+s[1]),i=[Math.trunc(A[0]-a),Math.trunc(A[1]-a),Math.trunc(2*a),Math.trunc(2*a)],c=[i[0]/t[0],i[1]/t[1],i[2]/t[0],i[3]/t[1]];return{box:i,boxRaw:c}}function P2(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var g0,Rt=256,vt=Number.MAX_SAFE_INTEGER,Yr={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},w2=[],ae=[[0,0],[0,0],[0,0],[0,0]],c1=0,x1=e=>1-1/(1+Math.exp(e)),y1=e=>a1(e);async function f1(e){if(M.initial&&(g0=null),g0)e.debug&&h("cached model:",g0.modelUrl);else{g0=await L(e.body.modelPath);let t=g0!=null&&g0.executor?Object.values(g0.modelSignature.inputs):void 0;Rt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return g0}function d1(e,t,n){var A,a;let o={};if(!((A=e==null?void 0:e.shape)!=null&&A[1])||!((a=e==null?void 0:e.shape)!=null&&a[2]))return e;let s;if(n&&(o.cropped=r.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let i=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],c=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];ae=[[0,0],i,c,[0,0]],o.pad=r.pad(o.cropped||e,ae),o.resize=r.image.resizeBilinear(o.pad,[t,t]),s=r.div(o.resize,O.tf255)}else e.shape[1]!==t?(o.resize=r.image.resizeBilinear(o.cropped||e,[t,t]),s=r.div(o.resize,O.tf255)):s=r.div(o.cropped||e,O.tf255);return Object.keys(o).forEach(i=>r.dispose(o[i])),s}function Kr(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+ae[2][0]+ae[2][1])/t[0]-ae[2][0]),Math.trunc(o.position[1]*(t[1]+ae[1][0]+ae[1][1])/t[1]-ae[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],s=n[3]-n[1];for(let A of e)A.positionRaw=[A.positionRaw[0]/s+n[1],A.positionRaw[1]/o+n[0],A.positionRaw[2]],A.position=[Math.trunc(A.positionRaw[0]*t[0]),Math.trunc(A.positionRaw[1]*t[1]),A.positionRaw[2]]}return e}function Jr(e){let t=e.find(i=>i.part==="leftPalm"),n=e.find(i=>i.part==="leftWrist"),o=e.find(i=>i.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let s=e.find(i=>i.part==="rightPalm"),A=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");s.position[2]=((A.position[2]||0)+(a.position[2]||0))/2}async function Qr(e,t,n){if(!(g0!=null&&g0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=g0==null?void 0:g0.execute(e,Yr.landmarks);let s=(await o.poseflag.data())[0],A=await o.ld.data(),a=await o.world.data();Object.keys(o).forEach(u=>r.dispose(o[u]));let i=[],c=5;for(let u=0;uu.position),l=J0(y,[n[0],n[1]]),f={};for(let[u,m]of Object.entries(Tt)){let g=[];for(let P=0;Pb.part===m[P]),p=x.find(b=>b.part===m[P+1]);v&&p&&g.push([v.position,p.position])}f[u]=g}return{id:0,score:Math.trunc(100*s)/100,box:l.box,boxRaw:l.boxRaw,keypoints:x,annotations:f}}async function Mt(e,t){var A,a,i;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>T()-c1,s=vt<(t.body.skipFrames||0);if(t.skipAllowed&&o&&s&&w2!==null)vt++;else{let c=[];if((a=(A=t.body)==null?void 0:A.detector)!=null&&a.enabled){let x=d1(e,224);c=await i1(x,t,n),r.dispose(x)}else c=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let x=0;xr.dispose(o[x])),s}async function wt(e,t){if(!(T0!=null&&T0.executor))return[];let n=(t.object.skipTime||0)>T()-p1,o=kt<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&Pt.length>0?(kt++,Pt):(kt=0,new Promise(async s=>{let A=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[ke,ke]),i=t.object.enabled?T0==null?void 0:T0.execute(a,["tower_0/detections"]):null;p1=T(),r.dispose(a);let c=await _r(i,A,t);Pt=c,s(c)}))}var E2={};oe(E2,{connected:()=>zt,kpt:()=>Et});var Et=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],zt={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var _,b1=0,h0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},St=Number.MAX_SAFE_INTEGER;async function g1(e){return M.initial&&(_=null),_?e.debug&&h("cached model:",_.modelUrl):_=await L(e.body.modelPath),_}async function $r(e,t){let[n,o]=e.shape,s=r.reshape(e,[o*n]),A=r.max(s,0),a=(await A.data())[0];if(a>t){let i=r.argMax(s,0),c=r.mod(i,n),x=(await c.data())[0],y=r.div(i,n),l=(await y.data())[0];return r.dispose([s,A,i,c,y]),[x,l,a]}return r.dispose([s,A]),[0,0,a]}async function jt(e,t){if(!(_!=null&&_.executor)||!(_!=null&&_.inputs[0].shape))return[];let n=(t.body.skipTime||0)>T()-b1,o=St<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(h0.keypoints).length>0?(St++,[h0]):(St=0,new Promise(async s=>{let A=r.tidy(()=>{var u,m;let l=r.image.resizeBilinear(e,[((u=_==null?void 0:_.inputs[0].shape)==null?void 0:u[2])||0,((m=_==null?void 0:_.inputs[0].shape)==null?void 0:m[1])||0],!1),f=r.mul(l,O.tf2);return r.sub(f,O.tf1)}),a;if(t.body.enabled&&(a=_==null?void 0:_.execute(A)),b1=T(),r.dispose(A),a){h0.keypoints.length=0;let l=r.squeeze(a);r.dispose(a);let f=r.unstack(l,2);r.dispose(l);for(let d=0;d(t.body.minConfidence||0)&&h0.keypoints.push({score:Math.round(100*g)/100,part:Et[d],positionRaw:[u/_.inputs[0].shape[2],m/_.inputs[0].shape[1]],position:[Math.round(e.shape[2]*u/_.inputs[0].shape[2]),Math.round(e.shape[1]*m/_.inputs[0].shape[1])]})}f.forEach(d=>r.dispose(d))}h0.score=h0.keypoints.reduce((l,f)=>f.score>l?f.score:l,0);let i=h0.keypoints.map(l=>l.position[0]),c=h0.keypoints.map(l=>l.position[1]);h0.box=[Math.min(...i),Math.min(...c),Math.max(...i)-Math.min(...i),Math.max(...c)-Math.min(...c)];let x=h0.keypoints.map(l=>l.positionRaw[0]),y=h0.keypoints.map(l=>l.positionRaw[1]);h0.boxRaw=[Math.min(...x),Math.min(...y),Math.max(...x)-Math.min(...x),Math.max(...y)-Math.min(...y)];for(let[l,f]of Object.entries(zt)){let d=[];for(let u=0;uP.part===f[u]),g=h0.keypoints.find(P=>P.part===f[u+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&d.push([m.position,g.position])}h0.annotations[l]=d}s([h0])}))}var We=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],z2=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],S2=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],j2=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],M1=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},It=(e,t,n)=>{let o=t.shape[1],s=t.shape[2],A=[e.startPoint[1]/o,e.startPoint[0]/s,e.endPoint[1]/o,e.endPoint[0]/s],a=r.image.cropAndResize(t,[A],[0],n),i=r.div(a,O.tf255);return r.dispose(a),i},I2=(e,t)=>{let n=z2(e),o=We(e),s=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-s[0],n[1]-s[1]],endPoint:[n[0]+s[0],n[1]+s[1]],landmarks:e.landmarks,confidence:e.confidence}},N2=e=>{let t=z2(e),n=We(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},P1=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},Nt=[[1,0,0],[0,1,0],[0,0,1]],es=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),ts=(e,t)=>es(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var v1=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],we=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let s=0;s{let n=Math.cos(e),o=Math.sin(e),s=[[n,-o,0],[o,n,0],[0,0,1]],A=v1(t[0],t[1]),a=R1(A,s),i=v1(-t[0],-t[1]);return R1(a,i)},os=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-we(t[0],n),-we(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},rs=(e,t)=>[we(e,t[0]),we(e,t[1])];function w1(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[A[0]/s*(d[0]-s/2),A[1]/s*(d[1]-s/2),d[2]||0]),i=n&&n!==0&&Math.abs(n)>.2,c=i?k1(n,[0,0]):Nt,x=i?a.map(d=>[...rs(d,c),d[2]]):a,y=i?os(o):Nt,l=z2(t),f=[we(l,y[0]),we(l,y[1])];return x.map(d=>[Math.trunc(d[0]+f[0]),Math.trunc(d[1]+f[1]),Math.trunc(d[2]||0)])}function z1(e,t,n,o){let s=t.landmarks.length>=ft.count?ft.symmetryLine:Te.symmetryLine,A=0,a=Nt,i;if(e&&M.kernels.includes("rotatewithoffset"))if(A=ts(t.landmarks[s[0]],t.landmarks[s[1]]),A&&A!==0&&Math.abs(A)>.2){let x=z2(t),y=[x[0]/n.shape[2],x[1]/n.shape[1]],l=r.image.rotateWithOffset(n,A,0,[y[0],y[1]]);a=k1(-A,x),i=It(t,l,[o,o]),r.dispose(l)}else i=It(t,n,[o,o]);else i=It(t,n,[o,o]);return[A,a,i]}var ss=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},S1=(e,t)=>{let n=ss(e),o=We(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var j1=6,As=1.4,B0,Ot=null,ie=0,De=null,Fe=()=>ie;async function I1(e){var t;return M.initial&&(B0=null),B0?e.debug&&h("cached model:",B0.modelUrl):B0=await L((t=e.face.detector)==null?void 0:t.modelPath),ie=B0.executor&&B0.inputs[0].shape?B0.inputs[0].shape[2]:256,De=r.scalar(ie,"int32"),Ot=r.tensor2d(w1(ie)),B0}function as(e){if(!Ot||!De)return r.zeros([0,0]);let t={};t.boxStarts=r.slice(e,[0,1],[-1,2]),t.centers=r.add(t.boxStarts,Ot),t.boxSizes=r.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=r.div(t.boxSizes,De),t.centersNormalized=r.div(t.centers,De),t.halfBoxSize=r.div(t.boxSizesNormalized,O.tf2),t.starts=r.sub(t.centersNormalized,t.halfBoxSize),t.ends=r.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=r.mul(t.starts,De),t.endNormalized=r.mul(t.ends,De);let n=r.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>r.dispose(t[o])),n}async function N1(e,t){var i,c,x,y;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=r.image.resizeBilinear(e,[ie,ie]),n.div=r.div(n.resized,O.tf127),n.normalized=r.sub(n.div,O.tf05);let o=B0==null?void 0:B0.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let l=o.sort((f,d)=>f.size-d.size);n.concat384=r.concat([l[0],l[2]],2),n.concat512=r.concat([l[1],l[3]],2),n.concat=r.concat([n.concat512,n.concat384],1),n.batch=r.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=r.squeeze(o[0]):n.batch=r.squeeze(o);r.dispose(o),n.boxes=as(n.batch),n.logits=r.slice(n.batch,[0,0],[-1,1]),n.sigmoid=r.sigmoid(n.logits),n.scores=r.squeeze(n.sigmoid),n.nms=await r.image.nonMaxSuppressionAsync(n.boxes,n.scores,((i=t.face.detector)==null?void 0:i.maxDetected)||0,((c=t.face.detector)==null?void 0:c.iouThreshold)||0,((x=t.face.detector)==null?void 0:x.minConfidence)||0);let s=await n.nms.array(),A=[],a=await n.scores.data();for(let l=0;l(((y=t.face.detector)==null?void 0:y.minConfidence)||0)){let d={};d.bbox=r.slice(n.boxes,[s[l],0],[1,-1]),d.slice=r.slice(n.batch,[s[l],j1-1],[1,-1]),d.squeeze=r.squeeze(d.slice),d.landmarks=r.reshape(d.squeeze,[j1,-1]);let u=await d.bbox.data(),m={startPoint:[u[0],u[1]],endPoint:[u[2],u[3]],landmarks:await d.landmarks.array(),confidence:f},g=M1(m,[(e.shape[2]||0)/ie,(e.shape[1]||0)/ie]),P=I2(g,t.face.scale||As),v=N2(P);A.push(v),Object.keys(d).forEach(p=>r.dispose(d[p]))}}return Object.keys(n).forEach(l=>r.dispose(n[l])),A}var R0,le=0,is=2.3,Ct=C0.leftEyeLower0,Wt=C0.rightEyeLower0,Be={leftBounds:[Ct[0],Ct[Ct.length-1]],rightBounds:[Wt[0],Wt[Wt.length-1]]},He={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function D1(e){var t,n;return M.initial&&(R0=null),R0?e.debug&&h("cached model:",R0.modelUrl):R0=await L((t=e.face.iris)==null?void 0:t.modelPath),le=(R0==null?void 0:R0.executor)&&((n=R0.inputs)==null?void 0:n[0].shape)?R0.inputs[0].shape[2]:0,le===-1&&(le=64),R0}function L2(e,t,n,o){for(let s=0;s{let t=e[Be.leftBounds[0]][2],n=e[Be.rightBounds[0]][2];return t-n},O1=(e,t,n,o,s,A=!1)=>{let a=N2(I2(P1([e[n],e[o]]),is)),i=We(a),c=r.image.cropAndResize(t,[[a.startPoint[1]/s,a.startPoint[0]/s,a.endPoint[1]/s,a.endPoint[0]/s]],[0],[le,le]);if(A&&M.kernels.includes("flipleftright")){let x=r.image.flipLeftRight(c);r.dispose(c),c=x}return{box:a,boxSize:i,crop:c}},C1=(e,t,n,o=!1)=>{let s=[];for(let A=0;A{let o=e[C0[`${n}EyeUpper0`][He.upperCenter]][2],s=e[C0[`${n}EyeLower0`][He.lowerCenter]][2],A=(o+s)/2;return t.map((a,i)=>{let c=A;return i===2?c=o:i===4&&(c=s),[a[0],a[1],c]})};async function F1(e,t,n){if(!(R0!=null&&R0.executor))return e;let{box:o,boxSize:s,crop:A}=O1(e,t,Be.leftBounds[0],Be.leftBounds[1],n,!0),{box:a,boxSize:i,crop:c}=O1(e,t,Be.rightBounds[0],Be.rightBounds[1],n,!0),x=r.concat([A,c]);r.dispose(A),r.dispose(c);let y=R0.execute(x);r.dispose(x);let l=await y.data();r.dispose(y);let f=l.slice(0,He.numCoordinates*3),{rawCoords:d,iris:u}=C1(f,o,s,!0),m=l.slice(He.numCoordinates*3),{rawCoords:g,iris:P}=C1(m,a,i,!1),v=ls(e);Math.abs(v)<30?(L2(e,d,"left",null),L2(e,g,"right",null)):v<1?L2(e,d,"left",["EyeUpper0","EyeLower0"]):L2(e,g,"right",["EyeUpper0","EyeLower0"]);let p=W1(e,u,"left"),b=W1(e,P,"right");return e.concat(p).concat(b)}async function H1(e,t){var A,a,i,c,x,y,l,f,d,u;let n={lips:await((a=(A=t.filter(m=>m.size===160))==null?void 0:A[0])==null?void 0:a.data()),irisL:await((c=(i=t.filter(m=>m.size===10))==null?void 0:i[0])==null?void 0:c.data()),eyeL:await((y=(x=t.filter(m=>m.size===142))==null?void 0:x[0])==null?void 0:y.data()),irisR:await((f=(l=t.filter(m=>m.size===10))==null?void 0:l[1])==null?void 0:f.data()),eyeR:await((u=(d=t.filter(m=>m.size===142))==null?void 0:d[1])==null?void 0:u.data())};for(let m of Object.values(n))if(!m)return e;let o=Re.reduce((m,g)=>m+=e[g][2],0)/Re.length;for(let m=0;mm+=e[g][2],0)/Me.length;for(let m=0;mT()-q0.timestamp,o=q0.skipped<(((x=t.face.detector)==null?void 0:x.skipFrames)||0);!t.skipAllowed||!n||!o||q0.boxes.length===0?(q0.boxes=await N1(e,t),q0.timestamp=T(),q0.skipped=0):q0.skipped++;let s=[],A=[],a=0,i=n2;for(let v=0;vW.shape[W.shape.length-1]===1).data();if(k.faceScore=Math.round(100*q[0])/100,k.faceScore<(((u=t.face.detector)==null?void 0:u.minConfidence)||1)){if(p.confidence=k.faceScore,t.face.mesh.keepInvalid){k.box=S2(p,e),k.boxRaw=j2(p,e),k.score=k.boxScore,k.mesh=p.landmarks.map(W=>[(p.startPoint[0]+p.endPoint[0])/2+(p.endPoint[0]+p.startPoint[0])*W[0]/Fe(),(p.startPoint[1]+p.endPoint[1])/2+(p.endPoint[1]+p.startPoint[1])*W[1]/Fe()]),k.meshRaw=k.mesh.map(W=>[W[0]/(e.shape[2]||1),W[1]/(e.shape[1]||1),(W[2]||0)/i]);for(let W of Object.keys(Te))k.annotations[W]=[k.mesh[Te[W]]]}}else{let W=N.find(D=>D.shape[D.shape.length-1]===1404),Z=r.reshape(W,[-1,3]),J=await Z.array();r.dispose(Z),(m=t.face.attention)!=null&&m.enabled?J=await H1(J,N):(g=t.face.iris)!=null&&g.enabled&&(J=await F1(J,k.tensor,n2)),k.mesh=E1(J,p,b,j,n2),k.meshRaw=k.mesh.map(D=>[D[0]/(e.shape[2]||0),D[1]/(e.shape[1]||0),(D[2]||0)/i]);for(let D of Object.keys(C0))k.annotations[D]=C0[D].map(U=>k.mesh[U]);k.score=k.faceScore;let R={...S1(k.mesh,p),confidence:p.confidence,landmarks:p.landmarks};k.box=S2(R,e),k.boxRaw=j2(R,e),A.push(R)}r.dispose(N)}else{k.box=S2(p,e),k.boxRaw=j2(p,e),k.score=k.boxScore,k.mesh=p.landmarks.map(N=>[(p.startPoint[0]+p.endPoint[0])/2+(p.endPoint[0]+p.startPoint[0])*N[0]/Fe(),(p.startPoint[1]+p.endPoint[1])/2+(p.endPoint[1]+p.startPoint[1])*N[1]/Fe()]),k.meshRaw=k.mesh.map(N=>[N[0]/(e.shape[2]||0),N[1]/(e.shape[1]||0),(N[2]||0)/i]);for(let N of Object.keys(Te))k.annotations[N]=[k.mesh[Te[N]]]}k.score>(((P=t.face.detector)==null?void 0:P.minConfidence)||1)?s.push(k):r.dispose(k.tensor)}return q0.boxes=A,s}async function V1(e){var t,n,o,s,A,a;return M.initial&&(K=null),((t=e.face.attention)==null?void 0:t.enabled)&&(K==null?void 0:K.signature)&&Object.keys(((n=K==null?void 0:K.signature)==null?void 0:n.outputs)||{}).length<6&&(K=null),K?e.debug&&h("cached model:",K.modelUrl):(o=e.face.attention)!=null&&o.enabled?K=await L(e.face.attention.modelPath):K=await L((s=e.face.mesh)==null?void 0:s.modelPath),n2=K.executor&&((A=K==null?void 0:K.inputs)==null?void 0:A[0].shape)?(a=K==null?void 0:K.inputs)==null?void 0:a[0].shape[2]:256,K}var Z1=ve,X1=e2;var xs=["angry","disgust","fear","happy","sad","surprise","neutral"],I0,O2=[],q1=0,U1=0,Ft=Number.MAX_SAFE_INTEGER;async function Y1(e){var t;return M.initial&&(I0=null),I0?e.debug&&h("cached model:",I0.modelUrl):I0=await L((t=e.face.emotion)==null?void 0:t.modelPath),I0}async function Bt(e,t,n,o){var a,i;if(!I0)return[];let s=Ft<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),A=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>T()-U1;return t.skipAllowed&&A&&s&&q1===o&&O2[n]&&O2[n].length>0?(Ft++,O2[n]):(Ft=0,new Promise(async c=>{var y;let x=[];if((y=t.face.emotion)!=null&&y.enabled){let l={},f=I0!=null&&I0.inputs[0].shape?I0.inputs[0].shape[2]:0;l.resize=r.image.resizeBilinear(e,[f,f],!1),l.channels=r.mul(l.resize,O.rgb),l.grayscale=r.sum(l.channels,3,!0),l.grayscaleSub=r.sub(l.grayscale,O.tf05),l.grayscaleMul=r.mul(l.grayscaleSub,O.tf2),l.emotion=I0==null?void 0:I0.execute(l.grayscaleMul),U1=T();let d=await l.emotion.data();for(let u=0;u(t.face.emotion.minConfidence||0)&&x.push({score:Math.min(.99,Math.trunc(100*d[u])/100),emotion:xs[u]});x.sort((u,m)=>m.score-u.score),Object.keys(l).forEach(u=>r.dispose(l[u]))}O2[n]=x,q1=o,c(x)}))}var f0,ce=[],J1=0,Q1=0,Ht=Number.MAX_SAFE_INTEGER;async function _1(e){var t;return M.initial&&(f0=null),f0?e.debug&&h("cached model:",f0.modelUrl):f0=await L((t=e.face.description)==null?void 0:t.modelPath),f0}function ds(e){let t=e.image||e.tensor||e;if(!(f0!=null&&f0.inputs[0].shape))return t;let n=r.image.resizeBilinear(t,[f0.inputs[0].shape[2],f0.inputs[0].shape[1]],!1),o=r.mul(n,O.tf255);return r.dispose(n),o}async function Gt(e,t,n,o){var i,c,x,y;let s={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(f0!=null&&f0.executor))return s;let A=Ht<(((i=t.face.description)==null?void 0:i.skipFrames)||0),a=(((c=t.face.description)==null?void 0:c.skipTime)||0)>T()-J1;return t.skipAllowed&&A&&a&&Q1===o&&((x=ce==null?void 0:ce[n])==null?void 0:x.age)>0&&((y=ce==null?void 0:ce[n])==null?void 0:y.genderScore)>0?(Ht++,ce[n]):(Ht=0,new Promise(async l=>{var f;if((f=t.face.description)!=null&&f.enabled){let d=ds(e),u=f0==null?void 0:f0.execute(d);J1=T(),r.dispose(d);let g=await u.find(B=>B.shape[1]===1).data(),P=Math.trunc(200*Math.abs(g[0]-.5))/100;P>(t.face.description.minConfidence||0)&&(s.gender=g[0]<=.5?"female":"male",s.genderScore=Math.min(.99,P));let v=r.argMax(u.find(B=>B.shape[1]===100),1),p=(await v.data())[0];r.dispose(v);let j=await u.find(B=>B.shape[1]===100).data();s.age=Math.round(j[p-1]>j[p+1]?10*p-100*j[p-1]:10*p+100*j[p+1])/10,(Number.isNaN(g[0])||Number.isNaN(j[0]))&&h("faceres error:",{model:f0,result:u});let k=u.find(B=>B.shape[1]===1024),N=k?await k.data():[];s.descriptor=Array.from(N),u.forEach(B=>r.dispose(B))}ce[n]=s,Q1=o,l(s)}))}var Ge=.1,Vt=.5;function ys(e,t,n){let o=!1,s=n.length-1;for(let A=0;At!=n[s].y>t&&e<(n[s].x-n[A].x)*(t-n[A].y)/(n[s].y-n[A].y)+n[A].x&&(o=!o);return o}async function e3(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),s=[];for(let a of C0.silhouette)s.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});Ge&&Ge>0&&(s=s.map(a=>({x:a.x>.5?a.x+Ge:a.x-Ge,y:a.y>.5?a.y+Ge:a.y-Ge})));for(let a=0;aT()-n3,A=Zt<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&s&&A&&t3===o&&C2[n]?(Zt++,C2[n]):(Zt=0,new Promise(async c=>{let x=r.image.resizeBilinear(e,[x0!=null&&x0.inputs[0].shape?x0.inputs[0].shape[2]:0,x0!=null&&x0.inputs[0].shape?x0.inputs[0].shape[1]:0],!1),y=x0==null?void 0:x0.execute(x),l=(await y.data())[0];C2[n]=Math.round(100*l)/100,t3=o,n3=T(),r.dispose([x,y]),c(C2[n])}))}var d0,W2=[],qt=Number.MAX_SAFE_INTEGER,s3=0,A3=0;async function a3(e){var t;return M.initial&&(d0=null),d0?e.debug&&h("cached model:",d0.modelUrl):d0=await L((t=e.face.liveness)==null?void 0:t.modelPath),d0}async function Ut(e,t,n,o){var a,i;if(!(d0!=null&&d0.executor))return 0;let s=(((a=t.face.liveness)==null?void 0:a.skipTime)||0)>T()-A3,A=qt<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&s&&A&&s3===o&&W2[n]?(qt++,W2[n]):(qt=0,new Promise(async c=>{let x=r.image.resizeBilinear(e,[d0!=null&&d0.inputs[0].shape?d0.inputs[0].shape[2]:0,d0!=null&&d0.inputs[0].shape?d0.inputs[0].shape[1]:0],!1),y=d0==null?void 0:d0.execute(x),l=(await y.data())[0];W2[n]=Math.round(100*l)/100,s3=o,A3=T(),r.dispose([x,y]),c(W2[n])}))}var W0,Yt=[],ms=["white","black","asian","indian","other"],ps=[15,23,28,35.5,45.5,55.5,65],l3=0,c3=0,Kt=Number.MAX_SAFE_INTEGER;async function x3(e){var t;return M.initial&&(W0=null),W0?e.debug&&h("cached model:",W0.modelUrl):W0=await L((t=e.face.gear)==null?void 0:t.modelPath),W0}async function Jt(e,t,n,o){var a,i;if(!W0)return{age:0,gender:"unknown",genderScore:0,race:[]};let s=Kt<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),A=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>T()-c3;return t.skipAllowed&&A&&s&&l3===o&&Yt[n]?(Kt++,Yt[n]):(Kt=0,new Promise(async c=>{var P,v;if(!(W0!=null&&W0.inputs[0].shape))return;let x={},y=[[0,.1,.9,.9]];x.resize=r.image.cropAndResize(e,y,[0],[W0.inputs[0].shape[2],W0.inputs[0].shape[1]]);let l={age:0,gender:"unknown",genderScore:0,race:[]};(P=t.face.gear)!=null&&P.enabled&&([x.age,x.gender,x.race]=W0.execute(x.resize,["age_output","gender_output","race_output"]));let f=await x.gender.data();l.gender=f[0]>f[1]?"male":"female",l.genderScore=Math.round(100*(f[0]>f[1]?f[0]:f[1]))/100;let d=await x.race.data();for(let p=0;p(((v=t.face.gear)==null?void 0:v.minConfidence)||.2)&&l.race.push({score:Math.round(100*d[p])/100,race:ms[p]});l.race.sort((p,b)=>b.score-p.score);let m=Array.from(await x.age.data()).map((p,b)=>[ps[b],p]).sort((p,b)=>b[1]-p[1]),g=m[0][0];for(let p=1;pr.dispose(x[p])),Yt[n]=l,l3=o,c3=T(),c(l)}))}var M0,D2=[],y3=0,f3=0,Qt=Number.MAX_SAFE_INTEGER;async function m3(e){return M.initial&&(M0=null),M0?e.debug&&h("cached model:",M0.modelUrl):M0=await L(e.face.ssrnet.modelPathAge),M0}async function _t(e,t,n,o){var a,i,c,x;if(!M0)return{age:0};let s=Qt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>T()-f3;return t.skipAllowed&&s&&A&&y3===o&&((c=D2[n])==null?void 0:c.age)&&((x=D2[n])==null?void 0:x.age)>0?(Qt++,D2[n]):(Qt=0,new Promise(async y=>{var d;if(!(M0!=null&&M0.inputs)||!M0.inputs[0]||!M0.inputs[0].shape)return;let l={};l.resize=r.image.resizeBilinear(e,[M0.inputs[0].shape[2],M0.inputs[0].shape[1]],!1),l.enhance=r.mul(l.resize,O.tf255);let f={age:0};if((d=t.face.ssrnet)!=null&&d.enabled&&(l.age=M0.execute(l.enhance)),l.age){let u=await l.age.data();f.age=Math.trunc(10*u[0])/10}Object.keys(l).forEach(u=>r.dispose(l[u])),D2[n]=f,y3=o,f3=T(),y(f)}))}var D0,F2=[],u3=0,h3=0,$t=Number.MAX_SAFE_INTEGER,e5=[.2989,.587,.114];async function b3(e){var t;return M.initial&&(D0=null),D0?e.debug&&h("cached model:",D0.modelUrl):D0=await L((t=e.face.ssrnet)==null?void 0:t.modelPathGender),D0}async function t5(e,t,n,o){var a,i,c,x;if(!D0)return{gender:"unknown",genderScore:0};let s=$t<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>T()-h3;return t.skipAllowed&&s&&A&&u3===o&&((c=F2[n])==null?void 0:c.gender)&&((x=F2[n])==null?void 0:x.genderScore)>0?($t++,F2[n]):($t=0,new Promise(async y=>{var u;if(!(D0!=null&&D0.inputs[0].shape))return;let l={};l.resize=r.image.resizeBilinear(e,[D0.inputs[0].shape[2],D0.inputs[0].shape[1]],!1),l.enhance=r.tidy(()=>{let[m,g,P]=r.split(l.resize,3,3),v=r.mul(m,e5[0]),p=r.mul(g,e5[1]),b=r.mul(P,e5[2]),j=r.addN([v,p,b]);return r.mul(r.sub(j,O.tf05),2)});let f={gender:"unknown",genderScore:0};(u=t.face.ssrnet)!=null&&u.enabled&&(l.gender=D0.execute(l.enhance));let d=await l.gender.data();f.gender=d[0]>d[1]?"female":"male",f.genderScore=d[0]>d[1]?Math.trunc(100*d[0])/100:Math.trunc(100*d[1])/100,Object.keys(l).forEach(m=>r.dispose(l[m])),F2[n]=f,u3=o,h3=T(),y(f)}))}var P0,n5=[],T3=0,v3=0,R3=Number.MAX_SAFE_INTEGER;async function M3(e){var t;return M.initial&&(P0=null),P0?e.debug&&h("cached model:",P0.modelUrl):P0=await L((t=e.face.mobilefacenet)==null?void 0:t.modelPath),P0}async function o5(e,t,n,o){var a,i;if(!(P0!=null&&P0.executor))return[];let s=R3<(((a=t.face.mobilefacenet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.mobilefacenet)==null?void 0:i.skipTime)||0)>T()-v3;return t.skipAllowed&&A&&s&&T3===o&&n5[n]?(R3++,n5[n]):new Promise(async c=>{var y;let x=[];if(((y=t.face.mobilefacenet)==null?void 0:y.enabled)&&(P0==null?void 0:P0.inputs[0].shape)){let l={};l.crop=r.image.resizeBilinear(e,[P0.inputs[0].shape[2],P0.inputs[0].shape[1]],!1),l.data=P0.execute(l.crop);let f=await l.data.data();x=Array.from(f),Object.keys(l).forEach(d=>r.dispose(l[d]))}n5[n]=x,T3=o,v3=T(),c(x)})}var k0,r5=[],k3=0,w3=0,E3=Number.MAX_SAFE_INTEGER;async function z3(e){return M.initial&&(k0=null),k0?e.debug&&h("cached model:",k0.modelUrl):k0=await L(e.face.insightface.modelPath),k0}async function s5(e,t,n,o){var a,i;if(!(k0!=null&&k0.executor))return[];let s=E3<(((a=t.face.insightface)==null?void 0:a.skipFrames)||0),A=(((i=t.face.insightface)==null?void 0:i.skipTime)||0)>T()-w3;return t.skipAllowed&&A&&s&&k3===o&&r5[n]?(E3++,r5[n]):new Promise(async c=>{var y;let x=[];if(((y=t.face.insightface)==null?void 0:y.enabled)&&(k0==null?void 0:k0.inputs[0].shape)){let l={};l.crop=r.image.resizeBilinear(e,[k0.inputs[0].shape[2],k0.inputs[0].shape[1]],!1),l.data=k0.execute(l.crop);let f=await l.data.data();x=Array.from(f),Object.keys(l).forEach(d=>r.dispose(l[d]))}r5[n]=x,k3=o,w3=T(),c(x)})}var us=e=>{let t=(l,f)=>Math.atan2(l[1]-f[1],l[0]-f[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,s=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),A=s?e.mesh[473]:e.mesh[468],a=s?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=s?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],c=[(a[0]-A[0])/i[0]-n[0],o*(A[1]-a[1])/i[1]-n[1]],x=Math.sqrt(c[0]*c[0]+c[1]*c[1]);return x=Math.min(x,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],c)+Math.PI/2)%Math.PI,strength:x}},j3=(e,t)=>{let n=m=>{let g=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);return m[0]/=g,m[1]/=g,m[2]/=g,m},o=(m,g)=>{let P=m[0]-g[0],v=m[1]-g[1],p=m[2]-g[2];return[P,v,p]},s=(m,g)=>{let P=m[1]*g[2]-m[2]*g[1],v=m[2]*g[0]-m[0]*g[2],p=m[0]*g[1]-m[1]*g[0];return[P,v,p]},A=m=>{let[g,P,v,p,b,j,k,N,B]=m,q,W,Z;return p<1?p>-1?(Z=Math.asin(p),W=Math.atan2(-k,g),q=Math.atan2(-j,b)):(Z=-Math.PI/2,W=-Math.atan2(N,B),q=0):(Z=Math.PI/2,W=Math.atan2(N,B),q=0),Number.isNaN(q)&&(q=0),Number.isNaN(W)&&(W=0),Number.isNaN(Z)&&(Z=0),{pitch:2*-q,yaw:2*-W,roll:2*-Z}},a=e.meshRaw;if(!a||a.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let i=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,c=[a[10],a[152],a[234],a[454]].map(m=>[m[0]*t[0]/i,m[1]*t[1]/i,m[2]]),x=n(o(c[1],c[0])),y=n(o(c[3],c[2])),l=n(s(y,x));y=s(x,l);let f=[y[0],y[1],y[2],x[0],x[1],x[2],l[0],l[1],l[2]],d=A(f),u=a.length===478?us(e):{bearing:0,strength:0};return{angle:d,matrix:f,gaze:u}};function I3(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var A5=async(e,t)=>{var u,m,g,P,v,p,b,j,k,N,B,q,W,Z,J,R,D,U,H,a0,o0,C,F;let n=T(),o,s,A,a,i,c,x,y,l,f=[];e.state="run:face";let d=await G1(t,e.config);if(e.performance.face=M.perfadd?(e.performance.face||0)+Math.trunc(T()-n):Math.trunc(T()-n),!t.shape||t.shape.length!==4)return[];if(!d)return[];for(let S=0;S200?j3(d[S],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(m=e.config.face.emotion)!=null&&m.enabled?Bt(d[S].tensor||r.tensor([]),e.config,S,d.length):[]:(e.state="run:emotion",n=T(),a=(g=e.config.face.emotion)!=null&&g.enabled?await Bt(d[S].tensor||r.tensor([]),e.config,S,d.length):[],e.performance.emotion=M.perfadd?(e.performance.emotion||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?x=(P=e.config.face.antispoof)!=null&&P.enabled?Xt(d[S].tensor||r.tensor([]),e.config,S,d.length):0:(e.state="run:antispoof",n=T(),x=(v=e.config.face.antispoof)!=null&&v.enabled?await Xt(d[S].tensor||r.tensor([]),e.config,S,d.length):0,e.performance.antispoof=M.perfadd?(e.performance.antispoof||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?y=(p=e.config.face.liveness)!=null&&p.enabled?Ut(d[S].tensor||r.tensor([]),e.config,S,d.length):0:(e.state="run:liveness",n=T(),y=(b=e.config.face.liveness)!=null&&b.enabled?await Ut(d[S].tensor||r.tensor([]),e.config,S,d.length):0,e.performance.liveness=M.perfadd?(e.performance.antispoof||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?s=(j=e.config.face.gear)!=null&&j.enabled?Jt(d[S].tensor||r.tensor([]),e.config,S,d.length):null:(e.state="run:gear",n=T(),s=(k=e.config.face.gear)!=null&&k.enabled?await Jt(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.gear=Math.trunc(T()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(N=e.config.face.ssrnet)!=null&&N.enabled?_t(d[S].tensor||r.tensor([]),e.config,S,d.length):null,A=(B=e.config.face.ssrnet)!=null&&B.enabled?t5(d[S].tensor||r.tensor([]),e.config,S,d.length):null):(e.state="run:ssrnet",n=T(),o=(q=e.config.face.ssrnet)!=null&&q.enabled?await _t(d[S].tensor||r.tensor([]),e.config,S,d.length):null,A=(W=e.config.face.ssrnet)!=null&&W.enabled?await t5(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.ssrnet=Math.trunc(T()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(Z=e.config.face.mobilefacenet)!=null&&Z.enabled?o5(d[S].tensor||r.tensor([]),e.config,S,d.length):null:(e.state="run:mobilefacenet",n=T(),i=(J=e.config.face.mobilefacenet)!=null&&J.enabled?await o5(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.mobilefacenet=Math.trunc(T()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?c=(R=e.config.face.insightface)!=null&&R.enabled?s5(d[S].tensor||r.tensor([]),e.config,S,d.length):null:(e.state="run:mobilefacenet",n=T(),c=(D=e.config.face.insightface)!=null&&D.enabled?await s5(d[S].tensor||r.tensor([]),e.config,S,d.length):null,e.performance.mobilefacenet=Math.trunc(T()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?l=Gt(d[S].tensor||r.tensor([]),e.config,S,d.length):(e.state="run:description",n=T(),l=await Gt(d[S].tensor||r.tensor([]),e.config,S,d.length),e.performance.description=M.perfadd?(e.performance.description||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Description:"),e.config.async&&([o,A,a,i,c,l,s,x,y]=await Promise.all([o,A,a,i,c,l,s,x,y])),e.analyze("Finish Face:"),((U=e.config.face.ssrnet)==null?void 0:U.enabled)&&o&&A&&(l={...l,age:o.age,gender:A.gender,genderScore:A.genderScore}),((H=e.config.face.gear)==null?void 0:H.enabled)&&s&&(l={...l,age:s.age,gender:s.gender,genderScore:s.genderScore,race:s.race}),((a0=e.config.face.mobilefacenet)==null?void 0:a0.enabled)&&i&&(l.descriptor=i),((o0=e.config.face.insightface)==null?void 0:o0.enabled)&&c&&(l.descriptor=c);let te=(C=e.config.face.iris)!=null&&C.enabled?I3(d[S],t.shape[2]):0,ne=(F=e.config.face.detector)!=null&&F.return?r.squeeze(d[S].tensor):null;r.dispose(d[S].tensor),d[S].tensor&&delete d[S].tensor;let i0={...d[S],id:S};l.age&&(i0.age=l.age),l.gender&&(i0.gender=l.gender),l.genderScore&&(i0.genderScore=l.genderScore),l.descriptor&&(i0.embedding=l.descriptor),l.race&&(i0.race=l.race),a&&(i0.emotion=a),x&&(i0.real=x),y&&(i0.live=y),te>0&&(i0.distance=te),N0&&(i0.rotation=N0),ne&&(i0.tensor=ne),f.push(i0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),f};var b0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>b0.nameMapping[e],getPoints:e=>b0.pointsMapping[e]},de={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>de.nameMapping[e]},$={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>$.nameMapping[e]},xe=class{constructor(t){E(this,"name");E(this,"curls");E(this,"directions");E(this,"weights");E(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((s,A)=>s+A,0);this.weightsRelative=this.weights.map(s=>s*5/o)}matchAgainst(t,n){let o=0;for(let s in t){let A=t[s],a=this.curls[s];if(typeof a=="undefined"){o+=this.weightsRelative[s];continue}for(let[i,c]of a)if(A===i){o+=c*this.weightsRelative[s];break}}for(let s in n){let A=n[s],a=this.directions[s];if(typeof a=="undefined"){o+=this.weightsRelative[s];continue}for(let[i,c]of a)if(A===i){o+=c*this.weightsRelative[s];break}}return o/10}};var{thumb:H0,index:Q0,middle:_0,ring:Ee,pinky:ze}=b0,{none:G0,half:bs,full:V0}=de,{verticalUp:Ve,verticalDown:Ya,horizontalLeft:a5,horizontalRight:gs,diagonalUpRight:Ts,diagonalUpLeft:Ze,diagonalDownRight:Ka,diagonalDownLeft:Ja}=$,ye=new xe("thumbs up");ye.curl(H0,G0,1);ye.direction(H0,Ve,1);ye.direction(H0,Ze,.25);ye.direction(H0,Ts,.25);for(let e of[b0.index,b0.middle,b0.ring,b0.pinky])ye.curl(e,V0,1),ye.direction(e,a5,1),ye.direction(e,gs,1);var r0=new xe("victory");r0.curl(H0,bs,.5);r0.curl(H0,G0,.5);r0.direction(H0,Ve,1);r0.direction(H0,Ze,1);r0.curl(Q0,G0,1);r0.direction(Q0,Ve,.75);r0.direction(Q0,Ze,1);r0.curl(_0,G0,1);r0.direction(_0,Ve,1);r0.direction(_0,Ze,.75);r0.curl(Ee,V0,1);r0.direction(Ee,Ve,.2);r0.direction(Ee,Ze,1);r0.direction(Ee,a5,.2);r0.curl(ze,V0,1);r0.direction(ze,Ve,.2);r0.direction(ze,Ze,1);r0.direction(ze,a5,.2);r0.weight(Q0,2);r0.weight(_0,2);var fe=new xe("point");fe.curl(H0,V0,1);fe.curl(Q0,G0,.5);fe.curl(_0,V0,.5);fe.curl(Ee,V0,.5);fe.curl(ze,V0,.5);fe.weight(Q0,2);fe.weight(_0,2);var me=new xe("middle finger");me.curl(H0,G0,1);me.curl(Q0,V0,.5);me.curl(_0,V0,.5);me.curl(Ee,V0,.5);me.curl(ze,V0,.5);me.weight(Q0,2);me.weight(_0,2);var Xe=new xe("open palm");Xe.curl(H0,G0,.75);Xe.curl(Q0,G0,.75);Xe.curl(_0,G0,.75);Xe.curl(Ee,G0,.75);Xe.curl(ze,G0,.75);var N3=[ye,r0,fe,me,Xe];var vs=.7,Se={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function L3(e,t,n,o){let s=(t-o)/(e-n),A=Math.atan(s)*180/Math.PI;return A<=0?A=-A:A>0&&(A=180-A),A}function C3(e,t){if(!e||!t)return[0,0];let n=L3(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=L3(e[1],e[2],t[1],t[2]);return[n,o]}function O3(e,t=1){let n=0,o=0,s=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:s=1*t,[n,o,s]}function Rs(e,t,n){let o=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],i=e[1]-n[1],c=t[1]-n[1],x=e[2]-t[2],y=e[2]-n[2],l=t[2]-n[2],f=Math.sqrt(o*o+a*a+x*x),d=Math.sqrt(s*s+i*i+y*y),u=Math.sqrt(A*A+c*c+l*l),m=(u*u+f*f-d*d)/(2*u*f);m>1?m=1:m<-1&&(m=-1);let g=Math.acos(m);g=57.2958*g%180;let P;return g>Se.NO_CURL_START_LIMIT?P=de.none:g>Se.HALF_CURL_START_LIMIT?P=de.half:P=de.full,P}function W3(e,t,n,o){let s;return o===Math.abs(e)?e>0?s=$.horizontalLeft:s=$.horizontalRight:o===Math.abs(t)?t>0?s=$.horizontalLeft:s=$.horizontalRight:n>0?s=$.horizontalLeft:s=$.horizontalRight,s}function D3(e,t,n,o){let s;return o===Math.abs(e)?e<0?s=$.verticalDown:s=$.verticalUp:o===Math.abs(t)?t<0?s=$.verticalDown:s=$.verticalUp:n<0?s=$.verticalDown:s=$.verticalUp,s}function Ms(e,t,n,o,s,A,a,i){let c,x=D3(e,t,n,o),y=W3(s,A,a,i);return x===$.verticalUp?y===$.horizontalLeft?c=$.diagonalUpLeft:c=$.diagonalUpRight:y===$.horizontalLeft?c=$.diagonalDownLeft:c=$.diagonalDownRight,c}function Ps(e,t,n,o){let s=e[0]-t[0],A=e[0]-n[0],a=t[0]-n[0],i=e[1]-t[1],c=e[1]-n[1],x=t[1]-n[1],y=Math.max(Math.abs(s),Math.abs(A),Math.abs(a)),l=Math.max(Math.abs(i),Math.abs(c),Math.abs(x)),f=0,d=0,u=0,m=l/(y+1e-5);m>1.5?f+=Se.DISTANCE_VOTE_POWER:m>.66?d+=Se.DISTANCE_VOTE_POWER:u+=Se.DISTANCE_VOTE_POWER;let g=Math.sqrt(s*s+i*i),P=Math.sqrt(A*A+c*c),v=Math.sqrt(a*a+x*x),p=Math.max(g,P,v),b=e[0],j=e[1],k=n[0],N=n[1];p===g?(k=n[0],N=n[1]):p===v&&(b=t[0],j=t[1]);let W=C3([b,j],[k,N]),Z=O3(W,Se.TOTAL_ANGLE_VOTE_POWER);f+=Z[0],d+=Z[1],u+=Z[2];for(let R of o){let D=O3(R,Se.SINGLE_ANGLE_VOTE_POWER);f+=D[0],d+=D[1],u+=D[2]}let J;return f===Math.max(f,d,u)?J=D3(c,i,x,l):u===Math.max(d,u)?J=W3(A,s,a,y):J=Ms(c,i,x,l,A,s,a,y),J}function F3(e){let t=[],n=[],o=[],s=[];if(!e)return{curls:o,directions:s};for(let A of b0.all){let a=b0.getPoints(A),i=[],c=[];for(let x of a){let y=e[x[0]],l=e[x[1]],f=C3(y,l),d=f[0],u=f[1];i.push(d),c.push(u)}t.push(i),n.push(c)}for(let A of b0.all){let a=A===b0.thumb?1:0,i=b0.getPoints(A),c=e[i[a][0]],x=e[i[a+1][1]],y=e[i[3][1]],l=Rs(c,x,y),f=Ps(c,x,y,t[A].slice(a));o[A]=l,s[A]=f}return{curls:o,directions:s}}function B2(e){if(!e||e.length===0)return null;let t=F3(e),n={};for(let o of b0.all)n[b0.getName(o)]={curl:de.getName(t.curls[o]),direction:$.getName(t.directions[o])};return n}function B3(e){let t=[];if(!e||e.length===0)return t;let n=F3(e);for(let o of N3){let s=o.matchAgainst(n.curls,n.directions);s>=vs&&t.push({name:o.name,confidence:s})}return t}var H3=e=>{if(!e)return[];let t=[];for(let n=0;nc.part==="leftWrist"),s=e[n].keypoints.find(c=>c.part==="rightWrist"),A=e[n].keypoints.find(c=>c.part==="nose");A&&o&&s&&o.position[1]c.part==="leftShoulder"),i=e[n].keypoints.find(c=>c.part==="rightShoulder");a&&i&&Math.abs(a.positionRaw[1]-i.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${a.position[1]>i.position[1]?"left":"right"}`})}return t},G3=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),s=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/s)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let i=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));i>10&&t.push({face:n,gesture:`mouth ${Math.trunc(i)}% open`});let c=e[n].mesh[152][2]||0;Math.abs(c)>10&&t.push({face:n,gesture:`head ${c<0?"up":"down"}`})}return t},V3=e=>{var n,o,s,A;if(!e)return[];let t=[];for(let a=0;a.06||g>.06)&&(d=!1),m>g?m>.05&&t.push({iris:a,gesture:"looking right"}):g>.05&&t.push({iris:a,gesture:"looking left"});let P=Math.abs(e[a].mesh[145][1]-e[a].annotations.rightEyeIris[0][1])/e[a].box[3],v=Math.abs(e[a].mesh[374][1]-e[a].annotations.leftEyeIris[0][1])/e[a].box[3];(v<.01||P<.01||v>.022||P>.022)&&(d=!1),(v<.01||P<.01)&&t.push({iris:a,gesture:"looking down"}),(v>.022||P>.022)&&t.push({iris:a,gesture:"looking up"}),d&&t.push({iris:a,gesture:"looking center"})}return t},Z3=e=>{if(!e)return[];let t=[];for(let n=0;n0){let s=o.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:n,gesture:`${s.name} forward`});let A=o.reduce((a,i)=>a.position[1][A[0]*t[0],A[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:s,confidence:e.confidence}}function G2(e,t=1.5){let n=o2(e),o=H2(e),s=[t*o[0]/2,t*o[1]/2],A=[n[0]-s[0],n[1]-s[1]],a=[n[0]+s[0],n[1]+s[1]];return{startPoint:A,endPoint:a,palmLandmarks:e.palmLandmarks}}function V2(e){let t=o2(e),n=H2(e),s=Math.max(...n)/2,A=[t[0]-s,t[1]-s],a=[t[0]+s,t[1]+s];return{startPoint:A,endPoint:a,palmLandmarks:e.palmLandmarks}}function ws(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function K3(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return ws(n)}var X3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function pe(e,t){let n=0;for(let o=0;o[a.x,a.y]),this.anchorsTensor=r.tensor2d(this.anchors),this.inputSize=((A=(s=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:s.shape)==null?void 0:A[2])||0,this.inputSizeTensor=r.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=r.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=r.slice(t,[0,0],[-1,2]),n.boxSizes=r.slice(t,[0,2],[-1,2]),n.div=r.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=r.add(n.div,this.anchorsTensor),n.halfBoxSizes=r.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=r.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=r.mul(n.sub,this.inputSizeTensor),n.add=r.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=r.mul(n.add,this.inputSizeTensor);let o=r.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(s=>r.dispose(n[s])),o}normalizeLandmarks(t,n){let o={};o.reshape=r.reshape(t,[-1,7,2]),o.div=r.div(o.reshape,this.inputSizeTensor),o.landmarks=r.add(o.div,this.anchors[n]?this.anchors[n]:0);let s=r.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(A=>r.dispose(o[A])),s}async predict(t,n){var i;let o={};o.resize=r.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=r.div(o.resize,O.tf127),o.image=r.sub(o.div,O.tf1),o.batched=this.model.execute(o.image),o.predictions=r.squeeze(o.batched),o.slice=r.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=r.sigmoid(o.slice),o.scores=r.squeeze(o.sigmoid);let s=await o.scores.data();o.boxes=r.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await r.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((i=n.hand)==null?void 0:i.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let A=await o.nms.array(),a=[];for(let c of A){let x={};x.box=r.slice(o.norm,[c,0],[1,-1]),x.slice=r.slice(o.predictions,[c,5],[1,14]),x.norm=this.normalizeLandmarks(x.slice,c),x.palmLandmarks=r.reshape(x.norm,[-1,2]);let y=await x.box.data(),l=y.slice(0,2),f=y.slice(2,4),d=await x.palmLandmarks.array(),u={startPoint:l,endPoint:f,palmLandmarks:d,confidence:s[c]},m=Y3(u,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);a.push(m),Object.keys(x).forEach(g=>r.dispose(x[g]))}return Object.keys(o).forEach(c=>r.dispose(o[c])),a}};var js=5,$3=1.65,en=[0,5,9,13,17,1,2],Is=0,Ns=2,tn=0,X2=class{constructor(t,n){E(this,"handDetector");E(this,"handPoseModel");E(this,"inputSize");E(this,"storedBoxes");E(this,"skipped");E(this,"detectedHands");var o,s,A;this.handDetector=t,this.handPoseModel=n,this.inputSize=((A=(s=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:s[0].shape)==null?void 0:A[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(a=>a[0]),o=t.map(a=>a[1]),s=[Math.min(...n),Math.min(...o)],A=[Math.max(...n),Math.max(...o)];return{startPoint:s,endPoint:A}}getBoxForPalmLandmarks(t,n){let o=t.map(A=>c5([...A,1],n)),s=this.calculateLandmarksBoundingBox(o);return G2(V2(s),js)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=G2(V2(n),$3);o.palmLandmarks=[];for(let s=0;s[a[0]*(d[0]-this.inputSize/2),a[1]*(d[1]-this.inputSize/2),a[2]*d[2]]),c=l5(o,[0,0]),x=i.map(d=>[...c5(d,c),d[2]]),y=J3(s),l=[...o2(n),1],f=[pe(l,y[0]),pe(l,y[1])];return x.map(d=>[Math.trunc(d[0]+f[0]),Math.trunc(d[1]+f[1]),Math.trunc(d[2])])}async estimateHands(t,n){let o=!1,s,A=(n.hand.skipTime||0)>T()-tn,a=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&A&&a&&(s=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,s&&s.length>0&&(s.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...s],this.storedBoxes.length>0&&(o=!0));let i=[];for(let c=0;c=n.hand.minConfidence/4){let j=r.reshape(p,[-1,3]),k=await j.array();r.dispose(p),r.dispose(j);let N=this.transformRawCoords(k,m,y,u),B=this.getBoxForHandLandmarks(N);this.storedBoxes[c]={...B,confidence:b};let q={landmarks:N,confidence:b,boxConfidence:x.confidence,fingerConfidence:b,box:{topLeft:B.startPoint,bottomRight:B.endPoint}};i.push(q)}else this.storedBoxes[c]=null;r.dispose(p)}else{let y=G2(V2(x),$3),l={confidence:x.confidence,boxConfidence:x.confidence,fingerConfidence:0,box:{topLeft:y.startPoint,bottomRight:y.endPoint},landmarks:[]};i.push(l)}}return this.storedBoxes=this.storedBoxes.filter(c=>c!==null),this.detectedHands=i.length,i.length>n.hand.maxDetected&&(i.length=n.hand.maxDetected),i}};var nn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},je,Ie,on;async function x5(e,t){let n=await on.estimateHands(e,t);if(!n)return[];let o=[];for(let s=0;sn[s].landmarks[l]);let a=n[s].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],c=[0,0,0,0];if(a&&a.length>0){for(let y of a)y[0]i[2]&&(i[2]=y[0]),y[1]>i[3]&&(i[3]=y[1]);i[2]-=i[0],i[3]-=i[1],c=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=n[s].box?[Math.trunc(Math.max(0,n[s].box.topLeft[0])),Math.trunc(Math.max(0,n[s].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[s].box.bottomRight[0])-Math.max(0,n[s].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[s].box.bottomRight[1])-Math.max(0,n[s].box.topLeft[1]))]:[0,0,0,0],c=[n[s].box.topLeft[0]/(e.shape[2]||0),n[s].box.topLeft[1]/(e.shape[1]||0),(n[s].box.bottomRight[0]-n[s].box.topLeft[0])/(e.shape[2]||0),(n[s].box.bottomRight[1]-n[s].box.topLeft[1])/(e.shape[1]||0)];let x=B2(a);o.push({id:s,score:Math.round(100*n[s].confidence)/100,boxScore:Math.round(100*n[s].boxConfidence)/100,fingerScore:Math.round(100*n[s].fingerConfidence)/100,label:"hand",box:i,boxRaw:c,keypoints:a,annotations:A,landmarks:x})}return o}async function rn(e){var n,o;M.initial&&(je=null,Ie=null),!je||!Ie?[je,Ie]=await Promise.all([e.hand.enabled?L((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?L((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&h("cached model:",je.modelUrl),e.debug&&h("cached model:",Ie.modelUrl));let t=je?new Z2(je):void 0;return t&&Ie&&(on=new X2(t,Ie)),[je,Ie]}var n0=[null,null],Os=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],ue=[[0,0],[0,0]],Cs=["hand","fist","pinch","point","face","tip","pinchtip"],An=4,an=1.6,Ws=512,Ds=1.4,q2=Number.MAX_SAFE_INTEGER,d5=0,$0=[0,0],t0={boxes:[],hands:[]},ln={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function cn(e){var t;if(M.initial&&(n0[0]=null),n0[0])e.debug&&h("cached model:",n0[0].modelUrl);else{u2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),n0[0]=await L((t=e.hand.detector)==null?void 0:t.modelPath);let n=n0[0].executor?Object.values(n0[0].modelSignature.inputs):void 0;ue[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,ue[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return n0[0]}async function xn(e){var t;if(M.initial&&(n0[1]=null),n0[1])e.debug&&h("cached model:",n0[1].modelUrl);else{n0[1]=await L((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=n0[1].executor?Object.values(n0[1].modelSignature.inputs):void 0;ue[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,ue[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return n0[1]}async function Fs(e,t){let n=[];if(!e||!n0[0])return n;let o={},s=(e.shape[2]||1)/(e.shape[1]||1),A=Math.min(Math.round((e.shape[1]||0)/8)*8,Ws),a=Math.round(A*s/8)*8;o.resize=r.image.resizeBilinear(e,[A,a]),o.cast=r.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await n0[0].executeAsync(o.cast,Os),o.boxes=r.squeeze(o.rawBoxes,[0,2]),o.scores=r.squeeze(o.rawScores,[0]);let i=r.unstack(o.scores,1);r.dispose(i[An]),i.splice(An,1),o.filtered=r.stack(i,1),r.dispose(i),o.max=r.max(o.filtered,1),o.argmax=r.argMax(o.filtered,1);let c=0;o.nms=await r.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let x=await o.nms.data(),y=await o.max.data(),l=await o.argmax.data();for(let f of Array.from(x)){let d=r.slice(o.boxes,f,1),u=await d.data();r.dispose(d);let m=[u[1],u[0],u[3]-u[1],u[2]-u[0]],g=P2(m,Ds),P=[Math.trunc(m[0]*$0[0]),Math.trunc(m[1]*$0[1]),Math.trunc(m[2]*$0[0]),Math.trunc(m[3]*$0[1])],v=y[f],p=Cs[l[f]],b={id:c++,score:v,box:P,boxRaw:g,label:p};n.push(b)}return Object.keys(o).forEach(f=>r.dispose(o[f])),n.sort((f,d)=>d.score-f.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function y5(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&n0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let s={},A=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];s.crop=r.image.cropAndResize(e,[A],[0],[ue[1][0],ue[1][1]],"bilinear"),s.div=r.div(s.crop,O.tf255),[s.score,s.keypoints]=n0[1].execute(s.div,["Identity_1","Identity"]);let a=(await s.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(n.hand.minConfidence||0)){o.fingerScore=i,s.reshaped=r.reshape(s.keypoints,[-1,3]);let y=(await s.reshaped.array()).map(l=>[l[0]/ue[1][1],l[1]/ue[1][0],l[2]||0]).map(l=>[l[0]*t.boxRaw[2],l[1]*t.boxRaw[3],l[2]||0]);o.keypoints=y.map(l=>[$0[0]*(l[0]+t.boxRaw[0]),$0[1]*(l[1]+t.boxRaw[1]),l[2]||0]),o.landmarks=B2(o.keypoints);for(let l of Object.keys(ln))o.annotations[l]=ln[l].map(f=>o.landmarks&&o.keypoints[f]?o.keypoints[f]:null)}Object.keys(s).forEach(c=>r.dispose(s[c]))}return o}async function f5(e,t){var s,A;if(!((s=n0[0])!=null&&s.executor)||!((A=n0[1])!=null&&A.executor)||!n0[0].inputs[0].shape||!n0[1].inputs[0].shape)return[];$0=[e.shape[2]||0,e.shape[1]||0],q2++;let n=(t.hand.skipTime||0)>T()-d5,o=q2<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?t0.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>T()-d5,c=q2<3*(t.hand.skipFrames||0);t.skipAllowed&&t0.hands.length===t.hand.maxDetected?t0.hands=await Promise.all(t0.boxes.map(y=>y5(e,y,t))):t.skipAllowed&&i&&c&&t0.hands.length>0?t0.hands=await Promise.all(t0.boxes.map(y=>y5(e,y,t))):(t0.boxes=await Fs(e,t),d5=T(),t0.hands=await Promise.all(t0.boxes.map(y=>y5(e,y,t))),q2=0);let x=[...t0.boxes];if(t0.boxes.length=0,t.cacheSensitivity>0)for(let y=0;y.05&&l.box[3]/(e.shape[1]||1)>.05&&t0.hands[y].fingerScore&&t0.hands[y].fingerScore>(t.hand.minConfidence||0)){let f=P2(l.box,an),d=P2(l.boxRaw,an);t0.boxes.push({...x[y],box:f,boxRaw:d})}}for(let y=0;y({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var r2={};oe(r2,{connected:()=>Y2,horizontal:()=>m5,kpt:()=>U2,relative:()=>u5,vertical:()=>p5});var U2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],m5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],p5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],u5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],Y2={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var z=ee(),h5=0;function yn(e,t){var a,i,c,x,y,l,f,d,u,m,g,P,v,p,b,j,k,N,B,q,W,Z,J;let n=T();if(!e)return ee();let o=Date.now()-e.timestamp,s=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(z.canvas=e.canvas),e.error&&(z.error=e.error),!z.body||e.body.length!==z.body.length)z.body=JSON.parse(JSON.stringify(e.body));else for(let R=0;R((s-1)*z.body[R].box[F]+C)/s),U=e.body[R].boxRaw.map((C,F)=>((s-1)*z.body[R].boxRaw[F]+C)/s),H=e.body[R].keypoints.map((C,F)=>{var S,N0,te,ne,i0,Ye,C5,W5,D5;return{score:C.score,part:C.part,position:[z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[0]||0)+(C.position[0]||0))/s:C.position[0],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[1]||0)+(C.position[1]||0))/s:C.position[1],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[2]||0)+(C.position[2]||0))/s:C.position[2]],positionRaw:[z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[0]||0)+(C.positionRaw[0]||0))/s:C.positionRaw[0],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[1]||0)+(C.positionRaw[1]||0))/s:C.positionRaw[1],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[2]||0)+(C.positionRaw[2]||0))/s:C.positionRaw[2]],distance:[z.body[R].keypoints[F]?((s-1)*(((S=z.body[R].keypoints[F].distance)==null?void 0:S[0])||0)+(((N0=C.distance)==null?void 0:N0[0])||0))/s:(te=C.distance)==null?void 0:te[0],z.body[R].keypoints[F]?((s-1)*(((ne=z.body[R].keypoints[F].distance)==null?void 0:ne[1])||0)+(((i0=C.distance)==null?void 0:i0[1])||0))/s:(Ye=C.distance)==null?void 0:Ye[1],z.body[R].keypoints[F]?((s-1)*(((C5=z.body[R].keypoints[F].distance)==null?void 0:C5[2])||0)+(((W5=C.distance)==null?void 0:W5[2])||0))/s:(D5=C.distance)==null?void 0:D5[2]]}}),a0={},o0={connected:{}};(a=t.body.modelPath)!=null&&a.includes("efficientpose")?o0=E2:(i=t.body.modelPath)!=null&&i.includes("blazepose")?o0=R2:(c=t.body.modelPath)!=null&&c.includes("movenet")&&(o0=r2);for(let[C,F]of Object.entries(o0.connected)){let S=[];for(let N0=0;N0i0.part===F[N0]),ne=H.find(i0=>i0.part===F[N0+1]);te&&ne&&S.push([te.position,ne.position])}a0[C]=S}z.body[R]={...e.body[R],box:D,boxRaw:U,keypoints:H,annotations:a0}}if(!z.hand||e.hand.length!==z.hand.length)z.hand=JSON.parse(JSON.stringify(e.hand));else for(let R=0;R((s-1)*z.hand[R].box[C]+o0)/s),U=e.hand[R].boxRaw.map((o0,C)=>((s-1)*z.hand[R].boxRaw[C]+o0)/s);z.hand[R].keypoints.length!==e.hand[R].keypoints.length&&(z.hand[R].keypoints=e.hand[R].keypoints);let H=e.hand[R].keypoints&&e.hand[R].keypoints.length>0?e.hand[R].keypoints.map((o0,C)=>o0.map((F,S)=>((s-1)*(z.hand[R].keypoints[C][S]||1)+(F||0))/s)):[],a0={};if(Object.keys(z.hand[R].annotations).length!==Object.keys(e.hand[R].annotations).length)z.hand[R].annotations=e.hand[R].annotations,a0=z.hand[R].annotations;else if(e.hand[R].annotations)for(let o0 of Object.keys(e.hand[R].annotations))a0[o0]=(l=(y=(x=e.hand[R])==null?void 0:x.annotations)==null?void 0:y[o0])!=null&&l[0]?e.hand[R].annotations[o0].map((C,F)=>C.map((S,N0)=>((s-1)*z.hand[R].annotations[o0][F][N0]+S)/s)):null;z.hand[R]={...e.hand[R],box:D,boxRaw:U,keypoints:H,annotations:a0}}if(!z.face||e.face.length!==z.face.length)z.face=JSON.parse(JSON.stringify(e.face));else for(let R=0;R((s-1)*z.face[R].box[a0]+H)/s),U=e.face[R].boxRaw.map((H,a0)=>((s-1)*z.face[R].boxRaw[a0]+H)/s);if(e.face[R].rotation){let H={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};H.matrix=(f=e.face[R].rotation)==null?void 0:f.matrix,H.angle={roll:((s-1)*(((u=(d=z.face[R].rotation)==null?void 0:d.angle)==null?void 0:u.roll)||0)+(((g=(m=e.face[R].rotation)==null?void 0:m.angle)==null?void 0:g.roll)||0))/s,yaw:((s-1)*(((v=(P=z.face[R].rotation)==null?void 0:P.angle)==null?void 0:v.yaw)||0)+(((b=(p=e.face[R].rotation)==null?void 0:p.angle)==null?void 0:b.yaw)||0))/s,pitch:((s-1)*(((k=(j=z.face[R].rotation)==null?void 0:j.angle)==null?void 0:k.pitch)||0)+(((B=(N=e.face[R].rotation)==null?void 0:N.angle)==null?void 0:B.pitch)||0))/s},H.gaze={bearing:((s-1)*(((q=z.face[R].rotation)==null?void 0:q.gaze.bearing)||0)+(((W=e.face[R].rotation)==null?void 0:W.gaze.bearing)||0))/s,strength:((s-1)*(((Z=z.face[R].rotation)==null?void 0:Z.gaze.strength)||0)+(((J=e.face[R].rotation)==null?void 0:J.gaze.strength)||0))/s},z.face[R]={...e.face[R],rotation:H,box:D,boxRaw:U}}else z.face[R]={...e.face[R],box:D,boxRaw:U}}if(!z.object||e.object.length!==z.object.length)z.object=JSON.parse(JSON.stringify(e.object));else for(let R=0;R((s-1)*z.object[R].box[a0]+H)/s),U=e.object[R].boxRaw.map((H,a0)=>((s-1)*z.object[R].boxRaw[a0]+H)/s);z.object[R]={...e.object[R],box:D,boxRaw:U}}if(e.persons){let R=e.persons;if(!z.persons||R.length!==z.persons.length)z.persons=JSON.parse(JSON.stringify(R));else for(let D=0;D((s-1)*z.persons[D].box[H]+U)/s)}e.gesture&&(z.gesture=e.gesture),z.width=e.width,z.height=e.height;let A=T();return h5=M.perfadd?h5+Math.round(A-n):Math.round(A-n),e.performance&&(z.performance={...e.performance,interpolate:h5}),z}var m0;async function b5(e){return!m0||M.initial?m0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",m0.modelUrl),m0}async function fn(e,t){var s;if(m0||(m0=await b5(t)),!(m0!=null&&m0.executor)||!((s=m0==null?void 0:m0.inputs)!=null&&s[0].shape))return null;let n={};n.resize=r.image.resizeBilinear(e,[m0.inputs[0].shape?m0.inputs[0].shape[1]:0,m0.inputs[0].shape?m0.inputs[0].shape[2]:0],!1),n.norm=r.div(n.resize,O.tf255),n.res=m0.execute(n.norm),n.squeeze=r.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=r.unstack(n.squeeze,2),n.fg=r.softmax(n.fgRaw),n.mul=r.mul(n.fg,O.tf255),n.expand=r.expandDims(n.mul,2),n.output=r.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r.squeeze(e),n.concat=r.concat([n.input,n.output],-1),o=r.cast(n.concat,"int32");break;case"alpha":o=r.cast(n.output,"int32");break;default:o=r.tensor(0)}return Object.keys(n).forEach(A=>r.dispose(n[A])),o}var T5={};oe(T5,{distance:()=>g5,find:()=>Gs,similarity:()=>Hs});function g5(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let s=0;s{if(e===0)return 1;let A=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(A,1),0)};function Hs(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=g5(e,t,n);return pn(o,n.order||2,n.min||0,n.max||1)}function Gs(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,s=-1;for(let a=0;aa2,validateModel:()=>tt});var un=.005,w0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function v5(e){for(let t of m5){let n=e.keypoints.findIndex(s=>s.part===t[0]),o=e.keypoints.findIndex(s=>s.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]s&&s.part===t[0]),o=e.keypoints.findIndex(s=>s&&s.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]x&&x.part===t[0]),s=e.keypoints.findIndex(x=>x&&x.part===t[1]),A=e.keypoints.findIndex(x=>x&&x.part===n[0]),a=e.keypoints.findIndex(x=>x&&x.part===n[1]);if(!e.keypoints[A]||!e.keypoints[a])continue;let i=e.keypoints[o]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[o].position[0])]:[0,0],c=e.keypoints[s]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[s].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[s].position[0])]:[0,0];if(i[0]>i[1]||c[0]>c[1]){let x=e.keypoints[o];e.keypoints[o]=e.keypoints[s],e.keypoints[s]=x}}}function hn(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=r.pad(e,w0.padding),n.resize=r.image.resizeBilinear(n.pad,[t,t]);let o=r.cast(n.resize,"int32");return Object.keys(n).forEach(a=>r.dispose(n[a])),o}function gn(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+w0.padding[2][0]+w0.padding[2][1])/t[0]-w0.padding[2][0],o.position[1]*(t[1]+w0.padding[1][0]+w0.padding[1][1])/t[1]-w0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=J0(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var s0,K2=0,R5=Number.MAX_SAFE_INTEGER,Ne={boxes:[],bodies:[],last:0};async function Tn(e){var t;return M.initial&&(s0=null),s0?e.debug&&h("cached model:",s0.modelUrl):(u2(["size"],e),s0=await L(e.body.modelPath)),K2=(s0==null?void 0:s0.executor)&&((t=s0==null?void 0:s0.inputs)==null?void 0:t[0].shape)?s0.inputs[0].shape[2]:0,K2<64&&(K2=256),s0}function Zs(e,t,n){let o=e[0][0],s=[],A=0;for(let y=0;yt.body.minConfidence){let l=[o[y][1],o[y][0]];s.push({score:Math.round(100*A)/100,part:U2[y],positionRaw:l,position:[Math.round((n.shape[2]||0)*l[0]),Math.round((n.shape[1]||0)*l[1])]})}A=s.reduce((y,l)=>l.score>y?l.score:y,0);let a=[],i=J0(s.map(y=>y.position),[n.shape[2],n.shape[1]]),c={};for(let[y,l]of Object.entries(Y2)){let f=[];for(let d=0;dg.part===l[d]),m=s.find(g=>g.part===l[d+1]);u&&m&&u.score>(t.body.minConfidence||0)&&m.score>(t.body.minConfidence||0)&&f.push([u.position,m.position])}c[y]=f}let x={id:0,score:A,box:i.box,boxRaw:i.boxRaw,keypoints:s,annotations:c};return v5(x),a.push(x),a}function Xs(e,t,n){let o=[];for(let s=0;st.body.minConfidence){let i=[];for(let l=0;l<17;l++){let f=A[3*l+2];if(f>t.body.minConfidence){let d=[A[3*l+1],A[3*l+0]];i.push({part:U2[l],score:Math.round(100*f)/100,positionRaw:d,position:[Math.round((n.shape[2]||0)*d[0]),Math.round((n.shape[1]||0)*d[1])]})}}let c=J0(i.map(l=>l.position),[n.shape[2],n.shape[1]]),x={};for(let[l,f]of Object.entries(Y2)){let d=[];for(let u=0;uP.part===f[u]),g=i.find(P=>P.part===f[u+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&d.push([m.position,g.position])}x[l]=d}let y={id:s,score:a,box:c.box,boxRaw:c.boxRaw,keypoints:[...i],annotations:x};v5(y),o.push(y)}}return o.sort((s,A)=>A.score-s.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function M5(e,t){var s;if(!(s0!=null&&s0.executor)||!((s=s0==null?void 0:s0.inputs)!=null&&s[0].shape))return[];t.skipAllowed||(Ne.boxes.length=0),R5++;let n=(t.body.skipTime||0)>T()-Ne.last,o=R5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?Ne.bodies:new Promise(async A=>{let a={};R5=0,a.input=bn(e,K2),a.res=s0==null?void 0:s0.execute(a.input),Ne.last=T();let i=await a.res.array();Ne.bodies=a.res.shape[2]===17?Zs(i,t,e):Xs(i,t,e);for(let c of Ne.bodies)gn(c,[e.shape[2]||1,e.shape[1]||1]),hn(c.keypoints);Object.keys(a).forEach(c=>r.dispose(a[c])),A(Ne.bodies)})}var F0,J2=[],Rn=0,P5=Number.MAX_SAFE_INTEGER,_2=0,Q2=2.5;async function Mn(e){if(!F0||M.initial){F0=await L(e.object.modelPath);let t=F0!=null&&F0.executor?Object.values(F0.modelSignature.inputs):void 0;_2=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&h("cached model:",F0.modelUrl);return F0}async function qs(e,t,n){var x,y;let o=0,s=[],A=_2;for(let l of[1,2,4]){let f=l*13,d=r.squeeze(e.find(p=>p.shape[1]===f**2&&(p.shape[2]||0)===Ce.length)),u=await d.array(),m=r.squeeze(e.find(p=>p.shape[1]===f**2&&(p.shape[2]||0)(n.object.minConfidence||0)&&b!==61){let k=(.5+Math.trunc(p%f))/f,N=(.5+Math.trunc(p/f))/f,B=v[p].map(H=>H*(f/l/A)),[q,W]=[k-Q2/l*B[0],N-Q2/l*B[1]],[Z,J]=[k+Q2/l*B[2]-q,N+Q2/l*B[3]-W],R=[q,W,Z,J];R=R.map(H=>Math.max(0,Math.min(H,1)));let D=[R[0]*t[0],R[1]*t[1],R[2]*t[0],R[3]*t[1]],U={id:o++,score:Math.round(100*j)/100,class:b+1,label:Ce[b].label,box:D.map(H=>Math.trunc(H)),boxRaw:R};s.push(U)}}r.dispose([d,m,g,P])}let a=s.map(l=>[l.boxRaw[1],l.boxRaw[0],l.boxRaw[3],l.boxRaw[2]]),i=s.map(l=>l.score),c=[];if(a&&a.length>0){let l=await r.image.nonMaxSuppressionAsync(a,i,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);c=Array.from(await l.data()),r.dispose(l)}return s=s.filter((l,f)=>c.includes(f)).sort((l,f)=>f.score-l.score),s}async function k5(e,t){if(!(F0!=null&&F0.executor))return[];let n=(t.object.skipTime||0)>T()-Rn,o=P5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&J2.length>0?(P5++,J2):(P5=0,!M.kernels.includes("mod")||!M.kernels.includes("sparsetodense")?J2:new Promise(async s=>{let A=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[_2,_2],!1),i=r.div(a,O.tf255),c=r.transpose(i,[0,3,1,2]),x;t.object.enabled&&(x=F0.execute(c)),Rn=T();let y=await qs(x,A,t);J2=y,r.dispose([a,i,c,...x]),s(y)}))}var A2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],Us=A2.length,s2=A2.reduce((e,t,n)=>(e[t]=n,e),{}),Ys=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],H7=Ys.map(([e,t])=>[s2[e],s2[t]]),kn=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function wn(e){let t=e.reduce(({maxX:n,maxY:o,minX:s,minY:A},{position:{x:a,y:i}})=>({maxX:Math.max(n,a),maxY:Math.max(o,i),minX:Math.min(s,a),minY:Math.min(A,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function En(e,[t,n],[o,s]){let A=t/o,a=n/s,i=(x,y)=>({id:y,score:x.score,boxRaw:[x.box[0]/s,x.box[1]/o,x.box[2]/s,x.box[3]/o],box:[Math.trunc(x.box[0]*a),Math.trunc(x.box[1]*A),Math.trunc(x.box[2]*a),Math.trunc(x.box[3]*A)],keypoints:x.keypoints.map(({score:l,part:f,position:d})=>({score:l,part:f,position:[Math.trunc(d.x*a),Math.trunc(d.y*A)],positionRaw:[d.x/o,d.y/o]})),annotations:{}});return e.map((x,y)=>i(x,y))}var $2=class{constructor(t,n){E(this,"priorityQueue");E(this,"numberOfElements");E(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function zn(e,t,n,o){let s=n-e,A=o-t;return s*s+A*A}function S5(e,t){return{x:e.x+t.x,y:e.y+t.y}}var E0,Js=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],et=1,qe=16,Qs=50**2;function Sn(e,t,n,o,s,A,a=2){let i=P=>({y:A.get(P.y,P.x,e),x:A.get(P.y,P.x,A.shape[2]/2+e)}),c=(P,v,p)=>({y:z5(Math.round(P.y/qe),0,v-1),x:z5(Math.round(P.x/qe),0,p-1)}),[x,y]=o.shape,l=c(t.position,x,y),f=i(l),u=S5(t.position,f);for(let P=0;P[s2[f],s2[d]]),a=A.map(([,f])=>f),i=A.map(([f])=>f),c=t.shape[2],x=a.length,y=new Array(c),l=E5(e.part,qe,n);y[e.part.id]={score:e.score,part:A2[e.part.id],position:l};for(let f=x-1;f>=0;--f){let d=a[f],u=i[f];y[d]&&!y[u]&&(y[u]=Sn(f,y[d],u,t,n,s))}for(let f=0;ft){i=!1;break}if(!i)break}return i}function eA(e,t){let[n,o,s]=t.shape,A=new $2(n*o*s,({score:a})=>a);for(let a=0;a{var a;let A=(a=s[o])==null?void 0:a.position;return A?zn(n,t,A.y,A.x)<=Qs:!1})}function tA(e,t){return t.reduce((o,{position:s,score:A},a)=>(jn(e,s,a)||(o+=A),o),0)/t.length}function nA(e,t,n,o,s,A){let a=[],i=eA(A,t);for(;a.lengthd.score>A);let l=tA(a,y),f=wn(y);l>A&&a.push({keypoints:y,box:f,score:Math.round(100*l)/100})}return a}async function j5(e,t){if(!(E0!=null&&E0.executor))return[];let n=r.tidy(()=>{if(!E0.inputs[0].shape)return[];let a=r.image.resizeBilinear(e,[E0.inputs[0].shape[2],E0.inputs[0].shape[1]]),i=r.sub(r.div(r.cast(a,"float32"),127.5),1),x=E0.execute(i,Js).map(y=>r.squeeze(y,[0]));return x[1]=r.sigmoid(x[1]),x}),o=await Promise.all(n.map(a=>a.buffer()));for(let a of n)r.dispose(a);let s=nA(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return E0.inputs[0].shape?En(s,[e.shape[1],e.shape[2]],[E0.inputs[0].shape[2],E0.inputs[0].shape[1]]):[]}async function In(e){return!E0||M.initial?E0=await L(e.body.modelPath):e.debug&&h("cached model:",E0.modelUrl),E0}var U0,oA=["fgr","pha","r1o","r2o","r3o","r4o"],A0={},N5=0;function On(e){r.dispose([A0.r1i,A0.r2i,A0.r3i,A0.r4i,A0.downsample_ratio]),A0.r1i=r.tensor(0),A0.r2i=r.tensor(0),A0.r3i=r.tensor(0),A0.r4i=r.tensor(0),N5=e.segmentation.ratio||.5,A0.downsample_ratio=r.tensor(N5)}async function L5(e){return!U0||M.initial?U0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",U0.modelUrl),On(e),U0}var Ln=e=>r.tidy(()=>{let t=r.squeeze(e,[0]),n=r.mul(t,O.tf255);return r.cast(n,"int32")});function I5(e,t){let n=e?Ln(e):r.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?Ln(t):r.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),s=r.concat([n,o],-1);return r.dispose([n,o]),s}function rA(e){return r.tidy(()=>{let t={};return t.unstack=r.unstack(e,-1),t.concat=r.concat(t.unstack,1),t.split=r.split(t.concat,4,1),t.stack=r.concat(t.split,2),t.squeeze=r.squeeze(t.stack,[0]),t.expand=r.expandDims(t.squeeze,-1),t.add=r.add(t.expand,1),t.mul=r.mul(t.add,127.5),t.cast=r.cast(t.mul,"int32"),t.tile=r.tile(t.cast,[1,1,3]),t.alpha=r.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),r.concat([t.tile,t.alpha],-1)})}async function Cn(e,t){if(U0||(U0=await L5(t)),!(U0!=null&&U0.executor))return null;A0.src=r.div(e,255),N5!==t.segmentation.ratio&&On(t);let[n,o,s,A,a,i]=await U0.executeAsync(A0,oA),c;switch(t.segmentation.mode||"default"){case"default":c=I5(n,o);break;case"alpha":c=I5(null,o);break;case"foreground":c=I5(n,null);break;case"state":c=rA(s);break;default:c=r.tensor(0)}return r.dispose([A0.src,n,o,A0.r1i,A0.r2i,A0.r3i,A0.r4i]),[A0.r1i,A0.r2i,A0.r3i,A0.r4i]=[s,A,a,i],c}var p0;async function O5(e){return!p0||M.initial?p0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",p0.modelUrl),p0}async function Dn(e,t){var s;if(p0||(p0=await O5(t)),!(p0!=null&&p0.executor)||!((s=p0==null?void 0:p0.inputs)!=null&&s[0].shape))return null;let n={};n.resize=r.image.resizeBilinear(e,[p0.inputs[0].shape?p0.inputs[0].shape[1]:0,p0.inputs[0].shape?p0.inputs[0].shape[2]:0],!1),n.norm=r.div(n.resize,O.tf255),n.res=p0.execute(n.norm),n.squeeze=r.squeeze(n.res,[0]),n.alpha=r.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=r.mul(n.alpha,O.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r.squeeze(e),n.concat=r.concat([n.input,n.mul],-1),o=r.cast(n.concat,"int32");break;case"alpha":o=r.cast(n.mul,"int32");break;default:o=r.tensor(0)}return Object.keys(n).forEach(A=>r.dispose(n[A])),o}function tt(e,t,n){var x,y;if(!t||!((x=e==null?void 0:e.config)!=null&&x.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],s=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],A=[],a=[],i=t.modelUrl,c=t.executor;if((y=c==null?void 0:c.graph)!=null&&y.nodes)for(let l of Object.values(c.graph.nodes)){let f=l.op.toLowerCase();A.includes(f)||A.push(f)}else!c&&e.config.debug&&h("model not loaded",n);for(let l of A)!o.includes(l)&&!s.includes(l)&&!e.env.kernels.includes(l)&&!e.env.kernels.includes(l.replace("_",""))&&!e.env.kernels.includes(l.replace("native",""))&&!e.env.kernels.includes(l.replace("v2",""))&&a.push(l);return e.config.debug&&a.length>0&&h("model validation failed:",n,a),a.length>0?{name:n,missing:a,ops:A,url:i}:null}var a2=class{constructor(t){E(this,"instance");E(this,"models",{});this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let A of Object.values(y0))t+=A.sizeFromManifest,n+=A.sizeLoadedWeights,o+=A.sizeDesired;let s=o>0?n/o:0;return{numLoadedModels:Object.values(y0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:s,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(y0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(t){var o,s,A,a,i,c,x,y,l,f,d,u,m,g,P,v,p,b,j,k,N,B,q,W,Z,J,R;M.initial&&this.reset(),t&&(this.instance=t);let n={};n.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?I1(this.instance.config):null,n.antispoof=this.instance.config.face.enabled&&((o=this.instance.config.face.antispoof)==null?void 0:o.enabled)&&!this.models.antispoof?o3(this.instance.config):null,n.liveness=this.instance.config.face.enabled&&((s=this.instance.config.face.liveness)==null?void 0:s.enabled)&&!this.models.liveness?a3(this.instance.config):null,n.faceres=this.instance.config.face.enabled&&((A=this.instance.config.face.description)==null?void 0:A.enabled)&&!this.models.faceres?_1(this.instance.config):null,n.emotion=this.instance.config.face.enabled&&((a=this.instance.config.face.emotion)==null?void 0:a.enabled)&&!this.models.emotion?Y1(this.instance.config):null,n.iris=this.instance.config.face.enabled&&((i=this.instance.config.face.iris)==null?void 0:i.enabled)&&!((c=this.instance.config.face.attention)!=null&&c.enabled)&&!this.models.iris?D1(this.instance.config):null,n.facemesh=this.instance.config.face.enabled&&((x=this.instance.config.face.mesh)==null?void 0:x.enabled)&&!this.models.facemesh?V1(this.instance.config):null,n.gear=this.instance.config.face.enabled&&((y=this.instance.config.face.gear)==null?void 0:y.enabled)&&!this.models.gear?x3(this.instance.config):null,n.ssrnetage=this.instance.config.face.enabled&&((l=this.instance.config.face.ssrnet)==null?void 0:l.enabled)&&!this.models.ssrnetage?m3(this.instance.config):null,n.ssrnetgender=this.instance.config.face.enabled&&((f=this.instance.config.face.ssrnet)==null?void 0:f.enabled)&&!this.models.ssrnetgender?b3(this.instance.config):null,n.mobilefacenet=this.instance.config.face.enabled&&((d=this.instance.config.face.mobilefacenet)==null?void 0:d.enabled)&&!this.models.mobilefacenet?M3(this.instance.config):null,n.insightface=this.instance.config.face.enabled&&((u=this.instance.config.face.insightface)==null?void 0:u.enabled)&&!this.models.insightface?z3(this.instance.config):null,n.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((m=this.instance.config.body.modelPath)==null?void 0:m.includes("blazepose"))?f1(this.instance.config):null,n.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?y1(this.instance.config):null,n.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((g=this.instance.config.body.modelPath)==null?void 0:g.includes("efficientpose"))?g1(this.instance.config):null,n.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((P=this.instance.config.body.modelPath)==null?void 0:P.includes("movenet"))?Tn(this.instance.config):null,n.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((v=this.instance.config.body.modelPath)==null?void 0:v.includes("posenet"))?In(this.instance.config):null,n.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((b=(p=this.instance.config.hand.detector)==null?void 0:p.modelPath)==null?void 0:b.includes("handtrack"))?cn(this.instance.config):null,n.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((k=(j=this.instance.config.hand.detector)==null?void 0:j.modelPath)==null?void 0:k.includes("handtrack"))?xn(this.instance.config):null,(B=(N=this.instance.config.hand.detector)==null?void 0:N.modelPath)!=null&&B.includes("handdetect")&&([n.handpose,n.handskeleton]=this.models.handpose?[null,null]:await rn(this.instance.config)),n.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((q=this.instance.config.object.modelPath)==null?void 0:q.includes("centernet"))?u1(this.instance.config):null,n.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((W=this.instance.config.object.modelPath)==null?void 0:W.includes("nanodet"))?Mn(this.instance.config):null,n.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&((Z=this.instance.config.segmentation.modelPath)==null?void 0:Z.includes("selfie"))?O5(this.instance.config):null,n.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&((J=this.instance.config.segmentation.modelPath)==null?void 0:J.includes("meet"))?b5(this.instance.config):null,n.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((R=this.instance.config.segmentation.modelPath)==null?void 0:R.includes("rvm"))?L5(this.instance.config):null;for(let[D,U]of Object.entries(n))U!=null&&U.then&&U.then(H=>this.models[D]=H);await Promise.all(Object.values(n))}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(y0).find(s=>s.startsWith(n.name));!o||(n.size=y0[o].sizeLoadedWeights,n.url=y0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let s=tt(this.instance,o,n);s&&t.push(s)}return t}};function Hn(e,t,n,o,s){var i,c,x,y,l,f;let A=0,a=[];for(let d of e){let u={id:A++,face:d,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let b of t)d.box[0]>b.box[0]&&d.box[0]b.box[1]&&d.box[1]+d.box[3]u.body.box[0]&&b.box[0]+b.box[2]u.body.box[1]&&b.box[1]+b.box[3]u.body.box[0]&&b.box[1]+b.box[3]>u.body.box[1]&&b.box[1]+b.box[3]{b&&b.length===4&&(m.push(b[0],b[0]+b[2]),g.push(b[1],b[1]+b[3]))};P(u.face.box),P((y=u.body)==null?void 0:y.box),P((l=u.hands.left)==null?void 0:l.box),P((f=u.hands.right)==null?void 0:f.box);let v=Math.min(...m),p=Math.min(...g);u.box=[v,p,Math.max(...m)-v,Math.max(...g)-p],(s==null?void 0:s[1])&&(s==null?void 0:s[2])&&(u.boxRaw=[u.box[0]/s[2],u.box[1]/s[1],u.box[2]/s[2],u.box[3]/s[1]]),a.push(u)}return a}var nt=` + gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var ut=0;function Hr(e,t,n){let o=Q(e0,n);if(!t||!e)return;let s=S0(e);if(!!s){s.lineJoin="round",s.font=o.font;for(let A=0;ATt,kpt:()=>gt});var gt=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],Tt={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var j0,Pe=224,A1,Zr=5,M2=[8,16,32,32,32];function Xr(){let e=[],t=0;for(;tn.x)),y:r.tensor1d(e.map(n=>n.y))}}async function a1(e){if(M.initial&&(j0=null),!j0&&e.body.detector&&e.body.detector.modelPath){j0=await L(e.body.detector.modelPath);let t=j0!=null&&j0.executor?Object.values(j0.modelSignature.inputs):void 0;Pe=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&j0&&h("cached model:",j0.modelUrl);return Xr(),j0}var s1=[5,5];function qr(e,t){return r.tidy(()=>{let n=r.split(e,12,1),o=r.squeeze(n[0]),s=r.squeeze(n[1]),A=r.squeeze(n[2]),a=r.squeeze(n[3]);o=r.add(r.div(o,Pe),t.x),s=r.add(r.div(s,Pe),t.y),A=r.mul(r.div(A,Pe),s1[0]),a=r.mul(r.div(a,Pe),s1[1]);let i=r.sub(o,r.div(A,2)),c=r.sub(s,r.div(a,2)),d=r.add(i,A),y=r.add(c,a);return r.stack([i,c,d,y],1)})}async function Ur(e,t,n,o){var d,y;let s=[],A={};A.boxes=qr(e,A1),A.scores=r.sigmoid(t),A.nms=await r.image.nonMaxSuppressionAsync(A.boxes,A.scores,1,((d=n.body.detector)==null?void 0:d.minConfidence)||.1,((y=n.body.detector)==null?void 0:y.iouThreshold)||.1);let a=await A.nms.data(),i=await A.scores.data(),c=await A.boxes.array();for(let l of Array.from(a)){let f=i[l],x=c[l],u=[Math.round(x[0]*o[0]),Math.round(x[1]*o[1]),Math.round(x[2]*o[0]),Math.round(x[3]*o[1])],m={score:f,boxRaw:x,box:u};s.push(m)}return Object.keys(A).forEach(l=>r.dispose(A[l])),s}async function i1(e,t,n){let o={};o.res=j0==null?void 0:j0.execute(e,["Identity"]),o.logitsRaw=r.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=r.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=r.squeeze(o.logitsRaw),o.boxes=r.squeeze(o.boxesRaw);let s=await Ur(o.boxes,o.logits,t,n);return Object.keys(o).forEach(A=>r.dispose(o[A])),s}function J0(e,t=[1,1]){let n=[e.map(i=>i[0]),e.map(i=>i[1])],o=[Math.min(...n[0]),Math.min(...n[1])],s=[Math.max(...n[0]),Math.max(...n[1])],A=[o[0],o[1],s[0]-o[0],s[1]-o[1]],a=[A[0]/t[0],A[1]/t[1],A[2]/t[0],A[3]/t[1]];return{box:A,boxRaw:a}}function l1(e,t=[1,1]){let n=[e.map(d=>d[0]),e.map(d=>d[1])],o=[Math.min(...n[0]),Math.min(...n[1])],s=[Math.max(...n[0]),Math.max(...n[1])],A=[(o[0]+s[0])/2,(o[1]+s[1])/2],a=Math.max(A[0]-o[0],A[1]-o[1],-A[0]+s[0],-A[1]+s[1]),i=[Math.trunc(A[0]-a),Math.trunc(A[1]-a),Math.trunc(2*a),Math.trunc(2*a)],c=[i[0]/t[0],i[1]/t[1],i[2]/t[0],i[3]/t[1]];return{box:i,boxRaw:c}}function P2(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var g0,Rt=256,vt=Number.MAX_SAFE_INTEGER,Yr={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},w2=[],ae=[[0,0],[0,0],[0,0],[0,0]],c1=0,d1=e=>1-1/(1+Math.exp(e)),y1=e=>a1(e);async function f1(e){if(M.initial&&(g0=null),g0)e.debug&&h("cached model:",g0.modelUrl);else{g0=await L(e.body.modelPath);let t=g0!=null&&g0.executor?Object.values(g0.modelSignature.inputs):void 0;Rt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return g0}function x1(e,t,n){var A,a;let o={};if(!((A=e==null?void 0:e.shape)!=null&&A[1])||!((a=e==null?void 0:e.shape)!=null&&a[2]))return e;let s;if(n&&(o.cropped=r.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let i=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],c=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];ae=[[0,0],i,c,[0,0]],o.pad=r.pad(o.cropped||e,ae),o.resize=r.image.resizeBilinear(o.pad,[t,t]),s=r.div(o.resize,O.tf255)}else e.shape[1]!==t?(o.resize=r.image.resizeBilinear(o.cropped||e,[t,t]),s=r.div(o.resize,O.tf255)):s=r.div(o.cropped||e,O.tf255);return Object.keys(o).forEach(i=>r.dispose(o[i])),s}function Kr(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+ae[2][0]+ae[2][1])/t[0]-ae[2][0]),Math.trunc(o.position[1]*(t[1]+ae[1][0]+ae[1][1])/t[1]-ae[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],s=n[3]-n[1];for(let A of e)A.positionRaw=[A.positionRaw[0]/s+n[1],A.positionRaw[1]/o+n[0],A.positionRaw[2]],A.position=[Math.trunc(A.positionRaw[0]*t[0]),Math.trunc(A.positionRaw[1]*t[1]),A.positionRaw[2]]}return e}function Jr(e){let t=e.find(i=>i.part==="leftPalm"),n=e.find(i=>i.part==="leftWrist"),o=e.find(i=>i.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let s=e.find(i=>i.part==="rightPalm"),A=e.find(i=>i.part==="rightWrist"),a=e.find(i=>i.part==="rightIndex");s.position[2]=((A.position[2]||0)+(a.position[2]||0))/2}async function Qr(e,t,n){if(!(g0!=null&&g0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=g0==null?void 0:g0.execute(e,Yr.landmarks);let s=(await o.poseflag.data())[0],A=await o.ld.data(),a=await o.world.data();Object.keys(o).forEach(u=>r.dispose(o[u]));let i=[],c=5;for(let u=0;uu.position),l=J0(y,[n[0],n[1]]),f={};for(let[u,m]of Object.entries(Tt)){let g=[];for(let P=0;Pb.part===m[P]),p=d.find(b=>b.part===m[P+1]);v&&p&&g.push([v.position,p.position])}f[u]=g}return{id:0,score:Math.trunc(100*s)/100,box:l.box,boxRaw:l.boxRaw,keypoints:d,annotations:f}}async function Mt(e,t){var A,a,i;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>T()-c1,s=vt<(t.body.skipFrames||0);if(t.skipAllowed&&o&&s&&w2!==null)vt++;else{let c=[];if((a=(A=t.body)==null?void 0:A.detector)!=null&&a.enabled){let d=x1(e,224);c=await i1(d,t,n),r.dispose(d)}else c=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let d=0;dr.dispose(o[d])),s}async function wt(e,t){if(!(T0!=null&&T0.executor))return[];let n=(t.object.skipTime||0)>T()-p1,o=kt<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&Pt.length>0?(kt++,Pt):(kt=0,new Promise(async s=>{let A=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[ke,ke]),i=t.object.enabled?T0==null?void 0:T0.execute(a,["tower_0/detections"]):null;p1=T(),r.dispose(a);let c=await _r(i,A,t);Pt=c,s(c)}))}var E2={};oe(E2,{connected:()=>zt,kpt:()=>Et});var Et=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],zt={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var _,b1=0,h0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},St=Number.MAX_SAFE_INTEGER;async function g1(e){return M.initial&&(_=null),_?e.debug&&h("cached model:",_.modelUrl):_=await L(e.body.modelPath),_}async function $r(e,t){let[n,o]=e.shape,s=r.reshape(e,[o*n]),A=r.max(s,0),a=(await A.data())[0];if(a>t){let i=r.argMax(s,0),c=r.mod(i,n),d=(await c.data())[0],y=r.div(i,n),l=(await y.data())[0];return r.dispose([s,A,i,c,y]),[d,l,a]}return r.dispose([s,A]),[0,0,a]}async function jt(e,t){if(!(_!=null&&_.executor)||!(_!=null&&_.inputs[0].shape))return[];let n=(t.body.skipTime||0)>T()-b1,o=St<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(h0.keypoints).length>0?(St++,[h0]):(St=0,new Promise(async s=>{let A=r.tidy(()=>{var u,m;let l=r.image.resizeBilinear(e,[((u=_==null?void 0:_.inputs[0].shape)==null?void 0:u[2])||0,((m=_==null?void 0:_.inputs[0].shape)==null?void 0:m[1])||0],!1),f=r.mul(l,O.tf2);return r.sub(f,O.tf1)}),a;if(t.body.enabled&&(a=_==null?void 0:_.execute(A)),b1=T(),r.dispose(A),a){h0.keypoints.length=0;let l=r.squeeze(a);r.dispose(a);let f=r.unstack(l,2);r.dispose(l);for(let x=0;x(t.body.minConfidence||0)&&h0.keypoints.push({score:Math.round(100*g)/100,part:Et[x],positionRaw:[u/_.inputs[0].shape[2],m/_.inputs[0].shape[1]],position:[Math.round(e.shape[2]*u/_.inputs[0].shape[2]),Math.round(e.shape[1]*m/_.inputs[0].shape[1])]})}f.forEach(x=>r.dispose(x))}h0.score=h0.keypoints.reduce((l,f)=>f.score>l?f.score:l,0);let i=h0.keypoints.map(l=>l.position[0]),c=h0.keypoints.map(l=>l.position[1]);h0.box=[Math.min(...i),Math.min(...c),Math.max(...i)-Math.min(...i),Math.max(...c)-Math.min(...c)];let d=h0.keypoints.map(l=>l.positionRaw[0]),y=h0.keypoints.map(l=>l.positionRaw[1]);h0.boxRaw=[Math.min(...d),Math.min(...y),Math.max(...d)-Math.min(...d),Math.max(...y)-Math.min(...y)];for(let[l,f]of Object.entries(zt)){let x=[];for(let u=0;uP.part===f[u]),g=h0.keypoints.find(P=>P.part===f[u+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&x.push([m.position,g.position])}h0.annotations[l]=x}s([h0])}))}var We=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],z2=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],S2=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],j2=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],M1=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},It=(e,t,n)=>{let o=t.shape[1],s=t.shape[2],A=[e.startPoint[1]/o,e.startPoint[0]/s,e.endPoint[1]/o,e.endPoint[0]/s],a=r.image.cropAndResize(t,[A],[0],n),i=r.div(a,O.tf255);return r.dispose(a),i},I2=(e,t)=>{let n=z2(e),o=We(e),s=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-s[0],n[1]-s[1]],endPoint:[n[0]+s[0],n[1]+s[1]],landmarks:e.landmarks,confidence:e.confidence}},N2=e=>{let t=z2(e),n=We(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},P1=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},Nt=[[1,0,0],[0,1,0],[0,0,1]],es=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),ts=(e,t)=>es(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var v1=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],we=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let s=0;s{let n=Math.cos(e),o=Math.sin(e),s=[[n,-o,0],[o,n,0],[0,0,1]],A=v1(t[0],t[1]),a=R1(A,s),i=v1(-t[0],-t[1]);return R1(a,i)},os=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-we(t[0],n),-we(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},rs=(e,t)=>[we(e,t[0]),we(e,t[1])];function w1(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[A[0]/s*(x[0]-s/2),A[1]/s*(x[1]-s/2),x[2]||0]),i=n&&n!==0&&Math.abs(n)>.2,c=i?k1(n,[0,0]):Nt,d=i?a.map(x=>[...rs(x,c),x[2]]):a,y=i?os(o):Nt,l=z2(t),f=[we(l,y[0]),we(l,y[1])];return d.map(x=>[Math.trunc(x[0]+f[0]),Math.trunc(x[1]+f[1]),Math.trunc(x[2]||0)])}function z1(e,t,n,o){let s=t.landmarks.length>=ft.count?ft.symmetryLine:Te.symmetryLine,A=0,a=Nt,i;if(e&&M.kernels.includes("rotatewithoffset"))if(A=ts(t.landmarks[s[0]],t.landmarks[s[1]]),A&&A!==0&&Math.abs(A)>.2){let d=z2(t),y=[d[0]/n.shape[2],d[1]/n.shape[1]],l=r.image.rotateWithOffset(n,A,0,[y[0],y[1]]);a=k1(-A,d),i=It(t,l,[o,o]),r.dispose(l)}else i=It(t,n,[o,o]);else i=It(t,n,[o,o]);return[A,a,i]}var ss=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},S1=(e,t)=>{let n=ss(e),o=We(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var j1=6,As=1.4,B0,Ot=null,ie=0,De=null,Fe=()=>ie;async function I1(e){var t;return M.initial&&(B0=null),B0?e.debug&&h("cached model:",B0.modelUrl):B0=await L((t=e.face.detector)==null?void 0:t.modelPath),ie=B0.executor&&B0.inputs[0].shape?B0.inputs[0].shape[2]:256,De=r.scalar(ie,"int32"),Ot=r.tensor2d(w1(ie)),B0}function as(e){if(!Ot||!De)return r.zeros([0,0]);let t={};t.boxStarts=r.slice(e,[0,1],[-1,2]),t.centers=r.add(t.boxStarts,Ot),t.boxSizes=r.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=r.div(t.boxSizes,De),t.centersNormalized=r.div(t.centers,De),t.halfBoxSize=r.div(t.boxSizesNormalized,O.tf2),t.starts=r.sub(t.centersNormalized,t.halfBoxSize),t.ends=r.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=r.mul(t.starts,De),t.endNormalized=r.mul(t.ends,De);let n=r.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>r.dispose(t[o])),n}async function N1(e,t){var i,c,d,y;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=r.image.resizeBilinear(e,[ie,ie]),n.div=r.div(n.resized,O.tf127),n.normalized=r.sub(n.div,O.tf05);let o=B0==null?void 0:B0.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let l=o.sort((f,x)=>f.size-x.size);n.concat384=r.concat([l[0],l[2]],2),n.concat512=r.concat([l[1],l[3]],2),n.concat=r.concat([n.concat512,n.concat384],1),n.batch=r.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=r.squeeze(o[0]):n.batch=r.squeeze(o);r.dispose(o),n.boxes=as(n.batch),n.logits=r.slice(n.batch,[0,0],[-1,1]),n.sigmoid=r.sigmoid(n.logits),n.scores=r.squeeze(n.sigmoid),n.nms=await r.image.nonMaxSuppressionAsync(n.boxes,n.scores,((i=t.face.detector)==null?void 0:i.maxDetected)||0,((c=t.face.detector)==null?void 0:c.iouThreshold)||0,((d=t.face.detector)==null?void 0:d.minConfidence)||0);let s=await n.nms.array(),A=[],a=await n.scores.data();for(let l=0;l(((y=t.face.detector)==null?void 0:y.minConfidence)||0)){let x={};x.bbox=r.slice(n.boxes,[s[l],0],[1,-1]),x.slice=r.slice(n.batch,[s[l],j1-1],[1,-1]),x.squeeze=r.squeeze(x.slice),x.landmarks=r.reshape(x.squeeze,[j1,-1]);let u=await x.bbox.data(),m={startPoint:[u[0],u[1]],endPoint:[u[2],u[3]],landmarks:await x.landmarks.array(),confidence:f},g=M1(m,[(e.shape[2]||0)/ie,(e.shape[1]||0)/ie]),P=I2(g,t.face.scale||As),v=N2(P);A.push(v),Object.keys(x).forEach(p=>r.dispose(x[p]))}}return Object.keys(n).forEach(l=>r.dispose(n[l])),A}var R0,le=0,is=2.3,Ct=C0.leftEyeLower0,Wt=C0.rightEyeLower0,Be={leftBounds:[Ct[0],Ct[Ct.length-1]],rightBounds:[Wt[0],Wt[Wt.length-1]]},He={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function D1(e){var t,n;return M.initial&&(R0=null),R0?e.debug&&h("cached model:",R0.modelUrl):R0=await L((t=e.face.iris)==null?void 0:t.modelPath),le=(R0==null?void 0:R0.executor)&&((n=R0.inputs)==null?void 0:n[0].shape)?R0.inputs[0].shape[2]:0,le===-1&&(le=64),R0}function L2(e,t,n,o){for(let s=0;s{let t=e[Be.leftBounds[0]][2],n=e[Be.rightBounds[0]][2];return t-n},O1=(e,t,n,o,s,A=!1)=>{let a=N2(I2(P1([e[n],e[o]]),is)),i=We(a),c=r.image.cropAndResize(t,[[a.startPoint[1]/s,a.startPoint[0]/s,a.endPoint[1]/s,a.endPoint[0]/s]],[0],[le,le]);if(A&&M.kernels.includes("flipleftright")){let d=r.image.flipLeftRight(c);r.dispose(c),c=d}return{box:a,boxSize:i,crop:c}},C1=(e,t,n,o=!1)=>{let s=[];for(let A=0;A{let o=e[C0[`${n}EyeUpper0`][He.upperCenter]][2],s=e[C0[`${n}EyeLower0`][He.lowerCenter]][2],A=(o+s)/2;return t.map((a,i)=>{let c=A;return i===2?c=o:i===4&&(c=s),[a[0],a[1],c]})};async function F1(e,t,n){if(!(R0!=null&&R0.executor))return e;let{box:o,boxSize:s,crop:A}=O1(e,t,Be.leftBounds[0],Be.leftBounds[1],n,!0),{box:a,boxSize:i,crop:c}=O1(e,t,Be.rightBounds[0],Be.rightBounds[1],n,!0),d=r.concat([A,c]);r.dispose(A),r.dispose(c);let y=R0.execute(d);r.dispose(d);let l=await y.data();r.dispose(y);let f=l.slice(0,He.numCoordinates*3),{rawCoords:x,iris:u}=C1(f,o,s,!0),m=l.slice(He.numCoordinates*3),{rawCoords:g,iris:P}=C1(m,a,i,!1),v=ls(e);Math.abs(v)<30?(L2(e,x,"left",null),L2(e,g,"right",null)):v<1?L2(e,x,"left",["EyeUpper0","EyeLower0"]):L2(e,g,"right",["EyeUpper0","EyeLower0"]);let p=W1(e,u,"left"),b=W1(e,P,"right");return e.concat(p).concat(b)}async function H1(e,t){var A,a,i,c,d,y,l,f,x,u;let n={lips:await((a=(A=t.filter(m=>m.size===160))==null?void 0:A[0])==null?void 0:a.data()),irisL:await((c=(i=t.filter(m=>m.size===10))==null?void 0:i[0])==null?void 0:c.data()),eyeL:await((y=(d=t.filter(m=>m.size===142))==null?void 0:d[0])==null?void 0:y.data()),irisR:await((f=(l=t.filter(m=>m.size===10))==null?void 0:l[1])==null?void 0:f.data()),eyeR:await((u=(x=t.filter(m=>m.size===142))==null?void 0:x[1])==null?void 0:u.data())};for(let m of Object.values(n))if(!m)return e;let o=Re.reduce((m,g)=>m+=e[g][2],0)/Re.length;for(let m=0;mm+=e[g][2],0)/Me.length;for(let m=0;mT()-q0.timestamp,o=q0.skipped<(((d=t.face.detector)==null?void 0:d.skipFrames)||0);!t.skipAllowed||!n||!o||q0.boxes.length===0?(q0.boxes=await N1(e,t),q0.timestamp=T(),q0.skipped=0):q0.skipped++;let s=[],A=[],a=0,i=n2;for(let v=0;vW.shape[W.shape.length-1]===1).data();if(k.faceScore=Math.round(100*q[0])/100,k.faceScore<(((u=t.face.detector)==null?void 0:u.minConfidence)||1)){if(p.confidence=k.faceScore,t.face.mesh.keepInvalid){k.box=S2(p,e),k.boxRaw=j2(p,e),k.score=k.boxScore,k.mesh=p.landmarks.map(W=>[(p.startPoint[0]+p.endPoint[0])/2+(p.endPoint[0]+p.startPoint[0])*W[0]/Fe(),(p.startPoint[1]+p.endPoint[1])/2+(p.endPoint[1]+p.startPoint[1])*W[1]/Fe()]),k.meshRaw=k.mesh.map(W=>[W[0]/(e.shape[2]||1),W[1]/(e.shape[1]||1),(W[2]||0)/i]);for(let W of Object.keys(Te))k.annotations[W]=[k.mesh[Te[W]]]}}else{let W=N.find(D=>D.shape[D.shape.length-1]===1404),Z=r.reshape(W,[-1,3]),J=await Z.array();r.dispose(Z),(m=t.face.attention)!=null&&m.enabled?J=await H1(J,N):(g=t.face.iris)!=null&&g.enabled&&(J=await F1(J,k.tensor,n2)),k.mesh=E1(J,p,b,j,n2),k.meshRaw=k.mesh.map(D=>[D[0]/(e.shape[2]||0),D[1]/(e.shape[1]||0),(D[2]||0)/i]);for(let D of Object.keys(C0))k.annotations[D]=C0[D].map(U=>k.mesh[U]);k.score=k.faceScore;let R={...S1(k.mesh,p),confidence:p.confidence,landmarks:p.landmarks};k.box=S2(R,e),k.boxRaw=j2(R,e),A.push(R)}r.dispose(N)}else{k.box=S2(p,e),k.boxRaw=j2(p,e),k.score=k.boxScore,k.mesh=p.landmarks.map(N=>[(p.startPoint[0]+p.endPoint[0])/2+(p.endPoint[0]+p.startPoint[0])*N[0]/Fe(),(p.startPoint[1]+p.endPoint[1])/2+(p.endPoint[1]+p.startPoint[1])*N[1]/Fe()]),k.meshRaw=k.mesh.map(N=>[N[0]/(e.shape[2]||0),N[1]/(e.shape[1]||0),(N[2]||0)/i]);for(let N of Object.keys(Te))k.annotations[N]=[k.mesh[Te[N]]]}k.score>(((P=t.face.detector)==null?void 0:P.minConfidence)||1)?s.push(k):r.dispose(k.tensor)}return q0.boxes=A,s}async function V1(e){var t,n,o,s,A,a;return M.initial&&(K=null),((t=e.face.attention)==null?void 0:t.enabled)&&(K==null?void 0:K.signature)&&Object.keys(((n=K==null?void 0:K.signature)==null?void 0:n.outputs)||{}).length<6&&(K=null),K?e.debug&&h("cached model:",K.modelUrl):(o=e.face.attention)!=null&&o.enabled?K=await L(e.face.attention.modelPath):K=await L((s=e.face.mesh)==null?void 0:s.modelPath),n2=K.executor&&((A=K==null?void 0:K.inputs)==null?void 0:A[0].shape)?(a=K==null?void 0:K.inputs)==null?void 0:a[0].shape[2]:256,K}var Z1=ve,X1=e2;var ds=["angry","disgust","fear","happy","sad","surprise","neutral"],I0,O2=[],q1=0,U1=0,Ft=Number.MAX_SAFE_INTEGER;async function Y1(e){var t;return M.initial&&(I0=null),I0?e.debug&&h("cached model:",I0.modelUrl):I0=await L((t=e.face.emotion)==null?void 0:t.modelPath),I0}async function Bt(e,t,n,o){var a,i;if(!I0)return[];let s=Ft<(((a=t.face.emotion)==null?void 0:a.skipFrames)||0),A=(((i=t.face.emotion)==null?void 0:i.skipTime)||0)>T()-U1;return t.skipAllowed&&A&&s&&q1===o&&O2[n]&&O2[n].length>0?(Ft++,O2[n]):(Ft=0,new Promise(async c=>{var y;let d=[];if((y=t.face.emotion)!=null&&y.enabled){let l={},f=I0!=null&&I0.inputs[0].shape?I0.inputs[0].shape[2]:0;l.resize=r.image.resizeBilinear(e,[f,f],!1),l.channels=r.mul(l.resize,O.rgb),l.grayscale=r.sum(l.channels,3,!0),l.grayscaleSub=r.sub(l.grayscale,O.tf05),l.grayscaleMul=r.mul(l.grayscaleSub,O.tf2),l.emotion=I0==null?void 0:I0.execute(l.grayscaleMul),U1=T();let x=await l.emotion.data();for(let u=0;u(t.face.emotion.minConfidence||0)&&d.push({score:Math.min(.99,Math.trunc(100*x[u])/100),emotion:ds[u]});d.sort((u,m)=>m.score-u.score),Object.keys(l).forEach(u=>r.dispose(l[u]))}O2[n]=d,q1=o,c(d)}))}var f0,ce=[],J1=0,Q1=0,Ht=Number.MAX_SAFE_INTEGER;async function _1(e){var t;return M.initial&&(f0=null),f0?e.debug&&h("cached model:",f0.modelUrl):f0=await L((t=e.face.description)==null?void 0:t.modelPath),f0}function xs(e){let t=e.image||e.tensor||e;if(!(f0!=null&&f0.inputs[0].shape))return t;let n=r.image.resizeBilinear(t,[f0.inputs[0].shape[2],f0.inputs[0].shape[1]],!1),o=r.mul(n,O.tf255);return r.dispose(n),o}async function Gt(e,t,n,o){var i,c,d,y;let s={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(f0!=null&&f0.executor))return s;let A=Ht<(((i=t.face.description)==null?void 0:i.skipFrames)||0),a=(((c=t.face.description)==null?void 0:c.skipTime)||0)>T()-J1;return t.skipAllowed&&A&&a&&Q1===o&&((d=ce==null?void 0:ce[n])==null?void 0:d.age)>0&&((y=ce==null?void 0:ce[n])==null?void 0:y.genderScore)>0?(Ht++,ce[n]):(Ht=0,new Promise(async l=>{var f;if((f=t.face.description)!=null&&f.enabled){let x=xs(e),u=f0==null?void 0:f0.execute(x);J1=T(),r.dispose(x);let g=await u.find(B=>B.shape[1]===1).data(),P=Math.trunc(200*Math.abs(g[0]-.5))/100;P>(t.face.description.minConfidence||0)&&(s.gender=g[0]<=.5?"female":"male",s.genderScore=Math.min(.99,P));let v=r.argMax(u.find(B=>B.shape[1]===100),1),p=(await v.data())[0];r.dispose(v);let j=await u.find(B=>B.shape[1]===100).data();s.age=Math.round(j[p-1]>j[p+1]?10*p-100*j[p-1]:10*p+100*j[p+1])/10,(Number.isNaN(g[0])||Number.isNaN(j[0]))&&h("faceres error:",{model:f0,result:u});let k=u.find(B=>B.shape[1]===1024),N=k?await k.data():[];s.descriptor=Array.from(N),u.forEach(B=>r.dispose(B))}ce[n]=s,Q1=o,l(s)}))}var Ge=.1,Vt=.5;function ys(e,t,n){let o=!1,s=n.length-1;for(let A=0;At!=n[s].y>t&&e<(n[s].x-n[A].x)*(t-n[A].y)/(n[s].y-n[A].y)+n[A].x&&(o=!o);return o}async function e3(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),s=[];for(let a of C0.silhouette)s.push({x:(e.mesh[a][0]-e.box[0])/e.box[2],y:(e.mesh[a][1]-e.box[1])/e.box[3]});Ge&&Ge>0&&(s=s.map(a=>({x:a.x>.5?a.x+Ge:a.x-Ge,y:a.y>.5?a.y+Ge:a.y-Ge})));for(let a=0;aT()-n3,A=Zt<(((i=t.face.antispoof)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&s&&A&&t3===o&&C2[n]?(Zt++,C2[n]):(Zt=0,new Promise(async c=>{let d=r.image.resizeBilinear(e,[d0!=null&&d0.inputs[0].shape?d0.inputs[0].shape[2]:0,d0!=null&&d0.inputs[0].shape?d0.inputs[0].shape[1]:0],!1),y=d0==null?void 0:d0.execute(d),l=(await y.data())[0];C2[n]=Math.round(100*l)/100,t3=o,n3=T(),r.dispose([d,y]),c(C2[n])}))}var x0,W2=[],qt=Number.MAX_SAFE_INTEGER,s3=0,A3=0;async function a3(e){var t;return M.initial&&(x0=null),x0?e.debug&&h("cached model:",x0.modelUrl):x0=await L((t=e.face.liveness)==null?void 0:t.modelPath),x0}async function Ut(e,t,n,o){var a,i;if(!(x0!=null&&x0.executor))return 0;let s=(((a=t.face.liveness)==null?void 0:a.skipTime)||0)>T()-A3,A=qt<(((i=t.face.liveness)==null?void 0:i.skipFrames)||0);return t.skipAllowed&&s&&A&&s3===o&&W2[n]?(qt++,W2[n]):(qt=0,new Promise(async c=>{let d=r.image.resizeBilinear(e,[x0!=null&&x0.inputs[0].shape?x0.inputs[0].shape[2]:0,x0!=null&&x0.inputs[0].shape?x0.inputs[0].shape[1]:0],!1),y=x0==null?void 0:x0.execute(d),l=(await y.data())[0];W2[n]=Math.round(100*l)/100,s3=o,A3=T(),r.dispose([d,y]),c(W2[n])}))}var W0,Yt=[],ms=["white","black","asian","indian","other"],ps=[15,23,28,35.5,45.5,55.5,65],l3=0,c3=0,Kt=Number.MAX_SAFE_INTEGER;async function d3(e){var t;return M.initial&&(W0=null),W0?e.debug&&h("cached model:",W0.modelUrl):W0=await L((t=e.face.gear)==null?void 0:t.modelPath),W0}async function Jt(e,t,n,o){var a,i;if(!W0)return{age:0,gender:"unknown",genderScore:0,race:[]};let s=Kt<(((a=t.face.gear)==null?void 0:a.skipFrames)||0),A=(((i=t.face.gear)==null?void 0:i.skipTime)||0)>T()-c3;return t.skipAllowed&&A&&s&&l3===o&&Yt[n]?(Kt++,Yt[n]):(Kt=0,new Promise(async c=>{var P,v;if(!(W0!=null&&W0.inputs[0].shape))return;let d={},y=[[0,.1,.9,.9]];d.resize=r.image.cropAndResize(e,y,[0],[W0.inputs[0].shape[2],W0.inputs[0].shape[1]]);let l={age:0,gender:"unknown",genderScore:0,race:[]};(P=t.face.gear)!=null&&P.enabled&&([d.age,d.gender,d.race]=W0.execute(d.resize,["age_output","gender_output","race_output"]));let f=await d.gender.data();l.gender=f[0]>f[1]?"male":"female",l.genderScore=Math.round(100*(f[0]>f[1]?f[0]:f[1]))/100;let x=await d.race.data();for(let p=0;p(((v=t.face.gear)==null?void 0:v.minConfidence)||.2)&&l.race.push({score:Math.round(100*x[p])/100,race:ms[p]});l.race.sort((p,b)=>b.score-p.score);let m=Array.from(await d.age.data()).map((p,b)=>[ps[b],p]).sort((p,b)=>b[1]-p[1]),g=m[0][0];for(let p=1;pr.dispose(d[p])),Yt[n]=l,l3=o,c3=T(),c(l)}))}var M0,D2=[],y3=0,f3=0,Qt=Number.MAX_SAFE_INTEGER;async function m3(e){return M.initial&&(M0=null),M0?e.debug&&h("cached model:",M0.modelUrl):M0=await L(e.face.ssrnet.modelPathAge),M0}async function _t(e,t,n,o){var a,i,c,d;if(!M0)return{age:0};let s=Qt<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>T()-f3;return t.skipAllowed&&s&&A&&y3===o&&((c=D2[n])==null?void 0:c.age)&&((d=D2[n])==null?void 0:d.age)>0?(Qt++,D2[n]):(Qt=0,new Promise(async y=>{var x;if(!(M0!=null&&M0.inputs)||!M0.inputs[0]||!M0.inputs[0].shape)return;let l={};l.resize=r.image.resizeBilinear(e,[M0.inputs[0].shape[2],M0.inputs[0].shape[1]],!1),l.enhance=r.mul(l.resize,O.tf255);let f={age:0};if((x=t.face.ssrnet)!=null&&x.enabled&&(l.age=M0.execute(l.enhance)),l.age){let u=await l.age.data();f.age=Math.trunc(10*u[0])/10}Object.keys(l).forEach(u=>r.dispose(l[u])),D2[n]=f,y3=o,f3=T(),y(f)}))}var D0,F2=[],u3=0,h3=0,$t=Number.MAX_SAFE_INTEGER,e5=[.2989,.587,.114];async function b3(e){var t;return M.initial&&(D0=null),D0?e.debug&&h("cached model:",D0.modelUrl):D0=await L((t=e.face.ssrnet)==null?void 0:t.modelPathGender),D0}async function t5(e,t,n,o){var a,i,c,d;if(!D0)return{gender:"unknown",genderScore:0};let s=$t<(((a=t.face.ssrnet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.ssrnet)==null?void 0:i.skipTime)||0)>T()-h3;return t.skipAllowed&&s&&A&&u3===o&&((c=F2[n])==null?void 0:c.gender)&&((d=F2[n])==null?void 0:d.genderScore)>0?($t++,F2[n]):($t=0,new Promise(async y=>{var u;if(!(D0!=null&&D0.inputs[0].shape))return;let l={};l.resize=r.image.resizeBilinear(e,[D0.inputs[0].shape[2],D0.inputs[0].shape[1]],!1),l.enhance=r.tidy(()=>{let[m,g,P]=r.split(l.resize,3,3),v=r.mul(m,e5[0]),p=r.mul(g,e5[1]),b=r.mul(P,e5[2]),j=r.addN([v,p,b]);return r.mul(r.sub(j,O.tf05),2)});let f={gender:"unknown",genderScore:0};(u=t.face.ssrnet)!=null&&u.enabled&&(l.gender=D0.execute(l.enhance));let x=await l.gender.data();f.gender=x[0]>x[1]?"female":"male",f.genderScore=x[0]>x[1]?Math.trunc(100*x[0])/100:Math.trunc(100*x[1])/100,Object.keys(l).forEach(m=>r.dispose(l[m])),F2[n]=f,u3=o,h3=T(),y(f)}))}var P0,n5=[],T3=0,v3=0,R3=Number.MAX_SAFE_INTEGER;async function M3(e){var t;return M.initial&&(P0=null),P0?e.debug&&h("cached model:",P0.modelUrl):P0=await L((t=e.face.mobilefacenet)==null?void 0:t.modelPath),P0}async function o5(e,t,n,o){var a,i;if(!(P0!=null&&P0.executor))return[];let s=R3<(((a=t.face.mobilefacenet)==null?void 0:a.skipFrames)||0),A=(((i=t.face.mobilefacenet)==null?void 0:i.skipTime)||0)>T()-v3;return t.skipAllowed&&A&&s&&T3===o&&n5[n]?(R3++,n5[n]):new Promise(async c=>{var y;let d=[];if(((y=t.face.mobilefacenet)==null?void 0:y.enabled)&&(P0==null?void 0:P0.inputs[0].shape)){let l={};l.crop=r.image.resizeBilinear(e,[P0.inputs[0].shape[2],P0.inputs[0].shape[1]],!1),l.data=P0.execute(l.crop);let f=await l.data.data();d=Array.from(f),Object.keys(l).forEach(x=>r.dispose(l[x]))}n5[n]=d,T3=o,v3=T(),c(d)})}var k0,r5=[],k3=0,w3=0,E3=Number.MAX_SAFE_INTEGER;async function z3(e){return M.initial&&(k0=null),k0?e.debug&&h("cached model:",k0.modelUrl):k0=await L(e.face.insightface.modelPath),k0}async function s5(e,t,n,o){var a,i;if(!(k0!=null&&k0.executor))return[];let s=E3<(((a=t.face.insightface)==null?void 0:a.skipFrames)||0),A=(((i=t.face.insightface)==null?void 0:i.skipTime)||0)>T()-w3;return t.skipAllowed&&A&&s&&k3===o&&r5[n]?(E3++,r5[n]):new Promise(async c=>{var y;let d=[];if(((y=t.face.insightface)==null?void 0:y.enabled)&&(k0==null?void 0:k0.inputs[0].shape)){let l={};l.crop=r.image.resizeBilinear(e,[k0.inputs[0].shape[2],k0.inputs[0].shape[1]],!1),l.data=k0.execute(l.crop);let f=await l.data.data();d=Array.from(f),Object.keys(l).forEach(x=>r.dispose(l[x]))}r5[n]=d,k3=o,w3=T(),c(d)})}var us=e=>{let t=(l,f)=>Math.atan2(l[1]-f[1],l[0]-f[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,s=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),A=s?e.mesh[473]:e.mesh[468],a=s?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],i=s?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],c=[(a[0]-A[0])/i[0]-n[0],o*(A[1]-a[1])/i[1]-n[1]],d=Math.sqrt(c[0]*c[0]+c[1]*c[1]);return d=Math.min(d,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],c)+Math.PI/2)%Math.PI,strength:d}},j3=(e,t)=>{let n=m=>{let g=Math.sqrt(m[0]*m[0]+m[1]*m[1]+m[2]*m[2]);return m[0]/=g,m[1]/=g,m[2]/=g,m},o=(m,g)=>{let P=m[0]-g[0],v=m[1]-g[1],p=m[2]-g[2];return[P,v,p]},s=(m,g)=>{let P=m[1]*g[2]-m[2]*g[1],v=m[2]*g[0]-m[0]*g[2],p=m[0]*g[1]-m[1]*g[0];return[P,v,p]},A=m=>{let[g,P,v,p,b,j,k,N,B]=m,q,W,Z;return p<1?p>-1?(Z=Math.asin(p),W=Math.atan2(-k,g),q=Math.atan2(-j,b)):(Z=-Math.PI/2,W=-Math.atan2(N,B),q=0):(Z=Math.PI/2,W=Math.atan2(N,B),q=0),Number.isNaN(q)&&(q=0),Number.isNaN(W)&&(W=0),Number.isNaN(Z)&&(Z=0),{pitch:2*-q,yaw:2*-W,roll:2*-Z}},a=e.meshRaw;if(!a||a.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let i=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,c=[a[10],a[152],a[234],a[454]].map(m=>[m[0]*t[0]/i,m[1]*t[1]/i,m[2]]),d=n(o(c[1],c[0])),y=n(o(c[3],c[2])),l=n(s(y,d));y=s(d,l);let f=[y[0],y[1],y[2],d[0],d[1],d[2],l[0],l[1],l[2]],x=A(f),u=a.length===478?us(e):{bearing:0,strength:0};return{angle:x,matrix:f,gaze:u}};function I3(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var A5=async(e,t)=>{var u,m,g,P,v,p,b,j,k,N,B,q,W,Z,J,R,D,U,H,a0,o0,C,F;let n=T(),o,s,A,a,i,c,d,y,l,f=[];e.state="run:face";let x=await G1(t,e.config);if(e.performance.face=M.perfadd?(e.performance.face||0)+Math.trunc(T()-n):Math.trunc(T()-n),!t.shape||t.shape.length!==4)return[];if(!x)return[];for(let S=0;S200?j3(x[S],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?a=(m=e.config.face.emotion)!=null&&m.enabled?Bt(x[S].tensor||r.tensor([]),e.config,S,x.length):[]:(e.state="run:emotion",n=T(),a=(g=e.config.face.emotion)!=null&&g.enabled?await Bt(x[S].tensor||r.tensor([]),e.config,S,x.length):[],e.performance.emotion=M.perfadd?(e.performance.emotion||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?d=(P=e.config.face.antispoof)!=null&&P.enabled?Xt(x[S].tensor||r.tensor([]),e.config,S,x.length):0:(e.state="run:antispoof",n=T(),d=(v=e.config.face.antispoof)!=null&&v.enabled?await Xt(x[S].tensor||r.tensor([]),e.config,S,x.length):0,e.performance.antispoof=M.perfadd?(e.performance.antispoof||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?y=(p=e.config.face.liveness)!=null&&p.enabled?Ut(x[S].tensor||r.tensor([]),e.config,S,x.length):0:(e.state="run:liveness",n=T(),y=(b=e.config.face.liveness)!=null&&b.enabled?await Ut(x[S].tensor||r.tensor([]),e.config,S,x.length):0,e.performance.liveness=M.perfadd?(e.performance.antispoof||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?s=(j=e.config.face.gear)!=null&&j.enabled?Jt(x[S].tensor||r.tensor([]),e.config,S,x.length):null:(e.state="run:gear",n=T(),s=(k=e.config.face.gear)!=null&&k.enabled?await Jt(x[S].tensor||r.tensor([]),e.config,S,x.length):null,e.performance.gear=Math.trunc(T()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(N=e.config.face.ssrnet)!=null&&N.enabled?_t(x[S].tensor||r.tensor([]),e.config,S,x.length):null,A=(B=e.config.face.ssrnet)!=null&&B.enabled?t5(x[S].tensor||r.tensor([]),e.config,S,x.length):null):(e.state="run:ssrnet",n=T(),o=(q=e.config.face.ssrnet)!=null&&q.enabled?await _t(x[S].tensor||r.tensor([]),e.config,S,x.length):null,A=(W=e.config.face.ssrnet)!=null&&W.enabled?await t5(x[S].tensor||r.tensor([]),e.config,S,x.length):null,e.performance.ssrnet=Math.trunc(T()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?i=(Z=e.config.face.mobilefacenet)!=null&&Z.enabled?o5(x[S].tensor||r.tensor([]),e.config,S,x.length):null:(e.state="run:mobilefacenet",n=T(),i=(J=e.config.face.mobilefacenet)!=null&&J.enabled?await o5(x[S].tensor||r.tensor([]),e.config,S,x.length):null,e.performance.mobilefacenet=Math.trunc(T()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?c=(R=e.config.face.insightface)!=null&&R.enabled?s5(x[S].tensor||r.tensor([]),e.config,S,x.length):null:(e.state="run:mobilefacenet",n=T(),c=(D=e.config.face.insightface)!=null&&D.enabled?await s5(x[S].tensor||r.tensor([]),e.config,S,x.length):null,e.performance.mobilefacenet=Math.trunc(T()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?l=Gt(x[S].tensor||r.tensor([]),e.config,S,x.length):(e.state="run:description",n=T(),l=await Gt(x[S].tensor||r.tensor([]),e.config,S,x.length),e.performance.description=M.perfadd?(e.performance.description||0)+Math.trunc(T()-n):Math.trunc(T()-n)),e.analyze("End Description:"),e.config.async&&([o,A,a,i,c,l,s,d,y]=await Promise.all([o,A,a,i,c,l,s,d,y])),e.analyze("Finish Face:"),((U=e.config.face.ssrnet)==null?void 0:U.enabled)&&o&&A&&(l={...l,age:o.age,gender:A.gender,genderScore:A.genderScore}),((H=e.config.face.gear)==null?void 0:H.enabled)&&s&&(l={...l,age:s.age,gender:s.gender,genderScore:s.genderScore,race:s.race}),((a0=e.config.face.mobilefacenet)==null?void 0:a0.enabled)&&i&&(l.descriptor=i),((o0=e.config.face.insightface)==null?void 0:o0.enabled)&&c&&(l.descriptor=c);let te=(C=e.config.face.iris)!=null&&C.enabled?I3(x[S],t.shape[2]):0,ne=(F=e.config.face.detector)!=null&&F.return?r.squeeze(x[S].tensor):null;r.dispose(x[S].tensor),x[S].tensor&&delete x[S].tensor;let i0={...x[S],id:S};l.age&&(i0.age=l.age),l.gender&&(i0.gender=l.gender),l.genderScore&&(i0.genderScore=l.genderScore),l.descriptor&&(i0.embedding=l.descriptor),l.race&&(i0.race=l.race),a&&(i0.emotion=a),d&&(i0.real=d),y&&(i0.live=y),te>0&&(i0.distance=te),N0&&(i0.rotation=N0),ne&&(i0.tensor=ne),f.push(i0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),f};var b0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>b0.nameMapping[e],getPoints:e=>b0.pointsMapping[e]},xe={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>xe.nameMapping[e]},$={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>$.nameMapping[e]},de=class{constructor(t){E(this,"name");E(this,"curls");E(this,"directions");E(this,"weights");E(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((s,A)=>s+A,0);this.weightsRelative=this.weights.map(s=>s*5/o)}matchAgainst(t,n){let o=0;for(let s in t){let A=t[s],a=this.curls[s];if(typeof a=="undefined"){o+=this.weightsRelative[s];continue}for(let[i,c]of a)if(A===i){o+=c*this.weightsRelative[s];break}}for(let s in n){let A=n[s],a=this.directions[s];if(typeof a=="undefined"){o+=this.weightsRelative[s];continue}for(let[i,c]of a)if(A===i){o+=c*this.weightsRelative[s];break}}return o/10}};var{thumb:H0,index:Q0,middle:_0,ring:Ee,pinky:ze}=b0,{none:G0,half:bs,full:V0}=xe,{verticalUp:Ve,verticalDown:Y4,horizontalLeft:a5,horizontalRight:gs,diagonalUpRight:Ts,diagonalUpLeft:Ze,diagonalDownRight:K4,diagonalDownLeft:J4}=$,ye=new de("thumbs up");ye.curl(H0,G0,1);ye.direction(H0,Ve,1);ye.direction(H0,Ze,.25);ye.direction(H0,Ts,.25);for(let e of[b0.index,b0.middle,b0.ring,b0.pinky])ye.curl(e,V0,1),ye.direction(e,a5,1),ye.direction(e,gs,1);var r0=new de("victory");r0.curl(H0,bs,.5);r0.curl(H0,G0,.5);r0.direction(H0,Ve,1);r0.direction(H0,Ze,1);r0.curl(Q0,G0,1);r0.direction(Q0,Ve,.75);r0.direction(Q0,Ze,1);r0.curl(_0,G0,1);r0.direction(_0,Ve,1);r0.direction(_0,Ze,.75);r0.curl(Ee,V0,1);r0.direction(Ee,Ve,.2);r0.direction(Ee,Ze,1);r0.direction(Ee,a5,.2);r0.curl(ze,V0,1);r0.direction(ze,Ve,.2);r0.direction(ze,Ze,1);r0.direction(ze,a5,.2);r0.weight(Q0,2);r0.weight(_0,2);var fe=new de("point");fe.curl(H0,V0,1);fe.curl(Q0,G0,.5);fe.curl(_0,V0,.5);fe.curl(Ee,V0,.5);fe.curl(ze,V0,.5);fe.weight(Q0,2);fe.weight(_0,2);var me=new de("middle finger");me.curl(H0,G0,1);me.curl(Q0,V0,.5);me.curl(_0,V0,.5);me.curl(Ee,V0,.5);me.curl(ze,V0,.5);me.weight(Q0,2);me.weight(_0,2);var Xe=new de("open palm");Xe.curl(H0,G0,.75);Xe.curl(Q0,G0,.75);Xe.curl(_0,G0,.75);Xe.curl(Ee,G0,.75);Xe.curl(ze,G0,.75);var N3=[ye,r0,fe,me,Xe];var vs=.7,Se={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function L3(e,t,n,o){let s=(t-o)/(e-n),A=Math.atan(s)*180/Math.PI;return A<=0?A=-A:A>0&&(A=180-A),A}function C3(e,t){if(!e||!t)return[0,0];let n=L3(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=L3(e[1],e[2],t[1],t[2]);return[n,o]}function O3(e,t=1){let n=0,o=0,s=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:s=1*t,[n,o,s]}function Rs(e,t,n){let o=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],i=e[1]-n[1],c=t[1]-n[1],d=e[2]-t[2],y=e[2]-n[2],l=t[2]-n[2],f=Math.sqrt(o*o+a*a+d*d),x=Math.sqrt(s*s+i*i+y*y),u=Math.sqrt(A*A+c*c+l*l),m=(u*u+f*f-x*x)/(2*u*f);m>1?m=1:m<-1&&(m=-1);let g=Math.acos(m);g=57.2958*g%180;let P;return g>Se.NO_CURL_START_LIMIT?P=xe.none:g>Se.HALF_CURL_START_LIMIT?P=xe.half:P=xe.full,P}function W3(e,t,n,o){let s;return o===Math.abs(e)?e>0?s=$.horizontalLeft:s=$.horizontalRight:o===Math.abs(t)?t>0?s=$.horizontalLeft:s=$.horizontalRight:n>0?s=$.horizontalLeft:s=$.horizontalRight,s}function D3(e,t,n,o){let s;return o===Math.abs(e)?e<0?s=$.verticalDown:s=$.verticalUp:o===Math.abs(t)?t<0?s=$.verticalDown:s=$.verticalUp:n<0?s=$.verticalDown:s=$.verticalUp,s}function Ms(e,t,n,o,s,A,a,i){let c,d=D3(e,t,n,o),y=W3(s,A,a,i);return d===$.verticalUp?y===$.horizontalLeft?c=$.diagonalUpLeft:c=$.diagonalUpRight:y===$.horizontalLeft?c=$.diagonalDownLeft:c=$.diagonalDownRight,c}function Ps(e,t,n,o){let s=e[0]-t[0],A=e[0]-n[0],a=t[0]-n[0],i=e[1]-t[1],c=e[1]-n[1],d=t[1]-n[1],y=Math.max(Math.abs(s),Math.abs(A),Math.abs(a)),l=Math.max(Math.abs(i),Math.abs(c),Math.abs(d)),f=0,x=0,u=0,m=l/(y+1e-5);m>1.5?f+=Se.DISTANCE_VOTE_POWER:m>.66?x+=Se.DISTANCE_VOTE_POWER:u+=Se.DISTANCE_VOTE_POWER;let g=Math.sqrt(s*s+i*i),P=Math.sqrt(A*A+c*c),v=Math.sqrt(a*a+d*d),p=Math.max(g,P,v),b=e[0],j=e[1],k=n[0],N=n[1];p===g?(k=n[0],N=n[1]):p===v&&(b=t[0],j=t[1]);let W=C3([b,j],[k,N]),Z=O3(W,Se.TOTAL_ANGLE_VOTE_POWER);f+=Z[0],x+=Z[1],u+=Z[2];for(let R of o){let D=O3(R,Se.SINGLE_ANGLE_VOTE_POWER);f+=D[0],x+=D[1],u+=D[2]}let J;return f===Math.max(f,x,u)?J=D3(c,i,d,l):u===Math.max(x,u)?J=W3(A,s,a,y):J=Ms(c,i,d,l,A,s,a,y),J}function F3(e){let t=[],n=[],o=[],s=[];if(!e)return{curls:o,directions:s};for(let A of b0.all){let a=b0.getPoints(A),i=[],c=[];for(let d of a){let y=e[d[0]],l=e[d[1]],f=C3(y,l),x=f[0],u=f[1];i.push(x),c.push(u)}t.push(i),n.push(c)}for(let A of b0.all){let a=A===b0.thumb?1:0,i=b0.getPoints(A),c=e[i[a][0]],d=e[i[a+1][1]],y=e[i[3][1]],l=Rs(c,d,y),f=Ps(c,d,y,t[A].slice(a));o[A]=l,s[A]=f}return{curls:o,directions:s}}function B2(e){if(!e||e.length===0)return null;let t=F3(e),n={};for(let o of b0.all)n[b0.getName(o)]={curl:xe.getName(t.curls[o]),direction:$.getName(t.directions[o])};return n}function B3(e){let t=[];if(!e||e.length===0)return t;let n=F3(e);for(let o of N3){let s=o.matchAgainst(n.curls,n.directions);s>=vs&&t.push({name:o.name,confidence:s})}return t}var H3=e=>{if(!e)return[];let t=[];for(let n=0;nc.part==="leftWrist"),s=e[n].keypoints.find(c=>c.part==="rightWrist"),A=e[n].keypoints.find(c=>c.part==="nose");A&&o&&s&&o.position[1]c.part==="leftShoulder"),i=e[n].keypoints.find(c=>c.part==="rightShoulder");a&&i&&Math.abs(a.positionRaw[1]-i.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${a.position[1]>i.position[1]?"left":"right"}`})}return t},G3=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),s=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/s)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let i=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));i>10&&t.push({face:n,gesture:`mouth ${Math.trunc(i)}% open`});let c=e[n].mesh[152][2]||0;Math.abs(c)>10&&t.push({face:n,gesture:`head ${c<0?"up":"down"}`})}return t},V3=e=>{var n,o,s,A;if(!e)return[];let t=[];for(let a=0;a.06||g>.06)&&(x=!1),m>g?m>.05&&t.push({iris:a,gesture:"looking right"}):g>.05&&t.push({iris:a,gesture:"looking left"});let P=Math.abs(e[a].mesh[145][1]-e[a].annotations.rightEyeIris[0][1])/e[a].box[3],v=Math.abs(e[a].mesh[374][1]-e[a].annotations.leftEyeIris[0][1])/e[a].box[3];(v<.01||P<.01||v>.022||P>.022)&&(x=!1),(v<.01||P<.01)&&t.push({iris:a,gesture:"looking down"}),(v>.022||P>.022)&&t.push({iris:a,gesture:"looking up"}),x&&t.push({iris:a,gesture:"looking center"})}return t},Z3=e=>{if(!e)return[];let t=[];for(let n=0;n0){let s=o.reduce((a,i)=>(a.position[2]||0)<(i.position[2]||0)?a:i);t.push({hand:n,gesture:`${s.name} forward`});let A=o.reduce((a,i)=>a.position[1][A[0]*t[0],A[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:s,confidence:e.confidence}}function G2(e,t=1.5){let n=o2(e),o=H2(e),s=[t*o[0]/2,t*o[1]/2],A=[n[0]-s[0],n[1]-s[1]],a=[n[0]+s[0],n[1]+s[1]];return{startPoint:A,endPoint:a,palmLandmarks:e.palmLandmarks}}function V2(e){let t=o2(e),n=H2(e),s=Math.max(...n)/2,A=[t[0]-s,t[1]-s],a=[t[0]+s,t[1]+s];return{startPoint:A,endPoint:a,palmLandmarks:e.palmLandmarks}}function ws(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function K3(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return ws(n)}var X3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function pe(e,t){let n=0;for(let o=0;o[a.x,a.y]),this.anchorsTensor=r.tensor2d(this.anchors),this.inputSize=((A=(s=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:s.shape)==null?void 0:A[2])||0,this.inputSizeTensor=r.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=r.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=r.slice(t,[0,0],[-1,2]),n.boxSizes=r.slice(t,[0,2],[-1,2]),n.div=r.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=r.add(n.div,this.anchorsTensor),n.halfBoxSizes=r.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=r.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=r.mul(n.sub,this.inputSizeTensor),n.add=r.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=r.mul(n.add,this.inputSizeTensor);let o=r.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(s=>r.dispose(n[s])),o}normalizeLandmarks(t,n){let o={};o.reshape=r.reshape(t,[-1,7,2]),o.div=r.div(o.reshape,this.inputSizeTensor),o.landmarks=r.add(o.div,this.anchors[n]?this.anchors[n]:0);let s=r.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(A=>r.dispose(o[A])),s}async predict(t,n){var i;let o={};o.resize=r.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=r.div(o.resize,O.tf127),o.image=r.sub(o.div,O.tf1),o.batched=this.model.execute(o.image),o.predictions=r.squeeze(o.batched),o.slice=r.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=r.sigmoid(o.slice),o.scores=r.squeeze(o.sigmoid);let s=await o.scores.data();o.boxes=r.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await r.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((i=n.hand)==null?void 0:i.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let A=await o.nms.array(),a=[];for(let c of A){let d={};d.box=r.slice(o.norm,[c,0],[1,-1]),d.slice=r.slice(o.predictions,[c,5],[1,14]),d.norm=this.normalizeLandmarks(d.slice,c),d.palmLandmarks=r.reshape(d.norm,[-1,2]);let y=await d.box.data(),l=y.slice(0,2),f=y.slice(2,4),x=await d.palmLandmarks.array(),u={startPoint:l,endPoint:f,palmLandmarks:x,confidence:s[c]},m=Y3(u,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);a.push(m),Object.keys(d).forEach(g=>r.dispose(d[g]))}return Object.keys(o).forEach(c=>r.dispose(o[c])),a}};var js=5,$3=1.65,en=[0,5,9,13,17,1,2],Is=0,Ns=2,tn=0,X2=class{constructor(t,n){E(this,"handDetector");E(this,"handPoseModel");E(this,"inputSize");E(this,"storedBoxes");E(this,"skipped");E(this,"detectedHands");var o,s,A;this.handDetector=t,this.handPoseModel=n,this.inputSize=((A=(s=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:s[0].shape)==null?void 0:A[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(a=>a[0]),o=t.map(a=>a[1]),s=[Math.min(...n),Math.min(...o)],A=[Math.max(...n),Math.max(...o)];return{startPoint:s,endPoint:A}}getBoxForPalmLandmarks(t,n){let o=t.map(A=>c5([...A,1],n)),s=this.calculateLandmarksBoundingBox(o);return G2(V2(s),js)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=G2(V2(n),$3);o.palmLandmarks=[];for(let s=0;s[a[0]*(x[0]-this.inputSize/2),a[1]*(x[1]-this.inputSize/2),a[2]*x[2]]),c=l5(o,[0,0]),d=i.map(x=>[...c5(x,c),x[2]]),y=J3(s),l=[...o2(n),1],f=[pe(l,y[0]),pe(l,y[1])];return d.map(x=>[Math.trunc(x[0]+f[0]),Math.trunc(x[1]+f[1]),Math.trunc(x[2])])}async estimateHands(t,n){let o=!1,s,A=(n.hand.skipTime||0)>T()-tn,a=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&A&&a&&(s=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,s&&s.length>0&&(s.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...s],this.storedBoxes.length>0&&(o=!0));let i=[];for(let c=0;c=n.hand.minConfidence/4){let j=r.reshape(p,[-1,3]),k=await j.array();r.dispose(p),r.dispose(j);let N=this.transformRawCoords(k,m,y,u),B=this.getBoxForHandLandmarks(N);this.storedBoxes[c]={...B,confidence:b};let q={landmarks:N,confidence:b,boxConfidence:d.confidence,fingerConfidence:b,box:{topLeft:B.startPoint,bottomRight:B.endPoint}};i.push(q)}else this.storedBoxes[c]=null;r.dispose(p)}else{let y=G2(V2(d),$3),l={confidence:d.confidence,boxConfidence:d.confidence,fingerConfidence:0,box:{topLeft:y.startPoint,bottomRight:y.endPoint},landmarks:[]};i.push(l)}}return this.storedBoxes=this.storedBoxes.filter(c=>c!==null),this.detectedHands=i.length,i.length>n.hand.maxDetected&&(i.length=n.hand.maxDetected),i}};var nn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},je,Ie,on;async function d5(e,t){let n=await on.estimateHands(e,t);if(!n)return[];let o=[];for(let s=0;sn[s].landmarks[l]);let a=n[s].landmarks,i=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],c=[0,0,0,0];if(a&&a.length>0){for(let y of a)y[0]i[2]&&(i[2]=y[0]),y[1]>i[3]&&(i[3]=y[1]);i[2]-=i[0],i[3]-=i[1],c=[i[0]/(e.shape[2]||0),i[1]/(e.shape[1]||0),i[2]/(e.shape[2]||0),i[3]/(e.shape[1]||0)]}else i=n[s].box?[Math.trunc(Math.max(0,n[s].box.topLeft[0])),Math.trunc(Math.max(0,n[s].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[s].box.bottomRight[0])-Math.max(0,n[s].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[s].box.bottomRight[1])-Math.max(0,n[s].box.topLeft[1]))]:[0,0,0,0],c=[n[s].box.topLeft[0]/(e.shape[2]||0),n[s].box.topLeft[1]/(e.shape[1]||0),(n[s].box.bottomRight[0]-n[s].box.topLeft[0])/(e.shape[2]||0),(n[s].box.bottomRight[1]-n[s].box.topLeft[1])/(e.shape[1]||0)];let d=B2(a);o.push({id:s,score:Math.round(100*n[s].confidence)/100,boxScore:Math.round(100*n[s].boxConfidence)/100,fingerScore:Math.round(100*n[s].fingerConfidence)/100,label:"hand",box:i,boxRaw:c,keypoints:a,annotations:A,landmarks:d})}return o}async function rn(e){var n,o;M.initial&&(je=null,Ie=null),!je||!Ie?[je,Ie]=await Promise.all([e.hand.enabled?L((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?L((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&h("cached model:",je.modelUrl),e.debug&&h("cached model:",Ie.modelUrl));let t=je?new Z2(je):void 0;return t&&Ie&&(on=new X2(t,Ie)),[je,Ie]}var n0=[null,null],Os=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],ue=[[0,0],[0,0]],Cs=["hand","fist","pinch","point","face","tip","pinchtip"],An=4,an=1.6,Ws=512,Ds=1.4,q2=Number.MAX_SAFE_INTEGER,x5=0,$0=[0,0],t0={boxes:[],hands:[]},ln={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function cn(e){var t;if(M.initial&&(n0[0]=null),n0[0])e.debug&&h("cached model:",n0[0].modelUrl);else{u2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),n0[0]=await L((t=e.hand.detector)==null?void 0:t.modelPath);let n=n0[0].executor?Object.values(n0[0].modelSignature.inputs):void 0;ue[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,ue[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return n0[0]}async function dn(e){var t;if(M.initial&&(n0[1]=null),n0[1])e.debug&&h("cached model:",n0[1].modelUrl);else{n0[1]=await L((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=n0[1].executor?Object.values(n0[1].modelSignature.inputs):void 0;ue[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,ue[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return n0[1]}async function Fs(e,t){let n=[];if(!e||!n0[0])return n;let o={},s=(e.shape[2]||1)/(e.shape[1]||1),A=Math.min(Math.round((e.shape[1]||0)/8)*8,Ws),a=Math.round(A*s/8)*8;o.resize=r.image.resizeBilinear(e,[A,a]),o.cast=r.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await n0[0].executeAsync(o.cast,Os),o.boxes=r.squeeze(o.rawBoxes,[0,2]),o.scores=r.squeeze(o.rawScores,[0]);let i=r.unstack(o.scores,1);r.dispose(i[An]),i.splice(An,1),o.filtered=r.stack(i,1),r.dispose(i),o.max=r.max(o.filtered,1),o.argmax=r.argMax(o.filtered,1);let c=0;o.nms=await r.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let d=await o.nms.data(),y=await o.max.data(),l=await o.argmax.data();for(let f of Array.from(d)){let x=r.slice(o.boxes,f,1),u=await x.data();r.dispose(x);let m=[u[1],u[0],u[3]-u[1],u[2]-u[0]],g=P2(m,Ds),P=[Math.trunc(m[0]*$0[0]),Math.trunc(m[1]*$0[1]),Math.trunc(m[2]*$0[0]),Math.trunc(m[3]*$0[1])],v=y[f],p=Cs[l[f]],b={id:c++,score:v,box:P,boxRaw:g,label:p};n.push(b)}return Object.keys(o).forEach(f=>r.dispose(o[f])),n.sort((f,x)=>x.score-f.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function y5(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&n0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let s={},A=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];s.crop=r.image.cropAndResize(e,[A],[0],[ue[1][0],ue[1][1]],"bilinear"),s.div=r.div(s.crop,O.tf255),[s.score,s.keypoints]=n0[1].execute(s.div,["Identity_1","Identity"]);let a=(await s.score.data())[0],i=(100-Math.trunc(100/(1+Math.exp(a))))/100;if(i>=(n.hand.minConfidence||0)){o.fingerScore=i,s.reshaped=r.reshape(s.keypoints,[-1,3]);let y=(await s.reshaped.array()).map(l=>[l[0]/ue[1][1],l[1]/ue[1][0],l[2]||0]).map(l=>[l[0]*t.boxRaw[2],l[1]*t.boxRaw[3],l[2]||0]);o.keypoints=y.map(l=>[$0[0]*(l[0]+t.boxRaw[0]),$0[1]*(l[1]+t.boxRaw[1]),l[2]||0]),o.landmarks=B2(o.keypoints);for(let l of Object.keys(ln))o.annotations[l]=ln[l].map(f=>o.landmarks&&o.keypoints[f]?o.keypoints[f]:null)}Object.keys(s).forEach(c=>r.dispose(s[c]))}return o}async function f5(e,t){var s,A;if(!((s=n0[0])!=null&&s.executor)||!((A=n0[1])!=null&&A.executor)||!n0[0].inputs[0].shape||!n0[1].inputs[0].shape)return[];$0=[e.shape[2]||0,e.shape[1]||0],q2++;let n=(t.hand.skipTime||0)>T()-x5,o=q2<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?t0.hands:new Promise(async a=>{let i=3*(t.hand.skipTime||0)>T()-x5,c=q2<3*(t.hand.skipFrames||0);t.skipAllowed&&t0.hands.length===t.hand.maxDetected?t0.hands=await Promise.all(t0.boxes.map(y=>y5(e,y,t))):t.skipAllowed&&i&&c&&t0.hands.length>0?t0.hands=await Promise.all(t0.boxes.map(y=>y5(e,y,t))):(t0.boxes=await Fs(e,t),x5=T(),t0.hands=await Promise.all(t0.boxes.map(y=>y5(e,y,t))),q2=0);let d=[...t0.boxes];if(t0.boxes.length=0,t.cacheSensitivity>0)for(let y=0;y.05&&l.box[3]/(e.shape[1]||1)>.05&&t0.hands[y].fingerScore&&t0.hands[y].fingerScore>(t.hand.minConfidence||0)){let f=P2(l.box,an),x=P2(l.boxRaw,an);t0.boxes.push({...d[y],box:f,boxRaw:x})}}for(let y=0;y({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var r2={};oe(r2,{connected:()=>Y2,horizontal:()=>m5,kpt:()=>U2,relative:()=>u5,vertical:()=>p5});var U2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],m5=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],p5=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],u5=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],Y2={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var z=ee(),h5=0;function yn(e,t){var a,i,c,d,y,l,f,x,u,m,g,P,v,p,b,j,k,N,B,q,W,Z,J;let n=T();if(!e)return ee();let o=Date.now()-e.timestamp,s=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(z.canvas=e.canvas),e.error&&(z.error=e.error),!z.body||e.body.length!==z.body.length)z.body=JSON.parse(JSON.stringify(e.body));else for(let R=0;R((s-1)*z.body[R].box[F]+C)/s),U=e.body[R].boxRaw.map((C,F)=>((s-1)*z.body[R].boxRaw[F]+C)/s),H=e.body[R].keypoints.map((C,F)=>{var S,N0,te,ne,i0,Ye,C5,W5,D5;return{score:C.score,part:C.part,position:[z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[0]||0)+(C.position[0]||0))/s:C.position[0],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[1]||0)+(C.position[1]||0))/s:C.position[1],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].position[2]||0)+(C.position[2]||0))/s:C.position[2]],positionRaw:[z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[0]||0)+(C.positionRaw[0]||0))/s:C.positionRaw[0],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[1]||0)+(C.positionRaw[1]||0))/s:C.positionRaw[1],z.body[R].keypoints[F]?((s-1)*(z.body[R].keypoints[F].positionRaw[2]||0)+(C.positionRaw[2]||0))/s:C.positionRaw[2]],distance:[z.body[R].keypoints[F]?((s-1)*(((S=z.body[R].keypoints[F].distance)==null?void 0:S[0])||0)+(((N0=C.distance)==null?void 0:N0[0])||0))/s:(te=C.distance)==null?void 0:te[0],z.body[R].keypoints[F]?((s-1)*(((ne=z.body[R].keypoints[F].distance)==null?void 0:ne[1])||0)+(((i0=C.distance)==null?void 0:i0[1])||0))/s:(Ye=C.distance)==null?void 0:Ye[1],z.body[R].keypoints[F]?((s-1)*(((C5=z.body[R].keypoints[F].distance)==null?void 0:C5[2])||0)+(((W5=C.distance)==null?void 0:W5[2])||0))/s:(D5=C.distance)==null?void 0:D5[2]]}}),a0={},o0={connected:{}};(a=t.body.modelPath)!=null&&a.includes("efficientpose")?o0=E2:(i=t.body.modelPath)!=null&&i.includes("blazepose")?o0=R2:(c=t.body.modelPath)!=null&&c.includes("movenet")&&(o0=r2);for(let[C,F]of Object.entries(o0.connected)){let S=[];for(let N0=0;N0i0.part===F[N0]),ne=H.find(i0=>i0.part===F[N0+1]);te&&ne&&S.push([te.position,ne.position])}a0[C]=S}z.body[R]={...e.body[R],box:D,boxRaw:U,keypoints:H,annotations:a0}}if(!z.hand||e.hand.length!==z.hand.length)z.hand=JSON.parse(JSON.stringify(e.hand));else for(let R=0;R((s-1)*z.hand[R].box[C]+o0)/s),U=e.hand[R].boxRaw.map((o0,C)=>((s-1)*z.hand[R].boxRaw[C]+o0)/s);z.hand[R].keypoints.length!==e.hand[R].keypoints.length&&(z.hand[R].keypoints=e.hand[R].keypoints);let H=e.hand[R].keypoints&&e.hand[R].keypoints.length>0?e.hand[R].keypoints.map((o0,C)=>o0.map((F,S)=>((s-1)*(z.hand[R].keypoints[C][S]||1)+(F||0))/s)):[],a0={};if(Object.keys(z.hand[R].annotations).length!==Object.keys(e.hand[R].annotations).length)z.hand[R].annotations=e.hand[R].annotations,a0=z.hand[R].annotations;else if(e.hand[R].annotations)for(let o0 of Object.keys(e.hand[R].annotations))a0[o0]=(l=(y=(d=e.hand[R])==null?void 0:d.annotations)==null?void 0:y[o0])!=null&&l[0]?e.hand[R].annotations[o0].map((C,F)=>C.map((S,N0)=>((s-1)*z.hand[R].annotations[o0][F][N0]+S)/s)):null;z.hand[R]={...e.hand[R],box:D,boxRaw:U,keypoints:H,annotations:a0}}if(!z.face||e.face.length!==z.face.length)z.face=JSON.parse(JSON.stringify(e.face));else for(let R=0;R((s-1)*z.face[R].box[a0]+H)/s),U=e.face[R].boxRaw.map((H,a0)=>((s-1)*z.face[R].boxRaw[a0]+H)/s);if(e.face[R].rotation){let H={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};H.matrix=(f=e.face[R].rotation)==null?void 0:f.matrix,H.angle={roll:((s-1)*(((u=(x=z.face[R].rotation)==null?void 0:x.angle)==null?void 0:u.roll)||0)+(((g=(m=e.face[R].rotation)==null?void 0:m.angle)==null?void 0:g.roll)||0))/s,yaw:((s-1)*(((v=(P=z.face[R].rotation)==null?void 0:P.angle)==null?void 0:v.yaw)||0)+(((b=(p=e.face[R].rotation)==null?void 0:p.angle)==null?void 0:b.yaw)||0))/s,pitch:((s-1)*(((k=(j=z.face[R].rotation)==null?void 0:j.angle)==null?void 0:k.pitch)||0)+(((B=(N=e.face[R].rotation)==null?void 0:N.angle)==null?void 0:B.pitch)||0))/s},H.gaze={bearing:((s-1)*(((q=z.face[R].rotation)==null?void 0:q.gaze.bearing)||0)+(((W=e.face[R].rotation)==null?void 0:W.gaze.bearing)||0))/s,strength:((s-1)*(((Z=z.face[R].rotation)==null?void 0:Z.gaze.strength)||0)+(((J=e.face[R].rotation)==null?void 0:J.gaze.strength)||0))/s},z.face[R]={...e.face[R],rotation:H,box:D,boxRaw:U}}else z.face[R]={...e.face[R],box:D,boxRaw:U}}if(!z.object||e.object.length!==z.object.length)z.object=JSON.parse(JSON.stringify(e.object));else for(let R=0;R((s-1)*z.object[R].box[a0]+H)/s),U=e.object[R].boxRaw.map((H,a0)=>((s-1)*z.object[R].boxRaw[a0]+H)/s);z.object[R]={...e.object[R],box:D,boxRaw:U}}if(e.persons){let R=e.persons;if(!z.persons||R.length!==z.persons.length)z.persons=JSON.parse(JSON.stringify(R));else for(let D=0;D((s-1)*z.persons[D].box[H]+U)/s)}e.gesture&&(z.gesture=e.gesture),z.width=e.width,z.height=e.height;let A=T();return h5=M.perfadd?h5+Math.round(A-n):Math.round(A-n),e.performance&&(z.performance={...e.performance,interpolate:h5}),z}var m0;async function b5(e){return!m0||M.initial?m0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",m0.modelUrl),m0}async function fn(e,t){var s;if(m0||(m0=await b5(t)),!(m0!=null&&m0.executor)||!((s=m0==null?void 0:m0.inputs)!=null&&s[0].shape))return null;let n={};n.resize=r.image.resizeBilinear(e,[m0.inputs[0].shape?m0.inputs[0].shape[1]:0,m0.inputs[0].shape?m0.inputs[0].shape[2]:0],!1),n.norm=r.div(n.resize,O.tf255),n.res=m0.execute(n.norm),n.squeeze=r.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=r.unstack(n.squeeze,2),n.fg=r.softmax(n.fgRaw),n.mul=r.mul(n.fg,O.tf255),n.expand=r.expandDims(n.mul,2),n.output=r.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r.squeeze(e),n.concat=r.concat([n.input,n.output],-1),o=r.cast(n.concat,"int32");break;case"alpha":o=r.cast(n.output,"int32");break;default:o=r.tensor(0)}return Object.keys(n).forEach(A=>r.dispose(n[A])),o}var T5={};oe(T5,{distance:()=>g5,find:()=>Gs,similarity:()=>Hs});function g5(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let s=0;s{if(e===0)return 1;let A=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(A,1),0)};function Hs(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=g5(e,t,n);return pn(o,n.order||2,n.min||0,n.max||1)}function Gs(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,s=-1;for(let a=0;aa2,validateModel:()=>tt});var un=.005,w0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function v5(e){for(let t of m5){let n=e.keypoints.findIndex(s=>s.part===t[0]),o=e.keypoints.findIndex(s=>s.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]s&&s.part===t[0]),o=e.keypoints.findIndex(s=>s&&s.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]d&&d.part===t[0]),s=e.keypoints.findIndex(d=>d&&d.part===t[1]),A=e.keypoints.findIndex(d=>d&&d.part===n[0]),a=e.keypoints.findIndex(d=>d&&d.part===n[1]);if(!e.keypoints[A]||!e.keypoints[a])continue;let i=e.keypoints[o]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[a].position[0]-e.keypoints[o].position[0])]:[0,0],c=e.keypoints[s]?[Math.abs(e.keypoints[a].position[0]-e.keypoints[s].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[s].position[0])]:[0,0];if(i[0]>i[1]||c[0]>c[1]){let d=e.keypoints[o];e.keypoints[o]=e.keypoints[s],e.keypoints[s]=d}}}function hn(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=r.pad(e,w0.padding),n.resize=r.image.resizeBilinear(n.pad,[t,t]);let o=r.cast(n.resize,"int32");return Object.keys(n).forEach(a=>r.dispose(n[a])),o}function gn(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+w0.padding[2][0]+w0.padding[2][1])/t[0]-w0.padding[2][0],o.position[1]*(t[1]+w0.padding[1][0]+w0.padding[1][1])/t[1]-w0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=J0(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var s0,K2=0,R5=Number.MAX_SAFE_INTEGER,Ne={boxes:[],bodies:[],last:0};async function Tn(e){var t;return M.initial&&(s0=null),s0?e.debug&&h("cached model:",s0.modelUrl):(u2(["size"],e),s0=await L(e.body.modelPath)),K2=(s0==null?void 0:s0.executor)&&((t=s0==null?void 0:s0.inputs)==null?void 0:t[0].shape)?s0.inputs[0].shape[2]:0,K2<64&&(K2=256),s0}function Zs(e,t,n){let o=e[0][0],s=[],A=0;for(let y=0;yt.body.minConfidence){let l=[o[y][1],o[y][0]];s.push({score:Math.round(100*A)/100,part:U2[y],positionRaw:l,position:[Math.round((n.shape[2]||0)*l[0]),Math.round((n.shape[1]||0)*l[1])]})}A=s.reduce((y,l)=>l.score>y?l.score:y,0);let a=[],i=J0(s.map(y=>y.position),[n.shape[2],n.shape[1]]),c={};for(let[y,l]of Object.entries(Y2)){let f=[];for(let x=0;xg.part===l[x]),m=s.find(g=>g.part===l[x+1]);u&&m&&u.score>(t.body.minConfidence||0)&&m.score>(t.body.minConfidence||0)&&f.push([u.position,m.position])}c[y]=f}let d={id:0,score:A,box:i.box,boxRaw:i.boxRaw,keypoints:s,annotations:c};return v5(d),a.push(d),a}function Xs(e,t,n){let o=[];for(let s=0;st.body.minConfidence){let i=[];for(let l=0;l<17;l++){let f=A[3*l+2];if(f>t.body.minConfidence){let x=[A[3*l+1],A[3*l+0]];i.push({part:U2[l],score:Math.round(100*f)/100,positionRaw:x,position:[Math.round((n.shape[2]||0)*x[0]),Math.round((n.shape[1]||0)*x[1])]})}}let c=J0(i.map(l=>l.position),[n.shape[2],n.shape[1]]),d={};for(let[l,f]of Object.entries(Y2)){let x=[];for(let u=0;uP.part===f[u]),g=i.find(P=>P.part===f[u+1]);m&&g&&m.score>(t.body.minConfidence||0)&&g.score>(t.body.minConfidence||0)&&x.push([m.position,g.position])}d[l]=x}let y={id:s,score:a,box:c.box,boxRaw:c.boxRaw,keypoints:[...i],annotations:d};v5(y),o.push(y)}}return o.sort((s,A)=>A.score-s.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function M5(e,t){var s;if(!(s0!=null&&s0.executor)||!((s=s0==null?void 0:s0.inputs)!=null&&s[0].shape))return[];t.skipAllowed||(Ne.boxes.length=0),R5++;let n=(t.body.skipTime||0)>T()-Ne.last,o=R5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?Ne.bodies:new Promise(async A=>{let a={};R5=0,a.input=bn(e,K2),a.res=s0==null?void 0:s0.execute(a.input),Ne.last=T();let i=await a.res.array();Ne.bodies=a.res.shape[2]===17?Zs(i,t,e):Xs(i,t,e);for(let c of Ne.bodies)gn(c,[e.shape[2]||1,e.shape[1]||1]),hn(c.keypoints);Object.keys(a).forEach(c=>r.dispose(a[c])),A(Ne.bodies)})}var F0,J2=[],Rn=0,P5=Number.MAX_SAFE_INTEGER,_2=0,Q2=2.5;async function Mn(e){if(!F0||M.initial){F0=await L(e.object.modelPath);let t=F0!=null&&F0.executor?Object.values(F0.modelSignature.inputs):void 0;_2=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&h("cached model:",F0.modelUrl);return F0}async function qs(e,t,n){var d,y;let o=0,s=[],A=_2;for(let l of[1,2,4]){let f=l*13,x=r.squeeze(e.find(p=>p.shape[1]===f**2&&(p.shape[2]||0)===Ce.length)),u=await x.array(),m=r.squeeze(e.find(p=>p.shape[1]===f**2&&(p.shape[2]||0)(n.object.minConfidence||0)&&b!==61){let k=(.5+Math.trunc(p%f))/f,N=(.5+Math.trunc(p/f))/f,B=v[p].map(H=>H*(f/l/A)),[q,W]=[k-Q2/l*B[0],N-Q2/l*B[1]],[Z,J]=[k+Q2/l*B[2]-q,N+Q2/l*B[3]-W],R=[q,W,Z,J];R=R.map(H=>Math.max(0,Math.min(H,1)));let D=[R[0]*t[0],R[1]*t[1],R[2]*t[0],R[3]*t[1]],U={id:o++,score:Math.round(100*j)/100,class:b+1,label:Ce[b].label,box:D.map(H=>Math.trunc(H)),boxRaw:R};s.push(U)}}r.dispose([x,m,g,P])}let a=s.map(l=>[l.boxRaw[1],l.boxRaw[0],l.boxRaw[3],l.boxRaw[2]]),i=s.map(l=>l.score),c=[];if(a&&a.length>0){let l=await r.image.nonMaxSuppressionAsync(a,i,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);c=Array.from(await l.data()),r.dispose(l)}return s=s.filter((l,f)=>c.includes(f)).sort((l,f)=>f.score-l.score),s}async function k5(e,t){if(!(F0!=null&&F0.executor))return[];let n=(t.object.skipTime||0)>T()-Rn,o=P5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&J2.length>0?(P5++,J2):(P5=0,!M.kernels.includes("mod")||!M.kernels.includes("sparsetodense")?J2:new Promise(async s=>{let A=[e.shape[2]||0,e.shape[1]||0],a=r.image.resizeBilinear(e,[_2,_2],!1),i=r.div(a,O.tf255),c=r.transpose(i,[0,3,1,2]),d;t.object.enabled&&(d=F0.execute(c)),Rn=T();let y=await qs(d,A,t);J2=y,r.dispose([a,i,c,...d]),s(y)}))}var A2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],Us=A2.length,s2=A2.reduce((e,t,n)=>(e[t]=n,e),{}),Ys=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],H7=Ys.map(([e,t])=>[s2[e],s2[t]]),kn=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function wn(e){let t=e.reduce(({maxX:n,maxY:o,minX:s,minY:A},{position:{x:a,y:i}})=>({maxX:Math.max(n,a),maxY:Math.max(o,i),minX:Math.min(s,a),minY:Math.min(A,i)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function En(e,[t,n],[o,s]){let A=t/o,a=n/s,i=(d,y)=>({id:y,score:d.score,boxRaw:[d.box[0]/s,d.box[1]/o,d.box[2]/s,d.box[3]/o],box:[Math.trunc(d.box[0]*a),Math.trunc(d.box[1]*A),Math.trunc(d.box[2]*a),Math.trunc(d.box[3]*A)],keypoints:d.keypoints.map(({score:l,part:f,position:x})=>({score:l,part:f,position:[Math.trunc(x.x*a),Math.trunc(x.y*A)],positionRaw:[x.x/o,x.y/o]})),annotations:{}});return e.map((d,y)=>i(d,y))}var $2=class{constructor(t,n){E(this,"priorityQueue");E(this,"numberOfElements");E(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function zn(e,t,n,o){let s=n-e,A=o-t;return s*s+A*A}function S5(e,t){return{x:e.x+t.x,y:e.y+t.y}}var E0,Js=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],et=1,qe=16,Qs=50**2;function Sn(e,t,n,o,s,A,a=2){let i=P=>({y:A.get(P.y,P.x,e),x:A.get(P.y,P.x,A.shape[2]/2+e)}),c=(P,v,p)=>({y:z5(Math.round(P.y/qe),0,v-1),x:z5(Math.round(P.x/qe),0,p-1)}),[d,y]=o.shape,l=c(t.position,d,y),f=i(l),u=S5(t.position,f);for(let P=0;P[s2[f],s2[x]]),a=A.map(([,f])=>f),i=A.map(([f])=>f),c=t.shape[2],d=a.length,y=new Array(c),l=E5(e.part,qe,n);y[e.part.id]={score:e.score,part:A2[e.part.id],position:l};for(let f=d-1;f>=0;--f){let x=a[f],u=i[f];y[x]&&!y[u]&&(y[u]=Sn(f,y[x],u,t,n,s))}for(let f=0;ft){i=!1;break}if(!i)break}return i}function eA(e,t){let[n,o,s]=t.shape,A=new $2(n*o*s,({score:a})=>a);for(let a=0;a{var a;let A=(a=s[o])==null?void 0:a.position;return A?zn(n,t,A.y,A.x)<=Qs:!1})}function tA(e,t){return t.reduce((o,{position:s,score:A},a)=>(jn(e,s,a)||(o+=A),o),0)/t.length}function nA(e,t,n,o,s,A){let a=[],i=eA(A,t);for(;a.lengthx.score>A);let l=tA(a,y),f=wn(y);l>A&&a.push({keypoints:y,box:f,score:Math.round(100*l)/100})}return a}async function j5(e,t){if(!(E0!=null&&E0.executor))return[];let n=r.tidy(()=>{if(!E0.inputs[0].shape)return[];let a=r.image.resizeBilinear(e,[E0.inputs[0].shape[2],E0.inputs[0].shape[1]]),i=r.sub(r.div(r.cast(a,"float32"),127.5),1),d=E0.execute(i,Js).map(y=>r.squeeze(y,[0]));return d[1]=r.sigmoid(d[1]),d}),o=await Promise.all(n.map(a=>a.buffer()));for(let a of n)r.dispose(a);let s=nA(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return E0.inputs[0].shape?En(s,[e.shape[1],e.shape[2]],[E0.inputs[0].shape[2],E0.inputs[0].shape[1]]):[]}async function In(e){return!E0||M.initial?E0=await L(e.body.modelPath):e.debug&&h("cached model:",E0.modelUrl),E0}var U0,oA=["fgr","pha","r1o","r2o","r3o","r4o"],A0={},N5=0;function On(e){r.dispose([A0.r1i,A0.r2i,A0.r3i,A0.r4i,A0.downsample_ratio]),A0.r1i=r.tensor(0),A0.r2i=r.tensor(0),A0.r3i=r.tensor(0),A0.r4i=r.tensor(0),N5=e.segmentation.ratio||.5,A0.downsample_ratio=r.tensor(N5)}async function L5(e){return!U0||M.initial?U0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",U0.modelUrl),On(e),U0}var Ln=e=>r.tidy(()=>{let t=r.squeeze(e,[0]),n=r.mul(t,O.tf255);return r.cast(n,"int32")});function I5(e,t){let n=e?Ln(e):r.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?Ln(t):r.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),s=r.concat([n,o],-1);return r.dispose([n,o]),s}function rA(e){return r.tidy(()=>{let t={};return t.unstack=r.unstack(e,-1),t.concat=r.concat(t.unstack,1),t.split=r.split(t.concat,4,1),t.stack=r.concat(t.split,2),t.squeeze=r.squeeze(t.stack,[0]),t.expand=r.expandDims(t.squeeze,-1),t.add=r.add(t.expand,1),t.mul=r.mul(t.add,127.5),t.cast=r.cast(t.mul,"int32"),t.tile=r.tile(t.cast,[1,1,3]),t.alpha=r.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),r.concat([t.tile,t.alpha],-1)})}async function Cn(e,t){if(U0||(U0=await L5(t)),!(U0!=null&&U0.executor))return null;A0.src=r.div(e,255),N5!==t.segmentation.ratio&&On(t);let[n,o,s,A,a,i]=await U0.executeAsync(A0,oA),c;switch(t.segmentation.mode||"default"){case"default":c=I5(n,o);break;case"alpha":c=I5(null,o);break;case"foreground":c=I5(n,null);break;case"state":c=rA(s);break;default:c=r.tensor(0)}return r.dispose([A0.src,n,o,A0.r1i,A0.r2i,A0.r3i,A0.r4i]),[A0.r1i,A0.r2i,A0.r3i,A0.r4i]=[s,A,a,i],c}var p0;async function O5(e){return!p0||M.initial?p0=await L(e.segmentation.modelPath):e.debug&&h("cached model:",p0.modelUrl),p0}async function Dn(e,t){var s;if(p0||(p0=await O5(t)),!(p0!=null&&p0.executor)||!((s=p0==null?void 0:p0.inputs)!=null&&s[0].shape))return null;let n={};n.resize=r.image.resizeBilinear(e,[p0.inputs[0].shape?p0.inputs[0].shape[1]:0,p0.inputs[0].shape?p0.inputs[0].shape[2]:0],!1),n.norm=r.div(n.resize,O.tf255),n.res=p0.execute(n.norm),n.squeeze=r.squeeze(n.res,[0]),n.alpha=r.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=r.mul(n.alpha,O.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=r.squeeze(e),n.concat=r.concat([n.input,n.mul],-1),o=r.cast(n.concat,"int32");break;case"alpha":o=r.cast(n.mul,"int32");break;default:o=r.tensor(0)}return Object.keys(n).forEach(A=>r.dispose(n[A])),o}function tt(e,t,n){var d,y;if(!t||!((d=e==null?void 0:e.config)!=null&&d.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],s=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],A=[],a=[],i=t.modelUrl,c=t.executor;if((y=c==null?void 0:c.graph)!=null&&y.nodes)for(let l of Object.values(c.graph.nodes)){let f=l.op.toLowerCase();A.includes(f)||A.push(f)}else!c&&e.config.debug&&h("model not loaded",n);for(let l of A)!o.includes(l)&&!s.includes(l)&&!e.env.kernels.includes(l)&&!e.env.kernels.includes(l.replace("_",""))&&!e.env.kernels.includes(l.replace("native",""))&&!e.env.kernels.includes(l.replace("v2",""))&&a.push(l);return e.config.debug&&a.length>0&&h("model validation failed:",n,a),a.length>0?{name:n,missing:a,ops:A,url:i}:null}var a2=class{constructor(t){E(this,"instance");E(this,"models",{});this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let A of Object.values(y0))t+=A.sizeFromManifest,n+=A.sizeLoadedWeights,o+=A.sizeDesired;let s=o>0?n/o:0;return{numLoadedModels:Object.values(y0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:s,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(y0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(t){var o,s,A,a,i,c,d,y,l,f,x,u,m,g,P,v,p,b,j,k,N,B,q,W,Z,J,R;M.initial&&this.reset(),t&&(this.instance=t);let n={};n.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?I1(this.instance.config):null,n.antispoof=this.instance.config.face.enabled&&((o=this.instance.config.face.antispoof)==null?void 0:o.enabled)&&!this.models.antispoof?o3(this.instance.config):null,n.liveness=this.instance.config.face.enabled&&((s=this.instance.config.face.liveness)==null?void 0:s.enabled)&&!this.models.liveness?a3(this.instance.config):null,n.faceres=this.instance.config.face.enabled&&((A=this.instance.config.face.description)==null?void 0:A.enabled)&&!this.models.faceres?_1(this.instance.config):null,n.emotion=this.instance.config.face.enabled&&((a=this.instance.config.face.emotion)==null?void 0:a.enabled)&&!this.models.emotion?Y1(this.instance.config):null,n.iris=this.instance.config.face.enabled&&((i=this.instance.config.face.iris)==null?void 0:i.enabled)&&!((c=this.instance.config.face.attention)!=null&&c.enabled)&&!this.models.iris?D1(this.instance.config):null,n.facemesh=this.instance.config.face.enabled&&((d=this.instance.config.face.mesh)==null?void 0:d.enabled)&&!this.models.facemesh?V1(this.instance.config):null,n.gear=this.instance.config.face.enabled&&((y=this.instance.config.face.gear)==null?void 0:y.enabled)&&!this.models.gear?d3(this.instance.config):null,n.ssrnetage=this.instance.config.face.enabled&&((l=this.instance.config.face.ssrnet)==null?void 0:l.enabled)&&!this.models.ssrnetage?m3(this.instance.config):null,n.ssrnetgender=this.instance.config.face.enabled&&((f=this.instance.config.face.ssrnet)==null?void 0:f.enabled)&&!this.models.ssrnetgender?b3(this.instance.config):null,n.mobilefacenet=this.instance.config.face.enabled&&((x=this.instance.config.face.mobilefacenet)==null?void 0:x.enabled)&&!this.models.mobilefacenet?M3(this.instance.config):null,n.insightface=this.instance.config.face.enabled&&((u=this.instance.config.face.insightface)==null?void 0:u.enabled)&&!this.models.insightface?z3(this.instance.config):null,n.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((m=this.instance.config.body.modelPath)==null?void 0:m.includes("blazepose"))?f1(this.instance.config):null,n.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?y1(this.instance.config):null,n.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((g=this.instance.config.body.modelPath)==null?void 0:g.includes("efficientpose"))?g1(this.instance.config):null,n.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((P=this.instance.config.body.modelPath)==null?void 0:P.includes("movenet"))?Tn(this.instance.config):null,n.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((v=this.instance.config.body.modelPath)==null?void 0:v.includes("posenet"))?In(this.instance.config):null,n.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((b=(p=this.instance.config.hand.detector)==null?void 0:p.modelPath)==null?void 0:b.includes("handtrack"))?cn(this.instance.config):null,n.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((k=(j=this.instance.config.hand.detector)==null?void 0:j.modelPath)==null?void 0:k.includes("handtrack"))?dn(this.instance.config):null,(B=(N=this.instance.config.hand.detector)==null?void 0:N.modelPath)!=null&&B.includes("handdetect")&&([n.handpose,n.handskeleton]=this.models.handpose?[null,null]:await rn(this.instance.config)),n.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((q=this.instance.config.object.modelPath)==null?void 0:q.includes("centernet"))?u1(this.instance.config):null,n.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((W=this.instance.config.object.modelPath)==null?void 0:W.includes("nanodet"))?Mn(this.instance.config):null,n.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&((Z=this.instance.config.segmentation.modelPath)==null?void 0:Z.includes("selfie"))?O5(this.instance.config):null,n.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&((J=this.instance.config.segmentation.modelPath)==null?void 0:J.includes("meet"))?b5(this.instance.config):null,n.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((R=this.instance.config.segmentation.modelPath)==null?void 0:R.includes("rvm"))?L5(this.instance.config):null;for(let[D,U]of Object.entries(n))U!=null&&U.then&&U.then(H=>this.models[D]=H);await Promise.all(Object.values(n))}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(y0).find(s=>s.startsWith(n.name));!o||(n.size=y0[o].sizeLoadedWeights,n.url=y0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let s=tt(this.instance,o,n);s&&t.push(s)}return t}};function Hn(e,t,n,o,s){var i,c,d,y,l,f;let A=0,a=[];for(let x of e){let u={id:A++,face:x,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let b of t)x.box[0]>b.box[0]&&x.box[0]b.box[1]&&x.box[1]+x.box[3]u.body.box[0]&&b.box[0]+b.box[2]u.body.box[1]&&b.box[1]+b.box[3]u.body.box[0]&&b.box[1]+b.box[3]>u.body.box[1]&&b.box[1]+b.box[3]{b&&b.length===4&&(m.push(b[0],b[0]+b[2]),g.push(b[1],b[1]+b[3]))};P(u.face.box),P((y=u.body)==null?void 0:y.box),P((l=u.hands.left)==null?void 0:l.box),P((f=u.hands.right)==null?void 0:f.box);let v=Math.min(...m),p=Math.min(...g);u.box=[v,p,Math.max(...m)-v,Math.max(...g)-p],(s==null?void 0:s[1])&&(s==null?void 0:s[2])&&(u.boxRaw=[u.box[0]/s[2],u.box[1]/s[1],u.box[2]/s[2],u.box[3]/s[1]]),a.push(u)}return a}var nt=` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -837,4 +837,4 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;async function aA(e){let t=(s,A="application/octet-stream")=>fetch(`data:${A};base64,${s}`).then(a=>a.blob()),n,o;switch(e.config.warmup){case"face":n=await t(nt);break;case"body":case"full":n=await t(ot);break;default:n=null}if(n){let s=await createImageBitmap(n);o=await e.detect(s,e.config),s.close()}return o}async function iA(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+nt;break;case"full":case"body":n="data:image/jpeg;base64,"+ot;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(M.Image)o=new M.Image;else{t(void 0);return}o.onload=async()=>{let s=L0(o.naturalWidth,o.naturalHeight);if(!s)h("Warmup: Canvas not found"),t(void 0);else{let A=s.getContext("2d");A&&A.drawImage(o,0,0);let a=await e.image(s,!0),i=a.tensor?await e.detect(a.tensor,e.config):void 0;t(i)}},n?o.src=n:t(void 0)})}async function lA(e){let t=s=>Buffer.from(s,"base64"),n;e.config.warmup==="face"?n=t(nt):n=t(ot);let o;if("node"in r&&r.getBackend()==="tensorflow"){let s=r.node.decodeJpeg(n),A=r.expandDims(s,0);e.tf.dispose(s),o=await e.detect(A,e.config),e.tf.dispose(A)}else e.config.debug&&h("Warmup tfjs-node not loaded");return o}async function cA(e){let t;return typeof createImageBitmap=="function"?t=await aA(e):typeof Image!="undefined"||M.Canvas!==void 0?t=await iA(e):t=await lA(e),t}async function xA(e){var i,c,x,y;if(!r.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=r.getBackend(),n=r.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;r.env().set("ENGINE_COMPILE_ONLY",!0);let o=r.engine().state.numTensors,s=[];for(let[l,f]of Object.entries(e.models.models)){if(!f)continue;let d=(f==null?void 0:f.modelSignature)&&((c=(i=f==null?void 0:f.inputs)==null?void 0:i[0])==null?void 0:c.shape)?[...f.inputs[0].shape]:[1,64,64,3],u=(f==null?void 0:f.modelSignature)&&((y=(x=f==null?void 0:f.inputs)==null?void 0:x[0])==null?void 0:y.dtype)?f.inputs[0].dtype:"float32";for(let g=0;gr.dispose(P)):r.dispose(g)}catch(g){e.config.debug&&h("compile fail model:",l)}r.dispose(m)}let A=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&h("compile pass:",{models:s,kernels:A.length}),r.env().set("ENGINE_COMPILE_ONLY",!1);let a=r.engine().state.numTensors;a-o>0&&h("tensor leak:",a-o)}async function Gn(e,t){await $e(e,!1);let n=T();return e.state="warmup",t&&(e.config=Q(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?ee():new Promise(async o=>{await e.models.load(),await xA(e);let s=await cA(e),A=T();e.config.debug&&h("warmup",e.config.warmup,Math.round(A-n),"ms"),e.emit("warmup"),o(s)})}var Ue,i2,l2,rt,he,Vn=class{constructor(t){E(this,"version");E(this,"config");E(this,"result");E(this,"state");E(this,"process");E(this,"tf");E(this,"env",M);E(this,"draw",bt);E(this,"match",T5);E(this,"models");E(this,"events");E(this,"faceTriangulation");E(this,"faceUVMap");E(this,"performance");Z0(this,Ue,void 0);Z0(this,i2,void 0);Z0(this,l2,void 0);E(this,"analyze",(...t)=>{if(!v0(this,i2))return;let n=this.tf.engine().state.numTensors,o=v0(this,Ue);Y0(this,Ue,n);let s=n-o;s!==0&&h(...t,s)});Z0(this,rt,t=>{if(!v0(this,l2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof r.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});E(this,"webcam",new p2);E(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});Z0(this,he,{});let n=(Ke.tfjs||r.version_core).replace(/-(.*)/,"");Le.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,Le.modelBasePath=M.browser?"../models/":"file://models/",this.version=xt,Object.defineProperty(this,"version",{value:xt}),this.config=JSON.parse(JSON.stringify(Le)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=Q(this.config,t)),_5(this.config),this.tf=r,this.state="idle",Y0(this,Ue,0),Y0(this,i2,!1),Y0(this,l2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new a2(this),ht(),this.result=ee(),this.process={tensor:null,canvas:null},this.faceTriangulation=Z1,this.faceUVMap=X1,tt(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&h(`version: ${this.version}`),this.config.debug&&h(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&h("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(Le)),this.config.backend=t,lt(),M.initial=!0}validate(t){let n=At(Le,t||this.config);return n.length===0&&(this.config=Q(this.config,t)),n}now(){return T()}image(t,n=!1){return y2(t,this.config,n)}async segmentation(t,n){var A,a,i;if(n&&(this.config=Q(this.config,n)),!this.config.segmentation.enabled)return null;let o=await y2(t,this.config);if(!o.tensor)return null;let s=null;return(A=this.config.segmentation.modelPath)!=null&&A.includes("rvm")&&(s=await Cn(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("meet")&&(s=await fn(o.tensor,this.config)),(i=this.config.segmentation.modelPath)!=null&&i.includes("selfie")&&(s=await Dn(o.tensor,this.config)),r.dispose(o.tensor),s}compare(t,n){return Q5(this.config,t,n)}async init(){await $e(this,!0),await this.tf.ready(),lt()}async load(t){this.state="load";let n=T(),o=Object.values(this.models.models).filter(a=>a).length;t&&(this.config=Q(this.config,t)),this.env.initial&&(await $e(this,!1)||h("error: backend check failed"),await r.ready(),this.env.browser&&(this.config.debug&&h("configuration:",this.config),this.config.debug&&h("tf flags:",this.tf.ENV.flags))),await this.models.load(this),this.env.initial&&this.config.debug&&h("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models.models).filter(a=>a).length!==o&&(this.models.validate(),this.emit("load"));let A=Math.trunc(T()-n);A>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+A:A)}next(t=this.result){return yn(t,this.config)}async warmup(t){let n=T(),o=await Gn(this,t),s=T();return this.performance.warmup=Math.trunc(s-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),s={},A=0;for(let i of o.kernels){let c=Number(i.kernelTimeMs)||0;s[i.name]?s[i.name]+=c:s[i.name]=c,A+=c}let a=[];Object.entries(s).forEach(i=>a.push({kernel:i[0],time:i[1],perc:0}));for(let i of a)i.perc=Math.round(1e3*i.time/A)/1e3,i.time=Math.round(1e3*i.time)/1e3;return a.sort((i,c)=>c.time-i.time),a.length=20,a}async detect(t,n){return this.state="detect",new Promise(async o=>{var g,P,v,p,b,j,k,N,B,q,W,Z,J,R,D,U,H,a0,o0,C,F;this.state="config";let s;this.config=Q(this.config,n),this.state="check";let A=v0(this,rt).call(this,t);A&&(h(A,t),this.emit("error"),o(ee(A)));let a=T();await this.load(),s=T(),this.state="image";let i=await y2(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(T()-s):Math.trunc(T()-s),this.analyze("Get Image:"),!i.tensor){this.config.debug&&h("could not convert input to tensor"),this.emit("error"),o(ee("could not convert input to tensor"));return}this.emit("image"),s=T(),this.config.skipAllowed=await J5(this.config,i.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(T()-s):Math.trunc(T()-s),this.analyze("Check Changed:");let c=[],x=[],y=[],l=[];this.state="detect:face",this.config.async?(c=this.config.face.enabled?A5(this,i.tensor):[],this.performance.face&&delete this.performance.face):(s=T(),c=this.config.face.enabled?await A5(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(c=await c),this.analyze("Start Body:"),this.state="detect:body";let f=this.config.body.maxDetected===-1?Q(this.config,{body:{maxDetected:this.config.face.enabled?1*c.length:1}}):this.config;this.config.async?((g=this.config.body.modelPath)!=null&&g.includes("posenet")?x=this.config.body.enabled?j5(i.tensor,f):[]:(P=this.config.body.modelPath)!=null&&P.includes("blazepose")?x=this.config.body.enabled?Mt(i.tensor,f):[]:(v=this.config.body.modelPath)!=null&&v.includes("efficientpose")?x=this.config.body.enabled?jt(i.tensor,f):[]:(p=this.config.body.modelPath)!=null&&p.includes("movenet")&&(x=this.config.body.enabled?M5(i.tensor,f):[]),this.performance.body&&delete this.performance.body):(s=T(),(b=this.config.body.modelPath)!=null&&b.includes("posenet")?x=this.config.body.enabled?await j5(i.tensor,f):[]:(j=this.config.body.modelPath)!=null&&j.includes("blazepose")?x=this.config.body.enabled?await Mt(i.tensor,f):[]:(k=this.config.body.modelPath)!=null&&k.includes("efficientpose")?x=this.config.body.enabled?await jt(i.tensor,f):[]:(N=this.config.body.modelPath)!=null&&N.includes("movenet")&&(x=this.config.body.enabled?await M5(i.tensor,f):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let d=this.config.hand.maxDetected===-1?Q(this.config,{hand:{maxDetected:this.config.face.enabled?2*c.length:1}}):this.config;this.config.async?((q=(B=this.config.hand.detector)==null?void 0:B.modelPath)!=null&&q.includes("handdetect")?y=this.config.hand.enabled?x5(i.tensor,d):[]:(Z=(W=this.config.hand.detector)==null?void 0:W.modelPath)!=null&&Z.includes("handtrack")&&(y=this.config.hand.enabled?f5(i.tensor,d):[]),this.performance.hand&&delete this.performance.hand):(s=T(),(R=(J=this.config.hand.detector)==null?void 0:J.modelPath)!=null&&R.includes("handdetect")?y=this.config.hand.enabled?await x5(i.tensor,d):[]:(U=(D=this.config.hand.detector)==null?void 0:D.modelPath)!=null&&U.includes("handtrack")&&(y=this.config.hand.enabled?await f5(i.tensor,d):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((H=this.config.object.modelPath)!=null&&H.includes("nanodet")?l=this.config.object.enabled?k5(i.tensor,this.config):[]:(a0=this.config.object.modelPath)!=null&&a0.includes("centernet")&&(l=this.config.object.enabled?wt(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(s=T(),(o0=this.config.object.modelPath)!=null&&o0.includes("nanodet")?l=this.config.object.enabled?await k5(i.tensor,this.config):[]:(C=this.config.object.modelPath)!=null&&C.includes("centernet")&&(l=this.config.object.enabled?await wt(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([c,x,y,l]=await Promise.all([c,x,y,l])),this.state="detect:gesture";let u=[];this.config.gesture.enabled&&(s=T(),u=[...G3(c),...H3(x),...Z3(y),...V3(c)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(T()-a):Math.trunc(T()-a);let m=((F=this.process.tensor)==null?void 0:F.shape)||[0,0,0,0];this.result={face:c,body:x,hand:y,gesture:u,object:l,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:m[2],height:m[1],get persons(){return Hn(c,x,y,u,m)}},r.dispose(i.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(v0(this,he)[t.id]||(this.config.debug&&h("video start",t.id),v0(this,he)[t.id]=!0),!t.paused&&v0(this,he)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),v0(this,he)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&h("video stop",t.id),v0(this,he)[t.id]=!1)}};Ue=new WeakMap,i2=new WeakMap,l2=new WeakMap,rt=new WeakMap,he=new WeakMap;export{m2 as Env,Vn as Human,Vn as default,Le as defaults,bt as draw,ee as empty,M as env,T5 as match,Bn as models}; +2Q==`;async function aA(e){let t=(s,A="application/octet-stream")=>fetch(`data:${A};base64,${s}`).then(a=>a.blob()),n,o;switch(e.config.warmup){case"face":n=await t(nt);break;case"body":case"full":n=await t(ot);break;default:n=null}if(n){let s=await createImageBitmap(n);o=await e.detect(s,e.config),s.close()}return o}async function iA(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+nt;break;case"full":case"body":n="data:image/jpeg;base64,"+ot;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(M.Image)o=new M.Image;else{t(void 0);return}o.onload=async()=>{let s=L0(o.naturalWidth,o.naturalHeight);if(!s)h("Warmup: Canvas not found"),t(void 0);else{let A=s.getContext("2d");A&&A.drawImage(o,0,0);let a=await e.image(s,!0),i=a.tensor?await e.detect(a.tensor,e.config):void 0;t(i)}},n?o.src=n:t(void 0)})}async function lA(e){let t=s=>Buffer.from(s,"base64"),n;e.config.warmup==="face"?n=t(nt):n=t(ot);let o;if("node"in r&&r.getBackend()==="tensorflow"){let s=r.node.decodeJpeg(n),A=r.expandDims(s,0);e.tf.dispose(s),o=await e.detect(A,e.config),e.tf.dispose(A)}else e.config.debug&&h("Warmup tfjs-node not loaded");return o}async function cA(e){let t;return typeof createImageBitmap=="function"?t=await aA(e):typeof Image!="undefined"||M.Canvas!==void 0?t=await iA(e):t=await lA(e),t}async function dA(e){var i,c,d,y;if(!r.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=r.getBackend(),n=r.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;r.env().set("ENGINE_COMPILE_ONLY",!0);let o=r.engine().state.numTensors,s=[];for(let[l,f]of Object.entries(e.models.models)){if(!f)continue;let x=(f==null?void 0:f.modelSignature)&&((c=(i=f==null?void 0:f.inputs)==null?void 0:i[0])==null?void 0:c.shape)?[...f.inputs[0].shape]:[1,64,64,3],u=(f==null?void 0:f.modelSignature)&&((y=(d=f==null?void 0:f.inputs)==null?void 0:d[0])==null?void 0:y.dtype)?f.inputs[0].dtype:"float32";for(let g=0;gr.dispose(P)):r.dispose(g)}catch(g){e.config.debug&&h("compile fail model:",l)}r.dispose(m)}let A=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&h("compile pass:",{models:s,kernels:A.length}),r.env().set("ENGINE_COMPILE_ONLY",!1);let a=r.engine().state.numTensors;a-o>0&&h("tensor leak:",a-o)}async function Gn(e,t){await $e(e,!1);let n=T();return e.state="warmup",t&&(e.config=Q(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?ee():new Promise(async o=>{await e.models.load(),await dA(e);let s=await cA(e),A=T();e.config.debug&&h("warmup",e.config.warmup,Math.round(A-n),"ms"),e.emit("warmup"),o(s)})}var Ue,i2,l2,rt,he,Vn=class{constructor(t){E(this,"version");E(this,"config");E(this,"result");E(this,"state");E(this,"process");E(this,"tf");E(this,"env",M);E(this,"draw",bt);E(this,"match",T5);E(this,"models");E(this,"events");E(this,"faceTriangulation");E(this,"faceUVMap");E(this,"performance");Z0(this,Ue,void 0);Z0(this,i2,void 0);Z0(this,l2,void 0);E(this,"analyze",(...t)=>{if(!v0(this,i2))return;let n=this.tf.engine().state.numTensors,o=v0(this,Ue);Y0(this,Ue,n);let s=n-o;s!==0&&h(...t,s)});Z0(this,rt,t=>{if(!v0(this,l2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof r.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});E(this,"webcam",new p2);E(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});Z0(this,he,{});let n=(Ke.tfjs||r.version_core).replace(/-(.*)/,"");Le.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,Le.modelBasePath=M.browser?"../models/":"file://models/",this.version=dt,Object.defineProperty(this,"version",{value:dt}),this.config=JSON.parse(JSON.stringify(Le)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=Q(this.config,t)),_5(this.config),this.tf=r,this.state="idle",Y0(this,Ue,0),Y0(this,i2,!1),Y0(this,l2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new a2(this),ht(),this.result=ee(),this.process={tensor:null,canvas:null},this.faceTriangulation=Z1,this.faceUVMap=X1,tt(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&h(`version: ${this.version}`),this.config.debug&&h(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&h("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(Le)),this.config.backend=t,lt(),M.initial=!0}validate(t){let n=At(Le,t||this.config);return n.length===0&&(this.config=Q(this.config,t)),n}now(){return T()}image(t,n=!1){return y2(t,this.config,n)}async segmentation(t,n){var A,a,i;if(n&&(this.config=Q(this.config,n)),!this.config.segmentation.enabled)return null;let o=await y2(t,this.config);if(!o.tensor)return null;let s=null;return(A=this.config.segmentation.modelPath)!=null&&A.includes("rvm")&&(s=await Cn(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("meet")&&(s=await fn(o.tensor,this.config)),(i=this.config.segmentation.modelPath)!=null&&i.includes("selfie")&&(s=await Dn(o.tensor,this.config)),r.dispose(o.tensor),s}compare(t,n){return Q5(this.config,t,n)}async init(){await $e(this,!0),await this.tf.ready(),lt()}async load(t){this.state="load";let n=T(),o=Object.values(this.models.models).filter(a=>a).length;t&&(this.config=Q(this.config,t)),this.env.initial&&(await $e(this,!1)||h("error: backend check failed"),await r.ready(),this.env.browser&&(this.config.debug&&h("configuration:",this.config),this.config.debug&&h("tf flags:",this.tf.ENV.flags))),await this.models.load(this),this.env.initial&&this.config.debug&&h("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models.models).filter(a=>a).length!==o&&(this.models.validate(),this.emit("load"));let A=Math.trunc(T()-n);A>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+A:A)}next(t=this.result){return yn(t,this.config)}async warmup(t){let n=T(),o=await Gn(this,t),s=T();return this.performance.warmup=Math.trunc(s-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),s={},A=0;for(let i of o.kernels){let c=Number(i.kernelTimeMs)||0;s[i.name]?s[i.name]+=c:s[i.name]=c,A+=c}let a=[];Object.entries(s).forEach(i=>a.push({kernel:i[0],time:i[1],perc:0}));for(let i of a)i.perc=Math.round(1e3*i.time/A)/1e3,i.time=Math.round(1e3*i.time)/1e3;return a.sort((i,c)=>c.time-i.time),a.length=20,a}async detect(t,n){return this.state="detect",new Promise(async o=>{var g,P,v,p,b,j,k,N,B,q,W,Z,J,R,D,U,H,a0,o0,C,F;this.state="config";let s;this.config=Q(this.config,n),this.state="check";let A=v0(this,rt).call(this,t);A&&(h(A,t),this.emit("error"),o(ee(A)));let a=T();await this.load(),s=T(),this.state="image";let i=await y2(t,this.config);if(this.process=i,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(T()-s):Math.trunc(T()-s),this.analyze("Get Image:"),!i.tensor){this.config.debug&&h("could not convert input to tensor"),this.emit("error"),o(ee("could not convert input to tensor"));return}this.emit("image"),s=T(),this.config.skipAllowed=await J5(this.config,i.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(T()-s):Math.trunc(T()-s),this.analyze("Check Changed:");let c=[],d=[],y=[],l=[];this.state="detect:face",this.config.async?(c=this.config.face.enabled?A5(this,i.tensor):[],this.performance.face&&delete this.performance.face):(s=T(),c=this.config.face.enabled?await A5(this,i.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(c=await c),this.analyze("Start Body:"),this.state="detect:body";let f=this.config.body.maxDetected===-1?Q(this.config,{body:{maxDetected:this.config.face.enabled?1*c.length:1}}):this.config;this.config.async?((g=this.config.body.modelPath)!=null&&g.includes("posenet")?d=this.config.body.enabled?j5(i.tensor,f):[]:(P=this.config.body.modelPath)!=null&&P.includes("blazepose")?d=this.config.body.enabled?Mt(i.tensor,f):[]:(v=this.config.body.modelPath)!=null&&v.includes("efficientpose")?d=this.config.body.enabled?jt(i.tensor,f):[]:(p=this.config.body.modelPath)!=null&&p.includes("movenet")&&(d=this.config.body.enabled?M5(i.tensor,f):[]),this.performance.body&&delete this.performance.body):(s=T(),(b=this.config.body.modelPath)!=null&&b.includes("posenet")?d=this.config.body.enabled?await j5(i.tensor,f):[]:(j=this.config.body.modelPath)!=null&&j.includes("blazepose")?d=this.config.body.enabled?await Mt(i.tensor,f):[]:(k=this.config.body.modelPath)!=null&&k.includes("efficientpose")?d=this.config.body.enabled?await jt(i.tensor,f):[]:(N=this.config.body.modelPath)!=null&&N.includes("movenet")&&(d=this.config.body.enabled?await M5(i.tensor,f):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let x=this.config.hand.maxDetected===-1?Q(this.config,{hand:{maxDetected:this.config.face.enabled?2*c.length:1}}):this.config;this.config.async?((q=(B=this.config.hand.detector)==null?void 0:B.modelPath)!=null&&q.includes("handdetect")?y=this.config.hand.enabled?d5(i.tensor,x):[]:(Z=(W=this.config.hand.detector)==null?void 0:W.modelPath)!=null&&Z.includes("handtrack")&&(y=this.config.hand.enabled?f5(i.tensor,x):[]),this.performance.hand&&delete this.performance.hand):(s=T(),(R=(J=this.config.hand.detector)==null?void 0:J.modelPath)!=null&&R.includes("handdetect")?y=this.config.hand.enabled?await d5(i.tensor,x):[]:(U=(D=this.config.hand.detector)==null?void 0:D.modelPath)!=null&&U.includes("handtrack")&&(y=this.config.hand.enabled?await f5(i.tensor,x):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((H=this.config.object.modelPath)!=null&&H.includes("nanodet")?l=this.config.object.enabled?k5(i.tensor,this.config):[]:(a0=this.config.object.modelPath)!=null&&a0.includes("centernet")&&(l=this.config.object.enabled?wt(i.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(s=T(),(o0=this.config.object.modelPath)!=null&&o0.includes("nanodet")?l=this.config.object.enabled?await k5(i.tensor,this.config):[]:(C=this.config.object.modelPath)!=null&&C.includes("centernet")&&(l=this.config.object.enabled?await wt(i.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([c,d,y,l]=await Promise.all([c,d,y,l])),this.state="detect:gesture";let u=[];this.config.gesture.enabled&&(s=T(),u=[...G3(c),...H3(d),...Z3(y),...V3(c)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(T()-s):Math.trunc(T()-s)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(T()-a):Math.trunc(T()-a);let m=((F=this.process.tensor)==null?void 0:F.shape)||[0,0,0,0];this.result={face:c,body:d,hand:y,gesture:u,object:l,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:m[2],height:m[1],get persons(){return Hn(c,d,y,u,m)}},r.dispose(i.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(v0(this,he)[t.id]||(this.config.debug&&h("video start",t.id),v0(this,he)[t.id]=!0),!t.paused&&v0(this,he)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),v0(this,he)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&h("video stop",t.id),v0(this,he)[t.id]=!1)}};Ue=new WeakMap,i2=new WeakMap,l2=new WeakMap,rt=new WeakMap,he=new WeakMap;export{m2 as Env,Vn as Human,Vn as default,Le as defaults,bt as draw,ee as empty,M as env,T5 as match,Bn as models}; diff --git a/dist/human.node-wasm.js b/dist/human.node-wasm.js index d58da5dd..86143ffd 100644 --- a/dist/human.node-wasm.js +++ b/dist/human.node-wasm.js @@ -4,7 +4,7 @@ author: ' */ -"use strict";var Io=Object.create;var k2=Object.defineProperty;var Oo=Object.getOwnPropertyDescriptor;var Lo=Object.getOwnPropertyNames;var Co=Object.getPrototypeOf,Wo=Object.prototype.hasOwnProperty;var Do=(e,t,n)=>t in e?k2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Fo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),ze=(e,t)=>{for(var n in t)k2(e,n,{get:t[n],enumerable:!0})},w1=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Lo(t))!Wo.call(e,r)&&r!==n&&k2(e,r,{get:()=>t[r],enumerable:!(o=Oo(t,r))||o.enumerable});return e};var Z=(e,t,n)=>(n=e!=null?Io(Co(e)):{},w1(t||!e||!e.__esModule?k2(n,"default",{value:e,enumerable:!0}):n,e)),Bo=e=>w1(k2({},"__esModule",{value:!0}),e);var k=(e,t,n)=>(Do(e,typeof t!="symbol"?t+"":t,n),n),E1=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var G0=(e,t,n)=>(E1(e,t,"read from private field"),n?n.call(e):t.get(e)),me=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},ge=(e,t,n,o)=>(E1(e,t,"write to private field"),o?o.call(e,n):t.set(e,n),n);var H=Fo((ya,E2)=>{"use strict";var qt=Object.defineProperty,Ho=Object.getOwnPropertyDescriptor,Go=Object.getOwnPropertyNames,Vo=Object.prototype.hasOwnProperty,Zo=(e,t)=>{for(var n in t)qt(e,n,{get:t[n],enumerable:!0})},Xt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Go(t))!Vo.call(e,r)&&r!==n&&qt(e,r,{get:()=>t[r],enumerable:!(o=Ho(t,r))||o.enumerable});return e},Ut=(e,t,n)=>(Xt(e,t,"default"),n&&Xt(n,t,"default")),Xo=e=>Xt(qt({},"__esModule",{value:!0}),e),w2={};Zo(w2,{version:()=>Qo});E2.exports=Xo(w2);Ut(w2,require("@tensorflow/tfjs-core"),E2.exports);Ut(w2,require("@tensorflow/tfjs-converter"),E2.exports);Ut(w2,require("@tensorflow/tfjs-backend-wasm"),E2.exports);var z1="4.1.0",qo="4.1.0",Uo="4.1.0",Yo="4.1.0",Ko="4.1.0",Jo="0.0.1-alpha.16",Qo={tfjs:z1,"tfjs-core":z1,"tfjs-converter":qo,"tfjs-backend-cpu":Uo,"tfjs-backend-webgl":Yo,"tfjs-backend-wasm":Ko,"tfjs-backend-webgpu":Jo}});var xa={};ze(xa,{Env:()=>z2,Human:()=>R1,default:()=>R1,defaults:()=>Ye,draw:()=>nt,empty:()=>he,env:()=>R,match:()=>Ot,models:()=>v1});module.exports=Bo(xa);var ae=Z(H());function u(...e){let t=new Date,n=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(n,"Human:",...e)}function S1(e,t){let n=e.endsWith("/")?"":"/",r=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${n}${t}`;if(!r.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${r}`);return r}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Yt(e,t,n="config",o=[]){for(let r of Object.keys(t))if(typeof t[r]=="object")Yt(e[r],t[r],r,o);else{let s=e&&typeof e[r]!="undefined";s||o.push({reason:"unknown property",where:`${n}.${r} = ${t[r]}`});let A=e&&typeof e[r]==typeof t[r];s&&!A&&o.push({reason:"property type mismatch",where:`${n}.${r} = ${t[r]}`,expected:typeof e[r]})}return t.debug&&n==="config"&&o.length>0&&u("invalid configuration",o),o}function a0(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,o)=>(Object.keys(o||{}).forEach(r=>{let s=n[r],A=o[r];Array.isArray(s)&&Array.isArray(A)?n[r]=s.concat(...A):t(s)&&t(A)?n[r]=a0(s,A):n[r]=A}),n),{})}var Ye={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,flags:{},softwareKernels:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,autoBrightness:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!1,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-lite.json"}},object:{enabled:!1,modelPath:"centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"rvm.json",ratio:.5,mode:"default"}};var I0=Z(H());var N=Z(H());var j1=` +"use strict";var Io=Object.create;var k2=Object.defineProperty;var Oo=Object.getOwnPropertyDescriptor;var Lo=Object.getOwnPropertyNames;var Co=Object.getPrototypeOf,Wo=Object.prototype.hasOwnProperty;var Do=(e,t,n)=>t in e?k2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Fo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),ze=(e,t)=>{for(var n in t)k2(e,n,{get:t[n],enumerable:!0})},w1=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Lo(t))!Wo.call(e,r)&&r!==n&&k2(e,r,{get:()=>t[r],enumerable:!(o=Oo(t,r))||o.enumerable});return e};var Z=(e,t,n)=>(n=e!=null?Io(Co(e)):{},w1(t||!e||!e.__esModule?k2(n,"default",{value:e,enumerable:!0}):n,e)),Bo=e=>w1(k2({},"__esModule",{value:!0}),e);var k=(e,t,n)=>(Do(e,typeof t!="symbol"?t+"":t,n),n),E1=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)};var G0=(e,t,n)=>(E1(e,t,"read from private field"),n?n.call(e):t.get(e)),me=(e,t,n)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)},ge=(e,t,n,o)=>(E1(e,t,"write to private field"),o?o.call(e,n):t.set(e,n),n);var H=Fo((ya,E2)=>{"use strict";var qt=Object.defineProperty,Ho=Object.getOwnPropertyDescriptor,Go=Object.getOwnPropertyNames,Vo=Object.prototype.hasOwnProperty,Zo=(e,t)=>{for(var n in t)qt(e,n,{get:t[n],enumerable:!0})},Xt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Go(t))!Vo.call(e,r)&&r!==n&&qt(e,r,{get:()=>t[r],enumerable:!(o=Ho(t,r))||o.enumerable});return e},Ut=(e,t,n)=>(Xt(e,t,"default"),n&&Xt(n,t,"default")),Xo=e=>Xt(qt({},"__esModule",{value:!0}),e),w2={};Zo(w2,{version:()=>Qo});E2.exports=Xo(w2);Ut(w2,require("@tensorflow/tfjs-core"),E2.exports);Ut(w2,require("@tensorflow/tfjs-converter"),E2.exports);Ut(w2,require("@tensorflow/tfjs-backend-wasm"),E2.exports);var z1="4.1.0",qo="4.1.0",Uo="4.1.0",Yo="4.1.0",Ko="4.1.0",Jo="0.0.1-alpha.16",Qo={tfjs:z1,"tfjs-core":z1,"tfjs-converter":qo,"tfjs-backend-cpu":Uo,"tfjs-backend-webgl":Yo,"tfjs-backend-wasm":Ko,"tfjs-backend-webgpu":Jo}});var da={};ze(da,{Env:()=>z2,Human:()=>R1,default:()=>R1,defaults:()=>Ye,draw:()=>nt,empty:()=>he,env:()=>R,match:()=>Ot,models:()=>v1});module.exports=Bo(da);var ae=Z(H());function u(...e){let t=new Date,n=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(n,"Human:",...e)}function S1(e,t){let n=e.endsWith("/")?"":"/",r=t.startsWith(".")||t.startsWith("/")||t.startsWith("http:")||t.startsWith("https:")||t.startsWith("file:")?`${t}`:`${e}${n}${t}`;if(!r.toLocaleLowerCase().includes(".json"))throw new Error(`modelpath error: expecting json file: ${r}`);return r}var g=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function Yt(e,t,n="config",o=[]){for(let r of Object.keys(t))if(typeof t[r]=="object")Yt(e[r],t[r],r,o);else{let s=e&&typeof e[r]!="undefined";s||o.push({reason:"unknown property",where:`${n}.${r} = ${t[r]}`});let A=e&&typeof e[r]==typeof t[r];s&&!A&&o.push({reason:"property type mismatch",where:`${n}.${r} = ${t[r]}`,expected:typeof e[r]})}return t.debug&&n==="config"&&o.length>0&&u("invalid configuration",o),o}function a0(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,o)=>(Object.keys(o||{}).forEach(r=>{let s=n[r],A=o[r];Array.isArray(s)&&Array.isArray(A)?n[r]=s.concat(...A):t(s)&&t(A)?n[r]=a0(s,A):n[r]=A}),n),{})}var Ye={backend:"",modelBasePath:"",cacheModels:!0,validateModels:!0,wasmPath:"",wasmPlatformFetch:!1,debug:!1,async:!0,warmup:"full",cacheSensitivity:.7,skipAllowed:!1,deallocate:!1,flags:{},softwareKernels:!1,filter:{enabled:!0,equalization:!1,width:0,height:0,flip:!1,return:!0,autoBrightness:!0,brightness:0,contrast:0,sharpness:0,blur:0,saturation:0,hue:0,negative:!1,sepia:!1,vintage:!1,kodachrome:!1,technicolor:!1,polaroid:!1,pixelate:0},gesture:{enabled:!0},face:{enabled:!0,detector:{modelPath:"blazeface.json",rotation:!1,maxDetected:1,skipFrames:99,skipTime:2500,minConfidence:.2,iouThreshold:.1,mask:!1,return:!1},mesh:{enabled:!0,modelPath:"facemesh.json",keepInvalid:!1},attention:{enabled:!1,modelPath:"facemesh-attention.json"},iris:{enabled:!0,modelPath:"iris.json"},emotion:{enabled:!0,minConfidence:.1,skipFrames:99,skipTime:1500,modelPath:"emotion.json"},description:{enabled:!0,modelPath:"faceres.json",skipFrames:99,skipTime:3e3,minConfidence:.1},antispoof:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"antispoof.json"},liveness:{enabled:!1,skipFrames:99,skipTime:4e3,modelPath:"liveness.json"}},body:{enabled:!0,modelPath:"movenet-lightning.json",maxDetected:-1,minConfidence:.3,skipFrames:1,skipTime:200},hand:{enabled:!0,rotation:!0,skipFrames:99,skipTime:1e3,minConfidence:.5,iouThreshold:.2,maxDetected:-1,landmarks:!0,detector:{modelPath:"handtrack.json"},skeleton:{modelPath:"handlandmark-lite.json"}},object:{enabled:!1,modelPath:"centernet.json",minConfidence:.2,iouThreshold:.4,maxDetected:10,skipFrames:99,skipTime:2e3},segmentation:{enabled:!1,modelPath:"rvm.json",ratio:.5,mode:"default"}};var I0=Z(H());var N=Z(H());var j1=` precision highp float; attribute vec2 pos; attribute vec2 uv; @@ -96,8 +96,8 @@ c31 * m[6] + c32 * m[7] + c33 * m[8]; gl_FragColor.a = c22.a; } -`;var Kt=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(r,s)=>(n[s]=0,r))},Jt=class{constructor(t,n,o){k(this,"uniform",{});k(this,"attribute",{});k(this,"gl");k(this,"id");k(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(u(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(u("filter: could not create shader"),null)});this.gl=t;let r=this.compile(n,this.gl.VERTEX_SHADER),s=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!r||!s)){if(!this.id){u("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,r),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){u(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),Kt(n,"attribute",this.attribute);for(let A in this.attribute)this.attribute[A]=this.gl.getAttribLocation(this.id,A);Kt(n,"uniform",this.uniform),Kt(o,"uniform",this.uniform);for(let A in this.uniform)this.uniform[A]=this.gl.getUniformLocation(this.id,A)}}};function W1(){let e=0,t=null,n=!1,o=-1,r=[null,null],s=[],A=null,a=null,l=te(100,100),c={},d={INTERMEDIATE:1},i=l.getContext("webgl");if(!i){u("filter: cannot get webgl context");return}this.gl=i;function y(T,m){if(!(T===l.width&&m===l.height)){if(l.width=T,l.height=m,!A){let h=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);A=i.createBuffer(),i.bindBuffer(i.ARRAY_BUFFER,A),i.bufferData(i.ARRAY_BUFFER,h,i.STATIC_DRAW),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}i.viewport(0,0,l.width,l.height),r=[null,null]}}function x(T,m){let h=i.createFramebuffer();i.bindFramebuffer(i.FRAMEBUFFER,h);let S=i.createRenderbuffer();i.bindRenderbuffer(i.RENDERBUFFER,S);let P=i.createTexture();return i.bindTexture(i.TEXTURE_2D,P),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,T,m,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,P,0),i.bindTexture(i.TEXTURE_2D,null),i.bindFramebuffer(i.FRAMEBUFFER,null),{fbo:h,texture:P}}function p(T){return r[T]=r[T]||x(l.width,l.height),r[T]}function f(T=0){if(!a)return;let m=null,h=null,S=!1;e===0?m=t:m=p(o).texture||null,e++,n&&!(T&d.INTERMEDIATE)?(h=null,S=e%2===0):(o=(o+1)%2,h=p(o).fbo||null),i.bindTexture(i.TEXTURE_2D,m),i.bindFramebuffer(i.FRAMEBUFFER,h),i.uniform1f(a.uniform.flipY,S?-1:1),i.drawArrays(i.TRIANGLES,0,6)}function b(T){if(c[T])return a=c[T],i.useProgram((a?a.id:null)||null),a;if(a=new Jt(i,j1,T),!a)return u("filter: could not get webgl program"),null;let m=Float32Array.BYTES_PER_ELEMENT,h=4*m;return i.enableVertexAttribArray(a.attribute.pos),i.vertexAttribPointer(a.attribute.pos,2,i.FLOAT,!1,h,0*m),i.enableVertexAttribArray(a.attribute.uv),i.vertexAttribPointer(a.attribute.uv,2,i.FLOAT,!1,h,2*m),c[T]=a,a}let M={colorMatrix:T=>{let m=new Float32Array(T);m[4]/=255,m[9]/=255,m[14]/=255,m[19]/=255;let h=m[18]===1&&m[3]===0&&m[8]===0&&m[13]===0&&m[15]===0&&m[16]===0&&m[17]===0&&m[19]===0?I1:N1,S=b(h);!S||(i.uniform1fv(S.uniform.m,m),f())},brightness:T=>{let m=(T||0)+1;M.colorMatrix([m,0,0,0,0,0,m,0,0,0,0,0,m,0,0,0,0,0,1,0])},saturation:T=>{let m=(T||0)*2/3+1,h=(m-1)*-.5;M.colorMatrix([m,h,h,0,0,h,m,h,0,0,h,h,m,0,0,0,0,0,1,0])},desaturate:()=>{M.saturation(-1)},contrast:T=>{let m=(T||0)+1,h=-128*(m-1);M.colorMatrix([m,0,0,0,h,0,m,0,0,h,0,0,m,0,h,0,0,0,1,0])},negative:()=>{M.contrast(-2)},hue:T=>{T=(T||0)/180*Math.PI;let m=Math.cos(T),h=Math.sin(T),S=.213,P=.715,I=.072;M.colorMatrix([S+m*(1-S)+h*-S,P+m*-P+h*-P,I+m*-I+h*(1-I),0,0,S+m*-S+h*.143,P+m*(1-P)+h*.14,I+m*-I+h*-.283,0,0,S+m*-S+h*-(1-S),P+m*-P+h*P,I+m*(1-I)+h*I,0,0,0,0,0,1,0])},desaturateLuminance:()=>{M.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{M.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{M.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{M.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{M.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{M.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{M.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{M.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:T=>{let m=new Float32Array(T),h=1/l.width,S=1/l.height,P=b(C1);!P||(i.uniform1fv(P.uniform.m,m),i.uniform2f(P.uniform.px,h,S),f())},detectEdges:()=>{M.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{M.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{M.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:T=>{let m=T||1;M.convolution.call(this,[0,-1*m,0,-1*m,1+4*m,-1*m,0,-1*m,0])},emboss:T=>{let m=T||1;M.convolution.call(this,[-2*m,-1*m,0,-1*m,1,1*m,0,1*m,2*m])},blur:T=>{let m=T/7/l.width,h=T/7/l.height,S=b(L1);!S||(i.uniform2f(S.uniform.px,0,h),f(d.INTERMEDIATE),i.uniform2f(S.uniform.px,m,0),f())},pixelate:T=>{let m=T/l.width,h=T/l.height,S=b(O1);!S||(i.uniform2f(S.uniform.size,m,h),f())}};this.add=function(T){let m=Array.prototype.slice.call(arguments,1),h=M[T];s.push({func:h,args:m})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(T){y(T.width,T.height),e=0,t||(t=i.createTexture()),i.bindTexture(i.TEXTURE_2D,t),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,T);for(let m=0;md.data())),A=Math.max(s[0][0],s[1][0],s[2][0]),l=(A>1?255:1)/A,c;if(l>1){let d=[Y.sub(n[0],o[0]),Y.sub(n[1],o[1]),Y.sub(n[2],o[2])],i=[Y.sub(r[0],o[0]),Y.sub(r[1],o[1]),Y.sub(r[2],o[2])],y=[Y.mul(d[0],l),Y.mul(d[1],l),Y.mul(d[2],l)],x=Y.stack([y[0],y[1],y[2]],2);c=Y.reshape(x,[1,t.shape[0]||0,t.shape[1]||0,3]),Y.dispose([...d,...i,...y])}else c=Y.expandDims(t,0);return Y.dispose([...n,...o,...r,n,t,e]),c}var X2=3840,v0=null,R0=null,c2=null,e0,J0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function Qt(){J0.inputSum=0,J0.cacheDiff=1,J0.sumMethod=0,J0.inputTensor=void 0}function te(e,t){let n;if(R.browser)if(R.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof R.Canvas!="undefined"?n=new R.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function q2(e,t){let n=t||te(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function U2(e,t,n=!0){var y,x,p;if(!e)return t.debug&&u("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof N.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type not recognized");if(e instanceof N.Tensor){let f=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)f=N.expandDims(e,0);else if(e.shape[2]===4){let b=N.slice3d(e,[0,0,0],[-1,-1,3]);f=N.expandDims(b,0),N.dispose(b)}}else e.shape.length===4&&(e.shape[3]===3?f=N.clone(e):e.shape[3]===4&&(f=N.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(f==null||f.shape.length!==4||f.shape[0]!==1||f.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(f.dtype==="int32"){let b=N.cast(f,"float32");N.dispose(f),f=b}return{tensor:f,canvas:t.filter.return?R0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&u("input stream is not ready"),{tensor:null,canvas:v0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!r)return t.debug&&u("cannot determine input dimensions"),{tensor:null,canvas:v0};let s=o,A=r;if(s>X2&&(s=X2,A=Math.trunc(s*r/o)),A>X2&&(A=X2,s=Math.trunc(A*o/r)),(((y=t.filter)==null?void 0:y.width)||0)>0?s=t.filter.width:(((x=t.filter)==null?void 0:x.height)||0)>0&&(s=o*((t.filter.height||0)/r)),(t.filter.height||0)>0?A=t.filter.height:(t.filter.width||0)>0&&(A=r*((t.filter.width||0)/o)),!s||!A)throw new Error("input error: cannot determine dimension");(!v0||v0.width!==s||v0.height!==A)&&(v0=te(s,A));let a=v0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?a.putImageData(e,0,0):t.filter.flip&&typeof a.translate!="undefined"?(a.translate(o,0),a.scale(-1,1),a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),a.setTransform(1,0,0,1,0,0)):a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),(!R0||v0.width!==R0.width||v0.height!==R0.height)&&(R0=te(v0.width,v0.height)),t.filter.enabled&&R.webgl.supported?(e0||(e0=R.browser?new W1:null),R.filter=!!e0,e0!=null&&e0.add?(e0.reset(),t.filter.brightness!==0&&e0.add("brightness",t.filter.brightness),t.filter.contrast!==0&&e0.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&e0.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&e0.add("blur",t.filter.blur),t.filter.saturation!==0&&e0.add("saturation",t.filter.saturation),t.filter.hue!==0&&e0.add("hue",t.filter.hue),t.filter.negative&&e0.add("negative"),t.filter.sepia&&e0.add("sepia"),t.filter.vintage&&e0.add("brownie"),t.filter.sepia&&e0.add("sepia"),t.filter.kodachrome&&e0.add("kodachrome"),t.filter.technicolor&&e0.add("technicolor"),t.filter.polaroid&&e0.add("polaroid"),t.filter.pixelate!==0&&e0.add("pixelate",t.filter.pixelate),((p=e0.get())==null?void 0:p.length)>1?R0=e0.apply(v0):R0=e0.draw(v0)):(t.debug&&u("input process error: cannot initialize filters"),R.webgl.supported=!1,t.filter.enabled=!1,q2(v0,R0))):(q2(v0,R0),e0&&(e0=null),R.filter=!!e0),!n)return{tensor:null,canvas:R0};if(!R0)throw new Error("canvas error: cannot create output");let l,c=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(R.browser&&N.browser)l=N.browser?N.browser.fromPixels(e):null;else{c=e.data.length/e.height/e.width;let f=new Uint8Array(e.data.buffer);l=N.tensor(f,[e.height,e.width,c],"int32")}else if((!c2||R0.width!==c2.width||R0.height!==c2.height)&&(c2=te(R0.width,R0.height)),N.browser&&R.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?l=N.browser.fromPixels(R0):(c2=q2(R0),l=N.browser.fromPixels(c2));else{let M=q2(R0).getContext("2d").getImageData(0,0,s,A);c=M.data.length/s/A;let T=new Uint8Array(M.data.buffer);l=N.tensor(T,[s,A,c])}if(c===4){let f=N.slice3d(l,[0,0,0],[-1,-1,3]);N.dispose(l),l=f}if(!l)throw new Error("input error: cannot create tensor");let d=N.cast(l,"float32"),i=t.filter.equalization?await Z2(d):N.expandDims(d,0);if(N.dispose([l,d]),t.filter.autoBrightness){let f=N.max(i),b=await f.data();t.filter.brightness=b[0]>1?1-b[0]/255:1-b[0],N.dispose(f)}return{tensor:i,canvas:t.filter.return?R0:null}}async function D1(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!J0.inputTensor)J0.inputTensor=N.clone(t);else if(J0.inputTensor.shape[1]!==t.shape[1]||J0.inputTensor.shape[2]!==t.shape[2])N.dispose(J0.inputTensor),J0.inputTensor=N.clone(t);else{let o={};o.diff=N.sub(t,J0.inputTensor),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;N.dispose([J0.inputTensor,o.diff,o.squared,o.sum]),J0.inputTensor=N.clone(t),n=s<=(e.cacheSensitivity||0)}return n}async function F1(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||u("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||u("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=N.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?N.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):N.clone(n),o.diff=N.sub(o.input1,o.input2),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return N.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),s}var S2,j2,N2,z2=class{constructor(){k(this,"browser");k(this,"node");k(this,"worker");k(this,"platform","");k(this,"agent","");k(this,"backends",[]);k(this,"initial");k(this,"filter");k(this,"tfjs");k(this,"offscreen");k(this,"perfadd",!1);k(this,"tensorflow",{version:void 0,gpu:void 0});k(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});k(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});k(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});k(this,"cpu",{model:void 0,flags:[]});k(this,"kernels",[]);me(this,S2,void 0);me(this,j2,void 0);me(this,N2,void 0);if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:I0.version["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}get Canvas(){return G0(this,S2)}set Canvas(t){ge(this,S2,t),globalThis.Canvas=t}get Image(){return G0(this,j2)}set Image(t){ge(this,j2,t),globalThis.Image=t}get ImageData(){return G0(this,N2)}set ImageData(t){ge(this,N2,t),globalThis.ImageData=t}async updateBackend(){this.backends=Object.keys(I0.engine().registryFactory);try{this.tensorflow={version:I0.backend().binding?I0.backend().binding.TF_Version:void 0,gpu:I0.backend().binding?I0.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await I0.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await I0.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=te(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=I0.getKernelsForBackend(I0.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}};S2=new WeakMap,j2=new WeakMap,N2=new WeakMap;var R=new z2;var K2=class{constructor(){k(this,"config");k(this,"element");k(this,"stream");k(this,"devices",[]);k(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});k(this,"start",async t=>{var r,s;if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let A=document.getElementById(t.element);if(A&&A instanceof HTMLVideoElement)this.element=A;else{this.config.debug&&u("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&u("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none"}};if(((r=this.config)==null?void 0:r.width)>0&&(n.video.width={ideal:this.config.width}),((s=this.config)==null?void 0:s.height)>0&&(n.video.height={ideal:this.config.height}),this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&u("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&u("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&u("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(A){u("webcam",A);return}if(!this.stream){this.config.debug&&u("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(A=>{this.element?this.element.onloadeddata=()=>A(!0):A(!1)}),await this.element.play(),this.config.debug&&u("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});k(this,"pause",()=>{this.element&&this.element.pause()});k(this,"play",async()=>{this.element&&await this.element.play()});k(this,"stop",()=>{this.config.debug&&u("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var x2=Z(H());var _t={};ze(_t,{age:()=>yr,"anti-spoofing":()=>Vr,antispoof:()=>tr,blazeface:()=>nr,"blazeface-back":()=>fr,"blazeface-front":()=>mr,"blazepose-detector":()=>pr,"blazepose-full":()=>ur,"blazepose-heavy":()=>hr,"blazepose-lite":()=>br,centernet:()=>or,default:()=>ns,efficientpose:()=>gr,"efficientpose-i-lite":()=>Zr,"efficientpose-ii-lite":()=>Xr,"efficientpose-iv":()=>qr,emotion:()=>rr,faceboxes:()=>Tr,facemesh:()=>sr,"facemesh-attention":()=>Rr,"facemesh-attention-pinto":()=>vr,"facemesh-detection-full":()=>Mr,"facemesh-detection-short":()=>Pr,faceres:()=>Ar,"faceres-deep":()=>kr,gear:()=>wr,gender:()=>zr,"gender-ssrnet-imdb":()=>Er,handdetect:()=>Sr,"handlandmark-full":()=>jr,"handlandmark-lite":()=>ar,"handlandmark-sparse":()=>Nr,handskeleton:()=>Ir,handtrack:()=>ir,"insightface-efficientnet-b0":()=>Ur,"insightface-ghostnet-strides1":()=>Yr,"insightface-ghostnet-strides2":()=>Kr,"insightface-mobilenet-emore":()=>Jr,"insightface-mobilenet-swish":()=>Qr,iris:()=>lr,liveness:()=>cr,meet:()=>Or,mobileface:()=>Lr,mobilefacenet:()=>Cr,models:()=>xr,"movenet-lightning":()=>dr,"movenet-multipose":()=>Wr,"movenet-thunder":()=>Dr,nanodet:()=>Fr,"nanodet-e":()=>_r,"nanodet-g":()=>$r,"nanodet-m":()=>es,"nanodet-t":()=>ts,posenet:()=>Br,rvm:()=>Hr,selfie:()=>Gr});var tr=853098,nr=538928,or=4030290,rr=820516,sr=1477958,Ar=6978814,ar=2023432,ir=2964837,lr=2599092,cr=592976,xr=0,dr=4650216,yr=161240,fr=538928,mr=402048,pr=5928856,ur=6339202,hr=27502466,br=2726402,gr=5651240,Tr=2013002,vr=2387598,Rr=2382414,Mr=1026192,Pr=201268,kr=13957620,wr=1498916,Er=161236,zr=201808,Sr=3515612,jr=5431368,Nr=5286322,Ir=5502280,Or=372228,Lr=2183192,Cr=5171976,Wr=9448838,Dr=12477112,Fr=7574558,Br=5032780,Hr=3739355,Gr=212886,Vr=853098,Zr=2269064,Xr=5651240,qr=25643252,Ur=13013224,Yr=8093408,Kr=8049584,Jr=6938536,Qr=12168584,_r=12319156,$r=7574558,es=1887474,ts=5294216,ns={antispoof:tr,blazeface:nr,centernet:or,emotion:rr,facemesh:sr,faceres:Ar,"handlandmark-lite":ar,handtrack:ir,iris:lr,liveness:cr,models:xr,"movenet-lightning":dr,age:yr,"blazeface-back":fr,"blazeface-front":mr,"blazepose-detector":pr,"blazepose-full":ur,"blazepose-heavy":hr,"blazepose-lite":br,efficientpose:gr,faceboxes:Tr,"facemesh-attention-pinto":vr,"facemesh-attention":Rr,"facemesh-detection-full":Mr,"facemesh-detection-short":Pr,"faceres-deep":kr,gear:wr,"gender-ssrnet-imdb":Er,gender:zr,handdetect:Sr,"handlandmark-full":jr,"handlandmark-sparse":Nr,handskeleton:Ir,meet:Or,mobileface:Lr,mobilefacenet:Cr,"movenet-multipose":Wr,"movenet-thunder":Dr,nanodet:Fr,posenet:Br,rvm:Hr,selfie:Gr,"anti-spoofing":Vr,"efficientpose-i-lite":Zr,"efficientpose-ii-lite":Xr,"efficientpose-iv":qr,"insightface-efficientnet-b0":Ur,"insightface-ghostnet-strides1":Yr,"insightface-ghostnet-strides2":Kr,"insightface-mobilenet-emore":Jr,"insightface-mobilenet-swish":Qr,"nanodet-e":_r,"nanodet-g":$r,"nanodet-m":es,"nanodet-t":ts};var O0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},E0={};async function os(e,t){return O0.debug&&u("load model fetch:",e,t),fetch(e,t)}function B1(e){O0.cacheModels=e.cacheModels,O0.verbose=e.debug,O0.modelBasePath=e.modelBasePath}async function O(e){var c,d,i,y;let t=S1(O0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),r="indexeddb://"+o;E0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:_t[o],inCache:!1,url:""},O0.cacheSupported=typeof indexedDB!="undefined";let s={};try{s=O0.cacheSupported&&O0.cacheModels?await x2.io.listModels():{}}catch(x){O0.cacheSupported=!1}E0[o].inCache=O0.cacheSupported&&O0.cacheModels&&Object.keys(s).includes(r),E0[o].url=E0[o].inCache?r:t;let A=typeof fetch=="undefined"?{}:{fetchFunc:(x,p)=>os(x,p)},a=new x2.GraphModel(E0[o].url,A),l=!1;try{a.findIOHandler(),O0.debug&&u("model load handler:",a.handler)}catch(x){u("error finding model i/o handler:",t,x)}try{let x=await((c=a.handler)==null?void 0:c.load())||null;E0[o].sizeFromManifest=((d=x==null?void 0:x.weightData)==null?void 0:d.byteLength)||0,x?a.loadSync(x):a=await x2.loadGraphModel(E0[o].inCache?r:t,A),E0[o].sizeLoadedWeights=((y=(i=a.artifacts)==null?void 0:i.weightData)==null?void 0:y.byteLength)||0,O0.verbose&&u("load:",{model:o,url:a.modelUrl,bytes:E0[o].sizeLoadedWeights}),l=!0}catch(x){u("error loading model:",t,x)}if(l&&O0.cacheModels&&O0.cacheSupported&&!E0[o].inCache)try{let x=await a.save(r);O0.debug&&u("model saved:",r,x)}catch(x){u("error saving model:",t,x)}return a}var $t="3.0.1";var E=Z(H());var p0=Z(H());var o0={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function As(){let e=o0.gl;!e||(o0.extensions=e.getSupportedExtensions())}function H1(e){var t;if(e.config.backend==="humangl"&&(o0.name in p0.engine().registry&&!((t=o0==null?void 0:o0.gl)!=null&&t.getParameter(o0.gl.VERSION))&&(u("humangl error: backend invalid context"),e.models.reset()),!p0.findBackend(o0.name))){try{o0.canvas=te(100,100)}catch(r){u("humangl error: cannot create canvas:",r);return}try{if(o0.gl=o0.canvas.getContext("webgl2",o0.webGLattr),!o0.gl){u("humangl error: cannot get webgl context");return}if(!o0.gl.getParameter(o0.gl.VERSION).includes("2.0")){u("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}o0.canvas&&(o0.canvas.addEventListener("webglcontextlost",s=>{throw u("humangl error:",s.type),u("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),o0.canvas.addEventListener("webglcontextrestored",s=>{u("humangl error: context restored:",s)}),o0.canvas.addEventListener("webglcontextcreationerror",s=>{u("humangl error: context create:",s)}))}catch(r){u("humangl error: cannot get webgl context:",r);return}try{p0.setWebGLContext(2,o0.gl)}catch(r){u("humangl error: cannot set webgl context:",r);return}try{let r=new p0.GPGPUContext(o0.gl);p0.registerBackend(o0.name,()=>new p0.MathBackendWebGL(r),o0.priority)}catch(r){u("humangl error: cannot register webgl backend:",r);return}try{p0.getKernelsForBackend("webgl").forEach(s=>{let A={...s,backendName:o0.name};p0.registerKernel(A)})}catch(r){u("humangl error: cannot update webgl backend registration:",r);return}try{p0.env().flagRegistry.WEBGL_VERSION&&p0.env().set("WEBGL_VERSION",2)}catch(r){u("humangl error: cannot set WebGL backend flags:",r);return}As();let n=p0.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&u("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):u("humangl error: no current gl context:",o,o0.gl)}}var Se=Z(H()),C={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function G1(){C.tf255=Se.scalar(255,"float32"),C.tf1=Se.scalar(1,"float32"),C.tf2=Se.scalar(2,"float32"),C.tf05=Se.scalar(.5,"float32"),C.tf127=Se.scalar(127.5,"float32"),C.rgb=Se.tensor1d([.2989,.587,.114],"float32")}async function ls(){var e;return await R.updateBackend(),(e=R.tensorflow)!=null&&e.version?"tensorflow":R.webgpu.supported&&R.webgpu.backend?"webgpu":R.webgl.supported&&R.webgl.backend?"webgl":R.wasm.supported&&R.wasm.backend?"wasm":"cpu"}function cs(e){let t=[];if(!R.kernels.includes("mod")){let n={kernelName:"Mod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.sub(o.inputs.a,E.mul(E.div(o.inputs.a,o.inputs.b),o.inputs.b)))};E.registerKernel(n),R.kernels.push("mod"),t.push("mod")}if(!R.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.add(E.mul(E.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),E.mod(o.inputs.a,o.inputs.b)))};E.registerKernel(n),R.kernels.push("floormod"),t.push("floormod")}if(!R.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>{let r=E.getBackend();E.setBackend("cpu");let s=E.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return E.setBackend(r),s})};E.registerKernel(n),R.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&u("registered kernels:",t)}var V1={};async function I2(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await ls()),t||R.initial||e.config.backend&&e.config.backend.length>0&&E.getBackend()!==e.config.backend){let o=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&u("running inside web worker"),R.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&u("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),R.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&u(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),R.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")u("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let s=await navigator.gpu.requestAdapter();if(e.config.debug&&u("enumerated webgpu adapter:",s),!s)u("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let A="requestAdapterInfo"in s?await s.requestAdapterInfo():void 0;u("webgpu adapter info:",A)}}let r=Object.keys(E.engine().registryFactory);if(e.config.backend==="humangl"&&!r.includes("humangl")&&(H1(e),r=Object.keys(E.engine().registryFactory)),e.config.debug&&u("available backends:",r),r.includes(e.config.backend)||(u(`error: backend ${e.config.backend} not found in registry`),e.config.backend=R.node?"tensorflow":"webgl",e.config.debug&&u(`override: setting backend ${e.config.backend}`)),e.config.debug&&u("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(E.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&E.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&u("wasm path:",e.config.wasmPath),typeof E.setWasmPaths!="undefined")E.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let s=!1,A=!1;try{s=await E.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),A=await E.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&u(`wasm execution: ${A?"simd":"no simd"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!A&&u("warning: wasm simd support is not enabled")}catch(a){u("wasm detection failed")}}try{await E.setBackend(e.config.backend),await E.ready()}catch(s){return u("error: cannot set backend:",e.config.backend,s),!1}e.config.debug&&(V1=JSON.parse(JSON.stringify(E.env().flags)))}if((E.getBackend()==="humangl"||E.getBackend()==="webgl")&&(E.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&E.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),E.env().flagRegistry.WEBGL_EXP_CONV&&E.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),E.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),E.getBackend(),e.config.debug){let r=E.env().flags,s={};for(let A of Object.keys(r))V1[A]!==r[A]&&(s[A]=r[A]);e.config.debug&&Object.keys(s).length>0&&u("backend:",E.getBackend(),"flags:",s)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&u("flags:",e.config.flags);for(let[r,s]of Object.entries(e.config.flags))E.env().set(r,s)}E.enableProdMode(),G1(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=E.getBackend(),await R.updateBackend(),cs(e.config),R.initial=!1}return!0}function J2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:r=>{var s;return t.debug&&u("kernelFunc",n,t.backend,r),(s=r==null?void 0:r.inputs)==null?void 0:s.info}};E.registerKernel(o)}R.kernels=E.getKernelsForBackend(E.getBackend()).map(n=>n.kernelName.toLowerCase())}var nt={};ze(nt,{all:()=>Hs,body:()=>_2,canvas:()=>Bs,face:()=>Q2,gesture:()=>tt,hand:()=>$2,init:()=>A5,object:()=>et,options:()=>d0,person:()=>Fs});var Q0=e=>{if(!e)u("draw error: invalid canvas");else if(!e.getContext)u("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)u("draw error: cannot get canvas context");else return t}return null},Ke=e=>Math.round(e*180/Math.PI),_=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),Je=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function ne(e,t,n,o,r){let s=t.replace(/\[.*\]/g,"").split(` -`).map(a=>a.trim()),A=Math.max(0,n);for(let a=s.length-1;a>=0;a--){let l=a*r.lineHeight+o;r.shadowColor&&r.shadowColor!==""&&(e.fillStyle=r.shadowColor,e.fillText(s[a],A+5,l+16)),e.fillStyle=r.labelColor,e.fillText(s[a],A+4,l+15)}}function Te(e,t,n,o,r){e.fillStyle=Je(o,r),e.beginPath(),e.arc(t,n,r.pointSize,0,2*Math.PI),e.fill()}function pe(e,t,n,o,r,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let A=(t+t+o)/2,a=(n+n+r)/2;e.ellipse(A,a,o/2,r/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,n),e.lineTo(t+o-s.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+s.roundRect),e.lineTo(t+o,n+r-s.roundRect),e.quadraticCurveTo(t+o,n+r,t+o-s.roundRect,n+r),e.lineTo(t+s.roundRect,n+r),e.quadraticCurveTo(t,n+r,t,n+r-s.roundRect),e.lineTo(t,n+s.roundRect),e.quadraticCurveTo(t,n,t+s.roundRect,n),e.closePath();e.stroke()}function e5(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=Je(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function X1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){e5(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oO2[e]),La=ds.map(e=>O2[e]),Ca=ys.map(e=>O2[e]);function je(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var fs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ms=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],ps=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],us=[[474,475],[475,476],[476,477],[477,474]],hs=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],bs=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],gs=[[469,470],[470,471],[471,472],[472,469]],Ts=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],Wa={lips:je(fs),leftEye:je(ms),leftEyebrow:je(ps),leftIris:je(us),rightEye:je(hs),rightEyebrow:je(bs),rightIris:je(gs),faceOval:je(Ts)};var vs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Rs=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],Ms=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Ps=[[474,475],[475,476],[476,477],[477,474]],ks=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],ws=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Es=[[469,470],[470,471],[471,472],[472,469]],zs=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function Ne(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Ss={lips:Ne(vs),leftEye:Ne(Rs),leftEyebrow:Ne(Ms),leftIris:Ne(Ps),rightEye:Ne(ks),rightEyebrow:Ne(ws),rightIris:Ne(Es),faceOval:Ne(zs)},js=Object.entries(Ss).map(([e,t])=>t.map(n=>[n,e])).flat(),Da=new Map(js),L2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],$e=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],e2=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var K;function Ns(e,t){var o,r,s,A,a,l,c,d,i;if(!K.drawLabels||((o=K.faceLabels)==null?void 0:o.length)===0)return;let n=K.faceLabels.slice();if(e.score&&(n=_(n,"[score]",100*e.score)),e.gender&&(n=_(n,"[gender]",e.gender)),e.genderScore&&(n=_(n,"[genderScore]",100*e.genderScore)),e.age&&(n=_(n,"[age]",e.age)),e.distance&&(n=_(n,"[distance]",100*e.distance)),e.real&&(n=_(n,"[real]",100*e.real)),e.live&&(n=_(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let y=e.emotion.map(x=>`${Math.trunc(100*x.score)}% ${x.emotion}`);y.length>3&&(y.length=3),n=_(n,"[emotions]",y.join(" "))}(s=(r=e.rotation)==null?void 0:r.angle)!=null&&s.roll&&(n=_(n,"[roll]",Ke(e.rotation.angle.roll))),(a=(A=e.rotation)==null?void 0:A.angle)!=null&&a.yaw&&(n=_(n,"[yaw]",Ke(e.rotation.angle.yaw))),(c=(l=e.rotation)==null?void 0:l.angle)!=null&&c.pitch&&(n=_(n,"[pitch]",Ke(e.rotation.angle.pitch))),(i=(d=e.rotation)==null?void 0:d.gaze)!=null&&i.bearing&&(n=_(n,"[gaze]",Ke(e.rotation.gaze.bearing))),ne(t,n,e.box[0],e.box[1],K)}function Is(e,t){var n,o,r,s;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,a=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}if(((r=e.annotations)==null?void 0:r.rightEyeIris)&&((s=e.annotations)==null?void 0:s.rightEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,a=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}}function Os(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*Ke(e.rotation.angle.yaw)/90,r=e.box[1]+e.box[3]/2+e.box[2]*Ke(e.rotation.angle.pitch)/90,s=new Path2D(` +`;var Kt=(e,t,n)=>{let o=new RegExp("\\b"+t+" \\w+ (\\w+)","ig");e.replace(o,(r,s)=>(n[s]=0,r))},Jt=class{constructor(t,n,o){k(this,"uniform",{});k(this,"attribute",{});k(this,"gl");k(this,"id");k(this,"compile",(t,n)=>{let o=this.gl.createShader(n);return o?(this.gl.shaderSource(o,t),this.gl.compileShader(o),this.gl.getShaderParameter(o,this.gl.COMPILE_STATUS)?o:(u(`filter: gl compile failed: ${this.gl.getShaderInfoLog(o)||"unknown"}`),null)):(u("filter: could not create shader"),null)});this.gl=t;let r=this.compile(n,this.gl.VERTEX_SHADER),s=this.compile(o,this.gl.FRAGMENT_SHADER);if(this.id=this.gl.createProgram(),!(!r||!s)){if(!this.id){u("filter: could not create webgl program");return}if(this.gl.attachShader(this.id,r),this.gl.attachShader(this.id,s),this.gl.linkProgram(this.id),!this.gl.getProgramParameter(this.id,this.gl.LINK_STATUS)){u(`filter: gl link failed: ${this.gl.getProgramInfoLog(this.id)||"unknown"}`);return}this.gl.useProgram(this.id),Kt(n,"attribute",this.attribute);for(let A in this.attribute)this.attribute[A]=this.gl.getAttribLocation(this.id,A);Kt(n,"uniform",this.uniform),Kt(o,"uniform",this.uniform);for(let A in this.uniform)this.uniform[A]=this.gl.getUniformLocation(this.id,A)}}};function W1(){let e=0,t=null,n=!1,o=-1,r=[null,null],s=[],A=null,a=null,l=te(100,100),c={},x={INTERMEDIATE:1},i=l.getContext("webgl");if(!i){u("filter: cannot get webgl context");return}this.gl=i;function y(T,m){if(!(T===l.width&&m===l.height)){if(l.width=T,l.height=m,!A){let h=new Float32Array([-1,-1,0,1,1,-1,1,1,-1,1,0,0,-1,1,0,0,1,-1,1,1,1,1,1,0]);A=i.createBuffer(),i.bindBuffer(i.ARRAY_BUFFER,A),i.bufferData(i.ARRAY_BUFFER,h,i.STATIC_DRAW),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0)}i.viewport(0,0,l.width,l.height),r=[null,null]}}function d(T,m){let h=i.createFramebuffer();i.bindFramebuffer(i.FRAMEBUFFER,h);let S=i.createRenderbuffer();i.bindRenderbuffer(i.RENDERBUFFER,S);let P=i.createTexture();return i.bindTexture(i.TEXTURE_2D,P),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,T,m,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.LINEAR),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,P,0),i.bindTexture(i.TEXTURE_2D,null),i.bindFramebuffer(i.FRAMEBUFFER,null),{fbo:h,texture:P}}function p(T){return r[T]=r[T]||d(l.width,l.height),r[T]}function f(T=0){if(!a)return;let m=null,h=null,S=!1;e===0?m=t:m=p(o).texture||null,e++,n&&!(T&x.INTERMEDIATE)?(h=null,S=e%2===0):(o=(o+1)%2,h=p(o).fbo||null),i.bindTexture(i.TEXTURE_2D,m),i.bindFramebuffer(i.FRAMEBUFFER,h),i.uniform1f(a.uniform.flipY,S?-1:1),i.drawArrays(i.TRIANGLES,0,6)}function b(T){if(c[T])return a=c[T],i.useProgram((a?a.id:null)||null),a;if(a=new Jt(i,j1,T),!a)return u("filter: could not get webgl program"),null;let m=Float32Array.BYTES_PER_ELEMENT,h=4*m;return i.enableVertexAttribArray(a.attribute.pos),i.vertexAttribPointer(a.attribute.pos,2,i.FLOAT,!1,h,0*m),i.enableVertexAttribArray(a.attribute.uv),i.vertexAttribPointer(a.attribute.uv,2,i.FLOAT,!1,h,2*m),c[T]=a,a}let M={colorMatrix:T=>{let m=new Float32Array(T);m[4]/=255,m[9]/=255,m[14]/=255,m[19]/=255;let h=m[18]===1&&m[3]===0&&m[8]===0&&m[13]===0&&m[15]===0&&m[16]===0&&m[17]===0&&m[19]===0?I1:N1,S=b(h);!S||(i.uniform1fv(S.uniform.m,m),f())},brightness:T=>{let m=(T||0)+1;M.colorMatrix([m,0,0,0,0,0,m,0,0,0,0,0,m,0,0,0,0,0,1,0])},saturation:T=>{let m=(T||0)*2/3+1,h=(m-1)*-.5;M.colorMatrix([m,h,h,0,0,h,m,h,0,0,h,h,m,0,0,0,0,0,1,0])},desaturate:()=>{M.saturation(-1)},contrast:T=>{let m=(T||0)+1,h=-128*(m-1);M.colorMatrix([m,0,0,0,h,0,m,0,0,h,0,0,m,0,h,0,0,0,1,0])},negative:()=>{M.contrast(-2)},hue:T=>{T=(T||0)/180*Math.PI;let m=Math.cos(T),h=Math.sin(T),S=.213,P=.715,I=.072;M.colorMatrix([S+m*(1-S)+h*-S,P+m*-P+h*-P,I+m*-I+h*(1-I),0,0,S+m*-S+h*.143,P+m*(1-P)+h*.14,I+m*-I+h*-.283,0,0,S+m*-S+h*-(1-S),P+m*-P+h*P,I+m*(1-I)+h*I,0,0,0,0,0,1,0])},desaturateLuminance:()=>{M.colorMatrix([.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,.2764723,.929708,.0938197,0,-37.1,0,0,0,1,0])},sepia:()=>{M.colorMatrix([.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0])},brownie:()=>{M.colorMatrix([.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0])},vintagePinhole:()=>{M.colorMatrix([.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0])},kodachrome:()=>{M.colorMatrix([1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0])},technicolor:()=>{M.colorMatrix([1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0])},polaroid:()=>{M.colorMatrix([1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0])},shiftToBGR:()=>{M.colorMatrix([0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0])},convolution:T=>{let m=new Float32Array(T),h=1/l.width,S=1/l.height,P=b(C1);!P||(i.uniform1fv(P.uniform.m,m),i.uniform2f(P.uniform.px,h,S),f())},detectEdges:()=>{M.convolution.call(this,[0,1,0,1,-4,1,0,1,0])},sobelX:()=>{M.convolution.call(this,[-1,0,1,-2,0,2,-1,0,1])},sobelY:()=>{M.convolution.call(this,[-1,-2,-1,0,0,0,1,2,1])},sharpen:T=>{let m=T||1;M.convolution.call(this,[0,-1*m,0,-1*m,1+4*m,-1*m,0,-1*m,0])},emboss:T=>{let m=T||1;M.convolution.call(this,[-2*m,-1*m,0,-1*m,1,1*m,0,1*m,2*m])},blur:T=>{let m=T/7/l.width,h=T/7/l.height,S=b(L1);!S||(i.uniform2f(S.uniform.px,0,h),f(x.INTERMEDIATE),i.uniform2f(S.uniform.px,m,0),f())},pixelate:T=>{let m=T/l.width,h=T/l.height,S=b(O1);!S||(i.uniform2f(S.uniform.size,m,h),f())}};this.add=function(T){let m=Array.prototype.slice.call(arguments,1),h=M[T];s.push({func:h,args:m})},this.reset=function(){s=[]},this.get=function(){return s},this.apply=function(T){y(T.width,T.height),e=0,t||(t=i.createTexture()),i.bindTexture(i.TEXTURE_2D,t),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,i.CLAMP_TO_EDGE),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,i.NEAREST),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,T);for(let m=0;mx.data())),A=Math.max(s[0][0],s[1][0],s[2][0]),l=(A>1?255:1)/A,c;if(l>1){let x=[Y.sub(n[0],o[0]),Y.sub(n[1],o[1]),Y.sub(n[2],o[2])],i=[Y.sub(r[0],o[0]),Y.sub(r[1],o[1]),Y.sub(r[2],o[2])],y=[Y.mul(x[0],l),Y.mul(x[1],l),Y.mul(x[2],l)],d=Y.stack([y[0],y[1],y[2]],2);c=Y.reshape(d,[1,t.shape[0]||0,t.shape[1]||0,3]),Y.dispose([...x,...i,...y])}else c=Y.expandDims(t,0);return Y.dispose([...n,...o,...r,n,t,e]),c}var X2=3840,v0=null,R0=null,c2=null,e0,J0={inputSum:0,cacheDiff:1,sumMethod:0,inputTensor:void 0};function Qt(){J0.inputSum=0,J0.cacheDiff=1,J0.sumMethod=0,J0.inputTensor=void 0}function te(e,t){let n;if(R.browser)if(R.worker){if(typeof OffscreenCanvas=="undefined")throw new Error("canvas error: attempted to run in web worker but OffscreenCanvas is not supported");n=new OffscreenCanvas(e,t)}else{if(typeof document=="undefined")throw new Error("canvas error: attempted to run in browser but DOM is not defined");n=document.createElement("canvas"),n.width=e,n.height=t}else typeof R.Canvas!="undefined"?n=new R.Canvas(e,t):typeof globalThis.Canvas!="undefined"&&(n=new globalThis.Canvas(e,t));return n}function q2(e,t){let n=t||te(e.width,e.height);return n.getContext("2d").drawImage(e,0,0),n}async function U2(e,t,n=!0){var y,d,p;if(!e)return t.debug&&u("input error: input is missing"),{tensor:null,canvas:null};if(!(e instanceof N.Tensor)&&!(typeof Image!="undefined"&&e instanceof Image)&&!(typeof globalThis.Canvas!="undefined"&&e instanceof globalThis.Canvas)&&!(typeof ImageData!="undefined"&&e instanceof ImageData)&&!(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)&&!(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)&&!(typeof HTMLMediaElement!="undefined"&&e instanceof HTMLMediaElement)&&!(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)&&!(typeof HTMLCanvasElement!="undefined"&&e instanceof HTMLCanvasElement)&&!(typeof OffscreenCanvas!="undefined"&&e instanceof OffscreenCanvas))throw new Error("input error: type not recognized");if(e instanceof N.Tensor){let f=null;if(e.isDisposedInternal)throw new Error("input error: attempted to use tensor but it is disposed");if(!e.shape)throw new Error("input error: attempted to use tensor without a shape");if(e.shape.length===3){if(e.shape[2]===3)f=N.expandDims(e,0);else if(e.shape[2]===4){let b=N.slice3d(e,[0,0,0],[-1,-1,3]);f=N.expandDims(b,0),N.dispose(b)}}else e.shape.length===4&&(e.shape[3]===3?f=N.clone(e):e.shape[3]===4&&(f=N.slice4d(e,[0,0,0,0],[-1,-1,-1,3])));if(f==null||f.shape.length!==4||f.shape[0]!==1||f.shape[3]!==3)throw new Error(`input error: attempted to use tensor with unrecognized shape: ${e.shape.toString()}`);if(f.dtype==="int32"){let b=N.cast(f,"float32");N.dispose(f),f=b}return{tensor:f,canvas:t.filter.return?R0:null}}if(typeof e.readyState!="undefined"&&e.readyState<=2)return t.debug&&u("input stream is not ready"),{tensor:null,canvas:v0};let o=e.naturalWidth||e.videoWidth||e.width||e.shape&&e.shape[1]>0,r=e.naturalHeight||e.videoHeight||e.height||e.shape&&e.shape[2]>0;if(!o||!r)return t.debug&&u("cannot determine input dimensions"),{tensor:null,canvas:v0};let s=o,A=r;if(s>X2&&(s=X2,A=Math.trunc(s*r/o)),A>X2&&(A=X2,s=Math.trunc(A*o/r)),(((y=t.filter)==null?void 0:y.width)||0)>0?s=t.filter.width:(((d=t.filter)==null?void 0:d.height)||0)>0&&(s=o*((t.filter.height||0)/r)),(t.filter.height||0)>0?A=t.filter.height:(t.filter.width||0)>0&&(A=r*((t.filter.width||0)/o)),!s||!A)throw new Error("input error: cannot determine dimension");(!v0||v0.width!==s||v0.height!==A)&&(v0=te(s,A));let a=v0.getContext("2d");if(typeof ImageData!="undefined"&&e instanceof ImageData?a.putImageData(e,0,0):t.filter.flip&&typeof a.translate!="undefined"?(a.translate(o,0),a.scale(-1,1),a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),a.setTransform(1,0,0,1,0,0)):a.drawImage(e,0,0,o,r,0,0,v0.width,v0.height),(!R0||v0.width!==R0.width||v0.height!==R0.height)&&(R0=te(v0.width,v0.height)),t.filter.enabled&&R.webgl.supported?(e0||(e0=R.browser?new W1:null),R.filter=!!e0,e0!=null&&e0.add?(e0.reset(),t.filter.brightness!==0&&e0.add("brightness",t.filter.brightness),t.filter.contrast!==0&&e0.add("contrast",t.filter.contrast),t.filter.sharpness!==0&&e0.add("sharpen",t.filter.sharpness),t.filter.blur!==0&&e0.add("blur",t.filter.blur),t.filter.saturation!==0&&e0.add("saturation",t.filter.saturation),t.filter.hue!==0&&e0.add("hue",t.filter.hue),t.filter.negative&&e0.add("negative"),t.filter.sepia&&e0.add("sepia"),t.filter.vintage&&e0.add("brownie"),t.filter.sepia&&e0.add("sepia"),t.filter.kodachrome&&e0.add("kodachrome"),t.filter.technicolor&&e0.add("technicolor"),t.filter.polaroid&&e0.add("polaroid"),t.filter.pixelate!==0&&e0.add("pixelate",t.filter.pixelate),((p=e0.get())==null?void 0:p.length)>1?R0=e0.apply(v0):R0=e0.draw(v0)):(t.debug&&u("input process error: cannot initialize filters"),R.webgl.supported=!1,t.filter.enabled=!1,q2(v0,R0))):(q2(v0,R0),e0&&(e0=null),R.filter=!!e0),!n)return{tensor:null,canvas:R0};if(!R0)throw new Error("canvas error: cannot create output");let l,c=3;if(typeof ImageData!="undefined"&&e instanceof ImageData||e.data&&e.width&&e.height)if(R.browser&&N.browser)l=N.browser?N.browser.fromPixels(e):null;else{c=e.data.length/e.height/e.width;let f=new Uint8Array(e.data.buffer);l=N.tensor(f,[e.height,e.width,c],"int32")}else if((!c2||R0.width!==c2.width||R0.height!==c2.height)&&(c2=te(R0.width,R0.height)),N.browser&&R.browser)t.backend==="webgl"||t.backend==="humangl"||t.backend==="webgpu"?l=N.browser.fromPixels(R0):(c2=q2(R0),l=N.browser.fromPixels(c2));else{let M=q2(R0).getContext("2d").getImageData(0,0,s,A);c=M.data.length/s/A;let T=new Uint8Array(M.data.buffer);l=N.tensor(T,[s,A,c])}if(c===4){let f=N.slice3d(l,[0,0,0],[-1,-1,3]);N.dispose(l),l=f}if(!l)throw new Error("input error: cannot create tensor");let x=N.cast(l,"float32"),i=t.filter.equalization?await Z2(x):N.expandDims(x,0);if(N.dispose([l,x]),t.filter.autoBrightness){let f=N.max(i),b=await f.data();t.filter.brightness=b[0]>1?1-b[0]/255:1-b[0],N.dispose(f)}return{tensor:i,canvas:t.filter.return?R0:null}}async function D1(e,t){let n=!1;if(e.cacheSensitivity===0||!t.shape||t.shape.length!==4||t.shape[1]>3840||t.shape[2]>2160)return n;if(!J0.inputTensor)J0.inputTensor=N.clone(t);else if(J0.inputTensor.shape[1]!==t.shape[1]||J0.inputTensor.shape[2]!==t.shape[2])N.dispose(J0.inputTensor),J0.inputTensor=N.clone(t);else{let o={};o.diff=N.sub(t,J0.inputTensor),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;N.dispose([J0.inputTensor,o.diff,o.squared,o.sum]),J0.inputTensor=N.clone(t),n=s<=(e.cacheSensitivity||0)}return n}async function F1(e,t,n){let o={};if(!t||!n||t.shape.length!==4||t.shape.length!==n.shape.length)return e.debug||u("invalid input tensor or tensor shapes do not match:",t.shape,n.shape),0;if(t.shape[0]!==1||n.shape[0]!==1||t.shape[3]!==3||n.shape[3]!==3)return e.debug||u("input tensors must be of shape [1, height, width, 3]:",t.shape,n.shape),0;o.input1=N.clone(t),o.input2=t.shape[1]!==n.shape[1]||t.shape[2]!==n.shape[2]?N.image.resizeBilinear(n,[t.shape[1],t.shape[2]]):N.clone(n),o.diff=N.sub(o.input1,o.input2),o.squared=N.mul(o.diff,o.diff),o.sum=N.sum(o.squared);let s=(await o.sum.data())[0]/(t.shape[1]||1)/(t.shape[2]||1)/255/3;return N.dispose([o.input1,o.input2,o.diff,o.squared,o.sum]),s}var S2,j2,N2,z2=class{constructor(){k(this,"browser");k(this,"node");k(this,"worker");k(this,"platform","");k(this,"agent","");k(this,"backends",[]);k(this,"initial");k(this,"filter");k(this,"tfjs");k(this,"offscreen");k(this,"perfadd",!1);k(this,"tensorflow",{version:void 0,gpu:void 0});k(this,"wasm",{supported:void 0,backend:void 0,simd:void 0,multithread:void 0});k(this,"webgl",{supported:void 0,backend:void 0,version:void 0,renderer:void 0,shader:void 0,vendor:void 0});k(this,"webgpu",{supported:void 0,backend:void 0,adapter:void 0});k(this,"cpu",{model:void 0,flags:[]});k(this,"kernels",[]);me(this,S2,void 0);me(this,j2,void 0);me(this,N2,void 0);if(this.browser=typeof navigator!="undefined",this.node=typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined",this.tfjs={version:I0.version["tfjs-core"]},this.offscreen=typeof OffscreenCanvas!="undefined",this.initial=!0,this.worker=this.browser&&this.offscreen?typeof WorkerGlobalScope!="undefined":void 0,typeof navigator!="undefined"){let t=navigator.userAgent.match(/\(([^()]+)\)/g);if(t!=null&&t[0]){let n=t[0].match(/\(([^()]+)\)/g);this.platform=n!=null&&n[0]?n[0].replace(/\(|\)/g,""):"",this.agent=navigator.userAgent.replace(t[0],""),this.platform[1]&&(this.agent=this.agent.replace(t[1],"")),this.agent=this.agent.replace(/ /g," ")}}else typeof process!="undefined"&&(this.platform=`${process.platform} ${process.arch}`,this.agent=`NodeJS ${process.version}`)}get Canvas(){return G0(this,S2)}set Canvas(t){ge(this,S2,t),globalThis.Canvas=t}get Image(){return G0(this,j2)}set Image(t){ge(this,j2,t),globalThis.Image=t}get ImageData(){return G0(this,N2)}set ImageData(t){ge(this,N2,t),globalThis.ImageData=t}async updateBackend(){this.backends=Object.keys(I0.engine().registryFactory);try{this.tensorflow={version:I0.backend().binding?I0.backend().binding.TF_Version:void 0,gpu:I0.backend().binding?I0.backend().binding.isUsingGpuDevice():void 0}}catch(o){}this.wasm.supported=typeof WebAssembly!="undefined",this.wasm.backend=this.backends.includes("wasm"),this.wasm.supported&&this.wasm.backend&&(this.wasm.simd=await I0.env().getAsync("WASM_HAS_SIMD_SUPPORT"),this.wasm.multithread=await I0.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"));let t=te(100,100),n=t?t.getContext("webgl2"):void 0;this.webgl.supported=typeof n!="undefined",this.webgl.backend=this.backends.includes("webgl"),this.webgl.supported&&this.webgl.backend&&n&&(this.webgl.version=n.getParameter(n.VERSION),this.webgl.vendor=n.getParameter(n.VENDOR),this.webgl.renderer=n.getParameter(n.RENDERER),this.webgl.shader=n.getParameter(n.SHADING_LANGUAGE_VERSION)),this.webgpu.supported=this.browser&&typeof navigator.gpu!="undefined",this.webgpu.backend=this.backends.includes("webgpu");try{if(this.webgpu.supported){let o=await navigator.gpu.requestAdapter();this.webgpu.adapter=await(o==null?void 0:o.requestAdapterInfo())}}catch(o){this.webgpu.supported=!1}try{this.kernels=I0.getKernelsForBackend(I0.getBackend()).map(o=>o.kernelName.toLowerCase())}catch(o){}}updateCPU(){let t={model:"",flags:[]};this.node&&this.platform.startsWith("linux"),this.cpu?this.cpu=t:Object.defineProperty(this,"cpu",{value:t})}};S2=new WeakMap,j2=new WeakMap,N2=new WeakMap;var R=new z2;var K2=class{constructor(){k(this,"config");k(this,"element");k(this,"stream");k(this,"devices",[]);k(this,"enumerate",async()=>{try{let t=await navigator.mediaDevices.enumerateDevices();this.devices=t.filter(n=>n.kind==="videoinput")}catch(t){this.devices=[]}return this.devices});k(this,"start",async t=>{var r,s;if(t!=null&&t.debug&&(this.config.debug=t==null?void 0:t.debug),t!=null&&t.crop&&(this.config.crop=t==null?void 0:t.crop),t!=null&&t.mode&&(this.config.mode=t==null?void 0:t.mode),t!=null&&t.width&&(this.config.width=t==null?void 0:t.width),t!=null&&t.height&&(this.config.height=t==null?void 0:t.height),t!=null&&t.id&&(this.config.id=t==null?void 0:t.id),t!=null&&t.element)if(typeof t.element=="string"){let A=document.getElementById(t.element);if(A&&A instanceof HTMLVideoElement)this.element=A;else{this.config.debug&&u("webcam","cannot get dom element",t.element);return}}else if(t.element instanceof HTMLVideoElement)this.element=t.element;else{this.config.debug&&u("webcam","unknown dom element",t.element);return}else this.element=document.createElement("video");let n={audio:!1,video:{facingMode:this.config.mode==="front"?"user":"environment",resizeMode:this.config.crop?"crop-and-scale":"none"}};if(((r=this.config)==null?void 0:r.width)>0&&(n.video.width={ideal:this.config.width}),((s=this.config)==null?void 0:s.height)>0&&(n.video.height={ideal:this.config.height}),this.config.id&&(n.video.deviceId=this.config.id),this.element.addEventListener("play",()=>{this.config.debug&&u("webcam","play")}),this.element.addEventListener("pause",()=>{this.config.debug&&u("webcam","pause")}),this.element.addEventListener("click",async()=>{!this.element||!this.stream||(this.element.paused?await this.element.play():this.element.pause())}),!(navigator!=null&&navigator.mediaDevices)){this.config.debug&&u("webcam","no devices");return}try{this.stream=await navigator.mediaDevices.getUserMedia(n)}catch(A){u("webcam",A);return}if(!this.stream){this.config.debug&&u("webcam","no stream");return}this.element.srcObject=this.stream,await new Promise(A=>{this.element?this.element.onloadeddata=()=>A(!0):A(!1)}),await this.element.play(),this.config.debug&&u("webcam",{width:this.width,height:this.height,label:this.label,stream:this.stream,track:this.track,settings:this.settings,constraints:this.constraints,capabilities:this.capabilities})});k(this,"pause",()=>{this.element&&this.element.pause()});k(this,"play",async()=>{this.element&&await this.element.play()});k(this,"stop",()=>{this.config.debug&&u("webcam","stop"),this.track&&this.track.stop()});this.config={element:void 0,debug:!0,mode:"front",crop:!1,width:0,height:0}}get track(){if(!!this.stream)return this.stream.getVideoTracks()[0]}get capabilities(){if(!!this.track)return this.track.getCapabilities?this.track.getCapabilities():void 0}get constraints(){if(!!this.track)return this.track.getConstraints?this.track.getConstraints():void 0}get settings(){if(!this.stream)return;let t=this.stream.getVideoTracks()[0];return t.getSettings?t.getSettings():void 0}get label(){return this.track?this.track.label:""}get paused(){var t;return((t=this.element)==null?void 0:t.paused)||!1}get width(){var t;return((t=this.element)==null?void 0:t.videoWidth)||0}get height(){var t;return((t=this.element)==null?void 0:t.videoHeight)||0}};var d2=Z(H());var _t={};ze(_t,{age:()=>yr,"anti-spoofing":()=>Vr,antispoof:()=>tr,blazeface:()=>nr,"blazeface-back":()=>fr,"blazeface-front":()=>mr,"blazepose-detector":()=>pr,"blazepose-full":()=>ur,"blazepose-heavy":()=>hr,"blazepose-lite":()=>br,centernet:()=>or,default:()=>ns,efficientpose:()=>gr,"efficientpose-i-lite":()=>Zr,"efficientpose-ii-lite":()=>Xr,"efficientpose-iv":()=>qr,emotion:()=>rr,faceboxes:()=>Tr,facemesh:()=>sr,"facemesh-attention":()=>Rr,"facemesh-attention-pinto":()=>vr,"facemesh-detection-full":()=>Mr,"facemesh-detection-short":()=>Pr,faceres:()=>Ar,"faceres-deep":()=>kr,gear:()=>wr,gender:()=>zr,"gender-ssrnet-imdb":()=>Er,handdetect:()=>Sr,"handlandmark-full":()=>jr,"handlandmark-lite":()=>ar,"handlandmark-sparse":()=>Nr,handskeleton:()=>Ir,handtrack:()=>ir,"insightface-efficientnet-b0":()=>Ur,"insightface-ghostnet-strides1":()=>Yr,"insightface-ghostnet-strides2":()=>Kr,"insightface-mobilenet-emore":()=>Jr,"insightface-mobilenet-swish":()=>Qr,iris:()=>lr,liveness:()=>cr,meet:()=>Or,mobileface:()=>Lr,mobilefacenet:()=>Cr,models:()=>dr,"movenet-lightning":()=>xr,"movenet-multipose":()=>Wr,"movenet-thunder":()=>Dr,nanodet:()=>Fr,"nanodet-e":()=>_r,"nanodet-g":()=>$r,"nanodet-m":()=>es,"nanodet-t":()=>ts,posenet:()=>Br,rvm:()=>Hr,selfie:()=>Gr});var tr=853098,nr=538928,or=4030290,rr=820516,sr=1477958,Ar=6978814,ar=2023432,ir=2964837,lr=2599092,cr=592976,dr=0,xr=4650216,yr=161240,fr=538928,mr=402048,pr=5928856,ur=6339202,hr=27502466,br=2726402,gr=5651240,Tr=2013002,vr=2387598,Rr=2382414,Mr=1026192,Pr=201268,kr=13957620,wr=1498916,Er=161236,zr=201808,Sr=3515612,jr=5431368,Nr=5286322,Ir=5502280,Or=372228,Lr=2183192,Cr=5171976,Wr=9448838,Dr=12477112,Fr=7574558,Br=5032780,Hr=3739355,Gr=212886,Vr=853098,Zr=2269064,Xr=5651240,qr=25643252,Ur=13013224,Yr=8093408,Kr=8049584,Jr=6938536,Qr=12168584,_r=12319156,$r=7574558,es=1887474,ts=5294216,ns={antispoof:tr,blazeface:nr,centernet:or,emotion:rr,facemesh:sr,faceres:Ar,"handlandmark-lite":ar,handtrack:ir,iris:lr,liveness:cr,models:dr,"movenet-lightning":xr,age:yr,"blazeface-back":fr,"blazeface-front":mr,"blazepose-detector":pr,"blazepose-full":ur,"blazepose-heavy":hr,"blazepose-lite":br,efficientpose:gr,faceboxes:Tr,"facemesh-attention-pinto":vr,"facemesh-attention":Rr,"facemesh-detection-full":Mr,"facemesh-detection-short":Pr,"faceres-deep":kr,gear:wr,"gender-ssrnet-imdb":Er,gender:zr,handdetect:Sr,"handlandmark-full":jr,"handlandmark-sparse":Nr,handskeleton:Ir,meet:Or,mobileface:Lr,mobilefacenet:Cr,"movenet-multipose":Wr,"movenet-thunder":Dr,nanodet:Fr,posenet:Br,rvm:Hr,selfie:Gr,"anti-spoofing":Vr,"efficientpose-i-lite":Zr,"efficientpose-ii-lite":Xr,"efficientpose-iv":qr,"insightface-efficientnet-b0":Ur,"insightface-ghostnet-strides1":Yr,"insightface-ghostnet-strides2":Kr,"insightface-mobilenet-emore":Jr,"insightface-mobilenet-swish":Qr,"nanodet-e":_r,"nanodet-g":$r,"nanodet-m":es,"nanodet-t":ts};var O0={cacheModels:!0,cacheSupported:!0,verbose:!0,debug:!1,modelBasePath:""},E0={};async function os(e,t){return O0.debug&&u("load model fetch:",e,t),fetch(e,t)}function B1(e){O0.cacheModels=e.cacheModels,O0.verbose=e.debug,O0.modelBasePath=e.modelBasePath}async function O(e){var c,x,i,y;let t=S1(O0.modelBasePath,e||"");t.toLowerCase().endsWith(".json")||(t+=".json");let n=t.includes("/")?t.split("/"):t.split("\\"),o=n[n.length-1].replace(".json",""),r="indexeddb://"+o;E0[o]={name:o,sizeFromManifest:0,sizeLoadedWeights:0,sizeDesired:_t[o],inCache:!1,url:""},O0.cacheSupported=typeof indexedDB!="undefined";let s={};try{s=O0.cacheSupported&&O0.cacheModels?await d2.io.listModels():{}}catch(d){O0.cacheSupported=!1}E0[o].inCache=O0.cacheSupported&&O0.cacheModels&&Object.keys(s).includes(r),E0[o].url=E0[o].inCache?r:t;let A=typeof fetch=="undefined"?{}:{fetchFunc:(d,p)=>os(d,p)},a=new d2.GraphModel(E0[o].url,A),l=!1;try{a.findIOHandler(),O0.debug&&u("model load handler:",a.handler)}catch(d){u("error finding model i/o handler:",t,d)}try{let d=await((c=a.handler)==null?void 0:c.load())||null;E0[o].sizeFromManifest=((x=d==null?void 0:d.weightData)==null?void 0:x.byteLength)||0,d?a.loadSync(d):a=await d2.loadGraphModel(E0[o].inCache?r:t,A),E0[o].sizeLoadedWeights=((y=(i=a.artifacts)==null?void 0:i.weightData)==null?void 0:y.byteLength)||0,O0.verbose&&u("load:",{model:o,url:a.modelUrl,bytes:E0[o].sizeLoadedWeights}),l=!0}catch(d){u("error loading model:",t,d)}if(l&&O0.cacheModels&&O0.cacheSupported&&!E0[o].inCache)try{let d=await a.save(r);O0.debug&&u("model saved:",r,d)}catch(d){u("error saving model:",t,d)}return a}var $t="3.0.1";var E=Z(H());var p0=Z(H());var o0={name:"humangl",priority:999,canvas:null,gl:null,extensions:[],webGLattr:{alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!1,desynchronized:!0}};function As(){let e=o0.gl;!e||(o0.extensions=e.getSupportedExtensions())}function H1(e){var t;if(e.config.backend==="humangl"&&(o0.name in p0.engine().registry&&!((t=o0==null?void 0:o0.gl)!=null&&t.getParameter(o0.gl.VERSION))&&(u("humangl error: backend invalid context"),e.models.reset()),!p0.findBackend(o0.name))){try{o0.canvas=te(100,100)}catch(r){u("humangl error: cannot create canvas:",r);return}try{if(o0.gl=o0.canvas.getContext("webgl2",o0.webGLattr),!o0.gl){u("humangl error: cannot get webgl context");return}if(!o0.gl.getParameter(o0.gl.VERSION).includes("2.0")){u("backend override: using fallback webgl backend as webgl 2.0 is not detected"),e.config.backend="webgl";return}o0.canvas&&(o0.canvas.addEventListener("webglcontextlost",s=>{throw u("humangl error:",s.type),u("possible browser memory leak using webgl or conflict with multiple backend registrations"),e.emit("error"),new Error("backend error: webgl context lost")}),o0.canvas.addEventListener("webglcontextrestored",s=>{u("humangl error: context restored:",s)}),o0.canvas.addEventListener("webglcontextcreationerror",s=>{u("humangl error: context create:",s)}))}catch(r){u("humangl error: cannot get webgl context:",r);return}try{p0.setWebGLContext(2,o0.gl)}catch(r){u("humangl error: cannot set webgl context:",r);return}try{let r=new p0.GPGPUContext(o0.gl);p0.registerBackend(o0.name,()=>new p0.MathBackendWebGL(r),o0.priority)}catch(r){u("humangl error: cannot register webgl backend:",r);return}try{p0.getKernelsForBackend("webgl").forEach(s=>{let A={...s,backendName:o0.name};p0.registerKernel(A)})}catch(r){u("humangl error: cannot update webgl backend registration:",r);return}try{p0.env().flagRegistry.WEBGL_VERSION&&p0.env().set("WEBGL_VERSION",2)}catch(r){u("humangl error: cannot set WebGL backend flags:",r);return}As();let n=p0.backend(),o=typeof n.gpgpu!="undefined"?n.getGPGPUContext().gl:null;o?e.config.debug&&u("humangl backend registered:",{webgl:o.getParameter(o.VERSION),renderer:o.getParameter(o.RENDERER)}):u("humangl error: no current gl context:",o,o0.gl)}}var Se=Z(H()),C={tf255:255,tf1:1,tf2:2,tf05:.5,tf127:127.5,rgb:[.2989,.587,.114]};function G1(){C.tf255=Se.scalar(255,"float32"),C.tf1=Se.scalar(1,"float32"),C.tf2=Se.scalar(2,"float32"),C.tf05=Se.scalar(.5,"float32"),C.tf127=Se.scalar(127.5,"float32"),C.rgb=Se.tensor1d([.2989,.587,.114],"float32")}async function ls(){var e;return await R.updateBackend(),(e=R.tensorflow)!=null&&e.version?"tensorflow":R.webgpu.supported&&R.webgpu.backend?"webgpu":R.webgl.supported&&R.webgl.backend?"webgl":R.wasm.supported&&R.wasm.backend?"wasm":"cpu"}function cs(e){let t=[];if(!R.kernels.includes("mod")){let n={kernelName:"Mod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.sub(o.inputs.a,E.mul(E.div(o.inputs.a,o.inputs.b),o.inputs.b)))};E.registerKernel(n),R.kernels.push("mod"),t.push("mod")}if(!R.kernels.includes("floormod")){let n={kernelName:"FloorMod",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>E.add(E.mul(E.floorDiv(o.inputs.a,o.inputs.b),o.inputs.b),E.mod(o.inputs.a,o.inputs.b)))};E.registerKernel(n),R.kernels.push("floormod"),t.push("floormod")}if(!R.kernels.includes("rotatewithoffset")&&e.softwareKernels){let n={kernelName:"RotateWithOffset",backendName:E.getBackend(),kernelFunc:o=>E.tidy(()=>{let r=E.getBackend();E.setBackend("cpu");let s=E.image.rotateWithOffset(o.inputs.image,o.attrs.radians,o.attrs.fillValue,o.attrs.center);return E.setBackend(r),s})};E.registerKernel(n),R.kernels.push("rotatewithoffset"),t.push("rotatewithoffset")}t.length>0&&e.debug&&u("registered kernels:",t)}var V1={};async function I2(e,t=!1){var n;if(e.state="backend",((n=e.config.backend)==null?void 0:n.length)===0&&(e.config.backend=await ls()),t||R.initial||e.config.backend&&e.config.backend.length>0&&E.getBackend()!==e.config.backend){let o=g();if(e.config.backend&&e.config.backend.length>0){if(typeof window=="undefined"&&typeof WorkerGlobalScope!="undefined"&&e.config.debug&&e.config.debug&&u("running inside web worker"),R.browser&&e.config.backend==="tensorflow"&&(e.config.debug&&u("override: backend set to tensorflow while running in browser"),e.config.backend="webgl"),R.node&&(e.config.backend==="webgl"||e.config.backend==="humangl")&&(e.config.debug&&u(`override: backend set to ${e.config.backend} while running in nodejs`),e.config.backend="tensorflow"),R.browser&&e.config.backend==="webgpu")if(typeof navigator=="undefined"||typeof navigator.gpu=="undefined")u("override: backend set to webgpu but browser does not support webgpu"),e.config.backend="webgl";else{let s=await navigator.gpu.requestAdapter();if(e.config.debug&&u("enumerated webgpu adapter:",s),!s)u("override: backend set to webgpu but browser reports no available gpu"),e.config.backend="webgl";else{let A="requestAdapterInfo"in s?await s.requestAdapterInfo():void 0;u("webgpu adapter info:",A)}}let r=Object.keys(E.engine().registryFactory);if(e.config.backend==="humangl"&&!r.includes("humangl")&&(H1(e),r=Object.keys(E.engine().registryFactory)),e.config.debug&&u("available backends:",r),r.includes(e.config.backend)||(u(`error: backend ${e.config.backend} not found in registry`),e.config.backend=R.node?"tensorflow":"webgl",e.config.debug&&u(`override: setting backend ${e.config.backend}`)),e.config.debug&&u("setting backend:",[e.config.backend]),e.config.backend==="wasm"){if(E.env().flagRegistry.CANVAS2D_WILL_READ_FREQUENTLY&&E.env().set("CANVAS2D_WILL_READ_FREQUENTLY",!0),e.config.debug&&u("wasm path:",e.config.wasmPath),typeof E.setWasmPaths!="undefined")E.setWasmPaths(e.config.wasmPath,e.config.wasmPlatformFetch);else throw new Error("backend error: attempting to use wasm backend but wasm path is not set");let s=!1,A=!1;try{s=await E.env().getAsync("WASM_HAS_MULTITHREAD_SUPPORT"),A=await E.env().getAsync("WASM_HAS_SIMD_SUPPORT"),e.config.debug&&u(`wasm execution: ${A?"simd":"no simd"} ${s?"multithreaded":"singlethreaded"}`),e.config.debug&&!A&&u("warning: wasm simd support is not enabled")}catch(a){u("wasm detection failed")}}try{await E.setBackend(e.config.backend),await E.ready()}catch(s){return u("error: cannot set backend:",e.config.backend,s),!1}e.config.debug&&(V1=JSON.parse(JSON.stringify(E.env().flags)))}if((E.getBackend()==="humangl"||E.getBackend()==="webgl")&&(E.env().flagRegistry.WEBGL_USE_SHAPES_UNIFORMS&&E.env().set("WEBGL_USE_SHAPES_UNIFORMS",!0),E.env().flagRegistry.WEBGL_EXP_CONV&&E.env().set("WEBGL_EXP_CONV",!0),e.config.debug&&typeof e.config.deallocate!="undefined"&&e.config.deallocate&&(u("changing webgl: WEBGL_DELETE_TEXTURE_THRESHOLD:",!0),E.env().set("WEBGL_DELETE_TEXTURE_THRESHOLD",0))),E.getBackend(),e.config.debug){let r=E.env().flags,s={};for(let A of Object.keys(r))V1[A]!==r[A]&&(s[A]=r[A]);e.config.debug&&Object.keys(s).length>0&&u("backend:",E.getBackend(),"flags:",s)}if(e.config.flags&&Object.keys(e.config.flags).length>0){e.config.debug&&u("flags:",e.config.flags);for(let[r,s]of Object.entries(e.config.flags))E.env().set(r,s)}E.enableProdMode(),G1(),e.performance.initBackend=Math.trunc(g()-o),e.config.backend=E.getBackend(),await R.updateBackend(),cs(e.config),R.initial=!1}return!0}function J2(e,t){for(let n of e){let o={kernelName:n,backendName:t.backend,kernelFunc:r=>{var s;return t.debug&&u("kernelFunc",n,t.backend,r),(s=r==null?void 0:r.inputs)==null?void 0:s.info}};E.registerKernel(o)}R.kernels=E.getKernelsForBackend(E.getBackend()).map(n=>n.kernelName.toLowerCase())}var nt={};ze(nt,{all:()=>Hs,body:()=>_2,canvas:()=>Bs,face:()=>Q2,gesture:()=>tt,hand:()=>$2,init:()=>A5,object:()=>et,options:()=>x0,person:()=>Fs});var Q0=e=>{if(!e)u("draw error: invalid canvas");else if(!e.getContext)u("draw error: canvas context not defined");else{let t=e.getContext("2d");if(!t)u("draw error: cannot get canvas context");else return t}return null},Ke=e=>Math.round(e*180/Math.PI),_=(e,t,n)=>e.replace(t,typeof n=="number"?n.toFixed(1):n),Je=(e,t)=>{if(!t.useDepth||typeof e=="undefined")return t.color;let n=Uint8ClampedArray.from([127+2*e,127-2*e,255]);return`rgba(${n[0]}, ${n[1]}, ${n[2]}, ${t.alpha})`};function ne(e,t,n,o,r){let s=t.replace(/\[.*\]/g,"").split(` +`).map(a=>a.trim()),A=Math.max(0,n);for(let a=s.length-1;a>=0;a--){let l=a*r.lineHeight+o;r.shadowColor&&r.shadowColor!==""&&(e.fillStyle=r.shadowColor,e.fillText(s[a],A+5,l+16)),e.fillStyle=r.labelColor,e.fillText(s[a],A+4,l+15)}}function Te(e,t,n,o,r){e.fillStyle=Je(o,r),e.beginPath(),e.arc(t,n,r.pointSize,0,2*Math.PI),e.fill()}function pe(e,t,n,o,r,s){if(e.beginPath(),e.lineWidth=s.lineWidth,s.useCurves){let A=(t+t+o)/2,a=(n+n+r)/2;e.ellipse(A,a,o/2,r/2,0,0,2*Math.PI)}else e.moveTo(t+s.roundRect,n),e.lineTo(t+o-s.roundRect,n),e.quadraticCurveTo(t+o,n,t+o,n+s.roundRect),e.lineTo(t+o,n+r-s.roundRect),e.quadraticCurveTo(t+o,n+r,t+o-s.roundRect,n+r),e.lineTo(t+s.roundRect,n+r),e.quadraticCurveTo(t,n+r,t,n+r-s.roundRect),e.lineTo(t,n+s.roundRect),e.quadraticCurveTo(t,n,t+s.roundRect,n),e.closePath();e.stroke()}function e5(e,t,n){if(!(t.length<2)){e.beginPath(),e.moveTo(t[0][0],t[0][1]);for(let o of t)e.strokeStyle=Je(o[2]||0,n),e.lineTo(Math.trunc(o[0]),Math.trunc(o[1]));e.stroke(),n.fillPolygons&&(e.closePath(),e.fill())}}function X1(e,t,n){if(!(t.length<2)){if(e.lineWidth=n.lineWidth,!n.useCurves||t.length<=2){e5(e,t,n);return}e.moveTo(t[0][0],t[0][1]);for(let o=0;oO2[e]),La=xs.map(e=>O2[e]),Ca=ys.map(e=>O2[e]);function je(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var fs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],ms=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],ps=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],us=[[474,475],[475,476],[476,477],[477,474]],hs=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],bs=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],gs=[[469,470],[470,471],[471,472],[472,469]],Ts=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]],Wa={lips:je(fs),leftEye:je(ms),leftEyebrow:je(ps),leftIris:je(us),rightEye:je(hs),rightEyebrow:je(bs),rightIris:je(gs),faceOval:je(Ts)};var vs=[[61,146],[146,91],[91,181],[181,84],[84,17],[17,314],[314,405],[405,321],[321,375],[375,291],[61,185],[185,40],[40,39],[39,37],[37,0],[0,267],[267,269],[269,270],[270,409],[409,291],[78,95],[95,88],[88,178],[178,87],[87,14],[14,317],[317,402],[402,318],[318,324],[324,308],[78,191],[191,80],[80,81],[81,82],[82,13],[13,312],[312,311],[311,310],[310,415],[415,308]],Rs=[[263,249],[249,390],[390,373],[373,374],[374,380],[380,381],[381,382],[382,362],[263,466],[466,388],[388,387],[387,386],[386,385],[385,384],[384,398],[398,362]],Ms=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Ps=[[474,475],[475,476],[476,477],[477,474]],ks=[[33,7],[7,163],[163,144],[144,145],[145,153],[153,154],[154,155],[155,133],[33,246],[246,161],[161,160],[160,159],[159,158],[158,157],[157,173],[173,133]],ws=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Es=[[469,470],[470,471],[471,472],[472,469]],zs=[[10,338],[338,297],[297,332],[332,284],[284,251],[251,389],[389,356],[356,454],[454,323],[323,361],[361,288],[288,397],[397,365],[365,379],[379,378],[378,400],[400,377],[377,152],[152,148],[148,176],[176,149],[149,150],[150,136],[136,172],[172,58],[58,132],[132,93],[93,234],[234,127],[127,162],[162,21],[21,54],[54,103],[103,67],[67,109],[109,10]];function Ne(e){let t=e.map(n=>n[0]);return t.push(e[e.length-1][1]),t}var Ss={lips:Ne(vs),leftEye:Ne(Rs),leftEyebrow:Ne(Ms),leftIris:Ne(Ps),rightEye:Ne(ks),rightEyebrow:Ne(ws),rightIris:Ne(Es),faceOval:Ne(zs)},js=Object.entries(Ss).map(([e,t])=>t.map(n=>[n,e])).flat(),Da=new Map(js),L2=[61,146,91,181,84,17,314,405,321,375,291,185,40,39,37,0,267,269,270,409,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415,76,77,90,180,85,16,315,404,320,307,306,184,74,73,72,11,302,303,304,408,62,96,89,179,86,15,316,403,319,325,292,183,42,41,38,12,268,271,272,407],$e=[33,7,163,144,145,153,154,155,133,246,161,160,159,158,157,173,130,25,110,24,23,22,26,112,243,247,30,29,27,28,56,190,226,31,228,229,230,231,232,233,244,113,225,224,223,222,221,189,35,124,46,53,52,65,143,111,117,118,119,120,121,128,245,156,70,63,105,66,107,55,193],e2=[263,249,390,373,374,380,381,382,362,466,388,387,386,385,384,398,359,255,339,254,253,252,256,341,463,467,260,259,257,258,286,414,446,261,448,449,450,451,452,453,464,342,445,444,443,442,441,413,265,353,276,283,282,295,372,340,346,347,348,349,350,357,465,383,300,293,334,296,336,285,417];var K;function Ns(e,t){var o,r,s,A,a,l,c,x,i;if(!K.drawLabels||((o=K.faceLabels)==null?void 0:o.length)===0)return;let n=K.faceLabels.slice();if(e.score&&(n=_(n,"[score]",100*e.score)),e.gender&&(n=_(n,"[gender]",e.gender)),e.genderScore&&(n=_(n,"[genderScore]",100*e.genderScore)),e.age&&(n=_(n,"[age]",e.age)),e.distance&&(n=_(n,"[distance]",100*e.distance)),e.real&&(n=_(n,"[real]",100*e.real)),e.live&&(n=_(n,"[live]",100*e.live)),e.emotion&&e.emotion.length>0){let y=e.emotion.map(d=>`${Math.trunc(100*d.score)}% ${d.emotion}`);y.length>3&&(y.length=3),n=_(n,"[emotions]",y.join(" "))}(s=(r=e.rotation)==null?void 0:r.angle)!=null&&s.roll&&(n=_(n,"[roll]",Ke(e.rotation.angle.roll))),(a=(A=e.rotation)==null?void 0:A.angle)!=null&&a.yaw&&(n=_(n,"[yaw]",Ke(e.rotation.angle.yaw))),(c=(l=e.rotation)==null?void 0:l.angle)!=null&&c.pitch&&(n=_(n,"[pitch]",Ke(e.rotation.angle.pitch))),(i=(x=e.rotation)==null?void 0:x.gaze)!=null&&i.bearing&&(n=_(n,"[gaze]",Ke(e.rotation.gaze.bearing))),ne(t,n,e.box[0],e.box[1],K)}function Is(e,t){var n,o,r,s;if(((n=e.annotations)==null?void 0:n.leftEyeIris)&&((o=e.annotations)==null?void 0:o.leftEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.leftEyeIris[3][0]-e.annotations.leftEyeIris[1][0])/2,a=Math.abs(e.annotations.leftEyeIris[4][1]-e.annotations.leftEyeIris[2][1])/2;t.ellipse(e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}if(((r=e.annotations)==null?void 0:r.rightEyeIris)&&((s=e.annotations)==null?void 0:s.rightEyeIris[0])){t.strokeStyle=K.useDepth?"rgba(255, 200, 255, 0.3)":K.color,t.beginPath();let A=Math.abs(e.annotations.rightEyeIris[3][0]-e.annotations.rightEyeIris[1][0])/2,a=Math.abs(e.annotations.rightEyeIris[4][1]-e.annotations.rightEyeIris[2][1])/2;t.ellipse(e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1],A,a,0,0,2*Math.PI),t.stroke(),K.fillPolygons&&(t.fillStyle=K.useDepth?"rgba(255, 255, 200, 0.3)":K.color,t.fill())}}function Os(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.angle)&&typeof Path2D!="undefined"){t.strokeStyle="pink";let o=e.box[0]+e.box[2]/2-e.box[3]*Ke(e.rotation.angle.yaw)/90,r=e.box[1]+e.box[3]/2+e.box[2]*Ke(e.rotation.angle.pitch)/90,s=new Path2D(` M ${e.box[0]+e.box[2]/2} ${e.box[1]} C ${o} ${e.box[1]}, @@ -109,7 +109,7 @@ ${e.box[0]} ${r}, ${e.box[0]+e.box[2]} ${r}, ${e.box[0]+e.box[2]} ${e.box[1]+e.box[3]/2} - `);t.stroke(A),t.stroke(s)}}function Ls(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];t5(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let r=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];t5(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[r[0],r[1]],4)}}function Cs(e,t){if(K.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;n<_e.length/3;n++){let o=[_e[n*3+0],_e[n*3+1],_e[n*3+2]].map(r=>e.mesh[r]);e5(t,o,K)}Is(e,t)}}function Ws(e,t){if(K.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Ws(r,o),Cs(r,o),Os(r,o),Ls(r,o))}}function _2(e,t,n){var s,A;let o=a0(d0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round";for(let a=0;a0)){let l=o.bodyLabels.slice();l=_(l,"[score]",100*t[a].score),ne(r,l,t[a].box[0],t[a].box[1],o)}if(o.drawPoints&&t[a].keypoints)for(let l=0;l0&&t[a].keypoints){r.font=o.font;for(let l of t[a].keypoints){if(!l.score||l.score===0)continue;let c=o.bodyPartLabels.slice();c=_(c,"[label]",l.part),c=_(c,"[score]",100*l.score),ne(r,c,l.position[0],l.position[1],o)}}if(o.drawPolygons&&t[a].keypoints&&t[a].annotations)for(let l of Object.values(t[a].annotations))for(let c of l)X1(r,c,o)}}}function $2(e,t,n){var s,A;let o=a0(d0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let a of t){if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,pe(r,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((s=o.handLabels)==null?void 0:s.length)>0){let l=o.handLabels.slice();l=_(l,"[label]",a.label),l=_(l,"[score]",100*a.score),ne(r,l,a.box[0],a.box[1],o)}r.stroke()}if(o.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let l of a.keypoints)r.fillStyle=Je(l[2],o),Te(r,l[0],l[1],0,o);if(o.drawLabels&&a.annotations&&((A=o.fingerLabels)==null?void 0:A.length)>0)for(let[l,c]of Object.entries(a.annotations)){let d=o.fingerLabels.slice();d=_(d,"[label]",l),ne(r,d,c[c.length-1][0],c[c.length-1][1],o)}if(o.drawPolygons&&a.annotations){let l=c=>{if(!(!c||c.length===0||!c[0]))for(let d=0;d0?d-1:0][0],c[d>0?d-1:0][1]),r.lineTo(c[d][0],c[d][1]),r.stroke()}};r.lineWidth=o.lineWidth,l(a.annotations.index),l(a.annotations.middle),l(a.annotations.ring),l(a.annotations.pinky),l(a.annotations.thumb)}}}}function et(e,t,n){var s;let o=a0(d0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let A of t)if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,pe(r,A.box[0],A.box[1],A.box[2],A.box[3],o),o.drawLabels&&((s=o.objectLabels)==null?void 0:s.length)>0){let a=o.objectLabels.slice();a=_(a,"[label]",A.label),a=_(a,"[score]",100*A.score),ne(r,a,A.box[0],A.box[1],o)}r.stroke()}}}function tt(e,t,n){var r;let o=a0(d0,n);if(!(!t||!e)&&o.drawGestures&&((r=o.gestureLabels)==null?void 0:r.length)>0){let s=Q0(e);if(!s)return;s.font=o.font,s.fillStyle=o.color;let A=1;for(let a=0;a1&&c[1].length>0){let d=l[1]>0?`#${l[1]}`:"",i=o.gestureLabels.slice();i=_(i,"[where]",l[0]),i=_(i,"[who]",d),i=_(i,"[what]",c[1]),ne(s,i,8,2+A*o.lineHeight,o),A+=1}}}}var Ie={face:`face + `);t.stroke(A),t.stroke(s)}}function Ls(e,t){var n;if(K.drawGaze&&((n=e.rotation)==null?void 0:n.gaze.strength)&&e.rotation.gaze.bearing&&e.annotations.leftEyeIris&&e.annotations.rightEyeIris&&e.annotations.leftEyeIris[0]&&e.annotations.rightEyeIris[0]){t.strokeStyle="pink",t.fillStyle="pink";let o=[e.annotations.leftEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.leftEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];t5(t,[e.annotations.leftEyeIris[0][0],e.annotations.leftEyeIris[0][1]],[o[0],o[1]],4);let r=[e.annotations.rightEyeIris[0][0]+Math.sin(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[3],e.annotations.rightEyeIris[0][1]+Math.cos(e.rotation.gaze.bearing)*e.rotation.gaze.strength*e.box[2]];t5(t,[e.annotations.rightEyeIris[0][0],e.annotations.rightEyeIris[0][1]],[r[0],r[1]],4)}}function Cs(e,t){if(K.drawPolygons&&e.mesh.length>=468){t.lineWidth=1;for(let n=0;n<_e.length/3;n++){let o=[_e[n*3+0],_e[n*3+1],_e[n*3+2]].map(r=>e.mesh[r]);e5(t,o,K)}Is(e,t)}}function Ws(e,t){if(K.drawPoints&&e.mesh.length>=468)for(let n=0;n0&&(Ws(r,o),Cs(r,o),Os(r,o),Ls(r,o))}}function _2(e,t,n){var s,A;let o=a0(x0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round";for(let a=0;a0)){let l=o.bodyLabels.slice();l=_(l,"[score]",100*t[a].score),ne(r,l,t[a].box[0],t[a].box[1],o)}if(o.drawPoints&&t[a].keypoints)for(let l=0;l0&&t[a].keypoints){r.font=o.font;for(let l of t[a].keypoints){if(!l.score||l.score===0)continue;let c=o.bodyPartLabels.slice();c=_(c,"[label]",l.part),c=_(c,"[score]",100*l.score),ne(r,c,l.position[0],l.position[1],o)}}if(o.drawPolygons&&t[a].keypoints&&t[a].annotations)for(let l of Object.values(t[a].annotations))for(let c of l)X1(r,c,o)}}}function $2(e,t,n){var s,A;let o=a0(x0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let a of t){if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,pe(r,a.box[0],a.box[1],a.box[2],a.box[3],o),o.drawLabels&&((s=o.handLabels)==null?void 0:s.length)>0){let l=o.handLabels.slice();l=_(l,"[label]",a.label),l=_(l,"[score]",100*a.score),ne(r,l,a.box[0],a.box[1],o)}r.stroke()}if(o.drawPoints&&a.keypoints&&a.keypoints.length>0)for(let l of a.keypoints)r.fillStyle=Je(l[2],o),Te(r,l[0],l[1],0,o);if(o.drawLabels&&a.annotations&&((A=o.fingerLabels)==null?void 0:A.length)>0)for(let[l,c]of Object.entries(a.annotations)){let x=o.fingerLabels.slice();x=_(x,"[label]",l),ne(r,x,c[c.length-1][0],c[c.length-1][1],o)}if(o.drawPolygons&&a.annotations){let l=c=>{if(!(!c||c.length===0||!c[0]))for(let x=0;x0?x-1:0][0],c[x>0?x-1:0][1]),r.lineTo(c[x][0],c[x][1]),r.stroke()}};r.lineWidth=o.lineWidth,l(a.annotations.index),l(a.annotations.middle),l(a.annotations.ring),l(a.annotations.pinky),l(a.annotations.thumb)}}}}function et(e,t,n){var s;let o=a0(x0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let A of t)if(o.drawBoxes){if(r.strokeStyle=o.color,r.fillStyle=o.color,pe(r,A.box[0],A.box[1],A.box[2],A.box[3],o),o.drawLabels&&((s=o.objectLabels)==null?void 0:s.length)>0){let a=o.objectLabels.slice();a=_(a,"[label]",A.label),a=_(a,"[score]",100*A.score),ne(r,a,A.box[0],A.box[1],o)}r.stroke()}}}function tt(e,t,n){var r;let o=a0(x0,n);if(!(!t||!e)&&o.drawGestures&&((r=o.gestureLabels)==null?void 0:r.length)>0){let s=Q0(e);if(!s)return;s.font=o.font,s.fillStyle=o.color;let A=1;for(let a=0;a1&&c[1].length>0){let x=l[1]>0?`#${l[1]}`:"",i=o.gestureLabels.slice();i=_(i,"[where]",l[0]),i=_(i,"[who]",x),i=_(i,"[what]",c[1]),ne(s,i,8,2+A*o.lineHeight,o),A+=1}}}}var Ie={face:`face confidence: [score]% [gender] [genderScore]% age: [age] years @@ -118,7 +118,7 @@ live: [live]% [emotions] roll: [roll]\xB0 yaw:[yaw]\xB0 pitch:[pitch]\xB0 - gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var s5=0;function Fs(e,t,n){let o=a0(d0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let s=0;si5,kpt:()=>a5});var a5=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],i5={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var D=Z(H());var _0,t2=224,Y1,Gs=5,rt=[8,16,32,32,32];function Vs(){let e=[],t=0;for(;tn.x)),y:D.tensor1d(e.map(n=>n.y))}}async function K1(e){if(R.initial&&(_0=null),!_0&&e.body.detector&&e.body.detector.modelPath){_0=await O(e.body.detector.modelPath);let t=_0!=null&&_0.executor?Object.values(_0.modelSignature.inputs):void 0;t2=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&_0&&u("cached model:",_0.modelUrl);return Vs(),_0}var U1=[5,5];function Zs(e,t){return D.tidy(()=>{let n=D.split(e,12,1),o=D.squeeze(n[0]),r=D.squeeze(n[1]),s=D.squeeze(n[2]),A=D.squeeze(n[3]);o=D.add(D.div(o,t2),t.x),r=D.add(D.div(r,t2),t.y),s=D.mul(D.div(s,t2),U1[0]),A=D.mul(D.div(A,t2),U1[1]);let a=D.sub(o,D.div(s,2)),l=D.sub(r,D.div(A,2)),c=D.add(a,s),d=D.add(l,A);return D.stack([a,l,c,d],1)})}async function Xs(e,t,n,o){var c,d;let r=[],s={};s.boxes=Zs(e,Y1),s.scores=D.sigmoid(t),s.nms=await D.image.nonMaxSuppressionAsync(s.boxes,s.scores,1,((c=n.body.detector)==null?void 0:c.minConfidence)||.1,((d=n.body.detector)==null?void 0:d.iouThreshold)||.1);let A=await s.nms.data(),a=await s.scores.data(),l=await s.boxes.array();for(let i of Array.from(A)){let y=a[i],x=l[i],p=[Math.round(x[0]*o[0]),Math.round(x[1]*o[1]),Math.round(x[2]*o[0]),Math.round(x[3]*o[1])],f={score:y,boxRaw:x,box:p};r.push(f)}return Object.keys(s).forEach(i=>D.dispose(s[i])),r}async function J1(e,t,n){let o={};o.res=_0==null?void 0:_0.execute(e,["Identity"]),o.logitsRaw=D.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=D.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=D.squeeze(o.logitsRaw),o.boxes=D.squeeze(o.boxesRaw);let r=await Xs(o.boxes,o.logits,t,n);return Object.keys(o).forEach(s=>D.dispose(o[s])),r}function ve(e,t=[1,1]){let n=[e.map(a=>a[0]),e.map(a=>a[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[o[0],o[1],r[0]-o[0],r[1]-o[1]],A=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:A}}function Q1(e,t=[1,1]){let n=[e.map(c=>c[0]),e.map(c=>c[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[(o[0]+r[0])/2,(o[1]+r[1])/2],A=Math.max(s[0]-o[0],s[1]-o[1],-s[0]+r[0],-s[1]+r[1]),a=[Math.trunc(s[0]-A),Math.trunc(s[1]-A),Math.trunc(2*A),Math.trunc(2*A)],l=[a[0]/t[0],a[1]/t[1],a[2]/t[0],a[3]/t[1]];return{box:a,boxRaw:l}}function st(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var F0,c5=256,l5=Number.MAX_SAFE_INTEGER,qs={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},at=[],Oe=[[0,0],[0,0],[0,0],[0,0]],_1=0,$1=e=>1-1/(1+Math.exp(e)),t3=e=>K1(e);async function n3(e){if(R.initial&&(F0=null),F0)e.debug&&u("cached model:",F0.modelUrl);else{F0=await O(e.body.modelPath);let t=F0!=null&&F0.executor?Object.values(F0.modelSignature.inputs):void 0;c5=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return F0}function e3(e,t,n){var s,A;let o={};if(!((s=e==null?void 0:e.shape)!=null&&s[1])||!((A=e==null?void 0:e.shape)!=null&&A[2]))return e;let r;if(n&&(o.cropped=B0.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let a=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],l=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];Oe=[[0,0],a,l,[0,0]],o.pad=B0.pad(o.cropped||e,Oe),o.resize=B0.image.resizeBilinear(o.pad,[t,t]),r=B0.div(o.resize,C.tf255)}else e.shape[1]!==t?(o.resize=B0.image.resizeBilinear(o.cropped||e,[t,t]),r=B0.div(o.resize,C.tf255)):r=B0.div(o.cropped||e,C.tf255);return Object.keys(o).forEach(a=>B0.dispose(o[a])),r}function Us(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+Oe[2][0]+Oe[2][1])/t[0]-Oe[2][0]),Math.trunc(o.position[1]*(t[1]+Oe[1][0]+Oe[1][1])/t[1]-Oe[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],r=n[3]-n[1];for(let s of e)s.positionRaw=[s.positionRaw[0]/r+n[1],s.positionRaw[1]/o+n[0],s.positionRaw[2]],s.position=[Math.trunc(s.positionRaw[0]*t[0]),Math.trunc(s.positionRaw[1]*t[1]),s.positionRaw[2]]}return e}function Ys(e){let t=e.find(a=>a.part==="leftPalm"),n=e.find(a=>a.part==="leftWrist"),o=e.find(a=>a.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let r=e.find(a=>a.part==="rightPalm"),s=e.find(a=>a.part==="rightWrist"),A=e.find(a=>a.part==="rightIndex");r.position[2]=((s.position[2]||0)+(A.position[2]||0))/2}async function Ks(e,t,n){if(!(F0!=null&&F0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=F0==null?void 0:F0.execute(e,qs.landmarks);let r=(await o.poseflag.data())[0],s=await o.ld.data(),A=await o.world.data();Object.keys(o).forEach(p=>B0.dispose(o[p]));let a=[],l=5;for(let p=0;pp.position),i=ve(d,[n[0],n[1]]),y={};for(let[p,f]of Object.entries(i5)){let b=[];for(let M=0;Mh.part===f[M]),m=c.find(h=>h.part===f[M+1]);T&&m&&b.push([T.position,m.position])}y[p]=b}return{id:0,score:Math.trunc(100*r)/100,box:i.box,boxRaw:i.boxRaw,keypoints:c,annotations:y}}async function x5(e,t){var s,A,a;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>g()-_1,r=l5<(t.body.skipFrames||0);if(t.skipAllowed&&o&&r&&at!==null)l5++;else{let l=[];if((A=(s=t.body)==null?void 0:s.detector)!=null&&A.enabled){let c=e3(e,224);l=await J1(c,t,n),B0.dispose(c)}else l=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let c=0;cL0.dispose(o[c])),r}async function f5(e,t){if(!(H0!=null&&H0.executor))return[];let n=(t.object.skipTime||0)>g()-r3,o=y5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&d5.length>0?(y5++,d5):(y5=0,new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=L0.image.resizeBilinear(e,[n2,n2]),a=t.object.enabled?H0==null?void 0:H0.execute(A,["tower_0/detections"]):null;r3=g(),L0.dispose(A);let l=await Js(a,s,t);d5=l,r(l)}))}var J=Z(H());var it={};ze(it,{connected:()=>p5,kpt:()=>m5});var m5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],p5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var i0,a3=0,C0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},u5=Number.MAX_SAFE_INTEGER;async function i3(e){return R.initial&&(i0=null),i0?e.debug&&u("cached model:",i0.modelUrl):i0=await O(e.body.modelPath),i0}async function Qs(e,t){let[n,o]=e.shape,r=J.reshape(e,[o*n]),s=J.max(r,0),A=(await s.data())[0];if(A>t){let a=J.argMax(r,0),l=J.mod(a,n),c=(await l.data())[0],d=J.div(a,n),i=(await d.data())[0];return J.dispose([r,s,a,l,d]),[c,i,A]}return J.dispose([r,s]),[0,0,A]}async function h5(e,t){if(!(i0!=null&&i0.executor)||!(i0!=null&&i0.inputs[0].shape))return[];let n=(t.body.skipTime||0)>g()-a3,o=u5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(C0.keypoints).length>0?(u5++,[C0]):(u5=0,new Promise(async r=>{let s=J.tidy(()=>{var p,f;let i=J.image.resizeBilinear(e,[((p=i0==null?void 0:i0.inputs[0].shape)==null?void 0:p[2])||0,((f=i0==null?void 0:i0.inputs[0].shape)==null?void 0:f[1])||0],!1),y=J.mul(i,C.tf2);return J.sub(y,C.tf1)}),A;if(t.body.enabled&&(A=i0==null?void 0:i0.execute(s)),a3=g(),J.dispose(s),A){C0.keypoints.length=0;let i=J.squeeze(A);J.dispose(A);let y=J.unstack(i,2);J.dispose(i);for(let x=0;x(t.body.minConfidence||0)&&C0.keypoints.push({score:Math.round(100*b)/100,part:m5[x],positionRaw:[p/i0.inputs[0].shape[2],f/i0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*p/i0.inputs[0].shape[2]),Math.round(e.shape[1]*f/i0.inputs[0].shape[1])]})}y.forEach(x=>J.dispose(x))}C0.score=C0.keypoints.reduce((i,y)=>y.score>i?y.score:i,0);let a=C0.keypoints.map(i=>i.position[0]),l=C0.keypoints.map(i=>i.position[1]);C0.box=[Math.min(...a),Math.min(...l),Math.max(...a)-Math.min(...a),Math.max(...l)-Math.min(...l)];let c=C0.keypoints.map(i=>i.positionRaw[0]),d=C0.keypoints.map(i=>i.positionRaw[1]);C0.boxRaw=[Math.min(...c),Math.min(...d),Math.max(...c)-Math.min(...c),Math.max(...d)-Math.min(...d)];for(let[i,y]of Object.entries(p5)){let x=[];for(let p=0;pM.part===y[p]),b=C0.keypoints.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&x.push([f.position,b.position])}C0.annotations[i]=x}r([C0])}))}var l0=Z(H());var We=Z(H());var L=Z(H());var Re=Z(H());var y2=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],lt=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],ct=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],xt=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],d3=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},b5=(e,t,n)=>{let o=t.shape[1],r=t.shape[2],s=[e.startPoint[1]/o,e.startPoint[0]/r,e.endPoint[1]/o,e.endPoint[0]/r],A=Re.image.cropAndResize(t,[s],[0],n),a=Re.div(A,C.tf255);return Re.dispose(A),a},dt=(e,t)=>{let n=lt(e),o=y2(e),r=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-r[0],n[1]-r[1]],endPoint:[n[0]+r[0],n[1]+r[1]],landmarks:e.landmarks,confidence:e.confidence}},yt=e=>{let t=lt(e),n=y2(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},y3=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},g5=[[1,0,0],[0,1,0],[0,0,1]],_s=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),$s=(e,t)=>_s(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var c3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],o2=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let r=0;r{let n=Math.cos(e),o=Math.sin(e),r=[[n,-o,0],[o,n,0],[0,0,1]],s=c3(t[0],t[1]),A=x3(s,r),a=c3(-t[0],-t[1]);return x3(A,a)},tA=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-o2(t[0],n),-o2(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},nA=(e,t)=>[o2(e,t[0]),o2(e,t[1])];function m3(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[s[0]/r*(x[0]-r/2),s[1]/r*(x[1]-r/2),x[2]||0]),a=n&&n!==0&&Math.abs(n)>.2,l=a?f3(n,[0,0]):g5,c=a?A.map(x=>[...nA(x,l),x[2]]):A,d=a?tA(o):g5,i=lt(t),y=[o2(i,d[0]),o2(i,d[1])];return c.map(x=>[Math.trunc(x[0]+y[0]),Math.trunc(x[1]+y[1]),Math.trunc(x[2]||0)])}function u3(e,t,n,o){let r=t.landmarks.length>=n5.count?n5.symmetryLine:Qe.symmetryLine,s=0,A=g5,a;if(e&&R.kernels.includes("rotatewithoffset"))if(s=$s(t.landmarks[r[0]],t.landmarks[r[1]]),s&&s!==0&&Math.abs(s)>.2){let c=lt(t),d=[c[0]/n.shape[2],c[1]/n.shape[1]],i=Re.image.rotateWithOffset(n,s,0,[d[0],d[1]]);A=f3(-s,c),a=b5(t,i,[o,o]),Re.dispose(i)}else a=b5(t,n,[o,o]);else a=b5(t,n,[o,o]);return[s,A,a]}var oA=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},h3=(e,t)=>{let n=oA(e),o=y2(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var b3=6,rA=1.4,ie,v5=null,Le=0,f2=null,m2=()=>Le;async function g3(e){var t;return R.initial&&(ie=null),ie?e.debug&&u("cached model:",ie.modelUrl):ie=await O((t=e.face.detector)==null?void 0:t.modelPath),Le=ie.executor&&ie.inputs[0].shape?ie.inputs[0].shape[2]:256,f2=L.scalar(Le,"int32"),v5=L.tensor2d(m3(Le)),ie}function sA(e){if(!v5||!f2)return L.zeros([0,0]);let t={};t.boxStarts=L.slice(e,[0,1],[-1,2]),t.centers=L.add(t.boxStarts,v5),t.boxSizes=L.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=L.div(t.boxSizes,f2),t.centersNormalized=L.div(t.centers,f2),t.halfBoxSize=L.div(t.boxSizesNormalized,C.tf2),t.starts=L.sub(t.centersNormalized,t.halfBoxSize),t.ends=L.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=L.mul(t.starts,f2),t.endNormalized=L.mul(t.ends,f2);let n=L.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>L.dispose(t[o])),n}async function T3(e,t){var a,l,c,d;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=L.image.resizeBilinear(e,[Le,Le]),n.div=L.div(n.resized,C.tf127),n.normalized=L.sub(n.div,C.tf05);let o=ie==null?void 0:ie.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let i=o.sort((y,x)=>y.size-x.size);n.concat384=L.concat([i[0],i[2]],2),n.concat512=L.concat([i[1],i[3]],2),n.concat=L.concat([n.concat512,n.concat384],1),n.batch=L.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=L.squeeze(o[0]):n.batch=L.squeeze(o);L.dispose(o),n.boxes=sA(n.batch),n.logits=L.slice(n.batch,[0,0],[-1,1]),n.sigmoid=L.sigmoid(n.logits),n.scores=L.squeeze(n.sigmoid),n.nms=await L.image.nonMaxSuppressionAsync(n.boxes,n.scores,((a=t.face.detector)==null?void 0:a.maxDetected)||0,((l=t.face.detector)==null?void 0:l.iouThreshold)||0,((c=t.face.detector)==null?void 0:c.minConfidence)||0);let r=await n.nms.array(),s=[],A=await n.scores.data();for(let i=0;i(((d=t.face.detector)==null?void 0:d.minConfidence)||0)){let x={};x.bbox=L.slice(n.boxes,[r[i],0],[1,-1]),x.slice=L.slice(n.batch,[r[i],b3-1],[1,-1]),x.squeeze=L.squeeze(x.slice),x.landmarks=L.reshape(x.squeeze,[b3,-1]);let p=await x.bbox.data(),f={startPoint:[p[0],p[1]],endPoint:[p[2],p[3]],landmarks:await x.landmarks.array(),confidence:y},b=d3(f,[(e.shape[2]||0)/Le,(e.shape[1]||0)/Le]),M=dt(b,t.face.scale||rA),T=yt(M);s.push(T),Object.keys(x).forEach(m=>L.dispose(x[m]))}}return Object.keys(n).forEach(i=>L.dispose(n[i])),s}var le=Z(H());var V0,Ce=0,AA=2.3,R5=oe.leftEyeLower0,M5=oe.rightEyeLower0,p2={leftBounds:[R5[0],R5[R5.length-1]],rightBounds:[M5[0],M5[M5.length-1]]},u2={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function k3(e){var t,n;return R.initial&&(V0=null),V0?e.debug&&u("cached model:",V0.modelUrl):V0=await O((t=e.face.iris)==null?void 0:t.modelPath),Ce=(V0==null?void 0:V0.executor)&&((n=V0.inputs)==null?void 0:n[0].shape)?V0.inputs[0].shape[2]:0,Ce===-1&&(Ce=64),V0}function ft(e,t,n,o){for(let r=0;r{let t=e[p2.leftBounds[0]][2],n=e[p2.rightBounds[0]][2];return t-n},R3=(e,t,n,o,r,s=!1)=>{let A=yt(dt(y3([e[n],e[o]]),AA)),a=y2(A),l=le.image.cropAndResize(t,[[A.startPoint[1]/r,A.startPoint[0]/r,A.endPoint[1]/r,A.endPoint[0]/r]],[0],[Ce,Ce]);if(s&&R.kernels.includes("flipleftright")){let c=le.image.flipLeftRight(l);le.dispose(l),l=c}return{box:A,boxSize:a,crop:l}},M3=(e,t,n,o=!1)=>{let r=[];for(let s=0;s{let o=e[oe[`${n}EyeUpper0`][u2.upperCenter]][2],r=e[oe[`${n}EyeLower0`][u2.lowerCenter]][2],s=(o+r)/2;return t.map((A,a)=>{let l=s;return a===2?l=o:a===4&&(l=r),[A[0],A[1],l]})};async function w3(e,t,n){if(!(V0!=null&&V0.executor))return e;let{box:o,boxSize:r,crop:s}=R3(e,t,p2.leftBounds[0],p2.leftBounds[1],n,!0),{box:A,boxSize:a,crop:l}=R3(e,t,p2.rightBounds[0],p2.rightBounds[1],n,!0),c=le.concat([s,l]);le.dispose(s),le.dispose(l);let d=V0.execute(c);le.dispose(c);let i=await d.data();le.dispose(d);let y=i.slice(0,u2.numCoordinates*3),{rawCoords:x,iris:p}=M3(y,o,r,!0),f=i.slice(u2.numCoordinates*3),{rawCoords:b,iris:M}=M3(f,A,a,!1),T=aA(e);Math.abs(T)<30?(ft(e,x,"left",null),ft(e,b,"right",null)):T<1?ft(e,x,"left",["EyeUpper0","EyeLower0"]):ft(e,b,"right",["EyeUpper0","EyeLower0"]);let m=P3(e,p,"left"),h=P3(e,M,"right");return e.concat(m).concat(h)}async function z3(e,t){var s,A,a,l,c,d,i,y,x,p;let n={lips:await((A=(s=t.filter(f=>f.size===160))==null?void 0:s[0])==null?void 0:A.data()),irisL:await((l=(a=t.filter(f=>f.size===10))==null?void 0:a[0])==null?void 0:l.data()),eyeL:await((d=(c=t.filter(f=>f.size===142))==null?void 0:c[0])==null?void 0:d.data()),irisR:await((y=(i=t.filter(f=>f.size===10))==null?void 0:i[1])==null?void 0:y.data()),eyeR:await((p=(x=t.filter(f=>f.size===142))==null?void 0:x[1])==null?void 0:p.data())};for(let f of Object.values(n))if(!f)return e;let o=$e.reduce((f,b)=>f+=e[b][2],0)/$e.length;for(let f=0;ff+=e[b][2],0)/e2.length;for(let f=0;fg()-ue.timestamp,o=ue.skipped<(((c=t.face.detector)==null?void 0:c.skipFrames)||0);!t.skipAllowed||!n||!o||ue.boxes.length===0?(ue.boxes=await T3(e,t),ue.timestamp=g(),ue.skipped=0):ue.skipped++;let r=[],s=[],A=0,a=C2;for(let T=0;TG.shape[G.shape.length-1]===1).data();if(P.faceScore=Math.round(100*t0[0])/100,P.faceScore<(((p=t.face.detector)==null?void 0:p.minConfidence)||1)){if(m.confidence=P.faceScore,t.face.mesh.keepInvalid){P.box=ct(m,e),P.boxRaw=xt(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(G=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*G[0]/m2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*G[1]/m2()]),P.meshRaw=P.mesh.map(G=>[G[0]/(e.shape[2]||1),G[1]/(e.shape[1]||1),(G[2]||0)/a]);for(let G of Object.keys(Qe))P.annotations[G]=[P.mesh[Qe[G]]]}}else{let G=I.find(V=>V.shape[V.shape.length-1]===1404),$=We.reshape(G,[-1,3]),A0=await $.array();We.dispose($),(f=t.face.attention)!=null&&f.enabled?A0=await z3(A0,I):(b=t.face.iris)!=null&&b.enabled&&(A0=await w3(A0,P.tensor,C2)),P.mesh=p3(A0,m,h,S,C2),P.meshRaw=P.mesh.map(V=>[V[0]/(e.shape[2]||0),V[1]/(e.shape[1]||0),(V[2]||0)/a]);for(let V of Object.keys(oe))P.annotations[V]=oe[V].map(n0=>P.mesh[n0]);P.score=P.faceScore;let v={...h3(P.mesh,m),confidence:m.confidence,landmarks:m.landmarks};P.box=ct(v,e),P.boxRaw=xt(v,e),s.push(v)}We.dispose(I)}else{P.box=ct(m,e),P.boxRaw=xt(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(I=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*I[0]/m2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*I[1]/m2()]),P.meshRaw=P.mesh.map(I=>[I[0]/(e.shape[2]||0),I[1]/(e.shape[1]||0),(I[2]||0)/a]);for(let I of Object.keys(Qe))P.annotations[I]=[P.mesh[Qe[I]]]}P.score>(((M=t.face.detector)==null?void 0:M.minConfidence)||1)?r.push(P):We.dispose(P.tensor)}return ue.boxes=s,r}async function j3(e){var t,n,o,r,s,A;return R.initial&&(r0=null),((t=e.face.attention)==null?void 0:t.enabled)&&(r0==null?void 0:r0.signature)&&Object.keys(((n=r0==null?void 0:r0.signature)==null?void 0:n.outputs)||{}).length<6&&(r0=null),r0?e.debug&&u("cached model:",r0.modelUrl):(o=e.face.attention)!=null&&o.enabled?r0=await O(e.face.attention.modelPath):r0=await O((r=e.face.mesh)==null?void 0:r.modelPath),C2=r0.executor&&((s=r0==null?void 0:r0.inputs)==null?void 0:s[0].shape)?(A=r0==null?void 0:r0.inputs)==null?void 0:A[0].shape[2]:256,r0}var N3=_e,I3=O2;var ce=Z(H());var lA=["angry","disgust","fear","happy","sad","surprise","neutral"],$0,mt=[],O3=0,L3=0,k5=Number.MAX_SAFE_INTEGER;async function C3(e){var t;return R.initial&&($0=null),$0?e.debug&&u("cached model:",$0.modelUrl):$0=await O((t=e.face.emotion)==null?void 0:t.modelPath),$0}async function w5(e,t,n,o){var A,a;if(!$0)return[];let r=k5<(((A=t.face.emotion)==null?void 0:A.skipFrames)||0),s=(((a=t.face.emotion)==null?void 0:a.skipTime)||0)>g()-L3;return t.skipAllowed&&s&&r&&O3===o&&mt[n]&&mt[n].length>0?(k5++,mt[n]):(k5=0,new Promise(async l=>{var d;let c=[];if((d=t.face.emotion)!=null&&d.enabled){let i={},y=$0!=null&&$0.inputs[0].shape?$0.inputs[0].shape[2]:0;i.resize=ce.image.resizeBilinear(e,[y,y],!1),i.channels=ce.mul(i.resize,C.rgb),i.grayscale=ce.sum(i.channels,3,!0),i.grayscaleSub=ce.sub(i.grayscale,C.tf05),i.grayscaleMul=ce.mul(i.grayscaleSub,C.tf2),i.emotion=$0==null?void 0:$0.execute(i.grayscaleMul),L3=g();let x=await i.emotion.data();for(let p=0;p(t.face.emotion.minConfidence||0)&&c.push({score:Math.min(.99,Math.trunc(100*x[p])/100),emotion:lA[p]});c.sort((p,f)=>f.score-p.score),Object.keys(i).forEach(p=>ce.dispose(i[p]))}mt[n]=c,O3=o,l(c)}))}var xe=Z(H());var z0,De=[],D3=0,F3=0,E5=Number.MAX_SAFE_INTEGER;async function B3(e){var t;return R.initial&&(z0=null),z0?e.debug&&u("cached model:",z0.modelUrl):z0=await O((t=e.face.description)==null?void 0:t.modelPath),z0}function cA(e){let t=e.image||e.tensor||e;if(!(z0!=null&&z0.inputs[0].shape))return t;let n=xe.image.resizeBilinear(t,[z0.inputs[0].shape[2],z0.inputs[0].shape[1]],!1),o=xe.mul(n,C.tf255);return xe.dispose(n),o}async function z5(e,t,n,o){var a,l,c,d;let r={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(z0!=null&&z0.executor))return r;let s=E5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),A=(((l=t.face.description)==null?void 0:l.skipTime)||0)>g()-D3;return t.skipAllowed&&s&&A&&F3===o&&((c=De==null?void 0:De[n])==null?void 0:c.age)>0&&((d=De==null?void 0:De[n])==null?void 0:d.genderScore)>0?(E5++,De[n]):(E5=0,new Promise(async i=>{var y;if((y=t.face.description)!=null&&y.enabled){let x=cA(e),p=z0==null?void 0:z0.execute(x);D3=g(),xe.dispose(x);let b=await p.find(q=>q.shape[1]===1).data(),M=Math.trunc(200*Math.abs(b[0]-.5))/100;M>(t.face.description.minConfidence||0)&&(r.gender=b[0]<=.5?"female":"male",r.genderScore=Math.min(.99,M));let T=xe.argMax(p.find(q=>q.shape[1]===100),1),m=(await T.data())[0];xe.dispose(T);let S=await p.find(q=>q.shape[1]===100).data();r.age=Math.round(S[m-1]>S[m+1]?10*m-100*S[m-1]:10*m+100*S[m+1])/10,(Number.isNaN(b[0])||Number.isNaN(S[0]))&&u("faceres error:",{model:z0,result:p});let P=p.find(q=>q.shape[1]===1024),I=P?await P.data():[];r.descriptor=Array.from(I),p.forEach(q=>xe.dispose(q))}De[n]=r,F3=o,i(r)}))}var h2=.1,S5=.5;function xA(e,t,n){let o=!1,r=n.length-1;for(let s=0;st!=n[r].y>t&&e<(n[r].x-n[s].x)*(t-n[s].y)/(n[r].y-n[s].y)+n[s].x&&(o=!o);return o}async function G3(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),r=[];for(let A of oe.silhouette)r.push({x:(e.mesh[A][0]-e.box[0])/e.box[2],y:(e.mesh[A][1]-e.box[1])/e.box[3]});h2&&h2>0&&(r=r.map(A=>({x:A.x>.5?A.x+h2:A.x-h2,y:A.y>.5?A.y+h2:A.y-h2})));for(let A=0;Ag()-Z3,s=j5<(((a=t.face.antispoof)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&V3===o&&pt[n]?(j5++,pt[n]):(j5=0,new Promise(async l=>{let c=ut.image.resizeBilinear(e,[M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[2]:0,M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[1]:0],!1),d=M0==null?void 0:M0.execute(c),i=(await d.data())[0];pt[n]=Math.round(100*i)/100,V3=o,Z3=g(),ut.dispose([c,d]),l(pt[n])}))}var bt=Z(H());var P0,ht=[],I5=Number.MAX_SAFE_INTEGER,U3=0,Y3=0;async function K3(e){var t;return R.initial&&(P0=null),P0?e.debug&&u("cached model:",P0.modelUrl):P0=await O((t=e.face.liveness)==null?void 0:t.modelPath),P0}async function O5(e,t,n,o){var A,a;if(!(P0!=null&&P0.executor))return 0;let r=(((A=t.face.liveness)==null?void 0:A.skipTime)||0)>g()-Y3,s=I5<(((a=t.face.liveness)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&U3===o&&ht[n]?(I5++,ht[n]):(I5=0,new Promise(async l=>{let c=bt.image.resizeBilinear(e,[P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[2]:0,P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[1]:0],!1),d=P0==null?void 0:P0.execute(c),i=(await d.data())[0];ht[n]=Math.round(100*i)/100,U3=o,Y3=g(),bt.dispose([c,d]),l(ht[n])}))}var gt=Z(H());var re,L5=[],yA=["white","black","asian","indian","other"],fA=[15,23,28,35.5,45.5,55.5,65],Q3=0,_3=0,C5=Number.MAX_SAFE_INTEGER;async function $3(e){var t;return R.initial&&(re=null),re?e.debug&&u("cached model:",re.modelUrl):re=await O((t=e.face.gear)==null?void 0:t.modelPath),re}async function W5(e,t,n,o){var A,a;if(!re)return{age:0,gender:"unknown",genderScore:0,race:[]};let r=C5<(((A=t.face.gear)==null?void 0:A.skipFrames)||0),s=(((a=t.face.gear)==null?void 0:a.skipTime)||0)>g()-_3;return t.skipAllowed&&s&&r&&Q3===o&&L5[n]?(C5++,L5[n]):(C5=0,new Promise(async l=>{var M,T;if(!(re!=null&&re.inputs[0].shape))return;let c={},d=[[0,.1,.9,.9]];c.resize=gt.image.cropAndResize(e,d,[0],[re.inputs[0].shape[2],re.inputs[0].shape[1]]);let i={age:0,gender:"unknown",genderScore:0,race:[]};(M=t.face.gear)!=null&&M.enabled&&([c.age,c.gender,c.race]=re.execute(c.resize,["age_output","gender_output","race_output"]));let y=await c.gender.data();i.gender=y[0]>y[1]?"male":"female",i.genderScore=Math.round(100*(y[0]>y[1]?y[0]:y[1]))/100;let x=await c.race.data();for(let m=0;m(((T=t.face.gear)==null?void 0:T.minConfidence)||.2)&&i.race.push({score:Math.round(100*x[m])/100,race:yA[m]});i.race.sort((m,h)=>h.score-m.score);let f=Array.from(await c.age.data()).map((m,h)=>[fA[h],m]).sort((m,h)=>h[1]-m[1]),b=f[0][0];for(let m=1;mgt.dispose(c[m])),L5[n]=i,Q3=o,_3=g(),l(i)}))}var b2=Z(H());var Z0,Tt=[],tn=0,nn=0,D5=Number.MAX_SAFE_INTEGER;async function on(e){return R.initial&&(Z0=null),Z0?e.debug&&u("cached model:",Z0.modelUrl):Z0=await O(e.face.ssrnet.modelPathAge),Z0}async function F5(e,t,n,o){var A,a,l,c;if(!Z0)return{age:0};let r=D5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-nn;return t.skipAllowed&&r&&s&&tn===o&&((l=Tt[n])==null?void 0:l.age)&&((c=Tt[n])==null?void 0:c.age)>0?(D5++,Tt[n]):(D5=0,new Promise(async d=>{var x;if(!(Z0!=null&&Z0.inputs)||!Z0.inputs[0]||!Z0.inputs[0].shape)return;let i={};i.resize=b2.image.resizeBilinear(e,[Z0.inputs[0].shape[2],Z0.inputs[0].shape[1]],!1),i.enhance=b2.mul(i.resize,C.tf255);let y={age:0};if((x=t.face.ssrnet)!=null&&x.enabled&&(i.age=Z0.execute(i.enhance)),i.age){let p=await i.age.data();y.age=Math.trunc(10*p[0])/10}Object.keys(i).forEach(p=>b2.dispose(i[p])),Tt[n]=y,tn=o,nn=g(),d(y)}))}var S0=Z(H());var se,vt=[],sn=0,An=0,B5=Number.MAX_SAFE_INTEGER,H5=[.2989,.587,.114];async function an(e){var t;return R.initial&&(se=null),se?e.debug&&u("cached model:",se.modelUrl):se=await O((t=e.face.ssrnet)==null?void 0:t.modelPathGender),se}async function G5(e,t,n,o){var A,a,l,c;if(!se)return{gender:"unknown",genderScore:0};let r=B5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-An;return t.skipAllowed&&r&&s&&sn===o&&((l=vt[n])==null?void 0:l.gender)&&((c=vt[n])==null?void 0:c.genderScore)>0?(B5++,vt[n]):(B5=0,new Promise(async d=>{var p;if(!(se!=null&&se.inputs[0].shape))return;let i={};i.resize=S0.image.resizeBilinear(e,[se.inputs[0].shape[2],se.inputs[0].shape[1]],!1),i.enhance=S0.tidy(()=>{let[f,b,M]=S0.split(i.resize,3,3),T=S0.mul(f,H5[0]),m=S0.mul(b,H5[1]),h=S0.mul(M,H5[2]),S=S0.addN([T,m,h]);return S0.mul(S0.sub(S,C.tf05),2)});let y={gender:"unknown",genderScore:0};(p=t.face.ssrnet)!=null&&p.enabled&&(i.gender=se.execute(i.enhance));let x=await i.gender.data();y.gender=x[0]>x[1]?"female":"male",y.genderScore=x[0]>x[1]?Math.trunc(100*x[0])/100:Math.trunc(100*x[1])/100,Object.keys(i).forEach(f=>S0.dispose(i[f])),vt[n]=y,sn=o,An=g(),d(y)}))}var Rt=Z(H());var X0,V5=[],cn=0,xn=0,dn=Number.MAX_SAFE_INTEGER;async function yn(e){var t;return R.initial&&(X0=null),X0?e.debug&&u("cached model:",X0.modelUrl):X0=await O((t=e.face.mobilefacenet)==null?void 0:t.modelPath),X0}async function Z5(e,t,n,o){var A,a;if(!(X0!=null&&X0.executor))return[];let r=dn<(((A=t.face.mobilefacenet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.mobilefacenet)==null?void 0:a.skipTime)||0)>g()-xn;return t.skipAllowed&&s&&r&&cn===o&&V5[n]?(dn++,V5[n]):new Promise(async l=>{var d;let c=[];if(((d=t.face.mobilefacenet)==null?void 0:d.enabled)&&(X0==null?void 0:X0.inputs[0].shape)){let i={};i.crop=Rt.image.resizeBilinear(e,[X0.inputs[0].shape[2],X0.inputs[0].shape[1]],!1),i.data=X0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(x=>Rt.dispose(i[x]))}V5[n]=c,cn=o,xn=g(),l(c)})}var Mt=Z(H());var q0,X5=[],mn=0,pn=0,un=Number.MAX_SAFE_INTEGER;async function hn(e){return R.initial&&(q0=null),q0?e.debug&&u("cached model:",q0.modelUrl):q0=await O(e.face.insightface.modelPath),q0}async function q5(e,t,n,o){var A,a;if(!(q0!=null&&q0.executor))return[];let r=un<(((A=t.face.insightface)==null?void 0:A.skipFrames)||0),s=(((a=t.face.insightface)==null?void 0:a.skipTime)||0)>g()-pn;return t.skipAllowed&&s&&r&&mn===o&&X5[n]?(un++,X5[n]):new Promise(async l=>{var d;let c=[];if(((d=t.face.insightface)==null?void 0:d.enabled)&&(q0==null?void 0:q0.inputs[0].shape)){let i={};i.crop=Mt.image.resizeBilinear(e,[q0.inputs[0].shape[2],q0.inputs[0].shape[1]],!1),i.data=q0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(x=>Mt.dispose(i[x]))}X5[n]=c,mn=o,pn=g(),l(c)})}var mA=e=>{let t=(i,y)=>Math.atan2(i[1]-y[1],i[0]-y[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,r=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=r?e.mesh[473]:e.mesh[468],A=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],a=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(A[0]-s[0])/a[0]-n[0],o*(s[1]-A[1])/a[1]-n[1]],c=Math.sqrt(l[0]*l[0]+l[1]*l[1]);return c=Math.min(c,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:c}},gn=(e,t)=>{let n=f=>{let b=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);return f[0]/=b,f[1]/=b,f[2]/=b,f},o=(f,b)=>{let M=f[0]-b[0],T=f[1]-b[1],m=f[2]-b[2];return[M,T,m]},r=(f,b)=>{let M=f[1]*b[2]-f[2]*b[1],T=f[2]*b[0]-f[0]*b[2],m=f[0]*b[1]-f[1]*b[0];return[M,T,m]},s=f=>{let[b,M,T,m,h,S,P,I,q]=f,t0,G,$;return m<1?m>-1?($=Math.asin(m),G=Math.atan2(-P,b),t0=Math.atan2(-S,h)):($=-Math.PI/2,G=-Math.atan2(I,q),t0=0):($=Math.PI/2,G=Math.atan2(I,q),t0=0),Number.isNaN(t0)&&(t0=0),Number.isNaN(G)&&(G=0),Number.isNaN($)&&($=0),{pitch:2*-t0,yaw:2*-G,roll:2*-$}},A=e.meshRaw;if(!A||A.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let a=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,l=[A[10],A[152],A[234],A[454]].map(f=>[f[0]*t[0]/a,f[1]*t[1]/a,f[2]]),c=n(o(l[1],l[0])),d=n(o(l[3],l[2])),i=n(r(d,c));d=r(c,i);let y=[d[0],d[1],d[2],c[0],c[1],c[2],i[0],i[1],i[2]],x=s(y),p=A.length===478?mA(e):{bearing:0,strength:0};return{angle:x,matrix:y,gaze:p}};function Tn(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var U5=async(e,t)=>{var p,f,b,M,T,m,h,S,P,I,q,t0,G,$,A0,v,V,n0,U,g0,m0,B,X;let n=g(),o,r,s,A,a,l,c,d,i,y=[];e.state="run:face";let x=await S3(t,e.config);if(e.performance.face=R.perfadd?(e.performance.face||0)+Math.trunc(g()-n):Math.trunc(g()-n),!t.shape||t.shape.length!==4)return[];if(!x)return[];for(let z=0;z200?gn(x[z],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?A=(f=e.config.face.emotion)!=null&&f.enabled?w5(x[z].tensor||l0.tensor([]),e.config,z,x.length):[]:(e.state="run:emotion",n=g(),A=(b=e.config.face.emotion)!=null&&b.enabled?await w5(x[z].tensor||l0.tensor([]),e.config,z,x.length):[],e.performance.emotion=R.perfadd?(e.performance.emotion||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?c=(M=e.config.face.antispoof)!=null&&M.enabled?N5(x[z].tensor||l0.tensor([]),e.config,z,x.length):0:(e.state="run:antispoof",n=g(),c=(T=e.config.face.antispoof)!=null&&T.enabled?await N5(x[z].tensor||l0.tensor([]),e.config,z,x.length):0,e.performance.antispoof=R.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?d=(m=e.config.face.liveness)!=null&&m.enabled?O5(x[z].tensor||l0.tensor([]),e.config,z,x.length):0:(e.state="run:liveness",n=g(),d=(h=e.config.face.liveness)!=null&&h.enabled?await O5(x[z].tensor||l0.tensor([]),e.config,z,x.length):0,e.performance.liveness=R.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?r=(S=e.config.face.gear)!=null&&S.enabled?W5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null:(e.state="run:gear",n=g(),r=(P=e.config.face.gear)!=null&&P.enabled?await W5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null,e.performance.gear=Math.trunc(g()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(I=e.config.face.ssrnet)!=null&&I.enabled?F5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null,s=(q=e.config.face.ssrnet)!=null&&q.enabled?G5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null):(e.state="run:ssrnet",n=g(),o=(t0=e.config.face.ssrnet)!=null&&t0.enabled?await F5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null,s=(G=e.config.face.ssrnet)!=null&&G.enabled?await G5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null,e.performance.ssrnet=Math.trunc(g()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?a=($=e.config.face.mobilefacenet)!=null&&$.enabled?Z5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null:(e.state="run:mobilefacenet",n=g(),a=(A0=e.config.face.mobilefacenet)!=null&&A0.enabled?await Z5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?l=(v=e.config.face.insightface)!=null&&v.enabled?q5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null:(e.state="run:mobilefacenet",n=g(),l=(V=e.config.face.insightface)!=null&&V.enabled?await q5(x[z].tensor||l0.tensor([]),e.config,z,x.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?i=z5(x[z].tensor||l0.tensor([]),e.config,z,x.length):(e.state="run:description",n=g(),i=await z5(x[z].tensor||l0.tensor([]),e.config,z,x.length),e.performance.description=R.perfadd?(e.performance.description||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Description:"),e.config.async&&([o,s,A,a,l,i,r,c,d]=await Promise.all([o,s,A,a,l,i,r,c,d])),e.analyze("Finish Face:"),((n0=e.config.face.ssrnet)==null?void 0:n0.enabled)&&o&&s&&(i={...i,age:o.age,gender:s.gender,genderScore:s.genderScore}),((U=e.config.face.gear)==null?void 0:U.enabled)&&r&&(i={...i,age:r.age,gender:r.gender,genderScore:r.genderScore,race:r.race}),((g0=e.config.face.mobilefacenet)==null?void 0:g0.enabled)&&a&&(i.descriptor=a),((m0=e.config.face.insightface)==null?void 0:m0.enabled)&&l&&(i.descriptor=l);let we=(B=e.config.face.iris)!=null&&B.enabled?Tn(x[z],t.shape[2]):0,Ee=(X=e.config.face.detector)!=null&&X.return?l0.squeeze(x[z].tensor):null;l0.dispose(x[z].tensor),x[z].tensor&&delete x[z].tensor;let T0={...x[z],id:z};i.age&&(T0.age=i.age),i.gender&&(T0.gender=i.gender),i.genderScore&&(T0.genderScore=i.genderScore),i.descriptor&&(T0.embedding=i.descriptor),i.race&&(T0.race=i.race),A&&(T0.emotion=A),c&&(T0.real=c),d&&(T0.live=d),we>0&&(T0.distance=we),ee&&(T0.rotation=ee),Ee&&(T0.tensor=Ee),y.push(T0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),y};var W0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>W0.nameMapping[e],getPoints:e=>W0.pointsMapping[e]},Be={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>Be.nameMapping[e]},c0={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>c0.nameMapping[e]},Fe=class{constructor(t){k(this,"name");k(this,"curls");k(this,"directions");k(this,"weights");k(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((r,s)=>r+s,0);this.weightsRelative=this.weights.map(r=>r*5/o)}matchAgainst(t,n){let o=0;for(let r in t){let s=t[r],A=this.curls[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}for(let r in n){let s=n[r],A=this.directions[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}return o/10}};var{thumb:de,index:Me,middle:Pe,ring:r2,pinky:s2}=W0,{none:ye,half:uA,full:fe}=Be,{verticalUp:g2,verticalDown:G7,horizontalLeft:Y5,horizontalRight:hA,diagonalUpRight:bA,diagonalUpLeft:T2,diagonalDownRight:V7,diagonalDownLeft:Z7}=c0,He=new Fe("thumbs up");He.curl(de,ye,1);He.direction(de,g2,1);He.direction(de,T2,.25);He.direction(de,bA,.25);for(let e of[W0.index,W0.middle,W0.ring,W0.pinky])He.curl(e,fe,1),He.direction(e,Y5,1),He.direction(e,hA,1);var u0=new Fe("victory");u0.curl(de,uA,.5);u0.curl(de,ye,.5);u0.direction(de,g2,1);u0.direction(de,T2,1);u0.curl(Me,ye,1);u0.direction(Me,g2,.75);u0.direction(Me,T2,1);u0.curl(Pe,ye,1);u0.direction(Pe,g2,1);u0.direction(Pe,T2,.75);u0.curl(r2,fe,1);u0.direction(r2,g2,.2);u0.direction(r2,T2,1);u0.direction(r2,Y5,.2);u0.curl(s2,fe,1);u0.direction(s2,g2,.2);u0.direction(s2,T2,1);u0.direction(s2,Y5,.2);u0.weight(Me,2);u0.weight(Pe,2);var Ge=new Fe("point");Ge.curl(de,fe,1);Ge.curl(Me,ye,.5);Ge.curl(Pe,fe,.5);Ge.curl(r2,fe,.5);Ge.curl(s2,fe,.5);Ge.weight(Me,2);Ge.weight(Pe,2);var Ve=new Fe("middle finger");Ve.curl(de,ye,1);Ve.curl(Me,fe,.5);Ve.curl(Pe,fe,.5);Ve.curl(r2,fe,.5);Ve.curl(s2,fe,.5);Ve.weight(Me,2);Ve.weight(Pe,2);var v2=new Fe("open palm");v2.curl(de,ye,.75);v2.curl(Me,ye,.75);v2.curl(Pe,ye,.75);v2.curl(r2,ye,.75);v2.curl(s2,ye,.75);var vn=[He,u0,Ge,Ve,v2];var gA=.7,A2={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function Rn(e,t,n,o){let r=(t-o)/(e-n),s=Math.atan(r)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function Pn(e,t){if(!e||!t)return[0,0];let n=Rn(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=Rn(e[1],e[2],t[1],t[2]);return[n,o]}function Mn(e,t=1){let n=0,o=0,r=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:r=1*t,[n,o,r]}function TA(e,t,n){let o=e[0]-t[0],r=e[0]-n[0],s=t[0]-n[0],A=e[1]-t[1],a=e[1]-n[1],l=t[1]-n[1],c=e[2]-t[2],d=e[2]-n[2],i=t[2]-n[2],y=Math.sqrt(o*o+A*A+c*c),x=Math.sqrt(r*r+a*a+d*d),p=Math.sqrt(s*s+l*l+i*i),f=(p*p+y*y-x*x)/(2*p*y);f>1?f=1:f<-1&&(f=-1);let b=Math.acos(f);b=57.2958*b%180;let M;return b>A2.NO_CURL_START_LIMIT?M=Be.none:b>A2.HALF_CURL_START_LIMIT?M=Be.half:M=Be.full,M}function kn(e,t,n,o){let r;return o===Math.abs(e)?e>0?r=c0.horizontalLeft:r=c0.horizontalRight:o===Math.abs(t)?t>0?r=c0.horizontalLeft:r=c0.horizontalRight:n>0?r=c0.horizontalLeft:r=c0.horizontalRight,r}function wn(e,t,n,o){let r;return o===Math.abs(e)?e<0?r=c0.verticalDown:r=c0.verticalUp:o===Math.abs(t)?t<0?r=c0.verticalDown:r=c0.verticalUp:n<0?r=c0.verticalDown:r=c0.verticalUp,r}function vA(e,t,n,o,r,s,A,a){let l,c=wn(e,t,n,o),d=kn(r,s,A,a);return c===c0.verticalUp?d===c0.horizontalLeft?l=c0.diagonalUpLeft:l=c0.diagonalUpRight:d===c0.horizontalLeft?l=c0.diagonalDownLeft:l=c0.diagonalDownRight,l}function RA(e,t,n,o){let r=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],l=e[1]-n[1],c=t[1]-n[1],d=Math.max(Math.abs(r),Math.abs(s),Math.abs(A)),i=Math.max(Math.abs(a),Math.abs(l),Math.abs(c)),y=0,x=0,p=0,f=i/(d+1e-5);f>1.5?y+=A2.DISTANCE_VOTE_POWER:f>.66?x+=A2.DISTANCE_VOTE_POWER:p+=A2.DISTANCE_VOTE_POWER;let b=Math.sqrt(r*r+a*a),M=Math.sqrt(s*s+l*l),T=Math.sqrt(A*A+c*c),m=Math.max(b,M,T),h=e[0],S=e[1],P=n[0],I=n[1];m===b?(P=n[0],I=n[1]):m===T&&(h=t[0],S=t[1]);let G=Pn([h,S],[P,I]),$=Mn(G,A2.TOTAL_ANGLE_VOTE_POWER);y+=$[0],x+=$[1],p+=$[2];for(let v of o){let V=Mn(v,A2.SINGLE_ANGLE_VOTE_POWER);y+=V[0],x+=V[1],p+=V[2]}let A0;return y===Math.max(y,x,p)?A0=wn(l,a,c,i):p===Math.max(x,p)?A0=kn(s,r,A,d):A0=vA(l,a,c,i,s,r,A,d),A0}function En(e){let t=[],n=[],o=[],r=[];if(!e)return{curls:o,directions:r};for(let s of W0.all){let A=W0.getPoints(s),a=[],l=[];for(let c of A){let d=e[c[0]],i=e[c[1]],y=Pn(d,i),x=y[0],p=y[1];a.push(x),l.push(p)}t.push(a),n.push(l)}for(let s of W0.all){let A=s===W0.thumb?1:0,a=W0.getPoints(s),l=e[a[A][0]],c=e[a[A+1][1]],d=e[a[3][1]],i=TA(l,c,d),y=RA(l,c,d,t[s].slice(A));o[s]=i,r[s]=y}return{curls:o,directions:r}}function Pt(e){if(!e||e.length===0)return null;let t=En(e),n={};for(let o of W0.all)n[W0.getName(o)]={curl:Be.getName(t.curls[o]),direction:c0.getName(t.directions[o])};return n}function zn(e){let t=[];if(!e||e.length===0)return t;let n=En(e);for(let o of vn){let r=o.matchAgainst(n.curls,n.directions);r>=gA&&t.push({name:o.name,confidence:r})}return t}var Sn=e=>{if(!e)return[];let t=[];for(let n=0;nl.part==="leftWrist"),r=e[n].keypoints.find(l=>l.part==="rightWrist"),s=e[n].keypoints.find(l=>l.part==="nose");s&&o&&r&&o.position[1]l.part==="leftShoulder"),a=e[n].keypoints.find(l=>l.part==="rightShoulder");A&&a&&Math.abs(A.positionRaw[1]-a.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${A.position[1]>a.position[1]?"left":"right"}`})}return t},jn=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),r=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/r)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let a=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));a>10&&t.push({face:n,gesture:`mouth ${Math.trunc(a)}% open`});let l=e[n].mesh[152][2]||0;Math.abs(l)>10&&t.push({face:n,gesture:`head ${l<0?"up":"down"}`})}return t},Nn=e=>{var n,o,r,s;if(!e)return[];let t=[];for(let A=0;A.06||b>.06)&&(x=!1),f>b?f>.05&&t.push({iris:A,gesture:"looking right"}):b>.05&&t.push({iris:A,gesture:"looking left"});let M=Math.abs(e[A].mesh[145][1]-e[A].annotations.rightEyeIris[0][1])/e[A].box[3],T=Math.abs(e[A].mesh[374][1]-e[A].annotations.leftEyeIris[0][1])/e[A].box[3];(T<.01||M<.01||T>.022||M>.022)&&(x=!1),(T<.01||M<.01)&&t.push({iris:A,gesture:"looking down"}),(T>.022||M>.022)&&t.push({iris:A,gesture:"looking up"}),x&&t.push({iris:A,gesture:"looking center"})}return t},In=e=>{if(!e)return[];let t=[];for(let n=0;n0){let r=o.reduce((A,a)=>(A.position[2]||0)<(a.position[2]||0)?A:a);t.push({hand:n,gesture:`${r.name} forward`});let s=o.reduce((A,a)=>A.position[1][s[0]*t[0],s[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:r,confidence:e.confidence}}function wt(e,t=1.5){let n=W2(e),o=kt(e),r=[t*o[0]/2,t*o[1]/2],s=[n[0]-r[0],n[1]-r[1]],A=[n[0]+r[0],n[1]+r[1]];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function Et(e){let t=W2(e),n=kt(e),r=Math.max(...n)/2,s=[t[0]-r,t[1]-r],A=[t[0]+r,t[1]+r];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function PA(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Fn(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return PA(n)}var On=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function Ze(e,t){let n=0;for(let o=0;o[A.x,A.y]),this.anchorsTensor=W.tensor2d(this.anchors),this.inputSize=((s=(r=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:r.shape)==null?void 0:s[2])||0,this.inputSizeTensor=W.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=W.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=W.slice(t,[0,0],[-1,2]),n.boxSizes=W.slice(t,[0,2],[-1,2]),n.div=W.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=W.add(n.div,this.anchorsTensor),n.halfBoxSizes=W.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=W.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=W.mul(n.sub,this.inputSizeTensor),n.add=W.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=W.mul(n.add,this.inputSizeTensor);let o=W.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(r=>W.dispose(n[r])),o}normalizeLandmarks(t,n){let o={};o.reshape=W.reshape(t,[-1,7,2]),o.div=W.div(o.reshape,this.inputSizeTensor),o.landmarks=W.add(o.div,this.anchors[n]?this.anchors[n]:0);let r=W.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(s=>W.dispose(o[s])),r}async predict(t,n){var a;let o={};o.resize=W.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=W.div(o.resize,C.tf127),o.image=W.sub(o.div,C.tf1),o.batched=this.model.execute(o.image),o.predictions=W.squeeze(o.batched),o.slice=W.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=W.sigmoid(o.slice),o.scores=W.squeeze(o.sigmoid);let r=await o.scores.data();o.boxes=W.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await W.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((a=n.hand)==null?void 0:a.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let s=await o.nms.array(),A=[];for(let l of s){let c={};c.box=W.slice(o.norm,[l,0],[1,-1]),c.slice=W.slice(o.predictions,[l,5],[1,14]),c.norm=this.normalizeLandmarks(c.slice,l),c.palmLandmarks=W.reshape(c.norm,[-1,2]);let d=await c.box.data(),i=d.slice(0,2),y=d.slice(2,4),x=await c.palmLandmarks.array(),p={startPoint:i,endPoint:y,palmLandmarks:x,confidence:r[l]},f=Dn(p,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);A.push(f),Object.keys(c).forEach(b=>W.dispose(c[b]))}return Object.keys(o).forEach(l=>W.dispose(o[l])),A}};var U0=Z(H());var zA=5,Vn=1.65,Zn=[0,5,9,13,17,1,2],SA=0,jA=2,Xn=0,St=class{constructor(t,n){k(this,"handDetector");k(this,"handPoseModel");k(this,"inputSize");k(this,"storedBoxes");k(this,"skipped");k(this,"detectedHands");var o,r,s;this.handDetector=t,this.handPoseModel=n,this.inputSize=((s=(r=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:r[0].shape)==null?void 0:s[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(A=>A[0]),o=t.map(A=>A[1]),r=[Math.min(...n),Math.min(...o)],s=[Math.max(...n),Math.max(...o)];return{startPoint:r,endPoint:s}}getBoxForPalmLandmarks(t,n){let o=t.map(s=>Q5([...s,1],n)),r=this.calculateLandmarksBoundingBox(o);return wt(Et(r),zA)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=wt(Et(n),Vn);o.palmLandmarks=[];for(let r=0;r[A[0]*(x[0]-this.inputSize/2),A[1]*(x[1]-this.inputSize/2),A[2]*x[2]]),l=J5(o,[0,0]),c=a.map(x=>[...Q5(x,l),x[2]]),d=Bn(r),i=[...W2(n),1],y=[Ze(i,d[0]),Ze(i,d[1])];return c.map(x=>[Math.trunc(x[0]+y[0]),Math.trunc(x[1]+y[1]),Math.trunc(x[2])])}async estimateHands(t,n){let o=!1,r,s=(n.hand.skipTime||0)>g()-Xn,A=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&s&&A&&(r=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(o=!0));let a=[];for(let l=0;l=n.hand.minConfidence/4){let S=U0.reshape(m,[-1,3]),P=await S.array();U0.dispose(m),U0.dispose(S);let I=this.transformRawCoords(P,f,d,p),q=this.getBoxForHandLandmarks(I);this.storedBoxes[l]={...q,confidence:h};let t0={landmarks:I,confidence:h,boxConfidence:c.confidence,fingerConfidence:h,box:{topLeft:q.startPoint,bottomRight:q.endPoint}};a.push(t0)}else this.storedBoxes[l]=null;U0.dispose(m)}else{let d=wt(Et(c),Vn),i={confidence:c.confidence,boxConfidence:c.confidence,fingerConfidence:0,box:{topLeft:d.startPoint,bottomRight:d.endPoint},landmarks:[]};a.push(i)}}return this.storedBoxes=this.storedBoxes.filter(l=>l!==null),this.detectedHands=a.length,a.length>n.hand.maxDetected&&(a.length=n.hand.maxDetected),a}};var qn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},a2,i2,Un;async function _5(e,t){let n=await Un.estimateHands(e,t);if(!n)return[];let o=[];for(let r=0;rn[r].landmarks[i]);let A=n[r].landmarks,a=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(A&&A.length>0){for(let d of A)d[0]a[2]&&(a[2]=d[0]),d[1]>a[3]&&(a[3]=d[1]);a[2]-=a[0],a[3]-=a[1],l=[a[0]/(e.shape[2]||0),a[1]/(e.shape[1]||0),a[2]/(e.shape[2]||0),a[3]/(e.shape[1]||0)]}else a=n[r].box?[Math.trunc(Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.max(0,n[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[r].box.bottomRight[0])-Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[r].box.bottomRight[1])-Math.max(0,n[r].box.topLeft[1]))]:[0,0,0,0],l=[n[r].box.topLeft[0]/(e.shape[2]||0),n[r].box.topLeft[1]/(e.shape[1]||0),(n[r].box.bottomRight[0]-n[r].box.topLeft[0])/(e.shape[2]||0),(n[r].box.bottomRight[1]-n[r].box.topLeft[1])/(e.shape[1]||0)];let c=Pt(A);o.push({id:r,score:Math.round(100*n[r].confidence)/100,boxScore:Math.round(100*n[r].boxConfidence)/100,fingerScore:Math.round(100*n[r].fingerConfidence)/100,label:"hand",box:a,boxRaw:l,keypoints:A,annotations:s,landmarks:c})}return o}async function Yn(e){var n,o;R.initial&&(a2=null,i2=null),!a2||!i2?[a2,i2]=await Promise.all([e.hand.enabled?O((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?O((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&u("cached model:",a2.modelUrl),e.debug&&u("cached model:",i2.modelUrl));let t=a2?new zt(a2):void 0;return t&&i2&&(Un=new St(t,i2)),[a2,i2]}var Q=Z(H());var f0=[null,null],IA=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],Xe=[[0,0],[0,0]],OA=["hand","fist","pinch","point","face","tip","pinchtip"],Jn=4,Qn=1.6,LA=512,CA=1.4,jt=Number.MAX_SAFE_INTEGER,$5=0,ke=[0,0],y0={boxes:[],hands:[]},_n={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function $n(e){var t;if(R.initial&&(f0[0]=null),f0[0])e.debug&&u("cached model:",f0[0].modelUrl);else{J2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),f0[0]=await O((t=e.hand.detector)==null?void 0:t.modelPath);let n=f0[0].executor?Object.values(f0[0].modelSignature.inputs):void 0;Xe[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Xe[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return f0[0]}async function eo(e){var t;if(R.initial&&(f0[1]=null),f0[1])e.debug&&u("cached model:",f0[1].modelUrl);else{f0[1]=await O((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=f0[1].executor?Object.values(f0[1].modelSignature.inputs):void 0;Xe[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Xe[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return f0[1]}async function WA(e,t){let n=[];if(!e||!f0[0])return n;let o={},r=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,LA),A=Math.round(s*r/8)*8;o.resize=Q.image.resizeBilinear(e,[s,A]),o.cast=Q.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await f0[0].executeAsync(o.cast,IA),o.boxes=Q.squeeze(o.rawBoxes,[0,2]),o.scores=Q.squeeze(o.rawScores,[0]);let a=Q.unstack(o.scores,1);Q.dispose(a[Jn]),a.splice(Jn,1),o.filtered=Q.stack(a,1),Q.dispose(a),o.max=Q.max(o.filtered,1),o.argmax=Q.argMax(o.filtered,1);let l=0;o.nms=await Q.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let c=await o.nms.data(),d=await o.max.data(),i=await o.argmax.data();for(let y of Array.from(c)){let x=Q.slice(o.boxes,y,1),p=await x.data();Q.dispose(x);let f=[p[1],p[0],p[3]-p[1],p[2]-p[0]],b=st(f,CA),M=[Math.trunc(f[0]*ke[0]),Math.trunc(f[1]*ke[1]),Math.trunc(f[2]*ke[0]),Math.trunc(f[3]*ke[1])],T=d[y],m=OA[i[y]],h={id:l++,score:T,box:M,boxRaw:b,label:m};n.push(h)}return Object.keys(o).forEach(y=>Q.dispose(o[y])),n.sort((y,x)=>x.score-y.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function e1(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&f0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let r={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];r.crop=Q.image.cropAndResize(e,[s],[0],[Xe[1][0],Xe[1][1]],"bilinear"),r.div=Q.div(r.crop,C.tf255),[r.score,r.keypoints]=f0[1].execute(r.div,["Identity_1","Identity"]);let A=(await r.score.data())[0],a=(100-Math.trunc(100/(1+Math.exp(A))))/100;if(a>=(n.hand.minConfidence||0)){o.fingerScore=a,r.reshaped=Q.reshape(r.keypoints,[-1,3]);let d=(await r.reshaped.array()).map(i=>[i[0]/Xe[1][1],i[1]/Xe[1][0],i[2]||0]).map(i=>[i[0]*t.boxRaw[2],i[1]*t.boxRaw[3],i[2]||0]);o.keypoints=d.map(i=>[ke[0]*(i[0]+t.boxRaw[0]),ke[1]*(i[1]+t.boxRaw[1]),i[2]||0]),o.landmarks=Pt(o.keypoints);for(let i of Object.keys(_n))o.annotations[i]=_n[i].map(y=>o.landmarks&&o.keypoints[y]?o.keypoints[y]:null)}Object.keys(r).forEach(l=>Q.dispose(r[l]))}return o}async function t1(e,t){var r,s;if(!((r=f0[0])!=null&&r.executor)||!((s=f0[1])!=null&&s.executor)||!f0[0].inputs[0].shape||!f0[1].inputs[0].shape)return[];ke=[e.shape[2]||0,e.shape[1]||0],jt++;let n=(t.hand.skipTime||0)>g()-$5,o=jt<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?y0.hands:new Promise(async A=>{let a=3*(t.hand.skipTime||0)>g()-$5,l=jt<3*(t.hand.skipFrames||0);t.skipAllowed&&y0.hands.length===t.hand.maxDetected?y0.hands=await Promise.all(y0.boxes.map(d=>e1(e,d,t))):t.skipAllowed&&a&&l&&y0.hands.length>0?y0.hands=await Promise.all(y0.boxes.map(d=>e1(e,d,t))):(y0.boxes=await WA(e,t),$5=g(),y0.hands=await Promise.all(y0.boxes.map(d=>e1(e,d,t))),jt=0);let c=[...y0.boxes];if(y0.boxes.length=0,t.cacheSensitivity>0)for(let d=0;d.05&&i.box[3]/(e.shape[1]||1)>.05&&y0.hands[d].fingerScore&&y0.hands[d].fingerScore>(t.hand.minConfidence||0)){let y=st(i.box,Qn),x=st(i.boxRaw,Qn);y0.boxes.push({...c[d],box:y,boxRaw:x})}}for(let d=0;d({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var D2={};ze(D2,{connected:()=>It,horizontal:()=>n1,kpt:()=>Nt,relative:()=>r1,vertical:()=>o1});var Nt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],n1=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],o1=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],r1=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],It={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var w=he(),s1=0;function no(e,t){var A,a,l,c,d,i,y,x,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,A0;let n=g();if(!e)return he();let o=Date.now()-e.timestamp,r=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(w.canvas=e.canvas),e.error&&(w.error=e.error),!w.body||e.body.length!==w.body.length)w.body=JSON.parse(JSON.stringify(e.body));else for(let v=0;v((r-1)*w.body[v].box[X]+B)/r),n0=e.body[v].boxRaw.map((B,X)=>((r-1)*w.body[v].boxRaw[X]+B)/r),U=e.body[v].keypoints.map((B,X)=>{var z,ee,we,Ee,T0,P2,M1,P1,k1;return{score:B.score,part:B.part,position:[w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].position[0]||0)+(B.position[0]||0))/r:B.position[0],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].position[1]||0)+(B.position[1]||0))/r:B.position[1],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].position[2]||0)+(B.position[2]||0))/r:B.position[2]],positionRaw:[w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].positionRaw[0]||0)+(B.positionRaw[0]||0))/r:B.positionRaw[0],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].positionRaw[1]||0)+(B.positionRaw[1]||0))/r:B.positionRaw[1],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].positionRaw[2]||0)+(B.positionRaw[2]||0))/r:B.positionRaw[2]],distance:[w.body[v].keypoints[X]?((r-1)*(((z=w.body[v].keypoints[X].distance)==null?void 0:z[0])||0)+(((ee=B.distance)==null?void 0:ee[0])||0))/r:(we=B.distance)==null?void 0:we[0],w.body[v].keypoints[X]?((r-1)*(((Ee=w.body[v].keypoints[X].distance)==null?void 0:Ee[1])||0)+(((T0=B.distance)==null?void 0:T0[1])||0))/r:(P2=B.distance)==null?void 0:P2[1],w.body[v].keypoints[X]?((r-1)*(((M1=w.body[v].keypoints[X].distance)==null?void 0:M1[2])||0)+(((P1=B.distance)==null?void 0:P1[2])||0))/r:(k1=B.distance)==null?void 0:k1[2]]}}),g0={},m0={connected:{}};(A=t.body.modelPath)!=null&&A.includes("efficientpose")?m0=it:(a=t.body.modelPath)!=null&&a.includes("blazepose")?m0=ot:(l=t.body.modelPath)!=null&&l.includes("movenet")&&(m0=D2);for(let[B,X]of Object.entries(m0.connected)){let z=[];for(let ee=0;eeT0.part===X[ee]),Ee=U.find(T0=>T0.part===X[ee+1]);we&&Ee&&z.push([we.position,Ee.position])}g0[B]=z}w.body[v]={...e.body[v],box:V,boxRaw:n0,keypoints:U,annotations:g0}}if(!w.hand||e.hand.length!==w.hand.length)w.hand=JSON.parse(JSON.stringify(e.hand));else for(let v=0;v((r-1)*w.hand[v].box[B]+m0)/r),n0=e.hand[v].boxRaw.map((m0,B)=>((r-1)*w.hand[v].boxRaw[B]+m0)/r);w.hand[v].keypoints.length!==e.hand[v].keypoints.length&&(w.hand[v].keypoints=e.hand[v].keypoints);let U=e.hand[v].keypoints&&e.hand[v].keypoints.length>0?e.hand[v].keypoints.map((m0,B)=>m0.map((X,z)=>((r-1)*(w.hand[v].keypoints[B][z]||1)+(X||0))/r)):[],g0={};if(Object.keys(w.hand[v].annotations).length!==Object.keys(e.hand[v].annotations).length)w.hand[v].annotations=e.hand[v].annotations,g0=w.hand[v].annotations;else if(e.hand[v].annotations)for(let m0 of Object.keys(e.hand[v].annotations))g0[m0]=(i=(d=(c=e.hand[v])==null?void 0:c.annotations)==null?void 0:d[m0])!=null&&i[0]?e.hand[v].annotations[m0].map((B,X)=>B.map((z,ee)=>((r-1)*w.hand[v].annotations[m0][X][ee]+z)/r)):null;w.hand[v]={...e.hand[v],box:V,boxRaw:n0,keypoints:U,annotations:g0}}if(!w.face||e.face.length!==w.face.length)w.face=JSON.parse(JSON.stringify(e.face));else for(let v=0;v((r-1)*w.face[v].box[g0]+U)/r),n0=e.face[v].boxRaw.map((U,g0)=>((r-1)*w.face[v].boxRaw[g0]+U)/r);if(e.face[v].rotation){let U={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};U.matrix=(y=e.face[v].rotation)==null?void 0:y.matrix,U.angle={roll:((r-1)*(((p=(x=w.face[v].rotation)==null?void 0:x.angle)==null?void 0:p.roll)||0)+(((b=(f=e.face[v].rotation)==null?void 0:f.angle)==null?void 0:b.roll)||0))/r,yaw:((r-1)*(((T=(M=w.face[v].rotation)==null?void 0:M.angle)==null?void 0:T.yaw)||0)+(((h=(m=e.face[v].rotation)==null?void 0:m.angle)==null?void 0:h.yaw)||0))/r,pitch:((r-1)*(((P=(S=w.face[v].rotation)==null?void 0:S.angle)==null?void 0:P.pitch)||0)+(((q=(I=e.face[v].rotation)==null?void 0:I.angle)==null?void 0:q.pitch)||0))/r},U.gaze={bearing:((r-1)*(((t0=w.face[v].rotation)==null?void 0:t0.gaze.bearing)||0)+(((G=e.face[v].rotation)==null?void 0:G.gaze.bearing)||0))/r,strength:((r-1)*((($=w.face[v].rotation)==null?void 0:$.gaze.strength)||0)+(((A0=e.face[v].rotation)==null?void 0:A0.gaze.strength)||0))/r},w.face[v]={...e.face[v],rotation:U,box:V,boxRaw:n0}}else w.face[v]={...e.face[v],box:V,boxRaw:n0}}if(!w.object||e.object.length!==w.object.length)w.object=JSON.parse(JSON.stringify(e.object));else for(let v=0;v((r-1)*w.object[v].box[g0]+U)/r),n0=e.object[v].boxRaw.map((U,g0)=>((r-1)*w.object[v].boxRaw[g0]+U)/r);w.object[v]={...e.object[v],box:V,boxRaw:n0}}if(e.persons){let v=e.persons;if(!w.persons||v.length!==w.persons.length)w.persons=JSON.parse(JSON.stringify(v));else for(let V=0;V((r-1)*w.persons[V].box[U]+n0)/r)}e.gesture&&(w.gesture=e.gesture),w.width=e.width,w.height=e.height;let s=g();return s1=R.perfadd?s1+Math.round(s-n):Math.round(s-n),e.performance&&(w.performance={...e.performance,interpolate:s1}),w}var s0=Z(H());var j0;async function A1(e){return!j0||R.initial?j0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",j0.modelUrl),j0}async function oo(e,t){var r;if(j0||(j0=await A1(t)),!(j0!=null&&j0.executor)||!((r=j0==null?void 0:j0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=s0.image.resizeBilinear(e,[j0.inputs[0].shape?j0.inputs[0].shape[1]:0,j0.inputs[0].shape?j0.inputs[0].shape[2]:0],!1),n.norm=s0.div(n.resize,C.tf255),n.res=j0.execute(n.norm),n.squeeze=s0.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=s0.unstack(n.squeeze,2),n.fg=s0.softmax(n.fgRaw),n.mul=s0.mul(n.fg,C.tf255),n.expand=s0.expandDims(n.mul,2),n.output=s0.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=s0.squeeze(e),n.concat=s0.concat([n.input,n.output],-1),o=s0.cast(n.concat,"int32");break;case"alpha":o=s0.cast(n.output,"int32");break;default:o=s0.tensor(0)}return Object.keys(n).forEach(s=>s0.dispose(n[s])),o}var Ot={};ze(Ot,{distance:()=>a1,find:()=>BA,similarity:()=>FA});function a1(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let r=0;r{if(e===0)return 1;let s=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(s,1),0)};function FA(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=a1(e,t,n);return so(o,n.order||2,n.min||0,n.max||1)}function BA(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,r=-1;for(let A=0;AH2,validateModel:()=>Ht});var co=Z(H());var qe=Z(H());var Ao=.005,Y0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function i1(e){for(let t of n1){let n=e.keypoints.findIndex(r=>r.part===t[0]),o=e.keypoints.findIndex(r=>r.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]r&&r.part===t[0]),o=e.keypoints.findIndex(r=>r&&r.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]c&&c.part===t[0]),r=e.keypoints.findIndex(c=>c&&c.part===t[1]),s=e.keypoints.findIndex(c=>c&&c.part===n[0]),A=e.keypoints.findIndex(c=>c&&c.part===n[1]);if(!e.keypoints[s]||!e.keypoints[A])continue;let a=e.keypoints[o]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0])]:[0,0],l=e.keypoints[r]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[r].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[r].position[0])]:[0,0];if(a[0]>a[1]||l[0]>l[1]){let c=e.keypoints[o];e.keypoints[o]=e.keypoints[r],e.keypoints[r]=c}}}function ao(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=qe.pad(e,Y0.padding),n.resize=qe.image.resizeBilinear(n.pad,[t,t]);let o=qe.cast(n.resize,"int32");return Object.keys(n).forEach(A=>qe.dispose(n[A])),o}function lo(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+Y0.padding[2][0]+Y0.padding[2][1])/t[0]-Y0.padding[2][0],o.position[1]*(t[1]+Y0.padding[1][0]+Y0.padding[1][1])/t[1]-Y0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=ve(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var h0,Lt=0,l1=Number.MAX_SAFE_INTEGER,l2={boxes:[],bodies:[],last:0};async function xo(e){var t;return R.initial&&(h0=null),h0?e.debug&&u("cached model:",h0.modelUrl):(J2(["size"],e),h0=await O(e.body.modelPath)),Lt=(h0==null?void 0:h0.executor)&&((t=h0==null?void 0:h0.inputs)==null?void 0:t[0].shape)?h0.inputs[0].shape[2]:0,Lt<64&&(Lt=256),h0}function GA(e,t,n){let o=e[0][0],r=[],s=0;for(let d=0;dt.body.minConfidence){let i=[o[d][1],o[d][0]];r.push({score:Math.round(100*s)/100,part:Nt[d],positionRaw:i,position:[Math.round((n.shape[2]||0)*i[0]),Math.round((n.shape[1]||0)*i[1])]})}s=r.reduce((d,i)=>i.score>d?i.score:d,0);let A=[],a=ve(r.map(d=>d.position),[n.shape[2],n.shape[1]]),l={};for(let[d,i]of Object.entries(It)){let y=[];for(let x=0;xb.part===i[x]),f=r.find(b=>b.part===i[x+1]);p&&f&&p.score>(t.body.minConfidence||0)&&f.score>(t.body.minConfidence||0)&&y.push([p.position,f.position])}l[d]=y}let c={id:0,score:s,box:a.box,boxRaw:a.boxRaw,keypoints:r,annotations:l};return i1(c),A.push(c),A}function VA(e,t,n){let o=[];for(let r=0;rt.body.minConfidence){let a=[];for(let i=0;i<17;i++){let y=s[3*i+2];if(y>t.body.minConfidence){let x=[s[3*i+1],s[3*i+0]];a.push({part:Nt[i],score:Math.round(100*y)/100,positionRaw:x,position:[Math.round((n.shape[2]||0)*x[0]),Math.round((n.shape[1]||0)*x[1])]})}}let l=ve(a.map(i=>i.position),[n.shape[2],n.shape[1]]),c={};for(let[i,y]of Object.entries(It)){let x=[];for(let p=0;pM.part===y[p]),b=a.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&x.push([f.position,b.position])}c[i]=x}let d={id:r,score:A,box:l.box,boxRaw:l.boxRaw,keypoints:[...a],annotations:c};i1(d),o.push(d)}}return o.sort((r,s)=>s.score-r.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function c1(e,t){var r;if(!(h0!=null&&h0.executor)||!((r=h0==null?void 0:h0.inputs)!=null&&r[0].shape))return[];t.skipAllowed||(l2.boxes.length=0),l1++;let n=(t.body.skipTime||0)>g()-l2.last,o=l1<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?l2.bodies:new Promise(async s=>{let A={};l1=0,A.input=io(e,Lt),A.res=h0==null?void 0:h0.execute(A.input),l2.last=g();let a=await A.res.array();l2.bodies=A.res.shape[2]===17?GA(a,t,e):VA(a,t,e);for(let l of l2.bodies)lo(l,[e.shape[2]||1,e.shape[1]||1]),ao(l.keypoints);Object.keys(A).forEach(l=>co.dispose(A[l])),s(l2.bodies)})}var w0=Z(H());var Ae,Ct=[],fo=0,x1=Number.MAX_SAFE_INTEGER,Dt=0,Wt=2.5;async function mo(e){if(!Ae||R.initial){Ae=await O(e.object.modelPath);let t=Ae!=null&&Ae.executor?Object.values(Ae.modelSignature.inputs):void 0;Dt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&u("cached model:",Ae.modelUrl);return Ae}async function ZA(e,t,n){var c,d;let o=0,r=[],s=Dt;for(let i of[1,2,4]){let y=i*13,x=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)===d2.length)),p=await x.array(),f=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)(n.object.minConfidence||0)&&h!==61){let P=(.5+Math.trunc(m%y))/y,I=(.5+Math.trunc(m/y))/y,q=T[m].map(U=>U*(y/i/s)),[t0,G]=[P-Wt/i*q[0],I-Wt/i*q[1]],[$,A0]=[P+Wt/i*q[2]-t0,I+Wt/i*q[3]-G],v=[t0,G,$,A0];v=v.map(U=>Math.max(0,Math.min(U,1)));let V=[v[0]*t[0],v[1]*t[1],v[2]*t[0],v[3]*t[1]],n0={id:o++,score:Math.round(100*S)/100,class:h+1,label:d2[h].label,box:V.map(U=>Math.trunc(U)),boxRaw:v};r.push(n0)}}w0.dispose([x,f,b,M])}let A=r.map(i=>[i.boxRaw[1],i.boxRaw[0],i.boxRaw[3],i.boxRaw[2]]),a=r.map(i=>i.score),l=[];if(A&&A.length>0){let i=await w0.image.nonMaxSuppressionAsync(A,a,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);l=Array.from(await i.data()),w0.dispose(i)}return r=r.filter((i,y)=>l.includes(y)).sort((i,y)=>y.score-i.score),r}async function d1(e,t){if(!(Ae!=null&&Ae.executor))return[];let n=(t.object.skipTime||0)>g()-fo,o=x1<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&Ct.length>0?(x1++,Ct):(x1=0,!R.kernels.includes("mod")||!R.kernels.includes("sparsetodense")?Ct:new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=w0.image.resizeBilinear(e,[Dt,Dt],!1),a=w0.div(A,C.tf255),l=w0.transpose(a,[0,3,1,2]),c;t.object.enabled&&(c=Ae.execute(l)),fo=g();let d=await ZA(c,s,t);Ct=d,w0.dispose([A,a,l,...c]),r(d)}))}var D0=Z(H());var B2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],XA=B2.length,F2=B2.reduce((e,t,n)=>(e[t]=n,e),{}),qA=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Li=qA.map(([e,t])=>[F2[e],F2[t]]),uo=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function ho(e){let t=e.reduce(({maxX:n,maxY:o,minX:r,minY:s},{position:{x:A,y:a}})=>({maxX:Math.max(n,A),maxY:Math.max(o,a),minX:Math.min(r,A),minY:Math.min(s,a)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function bo(e,[t,n],[o,r]){let s=t/o,A=n/r,a=(c,d)=>({id:d,score:c.score,boxRaw:[c.box[0]/r,c.box[1]/o,c.box[2]/r,c.box[3]/o],box:[Math.trunc(c.box[0]*A),Math.trunc(c.box[1]*s),Math.trunc(c.box[2]*A),Math.trunc(c.box[3]*s)],keypoints:c.keypoints.map(({score:i,part:y,position:x})=>({score:i,part:y,position:[Math.trunc(x.x*A),Math.trunc(x.y*s)],positionRaw:[x.x/o,x.y/o]})),annotations:{}});return e.map((c,d)=>a(c,d))}var Ft=class{constructor(t,n){k(this,"priorityQueue");k(this,"numberOfElements");k(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function go(e,t,n,o){let r=n-e,s=o-t;return r*r+s*s}function p1(e,t){return{x:e.x+t.x,y:e.y+t.y}}var K0,YA=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Bt=1,R2=16,KA=50**2;function To(e,t,n,o,r,s,A=2){let a=M=>({y:s.get(M.y,M.x,e),x:s.get(M.y,M.x,s.shape[2]/2+e)}),l=(M,T,m)=>({y:m1(Math.round(M.y/R2),0,T-1),x:m1(Math.round(M.x/R2),0,m-1)}),[c,d]=o.shape,i=l(t.position,c,d),y=a(i),p=p1(t.position,y);for(let M=0;M[F2[y],F2[x]]),A=s.map(([,y])=>y),a=s.map(([y])=>y),l=t.shape[2],c=A.length,d=new Array(l),i=f1(e.part,R2,n);d[e.part.id]={score:e.score,part:B2[e.part.id],position:i};for(let y=c-1;y>=0;--y){let x=A[y],p=a[y];d[x]&&!d[p]&&(d[p]=To(y,d[x],p,t,n,r))}for(let y=0;yt){a=!1;break}if(!a)break}return a}function _A(e,t){let[n,o,r]=t.shape,s=new Ft(n*o*r,({score:A})=>A);for(let A=0;A{var A;let s=(A=r[o])==null?void 0:A.position;return s?go(n,t,s.y,s.x)<=KA:!1})}function $A(e,t){return t.reduce((o,{position:r,score:s},A)=>(vo(e,r,A)||(o+=s),o),0)/t.length}function ea(e,t,n,o,r,s){let A=[],a=_A(s,t);for(;A.lengthx.score>s);let i=$A(A,d),y=ho(d);i>s&&A.push({keypoints:d,box:y,score:Math.round(100*i)/100})}return A}async function u1(e,t){if(!(K0!=null&&K0.executor))return[];let n=D0.tidy(()=>{if(!K0.inputs[0].shape)return[];let A=D0.image.resizeBilinear(e,[K0.inputs[0].shape[2],K0.inputs[0].shape[1]]),a=D0.sub(D0.div(D0.cast(A,"float32"),127.5),1),c=K0.execute(a,YA).map(d=>D0.squeeze(d,[0]));return c[1]=D0.sigmoid(c[1]),c}),o=await Promise.all(n.map(A=>A.buffer()));for(let A of n)D0.dispose(A);let r=ea(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return K0.inputs[0].shape?bo(r,[e.shape[1],e.shape[2]],[K0.inputs[0].shape[2],K0.inputs[0].shape[1]]):[]}async function Ro(e){return!K0||R.initial?K0=await O(e.body.modelPath):e.debug&&u("cached model:",K0.modelUrl),K0}var F=Z(H());var be,ta=["fgr","pha","r1o","r2o","r3o","r4o"],b0={},b1=0;function ko(e){F.dispose([b0.r1i,b0.r2i,b0.r3i,b0.r4i,b0.downsample_ratio]),b0.r1i=F.tensor(0),b0.r2i=F.tensor(0),b0.r3i=F.tensor(0),b0.r4i=F.tensor(0),b1=e.segmentation.ratio||.5,b0.downsample_ratio=F.tensor(b1)}async function g1(e){return!be||R.initial?be=await O(e.segmentation.modelPath):e.debug&&u("cached model:",be.modelUrl),ko(e),be}var Po=e=>F.tidy(()=>{let t=F.squeeze(e,[0]),n=F.mul(t,C.tf255);return F.cast(n,"int32")});function h1(e,t){let n=e?Po(e):F.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?Po(t):F.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),r=F.concat([n,o],-1);return F.dispose([n,o]),r}function na(e){return F.tidy(()=>{let t={};return t.unstack=F.unstack(e,-1),t.concat=F.concat(t.unstack,1),t.split=F.split(t.concat,4,1),t.stack=F.concat(t.split,2),t.squeeze=F.squeeze(t.stack,[0]),t.expand=F.expandDims(t.squeeze,-1),t.add=F.add(t.expand,1),t.mul=F.mul(t.add,127.5),t.cast=F.cast(t.mul,"int32"),t.tile=F.tile(t.cast,[1,1,3]),t.alpha=F.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),F.concat([t.tile,t.alpha],-1)})}async function wo(e,t){if(be||(be=await g1(t)),!(be!=null&&be.executor))return null;b0.src=F.div(e,255),b1!==t.segmentation.ratio&&ko(t);let[n,o,r,s,A,a]=await be.executeAsync(b0,ta),l;switch(t.segmentation.mode||"default"){case"default":l=h1(n,o);break;case"alpha":l=h1(null,o);break;case"foreground":l=h1(n,null);break;case"state":l=na(r);break;default:l=F.tensor(0)}return F.dispose([b0.src,n,o,b0.r1i,b0.r2i,b0.r3i,b0.r4i]),[b0.r1i,b0.r2i,b0.r3i,b0.r4i]=[r,s,A,a],l}var k0=Z(H());var N0;async function T1(e){return!N0||R.initial?N0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",N0.modelUrl),N0}async function zo(e,t){var r;if(N0||(N0=await T1(t)),!(N0!=null&&N0.executor)||!((r=N0==null?void 0:N0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=k0.image.resizeBilinear(e,[N0.inputs[0].shape?N0.inputs[0].shape[1]:0,N0.inputs[0].shape?N0.inputs[0].shape[2]:0],!1),n.norm=k0.div(n.resize,C.tf255),n.res=N0.execute(n.norm),n.squeeze=k0.squeeze(n.res,[0]),n.alpha=k0.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=k0.mul(n.alpha,C.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=k0.squeeze(e),n.concat=k0.concat([n.input,n.mul],-1),o=k0.cast(n.concat,"int32");break;case"alpha":o=k0.cast(n.mul,"int32");break;default:o=k0.tensor(0)}return Object.keys(n).forEach(s=>k0.dispose(n[s])),o}function Ht(e,t,n){var c,d;if(!t||!((c=e==null?void 0:e.config)!=null&&c.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],r=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],s=[],A=[],a=t.modelUrl,l=t.executor;if((d=l==null?void 0:l.graph)!=null&&d.nodes)for(let i of Object.values(l.graph.nodes)){let y=i.op.toLowerCase();s.includes(y)||s.push(y)}else!l&&e.config.debug&&u("model not loaded",n);for(let i of s)!o.includes(i)&&!r.includes(i)&&!e.env.kernels.includes(i)&&!e.env.kernels.includes(i.replace("_",""))&&!e.env.kernels.includes(i.replace("native",""))&&!e.env.kernels.includes(i.replace("v2",""))&&A.push(i);return e.config.debug&&A.length>0&&u("model validation failed:",n,A),A.length>0?{name:n,missing:A,ops:s,url:a}:null}var H2=class{constructor(t){k(this,"instance");k(this,"models",{});this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let s of Object.values(E0))t+=s.sizeFromManifest,n+=s.sizeLoadedWeights,o+=s.sizeDesired;let r=o>0?n/o:0;return{numLoadedModels:Object.values(E0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:r,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(E0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(t){var o,r,s,A,a,l,c,d,i,y,x,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,A0,v;R.initial&&this.reset(),t&&(this.instance=t);let n={};n.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?g3(this.instance.config):null,n.antispoof=this.instance.config.face.enabled&&((o=this.instance.config.face.antispoof)==null?void 0:o.enabled)&&!this.models.antispoof?X3(this.instance.config):null,n.liveness=this.instance.config.face.enabled&&((r=this.instance.config.face.liveness)==null?void 0:r.enabled)&&!this.models.liveness?K3(this.instance.config):null,n.faceres=this.instance.config.face.enabled&&((s=this.instance.config.face.description)==null?void 0:s.enabled)&&!this.models.faceres?B3(this.instance.config):null,n.emotion=this.instance.config.face.enabled&&((A=this.instance.config.face.emotion)==null?void 0:A.enabled)&&!this.models.emotion?C3(this.instance.config):null,n.iris=this.instance.config.face.enabled&&((a=this.instance.config.face.iris)==null?void 0:a.enabled)&&!((l=this.instance.config.face.attention)!=null&&l.enabled)&&!this.models.iris?k3(this.instance.config):null,n.facemesh=this.instance.config.face.enabled&&((c=this.instance.config.face.mesh)==null?void 0:c.enabled)&&!this.models.facemesh?j3(this.instance.config):null,n.gear=this.instance.config.face.enabled&&((d=this.instance.config.face.gear)==null?void 0:d.enabled)&&!this.models.gear?$3(this.instance.config):null,n.ssrnetage=this.instance.config.face.enabled&&((i=this.instance.config.face.ssrnet)==null?void 0:i.enabled)&&!this.models.ssrnetage?on(this.instance.config):null,n.ssrnetgender=this.instance.config.face.enabled&&((y=this.instance.config.face.ssrnet)==null?void 0:y.enabled)&&!this.models.ssrnetgender?an(this.instance.config):null,n.mobilefacenet=this.instance.config.face.enabled&&((x=this.instance.config.face.mobilefacenet)==null?void 0:x.enabled)&&!this.models.mobilefacenet?yn(this.instance.config):null,n.insightface=this.instance.config.face.enabled&&((p=this.instance.config.face.insightface)==null?void 0:p.enabled)&&!this.models.insightface?hn(this.instance.config):null,n.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((f=this.instance.config.body.modelPath)==null?void 0:f.includes("blazepose"))?n3(this.instance.config):null,n.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?t3(this.instance.config):null,n.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((b=this.instance.config.body.modelPath)==null?void 0:b.includes("efficientpose"))?i3(this.instance.config):null,n.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((M=this.instance.config.body.modelPath)==null?void 0:M.includes("movenet"))?xo(this.instance.config):null,n.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((T=this.instance.config.body.modelPath)==null?void 0:T.includes("posenet"))?Ro(this.instance.config):null,n.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((h=(m=this.instance.config.hand.detector)==null?void 0:m.modelPath)==null?void 0:h.includes("handtrack"))?$n(this.instance.config):null,n.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((P=(S=this.instance.config.hand.detector)==null?void 0:S.modelPath)==null?void 0:P.includes("handtrack"))?eo(this.instance.config):null,(q=(I=this.instance.config.hand.detector)==null?void 0:I.modelPath)!=null&&q.includes("handdetect")&&([n.handpose,n.handskeleton]=this.models.handpose?[null,null]:await Yn(this.instance.config)),n.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((t0=this.instance.config.object.modelPath)==null?void 0:t0.includes("centernet"))?s3(this.instance.config):null,n.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((G=this.instance.config.object.modelPath)==null?void 0:G.includes("nanodet"))?mo(this.instance.config):null,n.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&(($=this.instance.config.segmentation.modelPath)==null?void 0:$.includes("selfie"))?T1(this.instance.config):null,n.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&((A0=this.instance.config.segmentation.modelPath)==null?void 0:A0.includes("meet"))?A1(this.instance.config):null,n.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((v=this.instance.config.segmentation.modelPath)==null?void 0:v.includes("rvm"))?g1(this.instance.config):null;for(let[V,n0]of Object.entries(n))n0!=null&&n0.then&&n0.then(U=>this.models[V]=U);await Promise.all(Object.values(n))}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(E0).find(r=>r.startsWith(n.name));!o||(n.size=E0[o].sizeLoadedWeights,n.url=E0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let r=Ht(this.instance,o,n);r&&t.push(r)}return t}};function jo(e,t,n,o,r){var a,l,c,d,i,y;let s=0,A=[];for(let x of e){let p={id:s++,face:x,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let h of t)x.box[0]>h.box[0]&&x.box[0]h.box[1]&&x.box[1]+x.box[3]p.body.box[0]&&h.box[0]+h.box[2]p.body.box[1]&&h.box[1]+h.box[3]p.body.box[0]&&h.box[1]+h.box[3]>p.body.box[1]&&h.box[1]+h.box[3]{h&&h.length===4&&(f.push(h[0],h[0]+h[2]),b.push(h[1],h[1]+h[3]))};M(p.face.box),M((d=p.body)==null?void 0:d.box),M((i=p.hands.left)==null?void 0:i.box),M((y=p.hands.right)==null?void 0:y.box);let T=Math.min(...f),m=Math.min(...b);p.box=[T,m,Math.max(...f)-T,Math.max(...b)-m],(r==null?void 0:r[1])&&(r==null?void 0:r[2])&&(p.boxRaw=[p.box[0]/r[2],p.box[1]/r[1],p.box[2]/r[2],p.box[3]/r[1]]),A.push(p)}return A}var x0=Z(H());var Gt=` + gaze: [gaze]\xB0`,body:"body [score]%",bodyPart:"[label] [score]%",object:"[label] [score]%",hand:"[label] [score]%",finger:"[label]",gesture:"[where] [who]: [what]"};var s5=0;function Fs(e,t,n){let o=a0(x0,n);if(!t||!e)return;let r=Q0(e);if(!!r){r.lineJoin="round",r.font=o.font;for(let s=0;si5,kpt:()=>a5});var a5=["nose","leftEyeInside","leftEye","leftEyeOutside","rightEyeInside","rightEye","rightEyeOutside","leftEar","rightEar","leftMouth","rightMouth","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftPinky","rightPinky","leftIndex","rightIndex","leftThumb","rightThumb","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle","leftHeel","rightHeel","leftFoot","rightFoot","bodyCenter","bodyTop","leftPalm","leftHand","rightPalm","rightHand"],i5={shoulders:["leftShoulder","rightShoulder"],hips:["rightHip","leftHip"],mouth:["leftMouth","rightMouth"],leftLegUpper:["leftHip","leftKnee"],leftLegLower:["leftKnee","leftAnkle"],leftFoot:["leftAnkle","leftHeel","leftFoot"],leftTorso:["leftShoulder","leftHip"],leftArmUpper:["leftShoulder","leftElbow"],leftArmLower:["leftElbow","leftWrist"],leftHand:["leftWrist","leftPalm"],leftHandPinky:["leftPalm","leftPinky"],leftHandIndex:["leftPalm","leftIndex"],leftHandThumb:["leftPalm","leftThumb"],leftEyeOutline:["leftEyeInside","leftEyeOutside"],rightLegUpper:["rightHip","rightKnee"],rightLegLower:["rightKnee","rightAnkle"],rightFoot:["rightAnkle","rightHeel","rightFoot"],rightTorso:["rightShoulder","rightHip"],rightArmUpper:["rightShoulder","rightElbow"],rightArmLower:["rightElbow","rightWrist"],rightHand:["rightWrist","rightPalm"],rightHandPinky:["rightPalm","rightPinky"],rightHandIndex:["rightPalm","rightIndex"],rightHandThumb:["rightPalm","rightThumb"],rightEyeOutline:["rightEyeInside","rightEyeOutside"]};var D=Z(H());var _0,t2=224,Y1,Gs=5,rt=[8,16,32,32,32];function Vs(){let e=[],t=0;for(;tn.x)),y:D.tensor1d(e.map(n=>n.y))}}async function K1(e){if(R.initial&&(_0=null),!_0&&e.body.detector&&e.body.detector.modelPath){_0=await O(e.body.detector.modelPath);let t=_0!=null&&_0.executor?Object.values(_0.modelSignature.inputs):void 0;t2=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}else e.debug&&_0&&u("cached model:",_0.modelUrl);return Vs(),_0}var U1=[5,5];function Zs(e,t){return D.tidy(()=>{let n=D.split(e,12,1),o=D.squeeze(n[0]),r=D.squeeze(n[1]),s=D.squeeze(n[2]),A=D.squeeze(n[3]);o=D.add(D.div(o,t2),t.x),r=D.add(D.div(r,t2),t.y),s=D.mul(D.div(s,t2),U1[0]),A=D.mul(D.div(A,t2),U1[1]);let a=D.sub(o,D.div(s,2)),l=D.sub(r,D.div(A,2)),c=D.add(a,s),x=D.add(l,A);return D.stack([a,l,c,x],1)})}async function Xs(e,t,n,o){var c,x;let r=[],s={};s.boxes=Zs(e,Y1),s.scores=D.sigmoid(t),s.nms=await D.image.nonMaxSuppressionAsync(s.boxes,s.scores,1,((c=n.body.detector)==null?void 0:c.minConfidence)||.1,((x=n.body.detector)==null?void 0:x.iouThreshold)||.1);let A=await s.nms.data(),a=await s.scores.data(),l=await s.boxes.array();for(let i of Array.from(A)){let y=a[i],d=l[i],p=[Math.round(d[0]*o[0]),Math.round(d[1]*o[1]),Math.round(d[2]*o[0]),Math.round(d[3]*o[1])],f={score:y,boxRaw:d,box:p};r.push(f)}return Object.keys(s).forEach(i=>D.dispose(s[i])),r}async function J1(e,t,n){let o={};o.res=_0==null?void 0:_0.execute(e,["Identity"]),o.logitsRaw=D.slice(o.res,[0,0,0],[1,-1,1]),o.boxesRaw=D.slice(o.res,[0,0,1],[1,-1,-1]),o.logits=D.squeeze(o.logitsRaw),o.boxes=D.squeeze(o.boxesRaw);let r=await Xs(o.boxes,o.logits,t,n);return Object.keys(o).forEach(s=>D.dispose(o[s])),r}function ve(e,t=[1,1]){let n=[e.map(a=>a[0]),e.map(a=>a[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[o[0],o[1],r[0]-o[0],r[1]-o[1]],A=[s[0]/t[0],s[1]/t[1],s[2]/t[0],s[3]/t[1]];return{box:s,boxRaw:A}}function Q1(e,t=[1,1]){let n=[e.map(c=>c[0]),e.map(c=>c[1])],o=[Math.min(...n[0]),Math.min(...n[1])],r=[Math.max(...n[0]),Math.max(...n[1])],s=[(o[0]+r[0])/2,(o[1]+r[1])/2],A=Math.max(s[0]-o[0],s[1]-o[1],-s[0]+r[0],-s[1]+r[1]),a=[Math.trunc(s[0]-A),Math.trunc(s[1]-A),Math.trunc(2*A),Math.trunc(2*A)],l=[a[0]/t[0],a[1]/t[1],a[2]/t[0],a[3]/t[1]];return{box:a,boxRaw:l}}function st(e,t){let n=[e[2]*t,e[3]*t];return[e[0]-(n[0]-e[2])/2,e[1]-(n[1]-e[3])/2,n[0],n[1]]}var F0,c5=256,l5=Number.MAX_SAFE_INTEGER,qs={landmarks:["ld_3d","activation_segmentation","activation_heatmap","world_3d","output_poseflag"],detector:[]},at=[],Oe=[[0,0],[0,0],[0,0],[0,0]],_1=0,$1=e=>1-1/(1+Math.exp(e)),t3=e=>K1(e);async function n3(e){if(R.initial&&(F0=null),F0)e.debug&&u("cached model:",F0.modelUrl);else{F0=await O(e.body.modelPath);let t=F0!=null&&F0.executor?Object.values(F0.modelSignature.inputs):void 0;c5=Array.isArray(t)?parseInt(t[0].tensorShape.dim[1].size):0}return F0}function e3(e,t,n){var s,A;let o={};if(!((s=e==null?void 0:e.shape)!=null&&s[1])||!((A=e==null?void 0:e.shape)!=null&&A[2]))return e;let r;if(n&&(o.cropped=B0.image.cropAndResize(e,[n],[0],[e.shape[1],e.shape[2]])),e.shape[1]!==e.shape[2]){let a=[e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],l=[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0];Oe=[[0,0],a,l,[0,0]],o.pad=B0.pad(o.cropped||e,Oe),o.resize=B0.image.resizeBilinear(o.pad,[t,t]),r=B0.div(o.resize,C.tf255)}else e.shape[1]!==t?(o.resize=B0.image.resizeBilinear(o.cropped||e,[t,t]),r=B0.div(o.resize,C.tf255)):r=B0.div(o.cropped||e,C.tf255);return Object.keys(o).forEach(a=>B0.dispose(o[a])),r}function Us(e,t,n){for(let o of e)o.position=[Math.trunc(o.position[0]*(t[0]+Oe[2][0]+Oe[2][1])/t[0]-Oe[2][0]),Math.trunc(o.position[1]*(t[1]+Oe[1][0]+Oe[1][1])/t[1]-Oe[1][0]),o.position[2]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1],2*o.position[2]/(t[0]+t[1])];if(n){let o=n[2]-n[0],r=n[3]-n[1];for(let s of e)s.positionRaw=[s.positionRaw[0]/r+n[1],s.positionRaw[1]/o+n[0],s.positionRaw[2]],s.position=[Math.trunc(s.positionRaw[0]*t[0]),Math.trunc(s.positionRaw[1]*t[1]),s.positionRaw[2]]}return e}function Ys(e){let t=e.find(a=>a.part==="leftPalm"),n=e.find(a=>a.part==="leftWrist"),o=e.find(a=>a.part==="leftIndex");t.position[2]=((n.position[2]||0)+(o.position[2]||0))/2;let r=e.find(a=>a.part==="rightPalm"),s=e.find(a=>a.part==="rightWrist"),A=e.find(a=>a.part==="rightIndex");r.position[2]=((s.position[2]||0)+(A.position[2]||0))/2}async function Ks(e,t,n){if(!(F0!=null&&F0.executor))return null;let o={};[o.ld,o.segmentation,o.heatmap,o.world,o.poseflag]=F0==null?void 0:F0.execute(e,qs.landmarks);let r=(await o.poseflag.data())[0],s=await o.ld.data(),A=await o.world.data();Object.keys(o).forEach(p=>B0.dispose(o[p]));let a=[],l=5;for(let p=0;pp.position),i=ve(x,[n[0],n[1]]),y={};for(let[p,f]of Object.entries(i5)){let b=[];for(let M=0;Mh.part===f[M]),m=c.find(h=>h.part===f[M+1]);T&&m&&b.push([T.position,m.position])}y[p]=b}return{id:0,score:Math.trunc(100*r)/100,box:i.box,boxRaw:i.boxRaw,keypoints:c,annotations:y}}async function d5(e,t){var s,A,a;let n=[e.shape[2]||0,e.shape[1]||0],o=(t.body.skipTime||0)>g()-_1,r=l5<(t.body.skipFrames||0);if(t.skipAllowed&&o&&r&&at!==null)l5++;else{let l=[];if((A=(s=t.body)==null?void 0:s.detector)!=null&&A.enabled){let c=e3(e,224);l=await J1(c,t,n),B0.dispose(c)}else l=[{box:[0,0,0,0],boxRaw:[0,0,1,1],score:0}];for(let c=0;cL0.dispose(o[c])),r}async function f5(e,t){if(!(H0!=null&&H0.executor))return[];let n=(t.object.skipTime||0)>g()-r3,o=y5<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&x5.length>0?(y5++,x5):(y5=0,new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=L0.image.resizeBilinear(e,[n2,n2]),a=t.object.enabled?H0==null?void 0:H0.execute(A,["tower_0/detections"]):null;r3=g(),L0.dispose(A);let l=await Js(a,s,t);x5=l,r(l)}))}var J=Z(H());var it={};ze(it,{connected:()=>p5,kpt:()=>m5});var m5=["head","neck","rightShoulder","rightElbow","rightWrist","chest","leftShoulder","leftElbow","leftWrist","bodyCenter","rightHip","rightKnee","rightAnkle","leftHip","leftKnee","leftAnkle"],p5={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var i0,a3=0,C0={id:0,keypoints:[],box:[0,0,0,0],boxRaw:[0,0,0,0],score:0,annotations:{}},u5=Number.MAX_SAFE_INTEGER;async function i3(e){return R.initial&&(i0=null),i0?e.debug&&u("cached model:",i0.modelUrl):i0=await O(e.body.modelPath),i0}async function Qs(e,t){let[n,o]=e.shape,r=J.reshape(e,[o*n]),s=J.max(r,0),A=(await s.data())[0];if(A>t){let a=J.argMax(r,0),l=J.mod(a,n),c=(await l.data())[0],x=J.div(a,n),i=(await x.data())[0];return J.dispose([r,s,a,l,x]),[c,i,A]}return J.dispose([r,s]),[0,0,A]}async function h5(e,t){if(!(i0!=null&&i0.executor)||!(i0!=null&&i0.inputs[0].shape))return[];let n=(t.body.skipTime||0)>g()-a3,o=u5<(t.body.skipFrames||0);return t.skipAllowed&&n&&o&&Object.keys(C0.keypoints).length>0?(u5++,[C0]):(u5=0,new Promise(async r=>{let s=J.tidy(()=>{var p,f;let i=J.image.resizeBilinear(e,[((p=i0==null?void 0:i0.inputs[0].shape)==null?void 0:p[2])||0,((f=i0==null?void 0:i0.inputs[0].shape)==null?void 0:f[1])||0],!1),y=J.mul(i,C.tf2);return J.sub(y,C.tf1)}),A;if(t.body.enabled&&(A=i0==null?void 0:i0.execute(s)),a3=g(),J.dispose(s),A){C0.keypoints.length=0;let i=J.squeeze(A);J.dispose(A);let y=J.unstack(i,2);J.dispose(i);for(let d=0;d(t.body.minConfidence||0)&&C0.keypoints.push({score:Math.round(100*b)/100,part:m5[d],positionRaw:[p/i0.inputs[0].shape[2],f/i0.inputs[0].shape[1]],position:[Math.round(e.shape[2]*p/i0.inputs[0].shape[2]),Math.round(e.shape[1]*f/i0.inputs[0].shape[1])]})}y.forEach(d=>J.dispose(d))}C0.score=C0.keypoints.reduce((i,y)=>y.score>i?y.score:i,0);let a=C0.keypoints.map(i=>i.position[0]),l=C0.keypoints.map(i=>i.position[1]);C0.box=[Math.min(...a),Math.min(...l),Math.max(...a)-Math.min(...a),Math.max(...l)-Math.min(...l)];let c=C0.keypoints.map(i=>i.positionRaw[0]),x=C0.keypoints.map(i=>i.positionRaw[1]);C0.boxRaw=[Math.min(...c),Math.min(...x),Math.max(...c)-Math.min(...c),Math.max(...x)-Math.min(...x)];for(let[i,y]of Object.entries(p5)){let d=[];for(let p=0;pM.part===y[p]),b=C0.keypoints.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&d.push([f.position,b.position])}C0.annotations[i]=d}r([C0])}))}var l0=Z(H());var We=Z(H());var L=Z(H());var Re=Z(H());var y2=e=>[Math.abs(e.endPoint[0]-e.startPoint[0]),Math.abs(e.endPoint[1]-e.startPoint[1])],lt=e=>[e.startPoint[0]+(e.endPoint[0]-e.startPoint[0])/2,e.startPoint[1]+(e.endPoint[1]-e.startPoint[1])/2,1],ct=(e,t)=>e?[Math.trunc(Math.max(0,e.startPoint[0])),Math.trunc(Math.max(0,e.startPoint[1])),Math.trunc(Math.min(t.shape[2]||0,e.endPoint[0])-Math.max(0,e.startPoint[0])),Math.trunc(Math.min(t.shape[1]||0,e.endPoint[1])-Math.max(0,e.startPoint[1]))]:[0,0,0,0],dt=(e,t)=>e?[e.startPoint[0]/(t.shape[2]||0),e.startPoint[1]/(t.shape[1]||0),(e.endPoint[0]-e.startPoint[0])/(t.shape[2]||0),(e.endPoint[1]-e.startPoint[1])/(t.shape[1]||0)]:[0,0,0,0],x3=(e,t)=>{let n=[e.startPoint[0]*t[0],e.startPoint[1]*t[1]],o=[e.endPoint[0]*t[0],e.endPoint[1]*t[1]];return{startPoint:n,endPoint:o,landmarks:e.landmarks,confidence:e.confidence}},b5=(e,t,n)=>{let o=t.shape[1],r=t.shape[2],s=[e.startPoint[1]/o,e.startPoint[0]/r,e.endPoint[1]/o,e.endPoint[0]/r],A=Re.image.cropAndResize(t,[s],[0],n),a=Re.div(A,C.tf255);return Re.dispose(A),a},xt=(e,t)=>{let n=lt(e),o=y2(e),r=[t*o[0]/2,t*o[1]/2];return{startPoint:[n[0]-r[0],n[1]-r[1]],endPoint:[n[0]+r[0],n[1]+r[1]],landmarks:e.landmarks,confidence:e.confidence}},yt=e=>{let t=lt(e),n=y2(e),o=Math.max(...n)/2;return{startPoint:[Math.round(t[0]-o),Math.round(t[1]-o)],endPoint:[Math.round(t[0]+o),Math.round(t[1]+o)],landmarks:e.landmarks,confidence:e.confidence}},y3=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return{startPoint:[Math.min(...t),Math.min(...n)],endPoint:[Math.max(...t),Math.max(...n)],landmarks:e}},g5=[[1,0,0],[0,1,0],[0,0,1]],_s=e=>e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI)),$s=(e,t)=>_s(Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]));var c3=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]],o2=(e,t)=>{let n=0;for(let o=0;o{let n=[];for(let o=0;o{let n=[],o=e.length;for(let r=0;r{let n=Math.cos(e),o=Math.sin(e),r=[[n,-o,0],[o,n,0],[0,0,1]],s=c3(t[0],t[1]),A=d3(s,r),a=c3(-t[0],-t[1]);return d3(A,a)},tA=e=>{let t=[[e[0][0],e[1][0]],[e[0][1],e[1][1]]],n=[e[0][2],e[1][2]],o=[-o2(t[0],n),-o2(t[1],n)];return[t[0].concat(o[0]),t[1].concat(o[1]),[0,0,1]]},nA=(e,t)=>[o2(e,t[0]),o2(e,t[1])];function m3(e){let t=e===192?{strides:[4],anchors:[1]}:{strides:[e/16,e/8],anchors:[2,6]},n=[];for(let o=0;o[s[0]/r*(d[0]-r/2),s[1]/r*(d[1]-r/2),d[2]||0]),a=n&&n!==0&&Math.abs(n)>.2,l=a?f3(n,[0,0]):g5,c=a?A.map(d=>[...nA(d,l),d[2]]):A,x=a?tA(o):g5,i=lt(t),y=[o2(i,x[0]),o2(i,x[1])];return c.map(d=>[Math.trunc(d[0]+y[0]),Math.trunc(d[1]+y[1]),Math.trunc(d[2]||0)])}function u3(e,t,n,o){let r=t.landmarks.length>=n5.count?n5.symmetryLine:Qe.symmetryLine,s=0,A=g5,a;if(e&&R.kernels.includes("rotatewithoffset"))if(s=$s(t.landmarks[r[0]],t.landmarks[r[1]]),s&&s!==0&&Math.abs(s)>.2){let c=lt(t),x=[c[0]/n.shape[2],c[1]/n.shape[1]],i=Re.image.rotateWithOffset(n,s,0,[x[0],x[1]]);A=f3(-s,c),a=b5(t,i,[o,o]),Re.dispose(i)}else a=b5(t,n,[o,o]);else a=b5(t,n,[o,o]);return[s,A,a]}var oA=e=>{let t=e.map(o=>o[0]),n=e.map(o=>o[1]);return[Math.min(...t)+(Math.max(...t)-Math.min(...t))/2,Math.min(...n)+(Math.max(...n)-Math.min(...n))/2]},h3=(e,t)=>{let n=oA(e),o=y2(t);return{startPoint:[n[0]-o[0]/2,n[1]-o[1]/2],endPoint:[n[0]+o[0]/2,n[1]+o[1]/2]}};var b3=6,rA=1.4,ie,v5=null,Le=0,f2=null,m2=()=>Le;async function g3(e){var t;return R.initial&&(ie=null),ie?e.debug&&u("cached model:",ie.modelUrl):ie=await O((t=e.face.detector)==null?void 0:t.modelPath),Le=ie.executor&&ie.inputs[0].shape?ie.inputs[0].shape[2]:256,f2=L.scalar(Le,"int32"),v5=L.tensor2d(m3(Le)),ie}function sA(e){if(!v5||!f2)return L.zeros([0,0]);let t={};t.boxStarts=L.slice(e,[0,1],[-1,2]),t.centers=L.add(t.boxStarts,v5),t.boxSizes=L.slice(e,[0,3],[-1,2]),t.boxSizesNormalized=L.div(t.boxSizes,f2),t.centersNormalized=L.div(t.centers,f2),t.halfBoxSize=L.div(t.boxSizesNormalized,C.tf2),t.starts=L.sub(t.centersNormalized,t.halfBoxSize),t.ends=L.add(t.centersNormalized,t.halfBoxSize),t.startNormalized=L.mul(t.starts,f2),t.endNormalized=L.mul(t.ends,f2);let n=L.concat2d([t.startNormalized,t.endNormalized],1);return Object.keys(t).forEach(o=>L.dispose(t[o])),n}async function T3(e,t){var a,l,c,x;if(!e||e.isDisposedInternal||e.shape.length!==4||e.shape[1]<1||e.shape[2]<1)return[];let n={};n.resized=L.image.resizeBilinear(e,[Le,Le]),n.div=L.div(n.resized,C.tf127),n.normalized=L.sub(n.div,C.tf05);let o=ie==null?void 0:ie.execute(n.normalized);if(Array.isArray(o)&&o.length>2){let i=o.sort((y,d)=>y.size-d.size);n.concat384=L.concat([i[0],i[2]],2),n.concat512=L.concat([i[1],i[3]],2),n.concat=L.concat([n.concat512,n.concat384],1),n.batch=L.squeeze(n.concat,[0])}else Array.isArray(o)?n.batch=L.squeeze(o[0]):n.batch=L.squeeze(o);L.dispose(o),n.boxes=sA(n.batch),n.logits=L.slice(n.batch,[0,0],[-1,1]),n.sigmoid=L.sigmoid(n.logits),n.scores=L.squeeze(n.sigmoid),n.nms=await L.image.nonMaxSuppressionAsync(n.boxes,n.scores,((a=t.face.detector)==null?void 0:a.maxDetected)||0,((l=t.face.detector)==null?void 0:l.iouThreshold)||0,((c=t.face.detector)==null?void 0:c.minConfidence)||0);let r=await n.nms.array(),s=[],A=await n.scores.data();for(let i=0;i(((x=t.face.detector)==null?void 0:x.minConfidence)||0)){let d={};d.bbox=L.slice(n.boxes,[r[i],0],[1,-1]),d.slice=L.slice(n.batch,[r[i],b3-1],[1,-1]),d.squeeze=L.squeeze(d.slice),d.landmarks=L.reshape(d.squeeze,[b3,-1]);let p=await d.bbox.data(),f={startPoint:[p[0],p[1]],endPoint:[p[2],p[3]],landmarks:await d.landmarks.array(),confidence:y},b=x3(f,[(e.shape[2]||0)/Le,(e.shape[1]||0)/Le]),M=xt(b,t.face.scale||rA),T=yt(M);s.push(T),Object.keys(d).forEach(m=>L.dispose(d[m]))}}return Object.keys(n).forEach(i=>L.dispose(n[i])),s}var le=Z(H());var V0,Ce=0,AA=2.3,R5=oe.leftEyeLower0,M5=oe.rightEyeLower0,p2={leftBounds:[R5[0],R5[R5.length-1]],rightBounds:[M5[0],M5[M5.length-1]]},u2={upperCenter:3,lowerCenter:4,index:71,numCoordinates:76};async function k3(e){var t,n;return R.initial&&(V0=null),V0?e.debug&&u("cached model:",V0.modelUrl):V0=await O((t=e.face.iris)==null?void 0:t.modelPath),Ce=(V0==null?void 0:V0.executor)&&((n=V0.inputs)==null?void 0:n[0].shape)?V0.inputs[0].shape[2]:0,Ce===-1&&(Ce=64),V0}function ft(e,t,n,o){for(let r=0;r{let t=e[p2.leftBounds[0]][2],n=e[p2.rightBounds[0]][2];return t-n},R3=(e,t,n,o,r,s=!1)=>{let A=yt(xt(y3([e[n],e[o]]),AA)),a=y2(A),l=le.image.cropAndResize(t,[[A.startPoint[1]/r,A.startPoint[0]/r,A.endPoint[1]/r,A.endPoint[0]/r]],[0],[Ce,Ce]);if(s&&R.kernels.includes("flipleftright")){let c=le.image.flipLeftRight(l);le.dispose(l),l=c}return{box:A,boxSize:a,crop:l}},M3=(e,t,n,o=!1)=>{let r=[];for(let s=0;s{let o=e[oe[`${n}EyeUpper0`][u2.upperCenter]][2],r=e[oe[`${n}EyeLower0`][u2.lowerCenter]][2],s=(o+r)/2;return t.map((A,a)=>{let l=s;return a===2?l=o:a===4&&(l=r),[A[0],A[1],l]})};async function w3(e,t,n){if(!(V0!=null&&V0.executor))return e;let{box:o,boxSize:r,crop:s}=R3(e,t,p2.leftBounds[0],p2.leftBounds[1],n,!0),{box:A,boxSize:a,crop:l}=R3(e,t,p2.rightBounds[0],p2.rightBounds[1],n,!0),c=le.concat([s,l]);le.dispose(s),le.dispose(l);let x=V0.execute(c);le.dispose(c);let i=await x.data();le.dispose(x);let y=i.slice(0,u2.numCoordinates*3),{rawCoords:d,iris:p}=M3(y,o,r,!0),f=i.slice(u2.numCoordinates*3),{rawCoords:b,iris:M}=M3(f,A,a,!1),T=aA(e);Math.abs(T)<30?(ft(e,d,"left",null),ft(e,b,"right",null)):T<1?ft(e,d,"left",["EyeUpper0","EyeLower0"]):ft(e,b,"right",["EyeUpper0","EyeLower0"]);let m=P3(e,p,"left"),h=P3(e,M,"right");return e.concat(m).concat(h)}async function z3(e,t){var s,A,a,l,c,x,i,y,d,p;let n={lips:await((A=(s=t.filter(f=>f.size===160))==null?void 0:s[0])==null?void 0:A.data()),irisL:await((l=(a=t.filter(f=>f.size===10))==null?void 0:a[0])==null?void 0:l.data()),eyeL:await((x=(c=t.filter(f=>f.size===142))==null?void 0:c[0])==null?void 0:x.data()),irisR:await((y=(i=t.filter(f=>f.size===10))==null?void 0:i[1])==null?void 0:y.data()),eyeR:await((p=(d=t.filter(f=>f.size===142))==null?void 0:d[1])==null?void 0:p.data())};for(let f of Object.values(n))if(!f)return e;let o=$e.reduce((f,b)=>f+=e[b][2],0)/$e.length;for(let f=0;ff+=e[b][2],0)/e2.length;for(let f=0;fg()-ue.timestamp,o=ue.skipped<(((c=t.face.detector)==null?void 0:c.skipFrames)||0);!t.skipAllowed||!n||!o||ue.boxes.length===0?(ue.boxes=await T3(e,t),ue.timestamp=g(),ue.skipped=0):ue.skipped++;let r=[],s=[],A=0,a=C2;for(let T=0;TG.shape[G.shape.length-1]===1).data();if(P.faceScore=Math.round(100*t0[0])/100,P.faceScore<(((p=t.face.detector)==null?void 0:p.minConfidence)||1)){if(m.confidence=P.faceScore,t.face.mesh.keepInvalid){P.box=ct(m,e),P.boxRaw=dt(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(G=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*G[0]/m2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*G[1]/m2()]),P.meshRaw=P.mesh.map(G=>[G[0]/(e.shape[2]||1),G[1]/(e.shape[1]||1),(G[2]||0)/a]);for(let G of Object.keys(Qe))P.annotations[G]=[P.mesh[Qe[G]]]}}else{let G=I.find(V=>V.shape[V.shape.length-1]===1404),$=We.reshape(G,[-1,3]),A0=await $.array();We.dispose($),(f=t.face.attention)!=null&&f.enabled?A0=await z3(A0,I):(b=t.face.iris)!=null&&b.enabled&&(A0=await w3(A0,P.tensor,C2)),P.mesh=p3(A0,m,h,S,C2),P.meshRaw=P.mesh.map(V=>[V[0]/(e.shape[2]||0),V[1]/(e.shape[1]||0),(V[2]||0)/a]);for(let V of Object.keys(oe))P.annotations[V]=oe[V].map(n0=>P.mesh[n0]);P.score=P.faceScore;let v={...h3(P.mesh,m),confidence:m.confidence,landmarks:m.landmarks};P.box=ct(v,e),P.boxRaw=dt(v,e),s.push(v)}We.dispose(I)}else{P.box=ct(m,e),P.boxRaw=dt(m,e),P.score=P.boxScore,P.mesh=m.landmarks.map(I=>[(m.startPoint[0]+m.endPoint[0])/2+(m.endPoint[0]+m.startPoint[0])*I[0]/m2(),(m.startPoint[1]+m.endPoint[1])/2+(m.endPoint[1]+m.startPoint[1])*I[1]/m2()]),P.meshRaw=P.mesh.map(I=>[I[0]/(e.shape[2]||0),I[1]/(e.shape[1]||0),(I[2]||0)/a]);for(let I of Object.keys(Qe))P.annotations[I]=[P.mesh[Qe[I]]]}P.score>(((M=t.face.detector)==null?void 0:M.minConfidence)||1)?r.push(P):We.dispose(P.tensor)}return ue.boxes=s,r}async function j3(e){var t,n,o,r,s,A;return R.initial&&(r0=null),((t=e.face.attention)==null?void 0:t.enabled)&&(r0==null?void 0:r0.signature)&&Object.keys(((n=r0==null?void 0:r0.signature)==null?void 0:n.outputs)||{}).length<6&&(r0=null),r0?e.debug&&u("cached model:",r0.modelUrl):(o=e.face.attention)!=null&&o.enabled?r0=await O(e.face.attention.modelPath):r0=await O((r=e.face.mesh)==null?void 0:r.modelPath),C2=r0.executor&&((s=r0==null?void 0:r0.inputs)==null?void 0:s[0].shape)?(A=r0==null?void 0:r0.inputs)==null?void 0:A[0].shape[2]:256,r0}var N3=_e,I3=O2;var ce=Z(H());var lA=["angry","disgust","fear","happy","sad","surprise","neutral"],$0,mt=[],O3=0,L3=0,k5=Number.MAX_SAFE_INTEGER;async function C3(e){var t;return R.initial&&($0=null),$0?e.debug&&u("cached model:",$0.modelUrl):$0=await O((t=e.face.emotion)==null?void 0:t.modelPath),$0}async function w5(e,t,n,o){var A,a;if(!$0)return[];let r=k5<(((A=t.face.emotion)==null?void 0:A.skipFrames)||0),s=(((a=t.face.emotion)==null?void 0:a.skipTime)||0)>g()-L3;return t.skipAllowed&&s&&r&&O3===o&&mt[n]&&mt[n].length>0?(k5++,mt[n]):(k5=0,new Promise(async l=>{var x;let c=[];if((x=t.face.emotion)!=null&&x.enabled){let i={},y=$0!=null&&$0.inputs[0].shape?$0.inputs[0].shape[2]:0;i.resize=ce.image.resizeBilinear(e,[y,y],!1),i.channels=ce.mul(i.resize,C.rgb),i.grayscale=ce.sum(i.channels,3,!0),i.grayscaleSub=ce.sub(i.grayscale,C.tf05),i.grayscaleMul=ce.mul(i.grayscaleSub,C.tf2),i.emotion=$0==null?void 0:$0.execute(i.grayscaleMul),L3=g();let d=await i.emotion.data();for(let p=0;p(t.face.emotion.minConfidence||0)&&c.push({score:Math.min(.99,Math.trunc(100*d[p])/100),emotion:lA[p]});c.sort((p,f)=>f.score-p.score),Object.keys(i).forEach(p=>ce.dispose(i[p]))}mt[n]=c,O3=o,l(c)}))}var de=Z(H());var z0,De=[],D3=0,F3=0,E5=Number.MAX_SAFE_INTEGER;async function B3(e){var t;return R.initial&&(z0=null),z0?e.debug&&u("cached model:",z0.modelUrl):z0=await O((t=e.face.description)==null?void 0:t.modelPath),z0}function cA(e){let t=e.image||e.tensor||e;if(!(z0!=null&&z0.inputs[0].shape))return t;let n=de.image.resizeBilinear(t,[z0.inputs[0].shape[2],z0.inputs[0].shape[1]],!1),o=de.mul(n,C.tf255);return de.dispose(n),o}async function z5(e,t,n,o){var a,l,c,x;let r={age:0,gender:"unknown",genderScore:0,descriptor:[]};if(!(z0!=null&&z0.executor))return r;let s=E5<(((a=t.face.description)==null?void 0:a.skipFrames)||0),A=(((l=t.face.description)==null?void 0:l.skipTime)||0)>g()-D3;return t.skipAllowed&&s&&A&&F3===o&&((c=De==null?void 0:De[n])==null?void 0:c.age)>0&&((x=De==null?void 0:De[n])==null?void 0:x.genderScore)>0?(E5++,De[n]):(E5=0,new Promise(async i=>{var y;if((y=t.face.description)!=null&&y.enabled){let d=cA(e),p=z0==null?void 0:z0.execute(d);D3=g(),de.dispose(d);let b=await p.find(q=>q.shape[1]===1).data(),M=Math.trunc(200*Math.abs(b[0]-.5))/100;M>(t.face.description.minConfidence||0)&&(r.gender=b[0]<=.5?"female":"male",r.genderScore=Math.min(.99,M));let T=de.argMax(p.find(q=>q.shape[1]===100),1),m=(await T.data())[0];de.dispose(T);let S=await p.find(q=>q.shape[1]===100).data();r.age=Math.round(S[m-1]>S[m+1]?10*m-100*S[m-1]:10*m+100*S[m+1])/10,(Number.isNaN(b[0])||Number.isNaN(S[0]))&&u("faceres error:",{model:z0,result:p});let P=p.find(q=>q.shape[1]===1024),I=P?await P.data():[];r.descriptor=Array.from(I),p.forEach(q=>de.dispose(q))}De[n]=r,F3=o,i(r)}))}var h2=.1,S5=.5;function dA(e,t,n){let o=!1,r=n.length-1;for(let s=0;st!=n[r].y>t&&e<(n[r].x-n[s].x)*(t-n[s].y)/(n[r].y-n[s].y)+n[s].x&&(o=!o);return o}async function G3(e){if(!e.tensor||!e.mesh||e.mesh.length<100)return e.tensor;let t=e.tensor.shape[2]||0,n=e.tensor.shape[1]||0,o=await e.tensor.buffer(),r=[];for(let A of oe.silhouette)r.push({x:(e.mesh[A][0]-e.box[0])/e.box[2],y:(e.mesh[A][1]-e.box[1])/e.box[3]});h2&&h2>0&&(r=r.map(A=>({x:A.x>.5?A.x+h2:A.x-h2,y:A.y>.5?A.y+h2:A.y-h2})));for(let A=0;Ag()-Z3,s=j5<(((a=t.face.antispoof)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&V3===o&&pt[n]?(j5++,pt[n]):(j5=0,new Promise(async l=>{let c=ut.image.resizeBilinear(e,[M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[2]:0,M0!=null&&M0.inputs[0].shape?M0.inputs[0].shape[1]:0],!1),x=M0==null?void 0:M0.execute(c),i=(await x.data())[0];pt[n]=Math.round(100*i)/100,V3=o,Z3=g(),ut.dispose([c,x]),l(pt[n])}))}var bt=Z(H());var P0,ht=[],I5=Number.MAX_SAFE_INTEGER,U3=0,Y3=0;async function K3(e){var t;return R.initial&&(P0=null),P0?e.debug&&u("cached model:",P0.modelUrl):P0=await O((t=e.face.liveness)==null?void 0:t.modelPath),P0}async function O5(e,t,n,o){var A,a;if(!(P0!=null&&P0.executor))return 0;let r=(((A=t.face.liveness)==null?void 0:A.skipTime)||0)>g()-Y3,s=I5<(((a=t.face.liveness)==null?void 0:a.skipFrames)||0);return t.skipAllowed&&r&&s&&U3===o&&ht[n]?(I5++,ht[n]):(I5=0,new Promise(async l=>{let c=bt.image.resizeBilinear(e,[P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[2]:0,P0!=null&&P0.inputs[0].shape?P0.inputs[0].shape[1]:0],!1),x=P0==null?void 0:P0.execute(c),i=(await x.data())[0];ht[n]=Math.round(100*i)/100,U3=o,Y3=g(),bt.dispose([c,x]),l(ht[n])}))}var gt=Z(H());var re,L5=[],yA=["white","black","asian","indian","other"],fA=[15,23,28,35.5,45.5,55.5,65],Q3=0,_3=0,C5=Number.MAX_SAFE_INTEGER;async function $3(e){var t;return R.initial&&(re=null),re?e.debug&&u("cached model:",re.modelUrl):re=await O((t=e.face.gear)==null?void 0:t.modelPath),re}async function W5(e,t,n,o){var A,a;if(!re)return{age:0,gender:"unknown",genderScore:0,race:[]};let r=C5<(((A=t.face.gear)==null?void 0:A.skipFrames)||0),s=(((a=t.face.gear)==null?void 0:a.skipTime)||0)>g()-_3;return t.skipAllowed&&s&&r&&Q3===o&&L5[n]?(C5++,L5[n]):(C5=0,new Promise(async l=>{var M,T;if(!(re!=null&&re.inputs[0].shape))return;let c={},x=[[0,.1,.9,.9]];c.resize=gt.image.cropAndResize(e,x,[0],[re.inputs[0].shape[2],re.inputs[0].shape[1]]);let i={age:0,gender:"unknown",genderScore:0,race:[]};(M=t.face.gear)!=null&&M.enabled&&([c.age,c.gender,c.race]=re.execute(c.resize,["age_output","gender_output","race_output"]));let y=await c.gender.data();i.gender=y[0]>y[1]?"male":"female",i.genderScore=Math.round(100*(y[0]>y[1]?y[0]:y[1]))/100;let d=await c.race.data();for(let m=0;m(((T=t.face.gear)==null?void 0:T.minConfidence)||.2)&&i.race.push({score:Math.round(100*d[m])/100,race:yA[m]});i.race.sort((m,h)=>h.score-m.score);let f=Array.from(await c.age.data()).map((m,h)=>[fA[h],m]).sort((m,h)=>h[1]-m[1]),b=f[0][0];for(let m=1;mgt.dispose(c[m])),L5[n]=i,Q3=o,_3=g(),l(i)}))}var b2=Z(H());var Z0,Tt=[],tn=0,nn=0,D5=Number.MAX_SAFE_INTEGER;async function on(e){return R.initial&&(Z0=null),Z0?e.debug&&u("cached model:",Z0.modelUrl):Z0=await O(e.face.ssrnet.modelPathAge),Z0}async function F5(e,t,n,o){var A,a,l,c;if(!Z0)return{age:0};let r=D5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-nn;return t.skipAllowed&&r&&s&&tn===o&&((l=Tt[n])==null?void 0:l.age)&&((c=Tt[n])==null?void 0:c.age)>0?(D5++,Tt[n]):(D5=0,new Promise(async x=>{var d;if(!(Z0!=null&&Z0.inputs)||!Z0.inputs[0]||!Z0.inputs[0].shape)return;let i={};i.resize=b2.image.resizeBilinear(e,[Z0.inputs[0].shape[2],Z0.inputs[0].shape[1]],!1),i.enhance=b2.mul(i.resize,C.tf255);let y={age:0};if((d=t.face.ssrnet)!=null&&d.enabled&&(i.age=Z0.execute(i.enhance)),i.age){let p=await i.age.data();y.age=Math.trunc(10*p[0])/10}Object.keys(i).forEach(p=>b2.dispose(i[p])),Tt[n]=y,tn=o,nn=g(),x(y)}))}var S0=Z(H());var se,vt=[],sn=0,An=0,B5=Number.MAX_SAFE_INTEGER,H5=[.2989,.587,.114];async function an(e){var t;return R.initial&&(se=null),se?e.debug&&u("cached model:",se.modelUrl):se=await O((t=e.face.ssrnet)==null?void 0:t.modelPathGender),se}async function G5(e,t,n,o){var A,a,l,c;if(!se)return{gender:"unknown",genderScore:0};let r=B5<(((A=t.face.ssrnet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.ssrnet)==null?void 0:a.skipTime)||0)>g()-An;return t.skipAllowed&&r&&s&&sn===o&&((l=vt[n])==null?void 0:l.gender)&&((c=vt[n])==null?void 0:c.genderScore)>0?(B5++,vt[n]):(B5=0,new Promise(async x=>{var p;if(!(se!=null&&se.inputs[0].shape))return;let i={};i.resize=S0.image.resizeBilinear(e,[se.inputs[0].shape[2],se.inputs[0].shape[1]],!1),i.enhance=S0.tidy(()=>{let[f,b,M]=S0.split(i.resize,3,3),T=S0.mul(f,H5[0]),m=S0.mul(b,H5[1]),h=S0.mul(M,H5[2]),S=S0.addN([T,m,h]);return S0.mul(S0.sub(S,C.tf05),2)});let y={gender:"unknown",genderScore:0};(p=t.face.ssrnet)!=null&&p.enabled&&(i.gender=se.execute(i.enhance));let d=await i.gender.data();y.gender=d[0]>d[1]?"female":"male",y.genderScore=d[0]>d[1]?Math.trunc(100*d[0])/100:Math.trunc(100*d[1])/100,Object.keys(i).forEach(f=>S0.dispose(i[f])),vt[n]=y,sn=o,An=g(),x(y)}))}var Rt=Z(H());var X0,V5=[],cn=0,dn=0,xn=Number.MAX_SAFE_INTEGER;async function yn(e){var t;return R.initial&&(X0=null),X0?e.debug&&u("cached model:",X0.modelUrl):X0=await O((t=e.face.mobilefacenet)==null?void 0:t.modelPath),X0}async function Z5(e,t,n,o){var A,a;if(!(X0!=null&&X0.executor))return[];let r=xn<(((A=t.face.mobilefacenet)==null?void 0:A.skipFrames)||0),s=(((a=t.face.mobilefacenet)==null?void 0:a.skipTime)||0)>g()-dn;return t.skipAllowed&&s&&r&&cn===o&&V5[n]?(xn++,V5[n]):new Promise(async l=>{var x;let c=[];if(((x=t.face.mobilefacenet)==null?void 0:x.enabled)&&(X0==null?void 0:X0.inputs[0].shape)){let i={};i.crop=Rt.image.resizeBilinear(e,[X0.inputs[0].shape[2],X0.inputs[0].shape[1]],!1),i.data=X0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(d=>Rt.dispose(i[d]))}V5[n]=c,cn=o,dn=g(),l(c)})}var Mt=Z(H());var q0,X5=[],mn=0,pn=0,un=Number.MAX_SAFE_INTEGER;async function hn(e){return R.initial&&(q0=null),q0?e.debug&&u("cached model:",q0.modelUrl):q0=await O(e.face.insightface.modelPath),q0}async function q5(e,t,n,o){var A,a;if(!(q0!=null&&q0.executor))return[];let r=un<(((A=t.face.insightface)==null?void 0:A.skipFrames)||0),s=(((a=t.face.insightface)==null?void 0:a.skipTime)||0)>g()-pn;return t.skipAllowed&&s&&r&&mn===o&&X5[n]?(un++,X5[n]):new Promise(async l=>{var x;let c=[];if(((x=t.face.insightface)==null?void 0:x.enabled)&&(q0==null?void 0:q0.inputs[0].shape)){let i={};i.crop=Mt.image.resizeBilinear(e,[q0.inputs[0].shape[2],q0.inputs[0].shape[1]],!1),i.data=q0.execute(i.crop);let y=await i.data.data();c=Array.from(y),Object.keys(i).forEach(d=>Mt.dispose(i[d]))}X5[n]=c,mn=o,pn=g(),l(c)})}var mA=e=>{let t=(i,y)=>Math.atan2(i[1]-y[1],i[0]-y[0]);if(!e.annotations.rightEyeIris||!e.annotations.leftEyeIris)return{bearing:0,strength:0};let n=[0,-.1],o=1,r=(e.mesh[33][2]||0)>(e.mesh[263][2]||0),s=r?e.mesh[473]:e.mesh[468],A=r?[(e.mesh[133][0]+e.mesh[33][0])/2,(e.mesh[133][1]+e.mesh[33][1])/2]:[(e.mesh[263][0]+e.mesh[362][0])/2,(e.mesh[263][1]+e.mesh[362][1])/2],a=r?[e.mesh[133][0]-e.mesh[33][0],e.mesh[23][1]-e.mesh[27][1]]:[e.mesh[263][0]-e.mesh[362][0],e.mesh[253][1]-e.mesh[257][1]],l=[(A[0]-s[0])/a[0]-n[0],o*(s[1]-A[1])/a[1]-n[1]],c=Math.sqrt(l[0]*l[0]+l[1]*l[1]);return c=Math.min(c,e.boxRaw[2]/2,e.boxRaw[3]/2),{bearing:(t([0,0],l)+Math.PI/2)%Math.PI,strength:c}},gn=(e,t)=>{let n=f=>{let b=Math.sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);return f[0]/=b,f[1]/=b,f[2]/=b,f},o=(f,b)=>{let M=f[0]-b[0],T=f[1]-b[1],m=f[2]-b[2];return[M,T,m]},r=(f,b)=>{let M=f[1]*b[2]-f[2]*b[1],T=f[2]*b[0]-f[0]*b[2],m=f[0]*b[1]-f[1]*b[0];return[M,T,m]},s=f=>{let[b,M,T,m,h,S,P,I,q]=f,t0,G,$;return m<1?m>-1?($=Math.asin(m),G=Math.atan2(-P,b),t0=Math.atan2(-S,h)):($=-Math.PI/2,G=-Math.atan2(I,q),t0=0):($=Math.PI/2,G=Math.atan2(I,q),t0=0),Number.isNaN(t0)&&(t0=0),Number.isNaN(G)&&(G=0),Number.isNaN($)&&($=0),{pitch:2*-t0,yaw:2*-G,roll:2*-$}},A=e.meshRaw;if(!A||A.length<300)return{angle:{pitch:0,yaw:0,roll:0},matrix:[1,0,0,0,1,0,0,0,1],gaze:{bearing:0,strength:0}};let a=Math.max(e.boxRaw[2]*t[0],e.boxRaw[3]*t[1])/1.5,l=[A[10],A[152],A[234],A[454]].map(f=>[f[0]*t[0]/a,f[1]*t[1]/a,f[2]]),c=n(o(l[1],l[0])),x=n(o(l[3],l[2])),i=n(r(x,c));x=r(c,i);let y=[x[0],x[1],x[2],c[0],c[1],c[2],i[0],i[1],i[2]],d=s(y),p=A.length===478?mA(e):{bearing:0,strength:0};return{angle:d,matrix:y,gaze:p}};function Tn(e,t){let n=e==null?void 0:e.annotations;if(!n)return 0;let o=Math.max(Math.abs(n.leftEyeIris[3][0]-n.leftEyeIris[1][0]),Math.abs(n.rightEyeIris[3][0]-n.rightEyeIris[1][0]))/t;return Math.round(1.17/o)/100}var U5=async(e,t)=>{var p,f,b,M,T,m,h,S,P,I,q,t0,G,$,A0,v,V,n0,U,g0,m0,B,X;let n=g(),o,r,s,A,a,l,c,x,i,y=[];e.state="run:face";let d=await S3(t,e.config);if(e.performance.face=R.perfadd?(e.performance.face||0)+Math.trunc(g()-n):Math.trunc(g()-n),!t.shape||t.shape.length!==4)return[];if(!d)return[];for(let z=0;z200?gn(d[z],[t.shape[2],t.shape[1]]):null;e.analyze("Start Emotion:"),e.config.async?A=(f=e.config.face.emotion)!=null&&f.enabled?w5(d[z].tensor||l0.tensor([]),e.config,z,d.length):[]:(e.state="run:emotion",n=g(),A=(b=e.config.face.emotion)!=null&&b.enabled?await w5(d[z].tensor||l0.tensor([]),e.config,z,d.length):[],e.performance.emotion=R.perfadd?(e.performance.emotion||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Emotion:"),e.analyze("Start AntiSpoof:"),e.config.async?c=(M=e.config.face.antispoof)!=null&&M.enabled?N5(d[z].tensor||l0.tensor([]),e.config,z,d.length):0:(e.state="run:antispoof",n=g(),c=(T=e.config.face.antispoof)!=null&&T.enabled?await N5(d[z].tensor||l0.tensor([]),e.config,z,d.length):0,e.performance.antispoof=R.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End AntiSpoof:"),e.analyze("Start Liveness:"),e.config.async?x=(m=e.config.face.liveness)!=null&&m.enabled?O5(d[z].tensor||l0.tensor([]),e.config,z,d.length):0:(e.state="run:liveness",n=g(),x=(h=e.config.face.liveness)!=null&&h.enabled?await O5(d[z].tensor||l0.tensor([]),e.config,z,d.length):0,e.performance.liveness=R.perfadd?(e.performance.antispoof||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Liveness:"),e.analyze("Start GEAR:"),e.config.async?r=(S=e.config.face.gear)!=null&&S.enabled?W5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null:(e.state="run:gear",n=g(),r=(P=e.config.face.gear)!=null&&P.enabled?await W5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null,e.performance.gear=Math.trunc(g()-n)),e.analyze("End GEAR:"),e.analyze("Start SSRNet:"),e.config.async?(o=(I=e.config.face.ssrnet)!=null&&I.enabled?F5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null,s=(q=e.config.face.ssrnet)!=null&&q.enabled?G5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null):(e.state="run:ssrnet",n=g(),o=(t0=e.config.face.ssrnet)!=null&&t0.enabled?await F5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null,s=(G=e.config.face.ssrnet)!=null&&G.enabled?await G5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null,e.performance.ssrnet=Math.trunc(g()-n)),e.analyze("End SSRNet:"),e.analyze("Start MobileFaceNet:"),e.config.async?a=($=e.config.face.mobilefacenet)!=null&&$.enabled?Z5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null:(e.state="run:mobilefacenet",n=g(),a=(A0=e.config.face.mobilefacenet)!=null&&A0.enabled?await Z5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End MobileFaceNet:"),e.analyze("Start InsightFace:"),e.config.async?l=(v=e.config.face.insightface)!=null&&v.enabled?q5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null:(e.state="run:mobilefacenet",n=g(),l=(V=e.config.face.insightface)!=null&&V.enabled?await q5(d[z].tensor||l0.tensor([]),e.config,z,d.length):null,e.performance.mobilefacenet=Math.trunc(g()-n)),e.analyze("End InsightFace:"),e.analyze("Start Description:"),e.config.async?i=z5(d[z].tensor||l0.tensor([]),e.config,z,d.length):(e.state="run:description",n=g(),i=await z5(d[z].tensor||l0.tensor([]),e.config,z,d.length),e.performance.description=R.perfadd?(e.performance.description||0)+Math.trunc(g()-n):Math.trunc(g()-n)),e.analyze("End Description:"),e.config.async&&([o,s,A,a,l,i,r,c,x]=await Promise.all([o,s,A,a,l,i,r,c,x])),e.analyze("Finish Face:"),((n0=e.config.face.ssrnet)==null?void 0:n0.enabled)&&o&&s&&(i={...i,age:o.age,gender:s.gender,genderScore:s.genderScore}),((U=e.config.face.gear)==null?void 0:U.enabled)&&r&&(i={...i,age:r.age,gender:r.gender,genderScore:r.genderScore,race:r.race}),((g0=e.config.face.mobilefacenet)==null?void 0:g0.enabled)&&a&&(i.descriptor=a),((m0=e.config.face.insightface)==null?void 0:m0.enabled)&&l&&(i.descriptor=l);let we=(B=e.config.face.iris)!=null&&B.enabled?Tn(d[z],t.shape[2]):0,Ee=(X=e.config.face.detector)!=null&&X.return?l0.squeeze(d[z].tensor):null;l0.dispose(d[z].tensor),d[z].tensor&&delete d[z].tensor;let T0={...d[z],id:z};i.age&&(T0.age=i.age),i.gender&&(T0.gender=i.gender),i.genderScore&&(T0.genderScore=i.genderScore),i.descriptor&&(T0.embedding=i.descriptor),i.race&&(T0.race=i.race),A&&(T0.emotion=A),c&&(T0.real=c),x&&(T0.live=x),we>0&&(T0.distance=we),ee&&(T0.rotation=ee),Ee&&(T0.tensor=Ee),y.push(T0),e.analyze("End Face")}return e.analyze("End FaceMesh:"),e.config.async&&(e.performance.face&&delete e.performance.face,e.performance.age&&delete e.performance.age,e.performance.gender&&delete e.performance.gender,e.performance.emotion&&delete e.performance.emotion),y};var W0={thumb:0,index:1,middle:2,ring:3,pinky:4,all:[0,1,2,3,4],nameMapping:{0:"thumb",1:"index",2:"middle",3:"ring",4:"pinky"},pointsMapping:{0:[[0,1],[1,2],[2,3],[3,4]],1:[[0,5],[5,6],[6,7],[7,8]],2:[[0,9],[9,10],[10,11],[11,12]],3:[[0,13],[13,14],[14,15],[15,16]],4:[[0,17],[17,18],[18,19],[19,20]]},getName:e=>W0.nameMapping[e],getPoints:e=>W0.pointsMapping[e]},Be={none:0,half:1,full:2,nameMapping:{0:"none",1:"half",2:"full"},getName:e=>Be.nameMapping[e]},c0={verticalUp:0,verticalDown:1,horizontalLeft:2,horizontalRight:3,diagonalUpRight:4,diagonalUpLeft:5,diagonalDownRight:6,diagonalDownLeft:7,nameMapping:{0:"verticalUp",1:"verticalDown",2:"horizontalLeft",3:"horizontalRight",4:"diagonalUpRight",5:"diagonalUpLeft",6:"diagonalDownRight",7:"diagonalDownLeft"},getName:e=>c0.nameMapping[e]},Fe=class{constructor(t){k(this,"name");k(this,"curls");k(this,"directions");k(this,"weights");k(this,"weightsRelative");this.name=t,this.curls={},this.directions={},this.weights=[1,1,1,1,1],this.weightsRelative=[1,1,1,1,1]}curl(t,n,o){typeof this.curls[t]=="undefined"&&(this.curls[t]=[]),this.curls[t].push([n,o])}direction(t,n,o){this.directions[t]||(this.directions[t]=[]),this.directions[t].push([n,o])}weight(t,n){this.weights[t]=n;let o=this.weights.reduce((r,s)=>r+s,0);this.weightsRelative=this.weights.map(r=>r*5/o)}matchAgainst(t,n){let o=0;for(let r in t){let s=t[r],A=this.curls[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}for(let r in n){let s=n[r],A=this.directions[r];if(typeof A=="undefined"){o+=this.weightsRelative[r];continue}for(let[a,l]of A)if(s===a){o+=l*this.weightsRelative[r];break}}return o/10}};var{thumb:xe,index:Me,middle:Pe,ring:r2,pinky:s2}=W0,{none:ye,half:uA,full:fe}=Be,{verticalUp:g2,verticalDown:G7,horizontalLeft:Y5,horizontalRight:hA,diagonalUpRight:bA,diagonalUpLeft:T2,diagonalDownRight:V7,diagonalDownLeft:Z7}=c0,He=new Fe("thumbs up");He.curl(xe,ye,1);He.direction(xe,g2,1);He.direction(xe,T2,.25);He.direction(xe,bA,.25);for(let e of[W0.index,W0.middle,W0.ring,W0.pinky])He.curl(e,fe,1),He.direction(e,Y5,1),He.direction(e,hA,1);var u0=new Fe("victory");u0.curl(xe,uA,.5);u0.curl(xe,ye,.5);u0.direction(xe,g2,1);u0.direction(xe,T2,1);u0.curl(Me,ye,1);u0.direction(Me,g2,.75);u0.direction(Me,T2,1);u0.curl(Pe,ye,1);u0.direction(Pe,g2,1);u0.direction(Pe,T2,.75);u0.curl(r2,fe,1);u0.direction(r2,g2,.2);u0.direction(r2,T2,1);u0.direction(r2,Y5,.2);u0.curl(s2,fe,1);u0.direction(s2,g2,.2);u0.direction(s2,T2,1);u0.direction(s2,Y5,.2);u0.weight(Me,2);u0.weight(Pe,2);var Ge=new Fe("point");Ge.curl(xe,fe,1);Ge.curl(Me,ye,.5);Ge.curl(Pe,fe,.5);Ge.curl(r2,fe,.5);Ge.curl(s2,fe,.5);Ge.weight(Me,2);Ge.weight(Pe,2);var Ve=new Fe("middle finger");Ve.curl(xe,ye,1);Ve.curl(Me,fe,.5);Ve.curl(Pe,fe,.5);Ve.curl(r2,fe,.5);Ve.curl(s2,fe,.5);Ve.weight(Me,2);Ve.weight(Pe,2);var v2=new Fe("open palm");v2.curl(xe,ye,.75);v2.curl(Me,ye,.75);v2.curl(Pe,ye,.75);v2.curl(r2,ye,.75);v2.curl(s2,ye,.75);var vn=[He,u0,Ge,Ve,v2];var gA=.7,A2={HALF_CURL_START_LIMIT:60,NO_CURL_START_LIMIT:130,DISTANCE_VOTE_POWER:1.1,SINGLE_ANGLE_VOTE_POWER:.9,TOTAL_ANGLE_VOTE_POWER:1.6};function Rn(e,t,n,o){let r=(t-o)/(e-n),s=Math.atan(r)*180/Math.PI;return s<=0?s=-s:s>0&&(s=180-s),s}function Pn(e,t){if(!e||!t)return[0,0];let n=Rn(e[0],e[1],t[0],t[1]);if(e.length===2)return n;let o=Rn(e[1],e[2],t[1],t[2]);return[n,o]}function Mn(e,t=1){let n=0,o=0,r=0;return e>=75&&e<=105?n=1*t:e>=25&&e<=155?o=1*t:r=1*t,[n,o,r]}function TA(e,t,n){let o=e[0]-t[0],r=e[0]-n[0],s=t[0]-n[0],A=e[1]-t[1],a=e[1]-n[1],l=t[1]-n[1],c=e[2]-t[2],x=e[2]-n[2],i=t[2]-n[2],y=Math.sqrt(o*o+A*A+c*c),d=Math.sqrt(r*r+a*a+x*x),p=Math.sqrt(s*s+l*l+i*i),f=(p*p+y*y-d*d)/(2*p*y);f>1?f=1:f<-1&&(f=-1);let b=Math.acos(f);b=57.2958*b%180;let M;return b>A2.NO_CURL_START_LIMIT?M=Be.none:b>A2.HALF_CURL_START_LIMIT?M=Be.half:M=Be.full,M}function kn(e,t,n,o){let r;return o===Math.abs(e)?e>0?r=c0.horizontalLeft:r=c0.horizontalRight:o===Math.abs(t)?t>0?r=c0.horizontalLeft:r=c0.horizontalRight:n>0?r=c0.horizontalLeft:r=c0.horizontalRight,r}function wn(e,t,n,o){let r;return o===Math.abs(e)?e<0?r=c0.verticalDown:r=c0.verticalUp:o===Math.abs(t)?t<0?r=c0.verticalDown:r=c0.verticalUp:n<0?r=c0.verticalDown:r=c0.verticalUp,r}function vA(e,t,n,o,r,s,A,a){let l,c=wn(e,t,n,o),x=kn(r,s,A,a);return c===c0.verticalUp?x===c0.horizontalLeft?l=c0.diagonalUpLeft:l=c0.diagonalUpRight:x===c0.horizontalLeft?l=c0.diagonalDownLeft:l=c0.diagonalDownRight,l}function RA(e,t,n,o){let r=e[0]-t[0],s=e[0]-n[0],A=t[0]-n[0],a=e[1]-t[1],l=e[1]-n[1],c=t[1]-n[1],x=Math.max(Math.abs(r),Math.abs(s),Math.abs(A)),i=Math.max(Math.abs(a),Math.abs(l),Math.abs(c)),y=0,d=0,p=0,f=i/(x+1e-5);f>1.5?y+=A2.DISTANCE_VOTE_POWER:f>.66?d+=A2.DISTANCE_VOTE_POWER:p+=A2.DISTANCE_VOTE_POWER;let b=Math.sqrt(r*r+a*a),M=Math.sqrt(s*s+l*l),T=Math.sqrt(A*A+c*c),m=Math.max(b,M,T),h=e[0],S=e[1],P=n[0],I=n[1];m===b?(P=n[0],I=n[1]):m===T&&(h=t[0],S=t[1]);let G=Pn([h,S],[P,I]),$=Mn(G,A2.TOTAL_ANGLE_VOTE_POWER);y+=$[0],d+=$[1],p+=$[2];for(let v of o){let V=Mn(v,A2.SINGLE_ANGLE_VOTE_POWER);y+=V[0],d+=V[1],p+=V[2]}let A0;return y===Math.max(y,d,p)?A0=wn(l,a,c,i):p===Math.max(d,p)?A0=kn(s,r,A,x):A0=vA(l,a,c,i,s,r,A,x),A0}function En(e){let t=[],n=[],o=[],r=[];if(!e)return{curls:o,directions:r};for(let s of W0.all){let A=W0.getPoints(s),a=[],l=[];for(let c of A){let x=e[c[0]],i=e[c[1]],y=Pn(x,i),d=y[0],p=y[1];a.push(d),l.push(p)}t.push(a),n.push(l)}for(let s of W0.all){let A=s===W0.thumb?1:0,a=W0.getPoints(s),l=e[a[A][0]],c=e[a[A+1][1]],x=e[a[3][1]],i=TA(l,c,x),y=RA(l,c,x,t[s].slice(A));o[s]=i,r[s]=y}return{curls:o,directions:r}}function Pt(e){if(!e||e.length===0)return null;let t=En(e),n={};for(let o of W0.all)n[W0.getName(o)]={curl:Be.getName(t.curls[o]),direction:c0.getName(t.directions[o])};return n}function zn(e){let t=[];if(!e||e.length===0)return t;let n=En(e);for(let o of vn){let r=o.matchAgainst(n.curls,n.directions);r>=gA&&t.push({name:o.name,confidence:r})}return t}var Sn=e=>{if(!e)return[];let t=[];for(let n=0;nl.part==="leftWrist"),r=e[n].keypoints.find(l=>l.part==="rightWrist"),s=e[n].keypoints.find(l=>l.part==="nose");s&&o&&r&&o.position[1]l.part==="leftShoulder"),a=e[n].keypoints.find(l=>l.part==="rightShoulder");A&&a&&Math.abs(A.positionRaw[1]-a.positionRaw[1])>.1&&t.push({body:n,gesture:`leaning ${A.position[1]>a.position[1]?"left":"right"}`})}return t},jn=e=>{if(!e)return[];let t=[];for(let n=0;n450){let o=(e[n].mesh[33][2]||0)-(e[n].mesh[263][2]||0),r=e[n].mesh[33][0]-e[n].mesh[263][0];Math.abs(o/r)<=.15?t.push({face:n,gesture:"facing center"}):t.push({face:n,gesture:`facing ${o<0?"left":"right"}`}),Math.abs(e[n].mesh[374][1]-e[n].mesh[386][1])/Math.abs(e[n].mesh[443][1]-e[n].mesh[450][1])<.2&&t.push({face:n,gesture:"blink left eye"}),Math.abs(e[n].mesh[145][1]-e[n].mesh[159][1])/Math.abs(e[n].mesh[223][1]-e[n].mesh[230][1])<.2&&t.push({face:n,gesture:"blink right eye"});let a=Math.min(100,500*Math.abs(e[n].mesh[13][1]-e[n].mesh[14][1])/Math.abs(e[n].mesh[10][1]-e[n].mesh[152][1]));a>10&&t.push({face:n,gesture:`mouth ${Math.trunc(a)}% open`});let l=e[n].mesh[152][2]||0;Math.abs(l)>10&&t.push({face:n,gesture:`head ${l<0?"up":"down"}`})}return t},Nn=e=>{var n,o,r,s;if(!e)return[];let t=[];for(let A=0;A.06||b>.06)&&(d=!1),f>b?f>.05&&t.push({iris:A,gesture:"looking right"}):b>.05&&t.push({iris:A,gesture:"looking left"});let M=Math.abs(e[A].mesh[145][1]-e[A].annotations.rightEyeIris[0][1])/e[A].box[3],T=Math.abs(e[A].mesh[374][1]-e[A].annotations.leftEyeIris[0][1])/e[A].box[3];(T<.01||M<.01||T>.022||M>.022)&&(d=!1),(T<.01||M<.01)&&t.push({iris:A,gesture:"looking down"}),(T>.022||M>.022)&&t.push({iris:A,gesture:"looking up"}),d&&t.push({iris:A,gesture:"looking center"})}return t},In=e=>{if(!e)return[];let t=[];for(let n=0;n0){let r=o.reduce((A,a)=>(A.position[2]||0)<(a.position[2]||0)?A:a);t.push({hand:n,gesture:`${r.name} forward`});let s=o.reduce((A,a)=>A.position[1][s[0]*t[0],s[1]*t[1]]);return{startPoint:n,endPoint:o,palmLandmarks:r,confidence:e.confidence}}function wt(e,t=1.5){let n=W2(e),o=kt(e),r=[t*o[0]/2,t*o[1]/2],s=[n[0]-r[0],n[1]-r[1]],A=[n[0]+r[0],n[1]+r[1]];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function Et(e){let t=W2(e),n=kt(e),r=Math.max(...n)/2,s=[t[0]-r,t[1]-r],A=[t[0]+r,t[1]+r];return{startPoint:s,endPoint:A,palmLandmarks:e.palmLandmarks}}function PA(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function Fn(e,t){let n=Math.PI/2-Math.atan2(-(t[1]-e[1]),t[0]-e[0]);return PA(n)}var On=(e,t)=>[[1,0,e],[0,1,t],[0,0,1]];function Ze(e,t){let n=0;for(let o=0;o[A.x,A.y]),this.anchorsTensor=W.tensor2d(this.anchors),this.inputSize=((s=(r=(o=(n=this==null?void 0:this.model)==null?void 0:n.inputs)==null?void 0:o[0])==null?void 0:r.shape)==null?void 0:s[2])||0,this.inputSizeTensor=W.tensor1d([this.inputSize,this.inputSize]),this.doubleInputSizeTensor=W.tensor1d([this.inputSize*2,this.inputSize*2])}normalizeBoxes(t){let n={};n.boxOffsets=W.slice(t,[0,0],[-1,2]),n.boxSizes=W.slice(t,[0,2],[-1,2]),n.div=W.div(n.boxOffsets,this.inputSizeTensor),n.boxCenterPoints=W.add(n.div,this.anchorsTensor),n.halfBoxSizes=W.div(n.boxSizes,this.doubleInputSizeTensor),n.sub=W.sub(n.boxCenterPoints,n.halfBoxSizes),n.startPoints=W.mul(n.sub,this.inputSizeTensor),n.add=W.add(n.boxCenterPoints,n.halfBoxSizes),n.endPoints=W.mul(n.add,this.inputSizeTensor);let o=W.concat2d([n.startPoints,n.endPoints],1);return Object.keys(n).forEach(r=>W.dispose(n[r])),o}normalizeLandmarks(t,n){let o={};o.reshape=W.reshape(t,[-1,7,2]),o.div=W.div(o.reshape,this.inputSizeTensor),o.landmarks=W.add(o.div,this.anchors[n]?this.anchors[n]:0);let r=W.mul(o.landmarks,this.inputSizeTensor);return Object.keys(o).forEach(s=>W.dispose(o[s])),r}async predict(t,n){var a;let o={};o.resize=W.image.resizeBilinear(t,[this.inputSize,this.inputSize]),o.div=W.div(o.resize,C.tf127),o.image=W.sub(o.div,C.tf1),o.batched=this.model.execute(o.image),o.predictions=W.squeeze(o.batched),o.slice=W.slice(o.predictions,[0,0],[-1,1]),o.sigmoid=W.sigmoid(o.slice),o.scores=W.squeeze(o.sigmoid);let r=await o.scores.data();o.boxes=W.slice(o.predictions,[0,1],[-1,4]),o.norm=this.normalizeBoxes(o.boxes),o.nms=await W.image.nonMaxSuppressionAsync(o.norm,o.scores,3*(((a=n.hand)==null?void 0:a.maxDetected)||1),n.hand.iouThreshold,n.hand.minConfidence);let s=await o.nms.array(),A=[];for(let l of s){let c={};c.box=W.slice(o.norm,[l,0],[1,-1]),c.slice=W.slice(o.predictions,[l,5],[1,14]),c.norm=this.normalizeLandmarks(c.slice,l),c.palmLandmarks=W.reshape(c.norm,[-1,2]);let x=await c.box.data(),i=x.slice(0,2),y=x.slice(2,4),d=await c.palmLandmarks.array(),p={startPoint:i,endPoint:y,palmLandmarks:d,confidence:r[l]},f=Dn(p,[(t.shape[2]||1)/this.inputSize,(t.shape[1]||0)/this.inputSize]);A.push(f),Object.keys(c).forEach(b=>W.dispose(c[b]))}return Object.keys(o).forEach(l=>W.dispose(o[l])),A}};var U0=Z(H());var zA=5,Vn=1.65,Zn=[0,5,9,13,17,1,2],SA=0,jA=2,Xn=0,St=class{constructor(t,n){k(this,"handDetector");k(this,"handPoseModel");k(this,"inputSize");k(this,"storedBoxes");k(this,"skipped");k(this,"detectedHands");var o,r,s;this.handDetector=t,this.handPoseModel=n,this.inputSize=((s=(r=(o=this.handPoseModel)==null?void 0:o.inputs)==null?void 0:r[0].shape)==null?void 0:s[2])||0,this.storedBoxes=[],this.skipped=Number.MAX_SAFE_INTEGER,this.detectedHands=0}calculateLandmarksBoundingBox(t){let n=t.map(A=>A[0]),o=t.map(A=>A[1]),r=[Math.min(...n),Math.min(...o)],s=[Math.max(...n),Math.max(...o)];return{startPoint:r,endPoint:s}}getBoxForPalmLandmarks(t,n){let o=t.map(s=>Q5([...s,1],n)),r=this.calculateLandmarksBoundingBox(o);return wt(Et(r),zA)}getBoxForHandLandmarks(t){let n=this.calculateLandmarksBoundingBox(t),o=wt(Et(n),Vn);o.palmLandmarks=[];for(let r=0;r[A[0]*(d[0]-this.inputSize/2),A[1]*(d[1]-this.inputSize/2),A[2]*d[2]]),l=J5(o,[0,0]),c=a.map(d=>[...Q5(d,l),d[2]]),x=Bn(r),i=[...W2(n),1],y=[Ze(i,x[0]),Ze(i,x[1])];return c.map(d=>[Math.trunc(d[0]+y[0]),Math.trunc(d[1]+y[1]),Math.trunc(d[2])])}async estimateHands(t,n){let o=!1,r,s=(n.hand.skipTime||0)>g()-Xn,A=this.skipped<(n.hand.skipFrames||0);n.skipAllowed&&s&&A&&(r=await this.handDetector.predict(t,n),this.skipped=0),n.skipAllowed&&this.skipped++,r&&r.length>0&&(r.length!==this.detectedHands&&this.detectedHands!==n.hand.maxDetected||!n.hand.landmarks)&&(this.detectedHands=0,this.storedBoxes=[...r],this.storedBoxes.length>0&&(o=!0));let a=[];for(let l=0;l=n.hand.minConfidence/4){let S=U0.reshape(m,[-1,3]),P=await S.array();U0.dispose(m),U0.dispose(S);let I=this.transformRawCoords(P,f,x,p),q=this.getBoxForHandLandmarks(I);this.storedBoxes[l]={...q,confidence:h};let t0={landmarks:I,confidence:h,boxConfidence:c.confidence,fingerConfidence:h,box:{topLeft:q.startPoint,bottomRight:q.endPoint}};a.push(t0)}else this.storedBoxes[l]=null;U0.dispose(m)}else{let x=wt(Et(c),Vn),i={confidence:c.confidence,boxConfidence:c.confidence,fingerConfidence:0,box:{topLeft:x.startPoint,bottomRight:x.endPoint},landmarks:[]};a.push(i)}}return this.storedBoxes=this.storedBoxes.filter(l=>l!==null),this.detectedHands=a.length,a.length>n.hand.maxDetected&&(a.length=n.hand.maxDetected),a}};var qn={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],palm:[0]},a2,i2,Un;async function _5(e,t){let n=await Un.estimateHands(e,t);if(!n)return[];let o=[];for(let r=0;rn[r].landmarks[i]);let A=n[r].landmarks,a=[Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,0,0],l=[0,0,0,0];if(A&&A.length>0){for(let x of A)x[0]a[2]&&(a[2]=x[0]),x[1]>a[3]&&(a[3]=x[1]);a[2]-=a[0],a[3]-=a[1],l=[a[0]/(e.shape[2]||0),a[1]/(e.shape[1]||0),a[2]/(e.shape[2]||0),a[3]/(e.shape[1]||0)]}else a=n[r].box?[Math.trunc(Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.max(0,n[r].box.topLeft[1])),Math.trunc(Math.min(e.shape[2]||0,n[r].box.bottomRight[0])-Math.max(0,n[r].box.topLeft[0])),Math.trunc(Math.min(e.shape[1]||0,n[r].box.bottomRight[1])-Math.max(0,n[r].box.topLeft[1]))]:[0,0,0,0],l=[n[r].box.topLeft[0]/(e.shape[2]||0),n[r].box.topLeft[1]/(e.shape[1]||0),(n[r].box.bottomRight[0]-n[r].box.topLeft[0])/(e.shape[2]||0),(n[r].box.bottomRight[1]-n[r].box.topLeft[1])/(e.shape[1]||0)];let c=Pt(A);o.push({id:r,score:Math.round(100*n[r].confidence)/100,boxScore:Math.round(100*n[r].boxConfidence)/100,fingerScore:Math.round(100*n[r].fingerConfidence)/100,label:"hand",box:a,boxRaw:l,keypoints:A,annotations:s,landmarks:c})}return o}async function Yn(e){var n,o;R.initial&&(a2=null,i2=null),!a2||!i2?[a2,i2]=await Promise.all([e.hand.enabled?O((n=e.hand.detector)==null?void 0:n.modelPath):null,e.hand.landmarks?O((o=e.hand.skeleton)==null?void 0:o.modelPath):null]):(e.debug&&u("cached model:",a2.modelUrl),e.debug&&u("cached model:",i2.modelUrl));let t=a2?new zt(a2):void 0;return t&&i2&&(Un=new St(t,i2)),[a2,i2]}var Q=Z(H());var f0=[null,null],IA=["StatefulPartitionedCall/Postprocessor/Slice","StatefulPartitionedCall/Postprocessor/ExpandDims_1"],Xe=[[0,0],[0,0]],OA=["hand","fist","pinch","point","face","tip","pinchtip"],Jn=4,Qn=1.6,LA=512,CA=1.4,jt=Number.MAX_SAFE_INTEGER,$5=0,ke=[0,0],y0={boxes:[],hands:[]},_n={thumb:[1,2,3,4],index:[5,6,7,8],middle:[9,10,11,12],ring:[13,14,15,16],pinky:[17,18,19,20],base:[0],palm:[0,17,13,9,5,1,0]};async function $n(e){var t;if(R.initial&&(f0[0]=null),f0[0])e.debug&&u("cached model:",f0[0].modelUrl);else{J2(["tensorlistreserve","enter","tensorlistfromtensor","merge","loopcond","switch","exit","tensorliststack","nextiteration","tensorlistsetitem","tensorlistgetitem","reciprocal","shape","split","where"],e),f0[0]=await O((t=e.hand.detector)==null?void 0:t.modelPath);let n=f0[0].executor?Object.values(f0[0].modelSignature.inputs):void 0;Xe[0][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Xe[0][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return f0[0]}async function eo(e){var t;if(R.initial&&(f0[1]=null),f0[1])e.debug&&u("cached model:",f0[1].modelUrl);else{f0[1]=await O((t=e.hand.skeleton)==null?void 0:t.modelPath);let n=f0[1].executor?Object.values(f0[1].modelSignature.inputs):void 0;Xe[1][0]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[1].size):0,Xe[1][1]=Array.isArray(n)?parseInt(n[0].tensorShape.dim[2].size):0}return f0[1]}async function WA(e,t){let n=[];if(!e||!f0[0])return n;let o={},r=(e.shape[2]||1)/(e.shape[1]||1),s=Math.min(Math.round((e.shape[1]||0)/8)*8,LA),A=Math.round(s*r/8)*8;o.resize=Q.image.resizeBilinear(e,[s,A]),o.cast=Q.cast(o.resize,"int32"),[o.rawScores,o.rawBoxes]=await f0[0].executeAsync(o.cast,IA),o.boxes=Q.squeeze(o.rawBoxes,[0,2]),o.scores=Q.squeeze(o.rawScores,[0]);let a=Q.unstack(o.scores,1);Q.dispose(a[Jn]),a.splice(Jn,1),o.filtered=Q.stack(a,1),Q.dispose(a),o.max=Q.max(o.filtered,1),o.argmax=Q.argMax(o.filtered,1);let l=0;o.nms=await Q.image.nonMaxSuppressionAsync(o.boxes,o.max,(t.hand.maxDetected||0)+1,t.hand.iouThreshold||0,t.hand.minConfidence||1);let c=await o.nms.data(),x=await o.max.data(),i=await o.argmax.data();for(let y of Array.from(c)){let d=Q.slice(o.boxes,y,1),p=await d.data();Q.dispose(d);let f=[p[1],p[0],p[3]-p[1],p[2]-p[0]],b=st(f,CA),M=[Math.trunc(f[0]*ke[0]),Math.trunc(f[1]*ke[1]),Math.trunc(f[2]*ke[0]),Math.trunc(f[3]*ke[1])],T=x[y],m=OA[i[y]],h={id:l++,score:T,box:M,boxRaw:b,label:m};n.push(h)}return Object.keys(o).forEach(y=>Q.dispose(o[y])),n.sort((y,d)=>d.score-y.score),n.length>(t.hand.maxDetected||1)&&(n.length=t.hand.maxDetected||1),n}async function e1(e,t,n){let o={id:t.id,score:Math.round(100*t.score)/100,boxScore:Math.round(100*t.score)/100,fingerScore:0,box:t.box,boxRaw:t.boxRaw,label:t.label,keypoints:[],landmarks:{},annotations:{}};if(e&&f0[1]&&n.hand.landmarks&&t.score>(n.hand.minConfidence||0)){let r={},s=[t.boxRaw[1],t.boxRaw[0],t.boxRaw[3]+t.boxRaw[1],t.boxRaw[2]+t.boxRaw[0]];r.crop=Q.image.cropAndResize(e,[s],[0],[Xe[1][0],Xe[1][1]],"bilinear"),r.div=Q.div(r.crop,C.tf255),[r.score,r.keypoints]=f0[1].execute(r.div,["Identity_1","Identity"]);let A=(await r.score.data())[0],a=(100-Math.trunc(100/(1+Math.exp(A))))/100;if(a>=(n.hand.minConfidence||0)){o.fingerScore=a,r.reshaped=Q.reshape(r.keypoints,[-1,3]);let x=(await r.reshaped.array()).map(i=>[i[0]/Xe[1][1],i[1]/Xe[1][0],i[2]||0]).map(i=>[i[0]*t.boxRaw[2],i[1]*t.boxRaw[3],i[2]||0]);o.keypoints=x.map(i=>[ke[0]*(i[0]+t.boxRaw[0]),ke[1]*(i[1]+t.boxRaw[1]),i[2]||0]),o.landmarks=Pt(o.keypoints);for(let i of Object.keys(_n))o.annotations[i]=_n[i].map(y=>o.landmarks&&o.keypoints[y]?o.keypoints[y]:null)}Object.keys(r).forEach(l=>Q.dispose(r[l]))}return o}async function t1(e,t){var r,s;if(!((r=f0[0])!=null&&r.executor)||!((s=f0[1])!=null&&s.executor)||!f0[0].inputs[0].shape||!f0[1].inputs[0].shape)return[];ke=[e.shape[2]||0,e.shape[1]||0],jt++;let n=(t.hand.skipTime||0)>g()-$5,o=jt<(t.hand.skipFrames||0);return t.skipAllowed&&n&&o?y0.hands:new Promise(async A=>{let a=3*(t.hand.skipTime||0)>g()-$5,l=jt<3*(t.hand.skipFrames||0);t.skipAllowed&&y0.hands.length===t.hand.maxDetected?y0.hands=await Promise.all(y0.boxes.map(x=>e1(e,x,t))):t.skipAllowed&&a&&l&&y0.hands.length>0?y0.hands=await Promise.all(y0.boxes.map(x=>e1(e,x,t))):(y0.boxes=await WA(e,t),$5=g(),y0.hands=await Promise.all(y0.boxes.map(x=>e1(e,x,t))),jt=0);let c=[...y0.boxes];if(y0.boxes.length=0,t.cacheSensitivity>0)for(let x=0;x.05&&i.box[3]/(e.shape[1]||1)>.05&&y0.hands[x].fingerScore&&y0.hands[x].fingerScore>(t.hand.minConfidence||0)){let y=st(i.box,Qn),d=st(i.boxRaw,Qn);y0.boxes.push({...c[x],box:y,boxRaw:d})}}for(let x=0;x({face:[],body:[],hand:[],gesture:[],object:[],persons:[],performance:{},timestamp:0,width:0,height:0,error:e});var D2={};ze(D2,{connected:()=>It,horizontal:()=>n1,kpt:()=>Nt,relative:()=>r1,vertical:()=>o1});var Nt=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],n1=[["leftEye","rightEye"],["leftEar","rightEar"],["leftShoulder","rightShoulder"],["leftElbow","rightElbow"],["leftWrist","rightWrist"],["leftHip","rightHip"],["leftKnee","rightKnee"],["leftAnkle","rightAnkle"]],o1=[["leftKnee","leftShoulder"],["rightKnee","rightShoulder"],["leftAnkle","leftKnee"],["rightAnkle","rightKnee"]],r1=[[["leftHip","rightHip"],["leftShoulder","rightShoulder"]],[["leftElbow","rightElbow"],["leftShoulder","rightShoulder"]]],It={leftLeg:["leftHip","leftKnee","leftAnkle"],rightLeg:["rightHip","rightKnee","rightAnkle"],torso:["leftShoulder","rightShoulder","rightHip","leftHip","leftShoulder"],leftArm:["leftShoulder","leftElbow","leftWrist"],rightArm:["rightShoulder","rightElbow","rightWrist"],head:[]};var w=he(),s1=0;function no(e,t){var A,a,l,c,x,i,y,d,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,A0;let n=g();if(!e)return he();let o=Date.now()-e.timestamp,r=o<1e3?8-Math.log(o+1):1;if(e.canvas&&(w.canvas=e.canvas),e.error&&(w.error=e.error),!w.body||e.body.length!==w.body.length)w.body=JSON.parse(JSON.stringify(e.body));else for(let v=0;v((r-1)*w.body[v].box[X]+B)/r),n0=e.body[v].boxRaw.map((B,X)=>((r-1)*w.body[v].boxRaw[X]+B)/r),U=e.body[v].keypoints.map((B,X)=>{var z,ee,we,Ee,T0,P2,M1,P1,k1;return{score:B.score,part:B.part,position:[w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].position[0]||0)+(B.position[0]||0))/r:B.position[0],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].position[1]||0)+(B.position[1]||0))/r:B.position[1],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].position[2]||0)+(B.position[2]||0))/r:B.position[2]],positionRaw:[w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].positionRaw[0]||0)+(B.positionRaw[0]||0))/r:B.positionRaw[0],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].positionRaw[1]||0)+(B.positionRaw[1]||0))/r:B.positionRaw[1],w.body[v].keypoints[X]?((r-1)*(w.body[v].keypoints[X].positionRaw[2]||0)+(B.positionRaw[2]||0))/r:B.positionRaw[2]],distance:[w.body[v].keypoints[X]?((r-1)*(((z=w.body[v].keypoints[X].distance)==null?void 0:z[0])||0)+(((ee=B.distance)==null?void 0:ee[0])||0))/r:(we=B.distance)==null?void 0:we[0],w.body[v].keypoints[X]?((r-1)*(((Ee=w.body[v].keypoints[X].distance)==null?void 0:Ee[1])||0)+(((T0=B.distance)==null?void 0:T0[1])||0))/r:(P2=B.distance)==null?void 0:P2[1],w.body[v].keypoints[X]?((r-1)*(((M1=w.body[v].keypoints[X].distance)==null?void 0:M1[2])||0)+(((P1=B.distance)==null?void 0:P1[2])||0))/r:(k1=B.distance)==null?void 0:k1[2]]}}),g0={},m0={connected:{}};(A=t.body.modelPath)!=null&&A.includes("efficientpose")?m0=it:(a=t.body.modelPath)!=null&&a.includes("blazepose")?m0=ot:(l=t.body.modelPath)!=null&&l.includes("movenet")&&(m0=D2);for(let[B,X]of Object.entries(m0.connected)){let z=[];for(let ee=0;eeT0.part===X[ee]),Ee=U.find(T0=>T0.part===X[ee+1]);we&&Ee&&z.push([we.position,Ee.position])}g0[B]=z}w.body[v]={...e.body[v],box:V,boxRaw:n0,keypoints:U,annotations:g0}}if(!w.hand||e.hand.length!==w.hand.length)w.hand=JSON.parse(JSON.stringify(e.hand));else for(let v=0;v((r-1)*w.hand[v].box[B]+m0)/r),n0=e.hand[v].boxRaw.map((m0,B)=>((r-1)*w.hand[v].boxRaw[B]+m0)/r);w.hand[v].keypoints.length!==e.hand[v].keypoints.length&&(w.hand[v].keypoints=e.hand[v].keypoints);let U=e.hand[v].keypoints&&e.hand[v].keypoints.length>0?e.hand[v].keypoints.map((m0,B)=>m0.map((X,z)=>((r-1)*(w.hand[v].keypoints[B][z]||1)+(X||0))/r)):[],g0={};if(Object.keys(w.hand[v].annotations).length!==Object.keys(e.hand[v].annotations).length)w.hand[v].annotations=e.hand[v].annotations,g0=w.hand[v].annotations;else if(e.hand[v].annotations)for(let m0 of Object.keys(e.hand[v].annotations))g0[m0]=(i=(x=(c=e.hand[v])==null?void 0:c.annotations)==null?void 0:x[m0])!=null&&i[0]?e.hand[v].annotations[m0].map((B,X)=>B.map((z,ee)=>((r-1)*w.hand[v].annotations[m0][X][ee]+z)/r)):null;w.hand[v]={...e.hand[v],box:V,boxRaw:n0,keypoints:U,annotations:g0}}if(!w.face||e.face.length!==w.face.length)w.face=JSON.parse(JSON.stringify(e.face));else for(let v=0;v((r-1)*w.face[v].box[g0]+U)/r),n0=e.face[v].boxRaw.map((U,g0)=>((r-1)*w.face[v].boxRaw[g0]+U)/r);if(e.face[v].rotation){let U={matrix:[0,0,0,0,0,0,0,0,0],angle:{roll:0,yaw:0,pitch:0},gaze:{bearing:0,strength:0}};U.matrix=(y=e.face[v].rotation)==null?void 0:y.matrix,U.angle={roll:((r-1)*(((p=(d=w.face[v].rotation)==null?void 0:d.angle)==null?void 0:p.roll)||0)+(((b=(f=e.face[v].rotation)==null?void 0:f.angle)==null?void 0:b.roll)||0))/r,yaw:((r-1)*(((T=(M=w.face[v].rotation)==null?void 0:M.angle)==null?void 0:T.yaw)||0)+(((h=(m=e.face[v].rotation)==null?void 0:m.angle)==null?void 0:h.yaw)||0))/r,pitch:((r-1)*(((P=(S=w.face[v].rotation)==null?void 0:S.angle)==null?void 0:P.pitch)||0)+(((q=(I=e.face[v].rotation)==null?void 0:I.angle)==null?void 0:q.pitch)||0))/r},U.gaze={bearing:((r-1)*(((t0=w.face[v].rotation)==null?void 0:t0.gaze.bearing)||0)+(((G=e.face[v].rotation)==null?void 0:G.gaze.bearing)||0))/r,strength:((r-1)*((($=w.face[v].rotation)==null?void 0:$.gaze.strength)||0)+(((A0=e.face[v].rotation)==null?void 0:A0.gaze.strength)||0))/r},w.face[v]={...e.face[v],rotation:U,box:V,boxRaw:n0}}else w.face[v]={...e.face[v],box:V,boxRaw:n0}}if(!w.object||e.object.length!==w.object.length)w.object=JSON.parse(JSON.stringify(e.object));else for(let v=0;v((r-1)*w.object[v].box[g0]+U)/r),n0=e.object[v].boxRaw.map((U,g0)=>((r-1)*w.object[v].boxRaw[g0]+U)/r);w.object[v]={...e.object[v],box:V,boxRaw:n0}}if(e.persons){let v=e.persons;if(!w.persons||v.length!==w.persons.length)w.persons=JSON.parse(JSON.stringify(v));else for(let V=0;V((r-1)*w.persons[V].box[U]+n0)/r)}e.gesture&&(w.gesture=e.gesture),w.width=e.width,w.height=e.height;let s=g();return s1=R.perfadd?s1+Math.round(s-n):Math.round(s-n),e.performance&&(w.performance={...e.performance,interpolate:s1}),w}var s0=Z(H());var j0;async function A1(e){return!j0||R.initial?j0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",j0.modelUrl),j0}async function oo(e,t){var r;if(j0||(j0=await A1(t)),!(j0!=null&&j0.executor)||!((r=j0==null?void 0:j0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=s0.image.resizeBilinear(e,[j0.inputs[0].shape?j0.inputs[0].shape[1]:0,j0.inputs[0].shape?j0.inputs[0].shape[2]:0],!1),n.norm=s0.div(n.resize,C.tf255),n.res=j0.execute(n.norm),n.squeeze=s0.squeeze(n.res,[0]),[n.bgRaw,n.fgRaw]=s0.unstack(n.squeeze,2),n.fg=s0.softmax(n.fgRaw),n.mul=s0.mul(n.fg,C.tf255),n.expand=s0.expandDims(n.mul,2),n.output=s0.image.resizeBilinear(n.expand,[e.shape[1]||0,e.shape[2]||0]);let o;switch(t.segmentation.mode||"default"){case"default":n.input=s0.squeeze(e),n.concat=s0.concat([n.input,n.output],-1),o=s0.cast(n.concat,"int32");break;case"alpha":o=s0.cast(n.output,"int32");break;default:o=s0.tensor(0)}return Object.keys(n).forEach(s=>s0.dispose(n[s])),o}var Ot={};ze(Ot,{distance:()=>a1,find:()=>BA,similarity:()=>FA});function a1(e,t,n={order:2,multiplier:25}){if(!e||!e)return Number.MAX_SAFE_INTEGER;let o=0;for(let r=0;r{if(e===0)return 1;let s=(1-(t===2?Math.sqrt(e):e**(1/t))/100-n)/(o-n);return Math.max(Math.min(s,1),0)};function FA(e,t,n={order:2,multiplier:25,min:.2,max:.8}){let o=a1(e,t,n);return so(o,n.order||2,n.min||0,n.max||1)}function BA(e,t,n={order:2,multiplier:25,threshold:0,min:.2,max:.8}){if(!Array.isArray(e)||!Array.isArray(t)||e.length<64||t.length===0)return{index:-1,distance:Number.POSITIVE_INFINITY,similarity:0};let o=Number.MAX_SAFE_INTEGER,r=-1;for(let A=0;AH2,validateModel:()=>Ht});var co=Z(H());var qe=Z(H());var Ao=.005,Y0={keypoints:[],padding:[[0,0],[0,0],[0,0],[0,0]]};function i1(e){for(let t of n1){let n=e.keypoints.findIndex(r=>r.part===t[0]),o=e.keypoints.findIndex(r=>r.part===t[1]);if(e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[0]r&&r.part===t[0]),o=e.keypoints.findIndex(r=>r&&r.part===t[1]);e.keypoints[n]&&e.keypoints[o]&&e.keypoints[n].position[1]c&&c.part===t[0]),r=e.keypoints.findIndex(c=>c&&c.part===t[1]),s=e.keypoints.findIndex(c=>c&&c.part===n[0]),A=e.keypoints.findIndex(c=>c&&c.part===n[1]);if(!e.keypoints[s]||!e.keypoints[A])continue;let a=e.keypoints[o]?[Math.abs(e.keypoints[s].position[0]-e.keypoints[o].position[0]),Math.abs(e.keypoints[A].position[0]-e.keypoints[o].position[0])]:[0,0],l=e.keypoints[r]?[Math.abs(e.keypoints[A].position[0]-e.keypoints[r].position[0]),Math.abs(e.keypoints[s].position[0]-e.keypoints[r].position[0])]:[0,0];if(a[0]>a[1]||l[0]>l[1]){let c=e.keypoints[o];e.keypoints[o]=e.keypoints[r],e.keypoints[r]=c}}}function ao(e){for(let t=0;te.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0,e.shape[2]>e.shape[1]?Math.trunc((e.shape[2]-e.shape[1])/2):0],[e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0,e.shape[1]>e.shape[2]?Math.trunc((e.shape[1]-e.shape[2])/2):0],[0,0]],n.pad=qe.pad(e,Y0.padding),n.resize=qe.image.resizeBilinear(n.pad,[t,t]);let o=qe.cast(n.resize,"int32");return Object.keys(n).forEach(A=>qe.dispose(n[A])),o}function lo(e,t){e.keypoints=e.keypoints.filter(o=>o==null?void 0:o.position);for(let o of e.keypoints)o.position=[o.position[0]*(t[0]+Y0.padding[2][0]+Y0.padding[2][1])/t[0]-Y0.padding[2][0],o.position[1]*(t[1]+Y0.padding[1][0]+Y0.padding[1][1])/t[1]-Y0.padding[1][0]],o.positionRaw=[o.position[0]/t[0],o.position[1]/t[1]];let n=ve(e.keypoints.map(o=>o.position),t);return e.box=n.box,e.boxRaw=n.boxRaw,e}var h0,Lt=0,l1=Number.MAX_SAFE_INTEGER,l2={boxes:[],bodies:[],last:0};async function xo(e){var t;return R.initial&&(h0=null),h0?e.debug&&u("cached model:",h0.modelUrl):(J2(["size"],e),h0=await O(e.body.modelPath)),Lt=(h0==null?void 0:h0.executor)&&((t=h0==null?void 0:h0.inputs)==null?void 0:t[0].shape)?h0.inputs[0].shape[2]:0,Lt<64&&(Lt=256),h0}function GA(e,t,n){let o=e[0][0],r=[],s=0;for(let x=0;xt.body.minConfidence){let i=[o[x][1],o[x][0]];r.push({score:Math.round(100*s)/100,part:Nt[x],positionRaw:i,position:[Math.round((n.shape[2]||0)*i[0]),Math.round((n.shape[1]||0)*i[1])]})}s=r.reduce((x,i)=>i.score>x?i.score:x,0);let A=[],a=ve(r.map(x=>x.position),[n.shape[2],n.shape[1]]),l={};for(let[x,i]of Object.entries(It)){let y=[];for(let d=0;db.part===i[d]),f=r.find(b=>b.part===i[d+1]);p&&f&&p.score>(t.body.minConfidence||0)&&f.score>(t.body.minConfidence||0)&&y.push([p.position,f.position])}l[x]=y}let c={id:0,score:s,box:a.box,boxRaw:a.boxRaw,keypoints:r,annotations:l};return i1(c),A.push(c),A}function VA(e,t,n){let o=[];for(let r=0;rt.body.minConfidence){let a=[];for(let i=0;i<17;i++){let y=s[3*i+2];if(y>t.body.minConfidence){let d=[s[3*i+1],s[3*i+0]];a.push({part:Nt[i],score:Math.round(100*y)/100,positionRaw:d,position:[Math.round((n.shape[2]||0)*d[0]),Math.round((n.shape[1]||0)*d[1])]})}}let l=ve(a.map(i=>i.position),[n.shape[2],n.shape[1]]),c={};for(let[i,y]of Object.entries(It)){let d=[];for(let p=0;pM.part===y[p]),b=a.find(M=>M.part===y[p+1]);f&&b&&f.score>(t.body.minConfidence||0)&&b.score>(t.body.minConfidence||0)&&d.push([f.position,b.position])}c[i]=d}let x={id:r,score:A,box:l.box,boxRaw:l.boxRaw,keypoints:[...a],annotations:c};i1(x),o.push(x)}}return o.sort((r,s)=>s.score-r.score),o.length>t.body.maxDetected&&(o.length=t.body.maxDetected),o}async function c1(e,t){var r;if(!(h0!=null&&h0.executor)||!((r=h0==null?void 0:h0.inputs)!=null&&r[0].shape))return[];t.skipAllowed||(l2.boxes.length=0),l1++;let n=(t.body.skipTime||0)>g()-l2.last,o=l1<(t.body.skipFrames||0);return t.skipAllowed&&n&&o?l2.bodies:new Promise(async s=>{let A={};l1=0,A.input=io(e,Lt),A.res=h0==null?void 0:h0.execute(A.input),l2.last=g();let a=await A.res.array();l2.bodies=A.res.shape[2]===17?GA(a,t,e):VA(a,t,e);for(let l of l2.bodies)lo(l,[e.shape[2]||1,e.shape[1]||1]),ao(l.keypoints);Object.keys(A).forEach(l=>co.dispose(A[l])),s(l2.bodies)})}var w0=Z(H());var Ae,Ct=[],fo=0,d1=Number.MAX_SAFE_INTEGER,Dt=0,Wt=2.5;async function mo(e){if(!Ae||R.initial){Ae=await O(e.object.modelPath);let t=Ae!=null&&Ae.executor?Object.values(Ae.modelSignature.inputs):void 0;Dt=Array.isArray(t)?parseInt(t[0].tensorShape.dim[2].size):416}else e.debug&&u("cached model:",Ae.modelUrl);return Ae}async function ZA(e,t,n){var c,x;let o=0,r=[],s=Dt;for(let i of[1,2,4]){let y=i*13,d=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)===x2.length)),p=await d.array(),f=w0.squeeze(e.find(m=>m.shape[1]===y**2&&(m.shape[2]||0)(n.object.minConfidence||0)&&h!==61){let P=(.5+Math.trunc(m%y))/y,I=(.5+Math.trunc(m/y))/y,q=T[m].map(U=>U*(y/i/s)),[t0,G]=[P-Wt/i*q[0],I-Wt/i*q[1]],[$,A0]=[P+Wt/i*q[2]-t0,I+Wt/i*q[3]-G],v=[t0,G,$,A0];v=v.map(U=>Math.max(0,Math.min(U,1)));let V=[v[0]*t[0],v[1]*t[1],v[2]*t[0],v[3]*t[1]],n0={id:o++,score:Math.round(100*S)/100,class:h+1,label:x2[h].label,box:V.map(U=>Math.trunc(U)),boxRaw:v};r.push(n0)}}w0.dispose([d,f,b,M])}let A=r.map(i=>[i.boxRaw[1],i.boxRaw[0],i.boxRaw[3],i.boxRaw[2]]),a=r.map(i=>i.score),l=[];if(A&&A.length>0){let i=await w0.image.nonMaxSuppressionAsync(A,a,n.object.maxDetected||0,n.object.iouThreshold,n.object.minConfidence);l=Array.from(await i.data()),w0.dispose(i)}return r=r.filter((i,y)=>l.includes(y)).sort((i,y)=>y.score-i.score),r}async function x1(e,t){if(!(Ae!=null&&Ae.executor))return[];let n=(t.object.skipTime||0)>g()-fo,o=d1<(t.object.skipFrames||0);return t.skipAllowed&&n&&o&&Ct.length>0?(d1++,Ct):(d1=0,!R.kernels.includes("mod")||!R.kernels.includes("sparsetodense")?Ct:new Promise(async r=>{let s=[e.shape[2]||0,e.shape[1]||0],A=w0.image.resizeBilinear(e,[Dt,Dt],!1),a=w0.div(A,C.tf255),l=w0.transpose(a,[0,3,1,2]),c;t.object.enabled&&(c=Ae.execute(l)),fo=g();let x=await ZA(c,s,t);Ct=x,w0.dispose([A,a,l,...c]),r(x)}))}var D0=Z(H());var B2=["nose","leftEye","rightEye","leftEar","rightEar","leftShoulder","rightShoulder","leftElbow","rightElbow","leftWrist","rightWrist","leftHip","rightHip","leftKnee","rightKnee","leftAnkle","rightAnkle"],XA=B2.length,F2=B2.reduce((e,t,n)=>(e[t]=n,e),{}),qA=[["leftHip","leftShoulder"],["leftElbow","leftShoulder"],["leftElbow","leftWrist"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["rightHip","rightShoulder"],["rightElbow","rightShoulder"],["rightElbow","rightWrist"],["rightHip","rightKnee"],["rightKnee","rightAnkle"],["leftShoulder","rightShoulder"],["leftHip","rightHip"]],Li=qA.map(([e,t])=>[F2[e],F2[t]]),uo=[["nose","leftEye"],["leftEye","leftEar"],["nose","rightEye"],["rightEye","rightEar"],["nose","leftShoulder"],["leftShoulder","leftElbow"],["leftElbow","leftWrist"],["leftShoulder","leftHip"],["leftHip","leftKnee"],["leftKnee","leftAnkle"],["nose","rightShoulder"],["rightShoulder","rightElbow"],["rightElbow","rightWrist"],["rightShoulder","rightHip"],["rightHip","rightKnee"],["rightKnee","rightAnkle"]];function ho(e){let t=e.reduce(({maxX:n,maxY:o,minX:r,minY:s},{position:{x:A,y:a}})=>({maxX:Math.max(n,A),maxY:Math.max(o,a),minX:Math.min(r,A),minY:Math.min(s,a)}),{maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY});return[t.minX,t.minY,t.maxX-t.minX,t.maxY-t.minY]}function bo(e,[t,n],[o,r]){let s=t/o,A=n/r,a=(c,x)=>({id:x,score:c.score,boxRaw:[c.box[0]/r,c.box[1]/o,c.box[2]/r,c.box[3]/o],box:[Math.trunc(c.box[0]*A),Math.trunc(c.box[1]*s),Math.trunc(c.box[2]*A),Math.trunc(c.box[3]*s)],keypoints:c.keypoints.map(({score:i,part:y,position:d})=>({score:i,part:y,position:[Math.trunc(d.x*A),Math.trunc(d.y*s)],positionRaw:[d.x/o,d.y/o]})),annotations:{}});return e.map((c,x)=>a(c,x))}var Ft=class{constructor(t,n){k(this,"priorityQueue");k(this,"numberOfElements");k(this,"getElementValue");this.priorityQueue=new Array(t),this.numberOfElements=-1,this.getElementValue=n}enqueue(t){this.priorityQueue[++this.numberOfElements]=t,this.swim(this.numberOfElements)}dequeue(){let t=this.priorityQueue[0];return this.exchange(0,this.numberOfElements--),this.sink(0),this.priorityQueue[this.numberOfElements+1]=null,t}empty(){return this.numberOfElements===-1}size(){return this.numberOfElements+1}all(){return this.priorityQueue.slice(0,this.numberOfElements+1)}max(){return this.priorityQueue[0]}swim(t){for(;t>0&&this.less(Math.floor(t/2),t);)this.exchange(t,Math.floor(t/2)),t=Math.floor(t/2)}sink(t){for(;2*t<=this.numberOfElements;){let n=2*t;if(nn?n:e}function go(e,t,n,o){let r=n-e,s=o-t;return r*r+s*s}function p1(e,t){return{x:e.x+t.x,y:e.y+t.y}}var K0,YA=["MobilenetV1/offset_2/BiasAdd","MobilenetV1/heatmap_2/BiasAdd","MobilenetV1/displacement_fwd_2/BiasAdd","MobilenetV1/displacement_bwd_2/BiasAdd"],Bt=1,R2=16,KA=50**2;function To(e,t,n,o,r,s,A=2){let a=M=>({y:s.get(M.y,M.x,e),x:s.get(M.y,M.x,s.shape[2]/2+e)}),l=(M,T,m)=>({y:m1(Math.round(M.y/R2),0,T-1),x:m1(Math.round(M.x/R2),0,m-1)}),[c,x]=o.shape,i=l(t.position,c,x),y=a(i),p=p1(t.position,y);for(let M=0;M[F2[y],F2[d]]),A=s.map(([,y])=>y),a=s.map(([y])=>y),l=t.shape[2],c=A.length,x=new Array(l),i=f1(e.part,R2,n);x[e.part.id]={score:e.score,part:B2[e.part.id],position:i};for(let y=c-1;y>=0;--y){let d=A[y],p=a[y];x[d]&&!x[p]&&(x[p]=To(y,x[d],p,t,n,r))}for(let y=0;yt){a=!1;break}if(!a)break}return a}function _A(e,t){let[n,o,r]=t.shape,s=new Ft(n*o*r,({score:A})=>A);for(let A=0;A{var A;let s=(A=r[o])==null?void 0:A.position;return s?go(n,t,s.y,s.x)<=KA:!1})}function $A(e,t){return t.reduce((o,{position:r,score:s},A)=>(vo(e,r,A)||(o+=s),o),0)/t.length}function ea(e,t,n,o,r,s){let A=[],a=_A(s,t);for(;A.lengthd.score>s);let i=$A(A,x),y=ho(x);i>s&&A.push({keypoints:x,box:y,score:Math.round(100*i)/100})}return A}async function u1(e,t){if(!(K0!=null&&K0.executor))return[];let n=D0.tidy(()=>{if(!K0.inputs[0].shape)return[];let A=D0.image.resizeBilinear(e,[K0.inputs[0].shape[2],K0.inputs[0].shape[1]]),a=D0.sub(D0.div(D0.cast(A,"float32"),127.5),1),c=K0.execute(a,YA).map(x=>D0.squeeze(x,[0]));return c[1]=D0.sigmoid(c[1]),c}),o=await Promise.all(n.map(A=>A.buffer()));for(let A of n)D0.dispose(A);let r=ea(o[0],o[1],o[2],o[3],t.body.maxDetected,t.body.minConfidence);return K0.inputs[0].shape?bo(r,[e.shape[1],e.shape[2]],[K0.inputs[0].shape[2],K0.inputs[0].shape[1]]):[]}async function Ro(e){return!K0||R.initial?K0=await O(e.body.modelPath):e.debug&&u("cached model:",K0.modelUrl),K0}var F=Z(H());var be,ta=["fgr","pha","r1o","r2o","r3o","r4o"],b0={},b1=0;function ko(e){F.dispose([b0.r1i,b0.r2i,b0.r3i,b0.r4i,b0.downsample_ratio]),b0.r1i=F.tensor(0),b0.r2i=F.tensor(0),b0.r3i=F.tensor(0),b0.r4i=F.tensor(0),b1=e.segmentation.ratio||.5,b0.downsample_ratio=F.tensor(b1)}async function g1(e){return!be||R.initial?be=await O(e.segmentation.modelPath):e.debug&&u("cached model:",be.modelUrl),ko(e),be}var Po=e=>F.tidy(()=>{let t=F.squeeze(e,[0]),n=F.mul(t,C.tf255);return F.cast(n,"int32")});function h1(e,t){let n=e?Po(e):F.fill([t.shape[1]||0,t.shape[2]||0,3],255,"int32"),o=t?Po(t):F.fill([e.shape[1]||0,e.shape[2]||0,1],255,"int32"),r=F.concat([n,o],-1);return F.dispose([n,o]),r}function na(e){return F.tidy(()=>{let t={};return t.unstack=F.unstack(e,-1),t.concat=F.concat(t.unstack,1),t.split=F.split(t.concat,4,1),t.stack=F.concat(t.split,2),t.squeeze=F.squeeze(t.stack,[0]),t.expand=F.expandDims(t.squeeze,-1),t.add=F.add(t.expand,1),t.mul=F.mul(t.add,127.5),t.cast=F.cast(t.mul,"int32"),t.tile=F.tile(t.cast,[1,1,3]),t.alpha=F.fill([t.tile.shape[0]||0,t.tile.shape[1]||0,1],255,"int32"),F.concat([t.tile,t.alpha],-1)})}async function wo(e,t){if(be||(be=await g1(t)),!(be!=null&&be.executor))return null;b0.src=F.div(e,255),b1!==t.segmentation.ratio&&ko(t);let[n,o,r,s,A,a]=await be.executeAsync(b0,ta),l;switch(t.segmentation.mode||"default"){case"default":l=h1(n,o);break;case"alpha":l=h1(null,o);break;case"foreground":l=h1(n,null);break;case"state":l=na(r);break;default:l=F.tensor(0)}return F.dispose([b0.src,n,o,b0.r1i,b0.r2i,b0.r3i,b0.r4i]),[b0.r1i,b0.r2i,b0.r3i,b0.r4i]=[r,s,A,a],l}var k0=Z(H());var N0;async function T1(e){return!N0||R.initial?N0=await O(e.segmentation.modelPath):e.debug&&u("cached model:",N0.modelUrl),N0}async function zo(e,t){var r;if(N0||(N0=await T1(t)),!(N0!=null&&N0.executor)||!((r=N0==null?void 0:N0.inputs)!=null&&r[0].shape))return null;let n={};n.resize=k0.image.resizeBilinear(e,[N0.inputs[0].shape?N0.inputs[0].shape[1]:0,N0.inputs[0].shape?N0.inputs[0].shape[2]:0],!1),n.norm=k0.div(n.resize,C.tf255),n.res=N0.execute(n.norm),n.squeeze=k0.squeeze(n.res,[0]),n.alpha=k0.image.resizeBilinear(n.squeeze,[e.shape[1]||0,e.shape[2]||0]),n.mul=k0.mul(n.alpha,C.tf255);let o;switch(t.segmentation.mode||"default"){case"default":n.input=k0.squeeze(e),n.concat=k0.concat([n.input,n.mul],-1),o=k0.cast(n.concat,"int32");break;case"alpha":o=k0.cast(n.mul,"int32");break;default:o=k0.tensor(0)}return Object.keys(n).forEach(s=>k0.dispose(n[s])),o}function Ht(e,t,n){var c,x;if(!t||!((c=e==null?void 0:e.config)!=null&&c.validateModels))return null;let o=["const","placeholder","noop","pad","squeeze","add","sub","mul","div"],r=["biasadd","fusedbatchnormv3","matmul","switch","shape","merge","split","broadcastto"],s=[],A=[],a=t.modelUrl,l=t.executor;if((x=l==null?void 0:l.graph)!=null&&x.nodes)for(let i of Object.values(l.graph.nodes)){let y=i.op.toLowerCase();s.includes(y)||s.push(y)}else!l&&e.config.debug&&u("model not loaded",n);for(let i of s)!o.includes(i)&&!r.includes(i)&&!e.env.kernels.includes(i)&&!e.env.kernels.includes(i.replace("_",""))&&!e.env.kernels.includes(i.replace("native",""))&&!e.env.kernels.includes(i.replace("v2",""))&&A.push(i);return e.config.debug&&A.length>0&&u("model validation failed:",n,A),A.length>0?{name:n,missing:A,ops:s,url:a}:null}var H2=class{constructor(t){k(this,"instance");k(this,"models",{});this.models={},this.instance=t}stats(){let t=0,n=0,o=0;for(let s of Object.values(E0))t+=s.sizeFromManifest,n+=s.sizeLoadedWeights,o+=s.sizeDesired;let r=o>0?n/o:0;return{numLoadedModels:Object.values(E0).length,numDefinedModels:Object.keys(this.models).length,percentageLoaded:r,totalSizeFromManifest:t,totalSizeWeights:n,totalSizeLoading:o,modelStats:Object.values(E0)}}reset(){for(let t of Object.keys(this.models))this.models[t]=null}async load(t){var o,r,s,A,a,l,c,x,i,y,d,p,f,b,M,T,m,h,S,P,I,q,t0,G,$,A0,v;R.initial&&this.reset(),t&&(this.instance=t);let n={};n.blazeface=this.instance.config.face.enabled&&!this.models.blazeface?g3(this.instance.config):null,n.antispoof=this.instance.config.face.enabled&&((o=this.instance.config.face.antispoof)==null?void 0:o.enabled)&&!this.models.antispoof?X3(this.instance.config):null,n.liveness=this.instance.config.face.enabled&&((r=this.instance.config.face.liveness)==null?void 0:r.enabled)&&!this.models.liveness?K3(this.instance.config):null,n.faceres=this.instance.config.face.enabled&&((s=this.instance.config.face.description)==null?void 0:s.enabled)&&!this.models.faceres?B3(this.instance.config):null,n.emotion=this.instance.config.face.enabled&&((A=this.instance.config.face.emotion)==null?void 0:A.enabled)&&!this.models.emotion?C3(this.instance.config):null,n.iris=this.instance.config.face.enabled&&((a=this.instance.config.face.iris)==null?void 0:a.enabled)&&!((l=this.instance.config.face.attention)!=null&&l.enabled)&&!this.models.iris?k3(this.instance.config):null,n.facemesh=this.instance.config.face.enabled&&((c=this.instance.config.face.mesh)==null?void 0:c.enabled)&&!this.models.facemesh?j3(this.instance.config):null,n.gear=this.instance.config.face.enabled&&((x=this.instance.config.face.gear)==null?void 0:x.enabled)&&!this.models.gear?$3(this.instance.config):null,n.ssrnetage=this.instance.config.face.enabled&&((i=this.instance.config.face.ssrnet)==null?void 0:i.enabled)&&!this.models.ssrnetage?on(this.instance.config):null,n.ssrnetgender=this.instance.config.face.enabled&&((y=this.instance.config.face.ssrnet)==null?void 0:y.enabled)&&!this.models.ssrnetgender?an(this.instance.config):null,n.mobilefacenet=this.instance.config.face.enabled&&((d=this.instance.config.face.mobilefacenet)==null?void 0:d.enabled)&&!this.models.mobilefacenet?yn(this.instance.config):null,n.insightface=this.instance.config.face.enabled&&((p=this.instance.config.face.insightface)==null?void 0:p.enabled)&&!this.models.insightface?hn(this.instance.config):null,n.blazepose=this.instance.config.body.enabled&&!this.models.blazepose&&((f=this.instance.config.body.modelPath)==null?void 0:f.includes("blazepose"))?n3(this.instance.config):null,n.blazeposedetect=this.instance.config.body.enabled&&!this.models.blazeposedetect&&this.instance.config.body.detector&&this.instance.config.body.detector.modelPath?t3(this.instance.config):null,n.efficientpose=this.instance.config.body.enabled&&!this.models.efficientpose&&((b=this.instance.config.body.modelPath)==null?void 0:b.includes("efficientpose"))?i3(this.instance.config):null,n.movenet=this.instance.config.body.enabled&&!this.models.movenet&&((M=this.instance.config.body.modelPath)==null?void 0:M.includes("movenet"))?xo(this.instance.config):null,n.posenet=this.instance.config.body.enabled&&!this.models.posenet&&((T=this.instance.config.body.modelPath)==null?void 0:T.includes("posenet"))?Ro(this.instance.config):null,n.handtrack=this.instance.config.hand.enabled&&!this.models.handtrack&&((h=(m=this.instance.config.hand.detector)==null?void 0:m.modelPath)==null?void 0:h.includes("handtrack"))?$n(this.instance.config):null,n.handskeleton=this.instance.config.hand.enabled&&this.instance.config.hand.landmarks&&!this.models.handskeleton&&((P=(S=this.instance.config.hand.detector)==null?void 0:S.modelPath)==null?void 0:P.includes("handtrack"))?eo(this.instance.config):null,(q=(I=this.instance.config.hand.detector)==null?void 0:I.modelPath)!=null&&q.includes("handdetect")&&([n.handpose,n.handskeleton]=this.models.handpose?[null,null]:await Yn(this.instance.config)),n.centernet=this.instance.config.object.enabled&&!this.models.centernet&&((t0=this.instance.config.object.modelPath)==null?void 0:t0.includes("centernet"))?s3(this.instance.config):null,n.nanodet=this.instance.config.object.enabled&&!this.models.nanodet&&((G=this.instance.config.object.modelPath)==null?void 0:G.includes("nanodet"))?mo(this.instance.config):null,n.selfie=this.instance.config.segmentation.enabled&&!this.models.selfie&&(($=this.instance.config.segmentation.modelPath)==null?void 0:$.includes("selfie"))?T1(this.instance.config):null,n.meet=this.instance.config.segmentation.enabled&&!this.models.meet&&((A0=this.instance.config.segmentation.modelPath)==null?void 0:A0.includes("meet"))?A1(this.instance.config):null,n.rvm=this.instance.config.segmentation.enabled&&!this.models.rvm&&((v=this.instance.config.segmentation.modelPath)==null?void 0:v.includes("rvm"))?g1(this.instance.config):null;for(let[V,n0]of Object.entries(n))n0!=null&&n0.then&&n0.then(U=>this.models[V]=U);await Promise.all(Object.values(n))}list(){let t=Object.keys(this.models).map(n=>{var o;return{name:n,loaded:this.models[n]!==null,size:0,url:this.models[n]?(o=this.models[n])==null?void 0:o.modelUrl:null}});for(let n of t){let o=Object.keys(E0).find(r=>r.startsWith(n.name));!o||(n.size=E0[o].sizeLoadedWeights,n.url=E0[o].url)}return t}loaded(){return this.list().filter(o=>o.loaded).map(o=>o.name)}validate(){let t=[];for(let n of Object.keys(this.models)){let o=this.models[n];if(!o)continue;let r=Ht(this.instance,o,n);r&&t.push(r)}return t}};function jo(e,t,n,o,r){var a,l,c,x,i,y;let s=0,A=[];for(let d of e){let p={id:s++,face:d,body:null,hands:{left:null,right:null},gestures:[],box:[0,0,0,0]};for(let h of t)d.box[0]>h.box[0]&&d.box[0]h.box[1]&&d.box[1]+d.box[3]p.body.box[0]&&h.box[0]+h.box[2]p.body.box[1]&&h.box[1]+h.box[3]p.body.box[0]&&h.box[1]+h.box[3]>p.body.box[1]&&h.box[1]+h.box[3]{h&&h.length===4&&(f.push(h[0],h[0]+h[2]),b.push(h[1],h[1]+h[3]))};M(p.face.box),M((x=p.body)==null?void 0:x.box),M((i=p.hands.left)==null?void 0:i.box),M((y=p.hands.right)==null?void 0:y.box);let T=Math.min(...f),m=Math.min(...b);p.box=[T,m,Math.max(...f)-T,Math.max(...b)-m],(r==null?void 0:r[1])&&(r==null?void 0:r[2])&&(p.boxRaw=[p.box[0]/r[2],p.box[1]/r[1],p.box[2]/r[2],p.box[3]/r[1]]),A.push(p)}return A}var d0=Z(H());var Gt=` /9j/4AAQSkZJRgABAQEAYABgAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAABgAAAAAQAAAGAAAAABcGFpbnQu bmV0IDQuMi4xMwAA/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxob @@ -837,4 +837,4 @@ AAAAAAJAAAAAAAAAAAAAABAJEAAAAAAAAAAAAAAAIEoBKAAAAAAAAAAAAAAABAlAAAAAAAIAAAAA BAkBAkBAkBAlACEgMZjdjbFW8bWrEx8YWANb6Fp+bfwab+vLDKMFK9qxH5L0bAr8OPRPKz2AY7J2 SbAjYZAI2E7AIEgIEgIEgMdkSy2NgY7MdlmyNoBXsxmFuyNgVTVjNV3KjlBRNTlXTVHKCrlIqt5T lBhEMohlFerLlBjEMohMVTEARDKCITsAk2AEgAAAkAAAAAAAAAAAAAAAAAAAAAAAASAAAAAAAAD/ -2Q==`;async function sa(e){let t=(r,s="application/octet-stream")=>fetch(`data:${s};base64,${r}`).then(A=>A.blob()),n,o;switch(e.config.warmup){case"face":n=await t(Gt);break;case"body":case"full":n=await t(Vt);break;default:n=null}if(n){let r=await createImageBitmap(n);o=await e.detect(r,e.config),r.close()}return o}async function Aa(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+Gt;break;case"full":case"body":n="data:image/jpeg;base64,"+Vt;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(R.Image)o=new R.Image;else{t(void 0);return}o.onload=async()=>{let r=te(o.naturalWidth,o.naturalHeight);if(!r)u("Warmup: Canvas not found"),t(void 0);else{let s=r.getContext("2d");s&&s.drawImage(o,0,0);let A=await e.image(r,!0),a=A.tensor?await e.detect(A.tensor,e.config):void 0;t(a)}},n?o.src=n:t(void 0)})}async function aa(e){let t=r=>Buffer.from(r,"base64"),n;e.config.warmup==="face"?n=t(Gt):n=t(Vt);let o;if("node"in x0&&x0.getBackend()==="tensorflow"){let r=x0.node.decodeJpeg(n),s=x0.expandDims(r,0);e.tf.dispose(r),o=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&u("Warmup tfjs-node not loaded");return o}async function ia(e){let t;return typeof createImageBitmap=="function"?t=await sa(e):typeof Image!="undefined"||R.Canvas!==void 0?t=await Aa(e):t=await aa(e),t}async function la(e){var a,l,c,d;if(!x0.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=x0.getBackend(),n=x0.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;x0.env().set("ENGINE_COMPILE_ONLY",!0);let o=x0.engine().state.numTensors,r=[];for(let[i,y]of Object.entries(e.models.models)){if(!y)continue;let x=(y==null?void 0:y.modelSignature)&&((l=(a=y==null?void 0:y.inputs)==null?void 0:a[0])==null?void 0:l.shape)?[...y.inputs[0].shape]:[1,64,64,3],p=(y==null?void 0:y.modelSignature)&&((d=(c=y==null?void 0:y.inputs)==null?void 0:c[0])==null?void 0:d.dtype)?y.inputs[0].dtype:"float32";for(let b=0;bx0.dispose(M)):x0.dispose(b)}catch(b){e.config.debug&&u("compile fail model:",i)}x0.dispose(f)}let s=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&u("compile pass:",{models:r,kernels:s.length}),x0.env().set("ENGINE_COMPILE_ONLY",!1);let A=x0.engine().state.numTensors;A-o>0&&u("tensor leak:",A-o)}async function No(e,t){await I2(e,!1);let n=g();return e.state="warmup",t&&(e.config=a0(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?he():new Promise(async o=>{await e.models.load(),await la(e);let r=await ia(e),s=g();e.config.debug&&u("warmup",e.config.warmup,Math.round(s-n),"ms"),e.emit("warmup"),o(r)})}var M2,G2,V2,Zt,Ue,R1=class{constructor(t){k(this,"version");k(this,"config");k(this,"result");k(this,"state");k(this,"process");k(this,"tf");k(this,"env",R);k(this,"draw",nt);k(this,"match",Ot);k(this,"models");k(this,"events");k(this,"faceTriangulation");k(this,"faceUVMap");k(this,"performance");me(this,M2,void 0);me(this,G2,void 0);me(this,V2,void 0);k(this,"analyze",(...t)=>{if(!G0(this,G2))return;let n=this.tf.engine().state.numTensors,o=G0(this,M2);ge(this,M2,n);let r=n-o;r!==0&&u(...t,r)});me(this,Zt,t=>{if(!G0(this,V2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof ae.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});k(this,"webcam",new K2);k(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});me(this,Ue,{});let n=(ae.version.tfjs||ae.version_core).replace(/-(.*)/,"");Ye.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,Ye.modelBasePath=R.browser?"../models/":"file://models/",this.version=$t,Object.defineProperty(this,"version",{value:$t}),this.config=JSON.parse(JSON.stringify(Ye)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=a0(this.config,t)),B1(this.config),this.tf=ae,this.state="idle",ge(this,M2,0),ge(this,G2,!1),ge(this,V2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new H2(this),A5(),this.result=he(),this.process={tensor:null,canvas:null},this.faceTriangulation=N3,this.faceUVMap=I3,Ht(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&u("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(Ye)),this.config.backend=t,Qt(),R.initial=!0}validate(t){let n=Yt(Ye,t||this.config);return n.length===0&&(this.config=a0(this.config,t)),n}now(){return g()}image(t,n=!1){return U2(t,this.config,n)}async segmentation(t,n){var s,A,a;if(n&&(this.config=a0(this.config,n)),!this.config.segmentation.enabled)return null;let o=await U2(t,this.config);if(!o.tensor)return null;let r=null;return(s=this.config.segmentation.modelPath)!=null&&s.includes("rvm")&&(r=await wo(o.tensor,this.config)),(A=this.config.segmentation.modelPath)!=null&&A.includes("meet")&&(r=await oo(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("selfie")&&(r=await zo(o.tensor,this.config)),ae.dispose(o.tensor),r}compare(t,n){return F1(this.config,t,n)}async init(){await I2(this,!0),await this.tf.ready(),Qt()}async load(t){this.state="load";let n=g(),o=Object.values(this.models.models).filter(A=>A).length;t&&(this.config=a0(this.config,t)),this.env.initial&&(await I2(this,!1)||u("error: backend check failed"),await ae.ready(),this.env.browser&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),await this.models.load(this),this.env.initial&&this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models.models).filter(A=>A).length!==o&&(this.models.validate(),this.emit("load"));let s=Math.trunc(g()-n);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return no(t,this.config)}async warmup(t){let n=g(),o=await No(this,t),r=g();return this.performance.warmup=Math.trunc(r-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),r={},s=0;for(let a of o.kernels){let l=Number(a.kernelTimeMs)||0;r[a.name]?r[a.name]+=l:r[a.name]=l,s+=l}let A=[];Object.entries(r).forEach(a=>A.push({kernel:a[0],time:a[1],perc:0}));for(let a of A)a.perc=Math.round(1e3*a.time/s)/1e3,a.time=Math.round(1e3*a.time)/1e3;return A.sort((a,l)=>l.time-a.time),A.length=20,A}async detect(t,n){return this.state="detect",new Promise(async o=>{var b,M,T,m,h,S,P,I,q,t0,G,$,A0,v,V,n0,U,g0,m0,B,X;this.state="config";let r;this.config=a0(this.config,n),this.state="check";let s=G0(this,Zt).call(this,t);s&&(u(s,t),this.emit("error"),o(he(s)));let A=g();await this.load(),r=g(),this.state="image";let a=await U2(t,this.config);if(this.process=a,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Get Image:"),!a.tensor){this.config.debug&&u("could not convert input to tensor"),this.emit("error"),o(he("could not convert input to tensor"));return}this.emit("image"),r=g(),this.config.skipAllowed=await D1(this.config,a.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Check Changed:");let l=[],c=[],d=[],i=[];this.state="detect:face",this.config.async?(l=this.config.face.enabled?U5(this,a.tensor):[],this.performance.face&&delete this.performance.face):(r=g(),l=this.config.face.enabled?await U5(this,a.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(l=await l),this.analyze("Start Body:"),this.state="detect:body";let y=this.config.body.maxDetected===-1?a0(this.config,{body:{maxDetected:this.config.face.enabled?1*l.length:1}}):this.config;this.config.async?((b=this.config.body.modelPath)!=null&&b.includes("posenet")?c=this.config.body.enabled?u1(a.tensor,y):[]:(M=this.config.body.modelPath)!=null&&M.includes("blazepose")?c=this.config.body.enabled?x5(a.tensor,y):[]:(T=this.config.body.modelPath)!=null&&T.includes("efficientpose")?c=this.config.body.enabled?h5(a.tensor,y):[]:(m=this.config.body.modelPath)!=null&&m.includes("movenet")&&(c=this.config.body.enabled?c1(a.tensor,y):[]),this.performance.body&&delete this.performance.body):(r=g(),(h=this.config.body.modelPath)!=null&&h.includes("posenet")?c=this.config.body.enabled?await u1(a.tensor,y):[]:(S=this.config.body.modelPath)!=null&&S.includes("blazepose")?c=this.config.body.enabled?await x5(a.tensor,y):[]:(P=this.config.body.modelPath)!=null&&P.includes("efficientpose")?c=this.config.body.enabled?await h5(a.tensor,y):[]:(I=this.config.body.modelPath)!=null&&I.includes("movenet")&&(c=this.config.body.enabled?await c1(a.tensor,y):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let x=this.config.hand.maxDetected===-1?a0(this.config,{hand:{maxDetected:this.config.face.enabled?2*l.length:1}}):this.config;this.config.async?((t0=(q=this.config.hand.detector)==null?void 0:q.modelPath)!=null&&t0.includes("handdetect")?d=this.config.hand.enabled?_5(a.tensor,x):[]:($=(G=this.config.hand.detector)==null?void 0:G.modelPath)!=null&&$.includes("handtrack")&&(d=this.config.hand.enabled?t1(a.tensor,x):[]),this.performance.hand&&delete this.performance.hand):(r=g(),(v=(A0=this.config.hand.detector)==null?void 0:A0.modelPath)!=null&&v.includes("handdetect")?d=this.config.hand.enabled?await _5(a.tensor,x):[]:(n0=(V=this.config.hand.detector)==null?void 0:V.modelPath)!=null&&n0.includes("handtrack")&&(d=this.config.hand.enabled?await t1(a.tensor,x):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((U=this.config.object.modelPath)!=null&&U.includes("nanodet")?i=this.config.object.enabled?d1(a.tensor,this.config):[]:(g0=this.config.object.modelPath)!=null&&g0.includes("centernet")&&(i=this.config.object.enabled?f5(a.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(r=g(),(m0=this.config.object.modelPath)!=null&&m0.includes("nanodet")?i=this.config.object.enabled?await d1(a.tensor,this.config):[]:(B=this.config.object.modelPath)!=null&&B.includes("centernet")&&(i=this.config.object.enabled?await f5(a.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([l,c,d,i]=await Promise.all([l,c,d,i])),this.state="detect:gesture";let p=[];this.config.gesture.enabled&&(r=g(),p=[...jn(l),...Sn(c),...In(d),...Nn(l)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-A):Math.trunc(g()-A);let f=((X=this.process.tensor)==null?void 0:X.shape)||[0,0,0,0];this.result={face:l,body:c,hand:d,gesture:p,object:i,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:f[2],height:f[1],get persons(){return jo(l,c,d,p,f)}},ae.dispose(a.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(G0(this,Ue)[t.id]||(this.config.debug&&u("video start",t.id),G0(this,Ue)[t.id]=!0),!t.paused&&G0(this,Ue)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),G0(this,Ue)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&u("video stop",t.id),G0(this,Ue)[t.id]=!1)}};M2=new WeakMap,G2=new WeakMap,V2=new WeakMap,Zt=new WeakMap,Ue=new WeakMap;0&&(module.exports={Env,Human,defaults,draw,empty,env,match,models}); +2Q==`;async function sa(e){let t=(r,s="application/octet-stream")=>fetch(`data:${s};base64,${r}`).then(A=>A.blob()),n,o;switch(e.config.warmup){case"face":n=await t(Gt);break;case"body":case"full":n=await t(Vt);break;default:n=null}if(n){let r=await createImageBitmap(n);o=await e.detect(r,e.config),r.close()}return o}async function Aa(e){return new Promise(t=>{let n;switch(e.config.warmup){case"face":n="data:image/jpeg;base64,"+Gt;break;case"full":case"body":n="data:image/jpeg;base64,"+Vt;break;default:n=""}let o;if(typeof Image!="undefined")o=new Image;else if(R.Image)o=new R.Image;else{t(void 0);return}o.onload=async()=>{let r=te(o.naturalWidth,o.naturalHeight);if(!r)u("Warmup: Canvas not found"),t(void 0);else{let s=r.getContext("2d");s&&s.drawImage(o,0,0);let A=await e.image(r,!0),a=A.tensor?await e.detect(A.tensor,e.config):void 0;t(a)}},n?o.src=n:t(void 0)})}async function aa(e){let t=r=>Buffer.from(r,"base64"),n;e.config.warmup==="face"?n=t(Gt):n=t(Vt);let o;if("node"in d0&&d0.getBackend()==="tensorflow"){let r=d0.node.decodeJpeg(n),s=d0.expandDims(r,0);e.tf.dispose(r),o=await e.detect(s,e.config),e.tf.dispose(s)}else e.config.debug&&u("Warmup tfjs-node not loaded");return o}async function ia(e){let t;return typeof createImageBitmap=="function"?t=await sa(e):typeof Image!="undefined"||R.Canvas!==void 0?t=await Aa(e):t=await aa(e),t}async function la(e){var a,l,c,x;if(!d0.env().flagRegistry.ENGINE_COMPILE_ONLY)return;let t=d0.getBackend(),n=d0.backend();if(t!=="webgl"&&t!=="humangl"||!(n!=null&&n.checkCompileCompletion))return;d0.env().set("ENGINE_COMPILE_ONLY",!0);let o=d0.engine().state.numTensors,r=[];for(let[i,y]of Object.entries(e.models.models)){if(!y)continue;let d=(y==null?void 0:y.modelSignature)&&((l=(a=y==null?void 0:y.inputs)==null?void 0:a[0])==null?void 0:l.shape)?[...y.inputs[0].shape]:[1,64,64,3],p=(y==null?void 0:y.modelSignature)&&((x=(c=y==null?void 0:y.inputs)==null?void 0:c[0])==null?void 0:x.dtype)?y.inputs[0].dtype:"float32";for(let b=0;bd0.dispose(M)):d0.dispose(b)}catch(b){e.config.debug&&u("compile fail model:",i)}d0.dispose(f)}let s=await n.checkCompileCompletionAsync();n.getUniformLocations(),e.config.debug&&u("compile pass:",{models:r,kernels:s.length}),d0.env().set("ENGINE_COMPILE_ONLY",!1);let A=d0.engine().state.numTensors;A-o>0&&u("tensor leak:",A-o)}async function No(e,t){await I2(e,!1);let n=g();return e.state="warmup",t&&(e.config=a0(e.config,t)),!e.config.warmup||e.config.warmup.length===0||e.config.warmup==="none"?he():new Promise(async o=>{await e.models.load(),await la(e);let r=await ia(e),s=g();e.config.debug&&u("warmup",e.config.warmup,Math.round(s-n),"ms"),e.emit("warmup"),o(r)})}var M2,G2,V2,Zt,Ue,R1=class{constructor(t){k(this,"version");k(this,"config");k(this,"result");k(this,"state");k(this,"process");k(this,"tf");k(this,"env",R);k(this,"draw",nt);k(this,"match",Ot);k(this,"models");k(this,"events");k(this,"faceTriangulation");k(this,"faceUVMap");k(this,"performance");me(this,M2,void 0);me(this,G2,void 0);me(this,V2,void 0);k(this,"analyze",(...t)=>{if(!G0(this,G2))return;let n=this.tf.engine().state.numTensors,o=G0(this,M2);ge(this,M2,n);let r=n-o;r!==0&&u(...t,r)});me(this,Zt,t=>{if(!G0(this,V2))return null;if(!t)return"input is not defined";if(this.env.node&&!(t instanceof ae.Tensor))return"input must be a tensor";try{this.tf.getBackend()}catch(n){return"backend not loaded"}return null});k(this,"webcam",new K2);k(this,"emit",t=>{var n;(n=this.events)!=null&&n.dispatchEvent&&this.events.dispatchEvent(new Event(t))});me(this,Ue,{});let n=(ae.version.tfjs||ae.version_core).replace(/-(.*)/,"");Ye.wasmPath=`https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@${n}/dist/`,Ye.modelBasePath=R.browser?"../models/":"file://models/",this.version=$t,Object.defineProperty(this,"version",{value:$t}),this.config=JSON.parse(JSON.stringify(Ye)),Object.seal(this.config),this.config.cacheModels=typeof indexedDB!="undefined",t&&(this.config=a0(this.config,t)),B1(this.config),this.tf=ae,this.state="idle",ge(this,M2,0),ge(this,G2,!1),ge(this,V2,!1),this.performance={},this.events=typeof EventTarget!="undefined"?new EventTarget:void 0,this.models=new H2(this),A5(),this.result=he(),this.process={tensor:null,canvas:null},this.faceTriangulation=N3,this.faceUVMap=I3,Ht(this,null,""),this.emit("create"),(this.config.debug||this.env.browser)&&u(`version: ${this.version}`),this.config.debug&&u(`tfjs version: ${this.tf.version["tfjs-core"]}`);let o=JSON.parse(JSON.stringify(this.env));delete o.kernels,delete o.initial,delete o.perfadd,this.config.debug&&u("environment:",o)}reset(){let t=this.config.backend;this.config=JSON.parse(JSON.stringify(Ye)),this.config.backend=t,Qt(),R.initial=!0}validate(t){let n=Yt(Ye,t||this.config);return n.length===0&&(this.config=a0(this.config,t)),n}now(){return g()}image(t,n=!1){return U2(t,this.config,n)}async segmentation(t,n){var s,A,a;if(n&&(this.config=a0(this.config,n)),!this.config.segmentation.enabled)return null;let o=await U2(t,this.config);if(!o.tensor)return null;let r=null;return(s=this.config.segmentation.modelPath)!=null&&s.includes("rvm")&&(r=await wo(o.tensor,this.config)),(A=this.config.segmentation.modelPath)!=null&&A.includes("meet")&&(r=await oo(o.tensor,this.config)),(a=this.config.segmentation.modelPath)!=null&&a.includes("selfie")&&(r=await zo(o.tensor,this.config)),ae.dispose(o.tensor),r}compare(t,n){return F1(this.config,t,n)}async init(){await I2(this,!0),await this.tf.ready(),Qt()}async load(t){this.state="load";let n=g(),o=Object.values(this.models.models).filter(A=>A).length;t&&(this.config=a0(this.config,t)),this.env.initial&&(await I2(this,!1)||u("error: backend check failed"),await ae.ready(),this.env.browser&&(this.config.debug&&u("configuration:",this.config),this.config.debug&&u("tf flags:",this.tf.ENV.flags))),await this.models.load(this),this.env.initial&&this.config.debug&&u("tf engine state:",this.tf.engine().state.numBytes,"bytes",this.tf.engine().state.numTensors,"tensors"),this.env.initial=!1,Object.values(this.models.models).filter(A=>A).length!==o&&(this.models.validate(),this.emit("load"));let s=Math.trunc(g()-n);s>(this.performance.loadModels||0)&&(this.performance.loadModels=this.env.perfadd?(this.performance.loadModels||0)+s:s)}next(t=this.result){return no(t,this.config)}async warmup(t){let n=g(),o=await No(this,t),r=g();return this.performance.warmup=Math.trunc(r-n),o}async profile(t,n){let o=await this.tf.profile(()=>this.detect(t,n)),r={},s=0;for(let a of o.kernels){let l=Number(a.kernelTimeMs)||0;r[a.name]?r[a.name]+=l:r[a.name]=l,s+=l}let A=[];Object.entries(r).forEach(a=>A.push({kernel:a[0],time:a[1],perc:0}));for(let a of A)a.perc=Math.round(1e3*a.time/s)/1e3,a.time=Math.round(1e3*a.time)/1e3;return A.sort((a,l)=>l.time-a.time),A.length=20,A}async detect(t,n){return this.state="detect",new Promise(async o=>{var b,M,T,m,h,S,P,I,q,t0,G,$,A0,v,V,n0,U,g0,m0,B,X;this.state="config";let r;this.config=a0(this.config,n),this.state="check";let s=G0(this,Zt).call(this,t);s&&(u(s,t),this.emit("error"),o(he(s)));let A=g();await this.load(),r=g(),this.state="image";let a=await U2(t,this.config);if(this.process=a,this.performance.inputProcess=this.env.perfadd?(this.performance.inputProcess||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Get Image:"),!a.tensor){this.config.debug&&u("could not convert input to tensor"),this.emit("error"),o(he("could not convert input to tensor"));return}this.emit("image"),r=g(),this.config.skipAllowed=await D1(this.config,a.tensor),this.config.filter.autoBrightness=(this.config.filter.autoBrightness||!1)&&this.config.skipAllowed,this.performance.totalFrames||(this.performance.totalFrames=0),this.performance.cachedFrames||(this.performance.cachedFrames=0),this.performance.totalFrames++,this.config.skipAllowed&&this.performance.cachedFrames++,this.performance.cacheCheck=this.env.perfadd?(this.performance.cacheCheck||0)+Math.trunc(g()-r):Math.trunc(g()-r),this.analyze("Check Changed:");let l=[],c=[],x=[],i=[];this.state="detect:face",this.config.async?(l=this.config.face.enabled?U5(this,a.tensor):[],this.performance.face&&delete this.performance.face):(r=g(),l=this.config.face.enabled?await U5(this,a.tensor):[],this.performance.face=this.env.perfadd?(this.performance.face||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.config.async&&(this.config.body.maxDetected===-1||this.config.hand.maxDetected===-1)&&(l=await l),this.analyze("Start Body:"),this.state="detect:body";let y=this.config.body.maxDetected===-1?a0(this.config,{body:{maxDetected:this.config.face.enabled?1*l.length:1}}):this.config;this.config.async?((b=this.config.body.modelPath)!=null&&b.includes("posenet")?c=this.config.body.enabled?u1(a.tensor,y):[]:(M=this.config.body.modelPath)!=null&&M.includes("blazepose")?c=this.config.body.enabled?d5(a.tensor,y):[]:(T=this.config.body.modelPath)!=null&&T.includes("efficientpose")?c=this.config.body.enabled?h5(a.tensor,y):[]:(m=this.config.body.modelPath)!=null&&m.includes("movenet")&&(c=this.config.body.enabled?c1(a.tensor,y):[]),this.performance.body&&delete this.performance.body):(r=g(),(h=this.config.body.modelPath)!=null&&h.includes("posenet")?c=this.config.body.enabled?await u1(a.tensor,y):[]:(S=this.config.body.modelPath)!=null&&S.includes("blazepose")?c=this.config.body.enabled?await d5(a.tensor,y):[]:(P=this.config.body.modelPath)!=null&&P.includes("efficientpose")?c=this.config.body.enabled?await h5(a.tensor,y):[]:(I=this.config.body.modelPath)!=null&&I.includes("movenet")&&(c=this.config.body.enabled?await c1(a.tensor,y):[]),this.performance.body=this.env.perfadd?(this.performance.body||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Body:"),this.analyze("Start Hand:"),this.state="detect:hand";let d=this.config.hand.maxDetected===-1?a0(this.config,{hand:{maxDetected:this.config.face.enabled?2*l.length:1}}):this.config;this.config.async?((t0=(q=this.config.hand.detector)==null?void 0:q.modelPath)!=null&&t0.includes("handdetect")?x=this.config.hand.enabled?_5(a.tensor,d):[]:($=(G=this.config.hand.detector)==null?void 0:G.modelPath)!=null&&$.includes("handtrack")&&(x=this.config.hand.enabled?t1(a.tensor,d):[]),this.performance.hand&&delete this.performance.hand):(r=g(),(v=(A0=this.config.hand.detector)==null?void 0:A0.modelPath)!=null&&v.includes("handdetect")?x=this.config.hand.enabled?await _5(a.tensor,d):[]:(n0=(V=this.config.hand.detector)==null?void 0:V.modelPath)!=null&&n0.includes("handtrack")&&(x=this.config.hand.enabled?await t1(a.tensor,d):[]),this.performance.hand=this.env.perfadd?(this.performance.hand||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Hand:"),this.analyze("Start Object:"),this.state="detect:object",this.config.async?((U=this.config.object.modelPath)!=null&&U.includes("nanodet")?i=this.config.object.enabled?x1(a.tensor,this.config):[]:(g0=this.config.object.modelPath)!=null&&g0.includes("centernet")&&(i=this.config.object.enabled?f5(a.tensor,this.config):[]),this.performance.object&&delete this.performance.object):(r=g(),(m0=this.config.object.modelPath)!=null&&m0.includes("nanodet")?i=this.config.object.enabled?await x1(a.tensor,this.config):[]:(B=this.config.object.modelPath)!=null&&B.includes("centernet")&&(i=this.config.object.enabled?await f5(a.tensor,this.config):[]),this.performance.object=this.env.perfadd?(this.performance.object||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.analyze("End Object:"),this.state="detect:await",this.config.async&&([l,c,x,i]=await Promise.all([l,c,x,i])),this.state="detect:gesture";let p=[];this.config.gesture.enabled&&(r=g(),p=[...jn(l),...Sn(c),...In(x),...Nn(l)],this.config.async?this.performance.gesture&&delete this.performance.gesture:this.performance.gesture=this.env.perfadd?(this.performance.gesture||0)+Math.trunc(g()-r):Math.trunc(g()-r)),this.performance.total=this.env.perfadd?(this.performance.total||0)+Math.trunc(g()-A):Math.trunc(g()-A);let f=((X=this.process.tensor)==null?void 0:X.shape)||[0,0,0,0];this.result={face:l,body:c,hand:x,gesture:p,object:i,performance:this.performance,canvas:this.process.canvas,timestamp:Date.now(),error:null,width:f[2],height:f[1],get persons(){return jo(l,c,x,p,f)}},ae.dispose(a.tensor),this.emit("detect"),this.state="idle",o(this.result)})}async sleep(t){return new Promise(n=>{setTimeout(n,t)})}async video(t,n=!0,o=0){n?(G0(this,Ue)[t.id]||(this.config.debug&&u("video start",t.id),G0(this,Ue)[t.id]=!0),!t.paused&&G0(this,Ue)[t.id]&&t.readyState>=2&&await this.detect(t),o>0&&await this.sleep(o),G0(this,Ue)[t.id]&&requestAnimationFrame(()=>this.video(t,n,o))):(this.config.debug&&u("video stop",t.id),G0(this,Ue)[t.id]=!1)}};M2=new WeakMap,G2=new WeakMap,V2=new WeakMap,Zt=new WeakMap,Ue=new WeakMap;0&&(module.exports={Env,Human,defaults,draw,empty,env,match,models}); diff --git a/package.json b/package.json index c553f228..fd6d9025 100644 --- a/package.json +++ b/package.json @@ -91,14 +91,14 @@ "@tensorflow/tfjs-node-gpu": "^4.1.0", "@types/node": "^18.11.18", "@types/offscreencanvas": "^2019.7.0", - "@typescript-eslint/eslint-plugin": "^5.47.1", - "@typescript-eslint/parser": "^5.47.1", + "@typescript-eslint/eslint-plugin": "^5.48.0", + "@typescript-eslint/parser": "^5.48.0", "@vladmandic/build": "^0.7.14", "@vladmandic/pilogger": "^0.4.6", "@vladmandic/tfjs": "github:vladmandic/tfjs", "canvas": "^2.11.0", - "esbuild": "^0.16.12", - "eslint": "8.30.0", + "esbuild": "^0.16.13", + "eslint": "8.31.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "^2.26.0", diff --git a/test/build.log b/test/build.log index b46ca36e..39691b62 100644 --- a/test/build.log +++ b/test/build.log @@ -1,50 +1,50 @@ -2022-12-21 14:14:44 DATA:  Build {"name":"@vladmandic/human","version":"3.0.1"} -2022-12-21 14:14:44 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.1"} -2022-12-21 14:14:44 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} -2022-12-21 14:14:44 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.18","typescript":"4.9.4","typedoc":"0.23.23","eslint":"8.30.0"} -2022-12-21 14:14:44 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} -2022-12-21 14:14:44 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} -2022-12-21 14:14:44 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} -2022-12-21 14:14:44 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} -2022-12-21 14:14:44 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670544,"outputBytes":317619} -2022-12-21 14:14:44 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} -2022-12-21 14:14:44 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670548,"outputBytes":317623} -2022-12-21 14:14:44 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} -2022-12-21 14:14:44 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671496,"outputBytes":317734} -2022-12-21 14:14:44 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} -2022-12-21 14:14:44 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":670290,"outputBytes":316195} -2022-12-21 14:14:44 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1138192} -2022-12-21 14:14:44 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1807812,"outputBytes":1450757} -2022-12-21 14:14:44 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1807812,"outputBytes":1894175} -2022-12-21 14:14:48 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} -2022-12-21 14:14:49 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true} -2022-12-21 14:14:49 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6082,"outputBytes":2872} -2022-12-21 14:14:49 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17572,"outputBytes":9456} -2022-12-21 14:14:58 STATE: Lint: {"locations":["**/*.json","src/**/*.ts","test/**/*.js","demo/**/*.js","**/*.md"],"files":169,"errors":0,"warnings":0} -2022-12-21 14:14:58 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} -2022-12-21 14:14:58 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} -2022-12-21 14:14:58 INFO:  Done... -2022-12-21 14:14:58 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} -2022-12-21 14:14:58 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} -2022-12-21 14:14:58 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} -2022-12-21 14:14:58 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} -2022-12-21 14:14:58 STATE: Filter: {"input":"types/tfjs-core.d.ts"} -2022-12-21 14:14:59 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":204} -2022-12-21 14:14:59 STATE: Filter: {"input":"types/human.d.ts"} -2022-12-21 14:14:59 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} -2022-12-21 14:14:59 STATE: Write: {"output":"dist/human.esm.d.ts"} -2022-12-21 14:14:59 STATE: Write: {"output":"dist/human.d.ts"} -2022-12-21 14:14:59 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} -2022-12-21 14:14:59 STATE: Write: {"output":"dist/human.node.d.ts"} -2022-12-21 14:14:59 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} -2022-12-21 14:14:59 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} -2022-12-21 14:14:59 STATE: Models {"folder":"./models","models":12} -2022-12-21 14:14:59 STATE: Models {"folder":"../human-models/models","models":41} -2022-12-21 14:14:59 STATE: Models {"folder":"../blazepose/model/","models":4} -2022-12-21 14:14:59 STATE: Models {"folder":"../anti-spoofing/model","models":1} -2022-12-21 14:14:59 STATE: Models {"folder":"../efficientpose/models","models":3} -2022-12-21 14:14:59 STATE: Models {"folder":"../insightface/models","models":5} -2022-12-21 14:14:59 STATE: Models {"folder":"../movenet/models","models":3} -2022-12-21 14:14:59 STATE: Models {"folder":"../nanodet/models","models":4} -2022-12-21 14:15:00 STATE: Models: {"count":55,"totalSize":372917743} -2022-12-21 14:15:00 INFO:  Human Build complete... {"logFile":"test/build.log"} +2023-01-03 14:23:58 DATA:  Build {"name":"@vladmandic/human","version":"3.0.1"} +2023-01-03 14:23:58 INFO:  Application: {"name":"@vladmandic/human","version":"3.0.1"} +2023-01-03 14:23:58 INFO:  Environment: {"profile":"production","config":".build.json","package":"package.json","tsconfig":true,"eslintrc":true,"git":true} +2023-01-03 14:23:58 INFO:  Toolchain: {"build":"0.7.14","esbuild":"0.15.18","typescript":"4.9.4","typedoc":"0.23.23","eslint":"8.31.0"} +2023-01-03 14:23:58 INFO:  Build: {"profile":"production","steps":["clean","compile","typings","typedoc","lint","changelog"]} +2023-01-03 14:23:58 STATE: Clean: {"locations":["dist/*","types/*","typedoc/*"]} +2023-01-03 14:23:58 STATE: Compile: {"name":"tfjs/browser/version","format":"esm","platform":"browser","input":"tfjs/tf-version.ts","output":"dist/tfjs.version.js","files":1,"inputBytes":1289,"outputBytes":361} +2023-01-03 14:23:58 STATE: Compile: {"name":"tfjs/nodejs/cpu","format":"cjs","platform":"node","input":"tfjs/tf-node.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":569,"outputBytes":924} +2023-01-03 14:23:58 STATE: Compile: {"name":"human/nodejs/cpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node.js","files":80,"inputBytes":670848,"outputBytes":317619} +2023-01-03 14:23:58 STATE: Compile: {"name":"tfjs/nodejs/gpu","format":"cjs","platform":"node","input":"tfjs/tf-node-gpu.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":577,"outputBytes":928} +2023-01-03 14:23:59 STATE: Compile: {"name":"human/nodejs/gpu","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-gpu.js","files":80,"inputBytes":670852,"outputBytes":317623} +2023-01-03 14:23:59 STATE: Compile: {"name":"tfjs/nodejs/wasm","format":"cjs","platform":"node","input":"tfjs/tf-node-wasm.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":665,"outputBytes":1876} +2023-01-03 14:23:59 STATE: Compile: {"name":"human/nodejs/wasm","format":"cjs","platform":"node","input":"src/human.ts","output":"dist/human.node-wasm.js","files":80,"inputBytes":671800,"outputBytes":317734} +2023-01-03 14:23:59 STATE: Compile: {"name":"tfjs/browser/esm/nobundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":2,"inputBytes":1375,"outputBytes":670} +2023-01-03 14:23:59 STATE: Compile: {"name":"human/browser/esm/nobundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm-nobundle.js","files":80,"inputBytes":670594,"outputBytes":316195} +2023-01-03 14:23:59 STATE: Compile: {"name":"tfjs/browser/esm/bundle","format":"esm","platform":"browser","input":"tfjs/tf-browser.ts","output":"dist/tfjs.esm.js","files":10,"inputBytes":1375,"outputBytes":1138192} +2023-01-03 14:23:59 STATE: Compile: {"name":"human/browser/iife/bundle","format":"iife","platform":"browser","input":"src/human.ts","output":"dist/human.js","files":80,"inputBytes":1808116,"outputBytes":1450757} +2023-01-03 14:23:59 STATE: Compile: {"name":"human/browser/esm/bundle","format":"esm","platform":"browser","input":"src/human.ts","output":"dist/human.esm.js","files":80,"inputBytes":1808116,"outputBytes":1894175} +2023-01-03 14:24:04 STATE: Typings: {"input":"src/human.ts","output":"types/lib","files":15} +2023-01-03 14:24:06 STATE: TypeDoc: {"input":"src/human.ts","output":"typedoc","objects":77,"generated":true} +2023-01-03 14:24:06 STATE: Compile: {"name":"demo/typescript","format":"esm","platform":"browser","input":"demo/typescript/index.ts","output":"demo/typescript/index.js","files":1,"inputBytes":6082,"outputBytes":2872} +2023-01-03 14:24:06 STATE: Compile: {"name":"demo/faceid","format":"esm","platform":"browser","input":"demo/faceid/index.ts","output":"demo/faceid/index.js","files":2,"inputBytes":17503,"outputBytes":9403} +2023-01-03 14:24:15 STATE: Lint: {"locations":["**/*.json","src/**/*.ts","test/**/*.js","demo/**/*.js","**/*.md"],"files":169,"errors":0,"warnings":0} +2023-01-03 14:24:15 STATE: ChangeLog: {"repository":"https://github.com/vladmandic/human","branch":"main","output":"CHANGELOG.md"} +2023-01-03 14:24:15 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs-core.d.ts","output":"types/tfjs-core.d.ts"} +2023-01-03 14:24:15 INFO:  Done... +2023-01-03 14:24:15 STATE: Copy: {"input":"node_modules/@vladmandic/tfjs/types/tfjs.d.ts","output":"types/tfjs.esm.d.ts"} +2023-01-03 14:24:15 STATE: Copy: {"input":"src/types/tsconfig.json","output":"types/tsconfig.json"} +2023-01-03 14:24:15 STATE: Copy: {"input":"src/types/eslint.json","output":"types/.eslintrc.json"} +2023-01-03 14:24:15 STATE: Copy: {"input":"src/types/tfjs.esm.d.ts","output":"dist/tfjs.esm.d.ts"} +2023-01-03 14:24:15 STATE: Filter: {"input":"types/tfjs-core.d.ts"} +2023-01-03 14:24:16 STATE: API-Extractor: {"succeeeded":true,"errors":0,"warnings":204} +2023-01-03 14:24:16 STATE: Filter: {"input":"types/human.d.ts"} +2023-01-03 14:24:16 STATE: Write: {"output":"dist/human.esm-nobundle.d.ts"} +2023-01-03 14:24:16 STATE: Write: {"output":"dist/human.esm.d.ts"} +2023-01-03 14:24:16 STATE: Write: {"output":"dist/human.d.ts"} +2023-01-03 14:24:16 STATE: Write: {"output":"dist/human.node-gpu.d.ts"} +2023-01-03 14:24:16 STATE: Write: {"output":"dist/human.node.d.ts"} +2023-01-03 14:24:16 STATE: Write: {"output":"dist/human.node-wasm.d.ts"} +2023-01-03 14:24:16 INFO:  Analyze models: {"folders":8,"result":"models/models.json"} +2023-01-03 14:24:16 STATE: Models {"folder":"./models","models":12} +2023-01-03 14:24:16 STATE: Models {"folder":"../human-models/models","models":41} +2023-01-03 14:24:16 STATE: Models {"folder":"../blazepose/model/","models":4} +2023-01-03 14:24:16 STATE: Models {"folder":"../anti-spoofing/model","models":1} +2023-01-03 14:24:16 STATE: Models {"folder":"../efficientpose/models","models":3} +2023-01-03 14:24:16 STATE: Models {"folder":"../insightface/models","models":5} +2023-01-03 14:24:16 STATE: Models {"folder":"../movenet/models","models":3} +2023-01-03 14:24:16 STATE: Models {"folder":"../nanodet/models","models":4} +2023-01-03 14:24:17 STATE: Models: {"count":55,"totalSize":372917743} +2023-01-03 14:24:17 INFO:  Human Build complete... {"logFile":"test/build.log"} diff --git a/test/test-node-gear.js b/test/test-node-gear.js index f8abb338..fc1360d1 100644 --- a/test/test-node-gear.js +++ b/test/test-node-gear.js @@ -15,7 +15,7 @@ const humanConfig = { cacheSensitivity: 0, modelBasePath: 'https://vladmandic.github.io/human-models/models/', face: { - detector: { enabled: true, modelPath: 'blazeface-back.json', cropFactor: 1.6 }, + detector: { enabled: true, modelPath: 'blazeface-back.json' }, mesh: { enabled: true }, iris: { enabled: false }, description: { enabled: true, modelPath: 'faceres.json' },