diff --git a/lib/RemoteCalibrator.min.js b/lib/RemoteCalibrator.min.js index 6a3eb82..2175389 100644 --- a/lib/RemoteCalibrator.min.js +++ b/lib/RemoteCalibrator.min.js @@ -1,3 +1,3 @@ /*! For license information please see RemoteCalibrator.min.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.RemoteCalibrator=t():e.RemoteCalibrator=t()}(self,(()=>(()=>{var __webpack_modules__={6003:()=>{window.requestAnimFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e,t){return window.setTimeout(e,1e3/60)},window.cancelRequestAnimFrame=window.cancelCancelRequestAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||window.clearTimeout},359:(e,t,n)=>{"use strict";n.d(t,{F:()=>i,a:()=>s});var a=n(9199);const i=(e,t,{go:n,cancel:i,custom:s},r,o=!0)=>{const l=document.createElement("div");let u,c,h;if(l.className="rc-buttons"+(o?" rc-absolute-buttons":""),l.id="rc-buttons",n&&(u=document.createElement("button"),u.className="rc-button rc-go-button",u.onclick=n,u.innerHTML=a.H.RC_ok[e],l.appendChild(u)),i&&r&&(c=document.createElement("button"),c.className="rc-button rc-cancel-button",c.onclick=i,c.innerHTML=a.H.RC_cancel[e],l.appendChild(c)),s){const{callback:e,content:t}=s;h=document.createElement("button"),h.className="rc-button rc-custom-button",h.onclick=e,h.innerHTML=t,l.appendChild(h)}return t.appendChild(l),[l,u,c,h]},s=e=>{e.querySelector("#rc-buttons").remove()}},2016:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{K:()=>takeInput});var _buttons__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(359),_keyBinder__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(9853),_utils__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(9043);const takeInput=async(RC,extraFunction=null,extraFunctionOut=null,customButtonConfig=null)=>{const unit=RC.equipment.value.unit,unitDisplay=unit===RC._CONST.UNITS.CM?"cm":"in",unitIsFraction=unit===RC._CONST.UNITS.IN_F,formItem=`
\n
\n ${unitIsFraction?`${unitDisplay}`:`${unitDisplay}`}\n
\n
`,instruction=RC.background.querySelector(".calibration-instruction");instruction.innerHTML+=formItem;const formElement=instruction.querySelector(".rc-form"),formInputElement=instruction.querySelector(".rc-form-input"),formInputElementFInteger=instruction.querySelector(".rc-form-input-f-integer"),formInputElementFFraction=instruction.querySelector(".rc-form-input-f-fraction");unitIsFraction?formInputElementFInteger.focus():formInputElement.focus();const addedButtons=(0,_buttons__WEBPACK_IMPORTED_MODULE_0__.F)(RC.L,formElement,{go:()=>{},custom:customButtonConfig||void 0},!0,!1),goButton=addedButtons[1],customButton=addedButtons[3];goButton.disabled=!0;const eleOkay=e=>{e.classList.remove("rc-input-error"),goButton.disabled=!1},eleError=e=>{isAcceptedSingleInput(e.value.slice(-1))?(e.classList.add("rc-input-error"),goButton.disabled=!0):e.value=e.value.substring(0,e.value.length-1)},setupEleOninput=(e,t)=>{e.oninput=()=>{t(e.value)?eleOkay(e):eleError(e)}},_validationForFraction=()=>{let e=!0;return validInputInteger(formInputElementFInteger.value)?eleOkay(formInputElementFInteger):(eleError(formInputElementFInteger),e=!1),validInputFraction(formInputElementFFraction.value)?eleOkay(formInputElementFFraction):(eleError(formInputElementFFraction),e=!1),e};return unitIsFraction?(formInputElementFInteger.oninput=_validationForFraction,formInputElementFFraction.oninput=_validationForFraction):setupEleOninput(formInputElement,validInput),(0,_utils__WEBPACK_IMPORTED_MODULE_2__.nB)(extraFunction),new Promise((resolve=>{const bFunction=()=>{removeInputElements(formElement,extraFunctionOut),(0,_keyBinder__WEBPACK_IMPORTED_MODULE_1__.l)(bindKeysFunction),resolve(null)},fFunction=()=>{let valid=!1,numericalValue,inputValue;unitIsFraction&&validInputInteger(formInputElementFInteger.value)&&validInputFraction(formInputElementFFraction.value)?(valid=!0,numericalValue=Number.parseInt(formInputElementFInteger.value)+eval(formInputElementFFraction.value),inputValue=`${formInputElementFInteger.value} ${formInputElementFFraction.value}`):!unitIsFraction&&validInput(formInputElement.value)&&(valid=!0,numericalValue=Number(formInputElement.value)||Number(formInputElement.value.replace(",",".")),inputValue=formInputElement.value),valid&&(removeInputElements(formElement,extraFunctionOut),(0,_keyBinder__WEBPACK_IMPORTED_MODULE_1__.l)(bindKeysFunction),resolve({value:{numerical:numericalValue,input:inputValue,unit},timestamp:performance.now()}))};goButton.onclick=fFunction,customButton.onclick=bFunction;const bindKeysFunction=(0,_keyBinder__WEBPACK_IMPORTED_MODULE_1__.m)({Enter:fFunction,Escape:bFunction})}))},removeInputElements=(e,t)=>{(0,_buttons__WEBPACK_IMPORTED_MODULE_0__.a)(e);for(const t of e.children)t.remove();e.remove(),(0,_utils__WEBPACK_IMPORTED_MODULE_2__.nB)(t)},validInput=e=>e.length>0&&!e.includes(" ")&&(!Number.isNaN(e)||!Number.isNaN(e.replace(",","."))),validInputInteger=e=>!!validInput(e)&&(Number.parseInt(e)===Number(e)&&Number(e)>0),validInputFraction=text=>{if("0"===text)return!0;if(!text.includes("/")||text.match(/\//g).length>1)return!1;const numbers=text.split("/");return validInputInteger(numbers[0])&&validInputInteger(numbers[1])&&(0,_utils__WEBPACK_IMPORTED_MODULE_2__.DW)(numbers[1])&&eval(text)<1},isAcceptedSingleInput=e=>/[0-9]/.test(e)||[".","/",","].includes(e)},9853:(e,t,n)=>{"use strict";n.d(t,{l:()=>s,m:()=>i});var a=n(9043);function i(e,t="keydown"){const n=t=>{t.key in e&&(t.preventDefault(),(0,a.nB)(e[t.key],t))};return document.body.addEventListener(t,n),n}function s(e,t="keydown"){document.body.removeEventListener(t,e)}},2646:(e,t,n)=>{"use strict";n.d(t,{G:()=>r,t:()=>i});var a=n(9199);function i(e){const t=Object.keys(a.H.EE_languageNameNative);if(t.includes(e))return s(e);const n=[];t.map((e=>{n.push(e.split("-")[0])}));const i=e.split("-")[0].toLowerCase();return n.includes(i)?s(t[n.indexOf(i)]):s("en-US")}function s(e){return{value:{language:e,languageNameEnglish:a.H.EE_languageNameEnglish[e],languageNameNative:a.H.EE_languageNameNative[e],languageDirection:a.H.EE_languageDirection[e],languagePhraseSource:a.H.EE_phraseSource[e]},timestamp:performance.now()}}function r(e){return"1"===a.H.EE_languageUseSpace[e]?" ":""}},477:(e,t,n)=>{"use strict";n.d(t,{l:()=>u});const a="mocha"===n(7786)._;let i,s;if(!a){const e=n(9171);i=e.Synth,s=e.Volume}class r{triggerAttackRelease(){}}const o=a?new r:new i({oscillator:{type:"sine"},envelope:{attack:.001,decay:.001,sustain:1,release:.001}}).connect(new s(-17).toDestination()),l=a?new r:new i({oscillator:{type:"sine"}}).connect(new s(-5).toDestination()),u=(e=0)=>{switch(e){case 0:default:return void o.triggerAttackRelease(2e3,.05);case 1:return void o.triggerAttackRelease(500,.5);case 2:return void o.triggerAttackRelease(200,.6);case 3:return void l.triggerAttackRelease(200,.2)}}},9043:(e,t,n)=>{"use strict";function a(e,...t){if(e&&"function"==typeof e)return t.length?e(...t):e()}n.d(t,{$O:()=>l,$k:()=>v,AU:()=>u,Av:()=>y,DW:()=>d,Ew:()=>c,G8:()=>g,JZ:()=>f,KY:()=>k,Md:()=>i,Nh:()=>m,Sf:()=>r,aS:()=>o,k4:()=>p,ll:()=>h,ln:()=>b,nB:()=>a,yy:()=>s}),function(){let e=0;const t=["ms","moz","webkit","o"];for(let e=0;e{};function s(e){return new Promise((t=>setTimeout(t,e)))}function r(){if(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled){const e=document.documentElement;return e.requestFullscreen?(e.requestFullscreen(),!0):e.mozRequestFullScreen?(e.mozRequestFullScreen(),!0):e.webkitRequestFullscreen?(e.webkitRequestFullscreen(),!0):!!e.msRequestFullscreen&&(e.msRequestFullscreen(),!0)}return!1}function o(){return Math.abs(window.innerHeight-screen.height)<5&&Math.abs(window.innerWidth-screen.width)<5&&window.screenX<5&&window.screenY<5}function l(e,t=null,n=!1,a="",i=null){return`

${e}

${t?`

${t}

`:""}`}function u(e,t,n){return en?n:e}function c(e,t,n,a,i){return a+1*(e-t)/(n-t)*(i-a)}function h(e,t,n,a){return Math.sqrt((e-n)**2+(t-a)**2)}function d(e){return e&&!(e&e-1)}function p(e){for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return e}function m(e,t){const n=10**t;return Math.round(e*n)/n}const f=e=>{const t=Math.floor(e.length/2),n=[...e].sort(((e,t)=>e-t));return e.length%2!=0?n[t]:(n[t-1]+n[t])/2},g=e=>e.reduce(((e,t)=>e+t))/e.length;function y(e,t,n=1){let a=0,i=0;for(;0===a;)a=Math.random();for(;0===i;)i=Math.random();let s=Math.sqrt(-2*Math.log(a))*Math.cos(2*Math.PI*i);return s=s/10+.5,s>1||s<0?s=y(e,t,n):(s=s**n,s*=t-e,s+=e),s}const b=e=>JSON.parse(JSON.stringify(e));function v(){"activeElement"in document&&document.activeElement.blur()}const k=e=>{if("touchstart"===e.type||"touchmove"===e.type){const t=e.touches[0];return{x:t.clientX,y:t.clientY}}return{x:e.clientX,y:e.clientY}}},7786:(e,t,n)=>{"use strict";n.d(t,{A:()=>v,_:()=>y});var a=n(7503),i=n.n(a),s=n(115),r=n.n(s);const o=["tall","short","up","down","fancy","busy","loud","crazy","kind","nice","real","speedy","handy","active","alert","bold","brave","bright","calm","clever","cool","free","grand","great","happy","jolly","lucky","spicy","sunny","super","wise"],l=["bat","bear","bird","cat","cow","deer","dog","dove","dragon","duck","eagle","fish","fox","frog","goose","lion","mouse","owl","pig","rat","seal","shark","sheep","snake","spider","tiger","turkey","viper","whale","wolf","onion","carrot","pear","bean","corn","bread","apple","banana","fig","grape","lemon","lime","orange","peach","plum","dumpling","cake","pasta","pot","sushi"],u=["blue","bronze","fire","forest","gold","gray","green","navy","purple","red","silver","sky","yellow","neon","black","white","brown","aqua"];function c(e){return e[Math.floor(Math.random()*e.length)]}function h(e){return e.charAt(0).toUpperCase()+e.slice(1)}function d(){const e=`000${(new Date).getMilliseconds().toString()}`;return h(c(o))+h(c(u))+h(c(l))+e.substring(e.length-3)}var p=n(782),m=n(9043),f=n(2646),g=n(9199);const y="production";class b{constructor(){window.console.log(`%c\nEasyEyes Remote Calibrator ${this.version.value}\n`,`color: ${this._CONST.COLOR.ORANGE}`),this._initialized=!1,this._initializing=!1,this._id=null,this._lang=null,this._langData=[],this._panelStatus={hasPanel:!1,panelFinished:!1,panelResolveIntervals:[]},this._panel={panel:null,panelObserver:null,panelTasks:[],panelParent:null,panelOptions:{},panelCallback:null,panelResolve:null},this._participantCheckEquipment={has:null,equipment:null,unit:null},this._trackingSetupFinishedStatus={gaze:!0,distance:!0},this._trackingPaused={gaze:!1,distance:!1},this._trackingVideoFrameTimestamps={gaze:0,distance:0},this._distanceTrackNudging={distanceCorrecting:null,distanceCorrectEnabled:!1,distanceDesired:null,distanceAllowedRatio:null,needEasyEyesKeypadBeyondCm:null},this._gazeTrackNudging={isCorrectingGaze:!1},this._environmentData=[],this._displayData=[],this._screenData=[],this._viewingDistanceData=[],this._nearPointData=[],this._PDData=[],this._gazePositionData=[],this._gazeAccuracyData=[],this._performanceData=[],this._fullscreenData=[],this._equipmentData=[],this._checkData=[],this._background={element:null,instructionElement:null},this._nudger={element:null,gazeElement:null},this._params={backgroundColor:"#eee",videoOpacity:.8,showCancelButton:!0},this.viewingDistanceAllowedPreciseBool=!0,this.keypadHandler=null}get background(){return this._background.element}get instructionElement(){return this._background.instructionElement}get nudger(){return this._nudger.element}get params(){return this._params}get id(){return this._id?{value:this._id.value,timestamp:this._id.timestamp,date:this._id.date}:null}_helper_get(e,t){if(!e.length)return null;const n=e[e.length-1];return t?{value:n.value[t],timestamp:n.timestamp}:n}get version(){return{value:"0.7.25"}}get supportedLanguages(){const e=[];for(const t in g.H.EE_languageNameEnglish)e.push({language:t,languageNameEnglish:g.H.EE_languageNameEnglish[t],languageNameNative:g.H.EE_languageNameNative[t]});return e}get L(){return this._lang}get LD(){return this.languageDirection.value}get language(){return this._helper_get(this._langData,"language")}get languageNameEnglish(){return this._helper_get(this._langData,"languageNameEnglish")}get languageNameNative(){return this._helper_get(this._langData,"languageNameNative")}get languageDirection(){return this._helper_get(this._langData,"languageDirection")}get languagePhraseSource(){return this._helper_get(this._langData,"languagePhraseSource")}get computeArrayFillMHz(){return this._helper_get(this._performanceData,"computeArrayFillMHz")}get computeRandomMHz(){return this._helper_get(this._performanceData,"computeRandomMHz")}get idealFps(){return this._helper_get(this._performanceData,"idealFps")}get stressFps(){return this._helper_get(this._performanceData,"stressFps")}get isFullscreen(){return this.fullscreenData.length&&r()((0,m.aS)(),this._helper_get(this._fullscreenData).value)||(this.newFullscreenData={value:(0,m.aS)(),timestamp:performance.now()}),this._helper_get(this._fullscreenData)}get concurrency(){return this._helper_get(this._environmentData,"concurrency")}get browser(){return this._helper_get(this._environmentData,"browser")}get browserVersion(){return this._helper_get(this._environmentData,"browserVersion")}get deviceType(){return this._helper_get(this._environmentData,"deviceType")}get isMobile(){const e=this._helper_get(this._environmentData,"deviceType");return{value:"desktop"!==e.value,timestamp:e.timestamp}}get model(){return this._helper_get(this._environmentData,"model")}get manufacturer(){return this._helper_get(this._environmentData,"manufacturer")}get engine(){return this._helper_get(this._environmentData,"engine")}get system(){return this._helper_get(this._environmentData,"system")}get systemFamily(){return this._helper_get(this._environmentData,"systemFamily")}get description(){return this._helper_get(this._environmentData,"description")}get fullDescription(){return this._helper_get(this._environmentData,"fullDescription")}get userLanguage(){return this._helper_get(this._environmentData,"userLanguage")}get equipment(){return this._helper_get(this._equipmentData)}get displayWidthPx(){return this._displaySize(),this._helper_get(this._displayData,"displayWidthPx")}get displayHeightPx(){return this._displaySize(),this._helper_get(this._displayData,"displayHeightPx")}get windowWidthPx(){return this._displaySize(),this._helper_get(this._displayData,"windowWidthPx")}get windowHeightPx(){return this._displaySize(),this._helper_get(this._displayData,"windowHeightPx")}get screenWidthCm(){return this._helper_get(this._screenData,"screenWidthCm")}get screenHeightCm(){return this._helper_get(this._screenData,"screenHeightCm")}get screenDiagonalCm(){return this._helper_get(this._screenData,"screenDiagonalCm")}get screenDiagonalIn(){return this._helper_get(this._screenData,"screenDiagonalIn")}get screenPpi(){return this._helper_get(this._screenData,"screenPpi")}get screenPhysicalPpi(){return this._helper_get(this._screenData,"screenPhysicalPpi")}get viewingDistanceCm(){return this._helper_get(this._viewingDistanceData)}get nearPointCm(){return this._helper_get(this._nearPointData)}get PDCm(){return this._helper_get(this._PDData)}get gazePositionPx(){return this._helper_get(this._gazePositionData)}get gazeAccuracyDeg(){return this._helper_get(this._gazeAccuracyData)}get displayData(){return this._displayData}get screenData(){return this._screenData}get viewingDistanceData(){return this._viewingDistanceData}get nearPointData(){return this._nearPointData}get PDData(){return this._PDData}get gazeData(){return this._gazePositionData}get performanceData(){return this._performanceData}get fullscreenData(){return this._fullscreenData}get environmentData(){return this._environmentData}get languageData(){return this._langData}get equipmentData(){return this._equipmentData}get checkData(){return this._checkData}set newDisplayData(e){this._displayData.push(e)}set newScreenData(e){this._screenData.push(e)}set newViewingDistanceData(e){this._viewingDistanceData.push(e)}set newNearPointData(e){this._nearPointData.push(e)}set newPDData(e){this._PDData.push(e)}set newGazePositionData(e){this._gazePositionData.push(e)}set newGazeAccuracyData(e){this._gazeAccuracyData.push(e)}set newEnvironmentData(e){this._environmentData.push(e)}set newPerformanceData(e){this._performanceData.push(e)}set newFullscreenData(e){this._fullscreenData.push(e)}set newLanguageData(e){this._langData.push(e)}set newEquipmentData(e){this._equipmentData.push(e)}set newCheckData(e){this._checkData.push(e)}}b.prototype.init=async function(e={},t=void 0,n={easyEyesKeypadHandler:null}){if(!this._initialized&&!this._initializing){this._initializing=!0;const a=Object.assign({id:d(),language:"AUTO",languagePhrasesJSON:null,fullscreen:!1},e);await(async(e=null)=>{const{remoteCalibratorPhrases:t}=await import("https://cdn.jsdelivr.net/gh/EasyEyes/remote-calibrator@latest/src/i18n/phrases.js");Object.assign(g.H,t),e&&Object.assign(g.H,e)})(a.languagePhrasesJSON),a.fullscreen&&!p.Y&&(0,m.Sf)(),this._id={value:a.id,timestamp:performance.now(),date:new Date},this._environment(!0),this._displaySize(!0),this._CONST.S.AUTO===a.language?this.newLanguageData=(0,f.t)(this.userLanguage.value):this.newLanguageData=(0,f.t)(a.language),this._lang=this.language.value,this._initializing=!1,this._initialized=!0,n?.easyEyesKeypadHandler&&(this.keypadHandler=n.easyEyesKeypadHandler),(0,m.nB)(t,this._id)}},b.prototype._environment=function(e=!1){if(e||this.checkInitialized()){(0,m.$k)();const e=e=>e.match(/Mobi/i)?"mobile":"desktop",t={value:{concurrency:window.navigator.hardwareConcurrency||-1,browser:i().name,browserVersion:i().version,deviceType:e(navigator.userAgent),model:i().product||"unknown",manufacturer:i().manufacturer||"unknown",engine:i().layout,system:`${i().os.family} ${i().os.version}`,systemFamily:i().os.family,description:i().description,fullDescription:i().ua,userLanguage:window.navigator.userLanguage||window.navigator.language},timestamp:this.id.timestamp};this.newEnvironmentData=t}},b.prototype.checkInitialized=function(){return!!this._initialized},b.prototype.getFullscreen=function(e=!0){return!!(0,m.aS)()||(this.newFullscreenData={value:!(!e||p.Y)&&(0,m.Sf)(),timestamp:performance.now()},this.isMobile.value&&window.scrollBy(0,1),this.isFullscreen)},b.prototype.newLanguage=function(e){if(this.checkInitialized()){let t;return this.newLanguageData=t=(0,f.t)(e),this._lang=this.language.value,t}},b.prototype._addBackground=function(e){if(null!==this.background)return;let t=document.getElementById("calibration-background");return t||(t=document.createElement("div"),t.id="calibration-background",t.className=`calibration-background rc-lang-${this.LD.toLowerCase()}`,document.body.classList.add("lock-view"),document.body.appendChild(t),t.style.background=this.params.backgroundColor),e&&(t.innerHTML=e),this._background.element=t,this.background},b.prototype._replaceBackground=function(e){return null!==this.background&&this._removeBackground(),this._addBackground(e)},b.prototype._removeBackground=function(){const e=document.getElementById("calibration-background");return!!e&&(document.body.classList.remove("lock-view"),document.body.removeChild(e),this._background={element:null,instructionElement:null},!0)},b.prototype._addBackgroundText=function(e,t){const n=this.background.getElementsByClassName("calibration-instruction");for(let e=0;e{"use strict";n.d(t,{Y:()=>a});const a=!1},9199:(e,t,n)=>{"use strict";n.d(t,{H:()=>i});const a=["en-US","ar","hy","bg","zh-CN","zh-HK","hr","cs","da","nl","en-UK","fi","fr","de","el","he","hi","hu","is","id","it","ja","kn","ko","lt","ms","ml","no","fa","pl","pt","ro","ru","sr","es","sw","sv","tl","tr","ur"],i={};["EE_languageNameEnglish","EE_languageNameNative","EE_languageDirection","EE_languageUseSpace","EE_phraseSource","RC_cancel","RC_distanceTracking","RC_distanceTrackingCloseL","RC_distanceTrackingCloseR","RC_distanceTrackingGuide","RC_distanceTrackingIntroEnd","RC_distanceTrackingIntroStart","RC_distanceTrackingMoveCloser","RC_distanceTrackingMoveFurther","RC_rulerUnit","RC_howLong","RC_produceDistanceTitle","RC_produceDistance","RC_TestDistances","RC_canUsePhoneKeypad","RC_distanceTrackingRedo","RC_distanceTrackingTitle","RC_errorCameraUseDenied","RC_errorNoCamera","RC_gazeTracking","RC_gazeTrackingIntro","RC_gazeTrackingNudge","RC_gazeTrackingTitle","RC_nearPointIntro","RC_nearPointTitle","RC_ok","RC_panelButton","RC_panelIntro","RC_panelTitle","RC_panelTitleNext","RC_panelIntroNext","RC_panelUsesWebcam","RC_panelUsesWebcamPhone","RC_performance","RC_performanceIntro","RC_performanceTitle","RC_privacyCamera","RC_requestCamera","RC_screenSize","RC_screenSizeCredit","RC_screenSizeCreditCard","RC_screenSizeHave","RC_screenSizeIntro","RC_screenSizeTitle","RC_screenSizeUSBA","RC_screenSizeUSBC","RC_starting","RC_viewingBlindSpotCredit","RC_viewingBlindSpotRejected","RC_viewingDistance","RC_viewingDistanceIntroTitle","RC_viewingDistanceIntroLiMethod","RC_viewingDistanceTitle","T_proceed"].map((e=>{i[e]={},a.map((t=>{i[e][t]=""}))}))},7790:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{K:()=>_setDebugControl});var _components_utils__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(9043);const _setDebugControl=(e,t,n,a)=>{const i=document.createElement("div");i.className="rc-panel-debug-control",i.innerHTML='

DEBUG CONTROL

REMEMBER TO SET debug TO false FOR PRODUCTION MODE!

',t.appendChild(i);const s=[];for(const t of n){const n=t.name?t.name:t,a=document.createElement("div");a.className="rc-panel-debug-control-task-row",a.id=`rc-debugger-row-${n}`;const r=e._debuggerDefault[n];if(r){i.innerHTML+=`

${n}

`;const e={n:"number",s:"string"};switch(n){case"screenSize":for(const t in r.value)a.innerHTML+=_createValueElement(n,t,r.value[t],`.value.${t}`,e.n);break;case"measureDistance":a.innerHTML+=_createValueElement(n,"value",r.value,".value",e.n),a.innerHTML+=_createValueElement(n,"method",r.method,".method",e.s,!0);break;case"trackDistance":a.innerHTML+=_createValueElement(n,"viewingDistanceCm",r.value.viewingDistanceCm,".value",e.n),a.innerHTML+=_createValueElement(n,"PDCm",r.value.PDCm,".value",e.n),a.innerHTML+=_createValueElement(n,"nearPointCm.x",r.value.nearPointCm.x,".value.x",e.n),a.innerHTML+=_createValueElement(n,"nearPointCm.y",r.value.nearPointCm.y,".value.y",e.n),a.innerHTML+=_createValueElement(n,"latencyMs",r.value.latencyMs,".latencyMs",e.n),a.innerHTML+=_createValueElement(n,"method",r.method,".method",e.s,!0);break;case"trackGaze":a.innerHTML+=_createValueElement(n,"x",r.value.x,".value.x",e.n),a.innerHTML+=_createValueElement(n,"y",r.value.y,".value.y",e.n),a.innerHTML+=_createValueElement(n,"latencyMs",r.value.latencyMs,".value.latencyMs",e.n);break;case"performance":a.innerHTML+=_createValueElement(n,"computeArrayFillMHz",r.value.computeArrayFillMHz,".value.computeArrayFillMHz",e.n),a.innerHTML+=_createValueElement(n,"computeRandomMHz",r.value.computeRandomMHz,".value.computeRandomMHz",e.n),a.innerHTML+=_createValueElement(n,"idealFps",r.value.idealFps,".value.idealFps",e.n),a.innerHTML+=_createValueElement(n,"stressFps",r.value.stressFps,".value.stressFps",e.n)}i.appendChild(a),s.push(n)}}const r=document.createElement("button");r.className="rc-panel-debug-control-next",r.innerHTML="Simulate calibration and continue",r.onclick=()=>{_wrapValues(e,s),(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.nB)(a,{timestamp:performance.now()}),e._panelStatus.panelFinished=!0},i.appendChild(r)},_createValueElement=(e,t,n,a,i,s=!1)=>`
\n \n

${t}

\n
`,_wrapValues=(e,t)=>{for(const n of t){const t=document.querySelector(`#rc-debugger-row-${n}`),a={};switch(n){case"screenSize":a.value={},_putData(e,a,t),e.newScreenData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a);break;case"measureDistance":_putData(e,a,t),e.newViewingDistanceData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a);break;case"trackDistance":e.newViewingDistanceData={value:_get(t,"#trackDistance-viewingDistanceCm"),latencyMs:_get(t,"#trackDistance-latencyMs"),method:_get(t,"#trackDistance-method","string"),timestamp:e._debuggerDefault.timestamp},e.newNearPointData={value:{x:_get(t,"#trackDistance-nearPointCm-x"),y:_get(t,"#trackDistance-nearPointCm-y")},timestamp:e._debuggerDefault.timestamp},e.newPDData={value:_get(t,"#trackDistance-PDCm"),timestamp:e._debuggerDefault.timestamp};break;case"trackGaze":a.value={},_putData(e,a,t),e.newGazePositionData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a);break;case"performance":a.value={},_putData(e,a,t),e.newPerformanceData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a)}}},_get=(e,t)=>{const n=e.querySelector(t);return"number"===n.dataset.type?Number(n.value):n.value},_putData=(RC,newData,taskRow)=>{for(const ele of taskRow.childNodes){const eleInput=ele.querySelector("input");try{eval(`newData${eleInput.dataset.source} = eleInput.dataset.type === 'number' ? Number(eleInput.value) : eleInput.value`)}catch(e){}newData.timestamp=RC._debuggerDefault.timestamp}return newData}},2921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".animated{-webkit-animation-duration:var(--animate-duration);animation-duration:var(--animate-duration);-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.repeat-1{-webkit-animation-iteration-count:var(--animate-repeat);animation-iteration-count:var(--animate-repeat)}.animated.repeat-2{-webkit-animation-iteration-count:calc(var(--animate-repeat)*2);animation-iteration-count:calc(var(--animate-repeat)*2)}.animated.repeat-3{-webkit-animation-iteration-count:calc(var(--animate-repeat)*3);animation-iteration-count:calc(var(--animate-repeat)*3)}.animated.delay-1s{-webkit-animation-delay:var(--animate-delay);animation-delay:var(--animate-delay)}.animated.delay-2s{-webkit-animation-delay:calc(var(--animate-delay)*2);animation-delay:calc(var(--animate-delay)*2)}.animated.delay-3s{-webkit-animation-delay:calc(var(--animate-delay)*3);animation-delay:calc(var(--animate-delay)*3)}.animated.delay-4s{-webkit-animation-delay:calc(var(--animate-delay)*4);animation-delay:calc(var(--animate-delay)*4)}.animated.delay-5s{-webkit-animation-delay:calc(var(--animate-delay)*5);animation-delay:calc(var(--animate-delay)*5)}.animated.faster{-webkit-animation-duration:calc(var(--animate-duration)/2);animation-duration:calc(var(--animate-duration)/2)}.animated.fast{-webkit-animation-duration:calc(var(--animate-duration)*.8);animation-duration:calc(var(--animate-duration)*.8)}.animated.slow{-webkit-animation-duration:calc(var(--animate-duration)*2);animation-duration:calc(var(--animate-duration)*2)}.animated.slower{-webkit-animation-duration:calc(var(--animate-duration)*3);animation-duration:calc(var(--animate-duration)*3)}@media (prefers-reduced-motion:reduce),print{.animated{-webkit-animation-duration:1ms!important;animation-duration:1ms!important;-webkit-animation-iteration-count:1!important;animation-iteration-count:1!important;-webkit-transition-duration:1ms!important;transition-duration:1ms!important}.animated[class*=Out]{opacity:0}}","",{version:3,sources:["webpack://./node_modules/animate.css/source/_base.css"],names:[],mappings:"AAAA,UACE,kDAA2C,CAA3C,0CAA2C,CAC3C,gCAAyB,CAAzB,wBACF,CAEA,mBACE,0CAAmC,CAAnC,kCACF,CAEA,mBACE,uDAAgD,CAAhD,+CACF,CAEA,mBACE,+DAA0D,CAA1D,uDACF,CAEA,mBACE,+DAA0D,CAA1D,uDACF,CAEA,mBACE,4CAAqC,CAArC,oCACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,iBACE,0DAAqD,CAArD,kDACF,CAEA,eACE,2DAAuD,CAAvD,mDACF,CAEA,eACE,0DAAqD,CAArD,kDACF,CAEA,iBACE,0DAAqD,CAArD,kDACF,CAEA,6CACE,UACE,wCAAkC,CAAlC,gCAAkC,CAElC,6CAAuC,CAAvC,qCAAuC,CADvC,yCAAmC,CAAnC,iCAEF,CAEA,sBACE,SACF,CACF",sourcesContent:[".animated {\n animation-duration: var(--animate-duration);\n animation-fill-mode: both;\n}\n\n.animated.infinite {\n animation-iteration-count: infinite;\n}\n\n.animated.repeat-1 {\n animation-iteration-count: var(--animate-repeat);\n}\n\n.animated.repeat-2 {\n animation-iteration-count: calc(var(--animate-repeat) * 2);\n}\n\n.animated.repeat-3 {\n animation-iteration-count: calc(var(--animate-repeat) * 3);\n}\n\n.animated.delay-1s {\n animation-delay: var(--animate-delay);\n}\n\n.animated.delay-2s {\n animation-delay: calc(var(--animate-delay) * 2);\n}\n\n.animated.delay-3s {\n animation-delay: calc(var(--animate-delay) * 3);\n}\n\n.animated.delay-4s {\n animation-delay: calc(var(--animate-delay) * 4);\n}\n\n.animated.delay-5s {\n animation-delay: calc(var(--animate-delay) * 5);\n}\n\n.animated.faster {\n animation-duration: calc(var(--animate-duration) / 2);\n}\n\n.animated.fast {\n animation-duration: calc(var(--animate-duration) * 0.8);\n}\n\n.animated.slow {\n animation-duration: calc(var(--animate-duration) * 2);\n}\n\n.animated.slower {\n animation-duration: calc(var(--animate-duration) * 3);\n}\n\n@media print, (prefers-reduced-motion: reduce) {\n .animated {\n animation-duration: 1ms !important;\n transition-duration: 1ms !important;\n animation-iteration-count: 1 !important;\n }\n\n .animated[class*='Out'] {\n opacity: 0;\n }\n}\n"],sourceRoot:""}]);const o=r},2636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,":root{--animate-duration:1s;--animate-delay:1s;--animate-repeat:1}","",{version:3,sources:["webpack://./node_modules/animate.css/source/_vars.css"],names:[],mappings:"AAAA,MACE,qBAAsB,CACtB,kBAAmB,CACnB,kBACF",sourcesContent:[":root {\n --animate-duration: 1s;\n --animate-delay: 1s;\n --animate-repeat: 1;\n}\n"],sourceRoot:""}]);const o=r},7271:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}","",{version:3,sources:["webpack://./node_modules/animate.css/source/fading_entrances/fadeInUp.css"],names:[],mappings:"AAAA,4BACE,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CAEA,GACE,SAAU,CACV,+BAA+B,CAA/B,uBACF,CACF,CAVA,oBACE,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CAEA,GACE,SAAU,CACV,+BAA+B,CAA/B,uBACF,CACF,CAEA,UACE,+BAAwB,CAAxB,uBACF",sourcesContent:["@keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translate3d(0, 100%, 0);\n }\n\n to {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n }\n}\n\n.fadeInUp {\n animation-name: fadeInUp;\n}\n"],sourceRoot:""}]);const o=r},2551:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"@-webkit-keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}","",{version:3,sources:["webpack://./node_modules/animate.css/source/fading_exits/fadeOutDown.css"],names:[],mappings:"AAAA,+BACE,GACE,SACF,CAEA,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CACF,CATA,uBACE,GACE,SACF,CAEA,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CACF,CAEA,aACE,kCAA2B,CAA3B,0BACF",sourcesContent:["@keyframes fadeOutDown {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n transform: translate3d(0, 100%, 0);\n }\n}\n\n.fadeOutDown {\n animation-name: fadeOutDown;\n}\n"],sourceRoot:""}]);const o=r},8470:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,'.swal2-popup.swal2-toast{background:#fff;box-shadow:0 0 1px rgba(0,0,0,.075),0 1px 2px rgba(0,0,0,.075),1px 2px 4px rgba(0,0,0,.075),1px 3px 8px rgba(0,0,0,.075),2px 4px 16px rgba(0,0,0,.075);box-sizing:border-box;grid-column:1/4!important;grid-row:1/4!important;grid-template-columns:min-content auto min-content;overflow-y:hidden;padding:1em;pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{font-size:1em;margin:.5em 1em;padding:0;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{font-size:1em;height:2em;margin:.5em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{font-size:.8em;margin:.5em 0 0;padding:.5em 0 0}.swal2-popup.swal2-toast .swal2-close{align-self:center;font-size:2em;grid-column:3/3;grid-row:1/99;height:.8em;margin:0;width:.8em}.swal2-popup.swal2-toast .swal2-html-container{font-size:1em;margin:.5em 1em;overflow:initial;padding:0;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{align-self:center;grid-column:1;grid-row:1/99;height:2em;margin:.25em;width:2em}.swal2-popup.swal2-toast .swal2-icon{align-self:center;grid-column:1;grid-row:1/99;height:2em;margin:0 .5em 0 0;min-width:2em;width:2em}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{align-items:center;display:flex;font-size:1.8em;font-weight:700}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{height:2em;width:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{height:auto;justify-content:flex-start;margin:.5em 0 0;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{font-size:1em;margin:.25em .5em;padding:.4em .6em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{border-radius:50%;height:3em;position:absolute;width:1.6em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{border-radius:4em 0 0 4em;left:-.5em;top:-.8em;transform:rotate(-45deg);transform-origin:2em 2em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{border-radius:0 4em 4em 0;left:.9375em;top:-.25em;transform-origin:0 1.5em}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{height:2em;width:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{height:2.6875em;left:.4375em;top:0;width:.4375em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{left:.1875em;top:1.125em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{right:.1875em;top:.9375em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}div:where(.swal2-container){box-sizing:border-box;display:grid;grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";grid-template-rows:minmax(min-content,auto) minmax(min-content,auto) minmax(min-content,auto);height:100%;inset:0;overflow-x:hidden;padding:.625em;position:fixed;transition:background-color .1s;z-index:1060;-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:rgba(0,0,0,.4)}div:where(.swal2-container).swal2-backdrop-hide{background:transparent!important}div:where(.swal2-container).swal2-bottom-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-top-start{grid-template-columns:minmax(0,1fr) auto auto}div:where(.swal2-container).swal2-bottom,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-top{grid-template-columns:auto minmax(0,1fr) auto}div:where(.swal2-container).swal2-bottom-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-top-end{grid-template-columns:auto auto minmax(0,1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-left>.swal2-popup,div:where(.swal2-container).swal2-center-start>.swal2-popup{align-self:center;grid-row:2}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-left>.swal2-popup,div:where(.swal2-container).swal2-bottom-start>.swal2-popup{align-self:end;grid-column:1;grid-row:3}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup,div:where(.swal2-container).swal2-grow-row>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{align-self:stretch;grid-row:1/4}div:where(.swal2-container).swal2-no-transition{transition:none!important}div:where(.swal2-container) div:where(.swal2-popup){background:#fff;border:none;border-radius:5px;box-sizing:border-box;color:#545454;display:none;font-family:inherit;font-size:1rem;grid-template-columns:minmax(0,100%);max-width:100%;padding:0 0 1.25em;position:relative;width:32em}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) h2:where(.swal2-title){color:inherit;font-size:1.875em;font-weight:600;margin:0;max-width:100%;padding:.8em 1em 0;position:relative;text-align:center;text-transform:none;word-wrap:break-word}div:where(.swal2-container) div:where(.swal2-actions){align-items:center;box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;margin:1.25em auto 0;padding:0;width:auto;z-index:1}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}div:where(.swal2-container) div:where(.swal2-loader){align-items:center;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-color:#2778c4 transparent;border-radius:100%;border-style:solid;border-width:.25em;display:none;height:2.2em;justify-content:center;margin:0 1.875em;width:2.2em}div:where(.swal2-container) button:where(.swal2-styled){box-shadow:0 0 0 3px transparent;font-weight:500;margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){background:initial;background-color:#7066e0;border:0;border-radius:.25em;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):focus-visible{box-shadow:0 0 0 3px rgba(112,102,224,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){background:initial;background-color:#dc3741;border:0;border-radius:.25em;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):focus-visible{box-shadow:0 0 0 3px rgba(220,55,65,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){background:initial;background-color:#6e7881;border:0;border-radius:.25em;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):focus-visible{box-shadow:0 0 0 3px hsla(208,8%,47%,.5)}div:where(.swal2-container) button:where(.swal2-styled).swal2-default-outline:focus-visible{box-shadow:0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){border-top:1px solid #eee;color:inherit;font-size:1em;margin:1em 0 0;padding:1em 1em 0;text-align:center}div:where(.swal2-container) .swal2-timer-progress-bar-container{border-bottom-left-radius:5px;border-bottom-right-radius:5px;bottom:0;grid-column:auto!important;left:0;overflow:hidden;position:absolute;right:0}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){background:rgba(0,0,0,.2);height:.25em;width:100%}div:where(.swal2-container) img:where(.swal2-image){margin:2em auto 1em;max-width:100%}div:where(.swal2-container) button:where(.swal2-close){align-items:center;background:transparent;border:none;border-radius:5px;color:#ccc;cursor:pointer;font-family:monospace;font-size:2.5em;height:1.2em;justify-content:center;justify-self:end;margin-bottom:-1.2em;margin-right:0;margin-top:0;overflow:hidden;padding:0;transition:color .1s,box-shadow .1s;width:1.2em;z-index:2}div:where(.swal2-container) button:where(.swal2-close):hover{background:transparent;color:#f27474;transform:none}div:where(.swal2-container) button:where(.swal2-close):focus-visible{box-shadow:inset 0 0 0 3px rgba(100,150,200,.5);outline:none}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) .swal2-html-container{color:inherit;font-size:1.125em;font-weight:400;justify-content:center;line-height:normal;margin:0;overflow:auto;padding:1em 1.6em .3em;text-align:center;z-index:1;word-wrap:break-word;word-break:break-word}div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) label:where(.swal2-checkbox),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) textarea:where(.swal2-textarea){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) textarea:where(.swal2-textarea){background:transparent;border:1px solid #d9d9d9;border-radius:.1875em;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px transparent;box-sizing:border-box;color:inherit;font-size:1.125em;transition:border-color .1s,box-shadow .1s;width:auto}div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:1px solid #b4dbed;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5);outline:none}div:where(.swal2-container) input:where(.swal2-file)::-moz-placeholder,div:where(.swal2-container) input:where(.swal2-input)::-moz-placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::-moz-placeholder{color:#ccc}div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{background:#fff;margin:1em 2em 3px}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{color:inherit;font-weight:600;text-align:center;width:20%}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{font-size:1.125em;height:2.625em;line-height:2.625em;padding:0}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{background:transparent;font-size:1.125em;margin-left:auto;margin-right:auto;width:75%}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{background:transparent;color:inherit;font-size:1.125em;max-width:100%;min-width:50%;padding:.375em .625em}div:where(.swal2-container) .swal2-checkbox,div:where(.swal2-container) .swal2-radio{align-items:center;background:#fff;color:inherit;justify-content:center}div:where(.swal2-container) .swal2-checkbox label,div:where(.swal2-container) .swal2-radio label{font-size:1.125em;margin:0 .6em}div:where(.swal2-container) .swal2-checkbox input,div:where(.swal2-container) .swal2-radio input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;background:#f0f0f0;color:#666;font-size:1em;font-weight:300;justify-content:center;margin:1em 0 0;overflow:hidden;padding:.625em}div:where(.swal2-container) div:where(.swal2-validation-message):before{background-color:#f27474;border-radius:50%;color:#fff;content:"!";display:inline-block;font-weight:600;height:1.5em;line-height:1.5em;margin:0 .625em;min-width:1.5em;text-align:center;width:1.5em}div:where(.swal2-container) .swal2-progress-steps{align-items:center;background:transparent;flex-wrap:wrap;font-weight:600;margin:1.25em auto;max-width:100%;padding:0}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{background:#2778c4;border-radius:2em;color:#fff;flex-shrink:0;height:2em;line-height:2em;text-align:center;width:2em;z-index:20}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{background:#2778c4;flex-shrink:0;height:.4em;margin:0 -1px;width:2.5em;z-index:10}div:where(.swal2-icon){border:.25em solid #000;border-radius:50%;box-sizing:content-box;cursor:default;font-family:inherit;height:5em;justify-content:center;line-height:5em;margin:2.5em auto .6em;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:5em}div:where(.swal2-icon) .swal2-icon-content{align-items:center;display:flex;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{flex-grow:1;position:relative}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{background-color:#f27474;border-radius:.125em;display:block;height:.3125em;position:absolute;top:2.3125em;width:2.9375em}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:#facea8;color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:#9de0f6;color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:#c9dae1;color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{border-radius:50%;height:7.5em;position:absolute;width:3.75em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{border-radius:7.5em 0 0 7.5em;left:-2.0635em;top:-.4375em;transform:rotate(-45deg);transform-origin:3.75em 3.75em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{border-radius:0 7.5em 7.5em 0;left:1.875em;top:-.6875em;transform:rotate(-45deg);transform-origin:0 3.75em}div:where(.swal2-icon).swal2-success .swal2-success-ring{border:.25em solid hsla(98,55%,69%,.3);border-radius:50%;box-sizing:content-box;height:100%;left:-.25em;position:absolute;top:-.25em;width:100%;z-index:2}div:where(.swal2-icon).swal2-success .swal2-success-fix{height:5.625em;left:1.625em;position:absolute;top:.5em;transform:rotate(-45deg);width:.4375em;z-index:1}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{background-color:#a5dc86;border-radius:.125em;display:block;height:.3125em;position:absolute;z-index:2}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{left:.8125em;top:2.875em;transform:rotate(45deg);width:1.5625em}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{right:.5em;top:2.375em;transform:rotate(-45deg);width:2.9375em}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:swal2-show .3s}.swal2-hide{animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}.swal2-rtl .swal2-close{margin-left:0;margin-right:0}.swal2-rtl .swal2-timer-progress-bar{left:auto;right:0}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotate(2deg)}33%{transform:translateY(0) rotate(-2deg)}66%{transform:translateY(.3125em) rotate(2deg)}to{transform:translateY(0) rotate(0deg)}}@keyframes swal2-toast-hide{to{opacity:0;transform:rotate(1deg)}}@keyframes swal2-toast-animate-success-line-tip{0%{left:.0625em;top:.5625em;width:0}54%{left:.125em;top:.125em;width:0}70%{left:-.25em;top:.625em;width:1.625em}84%{left:.75em;top:1.0625em;width:.5em}to{left:.1875em;top:1.125em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{right:1.375em;top:1.625em;width:0}65%{right:.9375em;top:1.25em;width:0}84%{right:0;top:.9375em;width:1.125em}to{right:.1875em;top:.9375em;width:1.375em}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}to{transform:scale(1)}}@keyframes swal2-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes swal2-animate-success-line-tip{0%{left:.0625em;top:1.1875em;width:0}54%{left:.125em;top:1.0625em;width:0}70%{left:-.375em;top:2.1875em;width:3.125em}84%{left:1.3125em;top:3em;width:1.0625em}to{left:.8125em;top:2.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{right:2.875em;top:3.375em;width:0}65%{right:2.875em;top:3.375em;width:0}84%{right:0;top:2.1875em;width:3.4375em}to{right:.5em;top:2.375em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}to{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;opacity:0;transform:scale(.4)}50%{margin-top:1.625em;opacity:0;transform:scale(.4)}80%{margin-top:-.375em;transform:scale(1.15)}to{margin-top:0;opacity:1;transform:scale(1)}}@keyframes swal2-animate-error-icon{0%{opacity:0;transform:rotateX(100deg)}to{opacity:1;transform:rotateX(0deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-1turn)}to{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{opacity:0;transform:rotate(45deg)}25%{opacity:.4;transform:rotate(-25deg)}50%{opacity:.8;transform:rotate(15deg)}75%{opacity:1;transform:rotate(-5deg)}to{opacity:1;transform:rotateX(0)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-container{background-color:transparent!important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static!important}}body.swal2-toast-shown .swal2-container{background-color:transparent;box-sizing:border-box;max-width:100%;pointer-events:none;width:360px}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}',"",{version:3,sources:["webpack://./node_modules/sweetalert2/src/scss/_toasts.scss","webpack://./node_modules/sweetalert2/src/variables.scss","webpack://./node_modules/sweetalert2/src/scss/_core.scss","webpack://./node_modules/sweetalert2/src/scss/_icons.scss","webpack://./node_modules/sweetalert2/src/scss/_toasts-animations.scss","webpack://./node_modules/sweetalert2/src/scss/_animations.scss","webpack://./node_modules/sweetalert2/src/scss/_body.scss","webpack://./node_modules/sweetalert2/src/scss/_toasts-body.scss"],names:[],mappings:"AACE,yBAOE,eCNU,CDOV,sJCuOF,CD9OE,qBAAA,CACA,yBAAA,CACA,sBAAA,CACA,kDAAA,CAEA,iBAAA,CADA,WCqPkB,CDjPlB,kBAAA,CAEA,2BACE,aAAA,CAGF,sCAGE,aC2OwB,CD7OxB,eC2OqB,CD1OrB,SC2OsB,CDzOtB,kBAAA,CAGF,wCACE,sBAAA,CAGF,sCAGE,aCuOwB,CDzOxB,UCuOqB,CDtOrB,WCwOwB,CDpO1B,mDACE,aCoO6B,CDjO/B,uCAGE,cCkOyB,CDpOzB,eCkOsB,CDjOtB,gBCmOyB,CD/N3B,sCAGE,iBAAA,CAIA,aCuM+B,CD7M/B,eAAA,CACA,aAAA,CAGA,WCuM4B,CDtM5B,QCuM4B,CDzM5B,UC0M+B,CDpMjC,+CAIE,aCyMiC,CD5MjC,eC0M8B,CDxM9B,gBAAA,CADA,SC0M+B,CDvM/B,kBAAA,CAEA,qDACE,SAAA,CAIJ,uCAGE,iBAAA,CAFA,aAAA,CACA,aAAA,CAGA,UAAA,CACA,YAAA,CAFA,SAEA,CAGF,qCAGE,iBAAA,CAFA,aAAA,CACA,aAAA,CAIA,UAAA,CACA,iBAAA,CAFA,aAAA,CADA,SAGA,CAEA,yDAEE,kBAAA,CADA,YAAA,CAEA,eCyKqB,CDxKrB,eAAA,CAIA,uEAEE,UAAA,CADA,SACA,CAKF,4EACE,UAAA,CACA,aAAA,CAEA,yFACE,YAAA,CAGF,0FACE,aAAA,CAMR,wCAEE,WAAA,CADA,0BAAA,CAGA,eAAA,CACA,cAAA,CAGF,uCAGE,aC2I0B,CD7I1B,iBAAA,CACA,iBC4I0B,CDxI5B,wCACE,oBCxFU,CD0FV,6EAKE,iBAAA,CADA,UAAA,CAFA,iBAAA,CACA,WAEA,CAEA,0FAKE,yBAAA,CAHA,UAAA,CADA,SAAA,CAEA,wBAAA,CACA,wBACA,CAGF,2FAIE,yBAAA,CAFA,YAAA,CADA,UAAA,CAEA,wBACA,CAIJ,4DAEE,UAAA,CADA,SACA,CAGF,2DAIE,eAAA,CAFA,YAAA,CADA,KAAA,CAEA,aACA,CAGF,oEACE,cAAA,CAEA,gFAEE,YAAA,CADA,WAAA,CAEA,WAAA,CAGF,iFAEE,aAAA,CADA,WAAA,CAEA,aAAA,CAMA,gFACE,mDAAA,CAGF,iFACE,oDAAA,CAMR,oCACE,8BCyCuB,CDtCzB,oCACE,uCCsCuB,CC3O7B,4BAKE,qBAAA,CAJA,YAAA,CAKA,8IACE,CAGF,6FAAA,CACA,WAAA,CAPA,OAAA,CASA,iBAAA,CADA,cDPwB,CCHxB,cAAA,CAYA,+BDc0B,CCzB1B,YAAA,CAcA,gCAAA,CAEA,8FAEE,yBDMa,CCHf,gDACE,gCAAA,CAGF,0IAGE,6CAAA,CAGF,wHAGE,6CAAA,CAGF,oIAGE,6CAAA,CAGF,yDACE,gBAAA,CAGF,mDACE,aAAA,CACA,uBAAA,CAGF,gHAEE,aAAA,CACA,oBAAA,CAGF,uHAGE,iBAAA,CADA,UACA,CAGF,sDACE,aAAA,CACA,UAAA,CACA,wBAAA,CAGF,sHAEE,aAAA,CACA,UAAA,CACA,qBAAA,CAGF,uHAIE,cAAA,CAFA,aAAA,CACA,UACA,CAGF,sDACE,aAAA,CACA,UAAA,CACA,qBAAA,CAGF,sHAEE,aAAA,CACA,UAAA,CACA,kBAAA,CAGF,uHAEE,eAAA,CACA,UAAA,CAGF,0HAGE,kBAAA,CADA,YACA,CAGF,gDACE,yBAAA,CAGF,oDAUE,eD9HU,CC4HV,WDlHW,CCmHX,iBDjHkB,CC2GlB,qBAAA,CAQA,aDpHU,CC0GV,YAAA,CAWA,mBDzGS,CC0GT,cDzGc,CCgGd,oCAAA,CAEA,cAAA,CACA,kBDlHY,CC6GZ,iBAAA,CAGA,UDjGc,CC2Gd,0DACE,YAAA,CAGF,kEACE,iBAAA,CAIJ,mDAKE,aD5FgB,CC6FhB,iBD5FoB,CC6FpB,eD5FsB,CCwFtB,QD5FiB,CC2FjB,cD5FoB,CC8FpB,kBD5FkB,CCyFlB,iBD5FmB,CCmGnB,iBD5FqB,CC6FrB,mBAAA,CACA,oBAAA,CAGF,sDAKE,kBDmBwB,CCrBxB,qBAAA,CAFA,YAAA,CAGA,cDmBsB,CCjBtB,sBDmB4B,CCjB5B,oBDmBmB,CClBnB,SDmBoB,CCrBpB,UDmBkB,CCxBlB,SD0BoB,CCfhB,kGACE,UAAA,CAGF,8FACE,+DAAA,CAGF,+FACE,+DAAA,CAMR,qDAEE,kBDuCuB,CClCvB,6DDuCqB,CCnCrB,gCDuCwB,CCxCxB,kBDuCyB,CCtCzB,kBDuCwB,CCvCxB,kBDuCwB,CCjDxB,YAAA,CAIA,YDuCkB,CCzClB,sBDuC2B,CCpC3B,gBDuCkB,CCzClB,WD8CwB,CCpC1B,wDAIE,gCDZsB,CCatB,eDZuB,CCQvB,cDZkB,CCalB,oBDZmB,CCanB,yBDVuB,CCcvB,wEACE,cAAA,CAGF,8EAIE,kBAAA,CACA,wBDbkC,CCUlC,QDZwB,CCaxB,mBDZ+B,CCe/B,UDpNQ,CCqNR,aDb2B,CCe3B,4FACE,yCDfgC,CCmBpC,2EAIE,kBAAA,CACA,wBDlB+B,CCe/B,QDjBqB,CCkBrB,mBDjB4B,CCoB5B,UDlOQ,CCmOR,aDlBwB,CCoBxB,yFACE,uCDpB6B,CCwBjC,6EAIE,kBAAA,CACA,wBDvBiC,CCoBjC,QDtBuB,CCuBvB,mBDtB8B,CCyB9B,UDhPQ,CCiPR,aDvB0B,CCyB1B,2FACE,wCDzB+B,CC8BjC,4FACE,yCD1DwB,CC8D5B,sEACE,YDhEuB,CCmEzB,0EACE,QAAA,CAIJ,qDAGE,yBAAA,CACA,aDlIiB,CCmIjB,aDlIqB,CC8HrB,cDlIkB,CCmIlB,iBDlImB,CCsInB,iBDlIsB,CCqIxB,gEAQE,6BD5QkB,CC2QlB,8BD3QkB,CCuQlB,QAAA,CAEA,0BAAA,CADA,MAAA,CAEA,eAAA,CALA,iBAAA,CACA,ODtQkB,CC+QpB,iEAGE,yBD/IkC,CC8IlC,YD/I8B,CC8I9B,UD7IkC,CCkJpC,oDAEE,mBDrPiB,CCoPjB,cDpPiB,CCwPnB,uDAGE,kBDtJ6B,CCmK7B,sBDtJ4B,CCmJ5B,WDtJwB,CCuJxB,iBDxSkB,CC2SlB,UDtJuB,CCyJvB,cAAA,CAFA,qBDtJ6B,CCuJ7B,eDtJ2B,CCyI3B,YDtJwB,CCoJxB,sBDtJiC,CCuKjC,gBDzK8B,CC6J9B,oBAAA,CADA,cDtJqB,CCqJrB,YDrJqB,CCyJrB,eAAA,CADA,SDvJyB,CCyJzB,mCDvJF,CCgJE,WDtJuB,CCmJvB,SDtJ8B,CC2K9B,6DAEE,sBDtJgC,CCuJhC,aDxRQ,CCsRR,cDtRQ,CC2RV,qEAEE,+CDxJgC,CCuJhC,YDvJgC,CC2JlC,yEACE,QAAA,CAIJ,kDAME,aDpRyB,CCqRzB,iBDpR6B,CCqR7B,eDpR+B,CC8Q/B,sBDpRmC,CC2RnC,kBDpR+B,CC8Q/B,QDpR0B,CCsR1B,aDpR4B,CCmR5B,sBDpR2B,CC0R3B,iBDpR8B,CC2Q9B,SAAA,CAUA,oBDpR6B,CCqR7B,qBDpR8B,CCuRhC,4UAME,kBD1RiB,CC6RnB,uKAQE,sBD3RqB,CCyRrB,wBD/RiB,CCgSjB,qBD/RwB,CCiSxB,gED/RF,CCyRE,qBAAA,CAOA,aD5RgB,CC6RhB,iBD/RoB,CCyRpB,0CDrRF,CCoRE,UDxRoB,CCiSpB,0NACE,8BAAA,CACA,oCAAA,CAGF,yLACE,wBD/RqB,CCiSrB,yED9RJ,CC6RI,YD7RJ,CCiSE,6NACE,UAAA,CADF,8MACE,UAAA,CAIJ,yCAEE,eDpYU,CCmYV,kBDnYU,CCsYV,+CACE,SAAA,CAGF,gDAEE,aDzTc,CC0Td,eAAA,CACA,iBAAA,CAHA,SAGA,CAGF,+FAIE,iBDpUkB,CCkUlB,cDzUe,CC4Uf,mBD5Ue,CC0Uf,SD1Ue,CCgVnB,yCACE,cDjViB,CCkVjB,eDjVkB,CCoVpB,wCAIE,sBDjVqB,CCkVrB,iBDnVoB,CCiVpB,gBAAA,CADA,iBAAA,CADA,SD/UoB,CCsVtB,4CACE,aDxUoB,CCyUpB,aDxUqB,CC2UvB,0CAIE,sBD9VqB,CC+VrB,aD9VgB,CC+VhB,iBDjWoB,CC6VpB,cAAA,CADA,aAAA,CAEA,qBD9VoB,CCoWtB,qFAEE,kBAAA,CAEA,eDzbU,CC0bV,aDvWgB,CCqWhB,sBDrWgB,CCyWhB,iGAEE,iBD7WkB,CC4WlB,aD5WkB,CCgXpB,iGACE,aAAA,CACA,aAAA,CAIJ,4DACE,YAAA,CACA,sBDpWgC,CCqWhC,iBDtWuB,CCyWzB,iEACE,kBDtWmC,CC2WnC,kBDvWkC,CCwWlC,UDvW6B,CCwW7B,aDvWiC,CCwWjC,eDvWmC,CCgWnC,sBDtWuC,CCuWvC,cDtW8B,CCwW9B,eAAA,CADA,cDlWmC,CCyWnC,wEASE,wBDzbQ,CCwbR,iBAAA,CAEA,UDleQ,CCydR,WAAA,CACA,oBAAA,C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",sourceRoot:""}]);const o=r},663:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".rc-buttons{z-index:10}.rc-absolute-buttons{bottom:1.25rem;position:fixed;right:1.25rem;text-align:right}.rc-button{border:none!important;border-radius:7px!important;cursor:pointer;font-size:1rem!important;font-weight:700!important;line-height:150%!important;margin:.25rem!important;padding:1rem 1.5rem!important;text-align:center!important}.rc-go-button{background:rgba(255,154,0,.667)!important;color:#fff!important}.rc-go-button:hover{background:#ff9a00!important}.rc-go-button:active{background:#d68200!important}.rc-cancel-button,.rc-custom-button{background:hsla(0,0%,100%,.933)!important;color:#333!important}.rc-cancel-button:hover,.rc-custom-button:hover{background:#ddd!important}.rc-cancel-button:active,.rc-custom-button:active{background:#aaa!important;color:#000!important}.rc-button:disabled{background:#ddd!important;color:#999!important;cursor:default!important}","",{version:3,sources:["webpack://./src/css/buttons.scss"],names:[],mappings:"AAAA,YACE,UAAA,CAGF,qBAGE,cAAA,CAFA,cAAA,CAGA,aAAA,CAFA,gBAEA,CAGF,WAEE,qBAAA,CAMA,2BAAA,CACA,cAAA,CALA,wBAAA,CACA,yBAAA,CAFA,0BAAA,CAIA,uBAAA,CADA,6BAAA,CALA,2BAQA,CAGF,cACE,yCAAA,CACA,oBAAA,CAEA,oBACE,4BAAA,CAGF,qBACE,4BAAA,CAIJ,oCAEE,yCAAA,CACA,oBAAA,CAEA,gDACE,yBAAA,CAGF,kDACE,yBAAA,CACA,oBAAA,CAIJ,oBACE,yBAAA,CACA,oBAAA,CACA,wBAAA",sourceRoot:""}]);const o=r},290:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".my__swal2__container .swal2-select{border:2px solid #aaa!important;border-radius:5px!important;font-family:inherit!important;font-size:1.2rem!important;margin:auto 1.6rem!important;outline:none!important;padding-top:.5rem!important}.rc-form{font-family:inherit;font-size:2rem;pointer-events:auto!important}.rc-form .rc-form-inputs{display:flex;justify-content:space-between!important;margin:1rem 0}.rc-form .rc-form-inputs .rc-form-input,.rc-form .rc-form-inputs span{flex-grow:1;font-family:inherit;font-size:inherit;padding:.5rem}.rc-form .rc-form-inputs span{font-weight:700}.rc-form .rc-form-input{border:2px solid #aaa;border-radius:5px;outline:none;width:min(100%,10rem)}.rc-form .rc-form-input.rc-input-error{border-color:#ac0d0d!important;color:#ac0d0d!important}.rc-form .rc-form-input+.rc-form-input{margin-left:.5rem}.arrow-two-sided-svg{position:fixed}.arrow-two-sided-svg .arrow-two-sided{fill:#ff9a00}.arrow-two-sided-horizontal{bottom:10%;left:0;right:0;width:100%}.arrow-two-sided-vertical{bottom:0;height:100%;right:5%;top:0}","",{version:3,sources:["webpack://./src/css/check.scss"],names:[],mappings:"AAAA,oCAME,+BAAA,CADA,2BAAA,CADA,6BAAA,CAHA,0BAAA,CACA,4BAAA,CAKA,sBAAA,CAJA,2BAIA,CAOF,SAEE,mBAAA,CADA,cAAA,CAEA,6BAAA,CAEA,yBACE,YAAA,CACA,uCAAA,CACA,aAAA,CAEA,sEAEE,WAAA,CAEA,mBAAA,CACA,iBAAA,CAFA,aAEA,CAGF,8BACE,eAAA,CAIJ,wBACE,qBAAA,CAEA,iBAAA,CADA,YAAA,CAEA,qBAAA,CAEA,uCACE,8BAAA,CACA,uBAAA,CAIJ,uCACE,iBAAA,CAIJ,qBACE,cAAA,CAEA,sCACE,YAAA,CAIJ,4BAEE,UAAA,CACA,MAAA,CACA,OAAA,CAHA,UAGA,CAGF,0BAIE,QAAA,CAHA,WAAA,CACA,QAAA,CACA,KACA",sourceRoot:""}]);const o=r},2945:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#eye-side{font-weight:700}#blind-spot-canvas{bottom:0;display:block;left:0;margin:0;padding:0;position:fixed;right:0;top:0;z-index:-1}#blind-spot-instruction{max-width:unset!important}@media(min-width:641px){#blind-spot-instruction{font-size:1.1rem!important;width:65%!important}}@media(max-width:640px){#blind-spot-instruction{font-size:.9rem!important;width:90%!important}}#pip-video{display:none}#video-canvas{border-radius:6px;bottom:1rem;display:block;left:1rem;position:absolute;z-index:1000}#rc-ruler{cursor:pointer;max-height:120px;overflow:hidden;position:fixed;-webkit-user-select:none;-moz-user-select:none;user-select:none}#rc-ruler-scales{left:30px;pointer-events:none;position:absolute;top:0;z-index:1}#rc-ruler-scales #size-arrow{opacity:.5;transform:rotate(90deg) translateY(calc(50% + 3px))}#rc-ruler-scales .rc-ruler-scale-text{color:rgba(44,46,67,.667);font-weight:700;margin:0!important;padding:0;position:absolute;top:32px!important;transform:translate(-50%)!important}#rc-ruler-scales .rc-ruler-scale{display:block;position:absolute;top:0;transform:translate(-1px);width:2px;z-index:2}#rc-ruler-scales .rc-ruler-major{background-color:rgba(44,46,67,.933);height:30px}#rc-ruler-scales .rc-ruler-secondary{background-color:rgba(89,82,96,.867);height:24px}#rc-ruler-scales .rc-ruler-minor{background-color:rgba(89,82,96,.4);height:16px}.hide-nudger .calibration-nudger{display:none!important;opacity:0!important}.calibration-nudger,.gaze-nudger{bottom:0;box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:fixed;right:0;scrollbar-width:none;text-align:left;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:999999999}.calibration-nudger *,.gaze-nudger *{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}#rc-distance-correct{margin:0 auto auto;overflow-wrap:break-word;padding:2rem;text-align:left;width:100%}#rc-distance-correct #rc-distance-correct-instruction{font-size:7rem;font-weight:700;line-height:100%;margin:0 auto 2rem}#rc-distance-correct #rc-distance-correct-guide{font-size:3rem;font-weight:500;line-height:300%}#rc-distance-correct #rc-distance-correct-guide .rc-distance-num{border-radius:7px!important;font-family:monospace!important;font-size:9rem;font-weight:700;padding:.5rem;vertical-align:middle}","",{version:3,sources:["webpack://./src/css/distance.scss"],names:[],mappings:"AAAA,UACE,eAAA,CAGF,mBAME,QAAA,CAJA,aAAA,CAGA,MAAA,CAIA,QAAA,CADA,SAAA,CAPA,cAAA,CAMA,OAAA,CAHA,KAAA,CADA,UAMA,CAGF,wBAEE,yBAAA,CAGF,wBACE,wBAEE,0BAAA,CADA,mBACA,CAAA,CAIJ,wBACE,wBAEE,yBAAA,CADA,mBACA,CAAA,CAIJ,WACE,YAAA,CAGF,cAME,iBAAA,CAFA,WAAA,CADA,aAAA,CAEA,SAAA,CAHA,iBAAA,CADA,YAKA,CAKF,UAKE,cAAA,CAHA,gBAAA,CACA,eAAA,CAFA,cAAA,CAKA,wBAAA,CAAA,qBAAA,CAAA,gBAAA,CAGF,iBAGE,SAAA,CAEA,mBAAA,CAJA,iBAAA,CACA,KAAA,CAEA,SACA,CAEA,6BAEE,UAAA,CADA,mDACA,CAGF,sCAKE,yBAAA,CACA,eAAA,CAHA,kBAAA,CACA,SAAA,CAHA,iBAAA,CACA,kBAAA,CAKA,mCAAA,CAGF,iCAEE,aAAA,CADA,iBAAA,CAEA,KAAA,CAEA,yBAAA,CADA,SAAA,CAEA,SAAA,CAGF,iCACE,oCAAA,CACA,WAAA,CAGF,qCACE,oCAAA,CACA,WAAA,CAGF,iCACE,kCAAA,CACA,WAAA,CAOF,iCACE,sBAAA,CACA,mBAAA,CAIJ,iCASE,QAAA,CAIA,qBAAA,CARA,WAAA,CAEA,MAAA,CAGA,QAAA,CACA,eAAA,CARA,cAAA,CAKA,OAAA,CAOA,oBAAA,CADA,eAAA,CARA,KAAA,CAMA,wBAAA,CAAA,qBAAA,CAAA,gBAAA,CARA,UAAA,CAFA,iBAaA,CAEA,qCACE,wHAAA,CAKJ,qBAGE,kBAAA,CAEA,wBAAA,CADA,YAAA,CAHA,eAAA,CACA,UAGA,CAEA,sDAEE,cAAA,CADA,eAAA,CAGA,gBAAA,CADA,kBACA,CAGF,gDAEE,cAAA,CADA,eAAA,CAEA,gBAAA,CAEA,iEAEE,2BAAA,CAEA,+BAAA,CAEA,cAAA,CAHA,eAAA,CAFA,aAAA,CAIA,qBACA",sourceRoot:""}]);const o=r},4636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,":root{--rc-panel-theme-color:#3490de;--rc-panel-darken-color:#185b94;--rc-panel-theme-color-semi:#3490de66;--rc-panel-darken-color-semi:#185b9488}.rc-panel{background-color:var(--rc-panel-theme-color);border-radius:10px!important;box-shadow:var(--rc-panel-darken-color-semi) 0 50px 100px -20px,var(--rc-panel-theme-color-semi) 0 30px 60px -30px!important;display:block;margin-left:auto!important;margin-right:auto!important;max-width:720px!important;overflow:hidden;padding:.75rem!important;position:relative;width:100%}.rc-panel *{box-sizing:border-box;outline:none;text-rendering:optimizeLegibility;vertical-align:baseline;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-kerning:normal;scrollbar-width:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.rc-panel .rc-panel-title{color:#fff!important;font-size:2rem!important;font-weight:600!important;margin:1rem 1rem 0!important}.rc-panel .rc-panel-description{color:hsla(0,0%,100%,.8)!important;font-size:1rem!important;font-weight:500!important;margin:.5rem 1rem 0!important}.rc-panel #rc-panel-language-parent{display:flex;flex-direction:row-reverse;margin:0;padding:0}.rc-panel #rc-panel-language-parent #rc-panel-lang-picker{background-color:hsla(0,0%,100%,.8)!important;border:none!important;border-radius:5px!important;display:block;font-size:1rem!important;font-weight:500!important;margin:.25rem .25rem 0!important;outline:none!important;padding:.25rem!important}.rc-panel .rc-panel-steps{margin:-3rem 0 0!important;padding-top:4rem!important}.rc-panel .rc-panel-steps.rc-panel-steps-l,.rc-panel .rc-panel-steps.rc-panel-steps-s{display:flex!important;justify-content:space-between!important}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step{background:hsla(0,0%,100%,.8);flex-grow:1!important;margin:.25rem!important;padding:0!important;position:relative;text-align:center;transition:background-color .2s}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step .rc-panel-step-use,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step .rc-panel-step-use{font-size:1rem!important;line-height:170%!important;margin:0!important;padding:0 .3rem!important;position:absolute;right:0;top:0}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step .rc-panel-step-use svg,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step .rc-panel-step-use svg{height:1rem;width:1rem;fill:var(--rc-panel-darken-color)}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step .rc-panel-step-name,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step .rc-panel-step-name{color:var(--rc-panel-darken-color);font-size:1rem!important;font-weight:700!important;line-height:150%!important;white-space:nowrap}.rc-panel .rc-panel-steps.rc-panel-steps-l{flex-flow:row nowrap;max-width:100%;overflow-x:scroll}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step-name{margin:1.5rem .5rem!important}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step-use-tip{bottom:110%!important;display:flex!important;left:50%!important;position:absolute!important;transform:translate(-50%)!important}.rc-panel .rc-panel-steps.rc-panel-steps-s{flex-flow:column nowrap;overflow-x:hidden}.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step{overflow-x:hidden;text-align:left;white-space:nowrap}.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step-name{margin:1.2rem .75rem 1.2rem 1.5rem!important}.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step-use-tip{display:inline-flex!important;position:relative!important}.rc-panel .rc-panel-steps .rc-panel-step{border:none!important;border-radius:7px!important}.rc-panel .rc-panel-steps .rc-panel-step .rc-panel-step-name{display:inline-block!important;position:relative!important}.rc-panel .rc-panel-steps .rc-panel-step-use-tip{align-items:center!important;background-color:rgba(255,154,0,.933)!important;border:none!important;border-radius:7px!important;color:#fff!important;font-size:.75rem!important;font-weight:500!important;justify-content:center!important;line-height:100%!important;margin:0!important;opacity:0;padding:.7rem .5rem!important;pointer-events:none;text-align:center!important;transition:opacity .2s;width:-moz-max-content!important;width:max-content!important;z-index:10!important}.rc-panel .rc-panel-steps .rc-panel-step-use-tip svg{height:.75rem;width:.75rem;fill:#fff}.rc-panel .rc-panel-steps .rc-panel-step-use-tip svg:last-of-type{margin-right:5px}.rc-panel .rc-panel-steps .rc-panel-step-todo:focus,.rc-panel .rc-panel-steps .rc-panel-step-todo:hover{background-color:#fff}.rc-panel .rc-panel-steps .rc-panel-step-todo:focus .rc-panel-step-use-tip,.rc-panel .rc-panel-steps .rc-panel-step-todo:hover .rc-panel-step-use-tip{opacity:1!important}.rc-panel .rc-panel-steps .rc-panel-step-todo:active{background-color:hsla(0,0%,93%,.8)}.rc-panel .rc-panel-steps .rc-panel-step-finished{background-color:hsla(0,0%,73%,.8)!important}.rc-panel .rc-panel-steps .rc-panel-step-inactive{opacity:.6;pointer-events:none}.rc-panel .rc-panel-steps .rc-panel-step-active{cursor:pointer;opacity:1}.rc-panel ::-webkit-scrollbar{display:none;width:0}.rc-panel .rc-panel-debug-control{background-color:hsla(0,0%,100%,.8);border:3px solid #e00;border-radius:7px;margin:1rem 0 0;overflow:hidden;padding:.5rem}.rc-panel .rc-panel-debug-control *{color:#ac0d0d}.rc-panel .rc-panel-debug-control h2,.rc-panel .rc-panel-debug-control h3,.rc-panel .rc-panel-debug-control p{margin:0!important}.rc-panel .rc-panel-debug-control h2{font-size:1.2rem!important;font-weight:700!important}.rc-panel .rc-panel-debug-control h3{font-size:.9rem;font-variant:small-caps;font-weight:500;padding-bottom:.3rem;padding-top:.5rem}.rc-panel .rc-panel-debug-control .rc-panel-debug-bold-text{font-size:1rem!important;font-weight:700}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-next{background-color:#e00;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:.9rem!important;margin:1rem 0 0;padding:.5rem 1.2rem!important}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-next:hover{background-color:#ac0d0d}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row{display:inline-flex;justify-content:flex-start!important;width:100%}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element{flex-grow:1;overflow-x:hidden;padding:0 .1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element:first-of-type{padding-left:0}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element:last-of-type{padding-right:0}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element p{color:#ac0d0d;font-size:.65rem!important;line-height:150%!important;padding-left:1px!important}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element input{background-color:hsla(0,0%,100%,.8);border:1px solid #e99!important;border-radius:3px!important;font-size:.8rem;margin:0!important;padding:.3rem!important;pointer-events:auto;-webkit-user-select:auto;-moz-user-select:auto;user-select:auto;width:100%}","",{version:3,sources:["webpack://./src/css/panel.scss"],names:[],mappings:"AAAA,MACE,8BAAA,CACA,+BAAA,CACA,qCAAA,CACA,sCAAA,CAGF,UAKE,4CAAA,CAIA,4BAAA,CACA,4HACE,CATF,aAAA,CACA,0BAAA,CACA,2BAAA,CAGA,yBAAA,CAMA,eAAA,CALA,wBAAA,CAPA,iBAAA,CAKA,UAOA,CAEA,YAGE,qBAAA,CAFA,YAAA,CAGA,iCAAA,CAFA,uBAAA,CAGA,2BAAA,CACA,iCAAA,CAGA,wHAAA,CAFA,mBAAA,CAIA,oBAAA,CAHA,wBAAA,CAAA,qBAAA,CAAA,gBAGA,CAGF,0BACE,oBAAA,CAEA,wBAAA,CACA,yBAAA,CAFA,4BAEA,CAGF,gCACE,kCAAA,CAEA,wBAAA,CACA,yBAAA,CAFA,6BAEA,CAGF,oCACE,YAAA,CACA,0BAAA,CACA,QAAA,CACA,SAAA,CAEA,0DAEE,6CAAA,CACA,qBAAA,CAMA,2BAAA,CARA,aAAA,CAMA,wBAAA,CACA,yBAAA,CAHA,gCAAA,CADA,sBAAA,CAEA,wBAGA,CAIJ,0BACE,0BAAA,CACA,0BAAA,CAEA,sFAEE,sBAAA,CACA,uCAAA,CAEA,oHAME,6BAAA,CAJA,qBAAA,CACA,uBAAA,CAEA,mBAAA,CAJA,iBAAA,CAGA,iBAAA,CAGA,+BAAA,CAMA,0JAME,wBAAA,CACA,0BAAA,CAFA,kBAAA,CADA,yBAAA,CAHA,iBAAA,CACA,OAAA,CACA,KAIA,CAEA,kKAEE,WAAA,CADA,UAAA,CAEA,iCAAA,CAIJ,4JAIE,kCAAA,CAFA,wBAAA,CACA,yBAAA,CAFA,0BAAA,CAIA,kBAAA,CAKN,2CACE,oBAAA,CACA,cAAA,CACA,iBAAA,CAEA,+DACE,6BAAA,CAGF,kEAGE,qBAAA,CADA,sBAAA,CAEA,kBAAA,CAHA,2BAAA,CAIA,mCAAA,CAIJ,2CACE,uBAAA,CACA,iBAAA,CAEA,0DAEE,iBAAA,CADA,eAAA,CAEA,kBAAA,CAGF,+DACE,4CAAA,CAGF,kEAEE,6BAAA,CADA,2BACA,CAIJ,yCAEE,qBAAA,CADA,2BACA,CAEA,6DAEE,8BAAA,CADA,2BACA,CAUJ,iDAUE,4BAAA,CAJA,+CAAA,CAQA,qBAAA,CADA,2BAAA,CANA,oBAAA,CAIA,0BAAA,CACA,yBAAA,CAHA,gCAAA,CASA,0BAAA,CAFA,kBAAA,CAZA,SAAA,CAWA,6BAAA,CAKA,mBAAA,CAZA,2BAAA,CAWA,sBAAA,CAdA,gCAAA,CAAA,2BAAA,CAYA,oBAGA,CAEA,qDAEE,aAAA,CADA,YAAA,CAEA,SAAA,CAGF,kEACE,gBAAA,CAKF,wGAEE,qBAAA,CAEA,sJAEE,mBAAA,CAIJ,qDACE,kCAAA,CAIJ,kDACE,4CAAA,CAGF,kDACE,UAAA,CACA,mBAAA,CAGF,gDAEE,cAAA,CADA,SACA,CAIJ,8BAEE,YAAA,CADA,OACA,CAKF,kCAME,mCAAA,CAFA,qBAAA,CACA,iBAAA,CAHA,eAAA,CAKA,eAAA,CAJA,aAIA,CAEA,oCACE,aAAA,CAGF,8GAGE,kBAAA,CAGF,qCAEE,0BAAA,CADA,yBACA,CAGF,qCAEE,eAAA,CADA,uBAAA,CAEA,eAAA,CAEA,oBAAA,CADA,iBACA,CAGF,4DACE,wBAAA,CACA,eAAA,CAGF,+DAIE,qBAAA,CAGA,WAAA,CADA,iBAAA,CAHA,UAAA,CAKA,cAAA,CAPA,yBAAA,CACA,eAAA,CAGA,8BAGA,CAEA,qEACE,wBAAA,CAIJ,mEACE,mBAAA,CACA,oCAAA,CACA,UAAA,CAEA,kFACE,WAAA,CAEA,iBAAA,CADA,eAAA,CAKA,mBAAA,CADA,wBAAA,CAAA,qBAAA,CAAA,gBAAA,CAFA,kBAGA,CAEA,gGACE,cAAA,CAGF,+FACE,eAAA,CAGF,oFAIE,aAAA,CADA,0BAAA,CADA,0BAAA,CADA,0BAGA,CAGF,wFAOE,mCAAA,CAFA,+BAAA,CACA,2BAAA,CAHA,eAAA,CAFA,kBAAA,CACA,uBAAA,CAOA,mBAAA,CADA,wBAAA,CAAA,qBAAA,CAAA,gBAAA,CAJA,UAKA",sourceRoot:""}]);const o=r},5151:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#size-card,#size-usba,#size-usbc{display:block;height:auto;left:2rem;position:absolute;z-index:2}#size-arrow{display:block;height:auto;position:absolute;width:70px;z-index:1}#size-arrow-fill{transition:fill .3s}.minor{transition:opacity .25s}.rc-slider:active~.size-obj .minor{opacity:0}#matching-obj{background-color:#fff;border:none;border-radius:7px;font-size:1.1rem;font-weight:600;margin-bottom:unset;margin-left:.3rem;margin-right:.3rem;margin-top:unset;padding-bottom:unset;padding-left:.3rem;padding-right:.3rem;padding-top:unset;pointer-events:auto!important;vertical-align:middle}@media(min-width:481px){.rc-size-obj-selection{display:inline-flex}}@media(max-width:480px){.rc-size-obj-selection{display:inline-block}}","",{version:3,sources:["webpack://./src/css/screenSize.scss"],names:[],mappings:"AAAA,iCAIE,aAAA,CAGA,WAAA,CADA,SAAA,CAHA,iBAAA,CAKA,SAAA,CAGF,YAEE,aAAA,CAGA,WAAA,CAJA,iBAAA,CAGA,UAAA,CAEA,SAAA,CAGF,iBACE,mBAAA,CAGF,OACE,uBAAA,CAIF,mCACE,SAAA,CAKF,cAGE,qBAAA,CADA,WAAA,CADA,iBAAA,CAMA,gBAAA,CADA,eAAA,CADA,mBAAA,CAAA,iBAAA,CAAA,kBAAA,CAAA,gBAAA,CADA,oBAAA,CAAA,kBAAA,CAAA,mBAAA,CAAA,iBAAA,CAKA,6BAAA,CADA,qBACA,CAGF,wBACE,uBACE,mBAAA,CAAA,CAIJ,wBACE,uBACE,oBAAA,CAAA",sourceRoot:""}]);const o=r},5319:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".rc-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:linear-gradient(90deg,#ffc772,#ffc772 60%,#fff 0);border-radius:5px;cursor:grab;direction:ltr!important;display:block;height:10px;left:2rem;opacity:1;position:absolute;transition:opacity .3s;width:calc(100% - 4rem);z-index:10}.rc-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:#ff9a00;border:1px solid #cc7a00;border-radius:15px;box-shadow:0 0 12px 0 rgba(136,82,0,.2);cursor:inherit;height:30px;width:30px}.rc-slider::-moz-range-thumb{-moz-appearance:none;appearance:none;background:#ff9a00;border:1px solid #cc7a00;border-radius:15px;box-shadow:0 0 12px 0 rgba(136,82,0,.2);cursor:inherit;height:30px;width:30px}.rc-slider::-ms-thumb{appearance:none;background:#ff9a00;border:1px solid #cc7a00;border-radius:15px;box-shadow:0 0 12px 0 rgba(136,82,0,.2);cursor:inherit;height:30px;width:30px}","",{version:3,sources:["webpack://./src/css/slider.scss"],names:[],mappings:"AAAA,WAGE,uBAAA,CAAA,oBAAA,CAAA,eAAA,CAGA,4DAAA,CAIA,iBAAA,CAEA,WAAA,CAEA,uBAAA,CAZA,aAAA,CAGA,WAAA,CAIA,SAAA,CAFA,SAAA,CANA,iBAAA,CAYA,sBAAA,CATA,uBAAA,CAOA,UAGA,CAkBF,iCAVE,uBAAA,CAAA,eAAA,CAKA,kBAAA,CADA,wBAAA,CADA,kBAAA,CAGA,uCAAA,CACA,cAAA,CALA,WAAA,CADA,UAMA,CAOF,6BAdE,oBAAA,CAAA,eAAA,CAKA,kBAAA,CADA,wBAAA,CADA,kBAAA,CAGA,uCAAA,CACA,cAAA,CALA,WAAA,CADA,UAMA,CAWF,sBAlBE,eAAA,CAKA,kBAAA,CADA,wBAAA,CADA,kBAAA,CAGA,uCAAA,CACA,cAAA,CALA,WAAA,CADA,UAMA",sourceRoot:""}]);const o=r},4889:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#webgazerVideoContainer .webgazer-videoinput-select{background:hsla(0,0%,100%,.8)!important;border:none!important;border-radius:.6rem!important;color:#666;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:.6rem;left:0;line-height:100%;margin:.3rem;outline:none!important;padding:.2rem .3rem;position:absolute;top:0;z-index:9}","",{version:3,sources:["webpack://./src/css/video.scss"],names:[],mappings:"AACE,oDAcE,uCAAA,CAHA,qBAAA,CAEA,6BAAA,CAEA,UAAA,CARA,wHAAA,CAEA,eAAA,CALA,MAAA,CAMA,gBAAA,CALA,YAAA,CAOA,sBAAA,CANA,mBAAA,CAJA,iBAAA,CACA,KAAA,CAFA,SAcA",sourceRoot:""}]);const o=r},9057:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#gaze-system-instruction{top:65%;white-space:pre}.gaze-nudge-instruction{top:65%}.gaze-calibration-dot{background:#ff005c80;cursor:auto;display:block;position:fixed!important;transition-timing-function:ease-in-out;transition:left .5s,right .5s,top .5s,bottom .5s;z-index:999999998}.gaze-calibration-dot-click{background:#ff005c;cursor:pointer;margin:auto;position:absolute;text-align:center;vertical-align:middle}.gaze-calibration-dot-click:active{opacity:.3}.gaze-calibration-dot-text{color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:.9rem;font-weight:500;vertical-align:text-bottom}#webgazerGazeDot,#webgazerGazeDot-tempClone,.gaze-calibration-dot-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#webgazerGazeDot,#webgazerGazeDot-tempClone{background-color:#111d5e;border-radius:5px;opacity:.5;position:fixed;z-index:9999999999}#webgazerVideoContainer{border-radius:5px;display:block;overflow:hidden;position:fixed!important;transform-origin:bottom left;z-index:999999997}#webgazerFaceFeedbackBox,#webgazerVideoContainer,#webgazerVideoContainer *{-webkit-user-select:none;-moz-user-select:none;user-select:none}#webgazerFaceFeedbackBox{border-radius:10px;box-sizing:border-box;opacity:.6;pointer-events:none}.rc-crosshair,.rc-gaze-nudger-arrows{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.rc-crosshair{border-radius:50%;cursor:pointer;display:block;height:40px;position:fixed!important;transition-timing-function:ease-in-out;transition:left .5s,right .5s,top .5s,bottom .5s;width:40px;z-index:999999999}.rc-crosshair-component{background-color:#000;left:50%;margin:auto;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}","",{version:3,sources:["webpack://./src/css/gaze.css"],names:[],mappings:"AAAA,yBACE,OAAQ,CACR,eACF,CAEA,wBACE,OACF,CAEA,sBACE,oBAAqB,CAGrB,WAAe,CADf,aAAc,CADd,wBAA0B,CAI1B,sCAAuC,CACvC,gDAIa,CANb,iBAOF,CAEA,4BAEE,kBAAmB,CAEnB,cAAe,CADf,WAAY,CAFZ,iBAAkB,CAIlB,iBAAkB,CAClB,qBACF,CAEA,mCACE,UACF,CAEA,2BAIE,UAAW,CAHX,wHAC8D,CAG9D,eAAiB,CAFjB,eAAgB,CAGhB,0BAGF,CAIA,uEALE,mBAAoB,CADpB,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAeF,CATA,4CAKE,wBAAyB,CACzB,iBAAkB,CAFlB,UAAY,CAFZ,cAAe,CACf,kBAMF,CAEA,wBAKE,iBAAkB,CAHlB,aAAc,CAKd,eAAgB,CAJhB,wBAA0B,CAC1B,4BAA6B,CAH7B,iBASF,CAMA,2EAPE,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAcF,CAPA,yBAGE,kBAAmB,CADnB,qBAAsB,CAEtB,UAAY,CACZ,mBAEF,CAIA,qCAEE,iBAAkB,CAIlB,wBAAiB,CAAjB,qBAAiB,CAAjB,gBACF,CAEA,cAcE,iBAAkB,CARlB,cAAe,CAJf,aAAc,CAEd,WAAY,CAHZ,wBAA0B,CAM1B,sCAAuC,CACvC,gDAIa,CATb,UAAW,CAEX,iBAUF,CAEA,wBAQE,qBAAsB,CALtB,QAAS,CAET,WAAY,CACZ,mBAAoB,CALpB,iBAAkB,CAClB,OAAQ,CAER,8BAAgC,CAGhC,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAEF",sourcesContent:["#gaze-system-instruction {\n top: 65%;\n white-space: pre;\n}\n\n.gaze-nudge-instruction {\n top: 65%;\n}\n\n.gaze-calibration-dot {\n background: #ff005c80;\n position: fixed !important;\n display: block;\n cursor: initial;\n z-index: 999999998;\n transition-timing-function: ease-in-out;\n transition:\n left 0.5s,\n right 0.5s,\n top 0.5s,\n bottom 0.5s;\n}\n\n.gaze-calibration-dot-click {\n position: absolute;\n background: #ff005c;\n margin: auto;\n cursor: pointer;\n text-align: center;\n vertical-align: middle;\n}\n\n.gaze-calibration-dot-click:active {\n opacity: 0.3;\n}\n\n.gaze-calibration-dot-text {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n font-weight: 500;\n color: #fff;\n font-size: 0.9rem;\n vertical-align: text-bottom;\n user-select: none;\n pointer-events: none;\n}\n\n/* ----------------------------- WebGazer Native ---------------------------- */\n\n#webgazerGazeDot,\n#webgazerGazeDot-tempClone {\n position: fixed;\n z-index: 9999999999;\n opacity: 0.5;\n background-color: #111d5e;\n border-radius: 5px;\n pointer-events: none;\n user-select: none;\n}\n\n#webgazerVideoContainer {\n z-index: 999999997;\n display: block;\n position: fixed !important;\n transform-origin: bottom left;\n border-radius: 5px;\n /* opacity: 0.8; */\n overflow: hidden;\n /* pointer-events: none; */\n user-select: none;\n}\n\n#webgazerVideoContainer * {\n user-select: none;\n}\n\n#webgazerFaceFeedbackBox {\n /* TODO Set style in sub-module */\n box-sizing: border-box;\n border-radius: 10px;\n opacity: 0.6;\n pointer-events: none;\n user-select: none;\n}\n\n/* ------------------------------- Gaze Nudger ------------------------------ */\n\n.rc-crosshair,\n.rc-gaze-nudger-arrows {\n position: absolute;\n /* top: 50%;\n left: 50%;\n transform: translate(-50%, -50%); */\n user-select: none;\n}\n\n.rc-crosshair {\n position: fixed !important;\n display: block;\n width: 40px;\n height: 40px;\n z-index: 999999999;\n cursor: pointer;\n transition-timing-function: ease-in-out;\n transition:\n left 0.5s,\n right 0.5s,\n top 0.5s,\n bottom 0.5s;\n /* filter: drop-shadow(0 0 3px #fff); */\n border-radius: 50%;\n}\n\n.rc-crosshair-component {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n margin: auto;\n pointer-events: none;\n user-select: none;\n background-color: #000;\n}\n"],sourceRoot:""}]);const o=r},9725:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#calibration-background{bottom:0;box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;overflow-y:scroll;position:fixed;right:0;scrollbar-width:none;text-align:center;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:999999990}#calibration-background::-webkit-scrollbar{display:none;width:0}#calibration-background *{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}#calibration-background p{line-height:150%}.calibration-instruction{pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.calibration-instruction-scrollable{height:200%}.calibration-trackDistance-check-progessBar-container{background-color:#f3f3f3;bottom:0;height:40px;left:0;position:fixed;width:100%;z-index:999999999999}.calibration-trackDistance-check-progessBar{background-color:#4caf50;height:100%;transition:width .3s ease;width:0}.calibration-trackDistance-check-progessBar-text{color:#000;font-size:30px;left:50%;margin:0;position:absolute;top:10%}.calibration-trackDistance-check-viewingDistance-container{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;line-height:1;position:fixed;right:0;top:0;width:50%;z-index:999999999999}.calibration-trackDistance-check-viewingDistance{font-size:60vh;margin:0}.calibration-trackDistance-check-viewingDistance-units{font-size:30vh;margin:0}.calibration-instruction-left{bottom:0;left:0;margin:auto;right:50%;top:0}.calibration-instruction h1{font-weight:700;min-width:360px}.calibration-instruction *{font-size:1.2rem;line-height:170%;margin:0;padding:0}.calibration-instruction p{margin-top:1rem;white-space:pre-line}.calibration-description{line-height:170%}.rc-hang-description{font-size:1rem!important;margin-top:50vh!important}@media (min-width:481px){.calibration-instruction{margin:2rem}.calibration-instruction h1{font-size:2.5rem!important;line-height:100%}.calibration-description{width:calc(100% - 4rem);width:max(min(100% - 4rem,960px),300px)}.calibration-description,.calibration-description *{font-size:1.2rem}.calibration-credit-text{font-size:.9rem!important}}@media (max-width:480px){.calibration-instruction{margin:1rem}.calibration-instruction h1{font-size:1.8rem!important;line-height:120%}.calibration-description{width:calc(100% - 1rem)}.calibration-description,.calibration-description *{font-size:1rem}.calibration-credit-text{font-size:.7rem!important}}.float-instruction{background:hsla(0,0%,100%,.9);border-radius:10px;font-size:1rem;font-weight:500;left:50%;margin:0;max-width:25rem;padding:10px 17px;position:fixed;text-align:center;transform:translate(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:999999991}.swal2-container{z-index:999999999!important}.calibration-credit-text{bottom:3px!important;color:#999!important;line-height:100%!important;margin:0!important;padding:0!important;position:fixed!important;text-align:center!important;width:100%!important}.lock-view{overflow:hidden!important}.rc-lang-ltr{direction:ltr!important;text-align:left!important}.rc-lang-rtl{direction:rtl!important;text-align:right!important}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}","",{version:3,sources:["webpack://./src/css/main.css"],names:[],mappings:"AACA,wBAQE,QAAS,CAMT,qBAAsB,CAVtB,WAAY,CAEZ,MAAO,CAGP,QAAS,CAET,eAAgB,CAChB,iBAAkB,CAVlB,cAAe,CAKf,OAAQ,CASR,oBAAqB,CADrB,iBAAkB,CAVlB,KAAM,CAQN,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAAiB,CAVjB,UAAW,CAFX,iBAgBF,CAEA,2CAEE,YAAa,CADb,OAEF,CAEA,0BACE,wHAEF,CAEA,0BACE,gBACF,CAEA,yBAGE,mBAAoB,CAFpB,iBAAkB,CAClB,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAEF,CAEA,oCACE,WACF,CAEA,sDAME,wBAAyB,CAJzB,QAAS,CAGT,WAAY,CAFZ,MAAO,CAFP,cAAe,CAGf,UAAW,CAGX,oBACF,CAEA,4CAGE,wBAAyB,CAFzB,WAAY,CAGZ,yBAA2B,CAF3B,OAGF,CAEA,iDAKE,UAAW,CACX,cAAe,CAHf,QAAS,CAIT,QAAS,CANT,iBAAkB,CAClB,OAMF,CACA,2DAQE,kBAAmB,CAFnB,YAAa,CACb,qBAAsB,CAFtB,WAAY,CAIZ,sBAAuB,CAEvB,aAAc,CAVd,cAAe,CAEf,OAAQ,CADR,KAAM,CAEN,SAAU,CAMV,oBAEF,CACA,iDACE,cAAe,CACf,QACF,CACA,uDACE,cAAe,CACf,QACF,CAEA,8BAKE,QAAS,CAHT,MAAO,CAIP,WAAY,CAHZ,SAAU,CACV,KAGF,CAEA,4BAEE,eAAgB,CADhB,eAEF,CAEA,2BACE,gBAAiB,CACjB,gBAAiB,CACjB,QAAS,CACT,SACF,CAEA,2BAEE,eAAgB,CADhB,oBAEF,CAEA,yBACE,gBACF,CAEA,qBAEE,wBAA0B,CAD1B,yBAEF,CAKA,yBACE,yBACE,WACF,CAEA,4BAEE,0BAA4B,CAD5B,gBAEF,CAEA,yBACE,uBAAwB,CACxB,uCACF,CAEA,oDAEE,gBACF,CAEA,yBACE,yBACF,CACF,CAEA,yBACE,yBACE,WACF,CAEA,4BAEE,0BAA4B,CAD5B,gBAEF,CAEA,yBACE,uBACF,CAEA,oDAEE,cACF,CAEA,yBACE,yBACF,CACF,CAEA,mBAIE,6BAAoC,CAMpC,kBAAmB,CACnB,cAAe,CACf,eAAgB,CALhB,QAAS,CADT,QAAS,CAET,eAAgB,CAHhB,iBAAkB,CAJlB,cAAe,CACf,iBAAkB,CAOlB,yBAA6B,CAN7B,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAAiB,CAUjB,iBACF,CAIA,iBACE,2BACF,CAIA,yBAGE,oBAAsB,CACtB,oBAAsB,CAGtB,0BAA4B,CAF5B,kBAAoB,CACpB,mBAAqB,CALrB,wBAA0B,CAO1B,2BAA6B,CAN7B,oBAOF,CAIA,WACE,yBACF,CAIA,aACE,uBAAyB,CACzB,yBACF,CAEA,aACE,uBAAyB,CACzB,0BACF,CAMA,aACE,WACF,CAEA,iBACE,eACF",sourcesContent:["/* background div */\n#calibration-background {\n z-index: 999999990;\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n margin: 0;\n /* background: #eee; */\n overflow: hidden;\n overflow-y: scroll;\n user-select: none;\n box-sizing: border-box;\n text-align: center;\n scrollbar-width: none;\n}\n\n#calibration-background::-webkit-scrollbar {\n width: 0;\n display: none;\n}\n\n#calibration-background * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n}\n\n#calibration-background p {\n line-height: 150%;\n}\n\n.calibration-instruction {\n position: absolute;\n user-select: none;\n pointer-events: none;\n}\n\n.calibration-instruction-scrollable {\n height: 200%;\n}\n\n.calibration-trackDistance-check-progessBar-container {\n position: fixed;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 40px;\n background-color: #f3f3f3;\n z-index: 999999999999;\n}\n\n.calibration-trackDistance-check-progessBar {\n height: 100%;\n width: 0%;\n background-color: #4caf50;\n transition: width 0.3s ease;\n}\n\n.calibration-trackDistance-check-progessBar-text {\n position: absolute;\n top: 10%;\n left: 50%;\n /* transform: translate(-50%, -80%); */\n color: #000;\n font-size: 30px;\n margin: 0;\n}\n.calibration-trackDistance-check-viewingDistance-container {\n position: fixed;\n top: 0;\n right: 0;\n width: 50%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 999999999999;\n line-height: 1;\n}\n.calibration-trackDistance-check-viewingDistance {\n font-size: 60vh;\n margin: 0;\n}\n.calibration-trackDistance-check-viewingDistance-units {\n font-size: 30vh;\n margin: 0;\n}\n\n.calibration-instruction-left {\n /* use only the left half of the screen */\n left: 0;\n right: 50%;\n top: 0;\n bottom: 0;\n margin: auto;\n}\n\n.calibration-instruction h1 {\n min-width: 360px;\n font-weight: 700;\n}\n\n.calibration-instruction * {\n font-size: 1.2rem;\n line-height: 170%;\n margin: 0;\n padding: 0;\n}\n\n.calibration-instruction p {\n white-space: pre-line;\n margin-top: 1rem;\n}\n\n.calibration-description {\n line-height: 170%;\n}\n\n.rc-hang-description {\n margin-top: 50vh !important;\n font-size: 1rem !important;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Screen size specific */\n\n@media (min-width: 481px) {\n .calibration-instruction {\n margin: 2rem;\n }\n\n .calibration-instruction h1 {\n line-height: 100%;\n font-size: 2.5rem !important;\n }\n\n .calibration-description {\n width: calc(100% - 4rem);\n width: max(min(100% - 4rem, 960px), 300px);\n }\n\n .calibration-description,\n .calibration-description * {\n font-size: 1.2rem;\n }\n\n .calibration-credit-text {\n font-size: 0.9rem !important;\n }\n}\n\n@media (max-width: 480px) {\n .calibration-instruction {\n margin: 1rem;\n }\n\n .calibration-instruction h1 {\n line-height: 120%;\n font-size: 1.8rem !important;\n }\n\n .calibration-description {\n width: calc(100% - 1rem);\n }\n\n .calibration-description,\n .calibration-description * {\n font-size: 1rem;\n }\n\n .calibration-credit-text {\n font-size: 0.7rem !important;\n }\n}\n\n.float-instruction {\n position: fixed;\n text-align: center;\n user-select: none;\n background: rgba(255, 255, 255, 0.9);\n padding: 10px 17px;\n margin: 0;\n left: 50%;\n max-width: 25rem;\n transform: translate(-50%, 0);\n border-radius: 10px;\n font-size: 1rem;\n font-weight: 500;\n z-index: 999999991;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.swal2-container {\n z-index: 999999999 !important;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.calibration-credit-text {\n position: fixed !important;\n width: 100% !important;\n bottom: 3px !important;\n color: #999 !important;\n margin: 0 !important;\n padding: 0 !important;\n line-height: 100% !important;\n text-align: center !important;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.lock-view {\n overflow: hidden !important;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.rc-lang-ltr {\n direction: ltr !important;\n text-align: left !important;\n}\n\n.rc-lang-rtl {\n direction: rtl !important;\n text-align: right !important;\n}\n\n/* -------------------------------------------------------------------------- */\n/* --------------------------------- CURSOR --------------------------------- */\n/* -------------------------------------------------------------------------- */\n\n.cursor-grab {\n cursor: grab;\n}\n\n.cursor-grabbing {\n cursor: grabbing;\n}\n"],sourceRoot:""}]);const o=r},2535:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".swal2-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif!important}.my__swal2__icon{font-weight:700!important;-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.my__swal2__icon *{color:#ff9a00!important}.my__swal2__title{color:#000!important;font-size:2rem!important;font-weight:700!important}.my__swal2__html,.my__swal2__title{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.my__swal2__html{color:#444!important;font-size:1.2rem!important;font-weight:400!important;line-height:150%!important;margin:1.6rem}.my__swal2__html__center{text-align:center!important}.animate__animated.animate__fadeInUp,.animate__animated.animate__fadeOutDown{--animate-duration:400ms!important;--animate-delay:0!important}.fadeInUp,.fadeOutDown{animation-delay:0!important;animation-duration:.4s!important}","",{version:3,sources:["webpack://./src/css/swal.css"],names:[],mappings:"AAAA,iBACE,kIAEF,CAEA,iBACE,yBAA4B,CAC5B,kCAA4B,CAA5B,+BAA4B,CAA5B,0BACF,CAEA,mBACE,uBACF,CAEA,kBACE,oBAAsB,CACtB,wBAA0B,CAC1B,yBAEF,CAEA,mCAHE,kCAA4B,CAA5B,+BAA4B,CAA5B,0BAUF,CAPA,iBAEE,oBAAsB,CACtB,0BAA4B,CAE5B,yBAA8B,CAD9B,0BAA4B,CAH5B,aAMF,CAEA,yBACE,2BACF,CAEA,6EAEE,kCAAoC,CACpC,2BACF,CAEA,uBAGE,2BAA6B,CAD7B,gCAEF",sourcesContent:[".swal2-container {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif !important;\n}\n\n.my__swal2__icon {\n font-weight: bold !important;\n user-select: none !important;\n}\n\n.my__swal2__icon * {\n color: #ff9a00 !important;\n}\n\n.my__swal2__title {\n color: #000 !important;\n font-size: 2rem !important;\n font-weight: bold !important;\n user-select: none !important;\n}\n\n.my__swal2__html {\n margin: 1.6rem;\n color: #444 !important;\n font-size: 1.2rem !important;\n line-height: 150% !important;\n font-weight: normal !important;\n user-select: none !important;\n}\n\n.my__swal2__html__center {\n text-align: center !important;\n}\n\n.animate__animated.animate__fadeInUp,\n.animate__animated.animate__fadeOutDown {\n --animate-duration: 400ms !important;\n --animate-delay: 0 !important;\n}\n\n.fadeInUp,\n.fadeOutDown {\n animation-duration: 400ms !important;\n animation-delay: 0 !important;\n}\n"],sourceRoot:""}]);const o=r},6314:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",a=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),a&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),a&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,a,i,s){"string"==typeof e&&(e=[[null,e,void 0]]);var r={};if(a)for(var o=0;o0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=s),n&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=n):c[2]=n),i&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=i):c[4]="".concat(i)),t.push(c))}},t}},1354:e=>{"use strict";e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var a=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(a),s="/*# ".concat(i," */");return[t].concat([s]).join("\n")}return[t].join("\n")}},7158:function(e){var t=function(){"use strict";var e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f,g,y,b,v,k,w,A,x="leader-line",C=1,S=2,E=3,_=4,T={top:C,right:S,bottom:E,left:_},I=1,N=2,R=3,D=4,z=5,O={straight:I,arc:N,fluid:R,magnet:D,grid:z},M="behind",B=x+"-defs",F='',L={disc:{elmId:"leader-line-disc",noRotate:!0,bBox:{left:-5,top:-5,width:10,height:10,right:5,bottom:5},widthR:2.5,heightR:2.5,bCircle:5,sideLen:5,backLen:5,overhead:0,outlineBase:1,outlineMax:4},square:{elmId:"leader-line-square",noRotate:!0,bBox:{left:-5,top:-5,width:10,height:10,right:5,bottom:5},widthR:2.5,heightR:2.5,bCircle:5,sideLen:5,backLen:5,overhead:0,outlineBase:1,outlineMax:4},arrow1:{elmId:"leader-line-arrow1",bBox:{left:-8,top:-8,width:16,height:16,right:8,bottom:8},widthR:4,heightR:4,bCircle:8,sideLen:8,backLen:8,overhead:8,outlineBase:2,outlineMax:1.5},arrow2:{elmId:"leader-line-arrow2",bBox:{left:-7,top:-8,width:11,height:16,right:4,bottom:8},widthR:2.75,heightR:4,bCircle:8,sideLen:8,backLen:7,overhead:4,outlineBase:1,outlineMax:1.75},arrow3:{elmId:"leader-line-arrow3",bBox:{left:-4,top:-5,width:12,height:10,right:8,bottom:5},widthR:3,heightR:2.5,bCircle:8,sideLen:5,backLen:4,overhead:8,outlineBase:1,outlineMax:2.5},hand:{elmId:"leader-line-hand",bBox:{left:-3,top:-12,width:40,height:24,right:37,bottom:12},widthR:10,heightR:6,bCircle:37,sideLen:12,backLen:3,overhead:37},crosshair:{elmId:"leader-line-crosshair",noRotate:!0,bBox:{left:-96,top:-96,width:192,height:192,right:96,bottom:96},widthR:48,heightR:48,bCircle:96,sideLen:96,backLen:96,overhead:0}},P={behind:M,disc:"disc",square:"square",arrow1:"arrow1",arrow2:"arrow2",arrow3:"arrow3",hand:"hand",crosshair:"crosshair"},j={disc:"disc",square:"square",arrow1:"arrow1",arrow2:"arrow2",arrow3:"arrow3",hand:"hand",crosshair:"crosshair"},V=[C,S,E,_],U="auto",W={x:"left",y:"top",width:"width",height:"height"},G=80,q=4,H=5,K=120,$=8,Z=3.75,X=10,Y=30,Q=.5522847,J=.25*Math.PI,ee=/^\s*(\-?[\d\.]+)\s*(\%)?\s*$/,te="http://www.w3.org/2000/svg",ne="-ms-scroll-limit"in document.documentElement.style&&"-ms-ime-align"in document.documentElement.style&&!window.navigator.msPointerEnabled,ae=!ne&&!!document.uniqueID,ie="MozAppearance"in document.documentElement.style,se=!(ne||ie||!window.chrome||!window.CSS),re=!(ne||ae||ie||se||window.chrome||!("WebkitAppearance"in document.documentElement.style)),oe=ae||ne?.2:.1,le={path:R,lineColor:"coral",lineSize:4,plugSE:[M,"arrow1"],plugSizeSE:[1,1],lineOutlineEnabled:!1,lineOutlineColor:"indianred",lineOutlineSize:.25,plugOutlineEnabledSE:[!1,!1],plugOutlineSizeSE:[1,1]},ue=(k={}.toString,w={}.hasOwnProperty.toString,A=w.call(Object),function(e){var t,n;return e&&"[object Object]"===k.call(e)&&(!(t=Object.getPrototypeOf(e))||(n=t.hasOwnProperty("constructor")&&t.constructor)&&"function"==typeof n&&w.call(n)===A)}),ce=Number.isFinite||function(e){return"number"==typeof e&&window.isFinite(e)},he=(p={ease:[.25,.1,.25,1],linear:[0,0,1,1],"ease-in":[.42,0,1,1],"ease-out":[0,0,.58,1],"ease-in-out":[.42,0,.58,1]},m=1e3/60/2,f=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,m)},g=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame||function(e){clearTimeout(e)},y=Number.isFinite||function(e){return"number"==typeof e&&window.isFinite(e)},b=[],v=0,{add:function(e,t,n,a,i,s,r){var o,l,u,c,h,d,f,g,y,k,w,A,x,C=++v;function S(t,n){return{value:e(n),timeRatio:t,outputRatio:n}}if("string"==typeof i&&(i=p[i]),e=e||function(){},n=this._endIndex||this._string[this._currentIndex]<"0"||"9"=this._endIndex||this._string[this._currentIndex]<"0"||"9"=this._endIndex)return null;var e=null,t=this._string[this._currentIndex];if(this._currentIndex+=1,"0"===t)e=0;else{if("1"!==t)return null;e=1}return this._skipOptionalSpacesOrDelimiter(),e}};var o=e.SVGPathElement.prototype.setAttribute,l=e.SVGPathElement.prototype.removeAttribute,u=e.Symbol?e.Symbol():"__cachedPathData",c=e.Symbol?e.Symbol():"__cachedNormalizedPathData",h=function(e,t,n,a,i,s,r,o,l,u){function c(e,t,n){return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}var d,p,m,f,g,y,b,v,k,w,A,x,C,S,E,_=(d=r,Math.PI*d/180),T=[];u?(S=u[0],E=u[1],x=u[2],C=u[3]):(e=(p=c(e,t,-_)).x,t=p.y,1<(y=(f=(e-(n=(m=c(n,a,-_)).x))/2)*f/(i*i)+(g=(t-(a=m.y))/2)*g/(s*s))&&(i*=y=Math.sqrt(y),s*=y),k=(b=i*i)*(v=s*s)-b*g*g-v*f*f,w=b*g*g+v*f*f,x=(A=(o===l?-1:1)*Math.sqrt(Math.abs(k/w)))*i*g/s+(e+n)/2,C=A*-s*f/i+(t+a)/2,S=Math.asin(parseFloat(((t-C)/s).toFixed(9))),E=Math.asin(parseFloat(((a-C)/s).toFixed(9))),e120*Math.PI/180&&(I=E,N=n,R=a,E=l&&S=n.duration&&n.count&&n.loopsLeft<=1)return s=n.frames[n.lastFrame=n.reverse?0:n.frames.length-1],n.frameCallback(s.value,!0,s.timeRatio,s.outputRatio),void(n.framesStart=null);if(a>n.duration){if(i=Math.floor(a/n.duration),n.count){if(i>=n.loopsLeft)return s=n.frames[n.lastFrame=n.reverse?0:n.frames.length-1],n.frameCallback(s.value,!0,s.timeRatio,s.outputRatio),void(n.framesStart=null);n.loopsLeft-=i}n.framesStart+=n.duration*i,a=e-n.framesStart}n.reverse&&(a=n.duration-a),s=n.frames[n.lastFrame=Math.round(a/m)],!1!==n.frameCallback(s.value,!1,s.timeRatio,s.outputRatio)?t=!0:n.framesStart=null}})),t&&(d=f.call(window,xe))}function Ce(e,t){e.framesStart=Date.now(),null!=t&&(e.framesStart-=e.duration*(e.reverse?1-t:t)),e.loopsLeft=e.count,e.lastFrame=null,xe()}function Se(e,t){var n,a;return typeof e!=typeof t||(n=ue(e)?"obj":Array.isArray(e)?"array":"")!=(ue(t)?"obj":Array.isArray(t)?"array":"")||("obj"===n?Se(a=Object.keys(e).sort(),Object.keys(t).sort())||a.some((function(n){return Se(e[n],t[n])})):"array"===n?e.length!==t.length||e.some((function(e,n){return Se(e,t[n])})):e!==t)}function Ee(e){return e?ue(e)?Object.keys(e).reduce((function(t,n){return t[n]=Ee(e[n]),t}),{}):Array.isArray(e)?e.map(Ee):e:e}function _e(e){var t,n,a,i=1,s=e=(e+"").trim();function r(e){var t=1,n=ee.exec(e);return n&&(t=parseFloat(n[1]),n[2]?t=0<=t&&t<=100?t/100:1:(t<0||1=Math.abs(a)?0<=t?S:_:0<=a?E:C))}))),w.position_path!==A.position_path||w.position_lineStrokeWidth!==A.position_lineStrokeWidth||[0,1].some((function(e){return w.position_plugOverheadSE[e]!==A.position_plugOverheadSE[e]||(s=x[e],r=A.position_socketXYSE[e],s.x!==r.x||s.y!==r.y||s.socketId!==r.socketId)||(n=t[e],a=A.position_socketGravitySE[e],(i=null==n?"auto":Array.isArray(n)?"array":"number")!=(null==a?"auto":Array.isArray(a)?"array":"number")||("array"==i?n[0]!==a[0]||n[1]!==a[1]:n!==a));var n,a,i,s,r}))){switch(e.pathList.baseVal=a=[],e.pathList.animVal=null,w.position_path){case I:a.push([M(x[0]),M(x[1])]);break;case N:d="number"==typeof t[0]&&0q?(w.position_lineStrokeWidth-q)*H:0),e.socketId===C?((s=(e.y-n.y)/2)=t.x:t.dirId===s?e.y>=t.y:e.x<=t.x}function p(e,t){return t.dirId===n||t.dirId===s?e.x===t.x:e.y===t.y}function m(e){return e[0]?{contain:0,notContain:1}:{contain:1,notContain:0}}function f(e,t,n){return Math.abs(t[n]-e[n])}function g(e,t,a){return"x"===a?e.x=Y?g(l[t.notContain],l[t.contain],u[t.contain]):l[t.contain].dirId)):(a=[{x:l[0].x,y:l[0].y},{x:l[1].x,y:l[1].y}],o.forEach((function(e,t){var n=0===t?1:0,i=f(a[t],a[n],u[t]);iX&&(l[s]-eX&&(l[s]-ea.outlineMax&&(t=a.outlineMax),t*=2*a.outlineBase,w=Ze(b,k.plugOutline_strokeWidthSE,e,t)||w,w=Ze(b,k.plugOutline_inStrokeWidthSE,e,k.plugOutline_colorTraSE[e]?t-oe/(k.line_strokeWidth/le.lineSize)/v.plugSizeSE[e]*2:t/2)||w)})),w)),(n.faces||he.line||he.plug||he.lineOutline||he.plugOutline)&&(he.faces=(C=(A=t).curStats,S=A.aplStats,E=A.events,_=!1,!C.line_altColor&&Ze(A,S,"line_color",x=C.line_color,E.apl_line_color)&&(A.lineFace.style.stroke=x,_=!0),Ze(A,S,"line_strokeWidth",x=C.line_strokeWidth,E.apl_line_strokeWidth)&&(A.lineShape.style.strokeWidth=x+"px",_=!0,(ie||ae)&&(Ge(A,A.lineShape),ae&&(Ge(A,A.lineFace),Ge(A,A.lineMaskCaps)))),Ze(A,S,"lineOutline_enabled",x=C.lineOutline_enabled,E.apl_lineOutline_enabled)&&(A.lineOutlineFace.style.display=x?"inline":"none",_=!0),C.lineOutline_enabled&&(Ze(A,S,"lineOutline_color",x=C.lineOutline_color,E.apl_lineOutline_color)&&(A.lineOutlineFace.style.stroke=x,_=!0),Ze(A,S,"lineOutline_strokeWidth",x=C.lineOutline_strokeWidth,E.apl_lineOutline_strokeWidth)&&(A.lineOutlineMaskShape.style.strokeWidth=x+"px",_=!0,ae&&(Ge(A,A.lineOutlineMaskCaps),Ge(A,A.lineOutlineFace))),Ze(A,S,"lineOutline_inStrokeWidth",x=C.lineOutline_inStrokeWidth,E.apl_lineOutline_inStrokeWidth)&&(A.lineMaskShape.style.strokeWidth=x+"px",_=!0,ae&&(Ge(A,A.lineOutlineMaskCaps),Ge(A,A.lineOutlineFace)))),Ze(A,S,"plug_enabled",x=C.plug_enabled,E.apl_plug_enabled)&&(A.plugsFace.style.display=x?"inline":"none",_=!0),C.plug_enabled&&[0,1].forEach((function(e){var t=C.plug_plugSE[e],n=t!==M?L[j[t]]:null,a=Ke(e,n);Ze(A,S.plug_enabledSE,e,x=C.plug_enabledSE[e],E.apl_plug_enabledSE)&&(A.plugsFace.style[a.prop]=x?"url(#"+A.plugMarkerIdSE[e]+")":"none",_=!0),C.plug_enabledSE[e]&&(Ze(A,S.plug_plugSE,e,t,E.apl_plug_plugSE)&&(A.plugFaceSE[e].href.baseVal="#"+n.elmId,He(A,A.plugMarkerSE[e],a.orient,n.bBox,A.svg,A.plugMarkerShapeSE[e],A.plugsFace),_=!0,ie&&Ge(A,A.plugsFace)),Ze(A,S.plug_colorSE,e,x=C.plug_colorSE[e],E.apl_plug_colorSE)&&(A.plugFaceSE[e].style.fill=x,_=!0,(se||re||ae)&&!C.line_colorTra&&Ge(A,ae?A.lineMaskCaps:A.capsMaskLine)),["markerWidth","markerHeight"].forEach((function(t){var n="plug_"+t+"SE";Ze(A,S[n],e,x=C[n][e],E["apl_"+n])&&(A.plugMarkerSE[e][t].baseVal.value=x,_=!0)})),Ze(A,S.plugOutline_enabledSE,e,x=C.plugOutline_enabledSE[e],E.apl_plugOutline_enabledSE)&&(x?(A.plugFaceSE[e].style.mask="url(#"+A.plugMaskIdSE[e]+")",A.plugOutlineFaceSE[e].style.display="inline"):(A.plugFaceSE[e].style.mask="none",A.plugOutlineFaceSE[e].style.display="none"),_=!0),C.plugOutline_enabledSE[e]&&(Ze(A,S.plugOutline_plugSE,e,t,E.apl_plugOutline_plugSE)&&(A.plugOutlineFaceSE[e].href.baseVal=A.plugMaskShapeSE[e].href.baseVal=A.plugOutlineMaskShapeSE[e].href.baseVal="#"+n.elmId,[A.plugMaskSE[e],A.plugOutlineMaskSE[e]].forEach((function(e){e.x.baseVal.value=n.bBox.left,e.y.baseVal.value=n.bBox.top,e.width.baseVal.value=n.bBox.width,e.height.baseVal.value=n.bBox.height})),_=!0),Ze(A,S.plugOutline_colorSE,e,x=C.plugOutline_colorSE[e],E.apl_plugOutline_colorSE)&&(A.plugOutlineFaceSE[e].style.fill=x,_=!0,ae&&(Ge(A,A.lineMaskCaps),Ge(A,A.lineOutlineMaskCaps))),Ze(A,S.plugOutline_strokeWidthSE,e,x=C.plugOutline_strokeWidthSE[e],E.apl_plugOutline_strokeWidthSE)&&(A.plugOutlineMaskShapeSE[e].style.strokeWidth=x+"px",_=!0),Ze(A,S.plugOutline_inStrokeWidthSE,e,x=C.plugOutline_inStrokeWidthSE[e],E.apl_plugOutline_inStrokeWidthSE)&&(A.plugMaskShapeSE[e].style.strokeWidth=x+"px",_=!0)))})),_)),(n.position||he.line||he.plug)&&(he.position=Qe(t)),(n.path||he.position)&&(he.path=(N=(T=t).curStats,R=T.aplStats,D=T.pathList.animVal||T.pathList.baseVal,z=N.path_edge,O=!1,D&&(z.x1=z.x2=D[0][0].x,z.y1=z.y2=D[0][0].y,N.path_pathData=I=Le(D,(function(e){e.xz.x2&&(z.x2=e.x),e.y>z.y2&&(z.y2=e.y)})),je(I,R.path_pathData)&&(T.linePath.setPathData(I),R.path_pathData=I,O=!0,ae?(Ge(T,T.plugsFace),Ge(T,T.lineMaskCaps)):ie&&Ge(T,T.linePath),T.events.apl_path&&T.events.apl_path.forEach((function(e){e(T,I)})))),O)),he.viewBox=(F=(B=t).curStats,P=B.aplStats,V=F.path_edge,U=F.viewBox_bBox,G=P.viewBox_bBox,q=B.svg.viewBox.baseVal,H=B.svg.style,K=!1,$=Math.max(F.line_strokeWidth/2,F.viewBox_plugBCircleSE[0]||0,F.viewBox_plugBCircleSE[1]||0),Z={x1:V.x1-$,y1:V.y1-$,x2:V.x2+$,y2:V.y2+$},B.events.new_edge4viewBox&&B.events.new_edge4viewBox.forEach((function(e){e(B,Z)})),U.x=F.lineMask_x=F.lineOutlineMask_x=F.maskBGRect_x=Z.x1,U.y=F.lineMask_y=F.lineOutlineMask_y=F.maskBGRect_y=Z.y1,U.width=Z.x2-Z.x1,U.height=Z.y2-Z.y1,["x","y","width","height"].forEach((function(e){var t;(t=U[e])!==G[e]&&(q[e]=G[e]=t,H[W[e]]=t+("x"===e||"y"===e?B.bodyOffset[e]:0)+"px",K=!0)})),K),he.mask=(Q=(X=t).curStats,J=X.aplStats,ee=!1,Q.plug_enabled?[0,1].forEach((function(e){Q.capsMaskMarker_enabledSE[e]=Q.plug_enabledSE[e]&&Q.plug_colorTraSE[e]||Q.plugOutline_enabledSE[e]&&Q.plugOutline_colorTraSE[e]})):Q.capsMaskMarker_enabledSE[0]=Q.capsMaskMarker_enabledSE[1]=!1,Q.capsMaskMarker_enabled=Q.capsMaskMarker_enabledSE[0]||Q.capsMaskMarker_enabledSE[1],Q.lineMask_outlineMode=Q.lineOutline_enabled,Q.caps_enabled=Q.capsMaskMarker_enabled||Q.capsMaskAnchor_enabledSE[0]||Q.capsMaskAnchor_enabledSE[1],Q.lineMask_enabled=Q.caps_enabled||Q.lineMask_outlineMode,(Q.lineMask_enabled&&!Q.lineMask_outlineMode||Q.lineOutline_enabled)&&["x","y"].forEach((function(e){var t="maskBGRect_"+e;Ze(X,J,t,Y=Q[t])&&(X.maskBGRect[e].baseVal.value=Y,ee=!0)})),Ze(X,J,"lineMask_enabled",Y=Q.lineMask_enabled)&&(X.lineFace.style.mask=Y?"url(#"+X.lineMaskId+")":"none",ee=!0,re&&Ge(X,X.lineMask)),Q.lineMask_enabled&&(Ze(X,J,"lineMask_outlineMode",Y=Q.lineMask_outlineMode)&&(Y?(X.lineMaskBG.style.display="none",X.lineMaskShape.style.display="inline"):(X.lineMaskBG.style.display="inline",X.lineMaskShape.style.display="none"),ee=!0),["x","y"].forEach((function(e){var t="lineMask_"+e;Ze(X,J,t,Y=Q[t])&&(X.lineMask[e].baseVal.value=Y,ee=!0)})),Ze(X,J,"caps_enabled",Y=Q.caps_enabled)&&(X.lineMaskCaps.style.display=X.lineOutlineMaskCaps.style.display=Y?"inline":"none",ee=!0,re&&Ge(X,X.capsMaskLine)),Q.caps_enabled&&([0,1].forEach((function(e){var t;Ze(X,J.capsMaskAnchor_enabledSE,e,Y=Q.capsMaskAnchor_enabledSE[e])&&(X.capsMaskAnchorSE[e].style.display=Y?"inline":"none",ee=!0,re&&Ge(X,X.lineMask)),Q.capsMaskAnchor_enabledSE[e]&&(je(t=Q.capsMaskAnchor_pathDataSE[e],J.capsMaskAnchor_pathDataSE[e])&&(X.capsMaskAnchorSE[e].setPathData(t),J.capsMaskAnchor_pathDataSE[e]=t,ee=!0),Ze(X,J.capsMaskAnchor_strokeWidthSE,e,Y=Q.capsMaskAnchor_strokeWidthSE[e])&&(X.capsMaskAnchorSE[e].style.strokeWidth=Y+"px",ee=!0))})),Ze(X,J,"capsMaskMarker_enabled",Y=Q.capsMaskMarker_enabled)&&(X.capsMaskLine.style.display=Y?"inline":"none",ee=!0),Q.capsMaskMarker_enabled&&[0,1].forEach((function(e){var t=Q.capsMaskMarker_plugSE[e],n=t!==M?L[j[t]]:null,a=Ke(e,n);Ze(X,J.capsMaskMarker_enabledSE,e,Y=Q.capsMaskMarker_enabledSE[e])&&(X.capsMaskLine.style[a.prop]=Y?"url(#"+X.lineMaskMarkerIdSE[e]+")":"none",ee=!0),Q.capsMaskMarker_enabledSE[e]&&(Ze(X,J.capsMaskMarker_plugSE,e,t)&&(X.capsMaskMarkerShapeSE[e].href.baseVal="#"+n.elmId,He(X,X.capsMaskMarkerSE[e],a.orient,n.bBox,X.svg,X.capsMaskMarkerShapeSE[e],X.capsMaskLine),ee=!0,ie&&(Ge(X,X.capsMaskLine),Ge(X,X.lineFace))),["markerWidth","markerHeight"].forEach((function(t){var n="capsMaskMarker_"+t+"SE";Ze(X,J[n],e,Y=Q[n][e])&&(X.capsMaskMarkerSE[e][t].baseVal.value=Y,ee=!0)})))})))),Q.lineOutline_enabled&&["x","y"].forEach((function(e){var t="lineOutlineMask_"+e;Ze(X,J,t,Y=Q[t])&&(X.lineOutlineMask[e].baseVal.value=Y,ee=!0)})),ee),n.effect&&(ue=(te=t).curStats,ce=te.aplStats,Object.keys(e).forEach((function(t){var n=e[t],a=t+"_enabled",i=t+"_options",s=ue[i];Ze(te,ce,a,ne=ue[a])?(ne&&(ce[i]=Ee(s)),n[ne?"init":"remove"](te)):ne&&Se(s,ce[i])&&(n.remove(te),ce[a]=!0,ce[i]=Ee(s),n.init(te))}))),(se||re)&&he.line&&!he.path&&Ge(t,t.lineShape),se&&he.plug&&!he.line&&Ge(t,t.plugsFace),qe(t)}function tt(e,t){return{duration:ce(e.duration)&&0t.x2&&(t.x2=a.x2),a.y2>t.y2&&(t.y2=a.y2),["x","y"].forEach((function(n){var a,r="dropShadow_"+n;i[r]=a=t[n+"1"],Ze(e,s,r,a)&&(e.efc_dropShadow_elmFilter[n].baseVal.value=a)})))}}},Object.keys(e).forEach((function(t){var n=e[t],a=n.stats;a[t+"_enabled"]={iniValue:!1},a[t+"_options"]={hasProps:!0},n.anim&&(a[t+"_animOptions"]={},a[t+"_animId"]={})})),t={none:{defaultAnimOptions:{},init:function(e,n){var a=e.curStats;a.show_animId&&(he.remove(a.show_animId),a.show_animId=null),t.none.start(e,n)},start:function(e,n){t.none.stop(e,!0)},stop:function(e,t,n){var a=e.curStats;return n=null!=n?n:e.aplStats.show_on,a.show_inAnim=!1,t&&Je(e,n),n?1:0}},fade:{defaultAnimOptions:{duration:300,timing:"linear"},init:function(e,n){var a=e.curStats,i=e.aplStats;a.show_animId&&he.remove(a.show_animId),a.show_animId=he.add((function(e){return e}),(function(n,a){a?t.fade.stop(e,!0):(e.svg.style.opacity=n+"",ae&&(Ge(e,e.svg),qe(e)))}),i.show_animOptions.duration,1,i.show_animOptions.timing,null,!1),t.fade.start(e,n)},start:function(e,t){var n,a=e.curStats;a.show_inAnim&&(n=he.stop(a.show_animId)),Je(e,1),a.show_inAnim=!0,he.start(a.show_animId,!e.aplStats.show_on,null!=t?t:n)},stop:function(e,t,n){var a,i=e.curStats;return n=null!=n?n:e.aplStats.show_on,a=i.show_inAnim?he.stop(i.show_animId):n?1:0,i.show_inAnim=!1,t&&(e.svg.style.opacity=n?"":"0",Je(e,n)),a}},draw:{defaultAnimOptions:{duration:500,timing:[.58,0,.42,1]},init:function(e,n){var a=e.curStats,i=e.aplStats,s=e.pathList.baseVal,r=Pe(s),o=r.segsLen,l=r.lenAll;a.show_animId&&he.remove(a.show_animId),a.show_animId=he.add((function(e){var t,n,a,i,r=-1;if(0===e)n=[[s[0][0],s[0][0]]];else if(1===e)n=s;else{for(t=l*e,n=[];t>=o[++r];)n.push(s[r]),t-=o[r];t&&(2===(a=s[r]).length?n.push([a[0],ze(a[0],a[1],t/o[r])]):(i=Me(a[0],a[1],a[2],a[3],Fe(a[0],a[1],a[2],a[3],t)),n.push([a[0],i.fromP1,i.fromP2,i])))}return n}),(function(n,a){a?t.draw.stop(e,!0):(e.pathList.animVal=n,et(e,{path:!0}))}),i.show_animOptions.duration,1,i.show_animOptions.timing,null,!1),t.draw.start(e,n)},start:function(e,n){var a,i=e.curStats;i.show_inAnim&&(a=he.stop(i.show_animId)),Je(e,1),i.show_inAnim=!0,Ve(e,"apl_position",t.draw.update),he.start(i.show_animId,!e.aplStats.show_on,null!=n?n:a)},stop:function(e,t,n){var a,i=e.curStats;return n=null!=n?n:e.aplStats.show_on,a=i.show_inAnim?he.stop(i.show_animId):n?1:0,i.show_inAnim=!1,t&&(e.pathList.animVal=n?null:[[e.pathList.baseVal[0][0],e.pathList.baseVal[0][0]]],et(e,{path:!0}),Je(e,n)),a},update:function(e){Ue(e,"apl_position",t.draw.update),e.curStats.show_inAnim?t.draw.init(e,t.draw.stop(e)):e.aplStats.show_animOptions={}}}},[["start","anchorSE",0],["end","anchorSE",1],["color","lineColor"],["size","lineSize"],["startSocketGravity","socketGravitySE",0],["endSocketGravity","socketGravitySE",1],["startPlugColor","plugColorSE",0],["endPlugColor","plugColorSE",1],["startPlugSize","plugSizeSE",0],["endPlugSize","plugSizeSE",1],["outline","lineOutlineEnabled"],["outlineColor","lineOutlineColor"],["outlineSize","lineOutlineSize"],["startPlugOutline","plugOutlineEnabledSE",0],["endPlugOutline","plugOutlineEnabledSE",1],["startPlugOutlineColor","plugOutlineColorSE",0],["endPlugOutlineColor","plugOutlineColorSE",1],["startPlugOutlineSize","plugOutlineSizeSE",0],["endPlugOutlineSize","plugOutlineSizeSE",1]].forEach((function(e){var t=e[0],n=e[1],a=e[2];Object.defineProperty(rt.prototype,t,{get:function(){var e=null!=a?be[this._id].options[n][a]:n?be[this._id].options[n]:be[this._id].options[t];return null==e?U:Ee(e)},set:ot(t),enumerable:!0})})),[["path",O],["startSocket",T,"socketSE",0],["endSocket",T,"socketSE",1],["startPlug",P,"plugSE",0],["endPlug",P,"plugSE",1]].forEach((function(e){var t=e[0],n=e[1],a=e[2],i=e[3];Object.defineProperty(rt.prototype,t,{get:function(){var e,s=null!=i?be[this._id].options[a][i]:a?be[this._id].options[a]:be[this._id].options[t];return s?Object.keys(n).some((function(t){return n[t]===s&&(e=t,!0)}))?e:new Error("It's broken"):U},set:ot(t),enumerable:!0})})),Object.keys(e).forEach((function(t){var n=e[t];Object.defineProperty(rt.prototype,t,{get:function(){var e,a,i=be[this._id].options[t];return ue(i)?(e=i,a=n.optionsConf.reduce((function(t,n){var a,i=n[0],s=n[1],r=n[2],o=n[3],l=n[4],u=null!=l?e[o][l]:o?e[o]:e[s];return t[s]="id"===i?u?Object.keys(r).some((function(e){return r[e]===u&&(a=e,!0)}))?a:new Error("It's broken"):U:null==u?U:Ee(u),t}),{}),n.anim&&(a.animation=Ee(e.animation)),a):i},set:ot(t),enumerable:!0})})),["startLabel","endLabel","middleLabel"].forEach((function(e,t){Object.defineProperty(rt.prototype,e,{get:function(){var e=be[this._id],n=e.options;return n.labelSEM[t]&&!e.optionIsAttach.labelSEM[t]?ke[n.labelSEM[t]._id].text:n.labelSEM[t]||""},set:ot(e),enumerable:!0})})),rt.prototype.setOptions=function(e){return st(be[this._id],e),this},rt.prototype.position=function(){return et(be[this._id],{position:!0}),this},rt.prototype.remove=function(){var t=be[this._id],n=t.curStats;Object.keys(e).forEach((function(e){var t=e+"_animId";n[t]&&he.remove(n[t])})),n.show_animId&&he.remove(n.show_animId),t.attachments.slice().forEach((function(e){it(t,e)})),t.baseWindow&&t.svg&&t.baseWindow.document.body.removeChild(t.svg),delete be[this._id]},rt.prototype.show=function(e,t){return nt(be[this._id],!0,e,t),this},rt.prototype.hide=function(e,t){return nt(be[this._id],!1,e,t),this},s=function(e){e&&ke[e._id]&&(e.boundTargets.slice().forEach((function(t){it(t.props,e,!0)})),e.conf.remove&&e.conf.remove(e),delete ke[e._id])},lt.prototype.remove=function(){var e=this,t=ke[e._id];t&&(t.boundTargets.slice().forEach((function(e){t.conf.removeOption(t,e)})),We((function(){var t=ke[e._id];t&&s(t)})))},a=lt,window.LeaderLineAttachment=a,i=function(e,t){return e instanceof a&&(!(e.isRemoved||t&&ke[e._id].conf.type!==t)||null)},n={pointAnchor:{type:"anchor",argOptions:[{optionName:"element",type:Te}],init:function(e,t){return e.element=n.pointAnchor.checkElement(t.element),e.x=n.pointAnchor.parsePercent(t.x,!0)||[.5,!0],e.y=n.pointAnchor.parsePercent(t.y,!0)||[.5,!0],!0},removeOption:function(e,t){var i=t.props,s={},r=e.element,o=i.options.anchorSE["start"===t.optionName?1:0];r===o&&(r=o===document.body?new a(n.pointAnchor,[r]):document.body),s[t.optionName]=r,st(i,s)},getBBoxNest:function(e,t){var n=Re(e.element,t.baseWindow),a=n.width,i=n.height;return n.width=n.height=0,n.left=n.right=n.left+e.x[0]*(e.x[1]?a:1),n.top=n.bottom=n.top+e.y[0]*(e.y[1]?i:1),n},parsePercent:function(e,t){var n,a,i=!1;return ce(e)?a=e:"string"==typeof e&&(n=ee.exec(e))&&n[2]&&(i=0!=(a=parseFloat(n[1])/100)),null!=a&&(t||0<=a)?[a,i]:null},checkElement:function(e){if(null==e)e=document.body;else if(!Te(e))throw new Error("`element` must be Element");return e}},areaAnchor:{type:"anchor",argOptions:[{optionName:"element",type:Te},{optionName:"shape",type:"string"}],stats:{color:{},strokeWidth:{},elementWidth:{},elementHeight:{},elementLeft:{},elementTop:{},pathListRel:{},bBoxRel:{},pathData:{},viewBoxBBox:{hasProps:!0},dashLen:{},dashGap:{}},init:function(e,t){var a,i,s,r=[];return e.element=n.pointAnchor.checkElement(t.element),"string"==typeof t.color&&(e.color=t.color.trim()),"string"==typeof t.fillColor&&(e.fill=t.fillColor.trim()),ce(t.size)&&0<=t.size&&(e.size=t.size),t.dash&&(e.dash=!0,ce(t.dash.len)&&0a.right&&(a.right=n),sa.bottom&&(a.bottom=s)):a={left:n,right:n,top:s,bottom:s},i?z.pathListRel.push([i,{x:n,y:s}]):z.pathListRel=[],i={x:n,y:s}})),z.pathListRel.push([]),s=z.strokeWidth/2,r=[{x:a.left-s,y:a.top-s},{x:a.right+s,y:a.bottom+s}],z.bBoxRel={left:r[0].x,top:r[0].y,right:r[1].x,bottom:r[1].y,width:r[1].x-r[0].x,height:r[1].y-r[0].y}}B.pathListRel=B.bBoxRel=!0}return(B.pathListRel||B.elementLeft||B.elementTop)&&(z.pathData=Le(z.pathListRel,(function(e){e.x+=t.left,e.y+=t.top}))),Ze(e,O,"strokeWidth",n=z.strokeWidth)&&(e.path.style.strokeWidth=n+"px"),je(n=z.pathData,O.pathData)&&(e.path.setPathData(n),O.pathData=n,B.pathData=!0),e.dash&&(!B.pathData&&(!B.strokeWidth||e.dashLen&&e.dashGap)||(z.dashLen=e.dashLen||2*z.strokeWidth,z.dashGap=e.dashGap||z.strokeWidth),B.dash=Ze(e,O,"dashLen",z.dashLen)||B.dash,B.dash=Ze(e,O,"dashGap",z.dashGap)||B.dash,B.dash&&(e.path.style.strokeDasharray=O.dashLen+","+O.dashGap)),I=z.viewBoxBBox,N=O.viewBoxBBox,R=e.svg.viewBox.baseVal,D=e.svg.style,I.x=z.bBoxRel.left+t.left,I.y=z.bBoxRel.top+t.top,I.width=z.bBoxRel.width,I.height=z.bBoxRel.height,["x","y","width","height"].forEach((function(t){(n=I[t])!==N[t]&&(R[t]=N[t]=n,D[W[t]]=n+("x"===t||"y"===t?e.bodyOffset[t]:0)+"px")})),B.strokeWidth||B.pathListRel||B.bBoxRel}},mouseHoverAnchor:{type:"anchor",argOptions:[{optionName:"element",type:Te},{optionName:"showEffectName",type:"string"}],style:{backgroundImage:"url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cG9seWdvbiBwb2ludHM9IjI0LDAgMCw4IDgsMTEgMCwxOSA1LDI0IDEzLDE2IDE2LDI0IiBmaWxsPSJjb3JhbCIvPjwvc3ZnPg==')",backgroundSize:"",backgroundRepeat:"no-repeat",backgroundColor:"#f8f881",cursor:"default"},hoverStyle:{backgroundImage:"none",backgroundColor:"#fadf8f"},padding:{top:1,right:15,bottom:1,left:2},minHeight:15,backgroundPosition:{right:2,top:2},backgroundSize:{width:12,height:12},dirKeys:[["top","Top"],["right","Right"],["bottom","Bottom"],["left","Left"]],init:function(e,a){var i,s,r,o,l,u,c,h,d,p,m,f=n.mouseHoverAnchor,g={};if(e.element=n.pointAnchor.checkElement(a.element),!((p=(h=e.element).ownerDocument)&&(d=p.defaultView)&&d.HTMLElement&&h instanceof d.HTMLElement))throw new Error("`element` must be HTML element");return f.style.backgroundSize=f.backgroundSize.width+"px "+f.backgroundSize.height+"px",["style","hoverStyle"].forEach((function(t){var n=f[t];e[t]=Object.keys(n).reduce((function(e,t){return e[t]=n[t],e}),{})})),"inline"===(i=e.element.ownerDocument.defaultView.getComputedStyle(e.element,"")).display?e.style.display="inline-block":"none"===i.display&&(e.style.display="block"),n.mouseHoverAnchor.dirKeys.forEach((function(t){var n=t[0],a="padding"+t[1];parseFloat(i[a])e.x2&&(e.x2=a.x2),a.y2>e.y2&&(e.y2=a.y2)},newText:function(e,t,n,a,i){var s,r,o,u,c,h=t.createElementNS(te,"text");return h.textContent=e,[h.x,h.y].forEach((function(e){var t=n.createSVGLength();t.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX,0),e.baseVal.initialize(t)})),"boolean"!=typeof l&&(l="paintOrder"in h.style),i&&!l?(r=t.createElementNS(te,"defs"),h.id=a,r.appendChild(h),(u=(s=t.createElementNS(te,"g")).appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+a,(o=s.appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+a,(c=u.style).strokeLinejoin="round",{elmPosition:h,styleText:h.style,styleFill:o.style,styleStroke:c,styleShow:s.style,elmsAppend:[r,s]}):(c=h.style,i&&(c.strokeLinejoin="round",c.paintOrder="stroke"),{elmPosition:h,styleText:c,styleFill:c,styleStroke:i?c:null,styleShow:c,elmsAppend:[h]})},getMidPoint:function(e,t){var n,a,i=Pe(e),s=i.segsLen,r=i.lenAll,o=-1,l=r/2+(t||0);if(l<=0)return 2===(n=e[0]).length?ze(n[0],n[1],0):Me(n[0],n[1],n[2],n[3],0);if(r<=l)return 2===(n=e[e.length-1]).length?ze(n[0],n[1],1):Me(n[0],n[1],n[2],n[3],1);for(a=[];l>s[++o];)a.push(e[o]),l-=s[o];return 2===(n=e[o]).length?ze(n[0],n[1],l/s[o]):Me(n[0],n[1],n[2],n[3],Fe(n[0],n[1],n[2],n[3],l))},initSvg:function(e,t){var a,i,s=n.captionLabel.newText(e.text,t.baseWindow.document,t.svg,x+"-captionLabel-"+e._id,e.outlineColor);["elmPosition","styleFill","styleShow","elmsAppend"].forEach((function(t){e[t]=s[t]})),e.isShown=!1,e.styleShow.visibility="hidden",n.captionLabel.textStyleProps.forEach((function(t){null!=e[t]&&(s.styleText[t]=e[t])})),s.elmsAppend.forEach((function(e){t.svg.appendChild(e)})),a=s.elmPosition.getBBox(),e.width=a.width,e.height=a.height,e.outlineColor&&(i=10<(i=a.height/9)?10:i<2?2:i,s.styleStroke.strokeWidth=i+"px",s.styleStroke.stroke=e.outlineColor),e.strokeWidth=i||0,$e(e.aplStats,n.captionLabel.stats),e.updateColor(t),e.refSocketXY?e.updateSocketXY(t):e.updatePath(t),re&&et(t,{}),e.updateShow(t)},bind:function(e,t){var a=t.props;return e.color||Ve(a,"cur_line_color",e.updateColor),(e.refSocketXY="startLabel"===t.optionName||"endLabel"===t.optionName)?(e.socketIndex="startLabel"===t.optionName?0:1,Ve(a,"apl_position",e.updateSocketXY),e.offset||(Ve(a,"cur_attach_plugSideLenSE",e.updateSocketXY),Ve(a,"cur_line_strokeWidth",e.updateSocketXY))):Ve(a,"apl_path",e.updatePath),Ve(a,"svgShow",e.updateShow),re&&Ve(a,"new_edge4viewBox",e.adjustEdge),n.captionLabel.initSvg(e,a),!0},unbind:function(e,t){var a=t.props;e.elmsAppend&&(e.elmsAppend.forEach((function(e){a.svg.removeChild(e)})),e.elmPosition=e.styleFill=e.styleShow=e.elmsAppend=null),$e(e.curStats,n.captionLabel.stats),$e(e.aplStats,n.captionLabel.stats),e.color||Ue(a,"cur_line_color",e.updateColor),e.refSocketXY?(Ue(a,"apl_position",e.updateSocketXY),e.offset||(Ue(a,"cur_attach_plugSideLenSE",e.updateSocketXY),Ue(a,"cur_line_strokeWidth",e.updateSocketXY))):Ue(a,"apl_path",e.updatePath),Ue(a,"svgShow",e.updateShow),re&&(Ue(a,"new_edge4viewBox",e.adjustEdge),et(a,{}))},removeOption:function(e,t){var n=t.props,a={};a[t.optionName]="",st(n,a)},remove:function(e){e.boundTargets.length&&e.boundTargets.forEach((function(t){n.captionLabel.unbind(e,t)}))}},pathLabel:{type:"label",argOptions:[{optionName:"text",type:"string"}],stats:{color:{},startOffset:{},pathData:{}},init:function(e,t){return"string"==typeof t.text&&(e.text=t.text.trim()),!!e.text&&("string"==typeof t.color&&(e.color=t.color.trim()),e.outlineColor="string"==typeof t.outlineColor?t.outlineColor.trim():"#fff",ce(t.lineOffset)&&(e.lineOffset=t.lineOffset),n.captionLabel.textStyleProps.forEach((function(n){null!=t[n]&&(e[n]=t[n])})),e.updateColor=function(t){n.captionLabel.updateColor(e,t)},e.updatePath=function(t){var a,i=e.curStats,s=e.aplStats,r=t.curStats,o=t.pathList.animVal||t.pathList.baseVal;o&&(i.pathData=a=n.pathLabel.getOffsetPathData(o,r.line_strokeWidth/2+e.strokeWidth/2+e.height/4,1.25*e.height),je(a,s.pathData)&&(e.elmPath.setPathData(a),s.pathData=a,e.bBox=e.elmPosition.getBBox(),e.updateStartOffset(t)))},e.updateStartOffset=function(t){var n,a,i,s,r=e.curStats,o=e.aplStats,l=t.curStats;r.pathData&&(2===e.semIndex&&!e.lineOffset||(i=r.pathData.reduce((function(e,t){var n,i=t.values;switch(t.type){case"M":a={x:i[0],y:i[1]};break;case"L":n={x:i[0],y:i[1]},a&&(e+=De(a,n)),a=n;break;case"C":n={x:i[4],y:i[5]},a&&(e+=Be(a,{x:i[0],y:i[1]},{x:i[2],y:i[3]},n)),a=n}return e}),0),s=0===e.semIndex?0:1===e.semIndex?i:i/2,2!==e.semIndex&&(n=Math.max(l.attach_plugBackLenSE[e.semIndex]||0,l.line_strokeWidth/2)+e.strokeWidth/2+e.height/4,s=(s+=0===e.semIndex?n:-n)<0?0:it?((i=a.points)[1]=Oe(i[0],i[1],-t),a.len=De(i[0],i[1])):(a.points=null,a.len=0),e.len>t+n?((i=e.points)[0]=Oe(i[1],i[0],-(t+n)),e.len=De(i[0],i[1])):(e.points=null,e.len=0)),e):null})),s.reduce((function(e,t){var n=t.points;return n&&(i&&r(n[0],i)||e.push({type:"M",values:[n[0].x,n[0].y]}),"line"===t.type?e.push({type:"L",values:[n[1].x,n[1].y]}):(n.shift(),n.forEach((function(t){e.push({type:"L",values:[t.x,t.y]})}))),i=n[n.length-1]),e}),[])},newText:function(e,t,n,a){var i,s,r,o,u,c,h,d,p=t.createElementNS(te,"defs"),m=p.appendChild(t.createElementNS(te,"path"));return m.id=i=n+"-path",(o=(r=t.createElementNS(te,"text")).appendChild(t.createElementNS(te,"textPath"))).href.baseVal="#"+i,o.startOffset.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX,0),o.textContent=e,"boolean"!=typeof l&&(l="paintOrder"in r.style),a&&!l?(r.id=s=n+"-text",p.appendChild(r),(h=(u=t.createElementNS(te,"g")).appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+s,(c=u.appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+s,(d=h.style).strokeLinejoin="round",{elmPosition:r,elmPath:m,elmOffset:o,styleText:r.style,styleFill:c.style,styleStroke:d,styleShow:u.style,elmsAppend:[p,u]}):(d=r.style,a&&(d.strokeLinejoin="round",d.paintOrder="stroke"),{elmPosition:r,elmPath:m,elmOffset:o,styleText:d,styleFill:d,styleStroke:a?d:null,styleShow:d,elmsAppend:[p,r]})},initSvg:function(e,t){var a,i,s=n.pathLabel.newText(e.text,t.baseWindow.document,x+"-pathLabel-"+e._id,e.outlineColor);["elmPosition","elmPath","elmOffset","styleFill","styleShow","elmsAppend"].forEach((function(t){e[t]=s[t]})),e.isShown=!1,e.styleShow.visibility="hidden",n.captionLabel.textStyleProps.forEach((function(t){null!=e[t]&&(s.styleText[t]=e[t])})),s.elmsAppend.forEach((function(e){t.svg.appendChild(e)})),s.elmPath.setPathData([{type:"M",values:[0,100]},{type:"h",values:[100]}]),a=s.elmPosition.getBBox(),s.styleText.textAnchor=["start","end","middle"][e.semIndex],2!==e.semIndex||e.lineOffset||s.elmOffset.startOffset.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE,50),e.height=a.height,e.outlineColor&&(i=10<(i=a.height/9)?10:i<2?2:i,s.styleStroke.strokeWidth=i+"px",s.styleStroke.stroke=e.outlineColor),e.strokeWidth=i||0,$e(e.aplStats,n.pathLabel.stats),e.updateColor(t),e.updatePath(t),e.updateStartOffset(t),re&&et(t,{}),e.updateShow(t)},bind:function(e,t){var a=t.props;return e.color||Ve(a,"cur_line_color",e.updateColor),Ve(a,"cur_line_strokeWidth",e.updatePath),Ve(a,"apl_path",e.updatePath),e.semIndex="startLabel"===t.optionName?0:"endLabel"===t.optionName?1:2,2===e.semIndex&&!e.lineOffset||Ve(a,"cur_attach_plugBackLenSE",e.updateStartOffset),Ve(a,"svgShow",e.updateShow),re&&Ve(a,"new_edge4viewBox",e.adjustEdge),n.pathLabel.initSvg(e,a),!0},unbind:function(e,t){var a=t.props;e.elmsAppend&&(e.elmsAppend.forEach((function(e){a.svg.removeChild(e)})),e.elmPosition=e.elmPath=e.elmOffset=e.styleFill=e.styleShow=e.elmsAppend=null),$e(e.curStats,n.pathLabel.stats),$e(e.aplStats,n.pathLabel.stats),e.color||Ue(a,"cur_line_color",e.updateColor),Ue(a,"cur_line_strokeWidth",e.updatePath),Ue(a,"apl_path",e.updatePath),2===e.semIndex&&!e.lineOffset||Ue(a,"cur_attach_plugBackLenSE",e.updateStartOffset),Ue(a,"svgShow",e.updateShow),re&&(Ue(a,"new_edge4viewBox",e.adjustEdge),et(a,{}))},removeOption:function(e,t){var n=t.props,a={};a[t.optionName]="",st(n,a)},remove:function(e){e.boundTargets.length&&e.boundTargets.forEach((function(t){n.pathLabel.unbind(e,t)}))}}},Object.keys(n).forEach((function(e){rt[e]=function(){return new a(n[e],Array.prototype.slice.call(arguments))}})),rt.positionByWindowResize=!0,window.addEventListener("resize",pe.add((function(){rt.positionByWindowResize&&Object.keys(be).forEach((function(e){et(be[e],{position:!0})}))})),!1),rt}();e.exports=t},7503:function(e,t,n){var a;e=n.nmd(e),function(){"use strict";var i={function:!0,object:!0},s=i[typeof window]&&window||this,r=i[typeof t]&&t,o=i.object&&e&&!e.nodeType&&e,l=r&&o&&"object"==typeof n.g&&n.g;!l||l.global!==l&&l.window!==l&&l.self!==l||(s=l);var u=Math.pow(2,53)-1,c=/\bOpera/,h=Object.prototype,d=h.hasOwnProperty,p=h.toString;function m(e){return(e=String(e)).charAt(0).toUpperCase()+e.slice(1)}function f(e){return e=k(e),/^(?:webOS|i(?:OS|P))/.test(e)?e:m(e)}function g(e,t){for(var n in e)d.call(e,n)&&t(e[n],n,e)}function y(e){return null==e?m(e):p.call(e).slice(8,-1)}function b(e){return String(e).replace(/([ -])(?!$)/g,"$1?")}function v(e,t){var n=null;return function(e,t){var n=-1,a=e?e.length:0;if("number"==typeof a&&a>-1&&a<=u)for(;++n3?"WebKit":/\bOpera\b/.test(P)&&(/\bOPR\b/.test(t)?"Blink":"Presto"))||/\b(?:Midori|Nook|Safari)\b/i.test(t)&&!/^(?:Trident|EdgeHTML)$/.test(L)&&"WebKit"||!L&&/\bMSIE\b/i.test(t)&&("Mac OS"==U?"Tasman":"Trident")||"WebKit"==L&&/\bPlayStation\b(?! Vita\b)/i.test(P)&&"NetFront")&&(L=[o]),"IE"==P&&(o=(/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(t)||0)[1])?(P+=" Mobile",U="Windows Phone "+(/\+$/.test(o)?o:o+".x"),O.unshift("desktop mode")):/\bWPDesktop\b/i.test(t)?(P="IE Mobile",U="Windows Phone 8.x",O.unshift("desktop mode"),F||(F=(/\brv:([\d.]+)/.exec(t)||0)[1])):"IE"!=P&&"Trident"==L&&(o=/\brv:([\d.]+)/.exec(t))&&(P&&O.push("identifying as "+P+(F?" "+F:"")),P="IE",F=o[1]),B){if(h="global",d=null!=(u=n)?typeof u[h]:"number",/^(?:boolean|number|string|undefined)$/.test(d)||"object"==d&&!u[h])y(o=n.runtime)==A?(P="Adobe AIR",U=o.flash.system.Capabilities.os):y(o=n.phantom)==S?(P="PhantomJS",F=(o=o.version||null)&&o.major+"."+o.minor+"."+o.patch):"number"==typeof N.documentMode&&(o=/\bTrident\/(\d+)/i.exec(t))?(F=[F,N.documentMode],(o=+o[1]+4)!=F[1]&&(O.push("IE "+F[1]+" mode"),L&&(L[1]=""),F[1]=o),F="IE"==P?String(F[1].toFixed(1)):F[0]):"number"==typeof N.documentMode&&/^(?:Chrome|Firefox)\b/.test(P)&&(O.push("masking as "+P+" "+F),P="IE",F="11.0",L=["Trident"],U="Windows");else if(E&&(z=(o=E.lang.System).getProperty("os.arch"),U=U||o.getProperty("os.name")+" "+o.getProperty("os.version")),_){try{F=n.require("ringo/engine").version.join("."),P="RingoJS"}catch(e){(o=n.system)&&o.global.system==n.system&&(P="Narwhal",U||(U=o[0].os||null))}P||(P="Rhino")}else"object"==typeof n.process&&!n.process.browser&&(o=n.process)&&("object"==typeof o.versions&&("string"==typeof o.versions.electron?(O.push("Node "+o.versions.node),P="Electron",F=o.versions.electron):"string"==typeof o.versions.nw&&(O.push("Chromium "+F,"Node "+o.versions.node),P="NW.js",F=o.versions.nw)),P||(P="Node.js",z=o.arch,U=o.platform,F=(F=/[\d.]+/.exec(o.version))?F[0]:null));U=U&&f(U)}if(F&&(o=/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(F)||/(?:alpha|beta)(?: ?\d)?/i.exec(t+";"+(B&&i.appMinorVersion))||/\bMinefield\b/i.test(t)&&"a")&&(M=/b/i.test(o)?"beta":"alpha",F=F.replace(RegExp(o+"\\+?$"),"")+("beta"==M?I:T)+(/\d+\+?/.exec(o)||"")),"Fennec"==P||"Firefox"==P&&/\b(?:Android|Firefox OS|KaiOS)\b/.test(U))P="Firefox Mobile";else if("Maxthon"==P&&F)F=F.replace(/\.[\d.]+/,".x");else if(/\bXbox\b/i.test(j))"Xbox 360"==j&&(U=null),"Xbox 360"==j&&/\bIEMobile\b/.test(t)&&O.unshift("mobile mode");else if(!/^(?:Chrome|IE|Opera)$/.test(P)&&(!P||j||/Browser|Mobi/.test(P))||"Windows CE"!=U&&!/Mobi/i.test(t))if("IE"==P&&B)try{null===n.external&&O.unshift("platform preview")}catch(e){O.unshift("embedded")}else(/\bBlackBerry\b/.test(j)||/\bBB10\b/.test(t))&&(o=(RegExp(j.replace(/ +/g," *")+"/([.\\d]+)","i").exec(t)||0)[1]||F)?(U=((o=[o,/BB10/.test(t)])[1]?(j=null,V="BlackBerry"):"Device Software")+" "+o[0],F=null):this!=g&&"Wii"!=j&&(B&&R||/Opera/.test(P)&&/\b(?:MSIE|Firefox)\b/i.test(t)||"Firefox"==P&&/\bOS X (?:\d+\.){2,}/.test(U)||"IE"==P&&(U&&!/^Win/.test(U)&&F>5.5||/\bWindows XP\b/.test(U)&&F>8||8==F&&!/\bTrident\b/.test(t)))&&!c.test(o=e.call(g,t.replace(c,"")+";"))&&o.name&&(o="ing as "+o.name+((o=o.version)?" "+o:""),c.test(P)?(/\bIE\b/.test(o)&&"Mac OS"==U&&(U=null),o="identify"+o):(o="mask"+o,P=D?f(D.replace(/([a-z])([A-Z])/g,"$1 $2")):"Opera",/\bIE\b/.test(o)&&(U=null),B||(F=null)),L=["Presto"],O.push(o));else P+=" Mobile";(o=(/\bAppleWebKit\/([\d.]+\+?)/i.exec(t)||0)[1])&&(o=[parseFloat(o.replace(/\.(\d)$/,".0$1")),o],"Safari"==P&&"+"==o[1].slice(-1)?(P="WebKit Nightly",M="alpha",F=o[1].slice(0,-1)):F!=o[1]&&F!=(o[2]=(/\bSafari\/([\d.]+\+?)/i.exec(t)||0)[1])||(F=null),o[1]=(/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(t)||0)[1],537.36==o[0]&&537.36==o[2]&&parseFloat(o[1])>=28&&"WebKit"==L&&(L=["Blink"]),B&&(m||o[1])?(L&&(L[1]="like Chrome"),o=o[1]||((o=o[0])<530?1:o<532?2:o<532.05?3:o<533?4:o<534.03?5:o<534.07?6:o<534.1?7:o<534.13?8:o<534.16?9:o<534.24?10:o<534.3?11:o<535.01?12:o<535.02?"13+":o<535.07?15:o<535.11?16:o<535.19?17:o<536.05?18:o<536.1?19:o<537.01?20:o<537.11?"21+":o<537.13?23:o<537.18?24:o<537.24?25:o<537.36?26:"Blink"!=L?"27":"28")):(L&&(L[1]="like Safari"),o=(o=o[0])<400?1:o<500?2:o<526?3:o<533?4:o<534?"4+":o<535?5:o<537?6:o<538?7:o<601?8:o<602?9:o<604?10:o<606?11:o<608?12:"12"),L&&(L[1]+=" "+(o+="number"==typeof o?".x":/[.+]/.test(o)?"":"+")),"Safari"==P&&(!F||parseInt(F)>45)?F=o:"Chrome"==P&&/\bHeadlessChrome/i.test(t)&&O.unshift("headless")),"Opera"==P&&(o=/\bzbov|zvav$/.exec(U))?(P+=" ",O.unshift("desktop mode"),"zvav"==o?(P+="Mini",F=null):P+="Mobile",U=U.replace(RegExp(" *"+o+"$"),"")):"Safari"==P&&/\bChrome\b/.exec(L&&L[1])?(O.unshift("desktop mode"),P="Chrome Mobile",F=null,/\bOS X\b/.test(U)?(V="Apple",U="iOS 4.3+"):U=null):/\bSRWare Iron\b/.test(P)&&!F&&(F=G("Chrome")),F&&0==F.indexOf(o=/[\d.]+$/.exec(U))&&t.indexOf("/"+o+"-")>-1&&(U=k(U.replace(o,""))),U&&-1!=U.indexOf(P)&&!RegExp(P+" OS").test(U)&&(U=U.replace(RegExp(" *"+b(P)+" *"),"")),L&&!/\b(?:Avant|Nook)\b/.test(P)&&(/Browser|Lunascape|Maxthon/.test(P)||"Safari"!=P&&/^iOS/.test(U)&&/\bSafari\b/.test(L[1])||/^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(P)&&L[1])&&(o=L[L.length-1])&&O.push(o),O.length&&(O=["("+O.join("; ")+")"]),V&&j&&j.indexOf(V)<0&&O.push("on "+V),j&&O.push((/^on /.test(O[O.length-1])?"":"on ")+j),U&&(o=/ ([\d.+]+)$/.exec(U),l=o&&"/"==U.charAt(U.length-o[0].length-1),U={architecture:32,family:o&&!l?U.replace(o[0],""):U,version:o?o[1]:null,toString:function(){var e=this.version;return this.family+(e&&!l?" "+e:"")+(64==this.architecture?" 64-bit":"")}}),(o=/\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(z))&&!/\bi686\b/i.test(z)?(U&&(U.architecture=64,U.family=U.family.replace(RegExp(" *"+o),"")),P&&(/\bWOW64\b/i.test(t)||B&&/\w(?:86|32)$/.test(i.cpuClass||i.platform)&&!/\bWin64; x64\b/i.test(t))&&O.unshift("32-bit")):U&&/^OS X/.test(U.family)&&"Chrome"==P&&parseFloat(F)>=39&&(U.architecture=64),t||(t=null);var q={};return q.description=t,q.layout=L&&L[0],q.manufacturer=V,q.name=P,q.prerelease=M,q.product=j,q.ua=t,q.version=P&&F,q.os=U||{architecture:null,family:null,version:null,toString:function(){return"null"}},q.parse=e,q.toString=function(){return this.description||""},q.version&&O.unshift(F),q.name&&O.unshift(P),U&&P&&(U!=String(U).split(" ")[0]||U!=P.split(" ")[0]&&!j)&&O.push(j?"("+U+")":"on "+U),O.length&&(q.description=O.join(" ")),q}();s.platform=w,void 0===(a=function(){return w}.call(t,n,t,e))||(e.exports=a)}.call(this)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,a="function"==typeof Set,i="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function s(e,r){if(e===r)return!0;if(e&&r&&"object"==typeof e&&"object"==typeof r){if(e.constructor!==r.constructor)return!1;var o,l,u,c;if(Array.isArray(e)){if((o=e.length)!=r.length)return!1;for(l=o;0!=l--;)if(!s(e[l],r[l]))return!1;return!0}if(n&&e instanceof Map&&r instanceof Map){if(e.size!==r.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!r.has(l.value[0]))return!1;for(c=e.entries();!(l=c.next()).done;)if(!s(l.value[1],r.get(l.value[0])))return!1;return!0}if(a&&e instanceof Set&&r instanceof Set){if(e.size!==r.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!r.has(l.value[0]))return!1;return!0}if(i&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(r)){if((o=e.length)!=r.length)return!1;for(l=o;0!=l--;)if(e[l]!==r[l])return!1;return!0}if(e.constructor===RegExp)return e.source===r.source&&e.flags===r.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof r.valueOf)return e.valueOf()===r.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof r.toString)return e.toString()===r.toString();if((o=(u=Object.keys(e)).length)!==Object.keys(r).length)return!1;for(l=o;0!=l--;)if(!Object.prototype.hasOwnProperty.call(r,u[l]))return!1;if(t&&e instanceof Element)return!1;for(l=o;0!=l--;)if(("_owner"!==u[l]&&"__v"!==u[l]&&"__o"!==u[l]||!e.$$typeof)&&!s(e[u[l]],r[u[l]]))return!1;return!0}return e!=e&&r!=r}e.exports=function(e,t){try{return s(e,t)}catch(e){if((e.message||"").match(/stack|recursion/i))return!1;throw e}}},5072:e=>{"use strict";var t=[];function n(e){for(var n=-1,a=0;a{"use strict";var t={};e.exports=function(e,n){var a=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(n)}},540:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},5056:(e,t,n)=>{"use strict";e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},7825:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var a="";n.supports&&(a+="@supports (".concat(n.supports,") {")),n.media&&(a+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(a+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),a+=n.css,i&&(a+="}"),n.media&&(a+="}"),n.supports&&(a+="}");var s=n.sourceMap;s&&"undefined"!=typeof btoa&&(a+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleTagTransform(a,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},1113:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},402:e=>{e.exports=''},3389:e=>{e.exports=''},627:e=>{e.exports=''},8110:e=>{e.exports=''},980:e=>{e.exports=''},3890:e=>{e.exports=''},880:e=>{e.exports=''},3282:e=>{e.exports=''},4948:function(e){e.exports=function(){"use strict";function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function n(t,n){return t.get(e(t,n))}function a(e,n,a){t(e,n),n.set(e,a)}function i(t,n,a){return t.set(e(t,n),a),a}const s=100,r={},o=()=>{r.previousActiveElement instanceof HTMLElement?(r.previousActiveElement.focus(),r.previousActiveElement=null):document.body&&document.body.focus()},l=e=>new Promise((t=>{if(!e)return t();const n=window.scrollX,a=window.scrollY;r.restoreFocusTimeout=setTimeout((()=>{o(),t()}),s),window.scrollTo(n,a)})),u="swal2-",c=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","default-outline","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error"].reduce(((e,t)=>(e[t]=u+t,e)),{}),h=["success","warning","info","question","error"].reduce(((e,t)=>(e[t]=u+t,e)),{}),d=e=>e.charAt(0).toUpperCase()+e.slice(1),p=e=>{},m=e=>{},f=[],g=e=>{f.includes(e)||(f.push(e),p(e))},y=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;g(`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`)},b=e=>"function"==typeof e?e():e,v=e=>e&&"function"==typeof e.toPromise,k=e=>v(e)?e.toPromise():Promise.resolve(e),w=e=>e&&Promise.resolve(e)===e,A=()=>document.body.querySelector(`.${c.container}`),x=e=>{const t=A();return t?t.querySelector(e):null},C=e=>x(`.${e}`),S=()=>C(c.popup),E=()=>C(c.icon),_=()=>C(c["icon-content"]),T=()=>C(c.title),I=()=>C(c["html-container"]),N=()=>C(c.image),R=()=>C(c["progress-steps"]),D=()=>C(c["validation-message"]),z=()=>x(`.${c.actions} .${c.confirm}`),O=()=>x(`.${c.actions} .${c.cancel}`),M=()=>x(`.${c.actions} .${c.deny}`),B=()=>C(c["input-label"]),F=()=>x(`.${c.loader}`),L=()=>C(c.actions),P=()=>C(c.footer),j=()=>C(c["timer-progress-bar"]),V=()=>C(c.close),U='\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex="0"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n',W=()=>{const e=S();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort(((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),a=parseInt(t.getAttribute("tabindex")||"0");return n>a?1:n"-1"!==e.getAttribute("tabindex")));return[...new Set(n.concat(i))].filter((e=>ue(e)))},G=()=>$(document.body,c.shown)&&!$(document.body,c["toast-shown"])&&!$(document.body,c["no-backdrop"]),q=()=>{const e=S();return!!e&&$(e,c.toast)},H=()=>{const e=S();return!!e&&e.hasAttribute("data-loading")},K=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),a=n.querySelector("head");a&&Array.from(a.childNodes).forEach((t=>{e.appendChild(t)}));const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach((t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)}))}},$=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{Array.from(e.classList).forEach((n=>{Object.values(c).includes(n)||Object.values(h).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)}))},X=(e,t,n)=>{if(Z(e,t),!t.customClass)return;const a=t.customClass[n];a&&("string"==typeof a||a.forEach?ee(e,a):p(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof a}"`))},Y=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${c.popup} > .${c[t]}`);case"checkbox":return e.querySelector(`.${c.popup} > .${c.checkbox} input`);case"radio":return e.querySelector(`.${c.popup} > .${c.radio} input:checked`)||e.querySelector(`.${c.popup} > .${c.radio} input:first-child`);case"range":return e.querySelector(`.${c.popup} > .${c.range} input`);default:return e.querySelector(`.${c.popup} > .${c.input}`)}},Q=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},J=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach((t=>{Array.isArray(e)?e.forEach((e=>{n?e.classList.add(t):e.classList.remove(t)})):n?e.classList.add(t):e.classList.remove(t)})))},ee=(e,t)=>{J(e,t,!0)},te=(e,t)=>{J(e,t,!1)},ne=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(n)}`&&(n=parseInt(n)),n||0===parseInt(n)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},ie=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"flex";e&&(e.style.display=t)},se=e=>{e&&(e.style.display="none")},re=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"block";e&&new MutationObserver((()=>{le(e,e.innerHTML,t)})).observe(e,{childList:!0,subtree:!0})},oe=(e,t,n,a)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,a)},le=function(e,t){t?ie(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:"flex"):se(e)},ue=e=>!(!e||!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),ce=()=>!ue(z())&&!ue(M())&&!ue(O()),he=e=>!!(e.scrollHeight>e.clientHeight),de=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),a=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||a>0},pe=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=j();n&&ue(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout((()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"}),10))},me=()=>{const e=j();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`},fe=()=>"undefined"==typeof window||"undefined"==typeof document,ge=`\n
\n \n
    \n
    \n \n

    \n
    \n \n \n
    \n \n \n
    \n \n
    \n \n \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n`.replace(/(^|\n)\s*/g,""),ye=()=>{const e=A();return!!e&&(e.remove(),te([document.documentElement,document.body],[c["no-backdrop"],c["toast-shown"],c["has-column"]]),!0)},be=()=>{r.currentInstance.resetValidationMessage()},ve=()=>{const e=S(),t=ne(e,c.input),n=ne(e,c.file),a=e.querySelector(`.${c.range} input`),i=e.querySelector(`.${c.range} output`),s=ne(e,c.select),r=e.querySelector(`.${c.checkbox} input`),o=ne(e,c.textarea);t.oninput=be,n.onchange=be,s.onchange=be,r.onchange=be,o.oninput=be,a.oninput=()=>{be(),i.value=a.value},a.onchange=()=>{be(),i.value=a.value}},ke=e=>"string"==typeof e?document.querySelector(e):e,we=e=>{const t=S();t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true")},Ae=e=>{"rtl"===window.getComputedStyle(e).direction&&ee(A(),c.rtl)},xe=e=>{const t=ye();if(fe())return void m("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=c.container,t&&ee(n,c["no-transition"]),K(n,ge);const a=ke(e.target);a.appendChild(n),we(e),Ae(a),ve()},Ce=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?Se(e,t):e&&K(t,e)},Se=(e,t)=>{e.jquery?Ee(t,e):K(t,e.toString())},Ee=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},_e=(e,t)=>{const n=L(),a=F();n&&a&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?ie(n):se(n),X(n,t,"actions"),Te(n,a,t),K(a,t.loaderHtml||""),X(a,t,"loader"))};function Te(e,t,n){const a=z(),i=M(),s=O();a&&i&&s&&(Ne(a,"confirm",n),Ne(i,"deny",n),Ne(s,"cancel",n),Ie(a,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,a),e.insertBefore(i,a)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(a,t))))}function Ie(e,t,n,a){a.buttonsStyling?(ee([e,t,n],c.styled),a.confirmButtonColor&&(e.style.backgroundColor=a.confirmButtonColor,ee(e,c["default-outline"])),a.denyButtonColor&&(t.style.backgroundColor=a.denyButtonColor,ee(t,c["default-outline"])),a.cancelButtonColor&&(n.style.backgroundColor=a.cancelButtonColor,ee(n,c["default-outline"]))):te([e,t,n],c.styled)}function Ne(e,t,n){const a=d(t);le(e,n[`show${a}Button`],"inline-block"),K(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=c[t],X(e,n,`${t}Button`)}const Re=(e,t)=>{const n=V();n&&(K(n,t.closeButtonHtml||""),X(n,t,"closeButton"),le(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))},De=(e,t)=>{const n=A();n&&(ze(n,t.backdrop),Oe(n,t.position),Me(n,t.grow),X(n,t,"container"))};function ze(e,t){"string"==typeof t?e.style.background=t:t||ee([document.documentElement,document.body],c["no-backdrop"])}function Oe(e,t){t&&(t in c?ee(e,c[t]):(p('The "position" parameter is not valid, defaulting to "center"'),ee(e,c.center)))}function Me(e,t){t&&ee(e,c[`grow-${t}`])}var Be={innerParams:new WeakMap,domCache:new WeakMap};const Fe=["input","file","range","select","radio","checkbox","textarea"],Le=(e,t)=>{const n=S();if(!n)return;const a=Be.innerParams.get(e),i=!a||t.input!==a.input;Fe.forEach((e=>{const a=ne(n,c[e]);a&&(Ve(e,t.inputAttributes),a.className=c[e],i&&se(a))})),t.input&&(i&&Pe(t),Ue(t))},Pe=e=>{if(!e.input)return;if(!Ke[e.input])return void m(`Unexpected type of input! Expected ${Object.keys(Ke).join(" | ")}, got "${e.input}"`);const t=qe(e.input);if(!t)return;const n=Ke[e.input](t,e);ie(t),e.inputAutoFocus&&setTimeout((()=>{Q(n)}))},je=e=>{for(let t=0;t{const n=S();if(!n)return;const a=Y(n,e);if(a){je(a);for(const e in t)a.setAttribute(e,t[e])}},Ue=e=>{if(!e.input)return;const t=qe(e.input);t&&X(t,e,"input")},We=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},Ge=(e,t,n)=>{if(n.inputLabel){const a=document.createElement("label"),i=c["input-label"];a.setAttribute("for",e.id),a.className=i,"object"==typeof n.customClass&&ee(a,n.customClass.inputLabel),a.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",a)}},qe=e=>{const t=S();if(t)return ne(t,c[e]||c.input)},He=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:w(t)||p(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ke={};Ke.text=Ke.email=Ke.password=Ke.number=Ke.tel=Ke.url=Ke.search=Ke.date=Ke["datetime-local"]=Ke.time=Ke.week=Ke.month=(e,t)=>(He(e,t.inputValue),Ge(e,e,t),We(e,t),e.type=t.input,e),Ke.file=(e,t)=>(Ge(e,e,t),We(e,t),e),Ke.range=(e,t)=>{const n=e.querySelector("input"),a=e.querySelector("output");return He(n,t.inputValue),n.type=t.input,He(a,t.inputValue),Ge(n,e,t),e},Ke.select=(e,t)=>{if(e.textContent="",t.inputPlaceholder){const n=document.createElement("option");K(n,t.inputPlaceholder),n.value="",n.disabled=!0,n.selected=!0,e.appendChild(n)}return Ge(e,e,t),e},Ke.radio=e=>(e.textContent="",e),Ke.checkbox=(e,t)=>{const n=Y(S(),"checkbox");n.value="1",n.checked=Boolean(t.inputValue);const a=e.querySelector("span");return K(a,t.inputPlaceholder||t.inputLabel),n},Ke.textarea=(e,t)=>{He(e,t.inputValue),We(e,t),Ge(e,e,t);const n=e=>parseInt(window.getComputedStyle(e).marginLeft)+parseInt(window.getComputedStyle(e).marginRight);return setTimeout((()=>{if("MutationObserver"in window){const a=parseInt(window.getComputedStyle(S()).width);new MutationObserver((()=>{if(!document.body.contains(e))return;const i=e.offsetWidth+n(e);i>a?S().style.width=`${i}px`:ae(S(),"width",t.width)})).observe(e,{attributes:!0,attributeFilter:["style"]})}})),e};const $e=(e,t)=>{const n=I();n&&(re(n),X(n,t,"htmlContainer"),t.html?(Ce(t.html,n),ie(n,"block")):t.text?(n.textContent=t.text,ie(n,"block")):se(n),Le(e,t))},Ze=(e,t)=>{const n=P();n&&(re(n),le(n,t.footer,"block"),t.footer&&Ce(t.footer,n),X(n,t,"footer"))},Xe=(e,t)=>{const n=Be.innerParams.get(e),a=E();if(a){if(n&&t.icon===n.icon)return tt(a,t),void Ye(a,t);if(t.icon||t.iconHtml){if(t.icon&&-1===Object.keys(h).indexOf(t.icon))return m(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void se(a);ie(a),tt(a,t),Ye(a,t),ee(a,t.showClass&&t.showClass.icon)}else se(a)}},Ye=(e,t)=>{for(const[n,a]of Object.entries(h))t.icon!==n&&te(e,a);ee(e,t.icon&&h[t.icon]),nt(e,t),Qe(),X(e,t,"icon")},Qe=()=>{const e=S();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e\n \n
    \n
    \n',et='\n \n \n \n \n',tt=(e,t)=>{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,a="";t.iconHtml?a=at(t.iconHtml):"success"===t.icon?(a=Je,n=n.replace(/ style=".*?"/g,"")):"error"===t.icon?a=et:t.icon&&(a=at({question:"?",warning:"!",info:"i"}[t.icon])),n.trim()!==a.trim()&&K(e,a)},nt=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])oe(e,n,"background-color",t.iconColor);oe(e,".swal2-success-ring","border-color",t.iconColor)}},at=e=>`
    ${e}
    `,it=(e,t)=>{const n=N();n&&(t.imageUrl?(ie(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),ae(n,"width",t.imageWidth),ae(n,"height",t.imageHeight),n.className=c.image,X(n,t,"image")):se(n))},st=(e,t)=>{const n=A(),a=S();if(n&&a){if(t.toast){ae(n,"width",t.width),a.style.width="100%";const e=F();e&&a.insertBefore(e,E())}else ae(a,"width",t.width);ae(a,"padding",t.padding),t.color&&(a.style.color=t.color),t.background&&(a.style.background=t.background),se(D()),rt(a,t)}},rt=(e,t)=>{const n=t.showClass||{};e.className=`${c.popup} ${ue(e)?n.popup:""}`,t.toast?(ee([document.documentElement,document.body],c["toast-shown"]),ee(e,c.toast)):ee(e,c.modal),X(e,t,"popup"),"string"==typeof t.customClass&&ee(e,t.customClass),t.icon&&ee(e,c[`icon-${t.icon}`])},ot=(e,t)=>{const n=R();if(!n)return;const{progressSteps:a,currentProgressStep:i}=t;a&&0!==a.length&&void 0!==i?(ie(n),n.textContent="",i>=a.length&&p("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),a.forEach(((e,s)=>{const r=lt(e);if(n.appendChild(r),s===i&&ee(r,c["active-progress-step"]),s!==a.length-1){const e=ut(t);n.appendChild(e)}}))):se(n)},lt=e=>{const t=document.createElement("li");return ee(t,c["progress-step"]),K(t,e),t},ut=e=>{const t=document.createElement("li");return ee(t,c["progress-step-line"]),e.progressStepsDistance&&ae(t,"width",e.progressStepsDistance),t},ct=(e,t)=>{const n=T();n&&(re(n),le(n,t.title||t.titleText,"block"),t.title&&Ce(t.title,n),t.titleText&&(n.innerText=t.titleText),X(n,t,"title"))},ht=(e,t)=>{st(e,t),De(e,t),ot(e,t),Xe(e,t),it(e,t),ct(e,t),Re(e,t),$e(e,t),_e(e,t),Ze(e,t);const n=S();"function"==typeof t.didRender&&n&&t.didRender(n),r.eventEmitter.emit("didRender",n)},dt=()=>ue(S()),pt=()=>{var e;return null===(e=z())||void 0===e?void 0:e.click()},mt=()=>{var e;return null===(e=M())||void 0===e?void 0:e.click()},ft=()=>{var e;return null===(e=O())||void 0===e?void 0:e.click()},gt=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),yt=e=>{e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1)},bt=(e,t,n)=>{yt(e),t.toast||(e.keydownHandler=e=>At(t,e,n),e.keydownTarget=t.keydownListenerCapture?window:S(),e.keydownListenerCapture=t.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)},vt=(e,t)=>{var n;const a=W();if(a.length)return(e+=t)===a.length?e=0:-1===e&&(e=a.length-1),void a[e].focus();null===(n=S())||void 0===n||n.focus()},kt=["ArrowRight","ArrowDown"],wt=["ArrowLeft","ArrowUp"],At=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?xt(t,e):"Tab"===t.key?Ct(t):[...kt,...wt].includes(t.key)?St(t.key):"Escape"===t.key&&Et(t,e,n)))},xt=(e,t)=>{if(!b(t.allowEnterKey))return;const n=Y(S(),t.input);if(e.target&&n&&e.target instanceof HTMLElement&&e.target.outerHTML===n.outerHTML){if(["textarea","file"].includes(t.input))return;pt(),e.preventDefault()}},Ct=e=>{const t=e.target,n=W();let a=-1;for(let e=0;e{const t=L(),n=z(),a=M(),i=O();if(!(t&&n&&a&&i))return;const s=[n,a,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=kt.includes(e)?"nextElementSibling":"previousElementSibling";let o=document.activeElement;if(o){for(let e=0;e{b(t.allowEscapeKey)&&(e.preventDefault(),n(gt.esc))};var _t={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const Tt=()=>{const e=A();Array.from(document.body.children).forEach((t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))}))},It=()=>{Array.from(document.body.children).forEach((e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")}))},Nt="undefined"!=typeof window&&!!window.GestureEvent,Rt=()=>{if(Nt&&!$(document.body,c.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",ee(document.body,c.iosfix),Dt()}},Dt=()=>{const e=A();if(!e)return;let t;e.ontouchstart=e=>{t=zt(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},zt=e=>{const t=e.target,n=A(),a=I();return!(!n||!a||Ot(e)||Mt(e)||t!==n&&(he(n)||!(t instanceof HTMLElement)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||he(a)&&a.contains(t)))},Ot=e=>e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType,Mt=e=>e.touches&&e.touches.length>1,Bt=()=>{if($(document.body,c.iosfix)){const e=parseInt(document.body.style.top,10);te(document.body,c.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}},Ft=()=>{const e=document.createElement("div");e.className=c["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t};let Lt=null;const Pt=e=>{null===Lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(Lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${Lt+Ft()}px`)},jt=()=>{null!==Lt&&(document.body.style.paddingRight=`${Lt}px`,Lt=null)};function Vt(e,t,n,a){q()?Xt(e,a):(l(n).then((()=>Xt(e,a))),yt(r)),Nt?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),G()&&(jt(),Bt(),It()),Ut()}function Ut(){te([document.documentElement,document.body],[c.shown,c["height-auto"],c["no-backdrop"],c["toast-shown"]])}function Wt(e){e=Kt(e);const t=_t.swalPromiseResolve.get(this),n=Gt(this);this.isAwaitingPromise?e.isDismissed||(Ht(this),t(e)):n&&t(e)}const Gt=e=>{const t=S();if(!t)return!1;const n=Be.innerParams.get(e);if(!n||$(t,n.hideClass.popup))return!1;te(t,n.showClass.popup),ee(t,n.hideClass.popup);const a=A();return te(a,n.showClass.backdrop),ee(a,n.hideClass.backdrop),$t(e,t,n),!0};function qt(e){const t=_t.swalPromiseReject.get(this);Ht(this),t&&t(e)}const Ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,Be.innerParams.get(e)||e._destroy())},Kt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),$t=(e,t,n)=>{var a;const i=A(),s=de(t);"function"==typeof n.willClose&&n.willClose(t),null===(a=r.eventEmitter)||void 0===a||a.emit("willClose",t),s?Zt(e,t,i,n.returnFocus,n.didClose):Vt(e,i,n.returnFocus,n.didClose)},Zt=(e,t,n,a,i)=>{r.swalCloseEventFinishedCallback=Vt.bind(null,e,n,a,i);const s=function(e){var n;e.target===t&&(null===(n=r.swalCloseEventFinishedCallback)||void 0===n||n.call(r),delete r.swalCloseEventFinishedCallback,t.removeEventListener("animationend",s),t.removeEventListener("transitionend",s))};t.addEventListener("animationend",s),t.addEventListener("transitionend",s)},Xt=(e,t)=>{setTimeout((()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=r.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()}))},Yt=e=>{let t=S();if(t||new ti,t=S(),!t)return;const n=F();q()?se(E()):Qt(t,e),ie(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},Qt=(e,t)=>{const n=L(),a=F();n&&a&&(!t&&ue(z())&&(t=z()),ie(n),t&&(se(t),a.setAttribute("data-button-to-replace",t.className),n.insertBefore(a,t)),ee([e,n],c.loading))},Jt=(e,t)=>{"select"===t.input||"radio"===t.input?sn(e,t):["text","email","number","tel","textarea"].some((e=>e===t.input))&&(v(t.inputValue)||w(t.inputValue))&&(Yt(z()),rn(e,t))},en=(e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return tn(n);case"radio":return nn(n);case"file":return an(n);default:return t.inputAutoTrim?n.value.trim():n.value}},tn=e=>e.checked?1:0,nn=e=>e.checked?e.value:null,an=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,sn=(e,t)=>{const n=S();if(!n)return;const a=e=>{"select"===t.input?on(n,un(e),t):"radio"===t.input&&ln(n,un(e),t)};v(t.inputOptions)||w(t.inputOptions)?(Yt(z()),k(t.inputOptions).then((t=>{e.hideLoading(),a(t)}))):"object"==typeof t.inputOptions?a(t.inputOptions):m("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},rn=(e,t)=>{const n=e.getInput();n&&(se(n),k(t.inputValue).then((a=>{n.value="number"===t.input?`${parseFloat(a)||0}`:`${a}`,ie(n),n.focus(),e.hideLoading()})).catch((t=>{m(`Error in inputValue promise: ${t}`),n.value="",ie(n),n.focus(),e.hideLoading()})))};function on(e,t,n){const a=ne(e,c.select);if(!a)return;const i=(e,t,a)=>{const i=document.createElement("option");i.value=a,K(i,t),i.selected=cn(a,n.inputValue),e.appendChild(i)};t.forEach((e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,a.appendChild(e),n.forEach((t=>i(e,t[1],t[0])))}else i(a,n,t)})),a.focus()}function ln(e,t,n){const a=ne(e,c.radio);if(!a)return;t.forEach((e=>{const t=e[0],i=e[1],s=document.createElement("input"),r=document.createElement("label");s.type="radio",s.name=c.radio,s.value=t,cn(t,n.inputValue)&&(s.checked=!0);const o=document.createElement("span");K(o,i),o.className=c.label,r.appendChild(s),r.appendChild(o),a.appendChild(r)}));const i=a.querySelectorAll("input");i.length&&i[0].focus()}const un=e=>{const t=[];return e instanceof Map?e.forEach(((e,n)=>{let a=e;"object"==typeof a&&(a=un(a)),t.push([n,a])})):Object.keys(e).forEach((n=>{let a=e[n];"object"==typeof a&&(a=un(a)),t.push([n,a])})),t},cn=(e,t)=>!!t&&t.toString()===e.toString(),hn=e=>{const t=Be.innerParams.get(e);e.disableButtons(),t.input?mn(e,"confirm"):vn(e,!0)},dn=e=>{const t=Be.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?mn(e,"deny"):gn(e,!1)},pn=(e,t)=>{e.disableButtons(),t(gt.cancel)},mn=(e,t)=>{const n=Be.innerParams.get(e);if(!n.input)return void m(`The "input" parameter is needed to be set when using returnInputValueOn${d(t)}`);const a=e.getInput(),i=en(e,n);n.inputValidator?fn(e,i,t):a&&!a.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||a.validationMessage)):"deny"===t?gn(e,i):vn(e,i)},fn=(e,t,n)=>{const a=Be.innerParams.get(e);e.disableInput(),Promise.resolve().then((()=>k(a.inputValidator(t,a.validationMessage)))).then((a=>{e.enableButtons(),e.enableInput(),a?e.showValidationMessage(a):"deny"===n?gn(e,t):vn(e,t)}))},gn=(e,t)=>{const n=Be.innerParams.get(e||void 0);n.showLoaderOnDeny&&Yt(M()),n.preDeny?(e.isAwaitingPromise=!0,Promise.resolve().then((()=>k(n.preDeny(t,n.validationMessage)))).then((n=>{!1===n?(e.hideLoading(),Ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})})).catch((t=>bn(e||void 0,t)))):e.close({isDenied:!0,value:t})},yn=(e,t)=>{e.close({isConfirmed:!0,value:t})},bn=(e,t)=>{e.rejectPromise(t)},vn=(e,t)=>{const n=Be.innerParams.get(e||void 0);n.showLoaderOnConfirm&&Yt(),n.preConfirm?(e.resetValidationMessage(),e.isAwaitingPromise=!0,Promise.resolve().then((()=>k(n.preConfirm(t,n.validationMessage)))).then((n=>{ue(D())||!1===n?(e.hideLoading(),Ht(e)):yn(e,void 0===n?t:n)})).catch((t=>bn(e||void 0,t)))):yn(e,t)};function kn(){const e=Be.innerParams.get(this);if(!e)return;const t=Be.domCache.get(this);se(t.loader),q()?e.icon&&ie(E()):wn(t),te([t.popup,t.actions],c.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const wn=e=>{const t=e.popup.getElementsByClassName(e.loader.getAttribute("data-button-to-replace"));t.length?ie(t[0],"inline-block"):ce()&&se(e.actions)};function An(){const e=Be.innerParams.get(this),t=Be.domCache.get(this);return t?Y(t.popup,e.input):null}function xn(e,t,n){const a=Be.domCache.get(e);t.forEach((e=>{a[e].disabled=n}))}function Cn(e,t){const n=S();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${c.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(Rn,e),Bn=e=>-1!==Dn.indexOf(e),Fn=e=>zn[e],Ln=e=>{Mn(e)||p(`Unknown parameter "${e}"`)},Pn=e=>{On.includes(e)&&p(`The parameter "${e}" is incompatible with toasts`)},jn=e=>{const t=Fn(e);t&&y(e,t)},Vn=e=>{!1===e.backdrop&&e.allowOutsideClick&&p('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');for(const t in e)Ln(t),e.toast&&Pn(t),jn(t)};function Un(e){const t=S(),n=Be.innerParams.get(this);if(!t||$(t,n.hideClass.popup))return void p("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const a=Wn(e),i=Object.assign({},n,a);ht(this,i),Be.innerParams.set(this,i),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const Wn=e=>{const t={};return Object.keys(e).forEach((n=>{Bn(n)?t[n]=e[n]:p(`Invalid parameter to update: ${n}`)})),t};function Gn(){const e=Be.domCache.get(this),t=Be.innerParams.get(this);t?(e.popup&&r.swalCloseEventFinishedCallback&&(r.swalCloseEventFinishedCallback(),delete r.swalCloseEventFinishedCallback),"function"==typeof t.didDestroy&&t.didDestroy(),r.eventEmitter.emit("didDestroy"),qn(this)):Hn(this)}const qn=e=>{Hn(e),delete e.params,delete r.keydownHandler,delete r.keydownTarget,delete r.currentInstance},Hn=e=>{e.isAwaitingPromise?(Kn(Be,e),e.isAwaitingPromise=!0):(Kn(_t,e),Kn(Be,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},Kn=(e,t)=>{for(const n in e)e[n].delete(t)};var $n=Object.freeze({__proto__:null,_destroy:Gn,close:Wt,closeModal:Wt,closePopup:Wt,closeToast:Wt,disableButtons:En,disableInput:Tn,disableLoading:kn,enableButtons:Sn,enableInput:_n,getInput:An,handleAwaitingPromise:Ht,hideLoading:kn,rejectPromise:qt,resetValidationMessage:Nn,showValidationMessage:In,update:Un});const Zn=(e,t,n)=>{e.toast?Xn(e,t,n):(Jn(t),ea(t),ta(e,t,n))},Xn=(e,t,n)=>{t.popup.onclick=()=>{e&&(Yn(e)||e.timer||e.input)||n(gt.close)}},Yn=e=>!!(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let Qn=!1;const Jn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(Qn=!0)}}},ea=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(Qn=!0)}}},ta=(e,t,n)=>{t.container.onclick=a=>{Qn?Qn=!1:a.target===t.container&&b(e.allowOutsideClick)&&n(gt.backdrop)}},na=e=>"object"==typeof e&&e.jquery,aa=e=>e instanceof Element||na(e),ia=e=>{const t={};return"object"!=typeof e[0]||aa(e[0])?["title","html","icon"].forEach(((n,a)=>{const i=e[a];"string"==typeof i||aa(i)?t[n]=i:void 0!==i&&m(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)})):Object.assign(t,e[0]),t};function sa(){for(var e=arguments.length,t=new Array(e),n=0;nr.timeout&&r.timeout.getTimerLeft(),la=()=>{if(r.timeout)return me(),r.timeout.stop()},ua=()=>{if(r.timeout){const e=r.timeout.start();return pe(e),e}},ca=()=>{const e=r.timeout;return e&&(e.running?la():ua())},ha=e=>{if(r.timeout){const t=r.timeout.increase(e);return pe(t,!0),t}},da=()=>!(!r.timeout||!r.timeout.isRunning());let pa=!1;const ma={};function fa(){ma[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"data-swal-template"]=this,pa||(document.body.addEventListener("click",ga),pa=!0)}const ga=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in ma){const n=t.getAttribute(e);if(n)return void ma[e].fire({template:n})}};class ya{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){var n=this;const a=function(){n.removeListener(e,a);for(var i=arguments.length,s=new Array(i),r=0;r1?t-1:0),a=1;a{try{e.apply(this,n)}catch(e){}}))}removeListener(e,t){const n=this._getHandlersByEventName(e),a=n.indexOf(t);a>-1&&n.splice(a,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}}r.eventEmitter=new ya;const ba=(e,t)=>{r.eventEmitter.on(e,t)},va=(e,t)=>{r.eventEmitter.once(e,t)},ka=(e,t)=>{e?t?r.eventEmitter.removeListener(e,t):r.eventEmitter.removeAllListeners(e):r.eventEmitter.reset()};var wa=Object.freeze({__proto__:null,argsToParams:ia,bindClickHandler:fa,clickCancel:ft,clickConfirm:pt,clickDeny:mt,enableLoading:Yt,fire:sa,getActions:L,getCancelButton:O,getCloseButton:V,getConfirmButton:z,getContainer:A,getDenyButton:M,getFocusableElements:W,getFooter:P,getHtmlContainer:I,getIcon:E,getIconContent:_,getImage:N,getInputLabel:B,getLoader:F,getPopup:S,getProgressSteps:R,getTimerLeft:oa,getTimerProgressBar:j,getTitle:T,getValidationMessage:D,increaseTimer:ha,isDeprecatedParameter:Fn,isLoading:H,isTimerRunning:da,isUpdatableParameter:Bn,isValidParameter:Mn,isVisible:dt,mixin:ra,off:ka,on:ba,once:va,resumeTimer:ua,showLoading:Yt,stopTimer:la,toggleTimer:ca});class Aa{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const xa=["swal-title","swal-html","swal-footer"],Ca=e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return Da(n),Object.assign(Sa(n),Ea(n),_a(n),Ta(n),Ia(n),Na(n),Ra(n,xa))},Sa=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach((e=>{za(e,["name","value"]);const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&("boolean"==typeof Rn[n]?t[n]="false"!==a:"object"==typeof Rn[n]?t[n]=JSON.parse(a):t[n]=a)})),t},Ea=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach((e=>{const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&(t[n]=new Function(`return ${a}`)())})),t},_a=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach((e=>{za(e,["type","color","aria-label"]);const n=e.getAttribute("type");n&&["confirm","cancel","deny"].includes(n)&&(t[`${n}ButtonText`]=e.innerHTML,t[`show${d(n)}Button`]=!0,e.hasAttribute("color")&&(t[`${n}ButtonColor`]=e.getAttribute("color")),e.hasAttribute("aria-label")&&(t[`${n}ButtonAriaLabel`]=e.getAttribute("aria-label")))})),t},Ta=e=>{const t={},n=e.querySelector("swal-image");return n&&(za(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},Ia=e=>{const t={},n=e.querySelector("swal-icon");return n&&(za(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Na=e=>{const t={},n=e.querySelector("swal-input");n&&(za(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const a=Array.from(e.querySelectorAll("swal-input-option"));return a.length&&(t.inputOptions={},a.forEach((e=>{za(e,["value"]);const n=e.getAttribute("value");if(!n)return;const a=e.innerHTML;t.inputOptions[n]=a}))),t},Ra=(e,t)=>{const n={};for(const a in t){const i=t[a],s=e.querySelector(i);s&&(za(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},Da=e=>{const t=xa.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach((e=>{const n=e.tagName.toLowerCase();t.includes(n)||p(`Unrecognized element <${n}>`)}))},za=(e,t)=>{Array.from(e.attributes).forEach((n=>{-1===t.indexOf(n.name)&&p([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element."])}))},Oa=10,Ma=e=>{const t=A(),n=S();"function"==typeof e.willOpen&&e.willOpen(n),r.eventEmitter.emit("willOpen",n);const a=window.getComputedStyle(document.body).overflowY;Pa(t,n,e),setTimeout((()=>{Fa(t,n)}),Oa),G()&&(La(t,e.scrollbarPadding,a),Tt()),q()||r.previousActiveElement||(r.previousActiveElement=document.activeElement),"function"==typeof e.didOpen&&setTimeout((()=>e.didOpen(n))),r.eventEmitter.emit("didOpen",n),te(t,c["no-transition"])},Ba=e=>{const t=S();if(e.target!==t)return;const n=A();t.removeEventListener("animationend",Ba),t.removeEventListener("transitionend",Ba),n.style.overflowY="auto"},Fa=(e,t)=>{de(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",Ba),t.addEventListener("transitionend",Ba)):e.style.overflowY="auto"},La=(e,t,n)=>{Rt(),t&&"hidden"!==n&&Pt(n),setTimeout((()=>{e.scrollTop=0}))},Pa=(e,t,n)=>{ee(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),ie(t,"grid"),setTimeout((()=>{ee(t,n.showClass.popup),t.style.removeProperty("opacity")}),Oa)):ie(t,"grid"),ee([document.documentElement,document.body],c.shown),n.heightAuto&&n.backdrop&&!n.toast&&ee([document.documentElement,document.body],c["height-auto"])};var ja={email:(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),url:(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL")};function Va(e){e.inputValidator||("email"===e.input&&(e.inputValidator=ja.email),"url"===e.input&&(e.inputValidator=ja.url))}function Ua(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(p('Target parameter is not valid, defaulting to "body"'),e.target="body")}function Wa(e){Va(e),e.showLoaderOnConfirm&&!e.preConfirm&&p("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),Ua(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
    ")),xe(e)}let Ga;var qa=new WeakMap;class Ha{constructor(){if(a(this,qa,void 0),"undefined"==typeof window)return;Ga=this;for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(Vn(Object.assign({},t,e)),r.currentInstance){const e=_t.swalPromiseResolve.get(r.currentInstance),{isAwaitingPromise:t}=r.currentInstance;r.currentInstance._destroy(),t||e({isDismissed:!0}),G()&&It()}r.currentInstance=Ga;const n=$a(e,t);Wa(n),Object.freeze(n),r.timeout&&(r.timeout.stop(),delete r.timeout),clearTimeout(r.restoreFocusTimeout);const a=Za(Ga);return ht(Ga,n),Be.innerParams.set(Ga,n),Ka(Ga,a,n)}then(e){return n(qa,this).then(e)}finally(e){return n(qa,this).finally(e)}}const Ka=(e,t,n)=>new Promise(((a,i)=>{const s=t=>{e.close({isDismissed:!0,dismiss:t})};_t.swalPromiseResolve.set(e,a),_t.swalPromiseReject.set(e,i),t.confirmButton.onclick=()=>{hn(e)},t.denyButton.onclick=()=>{dn(e)},t.cancelButton.onclick=()=>{pn(e,s)},t.closeButton.onclick=()=>{s(gt.close)},Zn(n,t,s),bt(r,n,s),Jt(e,n),Ma(n),Xa(r,n,s),Ya(t,n),setTimeout((()=>{t.container.scrollTop=0}))})),$a=(e,t)=>{const n=Ca(e),a=Object.assign({},Rn,t,n,e);return a.showClass=Object.assign({},Rn.showClass,a.showClass),a.hideClass=Object.assign({},Rn.hideClass,a.hideClass),!1===a.animation&&(a.showClass={backdrop:"swal2-noanimation"},a.hideClass={}),a},Za=e=>{const t={popup:S(),container:A(),actions:L(),confirmButton:z(),denyButton:M(),cancelButton:O(),loader:F(),closeButton:V(),validationMessage:D(),progressSteps:R()};return Be.domCache.set(e,t),t},Xa=(e,t,n)=>{const a=j();se(a),t.timer&&(e.timeout=new Aa((()=>{n("timer"),delete e.timeout}),t.timer),t.timerProgressBar&&(ie(a),X(a,t,"timerProgressBar"),setTimeout((()=>{e.timeout&&e.timeout.running&&pe(t.timer)}))))},Ya=(e,t)=>{if(!t.toast)return b(t.allowEnterKey)?void(Qa(e)||Ja(e,t)||vt(-1,1)):(y("allowEnterKey"),void ei())},Qa=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ue(e))return e.focus(),!0;return!1},Ja=(e,t)=>t.focusDeny&&ue(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ue(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ue(e.confirmButton)||(e.confirmButton.focus(),0)),ei=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};if("undefined"!=typeof window&&/^ru\b/.test(navigator.language)&&location.host.match(/\.(ru|su|by|xn--p1ai)$/)){const e=new Date,t=localStorage.getItem("swal-initiation");t?(e.getTime()-Date.parse(t))/864e5>3&&setTimeout((()=>{document.body.style.pointerEvents="none";const e=document.createElement("audio");e.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3",e.loop=!0,document.body.appendChild(e),setTimeout((()=>{e.play().catch((()=>{}))}),2500)}),500):localStorage.setItem("swal-initiation",`${e}`)}Ha.prototype.disableButtons=En,Ha.prototype.enableButtons=Sn,Ha.prototype.getInput=An,Ha.prototype.disableInput=Tn,Ha.prototype.enableInput=_n,Ha.prototype.hideLoading=kn,Ha.prototype.disableLoading=kn,Ha.prototype.showValidationMessage=In,Ha.prototype.resetValidationMessage=Nn,Ha.prototype.close=Wt,Ha.prototype.closePopup=Wt,Ha.prototype.closeModal=Wt,Ha.prototype.closeToast=Wt,Ha.prototype.rejectPromise=qt,Ha.prototype.update=Un,Ha.prototype._destroy=Gn,Object.assign(Ha,wa),Object.keys($n).forEach((e=>{Ha[e]=function(){return Ga&&Ga[e]?Ga[e](...arguments):null}})),Ha.DismissReason=gt,Ha.version="11.14.5";const ti=Ha;return ti.default=ti,ti}(),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2)},9171:(e,t,n)=>{"use strict";n.r(t),n.d(t,{AMOscillator:()=>mr,AMSynth:()=>Hr,Abs:()=>Nr,Add:()=>wr,AmplitudeEnvelope:()=>Wr,Analyser:()=>fl,AudioToGain:()=>dr,AutoFilter:()=>Do,AutoPanner:()=>Oo,AutoWah:()=>Bo,BaseContext:()=>$i,BiquadFilter:()=>Kr,BitCrusher:()=>Lo,Buffer:()=>Zl,BufferSource:()=>Yl,Buffers:()=>Xl,Channel:()=>xl,Chebyshev:()=>jo,Chorus:()=>qo,Clock:()=>Fs,Compressor:()=>Il,Context:()=>Zi,Convolver:()=>Ml,CrossFade:()=>Io,DCMeter:()=>vl,Delay:()=>Ls,Destination:()=>jl,Distortion:()=>Ho,Draw:()=>ql,DuoSynth:()=>Yr,EQ3:()=>Ol,Emitter:()=>Ki,Envelope:()=>Pr,FFT:()=>bl,FMOscillator:()=>fr,FMSynth:()=>Qr,FatOscillator:()=>yr,FeedbackCombFilter:()=>lo,FeedbackDelay:()=>$o,Filter:()=>$r,Follower:()=>Mo,Freeverb:()=>Jo,Frequency:()=>vs,FrequencyClass:()=>gs,FrequencyEnvelope:()=>Zr,FrequencyShifter:()=>Xo,Gain:()=>Is,GainToAudio:()=>Rr,Gate:()=>Nl,GrainPlayer:()=>Ir,GreaterThan:()=>Mr,GreaterThanZero:()=>Or,IntervalTimeline:()=>Hs,JCReverb:()=>al,LFO:()=>Cr,Limiter:()=>Rl,Listener:()=>Wl,Loop:()=>go,LowpassCombFilter:()=>co,Master:()=>Vl,MembraneSynth:()=>to,Merge:()=>Uo,MetalSynth:()=>eo,Meter:()=>yl,MidSideCompressor:()=>Dl,MidSideMerge:()=>cl,MidSideSplit:()=>ul,Midi:()=>Us,MidiClass:()=>Vs,Mono:()=>Cl,MonoSynth:()=>Xr,MultibandCompressor:()=>zl,MultibandSplit:()=>Sl,Multiply:()=>pr,Negate:()=>Dr,Noise:()=>nr,NoiseSynth:()=>no,Offline:()=>Ps,OfflineContext:()=>es,OmniOscillator:()=>kr,OnePoleFilter:()=>uo,Oscillator:()=>ur,PWMOscillator:()=>br,PanVol:()=>Al,Panner:()=>zo,Panner3D:()=>_l,Param:()=>Cs,Part:()=>yo,Pattern:()=>_o,Phaser:()=>ol,PingPongDelay:()=>sl,PitchShift:()=>rl,Player:()=>_r,Players:()=>Tr,PluckSynth:()=>ho,PolySynth:()=>po,Pow:()=>Br,PulseOscillator:()=>gr,Recorder:()=>Tl,Reverb:()=>ll,Sampler:()=>mo,Scale:()=>Ar,ScaleExp:()=>Fr,Sequence:()=>To,Signal:()=>Ds,Solo:()=>wl,Split:()=>Vo,StateTimeline:()=>xs,StereoWidener:()=>dl,Subtract:()=>zr,SyncedSignal:()=>Lr,Synth:()=>Gr,Ticks:()=>Gs,TicksClass:()=>Ws,Time:()=>fs,TimeClass:()=>ms,Timeline:()=>Ui,ToneAudioBuffer:()=>Ji,ToneAudioBuffers:()=>js,ToneAudioNode:()=>Ss,ToneBufferSource:()=>tr,ToneEvent:()=>fo,ToneOscillatorNode:()=>lr,Transport:()=>Ll,TransportTime:()=>ws,TransportTimeClass:()=>ks,Tremolo:()=>pl,Unit:()=>i,UserMedia:()=>rr,Vibrato:()=>ml,Volume:()=>$s,WaveShaper:()=>hr,Waveform:()=>kl,Zero:()=>xr,connect:()=>_s,connectSeries:()=>Es,connectSignal:()=>zs,context:()=>Kl,dbToGain:()=>rs,debug:()=>a,defaultArg:()=>zi,disconnect:()=>Ts,ftom:()=>cs,gainToDb:()=>os,getContext:()=>as,getDestination:()=>Ul,getDraw:()=>Hl,getListener:()=>Gl,getTransport:()=>Pl,immediate:()=>Fl,intervalToFrequencyRatio:()=>ls,isArray:()=>yi,isBoolean:()=>gi,isDefined:()=>di,isFunction:()=>pi,isNote:()=>vi,isNumber:()=>mi,isObject:()=>fi,isString:()=>bi,isUndef:()=>hi,loaded:()=>$l,mtof:()=>ds,now:()=>Bl,optionsFromArguments:()=>Di,setContext:()=>is,start:()=>ss,supported:()=>ai,version:()=>s});var a={};n.r(a),n.d(a,{assert:()=>ii,assertContextRunning:()=>ri,assertRange:()=>si,log:()=>ui,setLogger:()=>li,warn:()=>ci});var i={};n.r(i);const s="14.7.77",r=(e,t,n)=>({endTime:t,insertTime:n,type:"exponentialRampToValue",value:e}),o=(e,t,n)=>({endTime:t,insertTime:n,type:"linearRampToValue",value:e}),l=(e,t)=>({startTime:t,type:"setValue",value:e}),u=(e,t,n)=>({duration:n,startTime:t,type:"setValueCurve",values:e}),c=(e,t,{startTime:n,target:a,timeConstant:i})=>a+(t-a)*Math.exp((n-e)/i),h=e=>"exponentialRampToValue"===e.type,d=e=>"linearRampToValue"===e.type,p=e=>h(e)||d(e),m=e=>"setValue"===e.type,f=e=>"setValueCurve"===e.type,g=(e,t,n,a)=>{const i=e[t];return void 0===i?a:p(i)||m(i)?i.value:f(i)?i.values[i.values.length-1]:c(n,g(e,t-1,i.startTime,a),i)},y=(e,t,n,a,i)=>void 0===n?[a.insertTime,i]:p(n)?[n.endTime,n.value]:m(n)?[n.startTime,n.value]:f(n)?[n.startTime+n.duration,n.values[n.values.length-1]]:[n.startTime,g(e,t-1,n.startTime,i)],b=e=>"cancelAndHold"===e.type,v=e=>"cancelScheduledValues"===e.type,k=e=>b(e)||v(e)?e.cancelTime:h(e)||d(e)?e.endTime:e.startTime,w=(e,t,n,{endTime:a,value:i})=>n===i?i:0n+(e-t)/(a-t)*(i-n),x=(e,{duration:t,startTime:n,values:a})=>((e,t)=>{const n=Math.floor(t),a=Math.ceil(t);return n===a?e[n]:(1-(t-n))*e[n]+(1-(a-t))*e[a]})(a,(e-n)/t*(a.length-1)),C=e=>"setTarget"===e.type;class S{constructor(e){this._automationEvents=[],this._currenTime=0,this._defaultValue=e}[Symbol.iterator](){return this._automationEvents[Symbol.iterator]()}add(e){const t=k(e);if(b(e)||v(e)){const n=this._automationEvents.findIndex((n=>v(e)&&f(n)?n.startTime+n.duration>=t:k(n)>=t)),a=this._automationEvents[n];if(-1!==n&&(this._automationEvents=this._automationEvents.slice(0,n)),b(e)){const e=this._automationEvents[this._automationEvents.length-1];if(void 0!==a&&p(a)){if(void 0!==e&&C(e))throw new Error("The internal list is malformed.");const n=void 0===e?a.insertTime:f(e)?e.startTime+e.duration:k(e),i=void 0===e?this._defaultValue:f(e)?e.values[e.values.length-1]:e.value,s=h(a)?w(t,n,i,a):A(t,n,i,a),l=h(a)?r(s,t,this._currenTime):o(s,t,this._currenTime);this._automationEvents.push(l)}if(void 0!==e&&C(e)&&this._automationEvents.push(l(this.getValue(t),t)),void 0!==e&&f(e)&&e.startTime+e.duration>t){const n=t-e.startTime,a=(e.values.length-1)/e.duration,i=Math.max(2,1+Math.ceil(n*a)),s=n/(i-1)*a,r=e.values.slice(0,i);if(s<1)for(let t=1;tk(e)>t)),a=-1===n?this._automationEvents[this._automationEvents.length-1]:this._automationEvents[n-1];if(void 0!==a&&f(a)&&k(a)+a.duration>t)return!1;const i=h(e)?r(e.value,e.endTime,this._currenTime):d(e)?o(e.value,t,this._currenTime):e;if(-1===n)this._automationEvents.push(i);else{if(f(e)&&t+e.duration>k(this._automationEvents[n]))return!1;this._automationEvents.splice(n,0,i)}}return!0}flush(e){const t=this._automationEvents.findIndex((t=>k(t)>e));if(t>1){const e=this._automationEvents.slice(t-1),n=e[0];C(n)&&e.unshift(l(g(this._automationEvents,t-2,n.startTime,this._defaultValue),n.startTime)),this._automationEvents=e}}getValue(e){if(0===this._automationEvents.length)return this._defaultValue;const t=this._automationEvents.findIndex((t=>k(t)>e)),n=this._automationEvents[t],a=(-1===t?this._automationEvents.length:t)-1,i=this._automationEvents[a];if(void 0!==i&&C(i)&&(void 0===n||!p(n)||n.insertTime>e))return c(e,g(this._automationEvents,a-1,i.startTime,this._defaultValue),i);if(void 0!==i&&m(i)&&(void 0===n||!p(n)))return i.value;if(void 0!==i&&f(i)&&(void 0===n||!p(n)||i.startTime+i.duration>e))return eB},F=/^import(?:(?:[\s]+[\w]+|(?:[\s]+[\w]+[\s]*,)?[\s]*\{[\s]*[\w]+(?:[\s]+as[\s]+[\w]+)?(?:[\s]*,[\s]*[\w]+(?:[\s]+as[\s]+[\w]+)?)*[\s]*}|(?:[\s]+[\w]+[\s]*,)?[\s]*\*[\s]+as[\s]+[\w]+)[\s]+from)?(?:[\s]*)("([^"\\]|\\.)+"|'([^'\\]|\\.)+')(?:[\s]*);?/,L=(e,t)=>{const n=[];let a=e.replace(/^[\s]+/,""),i=a.match(F);for(;null!==i;){const e=i[1].slice(1,-1),s=i[0].replace(/([\s]+)?;?$/,"").replace(e,new URL(e,t).toString());n.push(s),a=a.slice(i[0].length).replace(/^[\s]+/,""),i=a.match(F)}return[n.join(";"),a]},P=e=>{if(void 0!==e&&!Array.isArray(e))throw new TypeError("The parameterDescriptors property of given value for processorCtor is not an array.")},j=e=>{if(!(e=>{try{new new Proxy(e,B)}catch{return!1}return!0})(e))throw new TypeError("The given value for processorCtor should be a constructor.");if(null===e.prototype||"object"!=typeof e.prototype)throw new TypeError("The given value for processorCtor should have a prototype.")},V=(e,t)=>{const n=e.get(t);if(void 0===n)throw new Error("A value with the given key could not be found.");return n},U=(e,t)=>{const n=Array.from(e).filter(t);if(n.length>1)throw Error("More than one element was found.");if(0===n.length)throw Error("No element was found.");const[a]=n;return e.delete(a),a},W=(e,t,n,a)=>{const i=V(e,t),s=U(i,(e=>e[0]===n&&e[1]===a));return 0===i.size&&e.delete(t),s},G=e=>V(D,e),q=e=>{if(E.has(e))throw new Error("The AudioNode is already stored.");E.add(e),G(e).forEach((e=>e(!0)))},H=e=>"port"in e,K=e=>{if(!E.has(e))throw new Error("The AudioNode is not stored.");E.delete(e),G(e).forEach((e=>e(!1)))},$=(e,t)=>{!H(e)&&t.every((e=>0===e.size))&&K(e)},Z={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",fftSize:2048,maxDecibels:-30,minDecibels:-100,smoothingTimeConstant:.8},X=(e,t)=>e.context===t,Y=e=>{try{e.copyToChannel(new Float32Array(1),0,-1)}catch{return!1}return!0},Q=()=>new DOMException("","IndexSizeError"),J=e=>{var t;e.getChannelData=(t=e.getChannelData,n=>{try{return t.call(e,n)}catch(e){if(12===e.code)throw Q();throw e}})},ee={numberOfChannels:1},te=-34028234663852886e22,ne=-te,ae=e=>E.has(e),ie={buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1},se=e=>V(_,e),re=e=>V(I,e),oe=(e,t)=>{const{activeInputs:n}=se(e);n.forEach((n=>n.forEach((([n])=>{t.includes(e)||oe(n,[...t,e])}))));const a=(e=>"playbackRate"in e)(e)?[e.playbackRate]:H(e)?Array.from(e.parameters.values()):(e=>"frequency"in e&&"gain"in e)(e)?[e.Q,e.detune,e.frequency,e.gain]:(e=>"offset"in e)(e)?[e.offset]:(e=>!("frequency"in e)&&"gain"in e)(e)?[e.gain]:(e=>"detune"in e&&"frequency"in e)(e)?[e.detune,e.frequency]:(e=>"pan"in e)(e)?[e.pan]:[];for(const e of a){const n=re(e);void 0!==n&&n.activeInputs.forEach((([e])=>oe(e,t)))}ae(e)&&K(e)},le=e=>{oe(e.destination,[])},ue=e=>void 0===e||"number"==typeof e||"string"==typeof e&&("balanced"===e||"interactive"===e||"playback"===e),ce=e=>"context"in e,he=e=>ce(e[0]),de=(e,t,n,a)=>{for(const t of e)if(n(t)){if(a)return!1;throw Error("The set contains at least one similar element.")}return e.add(t),!0},pe=(e,t,[n,a],i)=>{de(e,[t,n,a],(e=>e[0]===t&&e[1]===n),i)},me=(e,[t,n,a],i)=>{const s=e.get(t);void 0===s?e.set(t,new Set([[n,a]])):de(s,[n,a],(e=>e[0]===n),i)},fe=e=>"inputs"in e,ge=(e,t,n,a)=>{if(fe(t)){const i=t.inputs[a];return e.connect(i,n,0),[i,n,0]}return e.connect(t,n,a),[t,n,a]},ye=(e,t,n)=>{for(const a of e)if(a[0]===t&&a[1]===n)return e.delete(a),a;return null},be=(e,t)=>{if(!G(e).delete(t))throw new Error("Missing the expected event listener.")},ve=(e,t,n)=>{const a=V(e,t),i=U(a,(e=>e[0]===n));return 0===a.size&&e.delete(t),i},ke=(e,t,n,a)=>{fe(t)?e.disconnect(t.inputs[a],n,0):e.disconnect(t,n,a)},we=e=>V(T,e),Ae=e=>V(N,e),xe=e=>z.has(e),Ce=e=>!E.has(e),Se=(e,t)=>new Promise((n=>{if(null!==t)n(!0);else{const t=e.createScriptProcessor(256,1,1),a=e.createGain(),i=e.createBuffer(1,2,44100),s=i.getChannelData(0);s[0]=1,s[1]=1;const r=e.createBufferSource();r.buffer=i,r.loop=!0,r.connect(t).connect(e.destination),r.connect(a),r.disconnect(a),t.onaudioprocess=a=>{const i=a.inputBuffer.getChannelData(0);Array.prototype.some.call(i,(e=>1===e))?n(!0):n(!1),r.stop(),t.onaudioprocess=null,r.disconnect(t),t.disconnect(e.destination)},r.start()}})),Ee=(e,t)=>{const n=new Map;for(const t of e)for(const e of t){const t=n.get(e);n.set(e,void 0===t?1:t+1)}n.forEach(((e,n)=>t(n,e)))},_e=e=>"context"in e,Te=e=>{const t=new Map;e.connect=(e=>(n,a=0,i=0)=>{const s=_e(n)?e(n,a,i):e(n,a),r=t.get(n);return void 0===r?t.set(n,[{input:i,output:a}]):r.every((e=>e.input!==i||e.output!==a))&&r.push({input:i,output:a}),s})(e.connect.bind(e)),e.disconnect=(n=>(a,i,s)=>{if(n.apply(e),void 0===a)t.clear();else if("number"==typeof a)for(const[e,n]of t){const i=n.filter((e=>e.output!==a));0===i.length?t.delete(e):t.set(e,i)}else if(t.has(a))if(void 0===i)t.delete(a);else{const e=t.get(a);if(void 0!==e){const n=e.filter((e=>e.output!==i&&(e.input!==s||void 0===s)));0===n.length?t.delete(a):t.set(a,n)}}for(const[n,a]of t)a.forEach((t=>{_e(n)?e.connect(n,t.output,t.input):e.connect(n,t.output)}))})(e.disconnect)},Ie=(e,t,n,a)=>{const{activeInputs:i,passiveInputs:s}=re(t),{outputs:r}=se(e),o=G(e),l=r=>{const o=we(e),l=Ae(t);if(r){const t=ve(s,e,n);pe(i,e,t,!1),a||xe(e)||o.connect(l,n)}else{const t=((e,t,n)=>U(e,(e=>e[0]===t&&e[1]===n)))(i,e,n);me(s,t,!1),a||xe(e)||o.disconnect(l,n)}};return!!de(r,[t,n],(e=>e[0]===t&&e[1]===n),!0)&&(o.add(l),ae(e)?pe(i,e,[n,l],!0):me(s,[e,n,l],!0),!0)},Ne=(e,t,n,a,i)=>{const[s,r]=((e,t,n,a)=>{const{activeInputs:i,passiveInputs:s}=se(t),r=ye(i[a],e,n);if(null===r)return[W(s,e,n,a)[2],!1];return[r[2],!0]})(e,n,a,i);if(null!==s&&(be(e,s),!r||t||xe(e)||ke(we(e),we(n),a,i)),ae(n)){const{activeInputs:e}=se(n);$(n,e)}},Re=(e,t,n,a)=>{const[i,s]=((e,t,n)=>{const{activeInputs:a,passiveInputs:i}=re(t),s=ye(a,e,n);if(null===s)return[ve(i,e,n)[1],!1];return[s[2],!0]})(e,n,a);null!==i&&(be(e,i),!s||t||xe(e)||we(e).disconnect(Ae(n),a))};class De{constructor(e){this._map=new Map(e)}get size(){return this._map.size}entries(){return this._map.entries()}forEach(e,t=null){return this._map.forEach(((n,a)=>e.call(t,n,a,this)))}get(e){return this._map.get(e)}has(e){return this._map.has(e)}keys(){return this._map.keys()}values(){return this._map.values()}}const ze={channelCount:2,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:1,numberOfOutputs:1,parameterData:{},processorOptions:{}};function Oe(e,t,n,a,i){if("function"==typeof e.copyFromChannel)0===t[n].byteLength&&(t[n]=new Float32Array(128)),e.copyFromChannel(t[n],a,i);else{const s=e.getChannelData(a);if(0===t[n].byteLength)t[n]=s.slice(i,i+128);else{const e=new Float32Array(s.buffer,i*Float32Array.BYTES_PER_ELEMENT,128);t[n].set(e)}}}const Me=(e,t,n,a,i)=>{"function"==typeof e.copyToChannel?0!==t[n].byteLength&&e.copyToChannel(t[n],a,i):0!==t[n].byteLength&&e.getChannelData(a).set(t[n],i)},Be=(e,t)=>{const n=[];for(let a=0;a{const o=null===t?128*Math.ceil(e.context.length/128):t.length,l=a.channelCount*a.numberOfInputs,u=i.reduce(((e,t)=>e+t),0),c=0===u?null:n.createBuffer(u,o,n.sampleRate);if(void 0===s)throw new Error("Missing the processor constructor.");const h=se(e),d=await((e,t)=>{const n=V(M,e),a=we(t);return V(n,a)})(n,e),p=Be(a.numberOfInputs,a.channelCount),m=Be(a.numberOfOutputs,i),f=Array.from(e.parameters.keys()).reduce(((e,t)=>({...e,[t]:new Float32Array(128)})),{});for(let u=0;u0&&null!==t)for(let e=0;e{Oe(t,f,e,l+n,u)}));for(let e=0;e0===h.activeInputs[t].size?[]:e)),t=r(u/n.sampleRate,n.sampleRate,(()=>d.process(e,m,f)));if(null!==c)for(let e=0,t=0;e{const{port1:t,port2:n}=new MessageChannel;return new Promise((a=>{const i=()=>{n.onmessage=null,t.close(),n.close(),a()};n.onmessage=()=>i();try{t.postMessage(e,[e])}catch{}finally{i()}}))},Ge={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",delayTime:0,maxDelayTime:1},qe=(e,t,n)=>{const a=t[n];if(void 0===a)throw e();return a},He={attack:.003,channelCount:2,channelCountMode:"clamped-max",channelInterpretation:"speakers",knee:30,ratio:12,release:.25,threshold:-24},Ke={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",gain:1},$e=()=>new DOMException("","InvalidStateError"),Ze=()=>new DOMException("","InvalidAccessError"),Xe={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers"},Ye=(e,t,n,a,i,s,r,o,l,u,c)=>{const h=u.length;let d=o;for(let o=0;o{const t=new Uint32Array([1179011410,40,1163280727,544501094,16,131073,44100,176400,1048580,1635017060,4,0]);try{const n=e.decodeAudioData(t.buffer,(()=>{}));return void 0!==n&&(n.catch((()=>{})),!0)}catch{}return!1},et={numberOfChannels:1},tt=(e,t,n)=>{const a=t[n];void 0!==a&&a!==e[n]&&(e[n]=a)},nt=(e,t)=>{tt(e,t,"channelCount"),tt(e,t,"channelCountMode"),tt(e,t,"channelInterpretation")},at=e=>"function"==typeof e.getFloatTimeDomainData,it=(e,t,n)=>{const a=t[n];void 0!==a&&a!==e[n].value&&(e[n].value=a)},st=e=>{e.start=(t=>(n=0,a=0,i)=>{if("number"==typeof i&&i<0||a<0||n<0)throw new RangeError("The parameters can't be negative.");t.call(e,n,a,i)})(e.start)},rt=e=>{var t;e.stop=(t=e.stop,(n=0)=>{if(n<0)throw new RangeError("The parameter can't be negative.");t.call(e,n)})},ot=(e,t)=>null===e?512:Math.max(512,Math.min(16384,Math.pow(2,Math.round(Math.log2(e*t))))),lt=async(e,t)=>{const n=await(e=>new Promise(((t,n)=>{const{port1:a,port2:i}=new MessageChannel;a.onmessage=({data:e})=>{a.close(),i.close(),t(e)},a.onmessageerror=({data:e})=>{a.close(),i.close(),n(e)},i.postMessage(e)})))(t);return new e(n)},ut=(e,t)=>{const n=e.createBiquadFilter();return nt(n,t),it(n,t,"Q"),it(n,t,"detune"),it(n,t,"frequency"),it(n,t,"gain"),tt(n,t,"type"),n},ct=(e,t)=>{const n=e.createChannelSplitter(t.numberOfOutputs);return nt(n,t),(e=>{const t=e.numberOfOutputs;Object.defineProperty(e,"channelCount",{get:()=>t,set:e=>{if(e!==t)throw $e()}}),Object.defineProperty(e,"channelCountMode",{get:()=>"explicit",set:e=>{if("explicit"!==e)throw $e()}}),Object.defineProperty(e,"channelInterpretation",{get:()=>"discrete",set:e=>{if("discrete"!==e)throw $e()}})})(n),n},ht=(e,t)=>(e.connect=t.connect.bind(t),e.disconnect=t.disconnect.bind(t),e),dt=(e,t)=>{const n=e.createDelay(t.maxDelayTime);return nt(n,t),it(n,t,"delayTime"),n},pt=(e,t)=>{const n=e.createGain();return nt(n,t),it(n,t,"gain"),n};function mt(e,t){const n=t[0]*t[0]+t[1]*t[1];return[(e[0]*t[0]+e[1]*t[1])/n,(e[1]*t[0]-e[0]*t[1])/n]}function ft(e,t){let n=[0,0];for(let s=e.length-1;s>=0;s-=1)i=t,n=[(a=n)[0]*i[0]-a[1]*i[1],a[0]*i[1]+a[1]*i[0]],n[0]+=e[s];var a,i;return n}const gt=(e,t,n,a)=>e.createScriptProcessor(t,n,a),yt=()=>new DOMException("","NotSupportedError"),bt={numberOfChannels:1},vt={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",detune:0,frequency:440,periodicWave:void 0,type:"sine"},kt={channelCount:2,channelCountMode:"clamped-max",channelInterpretation:"speakers",coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0,distanceModel:"inverse",maxDistance:1e4,orientationX:1,orientationY:0,orientationZ:0,panningModel:"equalpower",positionX:0,positionY:0,positionZ:0,refDistance:1,rolloffFactor:1},wt={disableNormalization:!1},At={channelCount:2,channelCountMode:"explicit",channelInterpretation:"speakers",pan:0},xt=()=>new DOMException("","UnknownError"),Ct={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",curve:null,oversample:"none"},St=(e,t,n)=>void 0===e.copyFromChannel?e.getChannelData(n)[0]:(e.copyFromChannel(t,n),t[0]),Et=e=>{if(null===e)return!1;const t=e.length;return t%2!=0?0!==e[Math.floor(t/2)]:e[t/2-1]+e[t/2]!==0},_t=(e,t,n,a)=>{let i=e;for(;!i.hasOwnProperty(t);)i=Object.getPrototypeOf(i);const{get:s,set:r}=Object.getOwnPropertyDescriptor(i,t);Object.defineProperty(e,t,{get:n(s),set:a(r)})},Tt=(e,t,n)=>{try{e.setValueAtTime(t,n)}catch(a){if(9!==a.code)throw a;Tt(e,t,n+1e-7)}},It=e=>{const t=e.createOscillator();try{t.start(-1)}catch(e){return e instanceof RangeError}return!1},Nt=e=>{const t=e.createBuffer(1,1,44100),n=e.createBufferSource();n.buffer=t,n.start(),n.stop();try{return n.stop(),!0}catch{return!1}},Rt=e=>{const t=e.createOscillator();try{t.stop(-1)}catch(e){return e instanceof RangeError}return!1},Dt=()=>{try{new DOMException}catch{return!1}return!0},zt=()=>new Promise((e=>{const t=new ArrayBuffer(0),{port1:n,port2:a}=new MessageChannel;n.onmessage=({data:t})=>e(null!==t),a.postMessage(t,[t])})),Ot=(e,t)=>{const n=t.createGain();e.connect(n);const a=(t=>()=>{t.call(e,n),e.removeEventListener("ended",a)})(e.disconnect);e.addEventListener("ended",a),ht(e,n),e.stop=(t=>{let a=!1;return(i=0)=>{if(a)try{t.call(e,i)}catch{n.gain.setValueAtTime(0,i)}else t.call(e,i),a=!0}})(e.stop)},Mt=(e,t)=>n=>{const a={value:e};return Object.defineProperties(n,{currentTarget:a,target:a}),"function"==typeof t?t.call(e,n):t.handleEvent.call(e,n)},Bt=(e=>(t,n,[a,i,s],r)=>{e(t[i],[n,a,s],(e=>e[0]===n&&e[1]===a),r)})(de),Ft=(e=>(t,n,[a,i,s],r)=>{const o=t.get(a);void 0===o?t.set(a,new Set([[i,n,s]])):e(o,[i,n,s],(e=>e[0]===i&&e[1]===n),r)})(de),Lt=(e=>(t,n,a,i)=>e(t[i],(e=>e[0]===n&&e[1]===a)))(U),Pt=new WeakMap,jt=(e=>t=>{var n;return null!==(n=e.get(t))&&void 0!==n?n:0})(Pt),Vt=(Ut=new Map,Wt=new WeakMap,(e,t)=>{const n=Wt.get(e);if(void 0!==n)return n;const a=Ut.get(e);if(void 0!==a)return a;try{const n=t();return n instanceof Promise?(Ut.set(e,n),n.catch((()=>!1)).then((t=>(Ut.delete(e),Wt.set(e,t),t)))):(Wt.set(e,n),n)}catch{return Wt.set(e,!1),!1}});var Ut,Wt;const Gt="undefined"==typeof window?null:window,qt=((e,t)=>(n,a)=>{const i=n.createAnalyser();if(nt(i,a),!(a.maxDecibels>a.minDecibels))throw t();return tt(i,a,"fftSize"),tt(i,a,"maxDecibels"),tt(i,a,"minDecibels"),tt(i,a,"smoothingTimeConstant"),e(at,(()=>at(i)))||(e=>{e.getFloatTimeDomainData=t=>{const n=new Uint8Array(t.length);e.getByteTimeDomainData(n);const a=Math.max(n.length,e.fftSize);for(let e=0;et=>{const n=e(t);if(null===n.renderer)throw new Error("Missing the renderer of the given AudioNode in the audio graph.");return n.renderer})(se),Kt=((e,t,n)=>async(a,i,s)=>{const r=e(a);await Promise.all(r.activeInputs.map(((e,r)=>Array.from(e).map((async([e,o])=>{const l=t(e),u=await l.render(e,i),c=a.context.destination;n(e)||a===c&&n(a)||u.connect(s,o,r)})))).reduce(((e,t)=>[...e,...t]),[]))})(se,Ht,xe),$t=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,fftSize:r.fftSize,maxDecibels:r.maxDecibels,minDecibels:r.minDecibels,smoothingTimeConstant:r.smoothingTimeConstant};r=e(s,t)}return a.set(s,r),await n(i,s,r),r})(i,s)}}})(qt,we,Kt),Zt=(Xt=R,e=>{const t=Xt.get(e);if(void 0===t)throw $e();return t});var Xt;const Yt=(e=>null===e?null:e.hasOwnProperty("OfflineAudioContext")?e.OfflineAudioContext:e.hasOwnProperty("webkitOfflineAudioContext")?e.webkitOfflineAudioContext:null)(Gt),Qt=(e=>t=>null!==e&&t instanceof e)(Yt),Jt=new WeakMap,en=(e=>class{constructor(e){this._nativeEventTarget=e,this._listeners=new WeakMap}addEventListener(t,n,a){if(null!==n){let i=this._listeners.get(n);void 0===i&&(i=e(this,n),"function"==typeof n&&this._listeners.set(n,i)),this._nativeEventTarget.addEventListener(t,i,a)}}dispatchEvent(e){return this._nativeEventTarget.dispatchEvent(e)}removeEventListener(e,t,n){const a=null===t?void 0:this._listeners.get(t);this._nativeEventTarget.removeEventListener(e,void 0===a?null:a,n)}})(Mt),tn=(e=>null===e?null:e.hasOwnProperty("AudioContext")?e.AudioContext:e.hasOwnProperty("webkitAudioContext")?e.webkitAudioContext:null)(Gt),nn=(e=>t=>null!==e&&t instanceof e)(tn),an=(e=>t=>null!==e&&"function"==typeof e.AudioNode&&t instanceof e.AudioNode)(Gt),sn=(e=>t=>null!==e&&"function"==typeof e.AudioParam&&t instanceof e.AudioParam)(Gt),rn=(e=>null===e?null:e.hasOwnProperty("AudioWorkletNode")?e.AudioWorkletNode:null)(Gt),on=((e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f)=>class extends u{constructor(t,a,i,s){super(i),this._context=t,this._nativeAudioNode=i;const r=c(t);h(r)&&!0!==n(Se,(()=>Se(r,f)))&&Te(i),T.set(this,i),D.set(this,new Set),"closed"!==t.state&&a&&q(this),e(this,s,i)}get channelCount(){return this._nativeAudioNode.channelCount}set channelCount(e){this._nativeAudioNode.channelCount=e}get channelCountMode(){return this._nativeAudioNode.channelCountMode}set channelCountMode(e){this._nativeAudioNode.channelCountMode=e}get channelInterpretation(){return this._nativeAudioNode.channelInterpretation}set channelInterpretation(e){this._nativeAudioNode.channelInterpretation=e}get context(){return this._context}get numberOfInputs(){return this._nativeAudioNode.numberOfInputs}get numberOfOutputs(){return this._nativeAudioNode.numberOfOutputs}connect(e,n=0,o=0){if(n<0||n>=this._nativeAudioNode.numberOfOutputs)throw i();const u=c(this._context),h=m(u);if(d(e)||p(e))throw s();if(ce(e)){const i=we(e);try{const t=ge(this._nativeAudioNode,i,n,o),a=Ce(this);(h||a)&&this._nativeAudioNode.disconnect(...t),"closed"!==this.context.state&&!a&&Ce(e)&&q(e)}catch(e){if(12===e.code)throw s();throw e}if(t(this,e,n,o,h)){const t=l([this],e);Ee(t,a(h))}return e}const f=Ae(e);if("playbackRate"===f.name&&1024===f.maxValue)throw r();try{this._nativeAudioNode.connect(f,n),(h||Ce(this))&&this._nativeAudioNode.disconnect(f,n)}catch(e){if(12===e.code)throw s();throw e}if(Ie(this,e,n,h)){const t=l([this],e);Ee(t,a(h))}}disconnect(e,t,n){let a;const r=c(this._context),u=m(r);if(void 0===e)a=((e,t)=>{const n=se(e),a=[];for(const i of n.outputs)he(i)?Ne(e,t,...i):Re(e,t,...i),a.push(i[0]);return n.outputs.clear(),a})(this,u);else if("number"==typeof e){if(e<0||e>=this.numberOfOutputs)throw i();a=((e,t,n)=>{const a=se(e),i=[];for(const s of a.outputs)s[1]===n&&(he(s)?Ne(e,t,...s):Re(e,t,...s),i.push(s[0]),a.outputs.delete(s));return i})(this,u,e)}else{if(void 0!==t&&(t<0||t>=this.numberOfOutputs))throw i();if(ce(e)&&void 0!==n&&(n<0||n>=e.numberOfInputs))throw i();if(a=((e,t,n,a,i)=>{const s=se(e);return Array.from(s.outputs).filter((e=>!(e[0]!==n||void 0!==a&&e[1]!==a||void 0!==i&&e[2]!==i))).map((n=>(he(n)?Ne(e,t,...n):Re(e,t,...n),s.outputs.delete(n),n[0])))})(this,u,e,t,n),0===a.length)throw s()}for(const e of a){const t=l([this],e);Ee(t,o)}}})((ln=_,(e,t,n)=>{const a=[];for(let e=0;e{const p=new WeakMap;return(m,f,g,y,b)=>{const{activeInputs:v,passiveInputs:k}=s(f),{outputs:w}=s(m),A=o(m),x=s=>{const o=l(f),u=l(m);if(s){const t=W(k,m,g,y);e(v,m,t,!1),b||h(m)||n(u,o,g,y),d(f)&&q(f)}else{const e=a(v,m,g,y);t(k,y,e,!1),b||h(m)||i(u,o,g,y);const n=r(f);if(0===n)c(f)&&$(f,v);else{const e=p.get(f);void 0!==e&&clearTimeout(e),p.set(f,setTimeout((()=>{c(f)&&$(f,v)}),1e3*n))}}};return!!u(w,[f,g,y],(e=>e[0]===f&&e[1]===g&&e[2]===y),!0)&&(A.add(x),c(m)?e(v,m,[g,y,x],!0):t(k,y,[m,g,x],!0),!0)}})(Bt,Ft,ge,Lt,ke,se,jt,G,we,de,ae,xe,Ce),Vt,((e,t,n,a,i,s)=>r=>(o,l)=>{const u=e.get(o);if(void 0===u){if(!r&&s(o)){const e=a(o),{outputs:s}=n(o);for(const n of s)if(he(n)){const i=a(n[0]);t(e,i,n[1],n[2])}else{const t=i(n[0]);e.disconnect(t,n[1])}}e.set(o,l)}else e.set(o,u+l)})(z,ke,se,we,Ae,ae),Q,Ze,yt,((e,t,n,a,i,s,r,o)=>(l,u)=>{const c=t.get(l);if(void 0===c)throw new Error("Missing the expected cycle count.");const h=s(l.context),d=o(h);if(c===u){if(t.delete(l),!d&&r(l)){const t=a(l),{outputs:s}=n(l);for(const n of s)if(he(n)){const i=a(n[0]);e(t,i,n[1],n[2])}else{const e=i(n[0]);t.connect(e,n[1])}}}else t.set(l,c-u)})(ge,z,se,we,Ae,Zt,ae,Qt),((e,t,n)=>function a(i,s){const r=ce(s)?s:n(e,s);if((e=>"delayTime"in e)(r))return[];if(i[0]===r)return[i];if(i.includes(r))return[];const{outputs:o}=t(r);return Array.from(o).map((e=>a([...i,r],e[0]))).reduce(((e,t)=>e.concat(t)),[])})(Jt,se,V),en,Zt,nn,an,sn,Qt,rn);var ln;const un=((e,t,n,a,i,s)=>class extends e{constructor(e,n){const r=i(e),o={...Z,...n},l=a(r,o);super(e,!1,l,s(r)?t():null),this._nativeAnalyserNode=l}get fftSize(){return this._nativeAnalyserNode.fftSize}set fftSize(e){this._nativeAnalyserNode.fftSize=e}get frequencyBinCount(){return this._nativeAnalyserNode.frequencyBinCount}get maxDecibels(){return this._nativeAnalyserNode.maxDecibels}set maxDecibels(e){const t=this._nativeAnalyserNode.maxDecibels;if(this._nativeAnalyserNode.maxDecibels=e,!(e>this._nativeAnalyserNode.minDecibels))throw this._nativeAnalyserNode.maxDecibels=t,n()}get minDecibels(){return this._nativeAnalyserNode.minDecibels}set minDecibels(e){const t=this._nativeAnalyserNode.minDecibels;if(this._nativeAnalyserNode.minDecibels=e,!(this._nativeAnalyserNode.maxDecibels>e))throw this._nativeAnalyserNode.minDecibels=t,n()}get smoothingTimeConstant(){return this._nativeAnalyserNode.smoothingTimeConstant}set smoothingTimeConstant(e){this._nativeAnalyserNode.smoothingTimeConstant=e}getByteFrequencyData(e){this._nativeAnalyserNode.getByteFrequencyData(e)}getByteTimeDomainData(e){this._nativeAnalyserNode.getByteTimeDomainData(e)}getFloatFrequencyData(e){this._nativeAnalyserNode.getFloatFrequencyData(e)}getFloatTimeDomainData(e){this._nativeAnalyserNode.getFloatTimeDomainData(e)}})(on,$t,Q,qt,Zt,Qt),cn=new WeakSet,hn=(e=>null===e?null:e.hasOwnProperty("AudioBuffer")?e.AudioBuffer:null)(Gt),dn=(pn=new Uint32Array(1),e=>(pn[0]=e,pn[0]));var pn;const mn=((e,t)=>n=>{n.copyFromChannel=(a,i,s=0)=>{const r=e(s),o=e(i);if(o>=n.numberOfChannels)throw t();const l=n.length,u=n.getChannelData(o),c=a.length;for(let e=r<0?-r:0;e+r{const r=e(s),o=e(i);if(o>=n.numberOfChannels)throw t();const l=n.length,u=n.getChannelData(o),c=a.length;for(let e=r<0?-r:0;e+rt=>{t.copyFromChannel=(n=>(a,i,s=0)=>{const r=e(s),o=e(i);if(r(a,i,s=0)=>{const r=e(s),o=e(i);if(r{let l=null;return class u{constructor(u){if(null===i)throw new Error("Missing the native OfflineAudioContext constructor.");const{length:c,numberOfChannels:h,sampleRate:d}={...ee,...u};null===l&&(l=new i(1,1,44100));const p=null!==a&&t(s,s)?new a({length:c,numberOfChannels:h,sampleRate:d}):l.createBuffer(h,c,d);if(0===p.numberOfChannels)throw n();return"function"!=typeof p.copyFromChannel?(r(p),J(p)):t(Y,(()=>Y(p)))||o(p),e.add(p),p}static[Symbol.hasInstance](t){return null!==t&&"object"==typeof t&&Object.getPrototypeOf(t)===u.prototype||e.has(t)}}})(cn,Vt,yt,hn,Yt,(e=>()=>{if(null===e)return!1;try{new e({length:1,sampleRate:44100})}catch{return!1}return!0})(hn),mn,fn),yn=(e=>(t,n)=>{const a=e(t,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});n.connect(a).connect(t.destination);const i=()=>{n.removeEventListener("ended",i),n.disconnect(a),a.disconnect()};n.addEventListener("ended",i)})(pt),bn=((e,t,n)=>async(a,i,s)=>{const r=t(a);await Promise.all(Array.from(r.activeInputs).map((async([t,a])=>{const r=e(t),o=await r.render(t,i);n(t)||o.connect(s,a)})))})(Ht,re,xe),vn=(e=>(t,n,a)=>e(n,t,a))(bn),kn=((e,t,n,a,i,s,r,o,l,u,c)=>(h,d)=>{const p=h.createBufferSource();return nt(p,d),it(p,d,"playbackRate"),tt(p,d,"buffer"),tt(p,d,"loop"),tt(p,d,"loopEnd"),tt(p,d,"loopStart"),t(n,(()=>n(h)))||(e=>{e.start=(t=>{let n=!1;return(a=0,i=0,s)=>{if(n)throw $e();t.call(e,a,i,s),n=!0}})(e.start)})(p),t(a,(()=>a(h)))||l(p),t(i,(()=>i(h)))||u(p,h),t(s,(()=>s(h)))||st(p),t(r,(()=>r(h)))||c(p,h),t(o,(()=>o(h)))||rt(p),e(h,p),p})(yn,Vt,(e=>{const t=e.createBufferSource();t.start();try{t.start()}catch{return!0}return!1}),(e=>{const t=e.createBufferSource(),n=e.createBuffer(1,1,44100);t.buffer=n;try{t.start(0,1)}catch{return!1}return!0}),(e=>{const t=e.createBufferSource();t.start();try{t.stop()}catch{return!1}return!0}),It,Nt,Rt,(e=>{e.start=(t=>(n=0,a=0,i)=>{const s=e.buffer,r=null===s?a:Math.min(s.duration,a);null!==s&&r>s.duration-.5/e.context.sampleRate?t.call(e,n,0,0):t.call(e,n,r,i)})(e.start)}),(e=>(t,n)=>{const a=n.createBuffer(1,1,44100);null===t.buffer&&(t.buffer=a),e(t,"buffer",(e=>()=>{const n=e.call(t);return n===a?null:n}),(e=>n=>e.call(t,null===n?a:n)))})(_t),Ot),wn=((e,t)=>(n,a,i)=>(e(a).replay(i),t(a,n,i)))((e=>t=>{const n=e(t);if(null===n.renderer)throw new Error("Missing the renderer of the given AudioParam in the audio graph.");return n.renderer})(re),bn),An=((e,t,n,a,i)=>()=>{const s=new WeakMap;let r=null,o=null;return{set start(e){r=e},set stop(e){o=e},render(l,u){const c=s.get(u);return void 0!==c?Promise.resolve(c):(async(l,u)=>{let c=n(l);const h=X(c,u);if(!h){const e={buffer:c.buffer,channelCount:c.channelCount,channelCountMode:c.channelCountMode,channelInterpretation:c.channelInterpretation,loop:c.loop,loopEnd:c.loopEnd,loopStart:c.loopStart,playbackRate:c.playbackRate.value};c=t(u,e),null!==r&&c.start(...r),null!==o&&c.stop(o)}return s.set(u,c),h?await e(u,l.playbackRate,c.playbackRate):await a(u,l.playbackRate,c.playbackRate),await i(l,u,c),c})(l,u)}}})(vn,kn,we,wn,Kt),xn=((e,t,n,a,i,s,r,o,l,u,c,h,d)=>(p,m,f,g=null,y=null)=>{const b=f.value,v=new S(b),k=m?a(v):null,w={get defaultValue(){return b},get maxValue(){return null===g?f.maxValue:g},get minValue(){return null===y?f.minValue:y},get value(){return f.value},set value(e){f.value=e,w.setValueAtTime(e,p.context.currentTime)},cancelAndHoldAtTime(e){if("function"==typeof f.cancelAndHoldAtTime)null===k&&v.flush(p.context.currentTime),v.add(i(e)),f.cancelAndHoldAtTime(e);else{const t=Array.from(v).pop();null===k&&v.flush(p.context.currentTime),v.add(i(e));const n=Array.from(v).pop();f.cancelScheduledValues(e),t!==n&&void 0!==n&&("exponentialRampToValue"===n.type?f.exponentialRampToValueAtTime(n.value,n.endTime):"linearRampToValue"===n.type?f.linearRampToValueAtTime(n.value,n.endTime):"setValue"===n.type?f.setValueAtTime(n.value,n.startTime):"setValueCurve"===n.type&&f.setValueCurveAtTime(n.values,n.startTime,n.duration))}return w},cancelScheduledValues:e=>(null===k&&v.flush(p.context.currentTime),v.add(s(e)),f.cancelScheduledValues(e),w),exponentialRampToValueAtTime(e,t){if(0===e)throw new RangeError;if(!Number.isFinite(t)||t<0)throw new RangeError;const n=p.context.currentTime;return null===k&&v.flush(n),0===Array.from(v).length&&(v.add(u(b,n)),f.setValueAtTime(b,n)),v.add(r(e,t)),f.exponentialRampToValueAtTime(e,t),w},linearRampToValueAtTime(e,t){const n=p.context.currentTime;return null===k&&v.flush(n),0===Array.from(v).length&&(v.add(u(b,n)),f.setValueAtTime(b,n)),v.add(o(e,t)),f.linearRampToValueAtTime(e,t),w},setTargetAtTime:(e,t,n)=>(null===k&&v.flush(p.context.currentTime),v.add(l(e,t,n)),f.setTargetAtTime(e,t,n),w),setValueAtTime:(e,t)=>(null===k&&v.flush(p.context.currentTime),v.add(u(e,t)),f.setValueAtTime(e,t),w),setValueCurveAtTime(e,t,n){const a=e instanceof Float32Array?e:new Float32Array(e);if(null!==h&&"webkitAudioContext"===h.name){const e=t+n,i=p.context.sampleRate,s=Math.ceil(t*i),r=Math.floor(e*i),o=r-s,l=new Float32Array(o);for(let e=0;e{Cn.set(e,{activeInputs:new Set,passiveInputs:new WeakMap,renderer:t})}),Jt,N,(e=>({replay(t){for(const n of e)if("exponentialRampToValue"===n.type){const{endTime:e,value:a}=n;t.exponentialRampToValueAtTime(a,e)}else if("linearRampToValue"===n.type){const{endTime:e,value:a}=n;t.linearRampToValueAtTime(a,e)}else if("setTarget"===n.type){const{startTime:e,target:a,timeConstant:i}=n;t.setTargetAtTime(a,e,i)}else if("setValue"===n.type){const{startTime:e,value:a}=n;t.setValueAtTime(a,e)}else{if("setValueCurve"!==n.type)throw new Error("Can't apply an unknown automation.");{const{duration:e,startTime:a,values:i}=n;t.setValueCurveAtTime(i,a,e)}}}})),(e=>({cancelTime:e,type:"cancelAndHold"})),(e=>({cancelTime:e,type:"cancelScheduledValues"})),((e,t)=>({endTime:t,type:"exponentialRampToValue",value:e})),((e,t)=>({endTime:t,type:"linearRampToValue",value:e})),((e,t,n)=>({startTime:t,target:e,timeConstant:n,type:"setTarget"})),l,u,tn,Tt);var Cn;const Sn=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,a){const o=s(e),l={...ie,...a},u=i(o,l),c=r(o),h=c?t():null;super(e,!1,u,h),this._audioBufferSourceNodeRenderer=h,this._isBufferNullified=!1,this._isBufferSet=null!==l.buffer,this._nativeAudioBufferSourceNode=u,this._onended=null,this._playbackRate=n(this,c,u.playbackRate,ne,te)}get buffer(){return this._isBufferNullified?null:this._nativeAudioBufferSourceNode.buffer}set buffer(e){if(this._nativeAudioBufferSourceNode.buffer=e,null!==e){if(this._isBufferSet)throw a();this._isBufferSet=!0}}get loop(){return this._nativeAudioBufferSourceNode.loop}set loop(e){this._nativeAudioBufferSourceNode.loop=e}get loopEnd(){return this._nativeAudioBufferSourceNode.loopEnd}set loopEnd(e){this._nativeAudioBufferSourceNode.loopEnd=e}get loopStart(){return this._nativeAudioBufferSourceNode.loopStart}set loopStart(e){this._nativeAudioBufferSourceNode.loopStart=e}get onended(){return this._onended}set onended(e){const t="function"==typeof e?o(this,e):null;this._nativeAudioBufferSourceNode.onended=t;const n=this._nativeAudioBufferSourceNode.onended;this._onended=null!==n&&n===t?e:n}get playbackRate(){return this._playbackRate}start(e=0,t=0,n){if(this._nativeAudioBufferSourceNode.start(e,t,n),null!==this._audioBufferSourceNodeRenderer&&(this._audioBufferSourceNodeRenderer.start=void 0===n?[e,t]:[e,t,n]),"closed"!==this.context.state){q(this);const e=()=>{this._nativeAudioBufferSourceNode.removeEventListener("ended",e),ae(this)&&K(this)};this._nativeAudioBufferSourceNode.addEventListener("ended",e)}}stop(e=0){this._nativeAudioBufferSourceNode.stop(e),null!==this._audioBufferSourceNodeRenderer&&(this._audioBufferSourceNodeRenderer.stop=e)}})(on,An,xn,$e,kn,Zt,Qt,Mt),En=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,n){const a=s(e),l=r(a),u=i(a,n,l);super(e,!1,u,l?t(o):null),this._isNodeOfNativeOfflineAudioContext=l,this._nativeAudioDestinationNode=u}get channelCount(){return this._nativeAudioDestinationNode.channelCount}set channelCount(e){if(this._isNodeOfNativeOfflineAudioContext)throw a();if(e>this._nativeAudioDestinationNode.maxChannelCount)throw n();this._nativeAudioDestinationNode.channelCount=e}get channelCountMode(){return this._nativeAudioDestinationNode.channelCountMode}set channelCountMode(e){if(this._isNodeOfNativeOfflineAudioContext)throw a();this._nativeAudioDestinationNode.channelCountMode=e}get maxChannelCount(){return this._nativeAudioDestinationNode.maxChannelCount}})(on,(e=>{const t=new WeakMap;return{render(n,a){const i=t.get(a);return void 0!==i?Promise.resolve(i):(async(n,a)=>{const i=a.destination;return t.set(a,i),await e(n,a,i),i})(n,a)}}}),Q,$e,((e,t)=>(n,a,i)=>{const s=n.destination;if(s.channelCount!==a)try{s.channelCount=a}catch{}i&&"explicit"!==s.channelCountMode&&(s.channelCountMode="explicit"),0===s.maxChannelCount&&Object.defineProperty(s,"maxChannelCount",{value:a});const r=e(n,{channelCount:a,channelCountMode:s.channelCountMode,channelInterpretation:s.channelInterpretation,gain:1});return t(r,"channelCount",(e=>()=>e.call(r)),(e=>t=>{e.call(r,t);try{s.channelCount=t}catch(e){if(t>s.maxChannelCount)throw e}})),t(r,"channelCountMode",(e=>()=>e.call(r)),(e=>t=>{e.call(r,t),s.channelCountMode=t})),t(r,"channelInterpretation",(e=>()=>e.call(r)),(e=>t=>{e.call(r,t),s.channelInterpretation=t})),Object.defineProperty(r,"maxChannelCount",{get:()=>s.maxChannelCount}),r.connect(s),r})(pt,_t),Zt,Qt,Kt),_n=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={Q:l.Q.value,channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,detune:l.detune.value,frequency:l.frequency.value,gain:l.gain.value,type:l.type};l=t(o,e)}return s.set(o,l),u?(await e(o,r.Q,l.Q),await e(o,r.detune,l.detune),await e(o,r.frequency,l.frequency),await e(o,r.gain,l.gain)):(await a(o,r.Q,l.Q),await a(o,r.detune,l.detune),await a(o,r.frequency,l.frequency),await a(o,r.gain,l.gain)),await i(r,o,l),l})(r,o)}}})(vn,ut,we,wn,Kt),Tn=(e=>(t,n)=>e.set(t,n))(Pt),In=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,a){const l=s(e),u={...Le,...a},c=i(l,u),h=r(l);super(e,!1,c,h?n():null),this._Q=t(this,h,c.Q,ne,te),this._detune=t(this,h,c.detune,1200*Math.log2(ne),-1200*Math.log2(ne)),this._frequency=t(this,h,c.frequency,e.sampleRate/2,0),this._gain=t(this,h,c.gain,40*Math.log10(ne),te),this._nativeBiquadFilterNode=c,o(this,1)}get detune(){return this._detune}get frequency(){return this._frequency}get gain(){return this._gain}get Q(){return this._Q}get type(){return this._nativeBiquadFilterNode.type}set type(e){this._nativeBiquadFilterNode.type=e}getFrequencyResponse(e,t,n){try{this._nativeBiquadFilterNode.getFrequencyResponse(e,t,n)}catch(e){if(11===e.code)throw a();throw e}if(e.length!==t.length||t.length!==n.length)throw a()}})(on,xn,_n,Ze,ut,Zt,Qt,Tn),Nn=((e,t)=>(n,a,i)=>{const s=new Set;return n.connect=(i=>(r,o=0,l=0)=>{const u=0===s.size;if(t(r))return i.call(n,r,o,l),e(s,[r,o,l],(e=>e[0]===r&&e[1]===o&&e[2]===l),!0),u&&a(),r;i.call(n,r,o),e(s,[r,o],(e=>e[0]===r&&e[1]===o),!0),u&&a()})(n.connect),n.disconnect=(e=>(a,r,o)=>{const l=s.size>0;if(void 0===a)e.apply(n),s.clear();else if("number"==typeof a){e.call(n,a);for(const e of s)e[1]===a&&s.delete(e)}else{t(a)?e.call(n,a,r,o):e.call(n,a,r);for(const e of s)e[0]!==a||void 0!==r&&e[1]!==r||void 0!==o&&e[2]!==o||s.delete(e)}const u=0===s.size;l&&u&&i()})(n.disconnect),n})(de,an),Rn=((e,t)=>(n,a)=>{a.channelCount=1,a.channelCountMode="explicit",Object.defineProperty(a,"channelCount",{get:()=>1,set:()=>{throw e()}}),Object.defineProperty(a,"channelCountMode",{get:()=>"explicit",set:()=>{throw e()}});const i=n.createBufferSource();t(a,(()=>{const e=a.numberOfInputs;for(let t=0;ti.disconnect(a)))})($e,Nn),Dn=((e,t)=>(n,a)=>{const i=n.createChannelMerger(a.numberOfInputs);return null!==e&&"webkitAudioContext"===e.name&&t(n,i),nt(i,a),i})(tn,Rn),zn=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,numberOfInputs:r.numberOfInputs};r=e(s,t)}return a.set(s,r),await n(i,s,r),r})(i,s)}}})(Dn,we,Kt),On=((e,t,n,a,i)=>class extends e{constructor(e,s){const r=a(e),o={...Pe,...s};super(e,!1,n(r,o),i(r)?t():null)}})(on,zn,Dn,Zt,Qt),Mn=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,numberOfOutputs:r.numberOfOutputs};r=e(s,t)}return a.set(s,r),await n(i,s,r),r})(i,s)}}})(ct,we,Kt),Bn=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=a(e),l=s({...je,...r});super(e,!1,n(o,l),i(o)?t():null)}})(on,Mn,ct,Zt,Qt,(e=>({...e,channelCount:e.numberOfOutputs}))),Fn=((e,t,n,a)=>(i,{offset:s,...r})=>{const o=i.createBuffer(1,2,44100),l=t(i,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}),u=n(i,{...r,gain:s}),c=o.getChannelData(0);c[0]=1,c[1]=1,l.buffer=o,l.loop=!0;const h={get bufferSize(){},get channelCount(){return u.channelCount},set channelCount(e){u.channelCount=e},get channelCountMode(){return u.channelCountMode},set channelCountMode(e){u.channelCountMode=e},get channelInterpretation(){return u.channelInterpretation},set channelInterpretation(e){u.channelInterpretation=e},get context(){return u.context},get inputs(){return[]},get numberOfInputs(){return l.numberOfInputs},get numberOfOutputs(){return u.numberOfOutputs},get offset(){return u.gain},get onended(){return l.onended},set onended(e){l.onended=e},addEventListener:(...e)=>l.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>l.dispatchEvent(e[0]),removeEventListener:(...e)=>l.removeEventListener(e[0],e[1],e[2]),start(e=0){l.start.call(l,e)},stop(e=0){l.stop.call(l,e)}};return e(i,l),a(ht(h,u),(()=>l.connect(u)),(()=>l.disconnect(u)))})(yn,kn,pt,Nn),Ln=((e,t,n,a,i)=>(s,r)=>{if(void 0===s.createConstantSource)return n(s,r);const o=s.createConstantSource();return nt(o,r),it(o,r,"offset"),t(a,(()=>a(s)))||st(o),t(i,(()=>i(s)))||rt(o),e(s,o),o})(yn,Vt,Fn,It,Rt),Pn=((e,t,n,a,i)=>()=>{const s=new WeakMap;let r=null,o=null;return{set start(e){r=e},set stop(e){o=e},render(l,u){const c=s.get(u);return void 0!==c?Promise.resolve(c):(async(l,u)=>{let c=n(l);const h=X(c,u);if(!h){const e={channelCount:c.channelCount,channelCountMode:c.channelCountMode,channelInterpretation:c.channelInterpretation,offset:c.offset.value};c=t(u,e),null!==r&&c.start(r),null!==o&&c.stop(o)}return s.set(u,c),h?await e(u,l.offset,c.offset):await a(u,l.offset,c.offset),await i(l,u,c),c})(l,u)}}})(vn,Ln,we,wn,Kt),jn=((e,t,n,a,i,s,r)=>class extends e{constructor(e,r){const o=i(e),l={...Ve,...r},u=a(o,l),c=s(o),h=c?n():null;super(e,!1,u,h),this._constantSourceNodeRenderer=h,this._nativeConstantSourceNode=u,this._offset=t(this,c,u.offset,ne,te),this._onended=null}get offset(){return this._offset}get onended(){return this._onended}set onended(e){const t="function"==typeof e?r(this,e):null;this._nativeConstantSourceNode.onended=t;const n=this._nativeConstantSourceNode.onended;this._onended=null!==n&&n===t?e:n}start(e=0){if(this._nativeConstantSourceNode.start(e),null!==this._constantSourceNodeRenderer&&(this._constantSourceNodeRenderer.start=e),"closed"!==this.context.state){q(this);const e=()=>{this._nativeConstantSourceNode.removeEventListener("ended",e),ae(this)&&K(this)};this._nativeConstantSourceNode.addEventListener("ended",e)}}stop(e=0){this._nativeConstantSourceNode.stop(e),null!==this._constantSourceNodeRenderer&&(this._constantSourceNodeRenderer.stop=e)}})(on,xn,Pn,Ln,Zt,Qt,Mt),Vn=((e,t)=>(n,a)=>{const i=n.createConvolver();if(nt(i,a),a.disableNormalization===i.normalize&&(i.normalize=!a.disableNormalization),tt(i,a,"buffer"),a.channelCount>2)throw e();if(t(i,"channelCount",(e=>()=>e.call(i)),(t=>n=>{if(n>2)throw e();return t.call(i,n)})),"max"===a.channelCountMode)throw e();return t(i,"channelCountMode",(e=>()=>e.call(i)),(t=>n=>{if("max"===n)throw e();return t.call(i,n)})),i})(yt,_t),Un=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={buffer:r.buffer,channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,disableNormalization:!r.normalize};r=e(s,t)}return a.set(s,r),fe(r)?await n(i,s,r.inputs[0]):await n(i,s,r),r})(i,s)}}})(Vn,we,Kt),Wn=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=a(e),l={...Ue,...r},u=n(o,l);super(e,!1,u,i(o)?t():null),this._isBufferNullified=!1,this._nativeConvolverNode=u,null!==l.buffer&&s(this,l.buffer.duration)}get buffer(){return this._isBufferNullified?null:this._nativeConvolverNode.buffer}set buffer(e){if(this._nativeConvolverNode.buffer=e,null===e&&null!==this._nativeConvolverNode.buffer){const e=this._nativeConvolverNode.context;this._nativeConvolverNode.buffer=e.createBuffer(1,1,e.sampleRate),this._isBufferNullified=!0,s(this,0)}else this._isBufferNullified=!1,s(this,null===this._nativeConvolverNode.buffer?0:this._nativeConvolverNode.buffer.duration)}get normalize(){return this._nativeConvolverNode.normalize}set normalize(e){this._nativeConvolverNode.normalize=e}})(on,Un,Vn,Zt,Qt,Tn),Gn=((e,t,n,a,i)=>s=>{const r=new WeakMap;return{render(o,l){const u=r.get(l);return void 0!==u?Promise.resolve(u):(async(o,l)=>{let u=n(o);const c=X(u,l);if(!c){const e={channelCount:u.channelCount,channelCountMode:u.channelCountMode,channelInterpretation:u.channelInterpretation,delayTime:u.delayTime.value,maxDelayTime:s};u=t(l,e)}return r.set(l,u),c?await e(l,o.delayTime,u.delayTime):await a(l,o.delayTime,u.delayTime),await i(o,l,u),u})(o,l)}}})(vn,dt,we,wn,Kt),qn=((e,t,n,a,i,s,r)=>class extends e{constructor(e,o){const l=i(e),u={...Ge,...o},c=a(l,u),h=s(l);super(e,!1,c,h?n(u.maxDelayTime):null),this._delayTime=t(this,h,c.delayTime),r(this,u.maxDelayTime)}get delayTime(){return this._delayTime}})(on,xn,Gn,dt,Zt,Qt,Tn),Hn=(e=>(t,n)=>{const a=t.createDynamicsCompressor();if(nt(a,n),n.channelCount>2)throw e();if("max"===n.channelCountMode)throw e();return it(a,n,"attack"),it(a,n,"knee"),it(a,n,"ratio"),it(a,n,"release"),it(a,n,"threshold"),a})(yt),Kn=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={attack:l.attack.value,channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,knee:l.knee.value,ratio:l.ratio.value,release:l.release.value,threshold:l.threshold.value};l=t(o,e)}return s.set(o,l),u?(await e(o,r.attack,l.attack),await e(o,r.knee,l.knee),await e(o,r.ratio,l.ratio),await e(o,r.release,l.release),await e(o,r.threshold,l.threshold)):(await a(o,r.attack,l.attack),await a(o,r.knee,l.knee),await a(o,r.ratio,l.ratio),await a(o,r.release,l.release),await a(o,r.threshold,l.threshold)),await i(r,o,l),l})(r,o)}}})(vn,Hn,we,wn,Kt),$n=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,i){const l=s(e),u={...He,...i},c=a(l,u),h=r(l);super(e,!1,c,h?n():null),this._attack=t(this,h,c.attack),this._knee=t(this,h,c.knee),this._nativeDynamicsCompressorNode=c,this._ratio=t(this,h,c.ratio),this._release=t(this,h,c.release),this._threshold=t(this,h,c.threshold),o(this,.006)}get attack(){return this._attack}get channelCount(){return this._nativeDynamicsCompressorNode.channelCount}set channelCount(e){const t=this._nativeDynamicsCompressorNode.channelCount;if(this._nativeDynamicsCompressorNode.channelCount=e,e>2)throw this._nativeDynamicsCompressorNode.channelCount=t,i()}get channelCountMode(){return this._nativeDynamicsCompressorNode.channelCountMode}set channelCountMode(e){const t=this._nativeDynamicsCompressorNode.channelCountMode;if(this._nativeDynamicsCompressorNode.channelCountMode=e,"max"===e)throw this._nativeDynamicsCompressorNode.channelCountMode=t,i()}get knee(){return this._knee}get ratio(){return this._ratio}get reduction(){return"number"==typeof this._nativeDynamicsCompressorNode.reduction.value?this._nativeDynamicsCompressorNode.reduction.value:this._nativeDynamicsCompressorNode.reduction}get release(){return this._release}get threshold(){return this._threshold}})(on,xn,Kn,Hn,yt,Zt,Qt,Tn),Zn=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,gain:l.gain.value};l=t(o,e)}return s.set(o,l),u?await e(o,r.gain,l.gain):await a(o,r.gain,l.gain),await i(r,o,l),l})(r,o)}}})(vn,pt,we,wn,Kt),Xn=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=i(e),l={...Ke,...r},u=a(o,l),c=s(o);super(e,!1,u,c?n():null),this._gain=t(this,c,u.gain,ne,te)}get gain(){return this._gain}})(on,xn,Zn,pt,Zt,Qt),Yn=((e,t,n,a)=>(i,s,{channelCount:r,channelCountMode:o,channelInterpretation:l,feedback:u,feedforward:c})=>{const h=ot(s,i.sampleRate),d=u instanceof Float64Array?u:new Float64Array(u),p=c instanceof Float64Array?c:new Float64Array(c),m=d.length,f=p.length,g=Math.min(m,f);if(0===m||m>20)throw a();if(0===d[0])throw t();if(0===f||f>20)throw a();if(0===p[0])throw t();if(1!==d[0]){for(let e=0;e{const t=e.inputBuffer,n=e.outputBuffer,a=t.numberOfChannels;for(let e=0;ey.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>y.dispatchEvent(e[0]),getFrequencyResponse(t,n,a){if(t.length!==n.length||n.length!==a.length)throw e();const i=t.length;for(let e=0;ey.removeEventListener(e[0],e[1],e[2])},y)})(Ze,$e,gt,yt),Qn=((e,t,n,a)=>i=>e(Je,(()=>Je(i)))?Promise.resolve(e(a,a)).then((e=>{if(!e){const e=n(i,512,0,1);i.oncomplete=()=>{e.onaudioprocess=null,e.disconnect()},e.onaudioprocess=()=>i.currentTime,e.connect(i.destination)}return i.startRendering()})):new Promise((e=>{const n=t(i,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});i.oncomplete=t=>{n.disconnect(),e(t.renderedBuffer)},n.connect(i.destination),i.startRendering()})))(Vt,pt,gt,((e,t)=>()=>{if(null===t)return Promise.resolve(!1);const n=new t(1,1,44100),a=e(n,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});return new Promise((e=>{n.oncomplete=()=>{a.disconnect(),e(0!==n.currentTime)},n.startRendering()}))})(pt,Yt)),Jn=((e,t,n,a,i)=>(s,r)=>{const o=new WeakMap;let l=null;const u=async(u,c)=>{let h=null,d=t(u);const p=X(d,c);if(void 0===c.createIIRFilter?h=e(c,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}):p||(d=c.createIIRFilter(r,s)),o.set(c,null===h?d:h),null!==h){if(null===l){if(null===n)throw new Error("Missing the native OfflineAudioContext constructor.");const e=new n(u.context.destination.channelCount,u.context.length,c.sampleRate);l=(async()=>{await a(u,e,e.destination);return((e,t,n,a)=>{const i=n instanceof Float64Array?n:new Float64Array(n),s=a instanceof Float64Array?a:new Float64Array(a),r=i.length,o=s.length,l=Math.min(r,o);if(1!==i[0]){for(let e=0;e(t,n,a)=>{if(void 0===t.createIIRFilter)return e(t,n,a);const i=t.createIIRFilter(a.feedforward,a.feedback);return nt(i,a),i})(Yn),ta=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=a(e),l=i(o),u={...Xe,...r},c=t(o,l?null:e.baseLatency,u);super(e,!1,c,l?n(u.feedback,u.feedforward):null),(e=>{var t;e.getFrequencyResponse=(t=e.getFrequencyResponse,(n,a,i)=>{if(n.length!==a.length||a.length!==i.length)throw Ze();return t.call(e,n,a,i)})})(c),this._nativeIIRFilterNode=c,s(this,1)}getFrequencyResponse(e,t,n){return this._nativeIIRFilterNode.getFrequencyResponse(e,t,n)}})(on,ea,Jn,Zt,Qt,Tn),na=((e,t,n,a,i,s,r,o)=>(l,u)=>{const c=u.listener,{forwardX:h,forwardY:d,forwardZ:p,positionX:m,positionY:f,positionZ:g,upX:y,upY:b,upZ:v}=void 0===c.forwardX?(()=>{const h=new Float32Array(1),d=t(u,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:9}),p=r(u);let m=!1,f=[0,0,-1,0,1,0],g=[0,0,0];const y=()=>{if(m)return;m=!0;const e=a(u,256,9,0);e.onaudioprocess=({inputBuffer:e})=>{const t=[s(e,h,0),s(e,h,1),s(e,h,2),s(e,h,3),s(e,h,4),s(e,h,5)];t.some(((e,t)=>e!==f[t]))&&(c.setOrientation(...t),f=t);const n=[s(e,h,6),s(e,h,7),s(e,h,8)];n.some(((e,t)=>e!==g[t]))&&(c.setPosition(...n),g=n)},d.connect(e)},b=e=>t=>{t!==f[e]&&(f[e]=t,c.setOrientation(...f))},v=e=>t=>{t!==g[e]&&(g[e]=t,c.setPosition(...g))},k=(t,a,s)=>{const r=n(u,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",offset:a});r.connect(d,0,t),r.start(),Object.defineProperty(r.offset,"defaultValue",{get:()=>a});const c=e({context:l},p,r.offset,ne,te);var h,m,f,g,b,v,k;return o(c,"value",(e=>()=>e.call(c)),(e=>t=>{try{e.call(c,t)}catch(e){if(9!==e.code)throw e}y(),p&&s(t)})),c.cancelAndHoldAtTime=(h=c.cancelAndHoldAtTime,p?()=>{throw i()}:(...e)=>{const t=h.apply(c,e);return y(),t}),c.cancelScheduledValues=(m=c.cancelScheduledValues,p?()=>{throw i()}:(...e)=>{const t=m.apply(c,e);return y(),t}),c.exponentialRampToValueAtTime=(f=c.exponentialRampToValueAtTime,p?()=>{throw i()}:(...e)=>{const t=f.apply(c,e);return y(),t}),c.linearRampToValueAtTime=(g=c.linearRampToValueAtTime,p?()=>{throw i()}:(...e)=>{const t=g.apply(c,e);return y(),t}),c.setTargetAtTime=(b=c.setTargetAtTime,p?()=>{throw i()}:(...e)=>{const t=b.apply(c,e);return y(),t}),c.setValueAtTime=(v=c.setValueAtTime,p?()=>{throw i()}:(...e)=>{const t=v.apply(c,e);return y(),t}),c.setValueCurveAtTime=(k=c.setValueCurveAtTime,p?()=>{throw i()}:(...e)=>{const t=k.apply(c,e);return y(),t}),c};return{forwardX:k(0,0,b(0)),forwardY:k(1,0,b(1)),forwardZ:k(2,-1,b(2)),positionX:k(6,0,v(0)),positionY:k(7,0,v(1)),positionZ:k(8,0,v(2)),upX:k(3,0,b(3)),upY:k(4,1,b(4)),upZ:k(5,0,b(5))}})():c;return{get forwardX(){return h},get forwardY(){return d},get forwardZ(){return p},get positionX(){return m},get positionY(){return f},get positionZ(){return g},get upX(){return y},get upY(){return b},get upZ(){return v}}})(xn,Dn,Ln,gt,yt,St,Qt,_t),aa=new WeakMap,ia=((e,t,n,a,i,s)=>class extends n{constructor(n,s){super(n),this._nativeContext=n,R.set(this,n),a(n)&&i.set(n,new Set),this._destination=new e(this,s),this._listener=t(this,n),this._onstatechange=null}get currentTime(){return this._nativeContext.currentTime}get destination(){return this._destination}get listener(){return this._listener}get onstatechange(){return this._onstatechange}set onstatechange(e){const t="function"==typeof e?s(this,e):null;this._nativeContext.onstatechange=t;const n=this._nativeContext.onstatechange;this._onstatechange=null!==n&&n===t?e:n}get sampleRate(){return this._nativeContext.sampleRate}get state(){return this._nativeContext.state}})(En,na,en,Qt,aa,Mt),sa=((e,t,n,a,i,s)=>(r,o)=>{const l=r.createOscillator();return nt(l,o),it(l,o,"detune"),it(l,o,"frequency"),void 0!==o.periodicWave?l.setPeriodicWave(o.periodicWave):tt(l,o,"type"),t(n,(()=>n(r)))||st(l),t(a,(()=>a(r)))||s(l,r),t(i,(()=>i(r)))||rt(l),e(r,l),l})(yn,Vt,It,Nt,Rt,Ot),ra=((e,t,n,a,i)=>()=>{const s=new WeakMap;let r=null,o=null,l=null;return{set periodicWave(e){r=e},set start(e){o=e},set stop(e){l=e},render(u,c){const h=s.get(c);return void 0!==h?Promise.resolve(h):(async(u,c)=>{let h=n(u);const d=X(h,c);if(!d){const e={channelCount:h.channelCount,channelCountMode:h.channelCountMode,channelInterpretation:h.channelInterpretation,detune:h.detune.value,frequency:h.frequency.value,periodicWave:null===r?void 0:r,type:h.type};h=t(c,e),null!==o&&h.start(o),null!==l&&h.stop(l)}return s.set(c,h),d?(await e(c,u.detune,h.detune),await e(c,u.frequency,h.frequency)):(await a(c,u.detune,h.detune),await a(c,u.frequency,h.frequency)),await i(u,c,h),h})(u,c)}}})(vn,sa,we,wn,Kt),oa=((e,t,n,a,i,s,r)=>class extends e{constructor(e,r){const o=i(e),l={...vt,...r},u=n(o,l),c=s(o),h=c?a():null,d=e.sampleRate/2;super(e,!1,u,h),this._detune=t(this,c,u.detune,153600,-153600),this._frequency=t(this,c,u.frequency,d,-d),this._nativeOscillatorNode=u,this._onended=null,this._oscillatorNodeRenderer=h,null!==this._oscillatorNodeRenderer&&void 0!==l.periodicWave&&(this._oscillatorNodeRenderer.periodicWave=l.periodicWave)}get detune(){return this._detune}get frequency(){return this._frequency}get onended(){return this._onended}set onended(e){const t="function"==typeof e?r(this,e):null;this._nativeOscillatorNode.onended=t;const n=this._nativeOscillatorNode.onended;this._onended=null!==n&&n===t?e:n}get type(){return this._nativeOscillatorNode.type}set type(e){this._nativeOscillatorNode.type=e,null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.periodicWave=null)}setPeriodicWave(e){this._nativeOscillatorNode.setPeriodicWave(e),null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.periodicWave=e)}start(e=0){if(this._nativeOscillatorNode.start(e),null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.start=e),"closed"!==this.context.state){q(this);const e=()=>{this._nativeOscillatorNode.removeEventListener("ended",e),ae(this)&&K(this)};this._nativeOscillatorNode.addEventListener("ended",e)}}stop(e=0){this._nativeOscillatorNode.stop(e),null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.stop=e)}})(on,xn,sa,ra,Zt,Qt,Mt),la=(e=>(t,n)=>{const a=e(t,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}),i=t.createBuffer(1,2,44100);return a.buffer=i,a.loop=!0,a.connect(n),a.start(),()=>{a.stop(),a.disconnect(n)}})(kn),ua=((e,t,n,a,i)=>(s,{curve:r,oversample:o,...l})=>{const u=s.createWaveShaper(),c=s.createWaveShaper();nt(u,l),nt(c,l);const h=n(s,{...l,gain:1}),d=n(s,{...l,gain:-1}),p=n(s,{...l,gain:1}),m=n(s,{...l,gain:-1});let f=null,g=!1,y=null;const b={get bufferSize(){},get channelCount(){return u.channelCount},set channelCount(e){h.channelCount=e,d.channelCount=e,u.channelCount=e,p.channelCount=e,c.channelCount=e,m.channelCount=e},get channelCountMode(){return u.channelCountMode},set channelCountMode(e){h.channelCountMode=e,d.channelCountMode=e,u.channelCountMode=e,p.channelCountMode=e,c.channelCountMode=e,m.channelCountMode=e},get channelInterpretation(){return u.channelInterpretation},set channelInterpretation(e){h.channelInterpretation=e,d.channelInterpretation=e,u.channelInterpretation=e,p.channelInterpretation=e,c.channelInterpretation=e,m.channelInterpretation=e},get context(){return u.context},get curve(){return y},set curve(n){if(null!==n&&n.length<2)throw t();if(null===n)u.curve=n,c.curve=n;else{const e=n.length,t=new Float32Array(e+2-e%2),a=new Float32Array(e+2-e%2);t[0]=n[0],a[0]=-n[e-1];const i=Math.ceil((e+1)/2),s=(e+1)/2-1;for(let r=1;rh.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>h.dispatchEvent(e[0]),removeEventListener:(...e)=>h.removeEventListener(e[0],e[1],e[2])};null!==r&&(b.curve=r instanceof Float32Array?r:new Float32Array(r)),o!==b.oversample&&(b.oversample=o);return i(ht(b,p),(()=>{h.connect(u).connect(p),h.connect(d).connect(c).connect(m).connect(p),g=!0,a(y)&&(f=e(s,h))}),(()=>{h.disconnect(u),u.disconnect(p),h.disconnect(d),d.disconnect(c),c.disconnect(m),m.disconnect(p),g=!1,null!==f&&(f(),f=null)}))})(la,$e,pt,Et,Nn),ca=((e,t,n,a,i,s,r)=>(o,l)=>{const u=o.createWaveShaper();if(null!==s&&"webkitAudioContext"===s.name&&void 0===o.createGain().gain.automationRate)return n(o,l);nt(u,l);const c=null===l.curve||l.curve instanceof Float32Array?l.curve:new Float32Array(l.curve);if(null!==c&&c.length<2)throw t();tt(u,{curve:c},"curve"),tt(u,l,"oversample");let h=null,d=!1;r(u,"curve",(e=>()=>e.call(u)),(t=>n=>(t.call(u,n),d&&(a(n)&&null===h?h=e(o,u):a(n)||null===h||(h(),h=null)),n)));return i(u,(()=>{d=!0,a(u.curve)&&(h=e(o,u))}),(()=>{d=!1,null!==h&&(h(),h=null)}))})(la,$e,ua,Et,Nn,tn,_t),ha=((e,t,n,a,i,s,r,o,l,u)=>(c,{coneInnerAngle:h,coneOuterAngle:d,coneOuterGain:p,distanceModel:m,maxDistance:f,orientationX:g,orientationY:y,orientationZ:b,panningModel:v,positionX:k,positionY:w,positionZ:A,refDistance:x,rolloffFactor:C,...S})=>{const E=c.createPanner();if(S.channelCount>2)throw r();if("max"===S.channelCountMode)throw r();nt(E,S);const _={channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete"},T=n(c,{..._,channelInterpretation:"speakers",numberOfInputs:6}),I=a(c,{...S,gain:1}),N=a(c,{..._,gain:1}),R=a(c,{..._,gain:0}),D=a(c,{..._,gain:0}),z=a(c,{..._,gain:0}),O=a(c,{..._,gain:0}),M=a(c,{..._,gain:0}),B=i(c,256,6,1),F=s(c,{..._,curve:new Float32Array([1,1]),oversample:"none"});let L=[g,y,b],P=[k,w,A];const j=new Float32Array(1);B.onaudioprocess=({inputBuffer:e})=>{const t=[l(e,j,0),l(e,j,1),l(e,j,2)];t.some(((e,t)=>e!==L[t]))&&(E.setOrientation(...t),L=t);const n=[l(e,j,3),l(e,j,4),l(e,j,5)];n.some(((e,t)=>e!==P[t]))&&(E.setPosition(...n),P=n)},Object.defineProperty(R.gain,"defaultValue",{get:()=>0}),Object.defineProperty(D.gain,"defaultValue",{get:()=>0}),Object.defineProperty(z.gain,"defaultValue",{get:()=>0}),Object.defineProperty(O.gain,"defaultValue",{get:()=>0}),Object.defineProperty(M.gain,"defaultValue",{get:()=>0});const V={get bufferSize(){},get channelCount(){return E.channelCount},set channelCount(e){if(e>2)throw r();I.channelCount=e,E.channelCount=e},get channelCountMode(){return E.channelCountMode},set channelCountMode(e){if("max"===e)throw r();I.channelCountMode=e,E.channelCountMode=e},get channelInterpretation(){return E.channelInterpretation},set channelInterpretation(e){I.channelInterpretation=e,E.channelInterpretation=e},get coneInnerAngle(){return E.coneInnerAngle},set coneInnerAngle(e){E.coneInnerAngle=e},get coneOuterAngle(){return E.coneOuterAngle},set coneOuterAngle(e){E.coneOuterAngle=e},get coneOuterGain(){return E.coneOuterGain},set coneOuterGain(e){if(e<0||e>1)throw t();E.coneOuterGain=e},get context(){return E.context},get distanceModel(){return E.distanceModel},set distanceModel(e){E.distanceModel=e},get inputs(){return[I]},get maxDistance(){return E.maxDistance},set maxDistance(e){if(e<0)throw new RangeError;E.maxDistance=e},get numberOfInputs(){return E.numberOfInputs},get numberOfOutputs(){return E.numberOfOutputs},get orientationX(){return N.gain},get orientationY(){return R.gain},get orientationZ(){return D.gain},get panningModel(){return E.panningModel},set panningModel(e){E.panningModel=e},get positionX(){return z.gain},get positionY(){return O.gain},get positionZ(){return M.gain},get refDistance(){return E.refDistance},set refDistance(e){if(e<0)throw new RangeError;E.refDistance=e},get rolloffFactor(){return E.rolloffFactor},set rolloffFactor(e){if(e<0)throw new RangeError;E.rolloffFactor=e},addEventListener:(...e)=>I.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>I.dispatchEvent(e[0]),removeEventListener:(...e)=>I.removeEventListener(e[0],e[1],e[2])};h!==V.coneInnerAngle&&(V.coneInnerAngle=h),d!==V.coneOuterAngle&&(V.coneOuterAngle=d),p!==V.coneOuterGain&&(V.coneOuterGain=p),m!==V.distanceModel&&(V.distanceModel=m),f!==V.maxDistance&&(V.maxDistance=f),g!==V.orientationX.value&&(V.orientationX.value=g),y!==V.orientationY.value&&(V.orientationY.value=y),b!==V.orientationZ.value&&(V.orientationZ.value=b),v!==V.panningModel&&(V.panningModel=v),k!==V.positionX.value&&(V.positionX.value=k),w!==V.positionY.value&&(V.positionY.value=w),A!==V.positionZ.value&&(V.positionZ.value=A),x!==V.refDistance&&(V.refDistance=x),C!==V.rolloffFactor&&(V.rolloffFactor=C),1===L[0]&&0===L[1]&&0===L[2]||E.setOrientation(...L),0===P[0]&&0===P[1]&&0===P[2]||E.setPosition(...P);return u(ht(V,E),(()=>{I.connect(E),e(I,F,0,0),F.connect(N).connect(T,0,0),F.connect(R).connect(T,0,1),F.connect(D).connect(T,0,2),F.connect(z).connect(T,0,3),F.connect(O).connect(T,0,4),F.connect(M).connect(T,0,5),T.connect(B).connect(c.destination)}),(()=>{I.disconnect(E),o(I,F,0,0),F.disconnect(N),N.disconnect(T),F.disconnect(R),R.disconnect(T),F.disconnect(D),D.disconnect(T),F.disconnect(z),z.disconnect(T),F.disconnect(O),O.disconnect(T),F.disconnect(M),M.disconnect(T),T.disconnect(B),B.disconnect(c.destination)}))})(ge,$e,Dn,pt,gt,ca,yt,ke,St,Nn),da=(e=>(t,n)=>{const a=t.createPanner();return void 0===a.orientationX?e(t,n):(nt(a,n),it(a,n,"orientationX"),it(a,n,"orientationY"),it(a,n,"orientationZ"),it(a,n,"positionX"),it(a,n,"positionY"),it(a,n,"positionZ"),tt(a,n,"coneInnerAngle"),tt(a,n,"coneOuterAngle"),tt(a,n,"coneOuterGain"),tt(a,n,"distanceModel"),tt(a,n,"maxDistance"),tt(a,n,"panningModel"),tt(a,n,"refDistance"),tt(a,n,"rolloffFactor"),a)})(ha),pa=((e,t,n,a,i,s,r,o,l,u)=>()=>{const c=new WeakMap;let h=null;return{render(d,p){const m=c.get(p);return void 0!==m?Promise.resolve(m):(async(d,p)=>{let m=null,f=s(d);const g={channelCount:f.channelCount,channelCountMode:f.channelCountMode,channelInterpretation:f.channelInterpretation},y={...g,coneInnerAngle:f.coneInnerAngle,coneOuterAngle:f.coneOuterAngle,coneOuterGain:f.coneOuterGain,distanceModel:f.distanceModel,maxDistance:f.maxDistance,panningModel:f.panningModel,refDistance:f.refDistance,rolloffFactor:f.rolloffFactor},b=X(f,p);if("bufferSize"in f)m=a(p,{...g,gain:1});else if(!b){const e={...y,orientationX:f.orientationX.value,orientationY:f.orientationY.value,orientationZ:f.orientationZ.value,positionX:f.positionX.value,positionY:f.positionY.value,positionZ:f.positionZ.value};f=i(p,e)}if(c.set(p,null===m?f:m),null!==m){if(null===h){if(null===r)throw new Error("Missing the native OfflineAudioContext constructor.");const e=new r(6,d.context.length,p.sampleRate),a=t(e,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:6});a.connect(e.destination),h=(async()=>{const t=await Promise.all([d.orientationX,d.orientationY,d.orientationZ,d.positionX,d.positionY,d.positionZ].map((async(t,a)=>{const i=n(e,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",offset:0===a?1:0});return await o(e,t,i.offset),i})));for(let e=0;e<6;e+=1)t[e].connect(a,0,e),t[e].start(0);return u(e)})()}const e=await h,s=a(p,{...g,gain:1});await l(d,p,s);const c=[];for(let t=0;te!==f[t]))||n.some(((e,t)=>e!==b[t]))){f=e,b=n;const r=t/p.sampleRate;v.gain.setValueAtTime(0,r),v=a(p,{...g,gain:0}),k=i(p,{...y,orientationX:f[0],orientationY:f[1],orientationZ:f[2],positionX:b[0],positionY:b[1],positionZ:b[2]}),v.gain.setValueAtTime(1,r),s.connect(v).connect(k.inputs[0]),k.connect(m)}}return m}return b?(await e(p,d.orientationX,f.orientationX),await e(p,d.orientationY,f.orientationY),await e(p,d.orientationZ,f.orientationZ),await e(p,d.positionX,f.positionX),await e(p,d.positionY,f.positionY),await e(p,d.positionZ,f.positionZ)):(await o(p,d.orientationX,f.orientationX),await o(p,d.orientationY,f.orientationY),await o(p,d.orientationZ,f.orientationZ),await o(p,d.positionX,f.positionX),await o(p,d.positionY,f.positionY),await o(p,d.positionZ,f.positionZ)),fe(f)?await l(d,p,f.inputs[0]):await l(d,p,f),f})(d,p)}}})(vn,Dn,Ln,pt,da,we,Yt,wn,Kt,Qn),ma=((e,t,n,a,i,s,r)=>class extends e{constructor(e,o){const l=i(e),u={...kt,...o},c=n(l,u),h=s(l);super(e,!1,c,h?a():null),this._nativePannerNode=c,this._orientationX=t(this,h,c.orientationX,ne,te),this._orientationY=t(this,h,c.orientationY,ne,te),this._orientationZ=t(this,h,c.orientationZ,ne,te),this._positionX=t(this,h,c.positionX,ne,te),this._positionY=t(this,h,c.positionY,ne,te),this._positionZ=t(this,h,c.positionZ,ne,te),r(this,1)}get coneInnerAngle(){return this._nativePannerNode.coneInnerAngle}set coneInnerAngle(e){this._nativePannerNode.coneInnerAngle=e}get coneOuterAngle(){return this._nativePannerNode.coneOuterAngle}set coneOuterAngle(e){this._nativePannerNode.coneOuterAngle=e}get coneOuterGain(){return this._nativePannerNode.coneOuterGain}set coneOuterGain(e){this._nativePannerNode.coneOuterGain=e}get distanceModel(){return this._nativePannerNode.distanceModel}set distanceModel(e){this._nativePannerNode.distanceModel=e}get maxDistance(){return this._nativePannerNode.maxDistance}set maxDistance(e){this._nativePannerNode.maxDistance=e}get orientationX(){return this._orientationX}get orientationY(){return this._orientationY}get orientationZ(){return this._orientationZ}get panningModel(){return this._nativePannerNode.panningModel}set panningModel(e){this._nativePannerNode.panningModel=e}get positionX(){return this._positionX}get positionY(){return this._positionY}get positionZ(){return this._positionZ}get refDistance(){return this._nativePannerNode.refDistance}set refDistance(e){this._nativePannerNode.refDistance=e}get rolloffFactor(){return this._nativePannerNode.rolloffFactor}set rolloffFactor(e){this._nativePannerNode.rolloffFactor=e}})(on,xn,da,pa,Zt,Qt,Tn),fa=(e=>(t,{disableNormalization:n,imag:a,real:i})=>{const s=a instanceof Float32Array?a:new Float32Array(a),r=i instanceof Float32Array?i:new Float32Array(i),o=t.createPeriodicWave(r,s,{disableNormalization:n});if(Array.from(a).length<2)throw e();return o})(Q),ga=((e,t,n,a)=>class i{constructor(i,s){const r=t(i),o=a({...wt,...s}),l=e(r,o);return n.add(l),l}static[Symbol.hasInstance](e){return null!==e&&"object"==typeof e&&Object.getPrototypeOf(e)===i.prototype||n.has(e)}})(fa,Zt,new WeakSet,(e=>{const{imag:t,real:n}=e;return void 0===t?void 0===n?{...e,imag:[0,0],real:[0,0]}:{...e,imag:Array.from(n,(()=>0)),real:n}:void 0===n?{...e,imag:t,real:Array.from(t,(()=>0))}:{...e,imag:t,real:n}})),ya=((e,t,n,a,i,s)=>{const r=16385,o=new Float32Array([1,1]),l=Math.PI/2,u={channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete"},c={...u,oversample:"none"},h=(e,s,h,d,p)=>{if(1===s)return((e,t,i,s)=>{const h=new Float32Array(r),d=new Float32Array(r);for(let e=0;e{const d=new Float32Array(r),p=new Float32Array(r),m=new Float32Array(r),f=new Float32Array(r),g=Math.floor(8192.5);for(let e=0;eg){const t=(e-g)/(16384-g)*l;d[e]=Math.cos(t),p[e]=Math.sin(t),m[e]=0,f[e]=1}else{const t=e/(16384-g)*l;d[e]=1,p[e]=0,m[e]=Math.cos(t),f[e]=Math.sin(t)}const y=t(e,{channelCount:2,channelCountMode:"explicit",channelInterpretation:"discrete",numberOfOutputs:2}),b=n(e,{...u,gain:0}),v=a(e,{...c,curve:d}),k=n(e,{...u,gain:0}),w=a(e,{...c,curve:p}),A=a(e,{...c,curve:o}),x=n(e,{...u,gain:0}),C=a(e,{...c,curve:m}),S=n(e,{...u,gain:0}),E=a(e,{...c,curve:f});return{connectGraph(){i.connect(y),i.connect(void 0===A.inputs?A:A.inputs[0]),y.connect(b,0),y.connect(k,0),y.connect(x,1),y.connect(S,1),A.connect(s),s.connect(void 0===v.inputs?v:v.inputs[0]),s.connect(void 0===w.inputs?w:w.inputs[0]),s.connect(void 0===C.inputs?C:C.inputs[0]),s.connect(void 0===E.inputs?E:E.inputs[0]),v.connect(b.gain),w.connect(k.gain),C.connect(x.gain),E.connect(S.gain),b.connect(h,0,0),x.connect(h,0,0),k.connect(h,0,1),S.connect(h,0,1)},disconnectGraph(){i.disconnect(y),i.disconnect(void 0===A.inputs?A:A.inputs[0]),y.disconnect(b,0),y.disconnect(k,0),y.disconnect(x,1),y.disconnect(S,1),A.disconnect(s),s.disconnect(void 0===v.inputs?v:v.inputs[0]),s.disconnect(void 0===w.inputs?w:w.inputs[0]),s.disconnect(void 0===C.inputs?C:C.inputs[0]),s.disconnect(void 0===E.inputs?E:E.inputs[0]),v.disconnect(b.gain),w.disconnect(k.gain),C.disconnect(x.gain),E.disconnect(S.gain),b.disconnect(h,0,0),x.disconnect(h,0,0),k.disconnect(h,0,1),S.disconnect(h,0,1)}}})(e,h,d,p);throw i()};return(t,{channelCount:a,channelCountMode:r,pan:o,...l})=>{if("max"===r)throw i();const u=e(t,{...l,channelCount:1,channelCountMode:r,numberOfInputs:2}),c=n(t,{...l,channelCount:a,channelCountMode:r,gain:1}),d=n(t,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:o});let{connectGraph:p,disconnectGraph:m}=h(t,a,c,d,u);Object.defineProperty(d.gain,"defaultValue",{get:()=>0}),Object.defineProperty(d.gain,"maxValue",{get:()=>1}),Object.defineProperty(d.gain,"minValue",{get:()=>-1});const f={get bufferSize(){},get channelCount(){return c.channelCount},set channelCount(e){c.channelCount!==e&&(g&&m(),({connectGraph:p,disconnectGraph:m}=h(t,e,c,d,u)),g&&p()),c.channelCount=e},get channelCountMode(){return c.channelCountMode},set channelCountMode(e){if("clamped-max"===e||"max"===e)throw i();c.channelCountMode=e},get channelInterpretation(){return c.channelInterpretation},set channelInterpretation(e){c.channelInterpretation=e},get context(){return c.context},get inputs(){return[c]},get numberOfInputs(){return c.numberOfInputs},get numberOfOutputs(){return c.numberOfOutputs},get pan(){return d.gain},addEventListener:(...e)=>c.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>c.dispatchEvent(e[0]),removeEventListener:(...e)=>c.removeEventListener(e[0],e[1],e[2])};let g=!1;return s(ht(f,u),(()=>{p(),g=!0}),(()=>{m(),g=!1}))}})(Dn,ct,pt,ca,yt,Nn),ba=((e,t)=>(n,a)=>{const i=a.channelCountMode;if("clamped-max"===i)throw t();if(void 0===n.createStereoPanner)return e(n,a);const s=n.createStereoPanner();return nt(s,a),it(s,a,"pan"),Object.defineProperty(s,"channelCountMode",{get:()=>i,set:e=>{if(e!==i)throw t()}}),s})(ya,yt),va=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,pan:l.pan.value};l=t(o,e)}return s.set(o,l),u?await e(o,r.pan,l.pan):await a(o,r.pan,l.pan),fe(l)?await i(r,o,l.inputs[0]):await i(r,o,l),l})(r,o)}}})(vn,ba,we,wn,Kt),ka=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=i(e),l={...At,...r},u=n(o,l),c=s(o);super(e,!1,u,c?a():null),this._pan=t(this,c,u.pan)}get pan(){return this._pan}})(on,xn,ba,va,Zt,Qt),wa=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,curve:r.curve,oversample:r.oversample};r=e(s,t)}return a.set(s,r),fe(r)?await n(i,s,r.inputs[0]):await n(i,s,r),r})(i,s)}}})(ca,we,Kt),Aa=((e,t,n,a,i,s,r)=>class extends e{constructor(e,t){const o=i(e),l={...Ct,...t},u=n(o,l);super(e,!0,u,s(o)?a():null),this._isCurveNullified=!1,this._nativeWaveShaperNode=u,r(this,1)}get curve(){return this._isCurveNullified?null:this._nativeWaveShaperNode.curve}set curve(e){if(null===e)this._isCurveNullified=!0,this._nativeWaveShaperNode.curve=new Float32Array([0,0]);else{if(e.length<2)throw t();this._isCurveNullified=!1,this._nativeWaveShaperNode.curve=e}}get oversample(){return this._nativeWaveShaperNode.oversample}set oversample(e){this._nativeWaveShaperNode.oversample=e}})(on,$e,ca,wa,Zt,Qt,Tn),xa=(e=>null!==e&&e.isSecureContext)(Gt),Ca=(e=>(t,n,a)=>{Object.defineProperties(e,{currentFrame:{configurable:!0,get:()=>Math.round(t*n)},currentTime:{configurable:!0,get:()=>t}});try{return a()}finally{null!==e&&(delete e.currentFrame,delete e.currentTime)}})(Gt),Sa=new WeakMap,Ea=((e,t)=>n=>{let a=e.get(n);if(void 0!==a)return a;if(null===t)throw new Error("Missing the native OfflineAudioContext constructor.");return a=new t(1,1,44100),e.set(n,a),a})(Sa,Yt),_a=xa?((e,t,n,a,i,s,r,o,l,u,c,h,d)=>{let p=0;return(m,f,g={credentials:"omit"})=>{const y=c.get(m);if(void 0!==y&&y.has(f))return Promise.resolve();const b=u.get(m);if(void 0!==b){const e=b.get(f);if(void 0!==e)return e}const v=s(m),k=void 0===v.audioWorklet?i(f).then((([e,t])=>{const[a,i]=L(e,t);return n(`${a};((a,b)=>{(a[b]=a[b]||[]).push((AudioWorkletProcessor,global,registerProcessor,sampleRate,self,window)=>{${i}\n})})(window,'_AWGS')`)})).then((()=>{const e=d._AWGS.pop();if(void 0===e)throw new SyntaxError;a(v.currentTime,v.sampleRate,(()=>e(class{},void 0,((e,n)=>{if(""===e.trim())throw t();const a=O.get(v);if(void 0!==a){if(a.has(e))throw t();j(n),P(n.parameterDescriptors),a.set(e,n)}else j(n),P(n.parameterDescriptors),O.set(v,new Map([[e,n]]))}),v.sampleRate,void 0,void 0)))})):Promise.all([i(f),Promise.resolve(e(h,h))]).then((([[e,t],n])=>{const a=p+1;p=a;const[i,s]=L(e,t),u=new Blob([`${i};((AudioWorkletProcessor,registerProcessor)=>{${s}\n})(${n?"AudioWorkletProcessor":"class extends AudioWorkletProcessor {__b=new WeakSet();constructor(){super();(p=>p.postMessage=(q=>(m,t)=>q.call(p,m,t?t.filter(u=>!this.__b.has(u)):t))(p.postMessage))(this.port)}}"},(n,p)=>registerProcessor(n,class extends p{${n?"":"__c = (a) => a.forEach(e=>this.__b.add(e.buffer));"}process(i,o,p){${n?"":"i.forEach(this.__c);o.forEach(this.__c);this.__c(Object.values(p));"}return super.process(i.map(j=>j.some(k=>k.length===0)?[]:j),o,p)}}));registerProcessor('__sac${a}',class extends AudioWorkletProcessor{process(){return !1}})`],{type:"application/javascript; charset=utf-8"}),c=URL.createObjectURL(u);return v.audioWorklet.addModule(c,g).then((()=>{if(o(v))return v;const e=r(v);return e.audioWorklet.addModule(c,g).then((()=>e))})).then((e=>{if(null===l)throw new SyntaxError;try{new l(e,`__sac${a}`)}catch{throw new SyntaxError}})).finally((()=>URL.revokeObjectURL(c)))}));return void 0===b?u.set(m,new Map([[f,k]])):b.set(f,k),k.then((()=>{const e=c.get(m);void 0===e?c.set(m,new Set([f])):e.add(f)})).finally((()=>{const e=u.get(m);void 0!==e&&e.delete(f)})),k}})(Vt,yt,(e=>t=>new Promise(((n,a)=>{if(null===e)return void a(new SyntaxError);const i=e.document.head;if(null===i)a(new SyntaxError);else{const s=e.document.createElement("script"),r=new Blob([t],{type:"application/javascript"}),o=URL.createObjectURL(r),l=e.onerror,u=()=>{e.onerror=l,URL.revokeObjectURL(o)};e.onerror=(t,n,i,s,r)=>n===o||n===e.location.href&&1===i&&1===s?(u(),a(r),!1):null!==l?l(t,n,i,s,r):void 0,s.onerror=()=>{u(),a(new SyntaxError)},s.onload=()=>{u(),n()},s.src=o,s.type="module",i.appendChild(s)}})))(Gt),Ca,(e=>async t=>{try{const e=await fetch(t);if(e.ok)return[await e.text(),e.url]}catch{}throw e()})((()=>new DOMException("","AbortError"))),Zt,Ea,Qt,rn,new WeakMap,new WeakMap,((e,t)=>async()=>{if(null===e)return!0;if(null===t)return!1;const n=new Blob(['class A extends AudioWorkletProcessor{process(i){this.port.postMessage(i,[i[0][0].buffer])}}registerProcessor("a",A)'],{type:"application/javascript; charset=utf-8"}),a=new t(1,128,44100),i=URL.createObjectURL(n);let s=!1,r=!1;try{await a.audioWorklet.addModule(i);const t=new e(a,"a",{numberOfOutputs:0}),n=a.createOscillator();t.port.onmessage=()=>s=!0,t.onprocessorerror=()=>r=!0,n.connect(t),n.start(0),await a.startRendering(),await new Promise((e=>setTimeout(e)))}catch{}finally{URL.revokeObjectURL(i)}return s&&!r})(rn,Yt),Gt):void 0,Ta=((e,t)=>n=>e(n)||t(n))(nn,Qt),Ia=((e,t,n,a,i,s,r,o,l,u,c)=>(h,d)=>{const p=r(h)?h:s(h);if(i.has(d)){const e=n();return Promise.reject(e)}try{i.add(d)}catch{}return t(l,(()=>l(p)))?p.decodeAudioData(d).then((n=>(We(d).catch((()=>{})),t(o,(()=>o(n)))||c(n),e.add(n),n))):new Promise(((t,n)=>{const i=async()=>{try{await We(d)}catch{}},s=e=>{n(e),i()};try{p.decodeAudioData(d,(n=>{"function"!=typeof n.copyFromChannel&&(u(n),J(n)),e.add(n),i().then((()=>t(n)))}),(e=>{s(null===e?a():e)}))}catch(e){s(e)}}))})(cn,Vt,(()=>new DOMException("","DataCloneError")),(()=>new DOMException("","EncodingError")),new WeakSet,Zt,Ta,Y,Je,mn,fn),Na=((e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f,g,y,b,v)=>class extends m{constructor(t,n){super(t,n),this._nativeContext=t,this._audioWorklet=void 0===e?void 0:{addModule:(t,n)=>e(this,t,n)}}get audioWorklet(){return this._audioWorklet}createAnalyser(){return new t(this)}createBiquadFilter(){return new i(this)}createBuffer(e,t,a){return new n({length:t,numberOfChannels:e,sampleRate:a})}createBufferSource(){return new a(this)}createChannelMerger(e=6){return new s(this,{numberOfInputs:e})}createChannelSplitter(e=6){return new r(this,{numberOfOutputs:e})}createConstantSource(){return new o(this)}createConvolver(){return new l(this)}createDelay(e=1){return new c(this,{maxDelayTime:e})}createDynamicsCompressor(){return new h(this)}createGain(){return new d(this)}createIIRFilter(e,t){return new p(this,{feedback:t,feedforward:e})}createOscillator(){return new f(this)}createPanner(){return new g(this)}createPeriodicWave(e,t,n={disableNormalization:!1}){return new y(this,{...n,imag:t,real:e})}createStereoPanner(){return new b(this)}createWaveShaper(){return new v(this)}decodeAudioData(e,t,n){return u(this._nativeContext,e).then((e=>("function"==typeof t&&t(e),e)),(e=>{throw"function"==typeof n&&n(e),e}))}})(_a,un,gn,Sn,In,On,Bn,jn,Wn,Ia,qn,$n,Xn,ta,ia,oa,ma,ga,ka,Aa),Ra=((e,t,n,a)=>class extends e{constructor(e,i){const s=n(e),r=t(s,i);if(a(s))throw TypeError();super(e,!0,r,null),this._nativeMediaElementAudioSourceNode=r}get mediaElement(){return this._nativeMediaElementAudioSourceNode.mediaElement}})(on,((e,t)=>e.createMediaElementSource(t.mediaElement)),Zt,Qt),Da=((e,t,n,a)=>class extends e{constructor(e,i){const s=n(e);if(a(s))throw new TypeError;const r={...Qe,...i},o=t(s,r);super(e,!1,o,null),this._nativeMediaStreamAudioDestinationNode=o}get stream(){return this._nativeMediaStreamAudioDestinationNode.stream}})(on,((e,t)=>{const n=e.createMediaStreamDestination();return nt(n,t),1===n.numberOfOutputs&&Object.defineProperty(n,"numberOfOutputs",{get:()=>0}),n}),Zt,Qt),za=((e,t,n,a)=>class extends e{constructor(e,i){const s=n(e),r=t(s,i);if(a(s))throw new TypeError;super(e,!0,r,null),this._nativeMediaStreamAudioSourceNode=r}get mediaStream(){return this._nativeMediaStreamAudioSourceNode.mediaStream}})(on,((e,{mediaStream:t})=>{const n=t.getAudioTracks();n.sort(((e,t)=>e.idt.id?1:0));const a=n.slice(0,1),i=e.createMediaStreamSource(new MediaStream(a));return Object.defineProperty(i,"mediaStream",{value:t}),i}),Zt,Qt),Oa=((e,t)=>(n,{mediaStreamTrack:a})=>{if("function"==typeof n.createMediaStreamTrackSource)return n.createMediaStreamTrackSource(a);const i=new MediaStream([a]),s=n.createMediaStreamSource(i);if("audio"!==a.kind)throw e();if(t(n))throw new TypeError;return s})($e,Qt),Ma=((e,t,n)=>class extends e{constructor(e,a){const i=n(e);super(e,!0,t(i,a),null)}})(on,Oa,Zt),Ba=((e,t,n,a,i,s,r,o,l)=>class extends e{constructor(e={}){if(null===l)throw new Error("Missing the native AudioContext constructor.");let t;try{t=new l(e)}catch(e){if(12===e.code&&"sampleRate is not in range"===e.message)throw n();throw e}if(null===t)throw a();if(!ue(e.latencyHint))throw new TypeError(`The provided value '${e.latencyHint}' is not a valid enum value of type AudioContextLatencyCategory.`);if(void 0!==e.sampleRate&&t.sampleRate!==e.sampleRate)throw n();super(t,2);const{latencyHint:i}=e,{sampleRate:s}=t;if(this._baseLatency="number"==typeof t.baseLatency?t.baseLatency:"balanced"===i?512/s:"interactive"===i||void 0===i?256/s:"playback"===i?1024/s:128*Math.max(2,Math.min(128,Math.round(i*s/128)))/s,this._nativeAudioContext=t,"webkitAudioContext"===l.name?(this._nativeGainNode=t.createGain(),this._nativeOscillatorNode=t.createOscillator(),this._nativeGainNode.gain.value=1e-37,this._nativeOscillatorNode.connect(this._nativeGainNode).connect(t.destination),this._nativeOscillatorNode.start()):(this._nativeGainNode=null,this._nativeOscillatorNode=null),this._state=null,"running"===t.state){this._state="suspended";const e=()=>{"suspended"===this._state&&(this._state=null),t.removeEventListener("statechange",e)};t.addEventListener("statechange",e)}}get baseLatency(){return this._baseLatency}get state(){return null!==this._state?this._state:this._nativeAudioContext.state}close(){return"closed"===this.state?this._nativeAudioContext.close().then((()=>{throw t()})):("suspended"===this._state&&(this._state=null),this._nativeAudioContext.close().then((()=>{null!==this._nativeGainNode&&null!==this._nativeOscillatorNode&&(this._nativeOscillatorNode.stop(),this._nativeGainNode.disconnect(),this._nativeOscillatorNode.disconnect()),le(this)})))}createMediaElementSource(e){return new i(this,{mediaElement:e})}createMediaStreamDestination(){return new s(this)}createMediaStreamSource(e){return new r(this,{mediaStream:e})}createMediaStreamTrackSource(e){return new o(this,{mediaStreamTrack:e})}resume(){return"suspended"===this._state?new Promise(((e,t)=>{const n=()=>{this._nativeAudioContext.removeEventListener("statechange",n),"running"===this._nativeAudioContext.state?e():this.resume().then(e,t)};this._nativeAudioContext.addEventListener("statechange",n)})):this._nativeAudioContext.resume().catch((e=>{if(void 0===e||15===e.code)throw t();throw e}))}suspend(){return this._nativeAudioContext.suspend().catch((e=>{if(void 0===e)throw t();throw e}))}})(Na,$e,yt,xt,Ra,Da,za,Ma,tn),Fa=(e=>t=>{const n=e.get(t);if(void 0===n)throw new Error("The context has no set of AudioWorkletNodes.");return n})(aa),La=(e=>(t,n)=>{e(t).add(n)})(Fa),Pa=(e=>(t,n,a=0,i=0)=>{const s=t[a];if(void 0===s)throw e();return _e(n)?s.connect(n,0,i):s.connect(n,0)})(Q),ja=(e=>(t,n)=>{e(t).delete(n)})(Fa),Va=(e=>(t,n=void 0,a=void 0,i=0)=>void 0===n?t.forEach((e=>e.disconnect())):"number"==typeof n?qe(e,t,n).disconnect():_e(n)?void 0===a?t.forEach((e=>e.disconnect(n))):void 0===i?qe(e,t,a).disconnect(n,0):qe(e,t,a).disconnect(n,0,i):void 0===a?t.forEach((e=>e.disconnect(n))):qe(e,t,a).disconnect(n,0))(Q),Ua=new WeakMap,Wa=((e,t)=>n=>t(e,n))(Ua,V),Ga=((e,t,n,a,i,s,r,o,l,u,c,h,d)=>(p,m,f,g)=>{if(0===g.numberOfInputs&&0===g.numberOfOutputs)throw l();const y=Array.isArray(g.outputChannelCount)?g.outputChannelCount:Array.from(g.outputChannelCount);if(y.some((e=>e<1)))throw l();if(y.length!==g.numberOfOutputs)throw t();if("explicit"!==g.channelCountMode)throw l();const b=g.channelCount*g.numberOfInputs,v=y.reduce(((e,t)=>e+t),0),k=void 0===f.parameterDescriptors?0:f.parameterDescriptors.length;if(b+k>6||v>6)throw l();const w=new MessageChannel,A=[],x=[];for(let e=0;evoid 0===e?0:e},maxValue:{get:()=>void 0===t?ne:t},minValue:{get:()=>void 0===n?te:n}}),C.push(i)}const S=a(p,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:Math.max(1,b+k)}),E=ot(m,p.sampleRate),_=o(p,E,b+k,Math.max(1,v)),T=i(p,{channelCount:Math.max(1,v),channelCountMode:"explicit",channelInterpretation:"discrete",numberOfOutputs:Math.max(1,v)}),I=[];for(let e=0;e{const n=C[t];return n.connect(S,0,b+t),n.start(0),[e,n.offset]})));S.connect(_);let R=g.channelInterpretation,D=null;const z=0===g.numberOfOutputs?[_]:I,O={get bufferSize(){return E},get channelCount(){return g.channelCount},set channelCount(e){throw n()},get channelCountMode(){return g.channelCountMode},set channelCountMode(e){throw n()},get channelInterpretation(){return R},set channelInterpretation(e){for(const t of A)t.channelInterpretation=e;R=e},get context(){return _.context},get inputs(){return A},get numberOfInputs(){return g.numberOfInputs},get numberOfOutputs(){return g.numberOfOutputs},get onprocessorerror(){return D},set onprocessorerror(e){"function"==typeof D&&O.removeEventListener("processorerror",D),D="function"==typeof e?e:null,"function"==typeof D&&O.addEventListener("processorerror",D)},get parameters(){return N},get port(){return w.port2},addEventListener:(...e)=>_.addEventListener(e[0],e[1],e[2]),connect:e.bind(null,z),disconnect:u.bind(null,z),dispatchEvent:(...e)=>_.dispatchEvent(e[0]),removeEventListener:(...e)=>_.removeEventListener(e[0],e[1],e[2])},B=new Map;var F,L;w.port1.addEventListener=(F=w.port1.addEventListener,(...e)=>{if("message"===e[0]){const t="function"==typeof e[1]?e[1]:"object"==typeof e[1]&&null!==e[1]&&"function"==typeof e[1].handleEvent?e[1].handleEvent:null;if(null!==t){const n=B.get(e[1]);void 0!==n?e[1]=n:(e[1]=e=>{c(p.currentTime,p.sampleRate,(()=>t(e)))},B.set(t,e[1]))}}return F.call(w.port1,e[0],e[1],e[2])}),w.port1.removeEventListener=(L=w.port1.removeEventListener,(...e)=>{if("message"===e[0]){const t=B.get(e[1]);void 0!==t&&(B.delete(e[1]),e[1]=t)}return L.call(w.port1,e[0],e[1],e[2])});let P=null;Object.defineProperty(w.port1,"onmessage",{get:()=>P,set:e=>{"function"==typeof P&&w.port1.removeEventListener("message",P),P="function"==typeof e?e:null,"function"==typeof P&&(w.port1.addEventListener("message",P),w.port1.start())}}),f.prototype.port=w.port1;let j=null;const V=((e,t,n,a)=>{let i=M.get(e);void 0===i&&(i=new WeakMap,M.set(e,i));const s=lt(n,a);return i.set(t,s),s})(p,O,f,g);V.then((e=>j=e));const U=Be(g.numberOfInputs,g.channelCount),W=Be(g.numberOfOutputs,y),G=void 0===f.parameterDescriptors?[]:f.parameterDescriptors.reduce(((e,{name:t})=>({...e,[t]:new Float32Array(128)})),{});let q=!0;const H=()=>{g.numberOfOutputs>0&&_.disconnect(T);for(let e=0,t=0;e{if(null!==j){const n=h(O);for(let a=0;a{Oe(e,G,t,b+n,a)}));for(let e=0;e{if(n[t].size>0)return K.set(t,E/128),e;const a=K.get(t);return void 0===a?[]:(e.every((e=>e.every((e=>0===e))))&&(1===a?K.delete(t):K.set(t,a-1)),e)})),i=c(p.currentTime+a/p.sampleRate,p.sampleRate,(()=>j.process(e,W,G)));q=i;for(let e=0,n=0;e_.connect(Z).connect(p.destination),Y=()=>{_.disconnect(Z),Z.disconnect()};return X(),d(O,(()=>{if(q){Y(),g.numberOfOutputs>0&&_.connect(T);for(let e=0,t=0;e{q&&(X(),H()),$=!1}))})(Pa,Q,$e,Dn,ct,Ln,pt,gt,yt,Va,Ca,Wa,Nn),qa=((e,t,n,a,i)=>(s,r,o,l,u,c)=>{if(null!==o)try{const t=new o(s,l,c),a=new Map;let r=null;if(Object.defineProperties(t,{channelCount:{get:()=>c.channelCount,set:()=>{throw e()}},channelCountMode:{get:()=>"explicit",set:()=>{throw e()}},onprocessorerror:{get:()=>r,set:e=>{"function"==typeof r&&t.removeEventListener("processorerror",r),r="function"==typeof e?e:null,"function"==typeof r&&t.addEventListener("processorerror",r)}}}),t.addEventListener=(d=t.addEventListener,(...e)=>{if("processorerror"===e[0]){const t="function"==typeof e[1]?e[1]:"object"==typeof e[1]&&null!==e[1]&&"function"==typeof e[1].handleEvent?e[1].handleEvent:null;if(null!==t){const n=a.get(e[1]);void 0!==n?e[1]=n:(e[1]=n=>{"error"===n.type?(Object.defineProperties(n,{type:{value:"processorerror"}}),t(n)):t(new ErrorEvent(e[0],{...n}))},a.set(t,e[1]))}}return d.call(t,"error",e[1],e[2]),d.call(t,...e)}),t.removeEventListener=(h=t.removeEventListener,(...e)=>{if("processorerror"===e[0]){const t=a.get(e[1]);void 0!==t&&(a.delete(e[1]),e[1]=t)}return h.call(t,"error",e[1],e[2]),h.call(t,e[0],e[1],e[2])}),0!==c.numberOfOutputs){const e=n(s,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});t.connect(e).connect(s.destination);return i(t,(()=>e.disconnect()),(()=>e.connect(s.destination)))}return t}catch(e){if(11===e.code)throw a();throw e}var h,d;if(void 0===u)throw a();return(e=>{const{port1:t}=new MessageChannel;try{t.postMessage(e)}finally{t.close()}})(c),t(s,r,u,c)})($e,Ga,pt,yt,Nn),Ha=((e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f)=>(g,y,b)=>{const v=new WeakMap;let k=null;return{render(w,A){o(A,w);const x=v.get(A);return void 0!==x?Promise.resolve(x):(async(o,w)=>{let A=c(o),x=null;const C=X(A,w),S=Array.isArray(y.outputChannelCount)?y.outputChannelCount:Array.from(y.outputChannelCount);if(null===h){const e=S.reduce(((e,t)=>e+t),0),n=i(w,{channelCount:Math.max(1,e),channelCountMode:"explicit",channelInterpretation:"discrete",numberOfOutputs:Math.max(1,e)}),s=[];for(let e=0;e{const l=new d(n,128*Math.ceil(o.context.length/128),w.sampleRate),u=[],c=[];for(let e=0;e{const t=s(l,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",offset:e.value});return await p(l,e,t.offset),t}))),g=a(l,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:Math.max(1,e+t)});for(let e=0;em(o,l,e)))),f(l)};k=Fe(o,0===n?null:await l(),w,y,S,b,u)}const e=await k,t=n(w,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}),[l,c,h]=x;null!==e&&(t.buffer=e,t.start(0)),t.connect(l);for(let e=0,t=0;et=>e.get(t))(Sa),$a=(e=>(t,n)=>{e.set(t,n)})(Ua),Za=xa?((e,t,n,a,i,s,r,o,l,u,c,h,d,p)=>class extends t{constructor(t,p,m){var f;const g=o(t),y=l(g),b=c({...ze,...m});d(b);const v=O.get(g),k=null==v?void 0:v.get(p),w=y||"closed"!==g.state?g:null!==(f=r(g))&&void 0!==f?f:g,A=i(w,y?null:t.baseLatency,u,p,k,b);super(t,!0,A,y?a(p,b,k):null);const x=[];A.parameters.forEach(((e,t)=>{const a=n(this,y,e);x.push([t,a])})),this._nativeAudioWorkletNode=A,this._onprocessorerror=null,this._parameters=new De(x),y&&e(g,this);const{activeInputs:C}=s(this);h(A,C)}get onprocessorerror(){return this._onprocessorerror}set onprocessorerror(e){const t="function"==typeof e?p(this,e):null;this._nativeAudioWorkletNode.onprocessorerror=t;const n=this._nativeAudioWorkletNode.onprocessorerror;this._onprocessorerror=null!==n&&n===t?e:n}get parameters(){return null===this._parameters?this._nativeAudioWorkletNode.parameters:this._parameters}get port(){return this._nativeAudioWorkletNode.port}})(La,on,xn,Ha,qa,se,Ka,Zt,Qt,rn,(e=>({...e,outputChannelCount:void 0!==e.outputChannelCount?e.outputChannelCount:1===e.numberOfInputs&&1===e.numberOfOutputs?[e.channelCount]:Array.from({length:e.numberOfOutputs},(()=>1))})),$a,(e=>{const{port1:t,port2:n}=new MessageChannel;try{t.postMessage(e)}finally{t.close(),n.close()}}),Mt):void 0,Xa=(((e,t,n,a,i)=>{})($e,yt,xt,ia,tn),((e,t)=>(n,a,i)=>{if(null===t)throw new Error("Missing the native OfflineAudioContext constructor.");try{return new t(n,a,i)}catch(t){if("SyntaxError"===t.name)throw e();throw t}})(yt,Yt)),Ya=((e,t,n,a,i,s,r,o)=>(l,u)=>n(l).render(l,u).then((()=>Promise.all(Array.from(a(u)).map((e=>n(e).render(e,u)))))).then((()=>i(u))).then((n=>("function"!=typeof n.copyFromChannel?(r(n),J(n)):t(s,(()=>s(n)))||o(n),e.add(n),n))))(cn,Vt,Ht,Fa,Qn,Y,mn,fn),Qa=(((e,t,n,a,i)=>{})(Vt,$e,Xa,ia,Ya),((e,t,n,a,i)=>class extends e{constructor(e,n,i){let s;if("number"==typeof e&&void 0!==n&&void 0!==i)s={length:n,numberOfChannels:e,sampleRate:i};else{if("object"!=typeof e)throw new Error("The given parameters are not valid.");s=e}const{length:r,numberOfChannels:o,sampleRate:l}={...bt,...s},u=a(o,r,l);t(Je,(()=>Je(u)))||u.addEventListener("statechange",(()=>{let e=0;const t=n=>{"running"===this._state&&(e>0?(u.removeEventListener("statechange",t),n.stopImmediatePropagation(),this._waitForThePromiseToSettle(n)):e+=1)};return t})()),super(u,o),this._length=r,this._nativeOfflineAudioContext=u,this._state=null}get length(){return void 0===this._nativeOfflineAudioContext.length?this._length:this._nativeOfflineAudioContext.length}get state(){return null===this._state?this._nativeOfflineAudioContext.state:this._state}startRendering(){return"running"===this._state?Promise.reject(n()):(this._state="running",i(this.destination,this._nativeOfflineAudioContext).finally((()=>{this._state=null,le(this)})))}_waitForThePromiseToSettle(e){null===this._state?this._nativeOfflineAudioContext.dispatchEvent(e):setTimeout((()=>this._waitForThePromiseToSettle(e)))}})(Na,Vt,$e,Xa,Ya)),Ja=((e,t)=>n=>{const a=e.get(n);return t(a)||t(n)})(R,nn),ei=((e,t)=>n=>e.has(n)||t(n))(T,an),ti=((e,t)=>n=>e.has(n)||t(n))(N,sn),ni=((e,t)=>n=>{const a=e.get(n);return t(a)||t(n)})(R,Qt),ai=()=>(async(e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f)=>{if(e(t,t)&&e(n,n)&&e(i,i)&&e(s,s)&&e(o,o)&&e(l,l)&&e(u,u)&&e(c,c)&&e(h,h)&&e(d,d)&&e(p,p))return(await Promise.all([e(a,a),e(r,r),e(m,m),e(f,f)])).every((e=>e));return!1})(Vt,(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createBuffer(1,1,44100);if(void 0===t.copyToChannel)return!0;const n=new Float32Array(2);try{t.copyFromChannel(n,0,0)}catch{return!1}return!0})(Yt),(e=>()=>{if(null===e)return!1;if(void 0!==e.prototype&&void 0!==e.prototype.close)return!0;const t=new e,n=void 0!==t.close;try{t.close()}catch{}return n})(tn),(e=>()=>{if(null===e)return Promise.resolve(!1);const t=new e(1,1,44100);return new Promise((e=>{let n=!0;const a=a=>{n&&(n=!1,t.startRendering(),e(a instanceof TypeError))};let i;try{i=t.decodeAudioData(null,(()=>{}),a)}catch(e){a(e)}void 0!==i&&i.catch(a)}))})(Yt),(e=>()=>{if(null===e)return!1;let t;try{t=new e({latencyHint:"balanced"})}catch{return!1}return t.close(),!0})(tn),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createGain(),n=t.connect(t)===t;return t.disconnect(t),n})(Yt),((e,t)=>async()=>{if(null===e)return!0;if(null===t)return!1;const n=new Blob(['let c,p;class A extends AudioWorkletProcessor{constructor(){super();this.port.onmessage=(e)=>{p=e.data;p.onmessage=()=>{p.postMessage(c);p.close()};this.port.postMessage(0)}}process(){c=1}}registerProcessor("a",A)'],{type:"application/javascript; charset=utf-8"}),a=new MessageChannel,i=new t(1,128,44100),s=URL.createObjectURL(n);let r=!1;try{await i.audioWorklet.addModule(s);const t=new e(i,"a",{numberOfOutputs:0}),n=i.createOscillator();await new Promise((e=>{t.port.onmessage=()=>e(),t.port.postMessage(a.port2,[a.port2])})),t.port.onmessage=()=>r=!0,n.connect(t),n.start(0),await i.startRendering(),r=await new Promise((e=>{a.port1.onmessage=({data:t})=>e(1===t),a.port1.postMessage(0)}))}catch{}finally{a.port1.close(),URL.revokeObjectURL(s)}return r})(rn,Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createChannelMerger();if("max"===t.channelCountMode)return!0;try{t.channelCount=2}catch{return!0}return!1})(Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100);return void 0===t.createConstantSource||t.createConstantSource().offset.maxValue!==Number.POSITIVE_INFINITY})(Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100),n=t.createConvolver();n.buffer=t.createBuffer(1,1,t.sampleRate);try{n.buffer=t.createBuffer(1,1,t.sampleRate)}catch{return!1}return!0})(Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createConvolver();try{t.channelCount=1}catch{return!1}return!0})(Yt),Dt,(e=>()=>null!==e&&e.hasOwnProperty("isSecureContext"))(Gt),(e=>()=>{if(null===e)return!1;const t=new e;try{return t.createMediaStreamSource(new MediaStream),!1}catch(e){return!0}finally{t.close()}})(tn),(e=>()=>{if(null===e)return Promise.resolve(!1);const t=new e(1,1,44100);if(void 0===t.createStereoPanner)return Promise.resolve(!0);if(void 0===t.createConstantSource)return Promise.resolve(!0);const n=t.createConstantSource(),a=t.createStereoPanner();return n.channelCount=1,n.offset.value=1,a.channelCount=1,n.start(),n.connect(a).connect(t.destination),t.startRendering().then((e=>1!==e.getChannelData(0)[0]))})(Yt),zt);function ii(e,t){if(!e)throw new Error(t)}function si(e,t,n=1/0){if(!(t<=e&&e<=n))throw new RangeError(`Value must be within [${t}, ${n}], got: ${e}`)}function ri(e){e.isOffline||"running"===e.state||ci('The AudioContext is "suspended". Invoke Tone.start() from a user action to start the audio.')}let oi=console;function li(e){oi=e}function ui(...e){oi.log(...e)}function ci(...e){oi.warn(...e)}function hi(e){return void 0===e}function di(e){return!hi(e)}function pi(e){return"function"==typeof e}function mi(e){return"number"==typeof e}function fi(e){return"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object}function gi(e){return"boolean"==typeof e}function yi(e){return Array.isArray(e)}function bi(e){return"string"==typeof e}function vi(e){return bi(e)&&/^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i.test(e)}const ki="object"==typeof self?self:null,wi=ki&&(ki.hasOwnProperty("AudioContext")||ki.hasOwnProperty("webkitAudioContext"));function Ai(e,t,n,a){var i,s=arguments.length,r=s<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,n):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,n,a);else for(var o=e.length-1;o>=0;o--)(i=e[o])&&(r=(s<3?i(r):s>3?i(t,n,r):i(t,n))||r);return s>3&&r&&Object.defineProperty(t,n,r),r}function xi(e,t,n,a){return new(n||(n=Promise))((function(i,s){function r(e){try{l(a.next(e))}catch(e){s(e)}}function o(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,o)}l((a=a.apply(e,t||[])).next())}))}Object.create;Object.create;"function"==typeof SuppressedError&&SuppressedError;class Ci{constructor(e,t,n){this._callback=e,this._type=t,this._updateInterval=n,this._createClock()}_createWorker(){const e=new Blob([`\n\t\t\t// the initial timeout time\n\t\t\tlet timeoutTime = ${(1e3*this._updateInterval).toFixed(1)};\n\t\t\t// onmessage callback\n\t\t\tself.onmessage = function(msg){\n\t\t\t\ttimeoutTime = parseInt(msg.data);\n\t\t\t};\n\t\t\t// the tick function which posts a message\n\t\t\t// and schedules a new tick\n\t\t\tfunction tick(){\n\t\t\t\tsetTimeout(tick, timeoutTime);\n\t\t\t\tself.postMessage('tick');\n\t\t\t}\n\t\t\t// call tick initially\n\t\t\ttick();\n\t\t\t`],{type:"text/javascript"}),t=URL.createObjectURL(e),n=new Worker(t);n.onmessage=this._callback.bind(this),this._worker=n}_createTimeout(){this._timeout=setTimeout((()=>{this._createTimeout(),this._callback()}),1e3*this._updateInterval)}_createClock(){if("worker"===this._type)try{this._createWorker()}catch(e){this._type="timeout",this._createClock()}else"timeout"===this._type&&this._createTimeout()}_disposeClock(){this._timeout&&(clearTimeout(this._timeout),this._timeout=0),this._worker&&(this._worker.terminate(),this._worker.onmessage=null)}get updateInterval(){return this._updateInterval}set updateInterval(e){this._updateInterval=Math.max(e,128/44100),"worker"===this._type&&this._worker.postMessage(Math.max(1e3*e,1))}get type(){return this._type}set type(e){this._disposeClock(),this._type=e,this._createClock()}dispose(){this._disposeClock()}}function Si(e){return ti(e)}function Ei(e){return ei(e)}function _i(e){return ni(e)}function Ti(e){return Ja(e)}function Ii(e){return e instanceof AudioBuffer}function Ni(e,t){return"value"===e||Si(t)||Ei(t)||Ii(t)}function Ri(e,...t){if(!t.length)return e;const n=t.shift();if(fi(e)&&fi(n))for(const t in n)Ni(t,n[t])?e[t]=n[t]:fi(n[t])?(e[t]||Object.assign(e,{[t]:{}}),Ri(e[t],n[t])):Object.assign(e,{[t]:n[t]});return Ri(e,...t)}function Di(e,t,n=[],a){const i={},s=Array.from(t);if(fi(s[0])&&a&&!Reflect.has(s[0],a)){Object.keys(s[0]).some((t=>Reflect.has(e,t)))||(Ri(i,{[a]:s[0]}),n.splice(n.indexOf(a),1),s.shift())}if(1===s.length&&fi(s[0]))Ri(i,s[0]);else for(let e=0;e{Reflect.has(e,t)&&delete e[t]})),e}class Mi{constructor(){this.debug=!1,this._wasDisposed=!1}static getDefaults(){return{}}log(...e){(this.debug||ki&&this.toString()===ki.TONE_DEBUG_CLASS)&&ui(this,...e)}dispose(){return this._wasDisposed=!0,this}get disposed(){return this._wasDisposed}toString(){return this.name}}Mi.version=s;const Bi=1e-6;function Fi(e,t){return e>t+Bi}function Li(e,t){return Fi(e,t)||ji(e,t)}function Pi(e,t){return e+Bithis.memory){const e=this.length-this.memory;this._timeline.splice(0,e)}return this}remove(e){const t=this._timeline.indexOf(e);return-1!==t&&this._timeline.splice(t,1),this}get(e,t="time"){const n=this._search(e,t);return-1!==n?this._timeline[n]:null}peek(){return this._timeline[0]}shift(){return this._timeline.shift()}getAfter(e,t="time"){const n=this._search(e,t);return n+10&&this._timeline[t-1].time=0?this._timeline[n-1]:null}cancel(e){if(this._timeline.length>1){let t=this._search(e);if(t>=0)if(ji(this._timeline[t].time,e)){for(let n=t;n>=0&&ji(this._timeline[n].time,e);n--)t=n;this._timeline=this._timeline.slice(0,t)}else this._timeline=this._timeline.slice(0,t+1);else this._timeline=[]}else 1===this._timeline.length&&Li(this._timeline[0].time,e)&&(this._timeline=[]);return this}cancelBefore(e){const t=this._search(e);return t>=0&&(this._timeline=this._timeline.slice(t+1)),this}previousEvent(e){const t=this._timeline.indexOf(e);return t>0?this._timeline[t-1]:null}_search(e,t="time"){if(0===this._timeline.length)return-1;let n=0;const a=this._timeline.length;let i=a;if(a>0&&this._timeline[a-1][t]<=e)return a-1;for(;n=0&&this._timeline[n].time>=e;)n--;return this._iterate(t,n+1),this}forEachAtTime(e,t){const n=this._search(e);if(-1!==n&&ji(this._timeline[n].time,e)){let a=n;for(let t=n;t>=0&&ji(this._timeline[t].time,e);t--)a=t;this._iterate((e=>{t(e)}),a,n)}return this}dispose(){return super.dispose(),this._timeline=[],this}}const Wi=[];function Gi(e){Wi.push(e)}const qi=[];function Hi(e){qi.push(e)}class Ki extends Mi{constructor(){super(...arguments),this.name="Emitter"}on(e,t){return e.split(/\W+/).forEach((e=>{hi(this._events)&&(this._events={}),this._events.hasOwnProperty(e)||(this._events[e]=[]),this._events[e].push(t)})),this}once(e,t){const n=(...a)=>{t(...a),this.off(e,n)};return this.on(e,n),this}off(e,t){return e.split(/\W+/).forEach((n=>{if(hi(this._events)&&(this._events={}),this._events.hasOwnProperty(e))if(hi(t))this._events[e]=[];else{const n=this._events[e];for(let e=n.length-1;e>=0;e--)n[e]===t&&n.splice(e,1)}})),this}emit(e,...t){if(this._events&&this._events.hasOwnProperty(e)){const n=this._events[e].slice(0);for(let e=0,a=n.length;e{const n=Object.getOwnPropertyDescriptor(Ki.prototype,t);Object.defineProperty(e.prototype,t,n)}))}dispose(){return super.dispose(),this._events=void 0,this}}class $i extends Ki{constructor(){super(...arguments),this.isOffline=!1}toJSON(){return{}}}class Zi extends $i{constructor(){super(),this.name="Context",this._constants=new Map,this._timeouts=new Ui,this._timeoutIds=0,this._initialized=!1,this.isOffline=!1,this._workletModules=new Map;const e=Di(Zi.getDefaults(),arguments,["context"]);e.context?this._context=e.context:this._context=function(e){return new Ba(e)}({latencyHint:e.latencyHint}),this._ticker=new Ci(this.emit.bind(this,"tick"),e.clockSource,e.updateInterval),this.on("tick",this._timeoutLoop.bind(this)),this._context.onstatechange=()=>{this.emit("statechange",this.state)},this._setLatencyHint(e.latencyHint),this.lookAhead=e.lookAhead}static getDefaults(){return{clockSource:"worker",latencyHint:"interactive",lookAhead:.1,updateInterval:.05}}initialize(){var e;return this._initialized||(e=this,Wi.forEach((t=>t(e))),this._initialized=!0),this}createAnalyser(){return this._context.createAnalyser()}createOscillator(){return this._context.createOscillator()}createBufferSource(){return this._context.createBufferSource()}createBiquadFilter(){return this._context.createBiquadFilter()}createBuffer(e,t,n){return this._context.createBuffer(e,t,n)}createChannelMerger(e){return this._context.createChannelMerger(e)}createChannelSplitter(e){return this._context.createChannelSplitter(e)}createConstantSource(){return this._context.createConstantSource()}createConvolver(){return this._context.createConvolver()}createDelay(e){return this._context.createDelay(e)}createDynamicsCompressor(){return this._context.createDynamicsCompressor()}createGain(){return this._context.createGain()}createIIRFilter(e,t){return this._context.createIIRFilter(e,t)}createPanner(){return this._context.createPanner()}createPeriodicWave(e,t,n){return this._context.createPeriodicWave(e,t,n)}createStereoPanner(){return this._context.createStereoPanner()}createWaveShaper(){return this._context.createWaveShaper()}createMediaStreamSource(e){ii(Ti(this._context),"Not available if OfflineAudioContext");return this._context.createMediaStreamSource(e)}createMediaElementSource(e){ii(Ti(this._context),"Not available if OfflineAudioContext");return this._context.createMediaElementSource(e)}createMediaStreamDestination(){ii(Ti(this._context),"Not available if OfflineAudioContext");return this._context.createMediaStreamDestination()}decodeAudioData(e){return this._context.decodeAudioData(e)}get currentTime(){return this._context.currentTime}get state(){return this._context.state}get sampleRate(){return this._context.sampleRate}get listener(){return this.initialize(),this._listener}set listener(e){ii(!this._initialized,"The listener cannot be set after initialization."),this._listener=e}get transport(){return this.initialize(),this._transport}set transport(e){ii(!this._initialized,"The transport cannot be set after initialization."),this._transport=e}get draw(){return this.initialize(),this._draw}set draw(e){ii(!this._initialized,"Draw cannot be set after initialization."),this._draw=e}get destination(){return this.initialize(),this._destination}set destination(e){ii(!this._initialized,"The destination cannot be set after initialization."),this._destination=e}createAudioWorkletNode(e,t){return function(e,t,n){return ii(di(Za),"This node only works in a secure context (https or localhost)"),new Za(e,t,n)}(this.rawContext,e,t)}addAudioWorkletModule(e,t){return xi(this,void 0,void 0,(function*(){ii(di(this.rawContext.audioWorklet),"AudioWorkletNode is only available in a secure context (https or localhost)"),this._workletModules.has(t)||this._workletModules.set(t,this.rawContext.audioWorklet.addModule(e)),yield this._workletModules.get(t)}))}workletsAreReady(){return xi(this,void 0,void 0,(function*(){const e=[];this._workletModules.forEach((t=>e.push(t))),yield Promise.all(e)}))}get updateInterval(){return this._ticker.updateInterval}set updateInterval(e){this._ticker.updateInterval=e}get clockSource(){return this._ticker.type}set clockSource(e){this._ticker.type=e}get latencyHint(){return this._latencyHint}_setLatencyHint(e){let t=0;if(this._latencyHint=e,bi(e))switch(e){case"interactive":t=.1;break;case"playback":t=.5;break;case"balanced":t=.25}this.lookAhead=t,this.updateInterval=t/2}get rawContext(){return this._context}now(){return this._context.currentTime+this.lookAhead}immediate(){return this._context.currentTime}resume(){return Ti(this._context)?this._context.resume():Promise.resolve()}close(){return xi(this,void 0,void 0,(function*(){var e;Ti(this._context)&&(yield this._context.close()),this._initialized&&(e=this,qi.forEach((t=>t(e))))}))}getConstant(e){if(this._constants.has(e))return this._constants.get(e);{const t=this._context.createBuffer(1,128,this._context.sampleRate),n=t.getChannelData(0);for(let t=0;tthis._constants[e].disconnect())),this}_timeoutLoop(){const e=this.now();let t=this._timeouts.peek();for(;this._timeouts.length&&t&&t.time<=e;)t.callback(),this._timeouts.shift(),t=this._timeouts.peek()}setTimeout(e,t){this._timeoutIds++;const n=this.now();return this._timeouts.add({callback:e,id:this._timeoutIds,time:n+t}),this._timeoutIds}clearTimeout(e){return this._timeouts.forEach((t=>{t.id===e&&this._timeouts.remove(t)})),this}clearInterval(e){return this.clearTimeout(e)}setInterval(e,t){const n=++this._timeoutIds,a=()=>{const i=this.now();this._timeouts.add({callback:()=>{e(),a()},id:n,time:i+t})};return a(),n}}function Xi(e,t){yi(t)?t.forEach((t=>Xi(e,t))):Object.defineProperty(e,t,{enumerable:!0,writable:!1})}function Yi(e,t){yi(t)?t.forEach((t=>Yi(e,t))):Object.defineProperty(e,t,{writable:!0})}const Qi=()=>{};class Ji extends Mi{constructor(){super(),this.name="ToneAudioBuffer",this.onload=Qi;const e=Di(Ji.getDefaults(),arguments,["url","onload","onerror"]);this.reverse=e.reverse,this.onload=e.onload,e.url&&Ii(e.url)||e.url instanceof Ji?this.set(e.url):bi(e.url)&&this.load(e.url).catch(e.onerror)}static getDefaults(){return{onerror:Qi,onload:Qi,reverse:!1}}get sampleRate(){return this._buffer?this._buffer.sampleRate:as().sampleRate}set(e){return e instanceof Ji?e.loaded?this._buffer=e.get():e.onload=()=>{this.set(e),this.onload(this)}:this._buffer=e,this._reversed&&this._reverse(),this}get(){return this._buffer}load(e){return xi(this,void 0,void 0,(function*(){const t=Ji.load(e).then((e=>{this.set(e),this.onload(this)}));Ji.downloads.push(t);try{yield t}finally{const e=Ji.downloads.indexOf(t);Ji.downloads.splice(e,1)}return this}))}dispose(){return super.dispose(),this._buffer=void 0,this}fromArray(e){const t=yi(e)&&e[0].length>0,n=t?e.length:1,a=t?e[0].length:e.length,i=as(),s=i.createBuffer(n,a,i.sampleRate),r=t||1!==n?e:[e];for(let e=0;ee/t)),this.fromArray(e)}return this}toArray(e){if(mi(e))return this.getChannelData(e);if(1===this.numberOfChannels)return this.toArray(0);{const e=[];for(let t=0;t0}get duration(){return this._buffer?this._buffer.duration:0}get length(){return this._buffer?this._buffer.length:0}get numberOfChannels(){return this._buffer?this._buffer.numberOfChannels:0}get reverse(){return this._reversed}set reverse(e){this._reversed!==e&&(this._reversed=e,this._reverse())}static fromArray(e){return(new Ji).fromArray(e)}static fromUrl(e){return xi(this,void 0,void 0,(function*(){const t=new Ji;return yield t.load(e)}))}static load(e){return xi(this,void 0,void 0,(function*(){const t=e.match(/\[([^\]\[]+\|.+)\]$/);if(t){const n=t[1].split("|");let a=n[0];for(const e of n)if(Ji.supportsType(e)){a=e;break}e=e.replace(t[0],a)}const n=""===Ji.baseUrl||Ji.baseUrl.endsWith("/")?Ji.baseUrl:Ji.baseUrl+"/",a=yield fetch(n+e);if(!a.ok)throw new Error(`could not load url: ${e}`);const i=yield a.arrayBuffer();return yield as().decodeAudioData(i)}))}static supportsType(e){const t=e.split("."),n=t[t.length-1];return""!==document.createElement("audio").canPlayType("audio/"+n)}static loaded(){return xi(this,void 0,void 0,(function*(){for(yield Promise.resolve();Ji.downloads.length;)yield Ji.downloads[0]}))}}Ji.baseUrl="",Ji.downloads=[];class es extends Zi{constructor(){var e,t,n;super({clockSource:"offline",context:_i(arguments[0])?arguments[0]:(e=arguments[0],t=arguments[1]*arguments[2],n=arguments[2],new Qa(e,t,n)),lookAhead:0,updateInterval:_i(arguments[0])?128/arguments[0].sampleRate:128/arguments[2]}),this.name="OfflineContext",this._currentTime=0,this.isOffline=!0,this._duration=_i(arguments[0])?arguments[0].length/arguments[0].sampleRate:arguments[1]}now(){return this._currentTime}get currentTime(){return this._currentTime}_renderClock(e){return xi(this,void 0,void 0,(function*(){let t=0;for(;this._duration-this._currentTime>=0;){this.emit("tick"),this._currentTime+=128/this.sampleRate,t++;const n=Math.floor(this.sampleRate/128);e&&t%n==0&&(yield new Promise((e=>setTimeout(e,1))))}}))}render(e=!0){return xi(this,void 0,void 0,(function*(){yield this.workletsAreReady(),yield this._renderClock(e);const t=yield this._context.startRendering();return new Ji(t)}))}close(){return Promise.resolve()}}const ts=new class extends $i{constructor(){super(...arguments),this.lookAhead=0,this.latencyHint=0,this.isOffline=!1}createAnalyser(){return{}}createOscillator(){return{}}createBufferSource(){return{}}createBiquadFilter(){return{}}createBuffer(e,t,n){return{}}createChannelMerger(e){return{}}createChannelSplitter(e){return{}}createConstantSource(){return{}}createConvolver(){return{}}createDelay(e){return{}}createDynamicsCompressor(){return{}}createGain(){return{}}createIIRFilter(e,t){return{}}createPanner(){return{}}createPeriodicWave(e,t,n){return{}}createStereoPanner(){return{}}createWaveShaper(){return{}}createMediaStreamSource(e){return{}}createMediaElementSource(e){return{}}createMediaStreamDestination(){return{}}decodeAudioData(e){return Promise.resolve({})}createAudioWorkletNode(e,t){return{}}get rawContext(){return{}}addAudioWorkletModule(e,t){return xi(this,void 0,void 0,(function*(){return Promise.resolve()}))}resume(){return Promise.resolve()}setTimeout(e,t){return 0}clearTimeout(e){return this}setInterval(e,t){return 0}clearInterval(e){return this}getConstant(e){return{}}get currentTime(){return 0}get state(){return{}}get sampleRate(){return 0}get listener(){return{}}get transport(){return{}}get draw(){return{}}set draw(e){}get destination(){return{}}set destination(e){}now(){return 0}immediate(){return 0}};let ns=ts;function as(){return ns===ts&&wi&&is(new Zi),ns}function is(e){ns=Ti(e)?new Zi(e):_i(e)?new es(e):e}function ss(){return ns.resume()}if(ki&&!ki.TONE_SILENCE_LOGGING){let e="v";"dev"===s&&(e="")}function rs(e){return Math.pow(10,e/20)}function os(e){return Math.log(e)/Math.LN10*20}function ls(e){return Math.pow(2,e/12)}let us=440;function cs(e){return Math.round(hs(e))}function hs(e){return 69+12*Math.log2(e/us)}function ds(e){return us*Math.pow(2,(e-69)/12)}class ps extends Mi{constructor(e,t,n){super(),this.defaultUnits="s",this._val=t,this._units=n,this.context=e,this._expressions=this._getExpressions()}_getExpressions(){return{hz:{method:e=>this._frequencyToUnits(parseFloat(e)),regexp:/^(\d+(?:\.\d+)?)hz$/i},i:{method:e=>this._ticksToUnits(parseInt(e,10)),regexp:/^(\d+)i$/i},m:{method:e=>this._beatsToUnits(parseInt(e,10)*this._getTimeSignature()),regexp:/^(\d+)m$/i},n:{method:(e,t)=>{const n=parseInt(e,10),a="."===t?1.5:1;return 1===n?this._beatsToUnits(this._getTimeSignature())*a:this._beatsToUnits(4/n)*a},regexp:/^(\d+)n(\.?)$/i},number:{method:e=>this._expressions[this.defaultUnits].method.call(this,e),regexp:/^(\d+(?:\.\d+)?)$/},s:{method:e=>this._secondsToUnits(parseFloat(e)),regexp:/^(\d+(?:\.\d+)?)s$/},samples:{method:e=>parseInt(e,10)/this.context.sampleRate,regexp:/^(\d+)samples$/},t:{method:e=>{const t=parseInt(e,10);return this._beatsToUnits(8/(3*Math.floor(t)))},regexp:/^(\d+)t$/i},tr:{method:(e,t,n)=>{let a=0;return e&&"0"!==e&&(a+=this._beatsToUnits(this._getTimeSignature()*parseFloat(e))),t&&"0"!==t&&(a+=this._beatsToUnits(parseFloat(t))),n&&"0"!==n&&(a+=this._beatsToUnits(parseFloat(n)/4)),a},regexp:/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?$/}}}valueOf(){if(this._val instanceof ps&&this.fromType(this._val),hi(this._val))return this._noArg();if(bi(this._val)&&hi(this._units)){for(const e in this._expressions)if(this._expressions[e].regexp.test(this._val.trim())){this._units=e;break}}else if(fi(this._val)){let e=0;for(const t in this._val)if(di(this._val[t])){const n=this._val[t];e+=new this.constructor(this.context,t).valueOf()*n}return e}if(di(this._units)){const e=this._expressions[this._units],t=this._val.toString().trim().match(e.regexp);return t?e.method.apply(this,t.slice(1)):e.method.call(this,this._val)}return bi(this._val)?parseFloat(this._val):this._val}_frequencyToUnits(e){return 1/e}_beatsToUnits(e){return 60/this._getBpm()*e}_secondsToUnits(e){return e}_ticksToUnits(e){return e*this._beatsToUnits(1)/this._getPPQ()}_noArg(){return this._now()}_getBpm(){return this.context.transport.bpm.value}_getTimeSignature(){return this.context.transport.timeSignature}_getPPQ(){return this.context.transport.PPQ}fromType(e){switch(this._units=void 0,this.defaultUnits){case"s":this._val=e.toSeconds();break;case"i":this._val=e.toTicks();break;case"hz":this._val=e.toFrequency();break;case"midi":this._val=e.toMidi()}return this}toFrequency(){return 1/this.toSeconds()}toSamples(){return this.toSeconds()*this.context.sampleRate}toMilliseconds(){return 1e3*this.toSeconds()}}class ms extends ps{constructor(){super(...arguments),this.name="TimeClass"}_getExpressions(){return Object.assign(super._getExpressions(),{now:{method:e=>this._now()+new this.constructor(this.context,e).valueOf(),regexp:/^\+(.+)/},quantize:{method:e=>{const t=new ms(this.context,e).valueOf();return this._secondsToUnits(this.context.transport.nextSubdivision(t))},regexp:/^@(.+)/}})}quantize(e,t=1){const n=new this.constructor(this.context,e).valueOf(),a=this.valueOf();return a+(Math.round(a/n)*n-a)*t}toNotation(){const e=this.toSeconds(),t=["1m"];for(let e=1;e<9;e++){const n=Math.pow(2,e);t.push(n+"n."),t.push(n+"n"),t.push(n+"t")}t.push("0");let n=t[0],a=new ms(this.context,t[0]).toSeconds();return t.forEach((t=>{const i=new ms(this.context,t).toSeconds();Math.abs(i-e)3&&(a=parseFloat(parseFloat(i).toFixed(3)));return[n,t,a].join(":")}toTicks(){const e=this._beatsToUnits(1),t=this.valueOf()/e;return Math.round(t*this._getPPQ())}toSeconds(){return this.valueOf()}toMidi(){return cs(this.toFrequency())}_now(){return this.context.now()}}function fs(e,t){return new ms(as(),e,t)}class gs extends ms{constructor(){super(...arguments),this.name="Frequency",this.defaultUnits="hz"}static get A4(){return us}static set A4(e){!function(e){us=e}(e)}_getExpressions(){return Object.assign({},super._getExpressions(),{midi:{regexp:/^(\d+(?:\.\d+)?midi)/,method(e){return"midi"===this.defaultUnits?e:gs.mtof(e)}},note:{regexp:/^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i,method(e,t){const n=ys[e.toLowerCase()]+12*(parseInt(t,10)+1);return"midi"===this.defaultUnits?n:gs.mtof(n)}},tr:{regexp:/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?/,method(e,t,n){let a=1;return e&&"0"!==e&&(a*=this._beatsToUnits(this._getTimeSignature()*parseFloat(e))),t&&"0"!==t&&(a*=this._beatsToUnits(parseFloat(t))),n&&"0"!==n&&(a*=this._beatsToUnits(parseFloat(n)/4)),a}}})}transpose(e){return new gs(this.context,this.valueOf()*ls(e))}harmonize(e){return e.map((e=>this.transpose(e)))}toMidi(){return cs(this.valueOf())}toNote(){const e=this.toFrequency(),t=Math.log2(e/gs.A4);let n=Math.round(12*t)+57;const a=Math.floor(n/12);a<0&&(n+=-12*a);return bs[n%12]+a.toString()}toSeconds(){return 1/super.toSeconds()}toTicks(){const e=this._beatsToUnits(1),t=this.valueOf()/e;return Math.floor(t*this._getPPQ())}_noArg(){return 0}_frequencyToUnits(e){return e}_ticksToUnits(e){return 1/(60*e/(this._getBpm()*this._getPPQ()))}_beatsToUnits(e){return 1/super._beatsToUnits(e)}_secondsToUnits(e){return 1/e}static mtof(e){return ds(e)}static ftom(e){return cs(e)}}const ys={cbb:-2,cb:-1,c:0,"c#":1,cx:2,dbb:0,db:1,d:2,"d#":3,dx:4,ebb:2,eb:3,e:4,"e#":5,ex:6,fbb:3,fb:4,f:5,"f#":6,fx:7,gbb:5,gb:6,g:7,"g#":8,gx:9,abb:7,ab:8,a:9,"a#":10,ax:11,bbb:9,bb:10,b:11,"b#":12,bx:13},bs=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function vs(e,t){return new gs(as(),e,t)}class ks extends ms{constructor(){super(...arguments),this.name="TransportTime"}_now(){return this.context.transport.seconds}}function ws(e,t){return new ks(as(),e,t)}class As extends Mi{constructor(){super();const e=Di(As.getDefaults(),arguments,["context"]);this.defaultContext?this.context=this.defaultContext:this.context=e.context}static getDefaults(){return{context:as()}}now(){return this.context.currentTime+this.context.lookAhead}immediate(){return this.context.currentTime}get sampleTime(){return 1/this.context.sampleRate}get blockTime(){return 128/this.context.sampleRate}toSeconds(e){return new ms(this.context,e).toSeconds()}toFrequency(e){return new gs(this.context,e).toFrequency()}toTicks(e){return new ks(this.context,e).toTicks()}_getPartialProperties(e){const t=this.get();return Object.keys(t).forEach((n=>{hi(e[n])&&delete t[n]})),t}get(){const e=this.constructor.getDefaults();return Object.keys(e).forEach((t=>{if(Reflect.has(this,t)){const n=this[t];di(n)&&di(n.value)&&di(n.setValueAtTime)?e[t]=n.value:n instanceof As?e[t]=n._getPartialProperties(e[t]):yi(n)||mi(n)||bi(n)||gi(n)?e[t]=n:delete e[t]}})),e}set(e){return Object.keys(e).forEach((t=>{Reflect.has(this,t)&&di(this[t])&&(this[t]&&di(this[t].value)&&di(this[t].setValueAtTime)?this[t].value!==e[t]&&(this[t].value=e[t]):this[t]instanceof As?this[t].set(e[t]):this[t]=e[t])})),this}}class xs extends Ui{constructor(e="stopped"){super(),this.name="StateTimeline",this._initial=e,this.setStateAtTime(this._initial,0)}getValueAtTime(e){const t=this.get(e);return null!==t?t.state:this._initial}setStateAtTime(e,t,n){return si(t,0),this.add(Object.assign({},n,{state:e,time:t})),this}getLastState(e,t){for(let n=this._search(t);n>=0;n--){const t=this._timeline[n];if(t.state===e)return t}}getNextState(e,t){const n=this._search(t);if(-1!==n)for(let t=n;t0,"timeConstant must be a number greater than 0");const i=this.toSeconds(t);return this._assertRange(a),ii(isFinite(a)&&isFinite(i),`Invalid argument(s) to setTargetAtTime: ${JSON.stringify(e)}, ${JSON.stringify(t)}`),this._events.add({constant:n,time:i,type:"setTargetAtTime",value:a}),this.log(this.units,"setTargetAtTime",e,i,n),this._param.setTargetAtTime(a,i,n),this}setValueCurveAtTime(e,t,n,a=1){n=this.toSeconds(n),t=this.toSeconds(t);const i=this._fromType(e[0])*a;this.setValueAtTime(this._toType(i),t);const s=n/(e.length-1);for(let n=1;n{"cancelScheduledValues"===t.type?e.cancelScheduledValues(t.time):"setTargetAtTime"===t.type?e.setTargetAtTime(t.value,t.time,t.constant):e[t.type](t.value,t.time)})),this}setParam(e){ii(this._swappable,"The Param must be assigned as 'swappable' in the constructor");const t=this.input;return t.disconnect(this._param),this.apply(e),this._param=e,t.connect(this._param),this}dispose(){return super.dispose(),this._events.dispose(),this}get defaultValue(){return this._toType(this._param.defaultValue)}_exponentialApproach(e,t,n,a,i){return n+(t-n)*Math.exp(-(i-e)/a)}_linearInterpolate(e,t,n,a,i){return t+(i-e)/(n-e)*(a-t)}_exponentialInterpolate(e,t,n,a,i){return t*Math.pow(a/t,(i-e)/(n-e))}}class Ss extends As{constructor(){super(...arguments),this.name="ToneAudioNode",this._internalChannels=[]}get numberOfInputs(){return di(this.input)?Si(this.input)||this.input instanceof Cs?1:this.input.numberOfInputs:0}get numberOfOutputs(){return di(this.output)?this.output.numberOfOutputs:0}_isAudioNode(e){return di(e)&&(e instanceof Ss||Ei(e))}_getInternalNodes(){const e=this._internalChannels.slice(0);return this._isAudioNode(this.input)&&e.push(this.input),this._isAudioNode(this.output)&&this.input!==this.output&&e.push(this.output),e}_setChannelProperties(e){this._getInternalNodes().forEach((t=>{t.channelCount=e.channelCount,t.channelCountMode=e.channelCountMode,t.channelInterpretation=e.channelInterpretation}))}_getChannelProperties(){const e=this._getInternalNodes();ii(e.length>0,"ToneAudioNode does not have any internal nodes");const t=e[0];return{channelCount:t.channelCount,channelCountMode:t.channelCountMode,channelInterpretation:t.channelInterpretation}}get channelCount(){return this._getChannelProperties().channelCount}set channelCount(e){const t=this._getChannelProperties();this._setChannelProperties(Object.assign(t,{channelCount:e}))}get channelCountMode(){return this._getChannelProperties().channelCountMode}set channelCountMode(e){const t=this._getChannelProperties();this._setChannelProperties(Object.assign(t,{channelCountMode:e}))}get channelInterpretation(){return this._getChannelProperties().channelInterpretation}set channelInterpretation(e){const t=this._getChannelProperties();this._setChannelProperties(Object.assign(t,{channelInterpretation:e}))}connect(e,t=0,n=0){return _s(this,e,t,n),this}toDestination(){return this.connect(this.context.destination),this}toMaster(){return ci("toMaster() has been renamed toDestination()"),this.toDestination()}disconnect(e,t=0,n=0){return Ts(this,e,t,n),this}chain(...e){return Es(this,...e),this}fan(...e){return e.forEach((e=>this.connect(e))),this}dispose(){return super.dispose(),di(this.input)&&(this.input instanceof Ss?this.input.dispose():Ei(this.input)&&this.input.disconnect()),di(this.output)&&(this.output instanceof Ss?this.output.dispose():Ei(this.output)&&this.output.disconnect()),this._internalChannels=[],this}}function Es(...e){const t=e.shift();e.reduce(((e,t)=>(e instanceof Ss?e.connect(t):Ei(e)&&_s(e,t),t)),t)}function _s(e,t,n=0,a=0){for(ii(di(e),"Cannot connect from undefined node"),ii(di(t),"Cannot connect to undefined node"),(t instanceof Ss||Ei(t))&&ii(t.numberOfInputs>0,"Cannot connect to node with no inputs"),ii(e.numberOfOutputs>0,"Cannot connect from node with no outputs");t instanceof Ss||t instanceof Cs;)di(t.input)&&(t=t.input);for(;e instanceof Ss;)di(e.output)&&(e=e.output);Si(t)?e.connect(t,n):e.connect(t,n,a)}function Ts(e,t,n=0,a=0){if(di(t))for(;t instanceof Ss;)t=t.input;for(;!Ei(e);)di(e.output)&&(e=e.output);Si(t)?e.disconnect(t,n):Ei(t)?e.disconnect(t,n,a):e.disconnect()}class Is extends Ss{constructor(){super(Di(Is.getDefaults(),arguments,["gain","units"])),this.name="Gain",this._gainNode=this.context.createGain(),this.input=this._gainNode,this.output=this._gainNode;const e=Di(Is.getDefaults(),arguments,["gain","units"]);this.gain=new Cs({context:this.context,convert:e.convert,param:this._gainNode.gain,units:e.units,value:e.gain,minValue:e.minValue,maxValue:e.maxValue}),Xi(this,"gain")}static getDefaults(){return Object.assign(Ss.getDefaults(),{convert:!0,gain:1,units:"gain"})}dispose(){return super.dispose(),this._gainNode.disconnect(),this.gain.dispose(),this}}class Ns extends Ss{constructor(e){super(e),this.onended=Qi,this._startTime=-1,this._stopTime=-1,this._timeout=-1,this.output=new Is({context:this.context,gain:0}),this._gainNode=this.output,this.getStateAtTime=function(e){const t=this.toSeconds(e);return-1!==this._startTime&&t>=this._startTime&&(-1===this._stopTime||t<=this._stopTime)?"started":"stopped"},this._fadeIn=e.fadeIn,this._fadeOut=e.fadeOut,this._curve=e.curve,this.onended=e.onended}static getDefaults(){return Object.assign(Ss.getDefaults(),{curve:"linear",fadeIn:0,fadeOut:0,onended:Qi})}_startGain(e,t=1){ii(-1===this._startTime,"Source cannot be started more than once");const n=this.toSeconds(this._fadeIn);return this._startTime=e+n,this._startTime=Math.max(this._startTime,this.context.currentTime),n>0?(this._gainNode.gain.setValueAtTime(0,e),"linear"===this._curve?this._gainNode.gain.linearRampToValueAtTime(t,e+n):this._gainNode.gain.exponentialApproachValueAtTime(t,e,n)):this._gainNode.gain.setValueAtTime(t,e),this}stop(e){return this.log("stop",e),this._stopGain(this.toSeconds(e)),this}_stopGain(e){ii(-1!==this._startTime,"'start' must be called before 'stop'"),this.cancelStop();const t=this.toSeconds(this._fadeOut);return this._stopTime=this.toSeconds(e)+t,this._stopTime=Math.max(this._stopTime,this.context.currentTime),t>0?"linear"===this._curve?this._gainNode.gain.linearRampTo(0,t,e):this._gainNode.gain.targetRampTo(0,t,e):(this._gainNode.gain.cancelAndHoldAtTime(e),this._gainNode.gain.setValueAtTime(0,e)),this.context.clearTimeout(this._timeout),this._timeout=this.context.setTimeout((()=>{const e="exponential"===this._curve?2*t:0;this._stopSource(this.now()+e),this._onended()}),this._stopTime-this.context.currentTime),this}_onended(){if(this.onended!==Qi&&(this.onended(this),this.onended=Qi,!this.context.isOffline)){const e=()=>this.dispose();void 0!==window.requestIdleCallback?window.requestIdleCallback(e):setTimeout(e,1e3)}}get state(){return this.getStateAtTime(this.now())}cancelStop(){return this.log("cancelStop"),ii(-1!==this._startTime,"Source is not started"),this._gainNode.gain.cancelScheduledValues(this._startTime+this.sampleTime),this.context.clearTimeout(this._timeout),this._stopTime=-1,this}dispose(){return super.dispose(),this._gainNode.disconnect(),this}}class Rs extends Ns{constructor(){super(Di(Rs.getDefaults(),arguments,["offset"])),this.name="ToneConstantSource",this._source=this.context.createConstantSource();const e=Di(Rs.getDefaults(),arguments,["offset"]);_s(this._source,this._gainNode),this.offset=new Cs({context:this.context,convert:e.convert,param:this._source.offset,units:e.units,value:e.offset,minValue:e.minValue,maxValue:e.maxValue})}static getDefaults(){return Object.assign(Ns.getDefaults(),{convert:!0,offset:1,units:"number"})}start(e){const t=this.toSeconds(e);return this.log("start",t),this._startGain(t),this._source.start(t),this}_stopSource(e){this._source.stop(e)}dispose(){return super.dispose(),"started"===this.state&&this.stop(),this._source.disconnect(),this.offset.dispose(),this}}class Ds extends Ss{constructor(){super(Di(Ds.getDefaults(),arguments,["value","units"])),this.name="Signal",this.override=!0;const e=Di(Ds.getDefaults(),arguments,["value","units"]);this.output=this._constantSource=new Rs({context:this.context,convert:e.convert,offset:e.value,units:e.units,minValue:e.minValue,maxValue:e.maxValue}),this._constantSource.start(0),this.input=this._param=this._constantSource.offset}static getDefaults(){return Object.assign(Ss.getDefaults(),{convert:!0,units:"number",value:0})}connect(e,t=0,n=0){return zs(this,e,t,n),this}dispose(){return super.dispose(),this._param.dispose(),this._constantSource.dispose(),this}setValueAtTime(e,t){return this._param.setValueAtTime(e,t),this}getValueAtTime(e){return this._param.getValueAtTime(e)}setRampPoint(e){return this._param.setRampPoint(e),this}linearRampToValueAtTime(e,t){return this._param.linearRampToValueAtTime(e,t),this}exponentialRampToValueAtTime(e,t){return this._param.exponentialRampToValueAtTime(e,t),this}exponentialRampTo(e,t,n){return this._param.exponentialRampTo(e,t,n),this}linearRampTo(e,t,n){return this._param.linearRampTo(e,t,n),this}targetRampTo(e,t,n){return this._param.targetRampTo(e,t,n),this}exponentialApproachValueAtTime(e,t,n){return this._param.exponentialApproachValueAtTime(e,t,n),this}setTargetAtTime(e,t,n){return this._param.setTargetAtTime(e,t,n),this}setValueCurveAtTime(e,t,n,a){return this._param.setValueCurveAtTime(e,t,n,a),this}cancelScheduledValues(e){return this._param.cancelScheduledValues(e),this}cancelAndHoldAtTime(e){return this._param.cancelAndHoldAtTime(e),this}rampTo(e,t,n){return this._param.rampTo(e,t,n),this}get value(){return this._param.value}set value(e){this._param.value=e}get convert(){return this._param.convert}set convert(e){this._param.convert=e}get units(){return this._param.units}get overridden(){return this._param.overridden}set overridden(e){this._param.overridden=e}get maxValue(){return this._param.maxValue}get minValue(){return this._param.minValue}apply(e){return this._param.apply(e),this}}function zs(e,t,n,a){(t instanceof Cs||Si(t)||t instanceof Ds&&t.override)&&(t.cancelScheduledValues(0),t.setValueAtTime(0,0),t instanceof Ds&&(t.overridden=!0)),_s(e,t,n,a)}class Os extends Cs{constructor(){super(Di(Os.getDefaults(),arguments,["value"])),this.name="TickParam",this._events=new Ui(1/0),this._multiplier=1;const e=Di(Os.getDefaults(),arguments,["value"]);this._multiplier=e.multiplier,this._events.cancel(0),this._events.add({ticks:0,time:0,type:"setValueAtTime",value:this._fromType(e.value)}),this.setValueAtTime(e.value,0)}static getDefaults(){return Object.assign(Cs.getDefaults(),{multiplier:1,units:"hertz",value:1})}setTargetAtTime(e,t,n){t=this.toSeconds(t),this.setRampPoint(t);const a=this._fromType(e),i=this._events.get(t),s=Math.round(Math.max(1/n,1));for(let e=0;e<=s;e++){const s=n*e+t,r=this._exponentialApproach(i.time,i.value,a,n,s);this.linearRampToValueAtTime(this._toType(r),s)}return this}setValueAtTime(e,t){const n=this.toSeconds(t);super.setValueAtTime(e,t);const a=this._events.get(n),i=this._events.previousEvent(a),s=this._getTicksUntilEvent(i,n);return a.ticks=Math.max(s,0),this}linearRampToValueAtTime(e,t){const n=this.toSeconds(t);super.linearRampToValueAtTime(e,t);const a=this._events.get(n),i=this._events.previousEvent(a),s=this._getTicksUntilEvent(i,n);return a.ticks=Math.max(s,0),this}exponentialRampToValueAtTime(e,t){t=this.toSeconds(t);const n=this._fromType(e),a=this._events.get(t),i=Math.round(Math.max(10*(t-a.time),1)),s=(t-a.time)/i;for(let e=0;e<=i;e++){const i=s*e+a.time,r=this._exponentialInterpolate(a.time,a.value,t,n,i);this.linearRampToValueAtTime(this._toType(r),i)}return this}_getTicksUntilEvent(e,t){if(null===e)e={ticks:0,time:0,type:"setValueAtTime",value:0};else if(hi(e.ticks)){const t=this._events.previousEvent(e);e.ticks=this._getTicksUntilEvent(t,e.time)}const n=this._fromType(this.getValueAtTime(e.time));let a=this._fromType(this.getValueAtTime(t));const i=this._events.get(t);return i&&i.time===t&&"setValueAtTime"===i.type&&(a=this._fromType(this.getValueAtTime(t-this.sampleTime))),.5*(t-e.time)*(n+a)+e.ticks}getTicksAtTime(e){const t=this.toSeconds(e),n=this._events.get(t);return Math.max(this._getTicksUntilEvent(n,t),0)}getDurationOfTicks(e,t){const n=this.toSeconds(t),a=this.getTicksAtTime(t);return this.getTimeOfTick(a+e)-n}getTimeOfTick(e){const t=this._events.get(e,"ticks"),n=this._events.getAfter(e,"ticks");if(t&&t.ticks===e)return t.time;if(t&&n&&"linearRampToValueAtTime"===n.type&&t.value!==n.value){const a=this._fromType(this.getValueAtTime(t.time)),i=(this._fromType(this.getValueAtTime(n.time))-a)/(n.time-t.time),s=Math.sqrt(Math.pow(a,2)-2*i*(t.ticks-e)),r=(-a+s)/i;return(r>0?r:(-a-s)/i)+t.time}return t?0===t.value?1/0:t.time+(e-t.ticks)/t.value:e/this._initialValue}ticksToTime(e,t){return this.getDurationOfTicks(e,t)}timeToTicks(e,t){const n=this.toSeconds(t),a=this.toSeconds(e),i=this.getTicksAtTime(n);return this.getTicksAtTime(n+a)-i}_fromType(e){return"bpm"===this.units&&this.multiplier?1/(60/e/this.multiplier):super._fromType(e)}_toType(e){return"bpm"===this.units&&this.multiplier?e/this.multiplier*60:super._toType(e)}get multiplier(){return this._multiplier}set multiplier(e){const t=this.value;this._multiplier=e,this.cancelScheduledValues(0),this.setValueAtTime(t,0)}}class Ms extends Ds{constructor(){super(Di(Ms.getDefaults(),arguments,["value"])),this.name="TickSignal";const e=Di(Ms.getDefaults(),arguments,["value"]);this.input=this._param=new Os({context:this.context,convert:e.convert,multiplier:e.multiplier,param:this._constantSource.offset,units:e.units,value:e.value})}static getDefaults(){return Object.assign(Ds.getDefaults(),{multiplier:1,units:"hertz",value:1})}ticksToTime(e,t){return this._param.ticksToTime(e,t)}timeToTicks(e,t){return this._param.timeToTicks(e,t)}getTimeOfTick(e){return this._param.getTimeOfTick(e)}getDurationOfTicks(e,t){return this._param.getDurationOfTicks(e,t)}getTicksAtTime(e){return this._param.getTicksAtTime(e)}get multiplier(){return this._param.multiplier}set multiplier(e){this._param.multiplier=e}dispose(){return super.dispose(),this._param.dispose(),this}}class Bs extends As{constructor(){super(Di(Bs.getDefaults(),arguments,["frequency"])),this.name="TickSource",this._state=new xs,this._tickOffset=new Ui;const e=Di(Bs.getDefaults(),arguments,["frequency"]);this.frequency=new Ms({context:this.context,units:e.units,value:e.frequency}),Xi(this,"frequency"),this._state.setStateAtTime("stopped",0),this.setTicksAtTime(0,0)}static getDefaults(){return Object.assign({frequency:1,units:"hertz"},As.getDefaults())}get state(){return this.getStateAtTime(this.now())}start(e,t){const n=this.toSeconds(e);return"started"!==this._state.getValueAtTime(n)&&(this._state.setStateAtTime("started",n),di(t)&&this.setTicksAtTime(t,n)),this}stop(e){const t=this.toSeconds(e);if("stopped"===this._state.getValueAtTime(t)){const e=this._state.get(t);e&&e.time>0&&(this._tickOffset.cancel(e.time),this._state.cancel(e.time))}return this._state.cancel(t),this._state.setStateAtTime("stopped",t),this.setTicksAtTime(0,t),this}pause(e){const t=this.toSeconds(e);return"started"===this._state.getValueAtTime(t)&&this._state.setStateAtTime("paused",t),this}cancel(e){return e=this.toSeconds(e),this._state.cancel(e),this._tickOffset.cancel(e),this}getTicksAtTime(e){const t=this.toSeconds(e),n=this._state.getLastState("stopped",t),a={state:"paused",time:t};this._state.add(a);let i=n,s=0;return this._state.forEachBetween(n.time,t+this.sampleTime,(e=>{let t=i.time;const n=this._tickOffset.get(e.time);n&&n.time>=i.time&&(s=n.ticks,t=n.time),"started"===i.state&&"started"!==e.state&&(s+=this.frequency.getTicksAtTime(e.time)-this.frequency.getTicksAtTime(t)),i=e})),this._state.remove(a),s}get ticks(){return this.getTicksAtTime(this.now())}set ticks(e){this.setTicksAtTime(e,this.now())}get seconds(){return this.getSecondsAtTime(this.now())}set seconds(e){const t=this.now(),n=this.frequency.timeToTicks(e,t);this.setTicksAtTime(n,t)}getSecondsAtTime(e){e=this.toSeconds(e);const t=this._state.getLastState("stopped",e),n={state:"paused",time:e};this._state.add(n);let a=t,i=0;return this._state.forEachBetween(t.time,e+this.sampleTime,(e=>{let t=a.time;const n=this._tickOffset.get(e.time);n&&n.time>=a.time&&(i=n.seconds,t=n.time),"started"===a.state&&"started"!==e.state&&(i+=e.time-t),a=e})),this._state.remove(n),i}setTicksAtTime(e,t){return t=this.toSeconds(t),this._tickOffset.cancel(t),this._tickOffset.add({seconds:this.frequency.getDurationOfTicks(e,t),ticks:e,time:t}),this}getStateAtTime(e){return e=this.toSeconds(e),this._state.getValueAtTime(e)}getTimeOfTick(e,t=this.now()){const n=this._tickOffset.get(t),a=this._state.get(t),i=Math.max(n.time,a.time),s=this.frequency.getTicksAtTime(i)+e-n.ticks;return this.frequency.getTimeOfTick(s)}forEachTickBetween(e,t,n){let a=this._state.get(e);this._state.forEachBetween(e,t,(t=>{a&&"started"===a.state&&"started"!==t.state&&this.forEachTickBetween(Math.max(a.time,e),t.time-this.sampleTime,n),a=t}));let i=null;if(a&&"started"===a.state){const s=Math.max(a.time,e),r=this.frequency.getTicksAtTime(s),o=r-this.frequency.getTicksAtTime(a.time);let l=Math.ceil(o)-o;l=ji(l,1)?0:l;let u=this.frequency.getTimeOfTick(r+l);for(;u{switch(e.state){case"started":const t=this._tickSource.getTicksAtTime(e.time);this.emit("start",e.time,t);break;case"stopped":0!==e.time&&this.emit("stop",e.time);break;case"paused":this.emit("pause",e.time)}})),this._tickSource.forEachTickBetween(e,t,((e,t)=>{this.callback(e,t)})))}getStateAtTime(e){const t=this.toSeconds(e);return this._state.getValueAtTime(t)}dispose(){return super.dispose(),this.context.off("tick",this._boundLoop),this._tickSource.dispose(),this._state.dispose(),this}}Ki.mixin(Fs);class Ls extends Ss{constructor(){super(Di(Ls.getDefaults(),arguments,["delayTime","maxDelay"])),this.name="Delay";const e=Di(Ls.getDefaults(),arguments,["delayTime","maxDelay"]),t=this.toSeconds(e.maxDelay);this._maxDelay=Math.max(t,this.toSeconds(e.delayTime)),this._delayNode=this.input=this.output=this.context.createDelay(t),this.delayTime=new Cs({context:this.context,param:this._delayNode.delayTime,units:"time",value:e.delayTime,minValue:0,maxValue:this.maxDelay}),Xi(this,"delayTime")}static getDefaults(){return Object.assign(Ss.getDefaults(),{delayTime:0,maxDelay:1})}get maxDelay(){return this._maxDelay}dispose(){return super.dispose(),this._delayNode.disconnect(),this.delayTime.dispose(),this}}function Ps(e,t,n=2,a=as().sampleRate){return xi(this,void 0,void 0,(function*(){const i=as(),s=new es(n,t,a);is(s),yield e(s);const r=s.render();is(i);const o=yield r;return new Ji(o)}))}class js extends Mi{constructor(){super(),this.name="ToneAudioBuffers",this._buffers=new Map,this._loadingCount=0;const e=Di(js.getDefaults(),arguments,["urls","onload","baseUrl"],"urls");this.baseUrl=e.baseUrl,Object.keys(e.urls).forEach((t=>{this._loadingCount++;const n=e.urls[t];this.add(t,n,this._bufferLoaded.bind(this,e.onload),e.onerror)}))}static getDefaults(){return{baseUrl:"",onerror:Qi,onload:Qi,urls:{}}}has(e){return this._buffers.has(e.toString())}get(e){return ii(this.has(e),`ToneAudioBuffers has no buffer named: ${e}`),this._buffers.get(e.toString())}_bufferLoaded(e){this._loadingCount--,0===this._loadingCount&&e&&e()}get loaded(){return Array.from(this._buffers).every((([e,t])=>t.loaded))}add(e,t,n=Qi,a=Qi){return bi(t)?this._buffers.set(e.toString(),new Ji(this.baseUrl+t,n,a)):this._buffers.set(e.toString(),new Ji(t,n,a)),this}dispose(){return super.dispose(),this._buffers.forEach((e=>e.dispose())),this._buffers.clear(),this}}class Vs extends gs{constructor(){super(...arguments),this.name="MidiClass",this.defaultUnits="midi"}_frequencyToUnits(e){return cs(super._frequencyToUnits(e))}_ticksToUnits(e){return cs(super._ticksToUnits(e))}_beatsToUnits(e){return cs(super._beatsToUnits(e))}_secondsToUnits(e){return cs(super._secondsToUnits(e))}toMidi(){return this.valueOf()}toFrequency(){return ds(this.toMidi())}transpose(e){return new Vs(this.context,this.toMidi()+e)}}function Us(e,t){return new Vs(as(),e,t)}class Ws extends ks{constructor(){super(...arguments),this.name="Ticks",this.defaultUnits="i"}_now(){return this.context.transport.ticks}_beatsToUnits(e){return this._getPPQ()*e}_secondsToUnits(e){return Math.floor(e/(60/this._getBpm())*this._getPPQ())}_ticksToUnits(e){return e}toTicks(){return this.valueOf()}toSeconds(){return this.valueOf()/this._getPPQ()*(60/this._getBpm())}}function Gs(e,t){return new Ws(as(),e,t)}class qs extends As{constructor(){super(...arguments),this.name="Draw",this.expiration=.25,this.anticipation=.008,this._events=new Ui,this._boundDrawLoop=this._drawLoop.bind(this),this._animationFrame=-1}schedule(e,t){return this._events.add({callback:e,time:this.toSeconds(t)}),1===this._events.length&&(this._animationFrame=requestAnimationFrame(this._boundDrawLoop)),this}cancel(e){return this._events.cancel(this.toSeconds(e)),this}_drawLoop(){const e=this.context.currentTime;for(;this._events.length&&this._events.peek().time-this.anticipation<=e;){const t=this._events.shift();t&&e-t.time<=this.expiration&&t.callback()}this._events.length>0&&(this._animationFrame=requestAnimationFrame(this._boundDrawLoop))}dispose(){return super.dispose(),this._events.dispose(),cancelAnimationFrame(this._animationFrame),this}}Gi((e=>{e.draw=new qs({context:e})})),Hi((e=>{e.draw.dispose()}));class Hs extends Mi{constructor(){super(...arguments),this.name="IntervalTimeline",this._root=null,this._length=0}add(e){ii(di(e.time),"Events must have a time property"),ii(di(e.duration),"Events must have a duration parameter"),e.time=e.time.valueOf();let t=new Ks(e.time,e.time+e.duration,e);for(null===this._root?this._root=t:this._root.insert(t),this._length++;null!==t;)t.updateHeight(),t.updateMax(),this._rebalance(t),t=t.parent;return this}remove(e){if(null!==this._root){const t=[];this._root.search(e.time,t);for(const n of t)if(n.event===e){this._removeNode(n),this._length--;break}}return this}get length(){return this._length}cancel(e){return this.forEachFrom(e,(e=>this.remove(e))),this}_setRoot(e){this._root=e,null!==this._root&&(this._root.parent=null)}_replaceNodeInParent(e,t){null!==e.parent?(e.isLeftChild()?e.parent.left=t:e.parent.right=t,this._rebalance(e.parent)):this._setRoot(t)}_removeNode(e){if(null===e.left&&null===e.right)this._replaceNodeInParent(e,null);else if(null===e.right)this._replaceNodeInParent(e,e.left);else if(null===e.left)this._replaceNodeInParent(e,e.right);else{let t,n=null;if(e.getBalance()>0)if(null===e.left.right)t=e.left,t.right=e.right,n=t;else{for(t=e.left.right;null!==t.right;)t=t.right;t.parent&&(t.parent.right=t.left,n=t.parent,t.left=e.left,t.right=e.right)}else if(null===e.right.left)t=e.right,t.left=e.left,n=t;else{for(t=e.right.left;null!==t.left;)t=t.left;t.parent&&(t.parent.left=t.right,n=t.parent,t.left=e.left,t.right=e.right)}null!==e.parent?e.isLeftChild()?e.parent.left=t:e.parent.right=t:this._setRoot(t),n&&this._rebalance(n)}e.dispose()}_rotateLeft(e){const t=e.parent,n=e.isLeftChild(),a=e.right;a&&(e.right=a.left,a.left=e),null!==t?n?t.left=a:t.right=a:this._setRoot(a)}_rotateRight(e){const t=e.parent,n=e.isLeftChild(),a=e.left;a&&(e.left=a.right,a.right=e),null!==t?n?t.left=a:t.right=a:this._setRoot(a)}_rebalance(e){const t=e.getBalance();t>1&&e.left?e.left.getBalance()<0?this._rotateLeft(e.left):this._rotateRight(e):t<-1&&e.right&&(e.right.getBalance()>0?this._rotateRight(e.right):this._rotateLeft(e))}get(e){if(null!==this._root){const t=[];if(this._root.search(e,t),t.length>0){let e=t[0];for(let n=1;ne.low&&(e=t[n]);return e.event}}return null}forEach(e){if(null!==this._root){const t=[];this._root.traverse((e=>t.push(e))),t.forEach((t=>{t.event&&e(t.event)}))}return this}forEachAtTime(e,t){if(null!==this._root){const n=[];this._root.search(e,n),n.forEach((e=>{e.event&&t(e.event)}))}return this}forEachFrom(e,t){if(null!==this._root){const n=[];this._root.searchAfter(e,n),n.forEach((e=>{e.event&&t(e.event)}))}return this}dispose(){return super.dispose(),null!==this._root&&this._root.traverse((e=>e.dispose())),this._root=null,this}}class Ks{constructor(e,t,n){this._left=null,this._right=null,this.parent=null,this.height=0,this.event=n,this.low=e,this.high=t,this.max=this.high}insert(e){e.low<=this.low?null===this.left?this.left=e:this.left.insert(e):null===this.right?this.right=e:this.right.insert(e)}search(e,t){e>this.max||(null!==this.left&&this.left.search(e,t),this.low<=e&&this.high>e&&t.push(this),this.low>e||null!==this.right&&this.right.search(e,t))}searchAfter(e,t){this.low>=e&&(t.push(this),null!==this.left&&this.left.searchAfter(e,t)),null!==this.right&&this.right.searchAfter(e,t)}traverse(e){e(this),null!==this.left&&this.left.traverse(e),null!==this.right&&this.right.traverse(e)}updateHeight(){null!==this.left&&null!==this.right?this.height=Math.max(this.left.height,this.right.height)+1:null!==this.right?this.height=this.right.height+1:null!==this.left?this.height=this.left.height+1:this.height=0}updateMax(){this.max=this.high,null!==this.left&&(this.max=Math.max(this.max,this.left.max)),null!==this.right&&(this.max=Math.max(this.max,this.right.max))}getBalance(){let e=0;return null!==this.left&&null!==this.right?e=this.left.height-this.right.height:null!==this.left?e=this.left.height+1:null!==this.right&&(e=-(this.right.height+1)),e}isLeftChild(){return null!==this.parent&&this.parent.left===this}get left(){return this._left}set left(e){this._left=e,null!==e&&(e.parent=this),this.updateHeight(),this.updateMax()}get right(){return this._right}set right(e){this._right=e,null!==e&&(e.parent=this),this.updateHeight(),this.updateMax()}dispose(){this.parent=null,this._left=null,this._right=null,this.event=null}}class $s extends Ss{constructor(){super(Di($s.getDefaults(),arguments,["volume"])),this.name="Volume";const e=Di($s.getDefaults(),arguments,["volume"]);this.input=this.output=new Is({context:this.context,gain:e.volume,units:"decibels"}),this.volume=this.output.gain,Xi(this,"volume"),this._unmutedVolume=e.volume,this.mute=e.mute}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,volume:0})}get mute(){return this.volume.value===-1/0}set mute(e){!this.mute&&e?(this._unmutedVolume=this.volume.value,this.volume.value=-1/0):this.mute&&!e&&(this.volume.value=this._unmutedVolume)}dispose(){return super.dispose(),this.input.dispose(),this.volume.dispose(),this}}class Zs extends Ss{constructor(){super(Di(Zs.getDefaults(),arguments)),this.name="Destination",this.input=new $s({context:this.context}),this.output=new Is({context:this.context}),this.volume=this.input.volume;const e=Di(Zs.getDefaults(),arguments);Es(this.input,this.output,this.context.rawContext.destination),this.mute=e.mute,this._internalChannels=[this.input,this.context.rawContext.destination,this.output]}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,volume:0})}get mute(){return this.input.mute}set mute(e){this.input.mute=e}chain(...e){return this.input.disconnect(),e.unshift(this.input),e.push(this.output),Es(...e),this}get maxChannelCount(){return this.context.rawContext.destination.maxChannelCount}dispose(){return super.dispose(),this.volume.dispose(),this}}Gi((e=>{e.destination=new Zs({context:e})})),Hi((e=>{e.destination.dispose()}));class Xs extends Mi{constructor(e){super(),this.name="TimelineValue",this._timeline=new Ui({memory:10}),this._initialValue=e}set(e,t){return this._timeline.add({value:e,time:t}),this}get(e){const t=this._timeline.get(e);return t?t.value:this._initialValue}}class Ys{constructor(e,t){this.id=Ys._eventId++;const n=Object.assign(Ys.getDefaults(),t);this.transport=e,this.callback=n.callback,this._once=n.once,this.time=n.time}static getDefaults(){return{callback:Qi,once:!1,time:0}}invoke(e){this.callback&&(this.callback(e),this._once&&this.transport.clear(this.id))}dispose(){return this.callback=void 0,this}}Ys._eventId=0;class Qs extends Ys{constructor(e,t){super(e,t),this._currentId=-1,this._nextId=-1,this._nextTick=this.time,this._boundRestart=this._restart.bind(this);const n=Object.assign(Qs.getDefaults(),t);this.duration=new Ws(e.context,n.duration).valueOf(),this._interval=new Ws(e.context,n.interval).valueOf(),this._nextTick=n.time,this.transport.on("start",this._boundRestart),this.transport.on("loopStart",this._boundRestart),this.context=this.transport.context,this._restart()}static getDefaults(){return Object.assign({},Ys.getDefaults(),{duration:1/0,interval:1,once:!1})}invoke(e){this._createEvents(e),super.invoke(e)}_createEvents(e){const t=this.transport.getTicksAtTime(e);t>=this.time&&t>=this._nextTick&&this._nextTick+this._intervalthis.time&&(this._nextTick=this.time+Math.ceil((t-this.time)/this._interval)*this._interval),this._currentId=this.transport.scheduleOnce(this.invoke.bind(this),new Ws(this.context,this._nextTick).toSeconds()),this._nextTick+=this._interval,this._nextId=this.transport.scheduleOnce(this.invoke.bind(this),new Ws(this.context,this._nextTick).toSeconds())}dispose(){return super.dispose(),this.transport.clear(this._currentId),this.transport.clear(this._nextId),this.transport.off("start",this._boundRestart),this.transport.off("loopStart",this._boundRestart),this}}class Js extends As{constructor(){super(Di(Js.getDefaults(),arguments)),this.name="Transport",this._loop=new Xs(!1),this._loopStart=0,this._loopEnd=0,this._scheduledEvents={},this._timeline=new Ui,this._repeatedEvents=new Hs,this._syncedSignals=[],this._swingAmount=0;const e=Di(Js.getDefaults(),arguments);this._ppq=e.ppq,this._clock=new Fs({callback:this._processTick.bind(this),context:this.context,frequency:0,units:"bpm"}),this._bindClockEvents(),this.bpm=this._clock.frequency,this._clock.frequency.multiplier=e.ppq,this.bpm.setValueAtTime(e.bpm,0),Xi(this,"bpm"),this._timeSignature=e.timeSignature,this._swingTicks=e.ppq/2}static getDefaults(){return Object.assign(As.getDefaults(),{bpm:120,loopEnd:"4m",loopStart:0,ppq:192,swing:0,swingSubdivision:"8n",timeSignature:4})}_processTick(e,t){if(this._loop.get(e)&&t>=this._loopEnd&&(this.emit("loopEnd",e),this._clock.setTicksAtTime(this._loopStart,e),t=this._loopStart,this.emit("loopStart",e,this._clock.getSecondsAtTime(e)),this.emit("loop",e)),this._swingAmount>0&&t%this._ppq!=0&&t%(2*this._swingTicks)!=0){const n=t%(2*this._swingTicks)/(2*this._swingTicks),a=Math.sin(n*Math.PI)*this._swingAmount;e+=new Ws(this.context,2*this._swingTicks/3).toSeconds()*a}this._timeline.forEachAtTime(t,(t=>t.invoke(e)))}schedule(e,t){const n=new Ys(this,{callback:e,time:new ks(this.context,t).toTicks()});return this._addEvent(n,this._timeline)}scheduleRepeat(e,t,n,a=1/0){const i=new Qs(this,{callback:e,duration:new ms(this.context,a).toTicks(),interval:new ms(this.context,t).toTicks(),time:new ks(this.context,n).toTicks()});return this._addEvent(i,this._repeatedEvents)}scheduleOnce(e,t){const n=new Ys(this,{callback:e,once:!0,time:new ks(this.context,t).toTicks()});return this._addEvent(n,this._timeline)}clear(e){if(this._scheduledEvents.hasOwnProperty(e)){const t=this._scheduledEvents[e.toString()];t.timeline.remove(t.event),t.event.dispose(),delete this._scheduledEvents[e.toString()]}return this}_addEvent(e,t){return this._scheduledEvents[e.id.toString()]={event:e,timeline:t},t.add(e),e.id}cancel(e=0){const t=this.toTicks(e);return this._timeline.forEachFrom(t,(e=>this.clear(e.id))),this._repeatedEvents.forEachFrom(t,(e=>this.clear(e.id))),this}_bindClockEvents(){this._clock.on("start",((e,t)=>{t=new Ws(this.context,t).toSeconds(),this.emit("start",e,t)})),this._clock.on("stop",(e=>{this.emit("stop",e)})),this._clock.on("pause",(e=>{this.emit("pause",e)}))}get state(){return this._clock.getStateAtTime(this.now())}start(e,t){let n;return di(t)&&(n=this.toTicks(t)),this._clock.start(e,n),this}stop(e){return this._clock.stop(e),this}pause(e){return this._clock.pause(e),this}toggle(e){return e=this.toSeconds(e),"started"!==this._clock.getStateAtTime(e)?this.start(e):this.stop(e),this}get timeSignature(){return this._timeSignature}set timeSignature(e){yi(e)&&(e=e[0]/e[1]*4),this._timeSignature=e}get loopStart(){return new ms(this.context,this._loopStart,"i").toSeconds()}set loopStart(e){this._loopStart=this.toTicks(e)}get loopEnd(){return new ms(this.context,this._loopEnd,"i").toSeconds()}set loopEnd(e){this._loopEnd=this.toTicks(e)}get loop(){return this._loop.get(this.now())}set loop(e){this._loop.set(e,this.now())}setLoopPoints(e,t){return this.loopStart=e,this.loopEnd=t,this}get swing(){return this._swingAmount}set swing(e){this._swingAmount=e}get swingSubdivision(){return new Ws(this.context,this._swingTicks).toNotation()}set swingSubdivision(e){this._swingTicks=this.toTicks(e)}get position(){const e=this.now(),t=this._clock.getTicksAtTime(e);return new Ws(this.context,t).toBarsBeatsSixteenths()}set position(e){const t=this.toTicks(e);this.ticks=t}get seconds(){return this._clock.seconds}set seconds(e){const t=this.now(),n=this._clock.frequency.timeToTicks(e,t);this.ticks=n}get progress(){if(this.loop){const e=this.now();return(this._clock.getTicksAtTime(e)-this._loopStart)/(this._loopEnd-this._loopStart)}return 0}get ticks(){return this._clock.ticks}set ticks(e){if(this._clock.ticks!==e){const t=this.now();if("started"===this.state){const n=this._clock.getTicksAtTime(t),a=t+this._clock.frequency.getDurationOfTicks(Math.ceil(n)-n,t);this.emit("stop",a),this._clock.setTicksAtTime(e,a),this.emit("start",a,this._clock.getSecondsAtTime(a))}else this._clock.setTicksAtTime(e,t)}}getTicksAtTime(e){return Math.round(this._clock.getTicksAtTime(e))}getSecondsAtTime(e){return this._clock.getSecondsAtTime(e)}get PPQ(){return this._clock.frequency.multiplier}set PPQ(e){this._clock.frequency.multiplier=e}nextSubdivision(e){if(e=this.toTicks(e),"started"!==this.state)return 0;{const t=this.now(),n=e-this.getTicksAtTime(t)%e;return this._clock.nextTickTime(n,t)}}syncSignal(e,t){if(!t){const n=this.now();if(0!==e.getValueAtTime(n)){const a=1/(60/this.bpm.getValueAtTime(n)/this.PPQ);t=e.getValueAtTime(n)/a}else t=0}const n=new Is(t);return this.bpm.connect(n),n.connect(e._param),this._syncedSignals.push({initial:e.value,ratio:n,signal:e}),e.value=0,this}unsyncSignal(e){for(let t=this._syncedSignals.length-1;t>=0;t--){const n=this._syncedSignals[t];n.signal===e&&(n.ratio.dispose(),n.signal.value=n.initial,this._syncedSignals.splice(t,1))}return this}dispose(){return super.dispose(),this._clock.dispose(),Yi(this,"bpm"),this._timeline.dispose(),this._repeatedEvents.dispose(),this}}Ki.mixin(Js),Gi((e=>{e.transport=new Js({context:e})})),Hi((e=>{e.transport.dispose()}));class er extends Ss{constructor(e){super(e),this.input=void 0,this._state=new xs("stopped"),this._synced=!1,this._scheduled=[],this._syncedStart=Qi,this._syncedStop=Qi,this._state.memory=100,this._state.increasing=!0,this._volume=this.output=new $s({context:this.context,mute:e.mute,volume:e.volume}),this.volume=this._volume.volume,Xi(this,"volume"),this.onstop=e.onstop}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,onstop:Qi,volume:0})}get state(){return this._synced?"started"===this.context.transport.state?this._state.getValueAtTime(this.context.transport.seconds):"stopped":this._state.getValueAtTime(this.now())}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}_clampToCurrentTime(e){return this._synced?e:Math.max(e,this.context.currentTime)}start(e,t,n){let a=hi(e)&&this._synced?this.context.transport.seconds:this.toSeconds(e);if(a=this._clampToCurrentTime(a),this._synced||"started"!==this._state.getValueAtTime(a))if(this.log("start",a),this._state.setStateAtTime("started",a),this._synced){const e=this._state.get(a);e&&(e.offset=this.toSeconds(zi(t,0)),e.duration=n?this.toSeconds(n):void 0);const i=this.context.transport.schedule((e=>{this._start(e,t,n)}),a);this._scheduled.push(i),"started"===this.context.transport.state&&this.context.transport.getSecondsAtTime(this.immediate())>a&&this._syncedStart(this.now(),this.context.transport.seconds)}else ri(this.context),this._start(a,t,n);else ii(Fi(a,this._state.get(a).time),"Start time must be strictly greater than previous start time"),this._state.cancel(a),this._state.setStateAtTime("started",a),this.log("restart",a),this.restart(a,t,n);return this}stop(e){let t=hi(e)&&this._synced?this.context.transport.seconds:this.toSeconds(e);if(t=this._clampToCurrentTime(t),"started"===this._state.getValueAtTime(t)||di(this._state.getNextState("started",t))){if(this.log("stop",t),this._synced){const e=this.context.transport.schedule(this._stop.bind(this),t);this._scheduled.push(e)}else this._stop(t);this._state.cancel(t),this._state.setStateAtTime("stopped",t)}return this}restart(e,t,n){return e=this.toSeconds(e),"started"===this._state.getValueAtTime(e)&&(this._state.cancel(e),this._restart(e,t,n)),this}sync(){return this._synced||(this._synced=!0,this._syncedStart=(e,t)=>{if(t>0){const n=this._state.get(t);if(n&&"started"===n.state&&n.time!==t){const a=t-this.toSeconds(n.time);let i;n.duration&&(i=this.toSeconds(n.duration)-a),this._start(e,this.toSeconds(n.offset)+a,i)}}},this._syncedStop=e=>{const t=this.context.transport.getSecondsAtTime(Math.max(e-this.sampleTime,0));"started"===this._state.getValueAtTime(t)&&this._stop(e)},this.context.transport.on("start",this._syncedStart),this.context.transport.on("loopStart",this._syncedStart),this.context.transport.on("stop",this._syncedStop),this.context.transport.on("pause",this._syncedStop),this.context.transport.on("loopEnd",this._syncedStop)),this}unsync(){return this._synced&&(this.context.transport.off("stop",this._syncedStop),this.context.transport.off("pause",this._syncedStop),this.context.transport.off("loopEnd",this._syncedStop),this.context.transport.off("start",this._syncedStart),this.context.transport.off("loopStart",this._syncedStart)),this._synced=!1,this._scheduled.forEach((e=>this.context.transport.clear(e))),this._scheduled=[],this._state.cancel(0),this._stop(0),this}dispose(){return super.dispose(),this.onstop=Qi,this.unsync(),this._volume.dispose(),this._state.dispose(),this}}class tr extends Ns{constructor(){super(Di(tr.getDefaults(),arguments,["url","onload"])),this.name="ToneBufferSource",this._source=this.context.createBufferSource(),this._internalChannels=[this._source],this._sourceStarted=!1,this._sourceStopped=!1;const e=Di(tr.getDefaults(),arguments,["url","onload"]);_s(this._source,this._gainNode),this._source.onended=()=>this._stopSource(),this.playbackRate=new Cs({context:this.context,param:this._source.playbackRate,units:"positive",value:e.playbackRate}),this.loop=e.loop,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this._buffer=new Ji(e.url,e.onload,e.onerror),this._internalChannels.push(this._source)}static getDefaults(){return Object.assign(Ns.getDefaults(),{url:new Ji,loop:!1,loopEnd:0,loopStart:0,onload:Qi,onerror:Qi,playbackRate:1})}get fadeIn(){return this._fadeIn}set fadeIn(e){this._fadeIn=e}get fadeOut(){return this._fadeOut}set fadeOut(e){this._fadeOut=e}get curve(){return this._curve}set curve(e){this._curve=e}start(e,t,n,a=1){ii(this.buffer.loaded,"buffer is either not set or not loaded");const i=this.toSeconds(e);this._startGain(i,a),t=this.loop?zi(t,this.loopStart):zi(t,0);let s=Math.max(this.toSeconds(t),0);if(this.loop){const e=this.toSeconds(this.loopEnd)||this.buffer.duration,t=this.toSeconds(this.loopStart),n=e-t;Li(s,e)&&(s=(s-t)%n+t),ji(s,this.buffer.duration)&&(s=0)}if(this._source.buffer=this.buffer.get(),this._source.loopEnd=this.toSeconds(this.loopEnd)||this.buffer.duration,Pi(s,this.buffer.duration)&&(this._sourceStarted=!0,this._source.start(i,s)),di(n)){let e=this.toSeconds(n);e=Math.max(e,0),this.stop(i+e)}return this}_stopSource(e){!this._sourceStopped&&this._sourceStarted&&(this._sourceStopped=!0,this._source.stop(this.toSeconds(e)),this._onended())}get loopStart(){return this._source.loopStart}set loopStart(e){this._source.loopStart=this.toSeconds(e)}get loopEnd(){return this._source.loopEnd}set loopEnd(e){this._source.loopEnd=this.toSeconds(e)}get buffer(){return this._buffer}set buffer(e){this._buffer.set(e)}get loop(){return this._source.loop}set loop(e){this._source.loop=e,this._sourceStarted&&this.cancelStop()}dispose(){return super.dispose(),this._source.onended=null,this._source.disconnect(),this._buffer.dispose(),this.playbackRate.dispose(),this}}class nr extends er{constructor(){super(Di(nr.getDefaults(),arguments,["type"])),this.name="Noise",this._source=null;const e=Di(nr.getDefaults(),arguments,["type"]);this._playbackRate=e.playbackRate,this.type=e.type,this._fadeIn=e.fadeIn,this._fadeOut=e.fadeOut}static getDefaults(){return Object.assign(er.getDefaults(),{fadeIn:0,fadeOut:0,playbackRate:1,type:"white"})}get type(){return this._type}set type(e){if(ii(e in sr,"Noise: invalid type: "+e),this._type!==e&&(this._type=e,"started"===this.state)){const e=this.now();this._stop(e),this._start(e)}}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this._source&&(this._source.playbackRate.value=e)}_start(e){const t=sr[this._type];this._source=new tr({url:t,context:this.context,fadeIn:this._fadeIn,fadeOut:this._fadeOut,loop:!0,onended:()=>this.onstop(this),playbackRate:this._playbackRate}).connect(this.output),this._source.start(this.toSeconds(e),Math.random()*(t.duration-.001))}_stop(e){this._source&&(this._source.stop(this.toSeconds(e)),this._source=null)}get fadeIn(){return this._fadeIn}set fadeIn(e){this._fadeIn=e,this._source&&(this._source.fadeIn=this._fadeIn)}get fadeOut(){return this._fadeOut}set fadeOut(e){this._fadeOut=e,this._source&&(this._source.fadeOut=this._fadeOut)}_restart(e){this._stop(e),this._start(e)}dispose(){return super.dispose(),this._source&&this._source.disconnect(),this}}const ar=220500,ir={brown:null,pink:null,white:null},sr={get brown(){if(!ir.brown){const e=[];for(let t=0;t<2;t++){const n=new Float32Array(ar);e[t]=n;let a=0;for(let e=0;et.label===e||t.deviceId===e)),!this._device&&t.length>0&&(this._device=t[0]),ii(di(this._device),`No matching device ${e}`));const n={audio:{echoCancellation:!1,sampleRate:this.context.sampleRate,noiseSuppression:!1,mozNoiseSuppression:!1}};this._device&&(n.audio.deviceId=this._device.deviceId);const a=yield navigator.mediaDevices.getUserMedia(n);if(!this._stream){this._stream=a;const e=this.context.createMediaStreamSource(a);_s(e,this.output),this._mediaStream=e}return this}))}close(){return this._stream&&this._mediaStream&&(this._stream.getAudioTracks().forEach((e=>{e.stop()})),this._stream=void 0,this._mediaStream.disconnect(),this._mediaStream=void 0),this._device=void 0,this}static enumerateDevices(){return xi(this,void 0,void 0,(function*(){return(yield navigator.mediaDevices.enumerateDevices()).filter((e=>"audioinput"===e.kind))}))}get state(){return this._stream&&this._stream.active?"started":"stopped"}get deviceId(){return this._device?this._device.deviceId:void 0}get groupId(){return this._device?this._device.groupId:void 0}get label(){return this._device?this._device.label:void 0}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}dispose(){return super.dispose(),this.close(),this._volume.dispose(),this.volume.dispose(),this}static get supported(){return di(navigator.mediaDevices)&&di(navigator.mediaDevices.getUserMedia)}}function or(e,t){return xi(this,void 0,void 0,(function*(){const n=t/e.context.sampleRate,a=new es(1,n,e.context.sampleRate);new e.constructor(Object.assign(e.get(),{frequency:2/n,detune:0,context:a})).toDestination().start(0);return(yield a.render()).getChannelData(0)}))}class lr extends Ns{constructor(){super(Di(lr.getDefaults(),arguments,["frequency","type"])),this.name="ToneOscillatorNode",this._oscillator=this.context.createOscillator(),this._internalChannels=[this._oscillator];const e=Di(lr.getDefaults(),arguments,["frequency","type"]);_s(this._oscillator,this._gainNode),this.type=e.type,this.frequency=new Cs({context:this.context,param:this._oscillator.frequency,units:"frequency",value:e.frequency}),this.detune=new Cs({context:this.context,param:this._oscillator.detune,units:"cents",value:e.detune}),Xi(this,["frequency","detune"])}static getDefaults(){return Object.assign(Ns.getDefaults(),{detune:0,frequency:440,type:"sine"})}start(e){const t=this.toSeconds(e);return this.log("start",t),this._startGain(t),this._oscillator.start(t),this}_stopSource(e){this._oscillator.stop(e)}setPeriodicWave(e){return this._oscillator.setPeriodicWave(e),this}get type(){return this._oscillator.type}set type(e){this._oscillator.type=e}dispose(){return super.dispose(),"started"===this.state&&this.stop(),this._oscillator.disconnect(),this.frequency.dispose(),this.detune.dispose(),this}}class ur extends er{constructor(){super(Di(ur.getDefaults(),arguments,["frequency","type"])),this.name="Oscillator",this._oscillator=null;const e=Di(ur.getDefaults(),arguments,["frequency","type"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),Xi(this,"frequency"),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),Xi(this,"detune"),this._partials=e.partials,this._partialCount=e.partialCount,this._type=e.type,e.partialCount&&"custom"!==e.type&&(this._type=this.baseType+e.partialCount.toString()),this.phase=e.phase}static getDefaults(){return Object.assign(er.getDefaults(),{detune:0,frequency:440,partialCount:0,partials:[],phase:0,type:"sine"})}_start(e){const t=this.toSeconds(e),n=new lr({context:this.context,onended:()=>this.onstop(this)});this._oscillator=n,this._wave?this._oscillator.setPeriodicWave(this._wave):this._oscillator.type=this._type,this._oscillator.connect(this.output),this.frequency.connect(this._oscillator.frequency),this.detune.connect(this._oscillator.detune),this._oscillator.start(t)}_stop(e){const t=this.toSeconds(e);this._oscillator&&this._oscillator.stop(t)}_restart(e){const t=this.toSeconds(e);return this.log("restart",t),this._oscillator&&this._oscillator.cancelStop(),this._state.cancel(t),this}syncFrequency(){return this.context.transport.syncSignal(this.frequency),this}unsyncFrequency(){return this.context.transport.unsyncSignal(this.frequency),this}_getCachedPeriodicWave(){if("custom"===this._type){return ur._periodicWaveCache.find((e=>{return e.phase===this._phase&&(t=e.partials,n=this._partials,t.length===n.length&&t.every(((e,t)=>n[t]===e)));var t,n}))}{const e=ur._periodicWaveCache.find((e=>e.type===this._type&&e.phase===this._phase));return this._partialCount=e?e.partialCount:this._partialCount,e}}get type(){return this._type}set type(e){this._type=e;const t=-1!==["sine","square","sawtooth","triangle"].indexOf(e);if(0===this._phase&&t)this._wave=void 0,this._partialCount=0,null!==this._oscillator&&(this._oscillator.type=e);else{const t=this._getCachedPeriodicWave();if(di(t)){const{partials:e,wave:n}=t;this._wave=n,this._partials=e,null!==this._oscillator&&this._oscillator.setPeriodicWave(this._wave)}else{const[t,n]=this._getRealImaginary(e,this._phase),a=this.context.createPeriodicWave(t,n);this._wave=a,null!==this._oscillator&&this._oscillator.setPeriodicWave(this._wave),ur._periodicWaveCache.push({imag:n,partialCount:this._partialCount,partials:this._partials,phase:this._phase,real:t,type:this._type,wave:this._wave}),ur._periodicWaveCache.length>100&&ur._periodicWaveCache.shift()}}}get baseType(){return this._type.replace(this.partialCount.toString(),"")}set baseType(e){this.partialCount&&"custom"!==this._type&&"custom"!==e?this.type=e+this.partialCount:this.type=e}get partialCount(){return this._partialCount}set partialCount(e){si(e,0);let t=this._type;const n=/^(sine|triangle|square|sawtooth)(\d+)$/.exec(this._type);if(n&&(t=n[1]),"custom"!==this._type)this.type=0===e?t:t+e.toString();else{const t=new Float32Array(e);this._partials.forEach(((e,n)=>t[n]=e)),this._partials=Array.from(t),this.type=this._type}}_getRealImaginary(e,t){let n=2048;const a=new Float32Array(n),i=new Float32Array(n);let s=1;if("custom"===e){if(s=this._partials.length+1,this._partialCount=this._partials.length,n=s,0===this._partials.length)return[a,i]}else{const t=/^(sine|triangle|square|sawtooth)(\d+)$/.exec(e);t?(s=parseInt(t[2],10)+1,this._partialCount=parseInt(t[2],10),e=t[1],s=Math.max(s,2),n=s):this._partialCount=0,this._partials=[]}for(let r=1;r>1&1?-1:1):0,this._partials[r-1]=o;break;case"custom":o=this._partials[r-1];break;default:throw new TypeError("Oscillator: invalid type: "+e)}0!==o?(a[r]=-o*Math.sin(t*r),i[r]=o*Math.cos(t*r)):(a[r]=0,i[r]=0)}return[a,i]}_inverseFFT(e,t,n){let a=0;const i=e.length;for(let s=0;st.includes(e))),"oversampling must be either 'none', '2x', or '4x'"),this._shaper.oversample=e}dispose(){return super.dispose(),this._shaper.disconnect(),this}}class dr extends cr{constructor(){super(...arguments),this.name="AudioToGain",this._norm=new hr({context:this.context,mapping:e=>(e+1)/2}),this.input=this._norm,this.output=this._norm}dispose(){return super.dispose(),this._norm.dispose(),this}}class pr extends Ds{constructor(){super(Object.assign(Di(pr.getDefaults(),arguments,["value"]))),this.name="Multiply",this.override=!1;const e=Di(pr.getDefaults(),arguments,["value"]);this._mult=this.input=this.output=new Is({context:this.context,minValue:e.minValue,maxValue:e.maxValue}),this.factor=this._param=this._mult.gain,this.factor.setValueAtTime(e.value,0)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._mult.dispose(),this}}class mr extends er{constructor(){super(Di(mr.getDefaults(),arguments,["frequency","type","modulationType"])),this.name="AMOscillator",this._modulationScale=new dr({context:this.context}),this._modulationNode=new Is({context:this.context});const e=Di(mr.getDefaults(),arguments,["frequency","type","modulationType"]);this._carrier=new ur({context:this.context,detune:e.detune,frequency:e.frequency,onstop:()=>this.onstop(this),phase:e.phase,type:e.type}),this.frequency=this._carrier.frequency,this.detune=this._carrier.detune,this._modulator=new ur({context:this.context,phase:e.phase,type:e.modulationType}),this.harmonicity=new pr({context:this.context,units:"positive",value:e.harmonicity}),this.frequency.chain(this.harmonicity,this._modulator.frequency),this._modulator.chain(this._modulationScale,this._modulationNode.gain),this._carrier.chain(this._modulationNode,this.output),Xi(this,["frequency","detune","harmonicity"])}static getDefaults(){return Object.assign(ur.getDefaults(),{harmonicity:1,modulationType:"square"})}_start(e){this._modulator.start(e),this._carrier.start(e)}_stop(e){this._modulator.stop(e),this._carrier.stop(e)}_restart(e){this._modulator.restart(e),this._carrier.restart(e)}get type(){return this._carrier.type}set type(e){this._carrier.type=e}get baseType(){return this._carrier.baseType}set baseType(e){this._carrier.baseType=e}get partialCount(){return this._carrier.partialCount}set partialCount(e){this._carrier.partialCount=e}get modulationType(){return this._modulator.type}set modulationType(e){this._modulator.type=e}get phase(){return this._carrier.phase}set phase(e){this._carrier.phase=e,this._modulator.phase=e}get partials(){return this._carrier.partials}set partials(e){this._carrier.partials=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.frequency.dispose(),this.detune.dispose(),this.harmonicity.dispose(),this._carrier.dispose(),this._modulator.dispose(),this._modulationNode.dispose(),this._modulationScale.dispose(),this}}class fr extends er{constructor(){super(Di(fr.getDefaults(),arguments,["frequency","type","modulationType"])),this.name="FMOscillator",this._modulationNode=new Is({context:this.context,gain:0});const e=Di(fr.getDefaults(),arguments,["frequency","type","modulationType"]);this._carrier=new ur({context:this.context,detune:e.detune,frequency:0,onstop:()=>this.onstop(this),phase:e.phase,type:e.type}),this.detune=this._carrier.detune,this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),this._modulator=new ur({context:this.context,phase:e.phase,type:e.modulationType}),this.harmonicity=new pr({context:this.context,units:"positive",value:e.harmonicity}),this.modulationIndex=new pr({context:this.context,units:"positive",value:e.modulationIndex}),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.frequency.chain(this.modulationIndex,this._modulationNode),this._modulator.connect(this._modulationNode.gain),this._modulationNode.connect(this._carrier.frequency),this._carrier.connect(this.output),this.detune.connect(this._modulator.detune),Xi(this,["modulationIndex","frequency","detune","harmonicity"])}static getDefaults(){return Object.assign(ur.getDefaults(),{harmonicity:1,modulationIndex:2,modulationType:"square"})}_start(e){this._modulator.start(e),this._carrier.start(e)}_stop(e){this._modulator.stop(e),this._carrier.stop(e)}_restart(e){return this._modulator.restart(e),this._carrier.restart(e),this}get type(){return this._carrier.type}set type(e){this._carrier.type=e}get baseType(){return this._carrier.baseType}set baseType(e){this._carrier.baseType=e}get partialCount(){return this._carrier.partialCount}set partialCount(e){this._carrier.partialCount=e}get modulationType(){return this._modulator.type}set modulationType(e){this._modulator.type=e}get phase(){return this._carrier.phase}set phase(e){this._carrier.phase=e,this._modulator.phase=e}get partials(){return this._carrier.partials}set partials(e){this._carrier.partials=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.frequency.dispose(),this.harmonicity.dispose(),this._carrier.dispose(),this._modulator.dispose(),this._modulationNode.dispose(),this.modulationIndex.dispose(),this}}class gr extends er{constructor(){super(Di(gr.getDefaults(),arguments,["frequency","width"])),this.name="PulseOscillator",this._widthGate=new Is({context:this.context,gain:0}),this._thresh=new hr({context:this.context,mapping:e=>e<=0?-1:1});const e=Di(gr.getDefaults(),arguments,["frequency","width"]);this.width=new Ds({context:this.context,units:"audioRange",value:e.width}),this._triangle=new ur({context:this.context,detune:e.detune,frequency:e.frequency,onstop:()=>this.onstop(this),phase:e.phase,type:"triangle"}),this.frequency=this._triangle.frequency,this.detune=this._triangle.detune,this._triangle.chain(this._thresh,this.output),this.width.chain(this._widthGate,this._thresh),Xi(this,["width","frequency","detune"])}static getDefaults(){return Object.assign(er.getDefaults(),{detune:0,frequency:440,phase:0,type:"pulse",width:.2})}_start(e){e=this.toSeconds(e),this._triangle.start(e),this._widthGate.gain.setValueAtTime(1,e)}_stop(e){e=this.toSeconds(e),this._triangle.stop(e),this._widthGate.gain.cancelScheduledValues(e),this._widthGate.gain.setValueAtTime(0,e)}_restart(e){this._triangle.restart(e),this._widthGate.gain.cancelScheduledValues(e),this._widthGate.gain.setValueAtTime(1,e)}get phase(){return this._triangle.phase}set phase(e){this._triangle.phase=e}get type(){return"pulse"}get baseType(){return"pulse"}get partials(){return[]}get partialCount(){return 0}set carrierType(e){this._triangle.type=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this._triangle.dispose(),this.width.dispose(),this._widthGate.dispose(),this._thresh.dispose(),this}}class yr extends er{constructor(){super(Di(yr.getDefaults(),arguments,["frequency","type","spread"])),this.name="FatOscillator",this._oscillators=[];const e=Di(yr.getDefaults(),arguments,["frequency","type","spread"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),this._spread=e.spread,this._type=e.type,this._phase=e.phase,this._partials=e.partials,this._partialCount=e.partialCount,this.count=e.count,Xi(this,["frequency","detune"])}static getDefaults(){return Object.assign(ur.getDefaults(),{count:3,spread:20,type:"sawtooth"})}_start(e){e=this.toSeconds(e),this._forEach((t=>t.start(e)))}_stop(e){e=this.toSeconds(e),this._forEach((t=>t.stop(e)))}_restart(e){this._forEach((t=>t.restart(e)))}_forEach(e){for(let t=0;tt.type=e))}get spread(){return this._spread}set spread(e){if(this._spread=e,this._oscillators.length>1){const t=-e/2,n=e/(this._oscillators.length-1);this._forEach(((e,a)=>e.detune.value=t+n*a))}}get count(){return this._oscillators.length}set count(e){if(si(e,1),this._oscillators.length!==e){this._forEach((e=>e.dispose())),this._oscillators=[];for(let t=0;tthis.onstop(this):Qi});"custom"===this.type&&(n.partials=this._partials),this.frequency.connect(n.frequency),this.detune.connect(n.detune),n.detune.overridden=!1,n.connect(this.output),this._oscillators[t]=n}this.spread=this._spread,"started"===this.state&&this._forEach((e=>e.start()))}}get phase(){return this._phase}set phase(e){this._phase=e,this._forEach(((e,t)=>e.phase=this._phase+t/this.count*360))}get baseType(){return this._oscillators[0].baseType}set baseType(e){this._forEach((t=>t.baseType=e)),this._type=this._oscillators[0].type}get partials(){return this._oscillators[0].partials}set partials(e){this._partials=e,this._partialCount=this._partials.length,e.length&&(this._type="custom",this._forEach((t=>t.partials=e)))}get partialCount(){return this._oscillators[0].partialCount}set partialCount(e){this._partialCount=e,this._forEach((t=>t.partialCount=e)),this._type=this._oscillators[0].type}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.frequency.dispose(),this.detune.dispose(),this._forEach((e=>e.dispose())),this}}class br extends er{constructor(){super(Di(br.getDefaults(),arguments,["frequency","modulationFrequency"])),this.name="PWMOscillator",this.sourceType="pwm",this._scale=new pr({context:this.context,value:2});const e=Di(br.getDefaults(),arguments,["frequency","modulationFrequency"]);this._pulse=new gr({context:this.context,frequency:e.modulationFrequency}),this._pulse.carrierType="sine",this.modulationFrequency=this._pulse.frequency,this._modulator=new ur({context:this.context,detune:e.detune,frequency:e.frequency,onstop:()=>this.onstop(this),phase:e.phase}),this.frequency=this._modulator.frequency,this.detune=this._modulator.detune,this._modulator.chain(this._scale,this._pulse.width),this._pulse.connect(this.output),Xi(this,["modulationFrequency","frequency","detune"])}static getDefaults(){return Object.assign(er.getDefaults(),{detune:0,frequency:440,modulationFrequency:.4,phase:0,type:"pwm"})}_start(e){e=this.toSeconds(e),this._modulator.start(e),this._pulse.start(e)}_stop(e){e=this.toSeconds(e),this._modulator.stop(e),this._pulse.stop(e)}_restart(e){this._modulator.restart(e),this._pulse.restart(e)}get type(){return"pwm"}get baseType(){return"pwm"}get partials(){return[]}get partialCount(){return 0}get phase(){return this._modulator.phase}set phase(e){this._modulator.phase=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this._pulse.dispose(),this._scale.dispose(),this._modulator.dispose(),this}}const vr={am:mr,fat:yr,fm:fr,oscillator:ur,pulse:gr,pwm:br};class kr extends er{constructor(){super(Di(kr.getDefaults(),arguments,["frequency","type"])),this.name="OmniOscillator";const e=Di(kr.getDefaults(),arguments,["frequency","type"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),Xi(this,["frequency","detune"]),this.set(e)}static getDefaults(){return Object.assign(ur.getDefaults(),fr.getDefaults(),mr.getDefaults(),yr.getDefaults(),gr.getDefaults(),br.getDefaults())}_start(e){this._oscillator.start(e)}_stop(e){this._oscillator.stop(e)}_restart(e){return this._oscillator.restart(e),this}get type(){let e="";return["am","fm","fat"].some((e=>this._sourceType===e))&&(e=this._sourceType),e+this._oscillator.type}set type(e){"fm"===e.substr(0,2)?(this._createNewOscillator("fm"),this._oscillator=this._oscillator,this._oscillator.type=e.substr(2)):"am"===e.substr(0,2)?(this._createNewOscillator("am"),this._oscillator=this._oscillator,this._oscillator.type=e.substr(2)):"fat"===e.substr(0,3)?(this._createNewOscillator("fat"),this._oscillator=this._oscillator,this._oscillator.type=e.substr(3)):"pwm"===e?(this._createNewOscillator("pwm"),this._oscillator=this._oscillator):"pulse"===e?this._createNewOscillator("pulse"):(this._createNewOscillator("oscillator"),this._oscillator=this._oscillator,this._oscillator.type=e)}get partials(){return this._oscillator.partials}set partials(e){this._getOscType(this._oscillator,"pulse")||this._getOscType(this._oscillator,"pwm")||(this._oscillator.partials=e)}get partialCount(){return this._oscillator.partialCount}set partialCount(e){this._getOscType(this._oscillator,"pulse")||this._getOscType(this._oscillator,"pwm")||(this._oscillator.partialCount=e)}set(e){return Reflect.has(e,"type")&&e.type&&(this.type=e.type),super.set(e),this}_createNewOscillator(e){if(e!==this._sourceType){this._sourceType=e;const t=vr[e],n=this.now();if(this._oscillator){const e=this._oscillator;e.stop(n),this.context.setTimeout((()=>e.dispose()),this.blockTime)}this._oscillator=new t({context:this.context}),this.frequency.connect(this._oscillator.frequency),this.detune.connect(this._oscillator.detune),this._oscillator.connect(this.output),this._oscillator.onstop=()=>this.onstop(this),"started"===this.state&&this._oscillator.start(n)}}get phase(){return this._oscillator.phase}set phase(e){this._oscillator.phase=e}get sourceType(){return this._sourceType}set sourceType(e){let t="sine";"pwm"!==this._oscillator.type&&"pulse"!==this._oscillator.type&&(t=this._oscillator.type),"fm"===e?this.type="fm"+t:"am"===e?this.type="am"+t:"fat"===e?this.type="fat"+t:"oscillator"===e?this.type=t:"pulse"===e?this.type="pulse":"pwm"===e&&(this.type="pwm")}_getOscType(e,t){return e instanceof vr[t]}get baseType(){return this._oscillator.baseType}set baseType(e){this._getOscType(this._oscillator,"pulse")||this._getOscType(this._oscillator,"pwm")||"pulse"===e||"pwm"===e||(this._oscillator.baseType=e)}get width(){return this._getOscType(this._oscillator,"pulse")?this._oscillator.width:void 0}get count(){return this._getOscType(this._oscillator,"fat")?this._oscillator.count:void 0}set count(e){this._getOscType(this._oscillator,"fat")&&mi(e)&&(this._oscillator.count=e)}get spread(){return this._getOscType(this._oscillator,"fat")?this._oscillator.spread:void 0}set spread(e){this._getOscType(this._oscillator,"fat")&&mi(e)&&(this._oscillator.spread=e)}get modulationType(){return this._getOscType(this._oscillator,"fm")||this._getOscType(this._oscillator,"am")?this._oscillator.modulationType:void 0}set modulationType(e){(this._getOscType(this._oscillator,"fm")||this._getOscType(this._oscillator,"am"))&&bi(e)&&(this._oscillator.modulationType=e)}get modulationIndex(){return this._getOscType(this._oscillator,"fm")?this._oscillator.modulationIndex:void 0}get harmonicity(){return this._getOscType(this._oscillator,"fm")||this._getOscType(this._oscillator,"am")?this._oscillator.harmonicity:void 0}get modulationFrequency(){return this._getOscType(this._oscillator,"pwm")?this._oscillator.modulationFrequency:void 0}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.detune.dispose(),this.frequency.dispose(),this._oscillator.dispose(),this}}class wr extends Ds{constructor(){super(Object.assign(Di(wr.getDefaults(),arguments,["value"]))),this.override=!1,this.name="Add",this._sum=new Is({context:this.context}),this.input=this._sum,this.output=this._sum,this.addend=this._param,Es(this._constantSource,this._sum)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._sum.dispose(),this}}class Ar extends cr{constructor(){super(Object.assign(Di(Ar.getDefaults(),arguments,["min","max"]))),this.name="Scale";const e=Di(Ar.getDefaults(),arguments,["min","max"]);this._mult=this.input=new pr({context:this.context,value:e.max-e.min}),this._add=this.output=new wr({context:this.context,value:e.min}),this._min=e.min,this._max=e.max,this.input.connect(this.output)}static getDefaults(){return Object.assign(cr.getDefaults(),{max:1,min:0})}get min(){return this._min}set min(e){this._min=e,this._setRange()}get max(){return this._max}set max(e){this._max=e,this._setRange()}_setRange(){this._add.value=this._min,this._mult.value=this._max-this._min}dispose(){return super.dispose(),this._add.dispose(),this._mult.dispose(),this}}class xr extends cr{constructor(){super(Object.assign(Di(xr.getDefaults(),arguments))),this.name="Zero",this._gain=new Is({context:this.context}),this.output=this._gain,this.input=void 0,_s(this.context.getConstant(0),this._gain)}dispose(){return super.dispose(),Ts(this.context.getConstant(0),this._gain),this}}class Cr extends Ss{constructor(){super(Di(Cr.getDefaults(),arguments,["frequency","min","max"])),this.name="LFO",this._stoppedValue=0,this._units="number",this.convert=!0,this._fromType=Cs.prototype._fromType,this._toType=Cs.prototype._toType,this._is=Cs.prototype._is,this._clampValue=Cs.prototype._clampValue;const e=Di(Cr.getDefaults(),arguments,["frequency","min","max"]);this._oscillator=new ur(e),this.frequency=this._oscillator.frequency,this._amplitudeGain=new Is({context:this.context,gain:e.amplitude,units:"normalRange"}),this.amplitude=this._amplitudeGain.gain,this._stoppedSignal=new Ds({context:this.context,units:"audioRange",value:0}),this._zeros=new xr({context:this.context}),this._a2g=new dr({context:this.context}),this._scaler=this.output=new Ar({context:this.context,max:e.max,min:e.min}),this.units=e.units,this.min=e.min,this.max=e.max,this._oscillator.chain(this._amplitudeGain,this._a2g,this._scaler),this._zeros.connect(this._a2g),this._stoppedSignal.connect(this._a2g),Xi(this,["amplitude","frequency"]),this.phase=e.phase}static getDefaults(){return Object.assign(ur.getDefaults(),{amplitude:1,frequency:"4n",max:1,min:0,type:"sine",units:"number"})}start(e){return e=this.toSeconds(e),this._stoppedSignal.setValueAtTime(0,e),this._oscillator.start(e),this}stop(e){return e=this.toSeconds(e),this._stoppedSignal.setValueAtTime(this._stoppedValue,e),this._oscillator.stop(e),this}sync(){return this._oscillator.sync(),this._oscillator.syncFrequency(),this}unsync(){return this._oscillator.unsync(),this._oscillator.unsyncFrequency(),this}_setStoppedValue(){this._stoppedValue=this._oscillator.getInitialValue(),this._stoppedSignal.value=this._stoppedValue}get min(){return this._toType(this._scaler.min)}set min(e){e=this._fromType(e),this._scaler.min=e}get max(){return this._toType(this._scaler.max)}set max(e){e=this._fromType(e),this._scaler.max=e}get type(){return this._oscillator.type}set type(e){this._oscillator.type=e,this._setStoppedValue()}get partials(){return this._oscillator.partials}set partials(e){this._oscillator.partials=e,this._setStoppedValue()}get phase(){return this._oscillator.phase}set phase(e){this._oscillator.phase=e,this._setStoppedValue()}get units(){return this._units}set units(e){const t=this.min,n=this.max;this._units=e,this.min=t,this.max=n}get state(){return this._oscillator.state}connect(e,t,n){return(e instanceof Cs||e instanceof Ds)&&(this.convert=e.convert,this.units=e.units),zs(this,e,t,n),this}dispose(){return super.dispose(),this._oscillator.dispose(),this._stoppedSignal.dispose(),this._zeros.dispose(),this._scaler.dispose(),this._a2g.dispose(),this._amplitudeGain.dispose(),this.amplitude.dispose(),this}}function Sr(e,t=1/0){const n=new WeakMap;return function(a,i){Reflect.defineProperty(a,i,{configurable:!0,enumerable:!0,get:function(){return n.get(this)},set:function(a){si(a,e,t),n.set(this,a)}})}}function Er(e,t=1/0){const n=new WeakMap;return function(a,i){Reflect.defineProperty(a,i,{configurable:!0,enumerable:!0,get:function(){return n.get(this)},set:function(a){si(this.toSeconds(a),e,t),n.set(this,a)}})}}class _r extends er{constructor(){super(Di(_r.getDefaults(),arguments,["url","onload"])),this.name="Player",this._activeSources=new Set;const e=Di(_r.getDefaults(),arguments,["url","onload"]);this._buffer=new Ji({onload:this._onload.bind(this,e.onload),onerror:e.onerror,reverse:e.reverse,url:e.url}),this.autostart=e.autostart,this._loop=e.loop,this._loopStart=e.loopStart,this._loopEnd=e.loopEnd,this._playbackRate=e.playbackRate,this.fadeIn=e.fadeIn,this.fadeOut=e.fadeOut}static getDefaults(){return Object.assign(er.getDefaults(),{autostart:!1,fadeIn:0,fadeOut:0,loop:!1,loopEnd:0,loopStart:0,onload:Qi,onerror:Qi,playbackRate:1,reverse:!1})}load(e){return xi(this,void 0,void 0,(function*(){return yield this._buffer.load(e),this._onload(),this}))}_onload(e=Qi){e(),this.autostart&&this.start()}_onSourceEnd(e){this.onstop(this),this._activeSources.delete(e),0!==this._activeSources.size||this._synced||"started"!==this._state.getValueAtTime(this.now())||(this._state.cancel(this.now()),this._state.setStateAtTime("stopped",this.now()))}start(e,t,n){return super.start(e,t,n),this}_start(e,t,n){t=this._loop?zi(t,this._loopStart):zi(t,0);const a=this.toSeconds(t),i=n;n=zi(n,Math.max(this._buffer.duration-a,0));let s=this.toSeconds(n);s/=this._playbackRate,e=this.toSeconds(e);const r=new tr({url:this._buffer,context:this.context,fadeIn:this.fadeIn,fadeOut:this.fadeOut,loop:this._loop,loopEnd:this._loopEnd,loopStart:this._loopStart,onended:this._onSourceEnd.bind(this),playbackRate:this._playbackRate}).connect(this.output);this._loop||this._synced||(this._state.cancel(e+s),this._state.setStateAtTime("stopped",e+s,{implicitEnd:!0})),this._activeSources.add(r),this._loop&&hi(i)?r.start(e,a):r.start(e,a,s-this.toSeconds(this.fadeOut))}_stop(e){const t=this.toSeconds(e);this._activeSources.forEach((e=>e.stop(t)))}restart(e,t,n){return super.restart(e,t,n),this}_restart(e,t,n){this._stop(e),this._start(e,t,n)}seek(e,t){const n=this.toSeconds(t);if("started"===this._state.getValueAtTime(n)){const t=this.toSeconds(e);this._stop(n),this._start(n,t)}return this}setLoopPoints(e,t){return this.loopStart=e,this.loopEnd=t,this}get loopStart(){return this._loopStart}set loopStart(e){this._loopStart=e,this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._activeSources.forEach((t=>{t.loopStart=e}))}get loopEnd(){return this._loopEnd}set loopEnd(e){this._loopEnd=e,this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._activeSources.forEach((t=>{t.loopEnd=e}))}get buffer(){return this._buffer}set buffer(e){this._buffer.set(e)}get loop(){return this._loop}set loop(e){if(this._loop!==e&&(this._loop=e,this._activeSources.forEach((t=>{t.loop=e})),e)){const e=this._state.getNextState("stopped",this.now());e&&this._state.cancel(e.time)}}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e;const t=this.now(),n=this._state.getNextState("stopped",t);n&&n.implicitEnd&&(this._state.cancel(n.time),this._activeSources.forEach((e=>e.cancelStop()))),this._activeSources.forEach((n=>{n.playbackRate.setValueAtTime(e,t)}))}get reverse(){return this._buffer.reverse}set reverse(e){this._buffer.reverse=e}get loaded(){return this._buffer.loaded}dispose(){return super.dispose(),this._activeSources.forEach((e=>e.dispose())),this._activeSources.clear(),this._buffer.dispose(),this}}Ai([Er(0)],_r.prototype,"fadeIn",void 0),Ai([Er(0)],_r.prototype,"fadeOut",void 0);class Tr extends Ss{constructor(){super(Di(Tr.getDefaults(),arguments,["urls","onload"],"urls")),this.name="Players",this.input=void 0,this._players=new Map;const e=Di(Tr.getDefaults(),arguments,["urls","onload"],"urls");this._volume=this.output=new $s({context:this.context,volume:e.volume}),this.volume=this._volume.volume,Xi(this,"volume"),this._buffers=new js({urls:e.urls,onload:e.onload,baseUrl:e.baseUrl,onerror:e.onerror}),this.mute=e.mute,this._fadeIn=e.fadeIn,this._fadeOut=e.fadeOut}static getDefaults(){return Object.assign(er.getDefaults(),{baseUrl:"",fadeIn:0,fadeOut:0,mute:!1,onload:Qi,onerror:Qi,urls:{},volume:0})}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}get fadeIn(){return this._fadeIn}set fadeIn(e){this._fadeIn=e,this._players.forEach((t=>{t.fadeIn=e}))}get fadeOut(){return this._fadeOut}set fadeOut(e){this._fadeOut=e,this._players.forEach((t=>{t.fadeOut=e}))}get state(){return Array.from(this._players).some((([e,t])=>"started"===t.state))?"started":"stopped"}has(e){return this._buffers.has(e)}player(e){if(ii(this.has(e),`No Player with the name ${e} exists on this object`),!this._players.has(e)){const t=new _r({context:this.context,fadeIn:this._fadeIn,fadeOut:this._fadeOut,url:this._buffers.get(e)}).connect(this.output);this._players.set(e,t)}return this._players.get(e)}get loaded(){return this._buffers.loaded}add(e,t,n){return ii(!this._buffers.has(e),"A buffer with that name already exists on this object"),this._buffers.add(e,t,n),this}stopAll(e){return this._players.forEach((t=>t.stop(e))),this}dispose(){return super.dispose(),this._volume.dispose(),this.volume.dispose(),this._players.forEach((e=>e.dispose())),this._buffers.dispose(),this}}class Ir extends er{constructor(){super(Di(Ir.getDefaults(),arguments,["url","onload"])),this.name="GrainPlayer",this._loopStart=0,this._loopEnd=0,this._activeSources=[];const e=Di(Ir.getDefaults(),arguments,["url","onload"]);this.buffer=new Ji({onload:e.onload,onerror:e.onerror,reverse:e.reverse,url:e.url}),this._clock=new Fs({context:this.context,callback:this._tick.bind(this),frequency:1/e.grainSize}),this._playbackRate=e.playbackRate,this._grainSize=e.grainSize,this._overlap=e.overlap,this.detune=e.detune,this.overlap=e.overlap,this.loop=e.loop,this.playbackRate=e.playbackRate,this.grainSize=e.grainSize,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this.reverse=e.reverse,this._clock.on("stop",this._onstop.bind(this))}static getDefaults(){return Object.assign(er.getDefaults(),{onload:Qi,onerror:Qi,overlap:.1,grainSize:.2,playbackRate:1,detune:0,loop:!1,loopStart:0,loopEnd:0,reverse:!1})}_start(e,t,n){t=zi(t,0),t=this.toSeconds(t),e=this.toSeconds(e);const a=1/this._clock.frequency.getValueAtTime(e);this._clock.start(e,t/a),n&&this.stop(e+this.toSeconds(n))}restart(e,t,n){return super.restart(e,t,n),this}_restart(e,t,n){this._stop(e),this._start(e,t,n)}_stop(e){this._clock.stop(e)}_onstop(e){this._activeSources.forEach((t=>{t.fadeOut=0,t.stop(e)})),this.onstop(this)}_tick(e){const t=this._clock.getTicksAtTime(e),n=t*this._grainSize;if(this.log("offset",n),!this.loop&&n>this.buffer.duration)return void this.stop(e);const a=n{const e=this._activeSources.indexOf(i);-1!==e&&this._activeSources.splice(e,1)}}get playbackRate(){return this._playbackRate}set playbackRate(e){si(e,.001),this._playbackRate=e,this.grainSize=this._grainSize}get loopStart(){return this._loopStart}set loopStart(e){this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._loopStart=this.toSeconds(e)}get loopEnd(){return this._loopEnd}set loopEnd(e){this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._loopEnd=this.toSeconds(e)}get reverse(){return this.buffer.reverse}set reverse(e){this.buffer.reverse=e}get grainSize(){return this._grainSize}set grainSize(e){this._grainSize=this.toSeconds(e),this._clock.frequency.setValueAtTime(this._playbackRate/this._grainSize,this.now())}get overlap(){return this._overlap}set overlap(e){const t=this.toSeconds(e);si(t,0),this._overlap=t}get loaded(){return this.buffer.loaded}dispose(){return super.dispose(),this.buffer.dispose(),this._clock.dispose(),this._activeSources.forEach((e=>e.dispose())),this}}class Nr extends cr{constructor(){super(...arguments),this.name="Abs",this._abs=new hr({context:this.context,mapping:e=>Math.abs(e)<.001?0:Math.abs(e)}),this.input=this._abs,this.output=this._abs}dispose(){return super.dispose(),this._abs.dispose(),this}}class Rr extends cr{constructor(){super(...arguments),this.name="GainToAudio",this._norm=new hr({context:this.context,mapping:e=>2*Math.abs(e)-1}),this.input=this._norm,this.output=this._norm}dispose(){return super.dispose(),this._norm.dispose(),this}}class Dr extends cr{constructor(){super(...arguments),this.name="Negate",this._multiply=new pr({context:this.context,value:-1}),this.input=this._multiply,this.output=this._multiply}dispose(){return super.dispose(),this._multiply.dispose(),this}}class zr extends Ds{constructor(){super(Object.assign(Di(zr.getDefaults(),arguments,["value"]))),this.override=!1,this.name="Subtract",this._sum=new Is({context:this.context}),this.input=this._sum,this.output=this._sum,this._neg=new Dr({context:this.context}),this.subtrahend=this._param,Es(this._constantSource,this._neg,this._sum)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._neg.dispose(),this._sum.dispose(),this}}class Or extends cr{constructor(){super(Object.assign(Di(Or.getDefaults(),arguments))),this.name="GreaterThanZero",this._thresh=this.output=new hr({context:this.context,length:127,mapping:e=>e<=0?0:1}),this._scale=this.input=new pr({context:this.context,value:1e4}),this._scale.connect(this._thresh)}dispose(){return super.dispose(),this._scale.dispose(),this._thresh.dispose(),this}}class Mr extends Ds{constructor(){super(Object.assign(Di(Mr.getDefaults(),arguments,["value"]))),this.name="GreaterThan",this.override=!1;const e=Di(Mr.getDefaults(),arguments,["value"]);this._subtract=this.input=new zr({context:this.context,value:e.value}),this._gtz=this.output=new Or({context:this.context}),this.comparator=this._param=this._subtract.subtrahend,Xi(this,"comparator"),this._subtract.connect(this._gtz)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._gtz.dispose(),this._subtract.dispose(),this.comparator.dispose(),this}}class Br extends cr{constructor(){super(Object.assign(Di(Br.getDefaults(),arguments,["value"]))),this.name="Pow";const e=Di(Br.getDefaults(),arguments,["value"]);this._exponentScaler=this.input=this.output=new hr({context:this.context,mapping:this._expFunc(e.value),length:8192}),this._exponent=e.value}static getDefaults(){return Object.assign(cr.getDefaults(),{value:1})}_expFunc(e){return t=>Math.pow(Math.abs(t),e)}get value(){return this._exponent}set value(e){this._exponent=e,this._exponentScaler.setMap(this._expFunc(this._exponent))}dispose(){return super.dispose(),this._exponentScaler.dispose(),this}}class Fr extends Ar{constructor(){super(Object.assign(Di(Fr.getDefaults(),arguments,["min","max","exponent"]))),this.name="ScaleExp";const e=Di(Fr.getDefaults(),arguments,["min","max","exponent"]);this.input=this._exp=new Br({context:this.context,value:e.exponent}),this._exp.connect(this._mult)}static getDefaults(){return Object.assign(Ar.getDefaults(),{exponent:1})}get exponent(){return this._exp.value}set exponent(e){this._exp.value=e}dispose(){return super.dispose(),this._exp.dispose(),this}}class Lr extends Ds{constructor(){super(Di(Ds.getDefaults(),arguments,["value","units"])),this.name="SyncedSignal",this.override=!1;const e=Di(Ds.getDefaults(),arguments,["value","units"]);this._lastVal=e.value,this._synced=this.context.transport.scheduleRepeat(this._onTick.bind(this),"1i"),this._syncedCallback=this._anchorValue.bind(this),this.context.transport.on("start",this._syncedCallback),this.context.transport.on("pause",this._syncedCallback),this.context.transport.on("stop",this._syncedCallback),this._constantSource.disconnect(),this._constantSource.stop(0),this._constantSource=this.output=new Rs({context:this.context,offset:e.value,units:e.units}).start(0),this.setValueAtTime(e.value,0)}_onTick(e){const t=super.getValueAtTime(this.context.transport.seconds);this._lastVal!==t&&(this._lastVal=t,this._constantSource.offset.setValueAtTime(t,e))}_anchorValue(e){const t=super.getValueAtTime(this.context.transport.seconds);this._lastVal=t,this._constantSource.offset.cancelAndHoldAtTime(e),this._constantSource.offset.setValueAtTime(t,e)}getValueAtTime(e){const t=new ks(this.context,e).toSeconds();return super.getValueAtTime(t)}setValueAtTime(e,t){const n=new ks(this.context,t).toSeconds();return super.setValueAtTime(e,n),this}linearRampToValueAtTime(e,t){const n=new ks(this.context,t).toSeconds();return super.linearRampToValueAtTime(e,n),this}exponentialRampToValueAtTime(e,t){const n=new ks(this.context,t).toSeconds();return super.exponentialRampToValueAtTime(e,n),this}setTargetAtTime(e,t,n){const a=new ks(this.context,t).toSeconds();return super.setTargetAtTime(e,a,n),this}cancelScheduledValues(e){const t=new ks(this.context,e).toSeconds();return super.cancelScheduledValues(t),this}setValueCurveAtTime(e,t,n,a){const i=new ks(this.context,t).toSeconds();return n=this.toSeconds(n),super.setValueCurveAtTime(e,i,n,a),this}cancelAndHoldAtTime(e){const t=new ks(this.context,e).toSeconds();return super.cancelAndHoldAtTime(t),this}setRampPoint(e){const t=new ks(this.context,e).toSeconds();return super.setRampPoint(t),this}exponentialRampTo(e,t,n){const a=new ks(this.context,n).toSeconds();return super.exponentialRampTo(e,t,a),this}linearRampTo(e,t,n){const a=new ks(this.context,n).toSeconds();return super.linearRampTo(e,t,a),this}targetRampTo(e,t,n){const a=new ks(this.context,n).toSeconds();return super.targetRampTo(e,t,a),this}dispose(){return super.dispose(),this.context.transport.clear(this._synced),this.context.transport.off("start",this._syncedCallback),this.context.transport.off("pause",this._syncedCallback),this.context.transport.off("stop",this._syncedCallback),this._constantSource.dispose(),this}}class Pr extends Ss{constructor(){super(Di(Pr.getDefaults(),arguments,["attack","decay","sustain","release"])),this.name="Envelope",this._sig=new Ds({context:this.context,value:0}),this.output=this._sig,this.input=void 0;const e=Di(Pr.getDefaults(),arguments,["attack","decay","sustain","release"]);this.attack=e.attack,this.decay=e.decay,this.sustain=e.sustain,this.release=e.release,this.attackCurve=e.attackCurve,this.releaseCurve=e.releaseCurve,this.decayCurve=e.decayCurve}static getDefaults(){return Object.assign(Ss.getDefaults(),{attack:.01,attackCurve:"linear",decay:.1,decayCurve:"exponential",release:1,releaseCurve:"exponential",sustain:.5})}get value(){return this.getValueAtTime(this.now())}_getCurve(e,t){if(bi(e))return e;{let n;for(n in jr)if(jr[n][t]===e)return n;return e}}_setCurve(e,t,n){if(bi(n)&&Reflect.has(jr,n)){const a=jr[n];fi(a)?"_decayCurve"!==e&&(this[e]=a[t]):this[e]=a}else{if(!yi(n)||"_decayCurve"===e)throw new Error("Envelope: invalid curve: "+n);this[e]=n}}get attackCurve(){return this._getCurve(this._attackCurve,"In")}set attackCurve(e){this._setCurve("_attackCurve","In",e)}get releaseCurve(){return this._getCurve(this._releaseCurve,"Out")}set releaseCurve(e){this._setCurve("_releaseCurve","Out",e)}get decayCurve(){return this._decayCurve}set decayCurve(e){ii(["linear","exponential"].some((t=>t===e)),`Invalid envelope curve: ${e}`),this._decayCurve=e}triggerAttack(e,t=1){this.log("triggerAttack",e,t),e=this.toSeconds(e);let n=this.toSeconds(this.attack);const a=this.toSeconds(this.decay),i=this.getValueAtTime(e);if(i>0){n=(1-i)/(1/n)}if(n0){const n=this.toSeconds(this.release);n{const e=128;let t,n;const a=[];for(t=0;t{const a=e[t],i=this.context.transport.schedule((a=>{e[t]=a,n.apply(this,e)}),a);this._scheduledEvents.push(i)}}unsync(){return this._scheduledEvents.forEach((e=>this.context.transport.clear(e))),this._scheduledEvents=[],this._synced&&(this._synced=!1,this.triggerAttack=this._original_triggerAttack,this.triggerRelease=this._original_triggerRelease),this}triggerAttackRelease(e,t,n,a){const i=this.toSeconds(n),s=this.toSeconds(t);return this.triggerAttack(e,i,a),this.triggerRelease(i+s),this}dispose(){return super.dispose(),this._volume.dispose(),this.unsync(),this._scheduledEvents=[],this}}class Ur extends Vr{constructor(){super(Di(Ur.getDefaults(),arguments));const e=Di(Ur.getDefaults(),arguments);this.portamento=e.portamento,this.onsilence=e.onsilence}static getDefaults(){return Object.assign(Vr.getDefaults(),{detune:0,onsilence:Qi,portamento:0})}triggerAttack(e,t,n=1){this.log("triggerAttack",e,t,n);const a=this.toSeconds(t);return this._triggerEnvelopeAttack(a,n),this.setNote(e,a),this}triggerRelease(e){this.log("triggerRelease",e);const t=this.toSeconds(e);return this._triggerEnvelopeRelease(t),this}setNote(e,t){const n=this.toSeconds(t),a=e instanceof gs?e.toFrequency():e;if(this.portamento>0&&this.getLevelAtTime(n)>.05){const e=this.toSeconds(this.portamento);this.frequency.exponentialRampTo(a,e,n)}else this.frequency.setValueAtTime(a,n);return this}}Ai([Er(0)],Ur.prototype,"portamento",void 0);class Wr extends Pr{constructor(){super(Di(Wr.getDefaults(),arguments,["attack","decay","sustain","release"])),this.name="AmplitudeEnvelope",this._gainNode=new Is({context:this.context,gain:0}),this.output=this._gainNode,this.input=this._gainNode,this._sig.connect(this._gainNode.gain),this.output=this._gainNode,this.input=this._gainNode}dispose(){return super.dispose(),this._gainNode.dispose(),this}}class Gr extends Ur{constructor(){super(Di(Gr.getDefaults(),arguments)),this.name="Synth";const e=Di(Gr.getDefaults(),arguments);this.oscillator=new kr(Object.assign({context:this.context,detune:e.detune,onstop:()=>this.onsilence(this)},e.oscillator)),this.frequency=this.oscillator.frequency,this.detune=this.oscillator.detune,this.envelope=new Wr(Object.assign({context:this.context},e.envelope)),this.oscillator.chain(this.envelope,this.output),Xi(this,["oscillator","frequency","detune","envelope"])}static getDefaults(){return Object.assign(Ur.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.005,decay:.1,release:1,sustain:.3}),oscillator:Object.assign(Oi(kr.getDefaults(),[...Object.keys(er.getDefaults()),"frequency","detune"]),{type:"triangle"})})}_triggerEnvelopeAttack(e,t){if(this.envelope.triggerAttack(e,t),this.oscillator.start(e),0===this.envelope.sustain){const t=this.toSeconds(this.envelope.attack),n=this.toSeconds(this.envelope.decay);this.oscillator.stop(e+t+n)}}_triggerEnvelopeRelease(e){this.envelope.triggerRelease(e),this.oscillator.stop(e+this.toSeconds(this.envelope.release))}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}dispose(){return super.dispose(),this.oscillator.dispose(),this.envelope.dispose(),this}}class qr extends Ur{constructor(){super(Di(qr.getDefaults(),arguments)),this.name="ModulationSynth";const e=Di(qr.getDefaults(),arguments);this._carrier=new Gr({context:this.context,oscillator:e.oscillator,envelope:e.envelope,onsilence:()=>this.onsilence(this),volume:-10}),this._modulator=new Gr({context:this.context,oscillator:e.modulation,envelope:e.modulationEnvelope,volume:-10}),this.oscillator=this._carrier.oscillator,this.envelope=this._carrier.envelope,this.modulation=this._modulator.oscillator,this.modulationEnvelope=this._modulator.envelope,this.frequency=new Ds({context:this.context,units:"frequency"}),this.detune=new Ds({context:this.context,value:e.detune,units:"cents"}),this.harmonicity=new pr({context:this.context,value:e.harmonicity,minValue:0}),this._modulationNode=new Is({context:this.context,gain:0}),Xi(this,["frequency","harmonicity","oscillator","envelope","modulation","modulationEnvelope","detune"])}static getDefaults(){return Object.assign(Ur.getDefaults(),{harmonicity:3,oscillator:Object.assign(Oi(kr.getDefaults(),[...Object.keys(er.getDefaults()),"frequency","detune"]),{type:"sine"}),envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.01,decay:.01,sustain:1,release:.5}),modulation:Object.assign(Oi(kr.getDefaults(),[...Object.keys(er.getDefaults()),"frequency","detune"]),{type:"square"}),modulationEnvelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.5,decay:0,sustain:1,release:.5})})}_triggerEnvelopeAttack(e,t){this._carrier._triggerEnvelopeAttack(e,t),this._modulator._triggerEnvelopeAttack(e,t)}_triggerEnvelopeRelease(e){return this._carrier._triggerEnvelopeRelease(e),this._modulator._triggerEnvelopeRelease(e),this}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}dispose(){return super.dispose(),this._carrier.dispose(),this._modulator.dispose(),this.frequency.dispose(),this.detune.dispose(),this.harmonicity.dispose(),this._modulationNode.dispose(),this}}class Hr extends qr{constructor(){super(Di(Hr.getDefaults(),arguments)),this.name="AMSynth",this._modulationScale=new dr({context:this.context}),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.detune.fan(this._carrier.detune,this._modulator.detune),this._modulator.chain(this._modulationScale,this._modulationNode.gain),this._carrier.chain(this._modulationNode,this.output)}dispose(){return super.dispose(),this._modulationScale.dispose(),this}}class Kr extends Ss{constructor(){super(Di(Kr.getDefaults(),arguments,["frequency","type"])),this.name="BiquadFilter";const e=Di(Kr.getDefaults(),arguments,["frequency","type"]);this._filter=this.context.createBiquadFilter(),this.input=this.output=this._filter,this.Q=new Cs({context:this.context,units:"number",value:e.Q,param:this._filter.Q}),this.frequency=new Cs({context:this.context,units:"frequency",value:e.frequency,param:this._filter.frequency}),this.detune=new Cs({context:this.context,units:"cents",value:e.detune,param:this._filter.detune}),this.gain=new Cs({context:this.context,units:"decibels",convert:!1,value:e.gain,param:this._filter.gain}),this.type=e.type}static getDefaults(){return Object.assign(Ss.getDefaults(),{Q:1,type:"lowpass",frequency:350,detune:0,gain:0})}get type(){return this._filter.type}set type(e){ii(-1!==["lowpass","highpass","bandpass","lowshelf","highshelf","notch","allpass","peaking"].indexOf(e),`Invalid filter type: ${e}`),this._filter.type=e}getFrequencyResponse(e=128){const t=new Float32Array(e);for(let n=0;nt.type=e))}get rolloff(){return this._rolloff}set rolloff(e){const t=mi(e)?e:parseInt(e,10),n=[-12,-24,-48,-96];let a=n.indexOf(t);ii(-1!==a,`rolloff can only be ${n.join(", ")}`),a+=1,this._rolloff=t,this.input.disconnect(),this._filters.forEach((e=>e.disconnect())),this._filters=new Array(a);for(let e=0;e1));return this._filters.forEach((()=>{t.getFrequencyResponse(e).forEach(((e,t)=>n[t]*=e))})),t.dispose(),n}dispose(){return super.dispose(),this._filters.forEach((e=>{e.dispose()})),Yi(this,["detune","frequency","gain","Q"]),this.frequency.dispose(),this.Q.dispose(),this.detune.dispose(),this.gain.dispose(),this}}class Zr extends Pr{constructor(){super(Di(Zr.getDefaults(),arguments,["attack","decay","sustain","release"])),this.name="FrequencyEnvelope";const e=Di(Zr.getDefaults(),arguments,["attack","decay","sustain","release"]);this._octaves=e.octaves,this._baseFrequency=this.toFrequency(e.baseFrequency),this._exponent=this.input=new Br({context:this.context,value:e.exponent}),this._scale=this.output=new Ar({context:this.context,min:this._baseFrequency,max:this._baseFrequency*Math.pow(2,this._octaves)}),this._sig.chain(this._exponent,this._scale)}static getDefaults(){return Object.assign(Pr.getDefaults(),{baseFrequency:200,exponent:1,octaves:4})}get baseFrequency(){return this._baseFrequency}set baseFrequency(e){const t=this.toFrequency(e);si(t,0),this._baseFrequency=t,this._scale.min=this._baseFrequency,this.octaves=this._octaves}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._scale.max=this._baseFrequency*Math.pow(2,e)}get exponent(){return this._exponent.value}set exponent(e){this._exponent.value=e}dispose(){return super.dispose(),this._exponent.dispose(),this._scale.dispose(),this}}class Xr extends Ur{constructor(){super(Di(Xr.getDefaults(),arguments)),this.name="MonoSynth";const e=Di(Xr.getDefaults(),arguments);this.oscillator=new kr(Object.assign(e.oscillator,{context:this.context,detune:e.detune,onstop:()=>this.onsilence(this)})),this.frequency=this.oscillator.frequency,this.detune=this.oscillator.detune,this.filter=new $r(Object.assign(e.filter,{context:this.context})),this.filterEnvelope=new Zr(Object.assign(e.filterEnvelope,{context:this.context})),this.envelope=new Wr(Object.assign(e.envelope,{context:this.context})),this.oscillator.chain(this.filter,this.envelope,this.output),this.filterEnvelope.connect(this.filter.frequency),Xi(this,["oscillator","frequency","detune","filter","filterEnvelope","envelope"])}static getDefaults(){return Object.assign(Ur.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.005,decay:.1,release:1,sustain:.9}),filter:Object.assign(Oi($r.getDefaults(),Object.keys(Ss.getDefaults())),{Q:1,rolloff:-12,type:"lowpass"}),filterEnvelope:Object.assign(Oi(Zr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.6,baseFrequency:200,decay:.2,exponent:2,octaves:3,release:2,sustain:.5}),oscillator:Object.assign(Oi(kr.getDefaults(),Object.keys(er.getDefaults())),{type:"sawtooth"})})}_triggerEnvelopeAttack(e,t=1){if(this.envelope.triggerAttack(e,t),this.filterEnvelope.triggerAttack(e),this.oscillator.start(e),0===this.envelope.sustain){const t=this.toSeconds(this.envelope.attack),n=this.toSeconds(this.envelope.decay);this.oscillator.stop(e+t+n)}}_triggerEnvelopeRelease(e){this.envelope.triggerRelease(e),this.filterEnvelope.triggerRelease(e),this.oscillator.stop(e+this.toSeconds(this.envelope.release))}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}dispose(){return super.dispose(),this.oscillator.dispose(),this.envelope.dispose(),this.filterEnvelope.dispose(),this.filter.dispose(),this}}class Yr extends Ur{constructor(){super(Di(Yr.getDefaults(),arguments)),this.name="DuoSynth";const e=Di(Yr.getDefaults(),arguments);this.voice0=new Xr(Object.assign(e.voice0,{context:this.context,onsilence:()=>this.onsilence(this)})),this.voice1=new Xr(Object.assign(e.voice1,{context:this.context})),this.harmonicity=new pr({context:this.context,units:"positive",value:e.harmonicity}),this._vibrato=new Cr({frequency:e.vibratoRate,context:this.context,min:-50,max:50}),this._vibrato.start(),this.vibratoRate=this._vibrato.frequency,this._vibratoGain=new Is({context:this.context,units:"normalRange",gain:e.vibratoAmount}),this.vibratoAmount=this._vibratoGain.gain,this.frequency=new Ds({context:this.context,units:"frequency",value:440}),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),this.frequency.connect(this.voice0.frequency),this.frequency.chain(this.harmonicity,this.voice1.frequency),this._vibrato.connect(this._vibratoGain),this._vibratoGain.fan(this.voice0.detune,this.voice1.detune),this.detune.fan(this.voice0.detune,this.voice1.detune),this.voice0.connect(this.output),this.voice1.connect(this.output),Xi(this,["voice0","voice1","frequency","vibratoAmount","vibratoRate"])}getLevelAtTime(e){return e=this.toSeconds(e),this.voice0.envelope.getValueAtTime(e)+this.voice1.envelope.getValueAtTime(e)}static getDefaults(){return Ri(Ur.getDefaults(),{vibratoAmount:.5,vibratoRate:5,harmonicity:1.5,voice0:Ri(Oi(Xr.getDefaults(),Object.keys(Ur.getDefaults())),{filterEnvelope:{attack:.01,decay:0,sustain:1,release:.5},envelope:{attack:.01,decay:0,sustain:1,release:.5}}),voice1:Ri(Oi(Xr.getDefaults(),Object.keys(Ur.getDefaults())),{filterEnvelope:{attack:.01,decay:0,sustain:1,release:.5},envelope:{attack:.01,decay:0,sustain:1,release:.5}})})}_triggerEnvelopeAttack(e,t){this.voice0._triggerEnvelopeAttack(e,t),this.voice1._triggerEnvelopeAttack(e,t)}_triggerEnvelopeRelease(e){return this.voice0._triggerEnvelopeRelease(e),this.voice1._triggerEnvelopeRelease(e),this}dispose(){return super.dispose(),this.voice0.dispose(),this.voice1.dispose(),this.frequency.dispose(),this.detune.dispose(),this._vibrato.dispose(),this.vibratoRate.dispose(),this._vibratoGain.dispose(),this.harmonicity.dispose(),this}}class Qr extends qr{constructor(){super(Di(Qr.getDefaults(),arguments)),this.name="FMSynth";const e=Di(Qr.getDefaults(),arguments);this.modulationIndex=new pr({context:this.context,value:e.modulationIndex}),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.frequency.chain(this.modulationIndex,this._modulationNode),this.detune.fan(this._carrier.detune,this._modulator.detune),this._modulator.connect(this._modulationNode.gain),this._modulationNode.connect(this._carrier.frequency),this._carrier.connect(this.output)}static getDefaults(){return Object.assign(qr.getDefaults(),{modulationIndex:10})}dispose(){return super.dispose(),this.modulationIndex.dispose(),this}}const Jr=[1,1.483,1.932,2.546,2.63,3.897];class eo extends Ur{constructor(){super(Di(eo.getDefaults(),arguments)),this.name="MetalSynth",this._oscillators=[],this._freqMultipliers=[];const e=Di(eo.getDefaults(),arguments);this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),this.frequency=new Ds({context:this.context,units:"frequency"}),this._amplitude=new Is({context:this.context,gain:0}).connect(this.output),this._highpass=new $r({Q:0,context:this.context,type:"highpass"}).connect(this._amplitude);for(let t=0;tthis.onsilence(this):Qi,type:"square"});n.connect(this._highpass),this._oscillators[t]=n;const a=new pr({context:this.context,value:Jr[t]});this._freqMultipliers[t]=a,this.frequency.chain(a,n.frequency),this.detune.connect(n.detune)}this._filterFreqScaler=new Ar({context:this.context,max:7e3,min:this.toFrequency(e.resonance)}),this.envelope=new Pr({attack:e.envelope.attack,attackCurve:"linear",context:this.context,decay:e.envelope.decay,release:e.envelope.release,sustain:0}),this.envelope.chain(this._filterFreqScaler,this._highpass.frequency),this.envelope.connect(this._amplitude.gain),this._octaves=e.octaves,this.octaves=e.octaves}static getDefaults(){return Ri(Ur.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.001,decay:1.4,release:.2}),harmonicity:5.1,modulationIndex:32,octaves:1.5,resonance:4e3})}_triggerEnvelopeAttack(e,t=1){return this.envelope.triggerAttack(e,t),this._oscillators.forEach((t=>t.start(e))),0===this.envelope.sustain&&this._oscillators.forEach((t=>{t.stop(e+this.toSeconds(this.envelope.attack)+this.toSeconds(this.envelope.decay))})),this}_triggerEnvelopeRelease(e){return this.envelope.triggerRelease(e),this._oscillators.forEach((t=>t.stop(e+this.toSeconds(this.envelope.release)))),this}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}get modulationIndex(){return this._oscillators[0].modulationIndex.value}set modulationIndex(e){this._oscillators.forEach((t=>t.modulationIndex.value=e))}get harmonicity(){return this._oscillators[0].harmonicity.value}set harmonicity(e){this._oscillators.forEach((t=>t.harmonicity.value=e))}get resonance(){return this._filterFreqScaler.min}set resonance(e){this._filterFreqScaler.min=this.toFrequency(e),this.octaves=this._octaves}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._filterFreqScaler.max=this._filterFreqScaler.min*Math.pow(2,e)}dispose(){return super.dispose(),this._oscillators.forEach((e=>e.dispose())),this._freqMultipliers.forEach((e=>e.dispose())),this.frequency.dispose(),this.detune.dispose(),this._filterFreqScaler.dispose(),this._amplitude.dispose(),this.envelope.dispose(),this._highpass.dispose(),this}}class to extends Gr{constructor(){super(Di(to.getDefaults(),arguments)),this.name="MembraneSynth",this.portamento=0;const e=Di(to.getDefaults(),arguments);this.pitchDecay=e.pitchDecay,this.octaves=e.octaves,Xi(this,["oscillator","envelope"])}static getDefaults(){return Ri(Ur.getDefaults(),Gr.getDefaults(),{envelope:{attack:.001,attackCurve:"exponential",decay:.4,release:1.4,sustain:.01},octaves:10,oscillator:{type:"sine"},pitchDecay:.05})}setNote(e,t){const n=this.toSeconds(t),a=this.toFrequency(e instanceof gs?e.toFrequency():e),i=a*this.octaves;return this.oscillator.frequency.setValueAtTime(i,n),this.oscillator.frequency.exponentialRampToValueAtTime(a,n+this.toSeconds(this.pitchDecay)),this}dispose(){return super.dispose(),this}}Ai([Sr(0)],to.prototype,"octaves",void 0),Ai([Er(0)],to.prototype,"pitchDecay",void 0);class no extends Vr{constructor(){super(Di(no.getDefaults(),arguments)),this.name="NoiseSynth";const e=Di(no.getDefaults(),arguments);this.noise=new nr(Object.assign({context:this.context},e.noise)),this.envelope=new Wr(Object.assign({context:this.context},e.envelope)),this.noise.chain(this.envelope,this.output)}static getDefaults(){return Object.assign(Vr.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{decay:.1,sustain:0}),noise:Object.assign(Oi(nr.getDefaults(),Object.keys(er.getDefaults())),{type:"white"})})}triggerAttack(e,t=1){return e=this.toSeconds(e),this.envelope.triggerAttack(e,t),this.noise.start(e),0===this.envelope.sustain&&this.noise.stop(e+this.toSeconds(this.envelope.attack)+this.toSeconds(this.envelope.decay)),this}triggerRelease(e){return e=this.toSeconds(e),this.envelope.triggerRelease(e),this.noise.stop(e+this.toSeconds(this.envelope.release)),this}sync(){return this._syncState()&&(this._syncMethod("triggerAttack",0),this._syncMethod("triggerRelease",0)),this}triggerAttackRelease(e,t,n=1){return t=this.toSeconds(t),e=this.toSeconds(e),this.triggerAttack(t,n),this.triggerRelease(t+e),this}dispose(){return super.dispose(),this.noise.dispose(),this.envelope.dispose(),this}}const ao=new Set;function io(e){ao.add(e)}function so(e,t){const n=`registerProcessor("${e}", ${t})`;ao.add(n)}class ro extends Ss{constructor(e){super(e),this.name="ToneAudioWorklet",this.workletOptions={},this.onprocessorerror=Qi;const t=URL.createObjectURL(new Blob([Array.from(ao).join("\n")],{type:"text/javascript"})),n=this._audioWorkletName();this._dummyGain=this.context.createGain(),this._dummyParam=this._dummyGain.gain,this.context.addAudioWorkletModule(t,n).then((()=>{this.disposed||(this._worklet=this.context.createAudioWorkletNode(n,this.workletOptions),this._worklet.onprocessorerror=this.onprocessorerror.bind(this),this.onReady(this._worklet))}))}dispose(){return super.dispose(),this._dummyGain.disconnect(),this._worklet&&(this._worklet.port.postMessage("dispose"),this._worklet.disconnect()),this}}io('\n\t/**\n\t * The base AudioWorkletProcessor for use in Tone.js. Works with the [[ToneAudioWorklet]]. \n\t */\n\tclass ToneAudioWorkletProcessor extends AudioWorkletProcessor {\n\n\t\tconstructor(options) {\n\t\t\t\n\t\t\tsuper(options);\n\t\t\t/**\n\t\t\t * If the processor was disposed or not. Keep alive until it\'s disposed.\n\t\t\t */\n\t\t\tthis.disposed = false;\n\t\t \t/** \n\t\t\t * The number of samples in the processing block\n\t\t\t */\n\t\t\tthis.blockSize = 128;\n\t\t\t/**\n\t\t\t * the sample rate\n\t\t\t */\n\t\t\tthis.sampleRate = sampleRate;\n\n\t\t\tthis.port.onmessage = (event) => {\n\t\t\t\t// when it receives a dispose \n\t\t\t\tif (event.data === "dispose") {\n\t\t\t\t\tthis.disposed = true;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n');io("\n\t/**\n\t * Abstract class for a single input/output processor. \n\t * has a 'generate' function which processes one sample at a time\n\t */\n\tclass SingleIOProcessor extends ToneAudioWorkletProcessor {\n\n\t\tconstructor(options) {\n\t\t\tsuper(Object.assign(options, {\n\t\t\t\tnumberOfInputs: 1,\n\t\t\t\tnumberOfOutputs: 1\n\t\t\t}));\n\t\t\t/**\n\t\t\t * Holds the name of the parameter and a single value of that\n\t\t\t * parameter at the current sample\n\t\t\t * @type { [name: string]: number }\n\t\t\t */\n\t\t\tthis.params = {}\n\t\t}\n\n\t\t/**\n\t\t * Generate an output sample from the input sample and parameters\n\t\t * @abstract\n\t\t * @param input number\n\t\t * @param channel number\n\t\t * @param parameters { [name: string]: number }\n\t\t * @returns number\n\t\t */\n\t\tgenerate(){}\n\n\t\t/**\n\t\t * Update the private params object with the \n\t\t * values of the parameters at the given index\n\t\t * @param parameters { [name: string]: Float32Array },\n\t\t * @param index number\n\t\t */\n\t\tupdateParams(parameters, index) {\n\t\t\tfor (const paramName in parameters) {\n\t\t\t\tconst param = parameters[paramName];\n\t\t\t\tif (param.length > 1) {\n\t\t\t\t\tthis.params[paramName] = parameters[paramName][index];\n\t\t\t\t} else {\n\t\t\t\t\tthis.params[paramName] = parameters[paramName][0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Process a single frame of the audio\n\t\t * @param inputs Float32Array[][]\n\t\t * @param outputs Float32Array[][]\n\t\t */\n\t\tprocess(inputs, outputs, parameters) {\n\t\t\tconst input = inputs[0];\n\t\t\tconst output = outputs[0];\n\t\t\t// get the parameter values\n\t\t\tconst channelCount = Math.max(input && input.length || 0, output.length);\n\t\t\tfor (let sample = 0; sample < this.blockSize; sample++) {\n\t\t\t\tthis.updateParams(parameters, sample);\n\t\t\t\tfor (let channel = 0; channel < channelCount; channel++) {\n\t\t\t\t\tconst inputSample = input && input.length ? input[channel][sample] : 0;\n\t\t\t\t\toutput[channel][sample] = this.generate(inputSample, channel, this.params);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !this.disposed;\n\t\t}\n\t};\n");io("\n\t/**\n\t * A multichannel buffer for use within an AudioWorkletProcessor as a delay line\n\t */\n\tclass DelayLine {\n\t\t\n\t\tconstructor(size, channels) {\n\t\t\tthis.buffer = [];\n\t\t\tthis.writeHead = []\n\t\t\tthis.size = size;\n\n\t\t\t// create the empty channels\n\t\t\tfor (let i = 0; i < channels; i++) {\n\t\t\t\tthis.buffer[i] = new Float32Array(this.size);\n\t\t\t\tthis.writeHead[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Push a value onto the end\n\t\t * @param channel number\n\t\t * @param value number\n\t\t */\n\t\tpush(channel, value) {\n\t\t\tthis.writeHead[channel] += 1;\n\t\t\tif (this.writeHead[channel] > this.size) {\n\t\t\t\tthis.writeHead[channel] = 0;\n\t\t\t}\n\t\t\tthis.buffer[channel][this.writeHead[channel]] = value;\n\t\t}\n\n\t\t/**\n\t\t * Get the recorded value of the channel given the delay\n\t\t * @param channel number\n\t\t * @param delay number delay samples\n\t\t */\n\t\tget(channel, delay) {\n\t\t\tlet readHead = this.writeHead[channel] - Math.floor(delay);\n\t\t\tif (readHead < 0) {\n\t\t\t\treadHead += this.size;\n\t\t\t}\n\t\t\treturn this.buffer[channel][readHead];\n\t\t}\n\t}\n");const oo="feedback-comb-filter";so(oo,'\n\tclass FeedbackCombFilterWorklet extends SingleIOProcessor {\n\n\t\tconstructor(options) {\n\t\t\tsuper(options);\n\t\t\tthis.delayLine = new DelayLine(this.sampleRate, options.channelCount || 2);\n\t\t}\n\n\t\tstatic get parameterDescriptors() {\n\t\t\treturn [{\n\t\t\t\tname: "delayTime",\n\t\t\t\tdefaultValue: 0.1,\n\t\t\t\tminValue: 0,\n\t\t\t\tmaxValue: 1,\n\t\t\t\tautomationRate: "k-rate"\n\t\t\t}, {\n\t\t\t\tname: "feedback",\n\t\t\t\tdefaultValue: 0.5,\n\t\t\t\tminValue: 0,\n\t\t\t\tmaxValue: 0.9999,\n\t\t\t\tautomationRate: "k-rate"\n\t\t\t}];\n\t\t}\n\n\t\tgenerate(input, channel, parameters) {\n\t\t\tconst delayedSample = this.delayLine.get(channel, parameters.delayTime * this.sampleRate);\n\t\t\tthis.delayLine.push(channel, input + delayedSample * parameters.feedback);\n\t\t\treturn delayedSample;\n\t\t}\n\t}\n');class lo extends ro{constructor(){super(Di(lo.getDefaults(),arguments,["delayTime","resonance"])),this.name="FeedbackCombFilter";const e=Di(lo.getDefaults(),arguments,["delayTime","resonance"]);this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this.delayTime=new Cs({context:this.context,value:e.delayTime,units:"time",minValue:0,maxValue:1,param:this._dummyParam,swappable:!0}),this.resonance=new Cs({context:this.context,value:e.resonance,units:"normalRange",param:this._dummyParam,swappable:!0}),Xi(this,["resonance","delayTime"])}_audioWorkletName(){return oo}static getDefaults(){return Object.assign(Ss.getDefaults(),{delayTime:.1,resonance:.5})}onReady(e){Es(this.input,e,this.output);const t=e.parameters.get("delayTime");this.delayTime.setParam(t);const n=e.parameters.get("feedback");this.resonance.setParam(n)}dispose(){return super.dispose(),this.input.dispose(),this.output.dispose(),this.delayTime.dispose(),this.resonance.dispose(),this}}class uo extends Ss{constructor(){super(Di(uo.getDefaults(),arguments,["frequency","type"])),this.name="OnePoleFilter";const e=Di(uo.getDefaults(),arguments,["frequency","type"]);this._frequency=e.frequency,this._type=e.type,this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this._createFilter()}static getDefaults(){return Object.assign(Ss.getDefaults(),{frequency:880,type:"lowpass"})}_createFilter(){const e=this._filter,t=this.toFrequency(this._frequency),n=1/(2*Math.PI*t);if("lowpass"===this._type){const e=1/(n*this.context.sampleRate),t=e-1;this._filter=this.context.createIIRFilter([e,0],[1,t])}else{const e=1/(n*this.context.sampleRate)-1;this._filter=this.context.createIIRFilter([1,-1],[1,e])}this.input.chain(this._filter,this.output),e&&this.context.setTimeout((()=>{this.disposed||(this.input.disconnect(e),e.disconnect())}),this.blockTime)}get frequency(){return this._frequency}set frequency(e){this._frequency=e,this._createFilter()}get type(){return this._type}set type(e){this._type=e,this._createFilter()}getFrequencyResponse(e=128){const t=new Float32Array(e);for(let n=0;nt.voice===e));this._activeVoices.splice(t,1)}_getNextAvailableVoice(){if(this._availableVoices.length)return this._availableVoices.shift();if(this._voices.lengthMath.ceil(this._averageActiveVoices+1)){const e=this._availableVoices.shift(),t=this._voices.indexOf(e);this._voices.splice(t,1),this.context.isOffline||e.dispose()}}_triggerAttack(e,t,n){e.forEach((e=>{const a=new Vs(this.context,e).toMidi(),i=this._getNextAvailableVoice();i&&(i.triggerAttack(e,t,n),this._activeVoices.push({midi:a,voice:i,released:!1}),this.log("triggerAttack",e,t))}))}_triggerRelease(e,t){e.forEach((e=>{const n=new Vs(this.context,e).toMidi(),a=this._activeVoices.find((({midi:e,released:t})=>e===n&&!t));a&&(a.voice.triggerRelease(t),a.released=!0,this.log("triggerRelease",e,t))}))}_scheduleEvent(e,t,n,a){ii(!this.disposed,"Synth was already disposed"),n<=this.now()?"attack"===e?this._triggerAttack(t,n,a):this._triggerRelease(t,n):this.context.setTimeout((()=>{this._scheduleEvent(e,t,n,a)}),n-this.now())}triggerAttack(e,t,n){Array.isArray(e)||(e=[e]);const a=this.toSeconds(t);return this._scheduleEvent("attack",e,a,n),this}triggerRelease(e,t){Array.isArray(e)||(e=[e]);const n=this.toSeconds(t);return this._scheduleEvent("release",e,n),this}triggerAttackRelease(e,t,n,a){const i=this.toSeconds(n);if(this.triggerAttack(e,i,a),yi(t)){ii(yi(e),"If the duration is an array, the notes must also be an array");for(let n=0;n0,"The duration must be greater than 0"),this.triggerRelease(e[n],i+s)}}else{const n=this.toSeconds(t);ii(n>0,"The duration must be greater than 0"),this.triggerRelease(e,i+n)}return this}sync(){return this._syncState()&&(this._syncMethod("triggerAttack",1),this._syncMethod("triggerRelease",1)),this}set(e){const t=Oi(e,["onsilence","context"]);return this.options=Ri(this.options,t),this._voices.forEach((e=>e.set(t))),this._dummyVoice.set(t),this}get(){return this._dummyVoice.get()}releaseAll(e){const t=this.toSeconds(e);return this._activeVoices.forEach((({voice:e})=>{e.triggerRelease(t)})),this}dispose(){return super.dispose(),this._dummyVoice.dispose(),this._voices.forEach((e=>e.dispose())),this._activeVoices=[],this._availableVoices=[],this.context.clearInterval(this._gcTimeout),this}}class mo extends Vr{constructor(){super(Di(mo.getDefaults(),arguments,["urls","onload","baseUrl"],"urls")),this.name="Sampler",this._activeSources=new Map;const e=Di(mo.getDefaults(),arguments,["urls","onload","baseUrl"],"urls"),t={};Object.keys(e.urls).forEach((n=>{const a=parseInt(n,10);if(ii(vi(n)||mi(a)&&isFinite(a),`url key is neither a note or midi pitch: ${n}`),vi(n)){const a=new gs(this.context,n).toMidi();t[a]=e.urls[n]}else mi(a)&&isFinite(a)&&(t[a]=e.urls[a])})),this._buffers=new js({urls:t,onload:e.onload,baseUrl:e.baseUrl,onerror:e.onerror}),this.attack=e.attack,this.release=e.release,this.curve=e.curve,this._buffers.loaded&&Promise.resolve().then(e.onload)}static getDefaults(){return Object.assign(Vr.getDefaults(),{attack:0,baseUrl:"",curve:"exponential",onload:Qi,onerror:Qi,release:.1,urls:{}})}_findClosest(e){let t=0;for(;t<96;){if(this._buffers.has(e+t))return-t;if(this._buffers.has(e-t))return t;t++}throw new Error(`No available buffers for note: ${e}`)}triggerAttack(e,t,n=1){return this.log("triggerAttack",e,t,n),Array.isArray(e)||(e=[e]),e.forEach((e=>{const a=hs(new gs(this.context,e).toFrequency()),i=Math.round(a),s=a-i,r=this._findClosest(i),o=i-r,l=this._buffers.get(o),u=ls(r+s),c=new tr({url:l,context:this.context,curve:this.curve,fadeIn:this.attack,fadeOut:this.release,playbackRate:u}).connect(this.output);c.start(t,0,l.duration/u,n),yi(this._activeSources.get(i))||this._activeSources.set(i,[]),this._activeSources.get(i).push(c),c.onended=()=>{if(this._activeSources&&this._activeSources.has(i)){const e=this._activeSources.get(i),t=e.indexOf(c);-1!==t&&e.splice(t,1)}}})),this}triggerRelease(e,t){return this.log("triggerRelease",e,t),Array.isArray(e)||(e=[e]),e.forEach((e=>{const n=new gs(this.context,e).toMidi();if(this._activeSources.has(n)&&this._activeSources.get(n).length){const e=this._activeSources.get(n);t=this.toSeconds(t),e.forEach((e=>{e.stop(t)})),this._activeSources.set(n,[])}})),this}releaseAll(e){const t=this.toSeconds(e);return this._activeSources.forEach((e=>{for(;e.length;){e.shift().stop(t)}})),this}sync(){return this._syncState()&&(this._syncMethod("triggerAttack",1),this._syncMethod("triggerRelease",1)),this}triggerAttackRelease(e,t,n,a=1){const i=this.toSeconds(n);return this.triggerAttack(e,i,a),yi(t)?(ii(yi(e),"notes must be an array when duration is array"),e.forEach(((e,n)=>{const a=t[Math.min(n,t.length-1)];this.triggerRelease(e,i+this.toSeconds(a))}))):this.triggerRelease(e,i+this.toSeconds(t)),this}add(e,t,n){if(ii(vi(e)||isFinite(e),`note must be a pitch or midi: ${e}`),vi(e)){const a=new gs(this.context,e).toMidi();this._buffers.add(a,t,n)}else this._buffers.add(e,t,n);return this}get loaded(){return this._buffers.loaded}dispose(){return super.dispose(),this._buffers.dispose(),this._activeSources.forEach((e=>{e.forEach((e=>e.dispose()))})),this._activeSources.clear(),this}}Ai([Er(0)],mo.prototype,"attack",void 0),Ai([Er(0)],mo.prototype,"release",void 0);class fo extends As{constructor(){super(Di(fo.getDefaults(),arguments,["callback","value"])),this.name="ToneEvent",this._state=new xs("stopped"),this._startOffset=0;const e=Di(fo.getDefaults(),arguments,["callback","value"]);this._loop=e.loop,this.callback=e.callback,this.value=e.value,this._loopStart=this.toTicks(e.loopStart),this._loopEnd=this.toTicks(e.loopEnd),this._playbackRate=e.playbackRate,this._probability=e.probability,this._humanize=e.humanize,this.mute=e.mute,this._playbackRate=e.playbackRate,this._state.increasing=!0,this._rescheduleEvents()}static getDefaults(){return Object.assign(As.getDefaults(),{callback:Qi,humanize:!1,loop:!1,loopEnd:"1m",loopStart:0,mute:!1,playbackRate:1,probability:1,value:null})}_rescheduleEvents(e=-1){this._state.forEachFrom(e,(e=>{let t;if("started"===e.state){-1!==e.id&&this.context.transport.clear(e.id);const n=e.time+Math.round(this.startOffset/this._playbackRate);if(!0===this._loop||mi(this._loop)&&this._loop>1){t=1/0,mi(this._loop)&&(t=this._loop*this._getLoopDuration());const a=this._state.getAfter(n);null!==a&&(t=Math.min(t,a.time-n)),t!==1/0&&(this._state.setStateAtTime("stopped",n+t+1,{id:-1}),t=new Ws(this.context,t));const i=new Ws(this.context,this._getLoopDuration());e.id=this.context.transport.scheduleRepeat(this._tick.bind(this),i,new Ws(this.context,n),t)}else e.id=this.context.transport.schedule(this._tick.bind(this),new Ws(this.context,n))}}))}get state(){return this._state.getValueAtTime(this.context.transport.ticks)}get startOffset(){return this._startOffset}set startOffset(e){this._startOffset=e}get probability(){return this._probability}set probability(e){this._probability=e}get humanize(){return this._humanize}set humanize(e){this._humanize=e}start(e){const t=this.toTicks(e);return"stopped"===this._state.getValueAtTime(t)&&(this._state.add({id:-1,state:"started",time:t}),this._rescheduleEvents(t)),this}stop(e){this.cancel(e);const t=this.toTicks(e);if("started"===this._state.getValueAtTime(t)){this._state.setStateAtTime("stopped",t,{id:-1});const e=this._state.getBefore(t);let n=t;null!==e&&(n=e.time),this._rescheduleEvents(n)}return this}cancel(e){e=zi(e,-1/0);const t=this.toTicks(e);return this._state.forEachFrom(t,(e=>{this.context.transport.clear(e.id)})),this._state.cancel(t),this}_tick(e){const t=this.context.transport.getTicksAtTime(e);if(!this.mute&&"started"===this._state.getValueAtTime(t)){if(this.probability<1&&Math.random()>this.probability)return;if(this.humanize){let t=.02;gi(this.humanize)||(t=this.toSeconds(this.humanize)),e+=(2*Math.random()-1)*t}this.callback(e,this.value)}}_getLoopDuration(){return Math.round((this._loopEnd-this._loopStart)/this._playbackRate)}get loop(){return this._loop}set loop(e){this._loop=e,this._rescheduleEvents()}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this._rescheduleEvents()}get loopEnd(){return new Ws(this.context,this._loopEnd).toSeconds()}set loopEnd(e){this._loopEnd=this.toTicks(e),this._loop&&this._rescheduleEvents()}get loopStart(){return new Ws(this.context,this._loopStart).toSeconds()}set loopStart(e){this._loopStart=this.toTicks(e),this._loop&&this._rescheduleEvents()}get progress(){if(this._loop){const e=this.context.transport.ticks,t=this._state.get(e);if(null!==t&&"started"===t.state){const n=this._getLoopDuration();return(e-t.time)%n/n}return 0}return 0}dispose(){return super.dispose(),this.cancel(),this._state.dispose(),this}}class go extends As{constructor(){super(Di(go.getDefaults(),arguments,["callback","interval"])),this.name="Loop";const e=Di(go.getDefaults(),arguments,["callback","interval"]);this._event=new fo({context:this.context,callback:this._tick.bind(this),loop:!0,loopEnd:e.interval,playbackRate:e.playbackRate,probability:e.probability}),this.callback=e.callback,this.iterations=e.iterations}static getDefaults(){return Object.assign(As.getDefaults(),{interval:"4n",callback:Qi,playbackRate:1,iterations:1/0,probability:1,mute:!1,humanize:!1})}start(e){return this._event.start(e),this}stop(e){return this._event.stop(e),this}cancel(e){return this._event.cancel(e),this}_tick(e){this.callback(e)}get state(){return this._event.state}get progress(){return this._event.progress}get interval(){return this._event.loopEnd}set interval(e){this._event.loopEnd=e}get playbackRate(){return this._event.playbackRate}set playbackRate(e){this._event.playbackRate=e}get humanize(){return this._event.humanize}set humanize(e){this._event.humanize=e}get probability(){return this._event.probability}set probability(e){this._event.probability=e}get mute(){return this._event.mute}set mute(e){this._event.mute=e}get iterations(){return!0===this._event.loop?1/0:this._event.loop}set iterations(e){this._event.loop=e===1/0||e}dispose(){return super.dispose(),this._event.dispose(),this}}class yo extends fo{constructor(){super(Di(yo.getDefaults(),arguments,["callback","events"])),this.name="Part",this._state=new xs("stopped"),this._events=new Set;const e=Di(yo.getDefaults(),arguments,["callback","events"]);this._state.increasing=!0,e.events.forEach((e=>{yi(e)?this.add(e[0],e[1]):this.add(e)}))}static getDefaults(){return Object.assign(fo.getDefaults(),{events:[]})}start(e,t){const n=this.toTicks(e);if("started"!==this._state.getValueAtTime(n)){t=zi(t,this._loop?this._loopStart:0),t=this._loop?zi(t,this._loopStart):zi(t,0);const e=this.toTicks(t);this._state.add({id:-1,offset:e,state:"started",time:n}),this._forEach((t=>{this._startNote(t,n,e)}))}return this}_startNote(e,t,n){t-=n,this._loop?e.startOffset>=this._loopStart&&e.startOffset=n&&(e.loop=!1,e.start(new Ws(this.context,t))):e.startOffset>=n&&e.start(new Ws(this.context,t))}get startOffset(){return this._startOffset}set startOffset(e){this._startOffset=e,this._forEach((e=>{e.startOffset+=this._startOffset}))}stop(e){const t=this.toTicks(e);return this._state.cancel(t),this._state.setStateAtTime("stopped",t),this._forEach((t=>{t.stop(e)})),this}at(e,t){const n=new ks(this.context,e).toTicks(),a=new Ws(this.context,1).toSeconds(),i=this._events.values();let s=i.next();for(;!s.done;){const e=s.value;if(Math.abs(n-e.startOffset){"started"===t.state?this._startNote(e,t.time,t.offset):e.stop(new Ws(this.context,t.time))}))}remove(e,t){return fi(e)&&e.hasOwnProperty("time")&&(e=(t=e).time),e=this.toTicks(e),this._events.forEach((n=>{n.startOffset===e&&(hi(t)||di(t)&&n.value===t)&&(this._events.delete(n),n.dispose())})),this}clear(){return this._forEach((e=>e.dispose())),this._events.clear(),this}cancel(e){return this._forEach((t=>t.cancel(e))),this._state.cancel(this.toTicks(e)),this}_forEach(e){return this._events&&this._events.forEach((t=>{t instanceof yo?t._forEach(e):e(t)})),this}_setAll(e,t){this._forEach((n=>{n[e]=t}))}_tick(e,t){this.mute||this.callback(e,t)}_testLoopBoundries(e){this._loop&&(e.startOffset=this._loopEnd)?e.cancel(0):"stopped"===e.state&&this._restartEvent(e)}get probability(){return this._probability}set probability(e){this._probability=e,this._setAll("probability",e)}get humanize(){return this._humanize}set humanize(e){this._humanize=e,this._setAll("humanize",e)}get loop(){return this._loop}set loop(e){this._loop=e,this._forEach((t=>{t.loopStart=this.loopStart,t.loopEnd=this.loopEnd,t.loop=e,this._testLoopBoundries(t)}))}get loopEnd(){return new Ws(this.context,this._loopEnd).toSeconds()}set loopEnd(e){this._loopEnd=this.toTicks(e),this._loop&&this._forEach((t=>{t.loopEnd=e,this._testLoopBoundries(t)}))}get loopStart(){return new Ws(this.context,this._loopStart).toSeconds()}set loopStart(e){this._loopStart=this.toTicks(e),this._loop&&this._forEach((e=>{e.loopStart=this.loopStart,this._testLoopBoundries(e)}))}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this._setAll("playbackRate",e)}get length(){return this._events.size}dispose(){return super.dispose(),this.clear(),this}}function*bo(e){let t=0;for(;t=0;)t=wo(t,e),yield e[t],t--}function*ko(e,t){for(;;)yield*t(e)}function wo(e,t){return Vi(e,0,t.length-1)}function*Ao(e,t){let n=t?0:e.length-1;for(;;)n=wo(n,e),yield e[n],t?(n++,n>=e.length-1&&(t=!1)):(n--,n<=0&&(t=!0))}function*xo(e){let t=0,n=0;for(;t=0;)t=wo(t,e),yield e[t],n++,t+=n%2?-2:1}function*So(e){const t=[];for(let n=0;n0;){const n=wo(t.splice(Math.floor(t.length*Math.random()),1)[0],e);yield e[n]}}function*Eo(e,t="up",n=0){switch(ii(e.length>0,"The array must have more than one value in it"),t){case"up":yield*ko(e,bo);case"down":yield*ko(e,vo);case"upDown":yield*Ao(e,!0);case"downUp":yield*Ao(e,!1);case"alternateUp":yield*ko(e,xo);case"alternateDown":yield*ko(e,Co);case"random":yield*function*(e){for(;;){const t=Math.floor(Math.random()*e.length);yield e[t]}}(e);case"randomOnce":yield*ko(e,So);case"randomWalk":yield*function*(e){let t=Math.floor(Math.random()*e.length);for(;;)0===t?t++:t===e.length-1||Math.random()<.5?t--:t++,yield e[t]}(e)}}class _o extends go{constructor(){super(Di(_o.getDefaults(),arguments,["callback","values","pattern"])),this.name="Pattern";const e=Di(_o.getDefaults(),arguments,["callback","values","pattern"]);this.callback=e.callback,this._values=e.values,this._pattern=Eo(e.values,e.pattern),this._type=e.pattern}static getDefaults(){return Object.assign(go.getDefaults(),{pattern:"up",values:[],callback:Qi})}_tick(e){const t=this._pattern.next();this._value=t.value,this.callback(e,this._value)}get values(){return this._values}set values(e){this._values=e,this.pattern=this._type}get value(){return this._value}get pattern(){return this._type}set pattern(e){this._type=e,this._pattern=Eo(this._values,this._type)}}class To extends fo{constructor(){super(Di(To.getDefaults(),arguments,["callback","events","subdivision"])),this.name="Sequence",this._part=new yo({callback:this._seqCallback.bind(this),context:this.context}),this._events=[],this._eventsArray=[];const e=Di(To.getDefaults(),arguments,["callback","events","subdivision"]);this._subdivision=this.toTicks(e.subdivision),this.events=e.events,this.loop=e.loop,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this.playbackRate=e.playbackRate,this.probability=e.probability,this.humanize=e.humanize,this.mute=e.mute,this.playbackRate=e.playbackRate}static getDefaults(){return Object.assign(Oi(fo.getDefaults(),["value"]),{events:[],loop:!0,loopEnd:0,loopStart:0,subdivision:"8n"})}_seqCallback(e,t){null!==t&&this.callback(e,t)}get events(){return this._events}set events(e){this.clear(),this._eventsArray=e,this._events=this._createSequence(this._eventsArray),this._eventsUpdated()}start(e,t){return this._part.start(e,t?this._indexTime(t):t),this}stop(e){return this._part.stop(e),this}get subdivision(){return new Ws(this.context,this._subdivision).toSeconds()}_createSequence(e){return new Proxy(e,{get:(e,t)=>e[t],set:(e,t,n)=>(bi(t)&&isFinite(parseInt(t,10))&&yi(n)?e[t]=this._createSequence(n):e[t]=n,this._eventsUpdated(),!0)})}_eventsUpdated(){this._part.clear(),this._rescheduleSequence(this._eventsArray,this._subdivision,this.startOffset),this.loopEnd=this.loopEnd}_rescheduleSequence(e,t,n){e.forEach(((e,a)=>{const i=a*t+n;if(yi(e))this._rescheduleSequence(e,t/e.length,i);else{const t=new Ws(this.context,i,"i").toSeconds();this._part.add(t,e)}}))}_indexTime(e){return new Ws(this.context,e*this._subdivision+this.startOffset).toSeconds()}clear(){return this._part.clear(),this}dispose(){return super.dispose(),this._part.dispose(),this}get loop(){return this._part.loop}set loop(e){this._part.loop=e}get loopStart(){return this._loopStart}set loopStart(e){this._loopStart=e,this._part.loopStart=this._indexTime(e)}get loopEnd(){return this._loopEnd}set loopEnd(e){this._loopEnd=e,this._part.loopEnd=0===e?this._indexTime(this._eventsArray.length):this._indexTime(e)}get startOffset(){return this._part.startOffset}set startOffset(e){this._part.startOffset=e}get playbackRate(){return this._part.playbackRate}set playbackRate(e){this._part.playbackRate=e}get probability(){return this._part.probability}set probability(e){this._part.probability=e}get progress(){return this._part.progress}get humanize(){return this._part.humanize}set humanize(e){this._part.humanize=e}get length(){return this._part.length}}class Io extends Ss{constructor(){super(Object.assign(Di(Io.getDefaults(),arguments,["fade"]))),this.name="CrossFade",this._panner=this.context.createStereoPanner(),this._split=this.context.createChannelSplitter(2),this._g2a=new Rr({context:this.context}),this.a=new Is({context:this.context,gain:0}),this.b=new Is({context:this.context,gain:0}),this.output=new Is({context:this.context}),this._internalChannels=[this.a,this.b];const e=Di(Io.getDefaults(),arguments,["fade"]);this.fade=new Ds({context:this.context,units:"normalRange",value:e.fade}),Xi(this,"fade"),this.context.getConstant(1).connect(this._panner),this._panner.connect(this._split),this._panner.channelCount=1,this._panner.channelCountMode="explicit",_s(this._split,this.a.gain,0),_s(this._split,this.b.gain,1),this.fade.chain(this._g2a,this._panner.pan),this.a.connect(this.output),this.b.connect(this.output)}static getDefaults(){return Object.assign(Ss.getDefaults(),{fade:.5})}dispose(){return super.dispose(),this.a.dispose(),this.b.dispose(),this.output.dispose(),this.fade.dispose(),this._g2a.dispose(),this._panner.disconnect(),this._split.disconnect(),this}}class No extends Ss{constructor(e){super(e),this.name="Effect",this._dryWet=new Io({context:this.context}),this.wet=this._dryWet.fade,this.effectSend=new Is({context:this.context}),this.effectReturn=new Is({context:this.context}),this.input=new Is({context:this.context}),this.output=this._dryWet,this.input.fan(this._dryWet.a,this.effectSend),this.effectReturn.connect(this._dryWet.b),this.wet.setValueAtTime(e.wet,0),this._internalChannels=[this.effectReturn,this.effectSend],Xi(this,"wet")}static getDefaults(){return Object.assign(Ss.getDefaults(),{wet:1})}connectEffect(e){return this._internalChannels.push(e),this.effectSend.chain(e,this.effectReturn),this}dispose(){return super.dispose(),this._dryWet.dispose(),this.effectSend.dispose(),this.effectReturn.dispose(),this.wet.dispose(),this}}class Ro extends No{constructor(e){super(e),this.name="LFOEffect",this._lfo=new Cr({context:this.context,frequency:e.frequency,amplitude:e.depth}),this.depth=this._lfo.amplitude,this.frequency=this._lfo.frequency,this.type=e.type,Xi(this,["frequency","depth"])}static getDefaults(){return Object.assign(No.getDefaults(),{frequency:1,type:"sine",depth:1})}start(e){return this._lfo.start(e),this}stop(e){return this._lfo.stop(e),this}sync(){return this._lfo.sync(),this}unsync(){return this._lfo.unsync(),this}get type(){return this._lfo.type}set type(e){this._lfo.type=e}dispose(){return super.dispose(),this._lfo.dispose(),this.frequency.dispose(),this.depth.dispose(),this}}class Do extends Ro{constructor(){super(Di(Do.getDefaults(),arguments,["frequency","baseFrequency","octaves"])),this.name="AutoFilter";const e=Di(Do.getDefaults(),arguments,["frequency","baseFrequency","octaves"]);this.filter=new $r(Object.assign(e.filter,{context:this.context})),this.connectEffect(this.filter),this._lfo.connect(this.filter.frequency),this.octaves=e.octaves,this.baseFrequency=e.baseFrequency}static getDefaults(){return Object.assign(Ro.getDefaults(),{baseFrequency:200,octaves:2.6,filter:{type:"lowpass",rolloff:-12,Q:1}})}get baseFrequency(){return this._lfo.min}set baseFrequency(e){this._lfo.min=this.toFrequency(e),this.octaves=this._octaves}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._lfo.max=this._lfo.min*Math.pow(2,e)}dispose(){return super.dispose(),this.filter.dispose(),this}}class zo extends Ss{constructor(){super(Object.assign(Di(zo.getDefaults(),arguments,["pan"]))),this.name="Panner",this._panner=this.context.createStereoPanner(),this.input=this._panner,this.output=this._panner;const e=Di(zo.getDefaults(),arguments,["pan"]);this.pan=new Cs({context:this.context,param:this._panner.pan,value:e.pan,minValue:-1,maxValue:1}),this._panner.channelCount=e.channelCount,this._panner.channelCountMode="explicit",Xi(this,"pan")}static getDefaults(){return Object.assign(Ss.getDefaults(),{pan:0,channelCount:1})}dispose(){return super.dispose(),this._panner.disconnect(),this.pan.dispose(),this}}class Oo extends Ro{constructor(){super(Di(Oo.getDefaults(),arguments,["frequency"])),this.name="AutoPanner";const e=Di(Oo.getDefaults(),arguments,["frequency"]);this._panner=new zo({context:this.context,channelCount:e.channelCount}),this.connectEffect(this._panner),this._lfo.connect(this._panner.pan),this._lfo.min=-1,this._lfo.max=1}static getDefaults(){return Object.assign(Ro.getDefaults(),{channelCount:1})}dispose(){return super.dispose(),this._panner.dispose(),this}}class Mo extends Ss{constructor(){super(Di(Mo.getDefaults(),arguments,["smoothing"])),this.name="Follower";const e=Di(Mo.getDefaults(),arguments,["smoothing"]);this._abs=this.input=new Nr({context:this.context}),this._lowpass=this.output=new uo({context:this.context,frequency:1/this.toSeconds(e.smoothing),type:"lowpass"}),this._abs.connect(this._lowpass),this._smoothing=e.smoothing}static getDefaults(){return Object.assign(Ss.getDefaults(),{smoothing:.05})}get smoothing(){return this._smoothing}set smoothing(e){this._smoothing=e,this._lowpass.frequency=1/this.toSeconds(this.smoothing)}dispose(){return super.dispose(),this._abs.dispose(),this._lowpass.dispose(),this}}class Bo extends No{constructor(){super(Di(Bo.getDefaults(),arguments,["baseFrequency","octaves","sensitivity"])),this.name="AutoWah";const e=Di(Bo.getDefaults(),arguments,["baseFrequency","octaves","sensitivity"]);this._follower=new Mo({context:this.context,smoothing:e.follower}),this._sweepRange=new Fr({context:this.context,min:0,max:1,exponent:.5}),this._baseFrequency=this.toFrequency(e.baseFrequency),this._octaves=e.octaves,this._inputBoost=new Is({context:this.context}),this._bandpass=new $r({context:this.context,rolloff:-48,frequency:0,Q:e.Q}),this._peaking=new $r({context:this.context,type:"peaking"}),this._peaking.gain.value=e.gain,this.gain=this._peaking.gain,this.Q=this._bandpass.Q,this.effectSend.chain(this._inputBoost,this._follower,this._sweepRange),this._sweepRange.connect(this._bandpass.frequency),this._sweepRange.connect(this._peaking.frequency),this.effectSend.chain(this._bandpass,this._peaking,this.effectReturn),this._setSweepRange(),this.sensitivity=e.sensitivity,Xi(this,["gain","Q"])}static getDefaults(){return Object.assign(No.getDefaults(),{baseFrequency:100,octaves:6,sensitivity:0,Q:2,gain:2,follower:.2})}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._setSweepRange()}get follower(){return this._follower.smoothing}set follower(e){this._follower.smoothing=e}get baseFrequency(){return this._baseFrequency}set baseFrequency(e){this._baseFrequency=this.toFrequency(e),this._setSweepRange()}get sensitivity(){return os(1/this._inputBoost.gain.value)}set sensitivity(e){this._inputBoost.gain.value=1/rs(e)}_setSweepRange(){this._sweepRange.min=this._baseFrequency,this._sweepRange.max=Math.min(this._baseFrequency*Math.pow(2,this._octaves),this.context.sampleRate/2)}dispose(){return super.dispose(),this._follower.dispose(),this._sweepRange.dispose(),this._bandpass.dispose(),this._peaking.dispose(),this._inputBoost.dispose(),this}}const Fo="bit-crusher";so(Fo,"\n\tclass BitCrusherWorklet extends SingleIOProcessor {\n\n\t\tstatic get parameterDescriptors() {\n\t\t\treturn [{\n\t\t\t\tname: \"bits\",\n\t\t\t\tdefaultValue: 12,\n\t\t\t\tminValue: 1,\n\t\t\t\tmaxValue: 16,\n\t\t\t\tautomationRate: 'k-rate'\n\t\t\t}];\n\t\t}\n\n\t\tgenerate(input, _channel, parameters) {\n\t\t\tconst step = Math.pow(0.5, parameters.bits - 1);\n\t\t\tconst val = step * Math.floor(input / step + 0.5);\n\t\t\treturn val;\n\t\t}\n\t}\n");class Lo extends No{constructor(){super(Di(Lo.getDefaults(),arguments,["bits"])),this.name="BitCrusher";const e=Di(Lo.getDefaults(),arguments,["bits"]);this._bitCrusherWorklet=new Po({context:this.context,bits:e.bits}),this.connectEffect(this._bitCrusherWorklet),this.bits=this._bitCrusherWorklet.bits}static getDefaults(){return Object.assign(No.getDefaults(),{bits:4})}dispose(){return super.dispose(),this._bitCrusherWorklet.dispose(),this}}class Po extends ro{constructor(){super(Di(Po.getDefaults(),arguments)),this.name="BitCrusherWorklet";const e=Di(Po.getDefaults(),arguments);this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this.bits=new Cs({context:this.context,value:e.bits,units:"positive",minValue:1,maxValue:16,param:this._dummyParam,swappable:!0})}static getDefaults(){return Object.assign(ro.getDefaults(),{bits:12})}_audioWorkletName(){return Fo}onReady(e){Es(this.input,e,this.output);const t=e.parameters.get("bits");this.bits.setParam(t)}dispose(){return super.dispose(),this.input.dispose(),this.output.dispose(),this.bits.dispose(),this}}class jo extends No{constructor(){super(Di(jo.getDefaults(),arguments,["order"])),this.name="Chebyshev";const e=Di(jo.getDefaults(),arguments,["order"]);this._shaper=new hr({context:this.context,length:4096}),this._order=e.order,this.connectEffect(this._shaper),this.order=e.order,this.oversample=e.oversample}static getDefaults(){return Object.assign(No.getDefaults(),{order:1,oversample:"none"})}_getCoefficient(e,t,n){return n.has(t)||(0===t?n.set(t,0):1===t?n.set(t,e):n.set(t,2*e*this._getCoefficient(e,t-1,n)-this._getCoefficient(e,t-2,n))),n.get(t)}get order(){return this._order}set order(e){this._order=e,this._shaper.setMap((t=>this._getCoefficient(t,e,new Map)))}get oversample(){return this._shaper.oversample}set oversample(e){this._shaper.oversample=e}dispose(){return super.dispose(),this._shaper.dispose(),this}}class Vo extends Ss{constructor(){super(Di(Vo.getDefaults(),arguments,["channels"])),this.name="Split";const e=Di(Vo.getDefaults(),arguments,["channels"]);this._splitter=this.input=this.output=this.context.createChannelSplitter(e.channels),this._internalChannels=[this._splitter]}static getDefaults(){return Object.assign(Ss.getDefaults(),{channels:2})}dispose(){return super.dispose(),this._splitter.disconnect(),this}}class Uo extends Ss{constructor(){super(Di(Uo.getDefaults(),arguments,["channels"])),this.name="Merge";const e=Di(Uo.getDefaults(),arguments,["channels"]);this._merger=this.output=this.input=this.context.createChannelMerger(e.channels)}static getDefaults(){return Object.assign(Ss.getDefaults(),{channels:2})}dispose(){return super.dispose(),this._merger.disconnect(),this}}class Wo extends Ss{constructor(e){super(e),this.name="StereoEffect",this.input=new Is({context:this.context}),this.input.channelCount=2,this.input.channelCountMode="explicit",this._dryWet=this.output=new Io({context:this.context,fade:e.wet}),this.wet=this._dryWet.fade,this._split=new Vo({context:this.context,channels:2}),this._merge=new Uo({context:this.context,channels:2}),this.input.connect(this._split),this.input.connect(this._dryWet.a),this._merge.connect(this._dryWet.b),Xi(this,["wet"])}connectEffectLeft(...e){this._split.connect(e[0],0,0),Es(...e),_s(e[e.length-1],this._merge,0,0)}connectEffectRight(...e){this._split.connect(e[0],1,0),Es(...e),_s(e[e.length-1],this._merge,0,1)}static getDefaults(){return Object.assign(Ss.getDefaults(),{wet:1})}dispose(){return super.dispose(),this._dryWet.dispose(),this._split.dispose(),this._merge.dispose(),this}}class Go extends Wo{constructor(e){super(e),this.feedback=new Ds({context:this.context,value:e.feedback,units:"normalRange"}),this._feedbackL=new Is({context:this.context}),this._feedbackR=new Is({context:this.context}),this._feedbackSplit=new Vo({context:this.context,channels:2}),this._feedbackMerge=new Uo({context:this.context,channels:2}),this._merge.connect(this._feedbackSplit),this._feedbackMerge.connect(this._split),this._feedbackSplit.connect(this._feedbackL,0,0),this._feedbackL.connect(this._feedbackMerge,0,0),this._feedbackSplit.connect(this._feedbackR,1,0),this._feedbackR.connect(this._feedbackMerge,0,1),this.feedback.fan(this._feedbackL.gain,this._feedbackR.gain),Xi(this,["feedback"])}static getDefaults(){return Object.assign(Wo.getDefaults(),{feedback:.5})}dispose(){return super.dispose(),this.feedback.dispose(),this._feedbackL.dispose(),this._feedbackR.dispose(),this._feedbackSplit.dispose(),this._feedbackMerge.dispose(),this}}class qo extends Go{constructor(){super(Di(qo.getDefaults(),arguments,["frequency","delayTime","depth"])),this.name="Chorus";const e=Di(qo.getDefaults(),arguments,["frequency","delayTime","depth"]);this._depth=e.depth,this._delayTime=e.delayTime/1e3,this._lfoL=new Cr({context:this.context,frequency:e.frequency,min:0,max:1}),this._lfoR=new Cr({context:this.context,frequency:e.frequency,min:0,max:1,phase:180}),this._delayNodeL=new Ls({context:this.context}),this._delayNodeR=new Ls({context:this.context}),this.frequency=this._lfoL.frequency,Xi(this,["frequency"]),this._lfoL.frequency.connect(this._lfoR.frequency),this.connectEffectLeft(this._delayNodeL),this.connectEffectRight(this._delayNodeR),this._lfoL.connect(this._delayNodeL.delayTime),this._lfoR.connect(this._delayNodeR.delayTime),this.depth=this._depth,this.type=e.type,this.spread=e.spread}static getDefaults(){return Object.assign(Go.getDefaults(),{frequency:1.5,delayTime:3.5,depth:.7,type:"sine",spread:180,feedback:0,wet:.5})}get depth(){return this._depth}set depth(e){this._depth=e;const t=this._delayTime*e;this._lfoL.min=Math.max(this._delayTime-t,0),this._lfoL.max=this._delayTime+t,this._lfoR.min=Math.max(this._delayTime-t,0),this._lfoR.max=this._delayTime+t}get delayTime(){return 1e3*this._delayTime}set delayTime(e){this._delayTime=e/1e3,this.depth=this._depth}get type(){return this._lfoL.type}set type(e){this._lfoL.type=e,this._lfoR.type=e}get spread(){return this._lfoR.phase-this._lfoL.phase}set spread(e){this._lfoL.phase=90-e/2,this._lfoR.phase=e/2+90}start(e){return this._lfoL.start(e),this._lfoR.start(e),this}stop(e){return this._lfoL.stop(e),this._lfoR.stop(e),this}sync(){return this._lfoL.sync(),this._lfoR.sync(),this}unsync(){return this._lfoL.unsync(),this._lfoR.unsync(),this}dispose(){return super.dispose(),this._lfoL.dispose(),this._lfoR.dispose(),this._delayNodeL.dispose(),this._delayNodeR.dispose(),this.frequency.dispose(),this}}class Ho extends No{constructor(){super(Di(Ho.getDefaults(),arguments,["distortion"])),this.name="Distortion";const e=Di(Ho.getDefaults(),arguments,["distortion"]);this._shaper=new hr({context:this.context,length:4096}),this._distortion=e.distortion,this.connectEffect(this._shaper),this.distortion=e.distortion,this.oversample=e.oversample}static getDefaults(){return Object.assign(No.getDefaults(),{distortion:.4,oversample:"none"})}get distortion(){return this._distortion}set distortion(e){this._distortion=e;const t=100*e,n=Math.PI/180;this._shaper.setMap((e=>Math.abs(e)<.001?0:(3+t)*e*20*n/(Math.PI+t*Math.abs(e))))}get oversample(){return this._shaper.oversample}set oversample(e){this._shaper.oversample=e}dispose(){return super.dispose(),this._shaper.dispose(),this}}class Ko extends No{constructor(e){super(e),this.name="FeedbackEffect",this._feedbackGain=new Is({context:this.context,gain:e.feedback,units:"normalRange"}),this.feedback=this._feedbackGain.gain,Xi(this,"feedback"),this.effectReturn.chain(this._feedbackGain,this.effectSend)}static getDefaults(){return Object.assign(No.getDefaults(),{feedback:.125})}dispose(){return super.dispose(),this._feedbackGain.dispose(),this.feedback.dispose(),this}}class $o extends Ko{constructor(){super(Di($o.getDefaults(),arguments,["delayTime","feedback"])),this.name="FeedbackDelay";const e=Di($o.getDefaults(),arguments,["delayTime","feedback"]);this._delayNode=new Ls({context:this.context,delayTime:e.delayTime,maxDelay:e.maxDelay}),this.delayTime=this._delayNode.delayTime,this.connectEffect(this._delayNode),Xi(this,"delayTime")}static getDefaults(){return Object.assign(Ko.getDefaults(),{delayTime:.25,maxDelay:1})}dispose(){return super.dispose(),this._delayNode.dispose(),this.delayTime.dispose(),this}}class Zo extends Ss{constructor(e){super(e),this.name="PhaseShiftAllpass",this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this.offset90=new Is({context:this.context});this._bank0=this._createAllPassFilterBank([.6923878,.9360654322959,.988229522686,.9987488452737]),this._bank1=this._createAllPassFilterBank([.4021921162426,.856171088242,.9722909545651,.9952884791278]),this._oneSampleDelay=this.context.createIIRFilter([0,1],[1,0]),Es(this.input,...this._bank0,this._oneSampleDelay,this.output),Es(this.input,...this._bank1,this.offset90)}_createAllPassFilterBank(e){return e.map((e=>{const t=[[e*e,0,-1],[1,0,-e*e]];return this.context.createIIRFilter(t[0],t[1])}))}dispose(){return super.dispose(),this.input.dispose(),this.output.dispose(),this.offset90.dispose(),this._bank0.forEach((e=>e.disconnect())),this._bank1.forEach((e=>e.disconnect())),this._oneSampleDelay.disconnect(),this}}class Xo extends No{constructor(){super(Di(Xo.getDefaults(),arguments,["frequency"])),this.name="FrequencyShifter";const e=Di(Xo.getDefaults(),arguments,["frequency"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency,minValue:-this.context.sampleRate/2,maxValue:this.context.sampleRate/2}),this._sine=new lr({context:this.context,type:"sine"}),this._cosine=new ur({context:this.context,phase:-90,type:"sine"}),this._sineMultiply=new pr({context:this.context}),this._cosineMultiply=new pr({context:this.context}),this._negate=new Dr({context:this.context}),this._add=new wr({context:this.context}),this._phaseShifter=new Zo({context:this.context}),this.effectSend.connect(this._phaseShifter),this.frequency.fan(this._sine.frequency,this._cosine.frequency),this._phaseShifter.offset90.connect(this._cosineMultiply),this._cosine.connect(this._cosineMultiply.factor),this._phaseShifter.connect(this._sineMultiply),this._sine.connect(this._sineMultiply.factor),this._sineMultiply.connect(this._negate),this._cosineMultiply.connect(this._add),this._negate.connect(this._add.addend),this._add.connect(this.effectReturn);const t=this.immediate();this._sine.start(t),this._cosine.start(t)}static getDefaults(){return Object.assign(No.getDefaults(),{frequency:0})}dispose(){return super.dispose(),this.frequency.dispose(),this._add.dispose(),this._cosine.dispose(),this._cosineMultiply.dispose(),this._negate.dispose(),this._phaseShifter.dispose(),this._sine.dispose(),this._sineMultiply.dispose(),this}}const Yo=[1557/44100,1617/44100,1491/44100,1422/44100,1277/44100,1356/44100,1188/44100,1116/44100],Qo=[225,556,441,341];class Jo extends Wo{constructor(){super(Di(Jo.getDefaults(),arguments,["roomSize","dampening"])),this.name="Freeverb",this._combFilters=[],this._allpassFiltersL=[],this._allpassFiltersR=[];const e=Di(Jo.getDefaults(),arguments,["roomSize","dampening"]);this.roomSize=new Ds({context:this.context,value:e.roomSize,units:"normalRange"}),this._allpassFiltersL=Qo.map((e=>{const t=this.context.createBiquadFilter();return t.type="allpass",t.frequency.value=e,t})),this._allpassFiltersR=Qo.map((e=>{const t=this.context.createBiquadFilter();return t.type="allpass",t.frequency.value=e,t})),this._combFilters=Yo.map(((t,n)=>{const a=new co({context:this.context,dampening:e.dampening,delayTime:t});return nt.dampening=e))}dispose(){return super.dispose(),this._allpassFiltersL.forEach((e=>e.disconnect())),this._allpassFiltersR.forEach((e=>e.disconnect())),this._combFilters.forEach((e=>e.dispose())),this.roomSize.dispose(),this}}const el=[.06748,.06404,.08212,.09004],tl=[.773,.802,.753,.733],nl=[347,113,37];class al extends Wo{constructor(){super(Di(al.getDefaults(),arguments,["roomSize"])),this.name="JCReverb",this._allpassFilters=[],this._feedbackCombFilters=[];const e=Di(al.getDefaults(),arguments,["roomSize"]);this.roomSize=new Ds({context:this.context,value:e.roomSize,units:"normalRange"}),this._scaleRoomSize=new Ar({context:this.context,min:-.733,max:.197}),this._allpassFilters=nl.map((e=>{const t=this.context.createBiquadFilter();return t.type="allpass",t.frequency.value=e,t})),this._feedbackCombFilters=el.map(((e,t)=>{const n=new lo({context:this.context,delayTime:e});return this._scaleRoomSize.connect(n.resonance),n.resonance.value=tl[t],te.disconnect())),this._feedbackCombFilters.forEach((e=>e.dispose())),this.roomSize.dispose(),this._scaleRoomSize.dispose(),this}}class il extends Go{constructor(e){super(e),this._feedbackL.disconnect(),this._feedbackL.connect(this._feedbackMerge,0,1),this._feedbackR.disconnect(),this._feedbackR.connect(this._feedbackMerge,0,0),Xi(this,["feedback"])}}class sl extends il{constructor(){super(Di(sl.getDefaults(),arguments,["delayTime","feedback"])),this.name="PingPongDelay";const e=Di(sl.getDefaults(),arguments,["delayTime","feedback"]);this._leftDelay=new Ls({context:this.context,maxDelay:e.maxDelay}),this._rightDelay=new Ls({context:this.context,maxDelay:e.maxDelay}),this._rightPreDelay=new Ls({context:this.context,maxDelay:e.maxDelay}),this.delayTime=new Ds({context:this.context,units:"time",value:e.delayTime}),this.connectEffectLeft(this._leftDelay),this.connectEffectRight(this._rightPreDelay,this._rightDelay),this.delayTime.fan(this._leftDelay.delayTime,this._rightDelay.delayTime,this._rightPreDelay.delayTime),this._feedbackL.disconnect(),this._feedbackL.connect(this._rightDelay),Xi(this,["delayTime"])}static getDefaults(){return Object.assign(il.getDefaults(),{delayTime:.25,maxDelay:1})}dispose(){return super.dispose(),this._leftDelay.dispose(),this._rightDelay.dispose(),this._rightPreDelay.dispose(),this.delayTime.dispose(),this}}class rl extends Ko{constructor(){super(Di(rl.getDefaults(),arguments,["pitch"])),this.name="PitchShift";const e=Di(rl.getDefaults(),arguments,["pitch"]);this._frequency=new Ds({context:this.context}),this._delayA=new Ls({maxDelay:1,context:this.context}),this._lfoA=new Cr({context:this.context,min:0,max:.1,type:"sawtooth"}).connect(this._delayA.delayTime),this._delayB=new Ls({maxDelay:1,context:this.context}),this._lfoB=new Cr({context:this.context,min:0,max:.1,type:"sawtooth",phase:180}).connect(this._delayB.delayTime),this._crossFade=new Io({context:this.context}),this._crossFadeLFO=new Cr({context:this.context,min:0,max:1,type:"triangle",phase:90}).connect(this._crossFade.fade),this._feedbackDelay=new Ls({delayTime:e.delayTime,context:this.context}),this.delayTime=this._feedbackDelay.delayTime,Xi(this,"delayTime"),this._pitch=e.pitch,this._windowSize=e.windowSize,this._delayA.connect(this._crossFade.a),this._delayB.connect(this._crossFade.b),this._frequency.fan(this._lfoA.frequency,this._lfoB.frequency,this._crossFadeLFO.frequency),this.effectSend.fan(this._delayA,this._delayB),this._crossFade.chain(this._feedbackDelay,this.effectReturn);const t=this.now();this._lfoA.start(t),this._lfoB.start(t),this._crossFadeLFO.start(t),this.windowSize=this._windowSize}static getDefaults(){return Object.assign(Ko.getDefaults(),{pitch:0,windowSize:.1,delayTime:0,feedback:0})}get pitch(){return this._pitch}set pitch(e){this._pitch=e;let t=0;e<0?(this._lfoA.min=0,this._lfoA.max=this._windowSize,this._lfoB.min=0,this._lfoB.max=this._windowSize,t=ls(e-1)+1):(this._lfoA.min=this._windowSize,this._lfoA.max=0,this._lfoB.min=this._windowSize,this._lfoB.max=0,t=ls(e)-1),this._frequency.value=t*(1.2/this._windowSize)}get windowSize(){return this._windowSize}set windowSize(e){this._windowSize=this.toSeconds(e),this.pitch=this._pitch}dispose(){return super.dispose(),this._frequency.dispose(),this._delayA.dispose(),this._delayB.dispose(),this._lfoA.dispose(),this._lfoB.dispose(),this._crossFade.dispose(),this._crossFadeLFO.dispose(),this._feedbackDelay.dispose(),this}}class ol extends Wo{constructor(){super(Di(ol.getDefaults(),arguments,["frequency","octaves","baseFrequency"])),this.name="Phaser";const e=Di(ol.getDefaults(),arguments,["frequency","octaves","baseFrequency"]);this._lfoL=new Cr({context:this.context,frequency:e.frequency,min:0,max:1}),this._lfoR=new Cr({context:this.context,frequency:e.frequency,min:0,max:1,phase:180}),this._baseFrequency=this.toFrequency(e.baseFrequency),this._octaves=e.octaves,this.Q=new Ds({context:this.context,value:e.Q,units:"positive"}),this._filtersL=this._makeFilters(e.stages,this._lfoL),this._filtersR=this._makeFilters(e.stages,this._lfoR),this.frequency=this._lfoL.frequency,this.frequency.value=e.frequency,this.connectEffectLeft(...this._filtersL),this.connectEffectRight(...this._filtersR),this._lfoL.frequency.connect(this._lfoR.frequency),this.baseFrequency=e.baseFrequency,this.octaves=e.octaves,this._lfoL.start(),this._lfoR.start(),Xi(this,["frequency","Q"])}static getDefaults(){return Object.assign(Wo.getDefaults(),{frequency:.5,octaves:3,stages:10,Q:10,baseFrequency:350})}_makeFilters(e,t){const n=[];for(let a=0;ae.disconnect())),this._filtersR.forEach((e=>e.disconnect())),this.frequency.dispose(),this}}class ll extends No{constructor(){super(Di(ll.getDefaults(),arguments,["decay"])),this.name="Reverb",this._convolver=this.context.createConvolver(),this.ready=Promise.resolve();const e=Di(ll.getDefaults(),arguments,["decay"]);this._decay=e.decay,this._preDelay=e.preDelay,this.generate(),this.connectEffect(this._convolver)}static getDefaults(){return Object.assign(No.getDefaults(),{decay:1.5,preDelay:.01})}get decay(){return this._decay}set decay(e){si(e=this.toSeconds(e),.001),this._decay=e,this.generate()}get preDelay(){return this._preDelay}set preDelay(e){si(e=this.toSeconds(e),0),this._preDelay=e,this.generate()}generate(){return xi(this,void 0,void 0,(function*(){const e=this.ready,t=new es(2,this._decay+this._preDelay,this.context.sampleRate),n=new nr({context:t}),a=new nr({context:t}),i=new Uo({context:t});n.connect(i,0,0),a.connect(i,0,1);const s=new Is({context:t}).toDestination();i.connect(s),n.start(0),a.start(0),s.gain.setValueAtTime(0,0),s.gain.setValueAtTime(1,this._preDelay),s.gain.exponentialApproachValueAtTime(0,this._preDelay,this.decay);const r=t.render();return this.ready=r.then(Qi),yield e,this._convolver.buffer=(yield r).get(),this}))}dispose(){return super.dispose(),this._convolver.disconnect(),this}}class ul extends Ss{constructor(){super(Di(ul.getDefaults(),arguments)),this.name="MidSideSplit",this._split=this.input=new Vo({channels:2,context:this.context}),this._midAdd=new wr({context:this.context}),this.mid=new pr({context:this.context,value:Math.SQRT1_2}),this._sideSubtract=new zr({context:this.context}),this.side=new pr({context:this.context,value:Math.SQRT1_2}),this._split.connect(this._midAdd,0),this._split.connect(this._midAdd.addend,1),this._split.connect(this._sideSubtract,0),this._split.connect(this._sideSubtract.subtrahend,1),this._midAdd.connect(this.mid),this._sideSubtract.connect(this.side)}dispose(){return super.dispose(),this.mid.dispose(),this.side.dispose(),this._midAdd.dispose(),this._sideSubtract.dispose(),this._split.dispose(),this}}class cl extends Ss{constructor(){super(Di(cl.getDefaults(),arguments)),this.name="MidSideMerge",this.mid=new Is({context:this.context}),this.side=new Is({context:this.context}),this._left=new wr({context:this.context}),this._leftMult=new pr({context:this.context,value:Math.SQRT1_2}),this._right=new zr({context:this.context}),this._rightMult=new pr({context:this.context,value:Math.SQRT1_2}),this._merge=this.output=new Uo({context:this.context}),this.mid.fan(this._left),this.side.connect(this._left.addend),this.mid.connect(this._right),this.side.connect(this._right.subtrahend),this._left.connect(this._leftMult),this._right.connect(this._rightMult),this._leftMult.connect(this._merge,0,0),this._rightMult.connect(this._merge,0,1)}dispose(){return super.dispose(),this.mid.dispose(),this.side.dispose(),this._leftMult.dispose(),this._rightMult.dispose(),this._left.dispose(),this._right.dispose(),this}}class hl extends No{constructor(e){super(e),this.name="MidSideEffect",this._midSideMerge=new cl({context:this.context}),this._midSideSplit=new ul({context:this.context}),this._midSend=this._midSideSplit.mid,this._sideSend=this._midSideSplit.side,this._midReturn=this._midSideMerge.mid,this._sideReturn=this._midSideMerge.side,this.effectSend.connect(this._midSideSplit),this._midSideMerge.connect(this.effectReturn)}connectEffectMid(...e){this._midSend.chain(...e,this._midReturn)}connectEffectSide(...e){this._sideSend.chain(...e,this._sideReturn)}dispose(){return super.dispose(),this._midSideSplit.dispose(),this._midSideMerge.dispose(),this._midSend.dispose(),this._sideSend.dispose(),this._midReturn.dispose(),this._sideReturn.dispose(),this}}class dl extends hl{constructor(){super(Di(dl.getDefaults(),arguments,["width"])),this.name="StereoWidener";const e=Di(dl.getDefaults(),arguments,["width"]);this.width=new Ds({context:this.context,value:e.width,units:"normalRange"}),Xi(this,["width"]),this._twoTimesWidthMid=new pr({context:this.context,value:2}),this._twoTimesWidthSide=new pr({context:this.context,value:2}),this._midMult=new pr({context:this.context}),this._twoTimesWidthMid.connect(this._midMult.factor),this.connectEffectMid(this._midMult),this._oneMinusWidth=new zr({context:this.context}),this._oneMinusWidth.connect(this._twoTimesWidthMid),_s(this.context.getConstant(1),this._oneMinusWidth),this.width.connect(this._oneMinusWidth.subtrahend),this._sideMult=new pr({context:this.context}),this.width.connect(this._twoTimesWidthSide),this._twoTimesWidthSide.connect(this._sideMult.factor),this.connectEffectSide(this._sideMult)}static getDefaults(){return Object.assign(hl.getDefaults(),{width:.5})}dispose(){return super.dispose(),this.width.dispose(),this._midMult.dispose(),this._sideMult.dispose(),this._twoTimesWidthMid.dispose(),this._twoTimesWidthSide.dispose(),this._oneMinusWidth.dispose(),this}}class pl extends Wo{constructor(){super(Di(pl.getDefaults(),arguments,["frequency","depth"])),this.name="Tremolo";const e=Di(pl.getDefaults(),arguments,["frequency","depth"]);this._lfoL=new Cr({context:this.context,type:e.type,min:1,max:0}),this._lfoR=new Cr({context:this.context,type:e.type,min:1,max:0}),this._amplitudeL=new Is({context:this.context}),this._amplitudeR=new Is({context:this.context}),this.frequency=new Ds({context:this.context,value:e.frequency,units:"frequency"}),this.depth=new Ds({context:this.context,value:e.depth,units:"normalRange"}),Xi(this,["frequency","depth"]),this.connectEffectLeft(this._amplitudeL),this.connectEffectRight(this._amplitudeR),this._lfoL.connect(this._amplitudeL.gain),this._lfoR.connect(this._amplitudeR.gain),this.frequency.fan(this._lfoL.frequency,this._lfoR.frequency),this.depth.fan(this._lfoR.amplitude,this._lfoL.amplitude),this.spread=e.spread}static getDefaults(){return Object.assign(Wo.getDefaults(),{frequency:10,type:"sine",depth:.5,spread:180})}start(e){return this._lfoL.start(e),this._lfoR.start(e),this}stop(e){return this._lfoL.stop(e),this._lfoR.stop(e),this}sync(){return this._lfoL.sync(),this._lfoR.sync(),this.context.transport.syncSignal(this.frequency),this}unsync(){return this._lfoL.unsync(),this._lfoR.unsync(),this.context.transport.unsyncSignal(this.frequency),this}get type(){return this._lfoL.type}set type(e){this._lfoL.type=e,this._lfoR.type=e}get spread(){return this._lfoR.phase-this._lfoL.phase}set spread(e){this._lfoL.phase=90-e/2,this._lfoR.phase=e/2+90}dispose(){return super.dispose(),this._lfoL.dispose(),this._lfoR.dispose(),this._amplitudeL.dispose(),this._amplitudeR.dispose(),this.frequency.dispose(),this.depth.dispose(),this}}class ml extends No{constructor(){super(Di(ml.getDefaults(),arguments,["frequency","depth"])),this.name="Vibrato";const e=Di(ml.getDefaults(),arguments,["frequency","depth"]);this._delayNode=new Ls({context:this.context,delayTime:0,maxDelay:e.maxDelay}),this._lfo=new Cr({context:this.context,type:e.type,min:0,max:e.maxDelay,frequency:e.frequency,phase:-90}).start().connect(this._delayNode.delayTime),this.frequency=this._lfo.frequency,this.depth=this._lfo.amplitude,this.depth.value=e.depth,Xi(this,["frequency","depth"]),this.effectSend.chain(this._delayNode,this.effectReturn)}static getDefaults(){return Object.assign(No.getDefaults(),{maxDelay:.005,frequency:5,depth:.1,type:"sine"})}get type(){return this._lfo.type}set type(e){this._lfo.type=e}dispose(){return super.dispose(),this._delayNode.dispose(),this._lfo.dispose(),this.frequency.dispose(),this.depth.dispose(),this}}class fl extends Ss{constructor(){super(Di(fl.getDefaults(),arguments,["type","size"])),this.name="Analyser",this._analysers=[],this._buffers=[];const e=Di(fl.getDefaults(),arguments,["type","size"]);this.input=this.output=this._gain=new Is({context:this.context}),this._split=new Vo({context:this.context,channels:e.channels}),this.input.connect(this._split),si(e.channels,1);for(let t=0;t{const n=this._buffers[t];"fft"===this._type?e.getFloatFrequencyData(n):"waveform"===this._type&&e.getFloatTimeDomainData(n)})),1===this.channels?this._buffers[0]:this._buffers}get size(){return this._analysers[0].frequencyBinCount}set size(e){this._analysers.forEach(((t,n)=>{t.fftSize=2*e,this._buffers[n]=new Float32Array(e)}))}get channels(){return this._analysers.length}get type(){return this._type}set type(e){ii("waveform"===e||"fft"===e,`Analyser: invalid type: ${e}`),this._type=e}get smoothing(){return this._analysers[0].smoothingTimeConstant}set smoothing(e){this._analysers.forEach((t=>t.smoothingTimeConstant=e))}dispose(){return super.dispose(),this._analysers.forEach((e=>e.disconnect())),this._split.dispose(),this._gain.dispose(),this}}class gl extends Ss{constructor(){super(Di(gl.getDefaults(),arguments)),this.name="MeterBase",this.input=this.output=this._analyser=new fl({context:this.context,size:256,type:"waveform"})}dispose(){return super.dispose(),this._analyser.dispose(),this}}class yl extends gl{constructor(){super(Di(yl.getDefaults(),arguments,["smoothing"])),this.name="Meter",this._rms=0;const e=Di(yl.getDefaults(),arguments,["smoothing"]);this.input=this.output=this._analyser=new fl({context:this.context,size:256,type:"waveform",channels:e.channels}),this.smoothing=e.smoothing,this.normalRange=e.normalRange}static getDefaults(){return Object.assign(gl.getDefaults(),{smoothing:.8,normalRange:!1,channels:1})}getLevel(){return ci("'getLevel' has been changed to 'getValue'"),this.getValue()}getValue(){const e=this._analyser.getValue(),t=(1===this.channels?[e]:e).map((e=>{const t=e.reduce(((e,t)=>e+t*t),0),n=Math.sqrt(t/e.length);return this._rms=Math.max(n,this._rms*this.smoothing),this.normalRange?this._rms:os(this._rms)}));return 1===this.channels?t[0]:t}get channels(){return this._analyser.channels}dispose(){return super.dispose(),this._analyser.dispose(),this}}class bl extends gl{constructor(){super(Di(bl.getDefaults(),arguments,["size"])),this.name="FFT";const e=Di(bl.getDefaults(),arguments,["size"]);this.normalRange=e.normalRange,this._analyser.type="fft",this.size=e.size}static getDefaults(){return Object.assign(Ss.getDefaults(),{normalRange:!1,size:1024,smoothing:.8})}getValue(){return this._analyser.getValue().map((e=>this.normalRange?rs(e):e))}get size(){return this._analyser.size}set size(e){this._analyser.size=e}get smoothing(){return this._analyser.smoothing}set smoothing(e){this._analyser.smoothing=e}getFrequencyOfIndex(e){return ii(0<=e&&ee._updateSolo()))}get muted(){return 0===this.input.gain.value}_addSolo(){wl._soloed.has(this.context)||wl._soloed.set(this.context,new Set),wl._soloed.get(this.context).add(this)}_removeSolo(){wl._soloed.has(this.context)&&wl._soloed.get(this.context).delete(this)}_isSoloed(){return wl._soloed.has(this.context)&&wl._soloed.get(this.context).has(this)}_noSolos(){return!wl._soloed.has(this.context)||wl._soloed.has(this.context)&&0===wl._soloed.get(this.context).size}_updateSolo(){this._isSoloed()||this._noSolos()?this.input.gain.value=1:this.input.gain.value=0}dispose(){return super.dispose(),wl._allSolos.get(this.context).delete(this),this._removeSolo(),this}}wl._allSolos=new Map,wl._soloed=new Map;class Al extends Ss{constructor(){super(Di(Al.getDefaults(),arguments,["pan","volume"])),this.name="PanVol";const e=Di(Al.getDefaults(),arguments,["pan","volume"]);this._panner=this.input=new zo({context:this.context,pan:e.pan,channelCount:e.channelCount}),this.pan=this._panner.pan,this._volume=this.output=new $s({context:this.context,volume:e.volume}),this.volume=this._volume.volume,this._panner.connect(this._volume),this.mute=e.mute,Xi(this,["pan","volume"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,pan:0,volume:0,channelCount:1})}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}dispose(){return super.dispose(),this._panner.dispose(),this.pan.dispose(),this._volume.dispose(),this.volume.dispose(),this}}class xl extends Ss{constructor(){super(Di(xl.getDefaults(),arguments,["volume","pan"])),this.name="Channel";const e=Di(xl.getDefaults(),arguments,["volume","pan"]);this._solo=this.input=new wl({solo:e.solo,context:this.context}),this._panVol=this.output=new Al({context:this.context,pan:e.pan,volume:e.volume,mute:e.mute,channelCount:e.channelCount}),this.pan=this._panVol.pan,this.volume=this._panVol.volume,this._solo.connect(this._panVol),Xi(this,["pan","volume"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{pan:0,volume:0,mute:!1,solo:!1,channelCount:1})}get solo(){return this._solo.solo}set solo(e){this._solo.solo=e}get muted(){return this._solo.muted||this.mute}get mute(){return this._panVol.mute}set mute(e){this._panVol.mute=e}_getBus(e){return xl.buses.has(e)||xl.buses.set(e,new Is({context:this.context})),xl.buses.get(e)}send(e,t=0){const n=this._getBus(e),a=new Is({context:this.context,units:"decibels",gain:t});return this.connect(a),a.connect(n),a}receive(e){return this._getBus(e).connect(this),this}dispose(){return super.dispose(),this._panVol.dispose(),this.pan.dispose(),this.volume.dispose(),this._solo.dispose(),this}}xl.buses=new Map;class Cl extends Ss{constructor(){super(Di(Cl.getDefaults(),arguments)),this.name="Mono",this.input=new Is({context:this.context}),this._merge=this.output=new Uo({channels:2,context:this.context}),this.input.connect(this._merge,0,0),this.input.connect(this._merge,0,1)}dispose(){return super.dispose(),this._merge.dispose(),this.input.dispose(),this}}class Sl extends Ss{constructor(){super(Di(Sl.getDefaults(),arguments,["lowFrequency","highFrequency"])),this.name="MultibandSplit",this.input=new Is({context:this.context}),this.output=void 0,this.low=new $r({context:this.context,frequency:0,type:"lowpass"}),this._lowMidFilter=new $r({context:this.context,frequency:0,type:"highpass"}),this.mid=new $r({context:this.context,frequency:0,type:"lowpass"}),this.high=new $r({context:this.context,frequency:0,type:"highpass"}),this._internalChannels=[this.low,this.mid,this.high];const e=Di(Sl.getDefaults(),arguments,["lowFrequency","highFrequency"]);this.lowFrequency=new Ds({context:this.context,units:"frequency",value:e.lowFrequency}),this.highFrequency=new Ds({context:this.context,units:"frequency",value:e.highFrequency}),this.Q=new Ds({context:this.context,units:"positive",value:e.Q}),this.input.fan(this.low,this.high),this.input.chain(this._lowMidFilter,this.mid),this.lowFrequency.fan(this.low.frequency,this._lowMidFilter.frequency),this.highFrequency.fan(this.mid.frequency,this.high.frequency),this.Q.connect(this.low.Q),this.Q.connect(this._lowMidFilter.Q),this.Q.connect(this.mid.Q),this.Q.connect(this.high.Q),Xi(this,["high","mid","low","highFrequency","lowFrequency"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{Q:1,highFrequency:2500,lowFrequency:400})}dispose(){return super.dispose(),Yi(this,["high","mid","low","highFrequency","lowFrequency"]),this.low.dispose(),this._lowMidFilter.dispose(),this.mid.dispose(),this.high.dispose(),this.lowFrequency.dispose(),this.highFrequency.dispose(),this.Q.dispose(),this}}class El extends Ss{constructor(){super(...arguments),this.name="Listener",this.positionX=new Cs({context:this.context,param:this.context.rawContext.listener.positionX}),this.positionY=new Cs({context:this.context,param:this.context.rawContext.listener.positionY}),this.positionZ=new Cs({context:this.context,param:this.context.rawContext.listener.positionZ}),this.forwardX=new Cs({context:this.context,param:this.context.rawContext.listener.forwardX}),this.forwardY=new Cs({context:this.context,param:this.context.rawContext.listener.forwardY}),this.forwardZ=new Cs({context:this.context,param:this.context.rawContext.listener.forwardZ}),this.upX=new Cs({context:this.context,param:this.context.rawContext.listener.upX}),this.upY=new Cs({context:this.context,param:this.context.rawContext.listener.upY}),this.upZ=new Cs({context:this.context,param:this.context.rawContext.listener.upZ})}static getDefaults(){return Object.assign(Ss.getDefaults(),{positionX:0,positionY:0,positionZ:0,forwardX:0,forwardY:0,forwardZ:-1,upX:0,upY:1,upZ:0})}dispose(){return super.dispose(),this.positionX.dispose(),this.positionY.dispose(),this.positionZ.dispose(),this.forwardX.dispose(),this.forwardY.dispose(),this.forwardZ.dispose(),this.upX.dispose(),this.upY.dispose(),this.upZ.dispose(),this}}Gi((e=>{e.listener=new El({context:e})})),Hi((e=>{e.listener.dispose()}));class _l extends Ss{constructor(){super(Di(_l.getDefaults(),arguments,["positionX","positionY","positionZ"])),this.name="Panner3D";const e=Di(_l.getDefaults(),arguments,["positionX","positionY","positionZ"]);this._panner=this.input=this.output=this.context.createPanner(),this.panningModel=e.panningModel,this.maxDistance=e.maxDistance,this.distanceModel=e.distanceModel,this.coneOuterGain=e.coneOuterGain,this.coneOuterAngle=e.coneOuterAngle,this.coneInnerAngle=e.coneInnerAngle,this.refDistance=e.refDistance,this.rolloffFactor=e.rolloffFactor,this.positionX=new Cs({context:this.context,param:this._panner.positionX,value:e.positionX}),this.positionY=new Cs({context:this.context,param:this._panner.positionY,value:e.positionY}),this.positionZ=new Cs({context:this.context,param:this._panner.positionZ,value:e.positionZ}),this.orientationX=new Cs({context:this.context,param:this._panner.orientationX,value:e.orientationX}),this.orientationY=new Cs({context:this.context,param:this._panner.orientationY,value:e.orientationY}),this.orientationZ=new Cs({context:this.context,param:this._panner.orientationZ,value:e.orientationZ})}static getDefaults(){return Object.assign(Ss.getDefaults(),{coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0,distanceModel:"inverse",maxDistance:1e4,orientationX:0,orientationY:0,orientationZ:0,panningModel:"equalpower",positionX:0,positionY:0,positionZ:0,refDistance:1,rolloffFactor:1})}setPosition(e,t,n){return this.positionX.value=e,this.positionY.value=t,this.positionZ.value=n,this}setOrientation(e,t,n){return this.orientationX.value=e,this.orientationY.value=t,this.orientationZ.value=n,this}get panningModel(){return this._panner.panningModel}set panningModel(e){this._panner.panningModel=e}get refDistance(){return this._panner.refDistance}set refDistance(e){this._panner.refDistance=e}get rolloffFactor(){return this._panner.rolloffFactor}set rolloffFactor(e){this._panner.rolloffFactor=e}get distanceModel(){return this._panner.distanceModel}set distanceModel(e){this._panner.distanceModel=e}get coneInnerAngle(){return this._panner.coneInnerAngle}set coneInnerAngle(e){this._panner.coneInnerAngle=e}get coneOuterAngle(){return this._panner.coneOuterAngle}set coneOuterAngle(e){this._panner.coneOuterAngle=e}get coneOuterGain(){return this._panner.coneOuterGain}set coneOuterGain(e){this._panner.coneOuterGain=e}get maxDistance(){return this._panner.maxDistance}set maxDistance(e){this._panner.maxDistance=e}dispose(){return super.dispose(),this._panner.disconnect(),this.orientationX.dispose(),this.orientationY.dispose(),this.orientationZ.dispose(),this.positionX.dispose(),this.positionY.dispose(),this.positionZ.dispose(),this}}class Tl extends Ss{constructor(){super(Di(Tl.getDefaults(),arguments)),this.name="Recorder";const e=Di(Tl.getDefaults(),arguments);this.input=new Is({context:this.context}),ii(Tl.supported,"Media Recorder API is not available"),this._stream=this.context.createMediaStreamDestination(),this.input.connect(this._stream),this._recorder=new MediaRecorder(this._stream.stream,{mimeType:e.mimeType})}static getDefaults(){return Ss.getDefaults()}get mimeType(){return this._recorder.mimeType}static get supported(){return null!==ki&&Reflect.has(ki,"MediaRecorder")}get state(){return"inactive"===this._recorder.state?"stopped":"paused"===this._recorder.state?"paused":"started"}start(){return xi(this,void 0,void 0,(function*(){ii("started"!==this.state,"Recorder is already started");const e=new Promise((e=>{const t=()=>{this._recorder.removeEventListener("start",t,!1),e()};this._recorder.addEventListener("start",t,!1)}));return this._recorder.start(),yield e}))}stop(){return xi(this,void 0,void 0,(function*(){ii("stopped"!==this.state,"Recorder is not started");const e=new Promise((e=>{const t=n=>{this._recorder.removeEventListener("dataavailable",t,!1),e(n.data)};this._recorder.addEventListener("dataavailable",t,!1)}));return this._recorder.stop(),yield e}))}pause(){return ii("started"===this.state,"Recorder must be started"),this._recorder.pause(),this}dispose(){return super.dispose(),this.input.dispose(),this._stream.disconnect(),this}}class Il extends Ss{constructor(){super(Di(Il.getDefaults(),arguments,["threshold","ratio"])),this.name="Compressor",this._compressor=this.context.createDynamicsCompressor(),this.input=this._compressor,this.output=this._compressor;const e=Di(Il.getDefaults(),arguments,["threshold","ratio"]);this.threshold=new Cs({minValue:this._compressor.threshold.minValue,maxValue:this._compressor.threshold.maxValue,context:this.context,convert:!1,param:this._compressor.threshold,units:"decibels",value:e.threshold}),this.attack=new Cs({minValue:this._compressor.attack.minValue,maxValue:this._compressor.attack.maxValue,context:this.context,param:this._compressor.attack,units:"time",value:e.attack}),this.release=new Cs({minValue:this._compressor.release.minValue,maxValue:this._compressor.release.maxValue,context:this.context,param:this._compressor.release,units:"time",value:e.release}),this.knee=new Cs({minValue:this._compressor.knee.minValue,maxValue:this._compressor.knee.maxValue,context:this.context,convert:!1,param:this._compressor.knee,units:"decibels",value:e.knee}),this.ratio=new Cs({minValue:this._compressor.ratio.minValue,maxValue:this._compressor.ratio.maxValue,context:this.context,convert:!1,param:this._compressor.ratio,units:"positive",value:e.ratio}),Xi(this,["knee","release","attack","ratio","threshold"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{attack:.003,knee:30,ratio:12,release:.25,threshold:-24})}get reduction(){return this._compressor.reduction}dispose(){return super.dispose(),this._compressor.disconnect(),this.attack.dispose(),this.release.dispose(),this.threshold.dispose(),this.ratio.dispose(),this.knee.dispose(),this}}class Nl extends Ss{constructor(){super(Object.assign(Di(Nl.getDefaults(),arguments,["threshold","smoothing"]))),this.name="Gate";const e=Di(Nl.getDefaults(),arguments,["threshold","smoothing"]);this._follower=new Mo({context:this.context,smoothing:e.smoothing}),this._gt=new Mr({context:this.context,value:rs(e.threshold)}),this.input=new Is({context:this.context}),this._gate=this.output=new Is({context:this.context}),this.input.connect(this._gate),this.input.chain(this._follower,this._gt,this._gate.gain)}static getDefaults(){return Object.assign(Ss.getDefaults(),{smoothing:.1,threshold:-40})}get threshold(){return os(this._gt.value)}set threshold(e){this._gt.value=rs(e)}get smoothing(){return this._follower.smoothing}set smoothing(e){this._follower.smoothing=e}dispose(){return super.dispose(),this.input.dispose(),this._follower.dispose(),this._gt.dispose(),this._gate.dispose(),this}}class Rl extends Ss{constructor(){super(Object.assign(Di(Rl.getDefaults(),arguments,["threshold"]))),this.name="Limiter";const e=Di(Rl.getDefaults(),arguments,["threshold"]);this._compressor=this.input=this.output=new Il({context:this.context,ratio:20,attack:.003,release:.01,threshold:e.threshold}),this.threshold=this._compressor.threshold,Xi(this,"threshold")}static getDefaults(){return Object.assign(Ss.getDefaults(),{threshold:-12})}get reduction(){return this._compressor.reduction}dispose(){return super.dispose(),this._compressor.dispose(),this.threshold.dispose(),this}}class Dl extends Ss{constructor(){super(Object.assign(Di(Dl.getDefaults(),arguments))),this.name="MidSideCompressor";const e=Di(Dl.getDefaults(),arguments);this._midSideSplit=this.input=new ul({context:this.context}),this._midSideMerge=this.output=new cl({context:this.context}),this.mid=new Il(Object.assign(e.mid,{context:this.context})),this.side=new Il(Object.assign(e.side,{context:this.context})),this._midSideSplit.mid.chain(this.mid,this._midSideMerge.mid),this._midSideSplit.side.chain(this.side,this._midSideMerge.side),Xi(this,["mid","side"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{mid:{ratio:3,threshold:-24,release:.03,attack:.02,knee:16},side:{ratio:6,threshold:-30,release:.25,attack:.03,knee:10}})}dispose(){return super.dispose(),this.mid.dispose(),this.side.dispose(),this._midSideSplit.dispose(),this._midSideMerge.dispose(),this}}class zl extends Ss{constructor(){super(Object.assign(Di(zl.getDefaults(),arguments))),this.name="MultibandCompressor";const e=Di(zl.getDefaults(),arguments);this._splitter=this.input=new Sl({context:this.context,lowFrequency:e.lowFrequency,highFrequency:e.highFrequency}),this.lowFrequency=this._splitter.lowFrequency,this.highFrequency=this._splitter.highFrequency,this.output=new Is({context:this.context}),this.low=new Il(Object.assign(e.low,{context:this.context})),this.mid=new Il(Object.assign(e.mid,{context:this.context})),this.high=new Il(Object.assign(e.high,{context:this.context})),this._splitter.low.chain(this.low,this.output),this._splitter.mid.chain(this.mid,this.output),this._splitter.high.chain(this.high,this.output),Xi(this,["high","mid","low","highFrequency","lowFrequency"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{lowFrequency:250,highFrequency:2e3,low:{ratio:6,threshold:-30,release:.25,attack:.03,knee:10},mid:{ratio:3,threshold:-24,release:.03,attack:.02,knee:16},high:{ratio:3,threshold:-24,release:.03,attack:.02,knee:16}})}dispose(){return super.dispose(),this._splitter.dispose(),this.low.dispose(),this.mid.dispose(),this.high.dispose(),this.output.dispose(),this}}class Ol extends Ss{constructor(){super(Di(Ol.getDefaults(),arguments,["low","mid","high"])),this.name="EQ3",this.output=new Is({context:this.context}),this._internalChannels=[];const e=Di(Ol.getDefaults(),arguments,["low","mid","high"]);this.input=this._multibandSplit=new Sl({context:this.context,highFrequency:e.highFrequency,lowFrequency:e.lowFrequency}),this._lowGain=new Is({context:this.context,gain:e.low,units:"decibels"}),this._midGain=new Is({context:this.context,gain:e.mid,units:"decibels"}),this._highGain=new Is({context:this.context,gain:e.high,units:"decibels"}),this.low=this._lowGain.gain,this.mid=this._midGain.gain,this.high=this._highGain.gain,this.Q=this._multibandSplit.Q,this.lowFrequency=this._multibandSplit.lowFrequency,this.highFrequency=this._multibandSplit.highFrequency,this._multibandSplit.low.chain(this._lowGain,this.output),this._multibandSplit.mid.chain(this._midGain,this.output),this._multibandSplit.high.chain(this._highGain,this.output),Xi(this,["low","mid","high","lowFrequency","highFrequency"]),this._internalChannels=[this._multibandSplit]}static getDefaults(){return Object.assign(Ss.getDefaults(),{high:0,highFrequency:2500,low:0,lowFrequency:400,mid:0})}dispose(){return super.dispose(),Yi(this,["low","mid","high","lowFrequency","highFrequency"]),this._multibandSplit.dispose(),this.lowFrequency.dispose(),this.highFrequency.dispose(),this._lowGain.dispose(),this._midGain.dispose(),this._highGain.dispose(),this.low.dispose(),this.mid.dispose(),this.high.dispose(),this.Q.dispose(),this}}class Ml extends Ss{constructor(){super(Di(Ml.getDefaults(),arguments,["url","onload"])),this.name="Convolver",this._convolver=this.context.createConvolver();const e=Di(Ml.getDefaults(),arguments,["url","onload"]);this._buffer=new Ji(e.url,(t=>{this.buffer=t,e.onload()})),this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this._buffer.loaded&&(this.buffer=this._buffer),this.normalize=e.normalize,this.input.chain(this._convolver,this.output)}static getDefaults(){return Object.assign(Ss.getDefaults(),{normalize:!0,onload:Qi})}load(e){return xi(this,void 0,void 0,(function*(){this.buffer=yield this._buffer.load(e)}))}get buffer(){return this._buffer.length?this._buffer:null}set buffer(e){e&&this._buffer.set(e),this._convolver.buffer&&(this.input.disconnect(),this._convolver.disconnect(),this._convolver=this.context.createConvolver(),this.input.chain(this._convolver,this.output));const t=this._buffer.get();this._convolver.buffer=t||null}get normalize(){return this._convolver.normalize}set normalize(e){this._convolver.normalize=e}dispose(){return super.dispose(),this._buffer.dispose(),this._convolver.disconnect(),this}}function Bl(){return as().now()}function Fl(){return as().immediate()}const Ll=as().transport;function Pl(){return as().transport}const jl=as().destination,Vl=as().destination;function Ul(){return as().destination}const Wl=as().listener;function Gl(){return as().listener}const ql=as().draw;function Hl(){return as().draw}const Kl=as();function $l(){return Ji.loaded()}const Zl=Ji,Xl=js,Yl=tr},8990:function(e,t,n){(function(){"use strict";var e;function t(e){var t=0;return function(){return t>>0)+"_",i=0;return function e(a){if(this instanceof e)throw new TypeError("Symbol is not a constructor");return new t(n+(a||"")+"_"+i++,a)}})),s("Symbol.iterator",(function(e){if(e)return e;e=Symbol("Symbol.iterator");for(var n="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),s=0;s(t=t||0)&&(t=Math.max(t+a,0));ts)a[n++]=s;else{if(2048>s)a[n++]=s>>6|192;else{if(55296<=s&&57343>=s){if(56319>=s&&i=r){s=1024*(s-55296)+r-56320+65536,a[n++]=s>>18|240,a[n++]=s>>12&63|128,a[n++]=s>>6&63|128,a[n++]=63&s|128;continue}i--}if(t)throw Error("Found an unpaired surrogate");s=65533}a[n++]=s>>12|224,a[n++]=s>>6&63|128}a[n++]=63&s|128}}e=a.subarray(0,n)}return e}var z={},O=null;function M(e,t){void 0===t&&(t=0),F(),t=z[t];for(var n=Array(Math.floor(e.length/3)),a=t[64]||"",i=0,s=0;i>2];r=t[(3&r)<<4|o>>4],o=t[(15&o)<<2|l>>6],l=t[63&l],n[s++]=u+r+o+l}switch(u=0,l=a,e.length-i){case 2:l=t[(15&(u=e[i+1]))<<2]||a;case 1:e=e[i],n[s]=t[e>>2]+t[(3&e)<<4|u>>4]+l+a}return n.join("")}function B(e){var t=e.length,n=3*t/4;n%3?n=Math.floor(n):-1!="=.".indexOf(e[t-1])&&(n=-1!="=.".indexOf(e[t-2])?n-2:n-1);var a=new Uint8Array(n),i=0;return function(e,t){function n(t){for(;a>4),64!=r&&(t(s<<4&240|r>>2),64!=o&&t(r<<6&192|o))}}(e,(function(e){a[i++]=e})),a.subarray(0,i)}function F(){if(!O){O={};for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),t=["+/=","+/","-_=","-_.","-_"],n=0;5>n;n++){var a=e.concat(t[n].split(""));z[n]=a;for(var i=0;ii&&128<=t;i++)n|=(127&(t=e.h[e.g++]))<<7*i;if(128<=t&&(n|=(127&(t=e.h[e.g++]))<<28,a|=(127&t)>>4),128<=t)for(i=0;5>i&&128<=t;i++)a|=(127&(t=e.h[e.g++]))<<7*i+3;if(128>t)return e=n>>>0,(a=2147483648&(t=a>>>0))&&(t=~t>>>0,0==(e=1+~e>>>0)&&(t=t+1>>>0)),e=4294967296*t+(e>>>0),a?-e:e;e.m=!0}U.prototype.reset=function(){this.g=this.l},U.prototype.i=function(){var e=this.h,t=e[this.g],n=127&t;return 128>t?(this.g+=1,n):(n|=(127&(t=e[this.g+1]))<<7,128>t?(this.g+=2,n):(n|=(127&(t=e[this.g+2]))<<14,128>t?(this.g+=3,n):(n|=(127&(t=e[this.g+3]))<<21,128>t?(this.g+=4,n):(n|=(15&(t=e[this.g+4]))<<28,128>t?(this.g+=5,n>>>0):(this.g+=5,128<=e[this.g++]&&128<=e[this.g++]&&128<=e[this.g++]&&128<=e[this.g++]&&this.g++,n)))))},U.prototype.o=function(){var e=this.h[this.g],t=this.h[this.g+1],n=this.h[this.g+2],a=this.h[this.g+3];return this.g+=4,e=2*((n=(e|t<<8|n<<16|a<<24)>>>0)>>31)+1,t=n>>>23&255,n&=8388607,255==t?n?NaN:1/0*e:0==t?e*Math.pow(2,-149)*n:e*Math.pow(2,t-150)*(n+Math.pow(2,23))};var q=[];function H(){this.g=new Uint8Array(64),this.h=0}function K(e,t){for(;127>>=7;e.push(t)}function $(e){var t={},n=void 0!==t.N&&t.N;this.o={v:void 0!==t.v&&t.v},this.N=n,t=this.o,q.length?(n=q.pop(),t&&(n.v=t.v),e&&W(n,e),e=n):e=new U(e,t),this.g=e,this.m=this.g.g,this.h=this.i=this.l=-1,this.j=!1}function Z(e){var t=e.g;if((t=t.g==t.j)||(t=e.j)||(t=(t=e.g).m||0>t.g||t.g>t.j),t)return!1;e.m=e.g.g;var n=7&(t=e.g.i());return 0!=n&&5!=n&&1!=n&&2!=n&&3!=n&&4!=n?(e.j=!0,!1):(e.i=t,e.l=t>>>3,e.h=n,!0)}function X(e){switch(e.h){case 0:if(0!=e.h)X(e);else{for(e=e.g;128&e.h[e.g];)e.g++;e.g++}break;case 1:1!=e.h?X(e):(e=e.g).g+=8;break;case 2:if(2!=e.h)X(e);else{var t=e.g.i();(e=e.g).g+=t}break;case 5:5!=e.h?X(e):(e=e.g).g+=4;break;case 3:for(t=e.l;;){if(!Z(e)){e.j=!0;break}if(4==e.h){e.l!=t&&(e.j=!0);break}X(e)}break;default:e.j=!0}}function Y(e,t,n){var a=e.g.j,i=e.g.i(),s=e.g.g+i;if(e.g.j=s,n(t,e),0!==(n=s-e.g.g))throw Error("Message parsing ended unexpectedly. Expected to read "+i+" bytes, instead read "+(i-n)+" bytes, either the data ended unexpectedly or the message misreported its own length");return e.g.g=s,e.g.j=a,t}function Q(e){return e.g.o()}function J(e){var t,n=e.g.i(),a=(e=e.g).g;if(e.g+=n,e=e.h,N)(t=T)||(t=T=new TextDecoder("utf-8",{fatal:!1})),t=t.decode(e.subarray(a,a+n));else{n=a+n;for(var i,s,r,o=[],l=null;a(i=e[a++])?o.push(i):224>i?a>=n?o.push(65533):(s=e[a++],194>i||128!=(192&s)?(a--,o.push(65533)):o.push((31&i)<<6|63&s)):240>i?a>=n-1?o.push(65533):128!=(192&(s=e[a++]))||224===i&&160>s||237===i&&160<=s||128!=(192&(t=e[a++]))?(a--,o.push(65533)):o.push((15&i)<<12|(63&s)<<6|63&t):244>=i?a>=n-2?o.push(65533):128!=(192&(s=e[a++]))||s-144+(i<<28)>>30||128!=(192&(t=e[a++]))||128!=(192&(r=e[a++]))?(a--,o.push(65533)):(i=(7&i)<<18|(63&s)<<12|(63&t)<<6|63&r,i-=65536,o.push(55296+(i>>10&1023),56320+(1023&i))):o.push(65533),8192<=o.length&&(l=_(l,o),o.length=0);t=_(l,o)}return t}function ee(e,t,n){var a=e.g.i();for(a=e.g.g+a;e.g.ga?1:0)?-a:a)?0<1/a?V=0:(0,V=2147483648):isNaN(a)?(0,V=2147483647):34028234663852886e22>>0):11754943508222875e-54>a?(a=Math.round(a/Math.pow(2,-149)),0,V=(n<<31|a)>>>0):(t=Math.floor(Math.log(a)/Math.LN2),a*=Math.pow(2,-t),16777216<=(a=Math.round(8388608*a))&&++t,0,V=(n<<31|t+127<<23|8388607&a)>>>0),n=V,e.push(n>>>0&255),e.push(n>>>8&255),e.push(n>>>16&255),e.push(n>>>24&255)}}H.prototype.push=function(e){if(!(this.h+1=e.l?e.i?e.i[t]:void 0:e.h[t+e.j]}function ye(e,t){var n=void 0!==n&&n,a=ge(e,t,n);return null==a&&(a=me),a===me&&we(e,t,a=de([]),n),a}function be(e){var t=ye(e,3);if(e.m||(e.m={}),!e.m[3]){for(var n=0;n=e.l?(fe(e),e.i[t]=n):e.h[t+e.j]=n}function Ae(e,t,n){if(-1===n)return null;if(e.g||(e.g={}),!e.g[n]){var a=ge(e,n,!1);a&&(e.g[n]=new t(a))}return e.g[n]}function xe(e,t){e.g||(e.g={});var n=e.g[1];if(!n){var a=ye(e,1);n=[];for(var i=0;i_;var T=(_=Math.abs(_))>>>0;for(_=Math.floor((_-T)/4294967296),_>>>=0,S&&(_=~_>>>0,4294967295<(T=1+(~T>>>0))&&(T=0,4294967295<++_&&(_=0))),S=V=T,T=_;0>>7|T<<25)>>>0,T>>>=7;E.push(S)}if(_e(x,C),A=ie(A),k.call(v,w,A),y.O)for(v=0;v_;_++)S.push(127&T|128),T>>=7;S.push(1)}se(E,2,ge(C,2)),null!=(S=ge(C,3))&&(S=D(S),K(E.g,26),K(E.g,S.length),ae(E,E.g.end()),ae(E,S)),null!=(S=ge(C,4))&&(S=D(S),K(E.g,34),K(E.g,S.length),ae(E,E.g.end()),ae(E,S)),_e(C,E),x=ie(x),w.call(k,A,x)}}m=m.data;break e;default:m={}}}switch(c=m,h=u.stream,u.type){case"video":i.pushTexture2d(Object.assign(Object.assign({},c),{stream:h,timestamp:a}));break;case"detections":(d=c).stream=h,d.timestamp=a,i.pushDetectionList(d);break;default:throw Error("Unknown input config type: '"+u.type+"'")}}return p.i.send(i),b(n,p.C,4);case 4:i.delete(),n.g=0}}))}))},e.onResults=function(e,t){this.listeners[t||"$"]=e},E("Solution",nt),E("OptionType",{BOOL:0,NUMBER:1,aa:2,0:"BOOL",1:"NUMBER",2:"STRING"});var lt={files:[{url:"face_mesh_solution_packed_assets_loader.js"},{simd:!0,url:"face_mesh_solution_simd_wasm_bin.js"},{simd:!1,url:"face_mesh_solution_wasm_bin.js"}],graph:{url:"face_mesh.binarypb"},listeners:[{wants:["multi_face_geometry","image_transformed","multi_face_landmarks"],outs:{image:"image_transformed",multiFaceGeometry:{type:"proto_list",stream:"multi_face_geometry",transform:function(e){return e.map(ot)}},multiFaceLandmarks:{type:"proto_list",stream:"multi_face_landmarks",transform:function(e){return e.map((function(e){return xe(je(e),Fe).map(Ze)}))}}}}],inputs:{image:{type:"video",stream:"input_frames_gpu"}},options:{useCpuInference:{type:0,graphOptionXref:{calculatorType:"InferenceCalculator",fieldName:"use_cpu_inference"},default:"iPad Simulator;iPhone Simulator;iPod Simulator;iPad;iPhone;iPod".split(";").includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document},enableFaceGeometry:{type:0,graphOptionXref:{calculatorName:"EnableFaceGeometryConstant",calculatorType:"ConstantSidePacketCalculator",fieldName:"bool_value"}},selfieMode:{type:0,graphOptionXref:{calculatorType:"GlScalerCalculator",calculatorIndex:1,fieldName:"flip_horizontal"}},maxNumFaces:{type:1,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorNumFaces",fieldName:"int_value"}},refineLandmarks:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorRefineLandmarks",fieldName:"bool_value"}},minDetectionConfidence:{type:1,graphOptionXref:{calculatorType:"TensorsToDetectionsCalculator",calculatorName:"facelandmarkfrontgpu__facedetectionshortrangegpu__facedetectionshortrangecommon__TensorsToDetectionsCalculator",fieldName:"min_score_thresh"}},minTrackingConfidence:{type:1,graphOptionXref:{calculatorType:"ThresholdingCalculator",calculatorName:"facelandmarkfrontgpu__facelandmarkgpu__ThresholdingCalculator",fieldName:"threshold"}},cameraNear:{type:1,graphOptionXref:{calculatorType:"FaceGeometryEnvGeneratorCalculator",fieldName:"near"}},cameraFar:{type:1,graphOptionXref:{calculatorType:"FaceGeometryEnvGeneratorCalculator",fieldName:"far"}},cameraVerticalFovDegrees:{type:1,graphOptionXref:{calculatorType:"FaceGeometryEnvGeneratorCalculator",fieldName:"vertical_fov_degrees"}}}},ut=[[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]],ct=[[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]],ht=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],dt=[[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]],pt=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],mt=[[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]],ft=[].concat(l(ut),l(ct),l(ht),l(dt),l(pt),l(mt));function gt(e){e=e||{},e=Object.assign(Object.assign({},lt),e),this.g=new nt(e)}(e=gt.prototype).close=function(){return this.g.close(),Promise.resolve()},e.onResults=function(e){this.g.onResults(e)},e.initialize=function(){return De(this,(function e(){var t=this;return x(e,(function(e){return b(e,t.g.initialize(),0)}))}))},e.reset=function(){this.g.reset()},e.send=function(e){return De(this,(function t(){var n=this;return x(t,(function(t){return b(t,n.g.send(e),0)}))}))},e.setOptions=function(e){this.g.setOptions(e)},E("FACE_GEOMETRY",{Layout:{COLUMN_MAJOR:0,ROW_MAJOR:1,0:"COLUMN_MAJOR",1:"ROW_MAJOR"},PrimitiveType:{TRIANGLE:0,0:"TRIANGLE"},VertexType:{VERTEX_PT:0,0:"VERTEX_PT"},DEFAULT_CAMERA_PARAMS:{verticalFovDegrees:63,near:1,far:1e4}}),E("FaceMesh",gt),E("FACEMESH_LIPS",ut),E("FACEMESH_LEFT_EYE",ct),E("FACEMESH_LEFT_EYEBROW",ht),E("FACEMESH_LEFT_IRIS",[[474,475],[475,476],[476,477],[477,474]]),E("FACEMESH_RIGHT_EYE",dt),E("FACEMESH_RIGHT_EYEBROW",pt),E("FACEMESH_RIGHT_IRIS",[[469,470],[470,471],[471,472],[472,469]]),E("FACEMESH_FACE_OVAL",mt),E("FACEMESH_CONTOURS",ft),E("FACEMESH_TESSELATION",[[127,34],[34,139],[139,127],[11,0],[0,37],[37,11],[232,231],[231,120],[120,232],[72,37],[37,39],[39,72],[128,121],[121,47],[47,128],[232,121],[121,128],[128,232],[104,69],[69,67],[67,104],[175,171],[171,148],[148,175],[118,50],[50,101],[101,118],[73,39],[39,40],[40,73],[9,151],[151,108],[108,9],[48,115],[115,131],[131,48],[194,204],[204,211],[211,194],[74,40],[40,185],[185,74],[80,42],[42,183],[183,80],[40,92],[92,186],[186,40],[230,229],[229,118],[118,230],[202,212],[212,214],[214,202],[83,18],[18,17],[17,83],[76,61],[61,146],[146,76],[160,29],[29,30],[30,160],[56,157],[157,173],[173,56],[106,204],[204,194],[194,106],[135,214],[214,192],[192,135],[203,165],[165,98],[98,203],[21,71],[71,68],[68,21],[51,45],[45,4],[4,51],[144,24],[24,23],[23,144],[77,146],[146,91],[91,77],[205,50],[50,187],[187,205],[201,200],[200,18],[18,201],[91,106],[106,182],[182,91],[90,91],[91,181],[181,90],[85,84],[84,17],[17,85],[206,203],[203,36],[36,206],[148,171],[171,140],[140,148],[92,40],[40,39],[39,92],[193,189],[189,244],[244,193],[159,158],[158,28],[28,159],[247,246],[246,161],[161,247],[236,3],[3,196],[196,236],[54,68],[68,104],[104,54],[193,168],[168,8],[8,193],[117,228],[228,31],[31,117],[189,193],[193,55],[55,189],[98,97],[97,99],[99,98],[126,47],[47,100],[100,126],[166,79],[79,218],[218,166],[155,154],[154,26],[26,155],[209,49],[49,131],[131,209],[135,136],[136,150],[150,135],[47,126],[126,217],[217,47],[223,52],[52,53],[53,223],[45,51],[51,134],[134,45],[211,170],[170,140],[140,211],[67,69],[69,108],[108,67],[43,106],[106,91],[91,43],[230,119],[119,120],[120,230],[226,130],[130,247],[247,226],[63,53],[53,52],[52,63],[238,20],[20,242],[242,238],[46,70],[70,156],[156,46],[78,62],[62,96],[96,78],[46,53],[53,63],[63,46],[143,34],[34,227],[227,143],[123,117],[117,111],[111,123],[44,125],[125,19],[19,44],[236,134],[134,51],[51,236],[216,206],[206,205],[205,216],[154,153],[153,22],[22,154],[39,37],[37,167],[167,39],[200,201],[201,208],[208,200],[36,142],[142,100],[100,36],[57,212],[212,202],[202,57],[20,60],[60,99],[99,20],[28,158],[158,157],[157,28],[35,226],[226,113],[113,35],[160,159],[159,27],[27,160],[204,202],[202,210],[210,204],[113,225],[225,46],[46,113],[43,202],[202,204],[204,43],[62,76],[76,77],[77,62],[137,123],[123,116],[116,137],[41,38],[38,72],[72,41],[203,129],[129,142],[142,203],[64,98],[98,240],[240,64],[49,102],[102,64],[64,49],[41,73],[73,74],[74,41],[212,216],[216,207],[207,212],[42,74],[74,184],[184,42],[169,170],[170,211],[211,169],[170,149],[149,176],[176,170],[105,66],[66,69],[69,105],[122,6],[6,168],[168,122],[123,147],[147,187],[187,123],[96,77],[77,90],[90,96],[65,55],[55,107],[107,65],[89,90],[90,180],[180,89],[101,100],[100,120],[120,101],[63,105],[105,104],[104,63],[93,137],[137,227],[227,93],[15,86],[86,85],[85,15],[129,102],[102,49],[49,129],[14,87],[87,86],[86,14],[55,8],[8,9],[9,55],[100,47],[47,121],[121,100],[145,23],[23,22],[22,145],[88,89],[89,179],[179,88],[6,122],[122,196],[196,6],[88,95],[95,96],[96,88],[138,172],[172,136],[136,138],[215,58],[58,172],[172,215],[115,48],[48,219],[219,115],[42,80],[80,81],[81,42],[195,3],[3,51],[51,195],[43,146],[146,61],[61,43],[171,175],[175,199],[199,171],[81,82],[82,38],[38,81],[53,46],[46,225],[225,53],[144,163],[163,110],[110,144],[52,65],[65,66],[66,52],[229,228],[228,117],[117,229],[34,127],[127,234],[234,34],[107,108],[108,69],[69,107],[109,108],[108,151],[151,109],[48,64],[64,235],[235,48],[62,78],[78,191],[191,62],[129,209],[209,126],[126,129],[111,35],[35,143],[143,111],[117,123],[123,50],[50,117],[222,65],[65,52],[52,222],[19,125],[125,141],[141,19],[221,55],[55,65],[65,221],[3,195],[195,197],[197,3],[25,7],[7,33],[33,25],[220,237],[237,44],[44,220],[70,71],[71,139],[139,70],[122,193],[193,245],[245,122],[247,130],[130,33],[33,247],[71,21],[21,162],[162,71],[170,169],[169,150],[150,170],[188,174],[174,196],[196,188],[216,186],[186,92],[92,216],[2,97],[97,167],[167,2],[141,125],[125,241],[241,141],[164,167],[167,37],[37,164],[72,38],[38,12],[12,72],[38,82],[82,13],[13,38],[63,68],[68,71],[71,63],[226,35],[35,111],[111,226],[101,50],[50,205],[205,101],[206,92],[92,165],[165,206],[209,198],[198,217],[217,209],[165,167],[167,97],[97,165],[220,115],[115,218],[218,220],[133,112],[112,243],[243,133],[239,238],[238,241],[241,239],[214,135],[135,169],[169,214],[190,173],[173,133],[133,190],[171,208],[208,32],[32,171],[125,44],[44,237],[237,125],[86,87],[87,178],[178,86],[85,86],[86,179],[179,85],[84,85],[85,180],[180,84],[83,84],[84,181],[181,83],[201,83],[83,182],[182,201],[137,93],[93,132],[132,137],[76,62],[62,183],[183,76],[61,76],[76,184],[184,61],[57,61],[61,185],[185,57],[212,57],[57,186],[186,212],[214,207],[207,187],[187,214],[34,143],[143,156],[156,34],[79,239],[239,237],[237,79],[123,137],[137,177],[177,123],[44,1],[1,4],[4,44],[201,194],[194,32],[32,201],[64,102],[102,129],[129,64],[213,215],[215,138],[138,213],[59,166],[166,219],[219,59],[242,99],[99,97],[97,242],[2,94],[94,141],[141,2],[75,59],[59,235],[235,75],[24,110],[110,228],[228,24],[25,130],[130,226],[226,25],[23,24],[24,229],[229,23],[22,23],[23,230],[230,22],[26,22],[22,231],[231,26],[112,26],[26,232],[232,112],[189,190],[190,243],[243,189],[221,56],[56,190],[190,221],[28,56],[56,221],[221,28],[27,28],[28,222],[222,27],[29,27],[27,223],[223,29],[30,29],[29,224],[224,30],[247,30],[30,225],[225,247],[238,79],[79,20],[20,238],[166,59],[59,75],[75,166],[60,75],[75,240],[240,60],[147,177],[177,215],[215,147],[20,79],[79,166],[166,20],[187,147],[147,213],[213,187],[112,233],[233,244],[244,112],[233,128],[128,245],[245,233],[128,114],[114,188],[188,128],[114,217],[217,174],[174,114],[131,115],[115,220],[220,131],[217,198],[198,236],[236,217],[198,131],[131,134],[134,198],[177,132],[132,58],[58,177],[143,35],[35,124],[124,143],[110,163],[163,7],[7,110],[228,110],[110,25],[25,228],[356,389],[389,368],[368,356],[11,302],[302,267],[267,11],[452,350],[350,349],[349,452],[302,303],[303,269],[269,302],[357,343],[343,277],[277,357],[452,453],[453,357],[357,452],[333,332],[332,297],[297,333],[175,152],[152,377],[377,175],[347,348],[348,330],[330,347],[303,304],[304,270],[270,303],[9,336],[336,337],[337,9],[278,279],[279,360],[360,278],[418,262],[262,431],[431,418],[304,408],[408,409],[409,304],[310,415],[415,407],[407,310],[270,409],[409,410],[410,270],[450,348],[348,347],[347,450],[422,430],[430,434],[434,422],[313,314],[314,17],[17,313],[306,307],[307,375],[375,306],[387,388],[388,260],[260,387],[286,414],[414,398],[398,286],[335,406],[406,418],[418,335],[364,367],[367,416],[416,364],[423,358],[358,327],[327,423],[251,284],[284,298],[298,251],[281,5],[5,4],[4,281],[373,374],[374,253],[253,373],[307,320],[320,321],[321,307],[425,427],[427,411],[411,425],[421,313],[313,18],[18,421],[321,405],[405,406],[406,321],[320,404],[404,405],[405,320],[315,16],[16,17],[17,315],[426,425],[425,266],[266,426],[377,400],[400,369],[369,377],[322,391],[391,269],[269,322],[417,465],[465,464],[464,417],[386,257],[257,258],[258,386],[466,260],[260,388],[388,466],[456,399],[399,419],[419,456],[284,332],[332,333],[333,284],[417,285],[285,8],[8,417],[346,340],[340,261],[261,346],[413,441],[441,285],[285,413],[327,460],[460,328],[328,327],[355,371],[371,329],[329,355],[392,439],[439,438],[438,392],[382,341],[341,256],[256,382],[429,420],[420,360],[360,429],[364,394],[394,379],[379,364],[277,343],[343,437],[437,277],[443,444],[444,283],[283,443],[275,440],[440,363],[363,275],[431,262],[262,369],[369,431],[297,338],[338,337],[337,297],[273,375],[375,321],[321,273],[450,451],[451,349],[349,450],[446,342],[342,467],[467,446],[293,334],[334,282],[282,293],[458,461],[461,462],[462,458],[276,353],[353,383],[383,276],[308,324],[324,325],[325,308],[276,300],[300,293],[293,276],[372,345],[345,447],[447,372],[352,345],[345,340],[340,352],[274,1],[1,19],[19,274],[456,248],[248,281],[281,456],[436,427],[427,425],[425,436],[381,256],[256,252],[252,381],[269,391],[391,393],[393,269],[200,199],[199,428],[428,200],[266,330],[330,329],[329,266],[287,273],[273,422],[422,287],[250,462],[462,328],[328,250],[258,286],[286,384],[384,258],[265,353],[353,342],[342,265],[387,259],[259,257],[257,387],[424,431],[431,430],[430,424],[342,353],[353,276],[276,342],[273,335],[335,424],[424,273],[292,325],[325,307],[307,292],[366,447],[447,345],[345,366],[271,303],[303,302],[302,271],[423,266],[266,371],[371,423],[294,455],[455,460],[460,294],[279,278],[278,294],[294,279],[271,272],[272,304],[304,271],[432,434],[434,427],[427,432],[272,407],[407,408],[408,272],[394,430],[430,431],[431,394],[395,369],[369,400],[400,395],[334,333],[333,299],[299,334],[351,417],[417,168],[168,351],[352,280],[280,411],[411,352],[325,319],[319,320],[320,325],[295,296],[296,336],[336,295],[319,403],[403,404],[404,319],[330,348],[348,349],[349,330],[293,298],[298,333],[333,293],[323,454],[454,447],[447,323],[15,16],[16,315],[315,15],[358,429],[429,279],[279,358],[14,15],[15,316],[316,14],[285,336],[336,9],[9,285],[329,349],[349,350],[350,329],[374,380],[380,252],[252,374],[318,402],[402,403],[403,318],[6,197],[197,419],[419,6],[318,319],[319,325],[325,318],[367,364],[364,365],[365,367],[435,367],[367,397],[397,435],[344,438],[438,439],[439,344],[272,271],[271,311],[311,272],[195,5],[5,281],[281,195],[273,287],[287,291],[291,273],[396,428],[428,199],[199,396],[311,271],[271,268],[268,311],[283,444],[444,445],[445,283],[373,254],[254,339],[339,373],[282,334],[334,296],[296,282],[449,347],[347,346],[346,449],[264,447],[447,454],[454,264],[336,296],[296,299],[299,336],[338,10],[10,151],[151,338],[278,439],[439,455],[455,278],[292,407],[407,415],[415,292],[358,371],[371,355],[355,358],[340,345],[345,372],[372,340],[346,347],[347,280],[280,346],[442,443],[443,282],[282,442],[19,94],[94,370],[370,19],[441,442],[442,295],[295,441],[248,419],[419,197],[197,248],[263,255],[255,359],[359,263],[440,275],[275,274],[274,440],[300,383],[383,368],[368,300],[351,412],[412,465],[465,351],[263,467],[467,466],[466,263],[301,368],[368,389],[389,301],[395,378],[378,379],[379,395],[412,351],[351,419],[419,412],[436,426],[426,322],[322,436],[2,164],[164,393],[393,2],[370,462],[462,461],[461,370],[164,0],[0,267],[267,164],[302,11],[11,12],[12,302],[268,12],[12,13],[13,268],[293,300],[300,301],[301,293],[446,261],[261,340],[340,446],[330,266],[266,425],[425,330],[426,423],[423,391],[391,426],[429,355],[355,437],[437,429],[391,327],[327,326],[326,391],[440,457],[457,438],[438,440],[341,382],[382,362],[362,341],[459,457],[457,461],[461,459],[434,430],[430,394],[394,434],[414,463],[463,362],[362,414],[396,369],[369,262],[262,396],[354,461],[461,457],[457,354],[316,403],[403,402],[402,316],[315,404],[404,403],[403,315],[314,405],[405,404],[404,314],[313,406],[406,405],[405,313],[421,418],[418,406],[406,421],[366,401],[401,361],[361,366],[306,408],[408,407],[407,306],[291,409],[409,408],[408,291],[287,410],[410,409],[409,287],[432,436],[436,410],[410,432],[434,416],[416,411],[411,434],[264,368],[368,383],[383,264],[309,438],[438,457],[457,309],[352,376],[376,401],[401,352],[274,275],[275,4],[4,274],[421,428],[428,262],[262,421],[294,327],[327,358],[358,294],[433,416],[416,367],[367,433],[289,455],[455,439],[439,289],[462,370],[370,326],[326,462],[2,326],[326,370],[370,2],[305,460],[460,455],[455,305],[254,449],[449,448],[448,254],[255,261],[261,446],[446,255],[253,450],[450,449],[449,253],[252,451],[451,450],[450,252],[256,452],[452,451],[451,256],[341,453],[453,452],[452,341],[413,464],[464,463],[463,413],[441,413],[413,414],[414,441],[258,442],[442,441],[441,258],[257,443],[443,442],[442,257],[259,444],[444,443],[443,259],[260,445],[445,444],[444,260],[467,342],[342,445],[445,467],[459,458],[458,250],[250,459],[289,392],[392,290],[290,289],[290,328],[328,460],[460,290],[376,433],[433,435],[435,376],[250,290],[290,392],[392,250],[411,416],[416,433],[433,411],[341,463],[463,464],[464,341],[453,464],[464,465],[465,453],[357,465],[465,412],[412,357],[343,412],[412,399],[399,343],[360,363],[363,440],[440,360],[437,399],[399,456],[456,437],[420,456],[456,363],[363,420],[401,435],[435,288],[288,401],[372,383],[383,353],[353,372],[339,255],[255,249],[249,339],[448,261],[261,255],[255,448],[133,243],[243,190],[190,133],[133,155],[155,112],[112,133],[33,246],[246,247],[247,33],[33,130],[130,25],[25,33],[398,384],[384,286],[286,398],[362,398],[398,414],[414,362],[362,463],[463,341],[341,362],[263,359],[359,467],[467,263],[263,249],[249,255],[255,263],[466,467],[467,260],[260,466],[75,60],[60,166],[166,75],[238,239],[239,79],[79,238],[162,127],[127,139],[139,162],[72,11],[11,37],[37,72],[121,232],[232,120],[120,121],[73,72],[72,39],[39,73],[114,128],[128,47],[47,114],[233,232],[232,128],[128,233],[103,104],[104,67],[67,103],[152,175],[175,148],[148,152],[119,118],[118,101],[101,119],[74,73],[73,40],[40,74],[107,9],[9,108],[108,107],[49,48],[48,131],[131,49],[32,194],[194,211],[211,32],[184,74],[74,185],[185,184],[191,80],[80,183],[183,191],[185,40],[40,186],[186,185],[119,230],[230,118],[118,119],[210,202],[202,214],[214,210],[84,83],[83,17],[17,84],[77,76],[76,146],[146,77],[161,160],[160,30],[30,161],[190,56],[56,173],[173,190],[182,106],[106,194],[194,182],[138,135],[135,192],[192,138],[129,203],[203,98],[98,129],[54,21],[21,68],[68,54],[5,51],[51,4],[4,5],[145,144],[144,23],[23,145],[90,77],[77,91],[91,90],[207,205],[205,187],[187,207],[83,201],[201,18],[18,83],[181,91],[91,182],[182,181],[180,90],[90,181],[181,180],[16,85],[85,17],[17,16],[205,206],[206,36],[36,205],[176,148],[148,140],[140,176],[165,92],[92,39],[39,165],[245,193],[193,244],[244,245],[27,159],[159,28],[28,27],[30,247],[247,161],[161,30],[174,236],[236,196],[196,174],[103,54],[54,104],[104,103],[55,193],[193,8],[8,55],[111,117],[117,31],[31,111],[221,189],[189,55],[55,221],[240,98],[98,99],[99,240],[142,126],[126,100],[100,142],[219,166],[166,218],[218,219],[112,155],[155,26],[26,112],[198,209],[209,131],[131,198],[169,135],[135,150],[150,169],[114,47],[47,217],[217,114],[224,223],[223,53],[53,224],[220,45],[45,134],[134,220],[32,211],[211,140],[140,32],[109,67],[67,108],[108,109],[146,43],[43,91],[91,146],[231,230],[230,120],[120,231],[113,226],[226,247],[247,113],[105,63],[63,52],[52,105],[241,238],[238,242],[242,241],[124,46],[46,156],[156,124],[95,78],[78,96],[96,95],[70,46],[46,63],[63,70],[116,143],[143,227],[227,116],[116,123],[123,111],[111,116],[1,44],[44,19],[19,1],[3,236],[236,51],[51,3],[207,216],[216,205],[205,207],[26,154],[154,22],[22,26],[165,39],[39,167],[167,165],[199,200],[200,208],[208,199],[101,36],[36,100],[100,101],[43,57],[57,202],[202,43],[242,20],[20,99],[99,242],[56,28],[28,157],[157,56],[124,35],[35,113],[113,124],[29,160],[160,27],[27,29],[211,204],[204,210],[210,211],[124,113],[113,46],[46,124],[106,43],[43,204],[204,106],[96,62],[62,77],[77,96],[227,137],[137,116],[116,227],[73,41],[41,72],[72,73],[36,203],[203,142],[142,36],[235,64],[64,240],[240,235],[48,49],[49,64],[64,48],[42,41],[41,74],[74,42],[214,212],[212,207],[207,214],[183,42],[42,184],[184,183],[210,169],[169,211],[211,210],[140,170],[170,176],[176,140],[104,105],[105,69],[69,104],[193,122],[122,168],[168,193],[50,123],[123,187],[187,50],[89,96],[96,90],[90,89],[66,65],[65,107],[107,66],[179,89],[89,180],[180,179],[119,101],[101,120],[120,119],[68,63],[63,104],[104,68],[234,93],[93,227],[227,234],[16,15],[15,85],[85,16],[209,129],[129,49],[49,209],[15,14],[14,86],[86,15],[107,55],[55,9],[9,107],[120,100],[100,121],[121,120],[153,145],[145,22],[22,153],[178,88],[88,179],[179,178],[197,6],[6,196],[196,197],[89,88],[88,96],[96,89],[135,138],[138,136],[136,135],[138,215],[215,172],[172,138],[218,115],[115,219],[219,218],[41,42],[42,81],[81,41],[5,195],[195,51],[51,5],[57,43],[43,61],[61,57],[208,171],[171,199],[199,208],[41,81],[81,38],[38,41],[224,53],[53,225],[225,224],[24,144],[144,110],[110,24],[105,52],[52,66],[66,105],[118,229],[229,117],[117,118],[227,34],[34,234],[234,227],[66,107],[107,69],[69,66],[10,109],[109,151],[151,10],[219,48],[48,235],[235,219],[183,62],[62,191],[191,183],[142,129],[129,126],[126,142],[116,111],[111,143],[143,116],[118,117],[117,50],[50,118],[223,222],[222,52],[52,223],[94,19],[19,141],[141,94],[222,221],[221,65],[65,222],[196,3],[3,197],[197,196],[45,220],[220,44],[44,45],[156,70],[70,139],[139,156],[188,122],[122,245],[245,188],[139,71],[71,162],[162,139],[149,170],[170,150],[150,149],[122,188],[188,196],[196,122],[206,216],[216,92],[92,206],[164,2],[2,167],[167,164],[242,141],[141,241],[241,242],[0,164],[164,37],[37,0],[11,72],[72,12],[12,11],[12,38],[38,13],[13,12],[70,63],[63,71],[71,70],[31,226],[226,111],[111,31],[36,101],[101,205],[205,36],[203,206],[206,165],[165,203],[126,209],[209,217],[217,126],[98,165],[165,97],[97,98],[237,220],[220,218],[218,237],[237,239],[239,241],[241,237],[210,214],[214,169],[169,210],[140,171],[171,32],[32,140],[241,125],[125,237],[237,241],[179,86],[86,178],[178,179],[180,85],[85,179],[179,180],[181,84],[84,180],[180,181],[182,83],[83,181],[181,182],[194,201],[201,182],[182,194],[177,137],[137,132],[132,177],[184,76],[76,183],[183,184],[185,61],[61,184],[184,185],[186,57],[57,185],[185,186],[216,212],[212,186],[186,216],[192,214],[214,187],[187,192],[139,34],[34,156],[156,139],[218,79],[79,237],[237,218],[147,123],[123,177],[177,147],[45,44],[44,4],[4,45],[208,201],[201,32],[32,208],[98,64],[64,129],[129,98],[192,213],[213,138],[138,192],[235,59],[59,219],[219,235],[141,242],[242,97],[97,141],[97,2],[2,141],[141,97],[240,75],[75,235],[235,240],[229,24],[24,228],[228,229],[31,25],[25,226],[226,31],[230,23],[23,229],[229,230],[231,22],[22,230],[230,231],[232,26],[26,231],[231,232],[233,112],[112,232],[232,233],[244,189],[189,243],[243,244],[189,221],[221,190],[190,189],[222,28],[28,221],[221,222],[223,27],[27,222],[222,223],[224,29],[29,223],[223,224],[225,30],[30,224],[224,225],[113,247],[247,225],[225,113],[99,60],[60,240],[240,99],[213,147],[147,215],[215,213],[60,20],[20,166],[166,60],[192,187],[187,213],[213,192],[243,112],[112,244],[244,243],[244,233],[233,245],[245,244],[245,128],[128,188],[188,245],[188,114],[114,174],[174,188],[134,131],[131,220],[220,134],[174,217],[217,236],[236,174],[236,198],[198,134],[134,236],[215,177],[177,58],[58,215],[156,143],[143,124],[124,156],[25,110],[110,7],[7,25],[31,228],[228,25],[25,31],[264,356],[356,368],[368,264],[0,11],[11,267],[267,0],[451,452],[452,349],[349,451],[267,302],[302,269],[269,267],[350,357],[357,277],[277,350],[350,452],[452,357],[357,350],[299,333],[333,297],[297,299],[396,175],[175,377],[377,396],[280,347],[347,330],[330,280],[269,303],[303,270],[270,269],[151,9],[9,337],[337,151],[344,278],[278,360],[360,344],[424,418],[418,431],[431,424],[270,304],[304,409],[409,270],[272,310],[310,407],[407,272],[322,270],[270,410],[410,322],[449,450],[450,347],[347,449],[432,422],[422,434],[434,432],[18,313],[313,17],[17,18],[291,306],[306,375],[375,291],[259,387],[387,260],[260,259],[424,335],[335,418],[418,424],[434,364],[364,416],[416,434],[391,423],[423,327],[327,391],[301,251],[251,298],[298,301],[275,281],[281,4],[4,275],[254,373],[373,253],[253,254],[375,307],[307,321],[321,375],[280,425],[425,411],[411,280],[200,421],[421,18],[18,200],[335,321],[321,406],[406,335],[321,320],[320,405],[405,321],[314,315],[315,17],[17,314],[423,426],[426,266],[266,423],[396,377],[377,369],[369,396],[270,322],[322,269],[269,270],[413,417],[417,464],[464,413],[385,386],[386,258],[258,385],[248,456],[456,419],[419,248],[298,284],[284,333],[333,298],[168,417],[417,8],[8,168],[448,346],[346,261],[261,448],[417,413],[413,285],[285,417],[326,327],[327,328],[328,326],[277,355],[355,329],[329,277],[309,392],[392,438],[438,309],[381,382],[382,256],[256,381],[279,429],[429,360],[360,279],[365,364],[364,379],[379,365],[355,277],[277,437],[437,355],[282,443],[443,283],[283,282],[281,275],[275,363],[363,281],[395,431],[431,369],[369,395],[299,297],[297,337],[337,299],[335,273],[273,321],[321,335],[348,450],[450,349],[349,348],[359,446],[446,467],[467,359],[283,293],[293,282],[282,283],[250,458],[458,462],[462,250],[300,276],[276,383],[383,300],[292,308],[308,325],[325,292],[283,276],[276,293],[293,283],[264,372],[372,447],[447,264],[346,352],[352,340],[340,346],[354,274],[274,19],[19,354],[363,456],[456,281],[281,363],[426,436],[436,425],[425,426],[380,381],[381,252],[252,380],[267,269],[269,393],[393,267],[421,200],[200,428],[428,421],[371,266],[266,329],[329,371],[432,287],[287,422],[422,432],[290,250],[250,328],[328,290],[385,258],[258,384],[384,385],[446,265],[265,342],[342,446],[386,387],[387,257],[257,386],[422,424],[424,430],[430,422],[445,342],[342,276],[276,445],[422,273],[273,424],[424,422],[306,292],[292,307],[307,306],[352,366],[366,345],[345,352],[268,271],[271,302],[302,268],[358,423],[423,371],[371,358],[327,294],[294,460],[460,327],[331,279],[279,294],[294,331],[303,271],[271,304],[304,303],[436,432],[432,427],[427,436],[304,272],[272,408],[408,304],[395,394],[394,431],[431,395],[378,395],[395,400],[400,378],[296,334],[334,299],[299,296],[6,351],[351,168],[168,6],[376,352],[352,411],[411,376],[307,325],[325,320],[320,307],[285,295],[295,336],[336,285],[320,319],[319,404],[404,320],[329,330],[330,349],[349,329],[334,293],[293,333],[333,334],[366,323],[323,447],[447,366],[316,15],[15,315],[315,316],[331,358],[358,279],[279,331],[317,14],[14,316],[316,317],[8,285],[285,9],[9,8],[277,329],[329,350],[350,277],[253,374],[374,252],[252,253],[319,318],[318,403],[403,319],[351,6],[6,419],[419,351],[324,318],[318,325],[325,324],[397,367],[367,365],[365,397],[288,435],[435,397],[397,288],[278,344],[344,439],[439,278],[310,272],[272,311],[311,310],[248,195],[195,281],[281,248],[375,273],[273,291],[291,375],[175,396],[396,199],[199,175],[312,311],[311,268],[268,312],[276,283],[283,445],[445,276],[390,373],[373,339],[339,390],[295,282],[282,296],[296,295],[448,449],[449,346],[346,448],[356,264],[264,454],[454,356],[337,336],[336,299],[299,337],[337,338],[338,151],[151,337],[294,278],[278,455],[455,294],[308,292],[292,415],[415,308],[429,358],[358,355],[355,429],[265,340],[340,372],[372,265],[352,346],[346,280],[280,352],[295,442],[442,282],[282,295],[354,19],[19,370],[370,354],[285,441],[441,295],[295,285],[195,248],[248,197],[197,195],[457,440],[440,274],[274,457],[301,300],[300,368],[368,301],[417,351],[351,465],[465,417],[251,301],[301,389],[389,251],[394,395],[395,379],[379,394],[399,412],[412,419],[419,399],[410,436],[436,322],[322,410],[326,2],[2,393],[393,326],[354,370],[370,461],[461,354],[393,164],[164,267],[267,393],[268,302],[302,12],[12,268],[312,268],[268,13],[13,312],[298,293],[293,301],[301,298],[265,446],[446,340],[340,265],[280,330],[330,425],[425,280],[322,426],[426,391],[391,322],[420,429],[429,437],[437,420],[393,391],[391,326],[326,393],[344,440],[440,438],[438,344],[458,459],[459,461],[461,458],[364,434],[434,394],[394,364],[428,396],[396,262],[262,428],[274,354],[354,457],[457,274],[317,316],[316,402],[402,317],[316,315],[315,403],[403,316],[315,314],[314,404],[404,315],[314,313],[313,405],[405,314],[313,421],[421,406],[406,313],[323,366],[366,361],[361,323],[292,306],[306,407],[407,292],[306,291],[291,408],[408,306],[291,287],[287,409],[409,291],[287,432],[432,410],[410,287],[427,434],[434,411],[411,427],[372,264],[264,383],[383,372],[459,309],[309,457],[457,459],[366,352],[352,401],[401,366],[1,274],[274,4],[4,1],[418,421],[421,262],[262,418],[331,294],[294,358],[358,331],[435,433],[433,367],[367,435],[392,289],[289,439],[439,392],[328,462],[462,326],[326,328],[94,2],[2,370],[370,94],[289,305],[305,455],[455,289],[339,254],[254,448],[448,339],[359,255],[255,446],[446,359],[254,253],[253,449],[449,254],[253,252],[252,450],[450,253],[252,256],[256,451],[451,252],[256,341],[341,452],[452,256],[414,413],[413,463],[463,414],[286,441],[441,414],[414,286],[286,258],[258,441],[441,286],[258,257],[257,442],[442,258],[257,259],[259,443],[443,257],[259,260],[260,444],[444,259],[260,467],[467,445],[445,260],[309,459],[459,250],[250,309],[305,289],[289,290],[290,305],[305,290],[290,460],[460,305],[401,376],[376,435],[435,401],[309,250],[250,392],[392,309],[376,411],[411,433],[433,376],[453,341],[341,464],[464,453],[357,453],[453,465],[465,357],[343,357],[357,412],[412,343],[437,343],[343,399],[399,437],[344,360],[360,440],[440,344],[420,437],[437,456],[456,420],[360,420],[420,363],[363,360],[361,401],[401,288],[288,361],[265,372],[372,353],[353,265],[390,339],[339,249],[249,390],[339,448],[448,255],[255,339]]),E("matrixDataToMatrix",(function(e){for(var t=e.getCols(),n=e.getRows(),a=e.getPackedDataList(),i=[],s=0;s{e.exports=function e(t,n,a){function i(r,o){if(!n[r]){if(!t[r]){if(s)return s(r,!0);var l=new Error("Cannot find module '"+r+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[r]={exports:{}};t[r][0].call(u.exports,(function(e){var n=t[r][1][e];return i(n||e)}),u,u.exports,e,t,n,a)}return n[r].exports}for(var s=void 0,r=0;r=43)}})).catch((function(){return!1}))}function A(e){return"boolean"==typeof f?u.resolve(f):w(e).then((function(e){return f=e}))}function x(e){var t=g[e.name],n={};n.promise=new u((function(e,t){n.resolve=e,n.reject=t})),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then((function(){return n.promise})):t.dbReady=n.promise}function C(e){var t=g[e.name].deferredOperations.pop();if(t)return t.resolve(),t.promise}function S(e,t){var n=g[e.name].deferredOperations.pop();if(n)return n.reject(t),n.promise}function E(e,t){return new u((function(n,a){if(g[e.name]=g[e.name]||B(),e.db){if(!t)return n(e.db);x(e),e.db.close()}var i=[e.name];t&&i.push(e.version);var s=r.open.apply(r,i);t&&(s.onupgradeneeded=function(t){var n=s.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(m)}catch(e){if("ConstraintError"!==e.name)throw e}}),s.onerror=function(e){e.preventDefault(),a(s.error)},s.onsuccess=function(){var t=s.result;t.onversionchange=function(e){e.target.close()},n(t),C(e)}}))}function _(e){return E(e,!1)}function T(e){return E(e,!0)}function I(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),a=e.versione.db.version;if(a&&(e.version,e.version=e.db.version),i||n){if(n){var s=e.db.version+1;s>e.version&&(e.version=s)}return!0}return!1}function N(e){return new u((function(t,n){var a=new FileReader;a.onerror=n,a.onloadend=function(n){var a=btoa(n.target.result||"");t({__local_forage_encoded_blob:!0,data:a,type:e.type})},a.readAsBinaryString(e)}))}function R(e){return l([k(atob(e.data))],{type:e.type})}function D(e){return e&&e.__local_forage_encoded_blob}function z(e){var t=this,n=t._initReady().then((function(){var e=g[t._dbInfo.name];if(e&&e.dbReady)return e.dbReady}));return h(n,e,e),n}function O(e){x(e);for(var t=g[e.name],n=t.forages,a=0;a0&&(!e.db||"InvalidStateError"===i.name||"NotFoundError"===i.name))return u.resolve().then((function(){if(!e.db||"NotFoundError"===i.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),T(e)})).then((function(){return O(e).then((function(){M(e,t,n,a-1)}))})).catch(n);n(i)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function F(e){var t=this,n={db:null};if(e)for(var a in e)n[a]=e[a];var i=g[n.name];i||(i=B(),g[n.name]=i),i.forages.push(t),t._initReady||(t._initReady=t.ready,t.ready=z);var s=[];function r(){return u.resolve()}for(var o=0;o>4,c[l++]=(15&a)<<4|i>>2,c[l++]=(3&i)<<6|63&s;return u}function me(e){var t,n=new Uint8Array(e),a="";for(t=0;t>2],a+=Z[(3&n[t])<<4|n[t+1]>>4],a+=Z[(15&n[t+1])<<2|n[t+2]>>6],a+=Z[63&n[t+2]];return n.length%3==2?a=a.substring(0,a.length-1)+"=":n.length%3==1&&(a=a.substring(0,a.length-2)+"=="),a}function fe(e,t){var n="";if(e&&(n=de.call(e)),e&&("[object ArrayBuffer]"===n||e.buffer&&"[object ArrayBuffer]"===de.call(e.buffer))){var a,i=Q;e instanceof ArrayBuffer?(a=e,i+=ee):(a=e.buffer,"[object Int8Array]"===n?i+=ne:"[object Uint8Array]"===n?i+=ae:"[object Uint8ClampedArray]"===n?i+=ie:"[object Int16Array]"===n?i+=se:"[object Uint16Array]"===n?i+=oe:"[object Int32Array]"===n?i+=re:"[object Uint32Array]"===n?i+=le:"[object Float32Array]"===n?i+=ue:"[object Float64Array]"===n?i+=ce:t(new Error("Failed to get type for BinaryArray"))),t(i+me(a))}else if("[object Blob]"===n){var s=new FileReader;s.onload=function(){var n=X+e.type+"~"+me(this.result);t(Q+te+n)},s.readAsArrayBuffer(e)}else try{t(JSON.stringify(e))}catch(e){t(null,e)}}function ge(e){if(e.substring(0,J)!==Q)return JSON.parse(e);var t,n=e.substring(he),a=e.substring(J,he);if(a===te&&Y.test(n)){var i=n.match(Y);t=i[1],n=n.substring(i[0].length)}var s=pe(n);switch(a){case ee:return s;case te:return l([s],{type:t});case ne:return new Int8Array(s);case ae:return new Uint8Array(s);case ie:return new Uint8ClampedArray(s);case se:return new Int16Array(s);case oe:return new Uint16Array(s);case re:return new Int32Array(s);case le:return new Uint32Array(s);case ue:return new Float32Array(s);case ce:return new Float64Array(s);default:throw new Error("Unkown type: "+a)}}var ye={serialize:fe,deserialize:ge,stringToBuffer:pe,bufferToString:me};function be(e,t,n,a){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,a)}function ve(e){var t=this,n={db:null};if(e)for(var a in e)n[a]="string"!=typeof e[a]?e[a].toString():e[a];var i=new u((function(e,a){try{n.db=openDatabase(n.name,String(n.version),n.description,n.size)}catch(e){return a(e)}n.db.transaction((function(i){be(i,n,(function(){t._dbInfo=n,e()}),(function(e,t){a(t)}))}),a)}));return n.serializer=ye,i}function ke(e,t,n,a,i,s){e.executeSql(n,a,i,(function(e,r){r.code===r.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],(function(e,o){o.rows.length?s(e,r):be(e,t,(function(){e.executeSql(n,a,i,s)}),s)}),s):s(e,r)}),s)}function we(e,t){var n=this;e=d(e);var a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"SELECT * FROM "+i.storeName+" WHERE key = ? LIMIT 1",[e],(function(e,n){var a=n.rows.length?n.rows.item(0).value:null;a&&(a=i.serializer.deserialize(a)),t(a)}),(function(e,t){a(t)}))}))})).catch(a)}));return c(a,t),a}function Ae(e,t){var n=this,a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"SELECT * FROM "+i.storeName,[],(function(n,a){for(var s=a.rows,r=s.length,o=0;o0)return void s(xe.apply(i,[e,o,n,a-1]));r(t)}}))}))})).catch(r)}));return c(s,n),s}function Ce(e,t,n){return xe.apply(this,[e,t,n,1])}function Se(e,t){var n=this;e=d(e);var a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"DELETE FROM "+i.storeName+" WHERE key = ?",[e],(function(){t()}),(function(e,t){a(t)}))}))})).catch(a)}));return c(a,t),a}function Ee(e){var t=this,n=new u((function(e,n){t.ready().then((function(){var a=t._dbInfo;a.db.transaction((function(t){ke(t,a,"DELETE FROM "+a.storeName,[],(function(){e()}),(function(e,t){n(t)}))}))})).catch(n)}));return c(n,e),n}function _e(e){var t=this,n=new u((function(e,n){t.ready().then((function(){var a=t._dbInfo;a.db.transaction((function(t){ke(t,a,"SELECT COUNT(key) as c FROM "+a.storeName,[],(function(t,n){var a=n.rows.item(0).c;e(a)}),(function(e,t){n(t)}))}))})).catch(n)}));return c(n,e),n}function Te(e,t){var n=this,a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"SELECT key FROM "+i.storeName+" WHERE id = ? LIMIT 1",[e+1],(function(e,n){var a=n.rows.length?n.rows.item(0).key:null;t(a)}),(function(e,t){a(t)}))}))})).catch(a)}));return c(a,t),a}function Ie(e){var t=this,n=new u((function(e,n){t.ready().then((function(){var a=t._dbInfo;a.db.transaction((function(t){ke(t,a,"SELECT key FROM "+a.storeName,[],(function(t,n){for(var a=[],i=0;i '__WebKitDatabaseInfoTable__'",[],(function(n,a){for(var i=[],s=0;s0}function Fe(e){var t=this,n={};if(e)for(var a in e)n[a]=e[a];return n.keyPrefix=Oe(e,t._defaultConfig),Be()?(t._dbInfo=n,n.serializer=ye,u.resolve()):u.reject()}function Le(e){var t=this,n=t.ready().then((function(){for(var e=t._dbInfo.keyPrefix,n=localStorage.length-1;n>=0;n--){var a=localStorage.key(n);0===a.indexOf(e)&&localStorage.removeItem(a)}}));return c(n,e),n}function Pe(e,t){var n=this;e=d(e);var a=n.ready().then((function(){var t=n._dbInfo,a=localStorage.getItem(t.keyPrefix+e);return a&&(a=t.serializer.deserialize(a)),a}));return c(a,t),a}function je(e,t){var n=this,a=n.ready().then((function(){for(var t=n._dbInfo,a=t.keyPrefix,i=a.length,s=localStorage.length,r=1,o=0;o=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}})):u.reject("Invalid arguments"),c(a,t),a}var Ke={_driver:"localStorageWrapper",_initStorage:Fe,_support:ze(),iterate:je,getItem:Pe,setItem:qe,removeItem:Ge,clear:Le,length:We,key:Ve,keys:Ue,dropInstance:He},$e=function(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)},Ze=function(e,t){for(var n=e.length,a=0;a{e.exports=n;var t=null;try{t=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,n){this.low=0|e,this.high=0|t,this.unsigned=!!n}function a(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=a;var i={},s={};function r(e,t){var n,a,r;return t?(r=0<=(e>>>=0)&&e<256)&&(a=s[e])?a:(n=l(e,(0|e)<0?-1:0,!0),r&&(s[e]=n),n):(r=-128<=(e|=0)&&e<128)&&(a=i[e])?a:(n=l(e,e<0?-1:0,!1),r&&(i[e]=n),n)}function o(e,t){if(isNaN(e))return t?y:g;if(t){if(e<0)return y;if(e>=p)return A}else{if(e<=-m)return x;if(e+1>=m)return w}return e<0?o(-e,t).neg():l(e%d|0,e/d|0,t)}function l(e,t,a){return new n(e,t,a)}n.fromInt=r,n.fromNumber=o,n.fromBits=l;var u=Math.pow;function c(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(n=t,t=!1):t=!!t,(n=n||10)<2||360)throw Error("interior hyphen");if(0===a)return c(e.substring(1),t,n).neg();for(var i=o(u(n,8)),s=g,r=0;r>>0:this.low},C.toNumber=function(){return this.unsigned?(this.high>>>0)*d+(this.low>>>0):this.high*d+(this.low>>>0)},C.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((s=l).isZero())return c+r;for(;c.length<6;)c="0"+c;r=""+c+r}},C.getHighBits=function(){return this.high},C.getHighBitsUnsigned=function(){return this.high>>>0},C.getLowBits=function(){return this.low},C.getLowBitsUnsigned=function(){return this.low>>>0},C.getNumBitsAbs=function(){if(this.isNegative())return this.eq(x)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&!(e&1<=0},C.isOdd=function(){return!(1&~this.low)},C.isEven=function(){return!(1&this.low)},C.equals=function(e){return a(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},C.eq=C.equals,C.notEquals=function(e){return!this.eq(e)},C.neq=C.notEquals,C.ne=C.notEquals,C.lessThan=function(e){return this.comp(e)<0},C.lt=C.lessThan,C.lessThanOrEqual=function(e){return this.comp(e)<=0},C.lte=C.lessThanOrEqual,C.le=C.lessThanOrEqual,C.greaterThan=function(e){return this.comp(e)>0},C.gt=C.greaterThan,C.greaterThanOrEqual=function(e){return this.comp(e)>=0},C.gte=C.greaterThanOrEqual,C.ge=C.greaterThanOrEqual,C.compare=function(e){if(a(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),n=e.isNegative();return t&&!n?-1:!t&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},C.comp=C.compare,C.negate=function(){return!this.unsigned&&this.eq(x)?x:this.not().add(b)},C.neg=C.negate,C.add=function(e){a(e)||(e=h(e));var t=this.high>>>16,n=65535&this.high,i=this.low>>>16,s=65535&this.low,r=e.high>>>16,o=65535&e.high,u=e.low>>>16,c=0,d=0,p=0,m=0;return p+=(m+=s+(65535&e.low))>>>16,d+=(p+=i+u)>>>16,c+=(d+=n+o)>>>16,c+=t+r,l((p&=65535)<<16|(m&=65535),(c&=65535)<<16|(d&=65535),this.unsigned)},C.subtract=function(e){return a(e)||(e=h(e)),this.add(e.neg())},C.sub=C.subtract,C.multiply=function(e){if(this.isZero())return g;if(a(e)||(e=h(e)),t)return l(t.mul(this.low,this.high,e.low,e.high),t.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(x))return e.isOdd()?x:g;if(e.eq(x))return this.isOdd()?x:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(f)&&e.lt(f))return o(this.toNumber()*e.toNumber(),this.unsigned);var n=this.high>>>16,i=65535&this.high,s=this.low>>>16,r=65535&this.low,u=e.high>>>16,c=65535&e.high,d=e.low>>>16,p=65535&e.low,m=0,y=0,b=0,v=0;return b+=(v+=r*p)>>>16,y+=(b+=s*p)>>>16,b&=65535,y+=(b+=r*d)>>>16,m+=(y+=i*p)>>>16,y&=65535,m+=(y+=s*d)>>>16,y&=65535,m+=(y+=r*c)>>>16,m+=n*p+i*d+s*c+r*u,l((b&=65535)<<16|(v&=65535),(m&=65535)<<16|(y&=65535),this.unsigned)},C.mul=C.multiply,C.divide=function(e){if(a(e)||(e=h(e)),e.isZero())throw Error("division by zero");var n,i,s;if(t)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?t.div_u:t.div_s)(this.low,this.high,e.low,e.high),t.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?y:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return y;if(e.gt(this.shru(1)))return v;s=y}else{if(this.eq(x))return e.eq(b)||e.eq(k)?x:e.eq(x)?b:(n=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?b:k:(i=this.sub(e.mul(n)),s=n.add(i.div(e)));if(e.eq(x))return this.unsigned?y:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();s=g}for(i=this;i.gte(e);){n=Math.max(1,Math.floor(i.toNumber()/e.toNumber()));for(var r=Math.ceil(Math.log(n)/Math.LN2),c=r<=48?1:u(2,r-48),d=o(n),p=d.mul(e);p.isNegative()||p.gt(i);)p=(d=o(n-=c,this.unsigned)).mul(e);d.isZero()&&(d=b),s=s.add(d),i=i.sub(p)}return s},C.div=C.divide,C.modulo=function(e){return a(e)||(e=h(e)),t?l((this.unsigned?t.rem_u:t.rem_s)(this.low,this.high,e.low,e.high),t.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},C.mod=C.modulo,C.rem=C.modulo,C.not=function(){return l(~this.low,~this.high,this.unsigned)},C.and=function(e){return a(e)||(e=h(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},C.or=function(e){return a(e)||(e=h(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},C.xor=function(e){return a(e)||(e=h(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},C.shiftLeft=function(e){return a(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},C.shr=C.shiftRight,C.shiftRightUnsigned=function(e){if(a(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},C.shru=C.shiftRightUnsigned,C.shr_u=C.shiftRightUnsigned,C.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},C.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},C.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},C.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},C.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,a){return a?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},9464:function(e,t){var n,a,i;a=[e],n=function(e){"use strict";function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var n=Object.assign||function(e){for(var t=1;tMath.abs(n[s][r])&&(r=o);for(var l=s;l=s;h--)n[h][c]-=n[h][s]*n[s][c]/n[s][s]}for(var d=a-1;d>=0;d--){for(var p=0,m=d+1;m=0;w--)k+=w>1?y[w]+"x^"+w+" + ":1===w?y[w]+"x + ":y[w];return{string:k,points:v,predict:b,equation:[].concat(a(y)).reverse(),r2:o(s(e,v),t.precision)}}};function u(){var e=function(e,a){return n({_round:o},e,t({},a,(function(e,t){return l[a](e,n({},i,t))})))};return Object.keys(l).reduce(e,{})}e.exports=u()},void 0===(i="function"==typeof n?n.apply(t,a):n)||(e.exports=i)},2183:(e,t,n)=>{var a=n(1812),i=n(6357),s=n(1119),r=n(147),o=n(6297),l=n(9181),u=n(7529);u.alea=a,u.xor128=i,u.xorwow=s,u.xorshift7=r,u.xor4096=o,u.tychei=l,e.exports=u},1812:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n=function(){var e=4022871197,t=function(t){t=String(t);for(var n=0;n>>0,e=(a*=e)>>>0,e+=4294967296*(a-=e)}return 2.3283064365386963e-10*(e>>>0)};return t}();t.next=function(){var e=2091639*t.s0+2.3283064365386963e-10*t.c;return t.s0=t.s1,t.s1=t.s2,t.s2=e-(t.c=0|e)},t.c=1,t.s0=n(" "),t.s1=n(" "),t.s2=n(" "),t.s0-=n(e),t.s0<0&&(t.s0+=1),t.s1-=n(e),t.s1<0&&(t.s1+=1),t.s2-=n(e),t.s2<0&&(t.s2+=1),n=null}function o(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}function l(e,t){var n=new r(e),a=t&&t.state,i=n.next;return i.int32=function(){return 4294967296*n.next()|0},i.double=function(){return i()+11102230246251565e-32*(2097152*i()|0)},i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.alea=l}(0,e=n.nmd(e),n.amdD)},9181:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,a=t.d,i=t.a;return e=e<<25^e>>>7^n,n=n-a|0,a=a<<24^a>>>8^i,i=i-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-a|0,t.d=a<<16^n>>>16^i,t.a=i-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var a=0;a>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.tychei=l}(0,e=n.nmd(e),n.amdD)},6357:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var a=0;a>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xor128=l}(0,e=n.nmd(e),n.amdD)},6297:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this;t.next=function(){var e,n,a=t.w,i=t.X,s=t.i;return t.w=a=a+1640531527|0,n=i[s+34&127],e=i[s=s+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=i[s]=n^e,t.i=s,n+(a^a>>>16)|0},function(e,t){var n,a,i,s,r,o=[],l=128;for(t===(0|t)?(a=t,t=null):(t+="\0",a=0,l=Math.max(l,t.length)),i=0,s=-32;s>>15,a^=a<<4,a^=a>>>13,s>=0&&(r=r+1640531527|0,i=0==(n=o[127&s]^=a+r)?i+1:0);for(i>=128&&(o[127&(t&&t.length||0)]=-1),i=127,s=512;s>0;--s)a=o[i+34&127],n=o[i=i+1&127],a^=a<<13,n^=n<<17,a^=a>>>15,n^=n>>>12,o[i]=a^n;e.w=r,e.X=o,e.i=i}(t,e)}function o(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function l(e,t){null==e&&(e=+new Date);var n=new r(e),a=t&&t.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&(a.X&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xor4096=l}(0,e=n.nmd(e),n.amdD)},147:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this;t.next=function(){var e,n,a=t.x,i=t.i;return e=a[i],n=(e^=e>>>7)^e<<24,n^=(e=a[i+1&7])^e>>>10,n^=(e=a[i+3&7])^e>>>3,n^=(e=a[i+4&7])^e<<7,e=a[i+7&7],n^=(e^=e<<13)^e<<9,a[i]=n,t.i=i+1&7,n},function(e,t){var n,a=[];if(t===(0|t))a[0]=t;else for(t=""+t,n=0;n0;--n)e.next()}(t,e)}function o(e,t){return t.x=e.x.slice(),t.i=e.i,t}function l(e,t){null==e&&(e=+new Date);var n=new r(e),a=t&&t.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&(a.x&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xorshift7=l}(0,e=n.nmd(e),n.amdD)},1119:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var a=0;a>>4),t.next()}function o(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function l(e,t){var n=new r(e),a=t&&t.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xorwow=l}(0,e=n.nmd(e),n.amdD)},7529:function(e,t,n){var a;!function(i,s,r){var o,l=256,u=r.pow(l,6),c=r.pow(2,52),h=2*c,d=l-1;function p(e,t,n){var a=[],d=y(g((t=1==t?{entropy:!0}:t||{}).entropy?[e,b(s)]:null==e?function(){try{var e;return o&&(e=o.randomBytes)?e=e(l):(e=new Uint8Array(l),(i.crypto||i.msCrypto).getRandomValues(e)),b(e)}catch(e){var t=i.navigator,n=t&&t.plugins;return[+new Date,i,n,i.screen,b(s)]}}():e,3),a),p=new m(a),v=function(){for(var e=p.g(6),t=u,n=0;e=h;)e/=2,t/=2,n>>>=1;return(e+n)/t};return v.int32=function(){return 0|p.g(4)},v.quick=function(){return p.g(4)/4294967296},v.double=v,y(b(p.S),s),(t.pass||n||function(e,t,n,a){return a&&(a.S&&f(a,p),e.state=function(){return f(p,{})}),n?(r.random=e,t):e})(v,d,"global"in t?t.global:this==r,t.state)}function m(e){var t,n=e.length,a=this,i=0,s=a.i=a.j=0,r=a.S=[];for(n||(e=[n++]);i{},9830:()=>{},3818:()=>{},6308:()=>{},7695:()=>{},170:()=>{}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var n=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(n.exports,n,n.exports,__webpack_require__),n.loaded=!0,n.exports}__webpack_require__.amdD=function(){throw new Error("define cannot be used indirect")},__webpack_require__.amdO={},__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),__webpack_require__.nc=void 0;var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>fX});var e={};__webpack_require__.r(e),__webpack_require__.d(e,{CompositeArrayBuffer:()=>uh,browserFiles:()=>ap,browserHTTPRequest:()=>dp,concatenateArrayBuffers:()=>Th,copyModel:()=>pd,decodeWeights:()=>vh,decodeWeightsStream:()=>Ch,encodeWeights:()=>bh,fromMemory:()=>gp,fromMemorySync:()=>yp,getLoadHandlers:()=>Ph,getModelArtifactsForJSON:()=>Dh,getModelArtifactsForJSONSync:()=>Rh,getModelArtifactsInfoForJSON:()=>zh,getSaveHandlers:()=>Lh,getWeightSpecs:()=>Oh,http:()=>hp,isHTTPScheme:()=>up,listModels:()=>hd,loadWeights:()=>rp,moveModel:()=>md,registerLoadRouter:()=>Fh,registerSaveRouter:()=>Bh,removeModel:()=>dd,weightsLoaderFactory:()=>op,withSaveHandler:()=>bp,withSaveHandlerSync:()=>vp});var t={};__webpack_require__.r(t),__webpack_require__.d(t,{assertParamsValid:()=>Ip,computeFlatOffset:()=>Up,computeOutShape:()=>Rp,getNormalizedAxes:()=>Mp,isSliceContinous:()=>Vp,maskToAxes:()=>Np,parseSliceParams:()=>Wp,sliceInfo:()=>Gp,startForAxis:()=>Pp,startIndicesWithElidedDims:()=>Bp,stopForAxis:()=>jp,stopIndicesWithElidedDims:()=>Fp,stridesForAxis:()=>Lp,stridesWithElidedDims:()=>Dp});var n={};__webpack_require__.r(n),__webpack_require__.d(n,{conv2d:()=>ib,depthwiseConv2d:()=>ob,matMul:()=>lb});var a={};__webpack_require__.r(a),__webpack_require__.d(a,{collectGatherOpShapeInfo:()=>pk,computeOutShape:()=>dk,segOpComputeOptimalWindowSize:()=>hk});var i={};__webpack_require__.r(i),__webpack_require__.d(i,{ERF_A1:()=>Iv,ERF_A2:()=>Nv,ERF_A3:()=>Rv,ERF_A4:()=>Dv,ERF_A5:()=>zv,ERF_P:()=>Tv,PARALLELIZE_THRESHOLD:()=>yv,RowPartitionType:()=>hv,SELU_SCALE:()=>_v,SELU_SCALEALPHA:()=>Ev,applyActivation:()=>nb,assertAndGetBroadcastShape:()=>Kd,assertAxesAreInnerMostDims:()=>bf,assertParamsConsistent:()=>uv,assignToTypedArray:()=>Pv,axesAreInnerMostDims:()=>mf,calculateShapes:()=>Dy,checkEinsumDimSizes:()=>$v,checkPadOnDimRoundingMode:()=>bm,combineLocations:()=>ff,combineRaggedTensorToTensorShapes:()=>pv,complexWithEvenIndex:()=>Bv,complexWithOddIndex:()=>Fv,computeConv2DInfo:()=>om,computeConv3DInfo:()=>lm,computeDefaultPad:()=>um,computeDilation2DInfo:()=>im,computeOptimalWindowSize:()=>bv,computeOutAndReduceShapes:()=>gf,computeOutShape:()=>cv,computePool2DInfo:()=>sm,computePool3DInfo:()=>rm,convertConv2DDataFormat:()=>ym,decodeEinsumEquation:()=>Hv,eitherStridesOrDilationsAreOne:()=>fm,expandShapeToKeepDim:()=>yf,exponent:()=>Vv,exponents:()=>jv,fromStringArrayToUint8:()=>fk,fromUint8ToStringArray:()=>mk,getAxesPermutation:()=>vf,getBroadcastDims:()=>qd,getComplexWithIndex:()=>Lv,getEinsumComputePath:()=>Zv,getEinsumPermutation:()=>Kv,getFusedBiasGradient:()=>tb,getFusedDyActivation:()=>eb,getImageCenter:()=>vv,getInnerMostAxes:()=>wf,getPermuted:()=>wv,getRaggedRank:()=>fv,getReductionAxes:()=>Hd,getReshaped:()=>kv,getReshapedPermuted:()=>Av,getRowPartitionTypesHelper:()=>mv,getSliceBeginCoords:()=>xv,getSliceSize:()=>Cv,getSparseFillEmptyRowsIndicesDenseShapeMismatch:()=>Jv,getSparseFillEmptyRowsNegativeIndexErrorMessage:()=>ek,getSparseFillEmptyRowsOutOfRangeIndexErrorMessage:()=>tk,getSparseReshapeEmptyTensorZeroOutputDimErrorMessage:()=>ik,getSparseReshapeInputOutputMismatchErrorMessage:()=>rk,getSparseReshapeInputOutputMultipleErrorMessage:()=>sk,getSparseReshapeMultipleNegativeOneOutputDimErrorMessage:()=>nk,getSparseReshapeNegativeOutputDimErrorMessage:()=>ak,getSparseSegmentReductionIndicesOutOfRangeErrorMessage:()=>ck,getSparseSegmentReductionNegativeSegmentIdsErrorMessage:()=>ok,getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage:()=>lk,getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage:()=>uk,getUndoAxesPermutation:()=>kf,isIdentityPermutation:()=>Xv,log:()=>Tu,mergeRealAndImagArrays:()=>Ov,prepareAndValidate:()=>Sv,prepareSplitSize:()=>Qv,segment_util:()=>a,shouldFuse:()=>ab,slice_util:()=>t,splitRealAndImagArrays:()=>Mv,stridesOrDilationsArePositive:()=>gm,tupleValuesAreOne:()=>mm,upcastType:()=>Oc,validateDefaultValueShape:()=>gv,validateInput:()=>Ry,validateUpdateShape:()=>Ny,warn:()=>_u});var s={};__webpack_require__.r(s),__webpack_require__.d(s,{json:()=>M_});var r={};__webpack_require__.r(r),__webpack_require__.d(r,{json:()=>B_});var o={};__webpack_require__.r(o),__webpack_require__.d(o,{json:()=>F_});var l={};__webpack_require__.r(l),__webpack_require__.d(l,{json:()=>L_});var u={};__webpack_require__.r(u),__webpack_require__.d(u,{json:()=>P_});var c={};__webpack_require__.r(c),__webpack_require__.d(c,{json:()=>j_});var h={};__webpack_require__.r(h),__webpack_require__.d(h,{json:()=>V_});var d={};__webpack_require__.r(d),__webpack_require__.d(d,{json:()=>U_});var p={};__webpack_require__.r(p),__webpack_require__.d(p,{json:()=>W_});var m={};__webpack_require__.r(m),__webpack_require__.d(m,{json:()=>G_});var f={};__webpack_require__.r(f),__webpack_require__.d(f,{json:()=>q_});var g={};__webpack_require__.r(g),__webpack_require__.d(g,{json:()=>H_});var y={};__webpack_require__.r(y),__webpack_require__.d(y,{json:()=>K_});var b={};__webpack_require__.r(b),__webpack_require__.d(b,{json:()=>$_});var v={};__webpack_require__.r(v),__webpack_require__.d(v,{json:()=>Z_});var k={};__webpack_require__.r(k),__webpack_require__.d(k,{json:()=>X_});var w={};__webpack_require__.r(w),__webpack_require__.d(w,{json:()=>Y_});var A={};__webpack_require__.r(A),__webpack_require__.d(A,{json:()=>Q_});var x={};__webpack_require__.r(x),__webpack_require__.d(x,{json:()=>J_});var C={};__webpack_require__.r(C),__webpack_require__.d(C,{OP_SCOPE_SUFFIX:()=>ah,abs:()=>Gd,acos:()=>Hp,acosh:()=>Kp,add:()=>xd,addN:()=>$p,all:()=>Zp,any:()=>Xp,argMax:()=>Yp,argMin:()=>Qp,asin:()=>Jp,asinh:()=>em,atan:()=>tm,atan2:()=>nm,atanh:()=>am,avgPool:()=>km,avgPool3d:()=>wm,basicLSTMCell:()=>_m,batchNorm:()=>Im,batchNorm2d:()=>Nm,batchNorm3d:()=>Rm,batchNorm4d:()=>Dm,batchToSpaceND:()=>Tm,bincount:()=>zm,bitwiseAnd:()=>Om,booleanMaskAsync:()=>Wy,broadcastArgs:()=>Mm,broadcastTo:()=>Bm,buffer:()=>vd,cast:()=>kd,ceil:()=>Fm,clipByValue:()=>Lm,clone:()=>wd,complex:()=>sh,concat:()=>Am,concat1d:()=>Pm,concat2d:()=>jm,concat3d:()=>Vm,concat4d:()=>Um,conv1d:()=>Gm,conv2d:()=>Wm,conv2dTranspose:()=>Hm,conv3d:()=>Km,conv3dTranspose:()=>Zm,cos:()=>Xm,cosh:()=>Ym,cosineWindow:()=>Yy,cumprod:()=>Qm,cumsum:()=>Jm,denseBincount:()=>ef,depthToSpace:()=>tf,depthwiseConv2d:()=>nf,diag:()=>af,dilation2d:()=>sf,div:()=>Sd,divNoNan:()=>lf,dot:()=>uf,dropout:()=>Zy,einsum:()=>cf,elu:()=>hf,enclosingPowerOfTwo:()=>Xy,ensureShape:()=>df,equal:()=>rf,erf:()=>pf,euclideanNorm:()=>_f,exp:()=>Tf,expandDims:()=>If,expm1:()=>Nf,eye:()=>Df,fft:()=>my,fill:()=>Pd,floor:()=>zf,floorDiv:()=>Cd,fused:()=>n,gather:()=>Of,gatherND:()=>$y,greater:()=>Mf,greaterEqual:()=>Bf,ifft:()=>fy,imag:()=>Ff,image:()=>tv,inTopKAsync:()=>Qy,irfft:()=>gy,isFinite:()=>Lf,isInf:()=>Pf,isNaN:()=>jf,leakyRelu:()=>Vf,less:()=>Uf,lessEqual:()=>Wf,linalg:()=>nv,linspace:()=>Gf,localResponseNormalization:()=>qf,log:()=>Hf,log1p:()=>Kf,logSigmoid:()=>Xf,logSoftmax:()=>Yf,logSumExp:()=>Qf,logicalAnd:()=>Jf,logicalNot:()=>eg,logicalOr:()=>tg,logicalXor:()=>ng,losses:()=>av,lowerBound:()=>sg,matMul:()=>xm,max:()=>Af,maxPool:()=>rg,maxPool3d:()=>og,maxPoolWithArgmax:()=>lg,maximum:()=>$d,mean:()=>ug,meshgrid:()=>dg,min:()=>xf,minimum:()=>pg,mirrorPad:()=>mg,mod:()=>fg,moments:()=>gg,movingAverage:()=>qy,mul:()=>Ed,multiRNNCell:()=>yg,multinomial:()=>bg,neg:()=>$f,norm:()=>Ef,notEqual:()=>vg,oneHot:()=>kg,ones:()=>hg,onesLike:()=>wg,op:()=>ih,outerProduct:()=>Ag,pad:()=>xg,pad1d:()=>Cg,pad2d:()=>Sg,pad3d:()=>Eg,pad4d:()=>_g,pool:()=>Ig,pow:()=>Vd,prelu:()=>Ng,print:()=>Ad,prod:()=>Rg,raggedGather:()=>Dg,raggedRange:()=>zg,raggedTensorToTensor:()=>Og,rand:()=>Mg,randomGamma:()=>jg,randomNormal:()=>Vg,randomStandardNormal:()=>Ug,randomUniform:()=>Wg,randomUniformInt:()=>Gg,range:()=>qg,real:()=>Hg,reciprocal:()=>Kg,relu:()=>$g,relu6:()=>Zg,reshape:()=>vm,reverse:()=>Xg,reverse1d:()=>Yg,reverse2d:()=>Qg,reverse3d:()=>Jg,reverse4d:()=>ey,rfft:()=>by,round:()=>ty,rsqrt:()=>ny,scalar:()=>Rd,scatterND:()=>Hy,searchSorted:()=>ig,selu:()=>ay,separableConv2d:()=>iy,setdiff1dAsync:()=>sy,sigmoid:()=>Cm,sign:()=>ry,signal:()=>ev,sin:()=>oy,sinh:()=>ly,slice:()=>Sm,slice1d:()=>uy,slice2d:()=>cy,slice3d:()=>hy,slice4d:()=>dy,softmax:()=>py,softplus:()=>Zf,spaceToBatchND:()=>Tg,sparse:()=>iv,sparseToDense:()=>Ky,spectral:()=>Jb,split:()=>yy,sqrt:()=>_d,square:()=>Td,squaredDifference:()=>vy,squeeze:()=>ky,stack:()=>wy,step:()=>Ay,stridedSlice:()=>xy,string:()=>sv,sub:()=>Ud,sum:()=>Cf,tan:()=>Cy,tanh:()=>Em,tensor:()=>oh,tensor1d:()=>Sy,tensor2d:()=>Ey,tensor3d:()=>kp,tensor4d:()=>_y,tensor5d:()=>Ty,tensor6d:()=>Iy,tensorScatterUpdate:()=>zy,tile:()=>Rf,topk:()=>Oy,transpose:()=>Gy,truncatedNormal:()=>My,unique:()=>By,unsortedSegmentSum:()=>Fy,unstack:()=>Ly,upperBound:()=>Py,variable:()=>jy,where:()=>of,whereAsync:()=>Uy,zeros:()=>cg,zerosLike:()=>Id});var S={};__webpack_require__.r(S),__webpack_require__.d(S,{mx:()=>eN,XI:()=>HN,Nk:()=>KN,f6:()=>ZN,ct:()=>ZI,YG:()=>JN,hH:()=>sR,z3:()=>WR,sG:()=>eD,uM:()=>sD,vS:()=>AD,qB:()=>ND,GG:()=>DD,lg:()=>FD,rq:()=>OD,cu:()=>XD,WR:()=>KD,GE:()=>JD,px:()=>tz,jC:()=>gz,He:()=>vz,hE:()=>Iz,BF:()=>MR,Dk:()=>Pz,cl:()=>Kz,_B:()=>rO,ub:()=>hO,_f:()=>mO,Ku:()=>kO,qy:()=>AO,Zy:()=>OO,bu:()=>FO,zv:()=>jI,dH:()=>uN,HS:()=>UN,yH:()=>aM,l3:()=>sM,z9:()=>oM,x6:()=>dM,_m:()=>vM,eW:()=>CM,GK:()=>_M,SP:()=>NM,yr:()=>DM,dl:()=>hD,Dw:()=>FM,xT:()=>jM,_X:()=>gN,wz:()=>qM});var E=__webpack_require__(7786),_=__webpack_require__(9043);E.A.prototype._CONST=Object.freeze({N:{VIDEO_W:{DESKTOP:208,MOBILE:144},VIDEO_MARGIN:"10px",VIDEO_MARGIN_BOTTOM:"40px",GAZE_CALIBRATION:{R:40,MARGIN:32,BORDER:8,CENTER_EXTRA_CHECK_OFFSET:2,MID_EXTRA_CHECK_OFFSET:6},PPI_DONT_USE:127.7,PD_DONT_USE:6.4,VIEW_DIST_DONT_USE:40},S:{AUTO:"AUTO",CLICK_TYPE:{MOUSE:"mouse",TOUCH:"touch"}},COLOR:{LIGHT_GREY:"#cccccc",ORANGE:"#ff9a00",DARK_RED:"#ac0d0d",RED:"#ee0000"},LTR:"LTR",RTL:"RTL",VIEW_METHOD:{B:"BlindSpot",F:"FaceMesh"},IN_TO_CM:2.54,UNITS:{CM:"cm",IN_D:"inDecimal",IN_F:"inFractional"}}),E.A.prototype._debuggerDefault=Object.freeze({date:new Date("July 20, 69 20:17:40 GMT+00:00"),timestamp:performance.now(),screenSize:{value:{screenWidthCm:28.6,screenHeightCm:17.9,screenPhysicalPpi:250,screenPpi:125,screenDiagonalCm:33.8,screenDiagonalIn:13.3}},measureDistance:{value:40,method:"BlindSpot"},trackDistance:{value:{viewingDistanceCm:40,PDCm:6.4,nearPointCm:{x:0,y:0},latencyMs:50},method:"FaceMesh"},trackGaze:{value:{x:screen.width/2,y:screen.height/2,latencyMs:50}},performance:{value:{computeArrayFillMHz:(0,_.Nh)(.5,3),computeRandomMHz:(0,_.Nh)(5,3),idealFps:60,stressFps:60}}});var T=__webpack_require__(115),I=__webpack_require__.n(T),N=__webpack_require__(3389),R=__webpack_require__.n(N),D=__webpack_require__(402),z=__webpack_require__.n(D),O=__webpack_require__(880),M=__webpack_require__.n(O),B=__webpack_require__(3282),F=__webpack_require__.n(B);const L=(e,t)=>{e.style.top=`${Math.round(t.querySelector(".calibration-instruction").getBoundingClientRect().bottom)+25}px`},P=e=>{const t=e.value/e.max;e.style.background=`linear-gradient(90deg, #ffc772, #ffc772 ${100*t}%, #fff ${100*t}%)`};var j=__webpack_require__(9853),V=__webpack_require__(359),U=__webpack_require__(9199);const W=(e,t,n=null,a=!0,i=["return"])=>{if(!t)return()=>{};const s=((e,t)=>e?(e.event_handlers.current.push(t),()=>{e.event_handlers.current=e.event_handlers.current.filter((e=>e!==t))}):()=>{})(t,(r=>{i.includes(r.name)&&(t.all_keys.current=[],e&&e.click(),n&&n(),a&&s())}));return s};E.A.prototype._displaySize=function(e=!1){if(!e&&!this.checkInitialized())return;const t={value:{displayWidthPx:screen.width,displayHeightPx:screen.height,windowWidthPx:window.innerWidth,windowHeightPx:window.innerHeight},timestamp:performance.now()};this.displayData.length&&I()(t.value,this.displayData[this.displayData.length-1].value)||(this.newDisplayData=t)};const G={card:R(),arrow:z(),usba:M(),usbc:F()},q={card:3.375,usba:.787402,usbc:.787402};E.A.prototype.screenSize=function(e={},t=void 0){if(!this.checkInitialized())return;(0,_.$k)();const n=Object.assign({fullscreen:!1,repeatTesting:1,decimalPlace:1,defaultObject:"card",headline:`🖥️ ${U.H.RC_screenSizeTitle[this.L]}`,description:U.H.RC_screenSizeIntro[this.L],check:!1,checkCallback:null},e);this.getFullscreen(n.fullscreen),["usba","usbc","card"].includes(n.defaultObject)||(n.defaultObject="card"),n.description+=`

    ${U.H.RC_screenSizeHave[this.L].replace("xxx",``)}`,this._addBackground(),this._addBackgroundText(n.headline,n.description),this._addCreditOnBackground(U.H.RC_screenSizeCredit[this.L]),function(e,t,n,a){const i=((e,t,n)=>{const a=document.createElement("input");return a.id="rc-size-slider",a.className="rc-slider",a.type="range",a.min=t,a.max=n,a.value=Math.max(Math.min(Math.round(100*Math.random()),80),20),a.step=.1,L(a,e),P(a),e.appendChild(a),a})(t,0,100),s=(t,n)=>{if("rc-slider"===t.target.className&&"rc-size-slider"===t.target.id&&(n===e._CONST.S.CLICK_TYPE.MOUSE&&1===t.which||n===e._CONST.S.CLICK_TYPE.TOUCH)){t.target.style.cursor="grabbing",c.setAttribute("fill",e._CONST.COLOR.ORANGE);const a=()=>{i.style.cursor="grab",c.setAttribute("fill",e._CONST.COLOR.LIGHT_GREY),document.removeEventListener("mouseup",a,!1)};n===e._CONST.S.CLICK_TYPE.MOUSE?document.addEventListener("mouseup",a,!1):n===e._CONST.S.CLICK_TYPE.TOUCH&&document.addEventListener("touchend",a,!1)}},r=e=>{s(e,"mouse")},o=e=>{s(e,"touch")};document.addEventListener("mousedown",r,!1),document.addEventListener("touchstart",o,!1);const l=$(["card","arrow","usba","usbc"],t);let u=n.defaultObject;document.getElementById("matching-obj").addEventListener("change",(e=>{Z(e.target.value,l,d),u=e.target.value})),Z("card",l);const c=document.getElementById("size-arrow-fill");c.setAttribute("fill",e._CONST.COLOR.LIGHT_GREY);const h={width:l.arrow.getBoundingClientRect().width,height:l.arrow.getBoundingClientRect().height},d=()=>{H(e,i,l.card,l.arrow,h),K(i,l.usba),K(i,l.usbc)};d();const p=()=>{P(i),d()},m=new ResizeObserver((()=>{d(),L(i,t),Y(l,i)}));m.observe(t);const f=W(null,e.keypadHandler,(()=>{y()}),!1,["return","space"]),g=()=>{document.removeEventListener("mousedown",r,!1),document.removeEventListener("touchstart",o,!1),document.removeEventListener("input",p,!1),m.unobserve(t),e._removeBackground(),f(),(0,j.l)(b)},y=()=>{const t=(l[u].getBoundingClientRect().width||Number.parseInt(l[u].style.width))/q[u],i=n.decimalPlace,s=X(t,i);e.newScreenData=s,g(),n.check?e._checkScreenSize(a,s,n.checkCallback):(0,_.nB)(a,s)};i.addEventListener("input",p,!1);const b=(0,j.m)({Escape:g,Enter:y," ":y});(0,V.F)(e.L,e.background,{go:y,cancel:g},e.params.showCancelButton),Z(u,l,d)}(this,this.background,n,t)};const H=(e,t,n,a,i)=>{const s=(t.offsetWidth-30)*(t.value/100)*(window.innerWidth<480?2:1)+15;n.style.width=`${s}px`;const r=n.getBoundingClientRect();0!==r.width&&(a.style.left=`${r.left+s}px`,a.style.top=`${r.top+e.background.scrollTop+(.63*s-i.height)/2}px`)},K=(e,t)=>{t.style.width=`${(0,_.Ew)(e.value**1.5,0,1e3,50,400)}px`},$=(e,t)=>{const n=document.getElementsByClassName("size-obj");for(;n.length;)n[0].parentNode.removeChild(n[0]);const a={};for(const n of e){let e=document.createElement("div");t.appendChild(e),e.outerHTML=G[n],e=document.getElementById(`size-${n}`),e.setAttribute("preserveAspectRatio","none"),e.style.visibility="hidden",a[n]=e}return Y(a,document.querySelector("#rc-size-slider")),a},Z=(e,t,n)=>{for(const n in t)t[n].style.visibility=n===e?"visible":"hidden";t.arrow.style.visibility="hidden",(0,_.nB)(n)},X=(e,t)=>{const n={value:{screenWidthCm:(0,_.Nh)(2.54*window.screen.width/e,t),screenHeightCm:(0,_.Nh)(2.54*window.screen.height/e,t),screenPhysicalPpi:(0,_.Nh)(e*window.devicePixelRatio,t),screenPpi:(0,_.Nh)(e,t)},timestamp:performance.now()};return n.value.screenDiagonalCm=(0,_.Nh)(Math.hypot(n.value.screenWidthCm,n.value.screenHeightCm),t),n.value.screenDiagonalIn=(0,_.Nh)(n.value.screenDiagonalCm/2.54,t),n},Y=(e,t)=>{for(const n in e)e[n].style.top=`${t.getBoundingClientRect().top+50}px`};function Q(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function J(e,t){return e.get(Q(e,t))}function ee(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const te={},ne=e=>new Promise((t=>{if(!e)return t();const n=window.scrollX,a=window.scrollY;te.restoreFocusTimeout=setTimeout((()=>{te.previousActiveElement instanceof HTMLElement?(te.previousActiveElement.focus(),te.previousActiveElement=null):document.body&&document.body.focus(),t()}),100),window.scrollTo(n,a)})),ae="swal2-",ie=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","default-outline","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error"].reduce(((e,t)=>(e[t]=ae+t,e)),{}),se=["success","warning","info","question","error"].reduce(((e,t)=>(e[t]=ae+t,e)),{}),re=e=>e.charAt(0).toUpperCase()+e.slice(1),oe=e=>{},le=[],ue=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,le.includes(n)||(le.push(n),oe(n))},ce=e=>"function"==typeof e?e():e,he=e=>e&&"function"==typeof e.toPromise,de=e=>he(e)?e.toPromise():Promise.resolve(e),pe=e=>e&&Promise.resolve(e)===e,me=()=>document.body.querySelector(`.${ie.container}`),fe=e=>{const t=me();return t?t.querySelector(e):null},ge=e=>fe(`.${e}`),ye=()=>ge(ie.popup),be=()=>ge(ie.icon),ve=()=>ge(ie.title),ke=()=>ge(ie["html-container"]),we=()=>ge(ie.image),Ae=()=>ge(ie["progress-steps"]),xe=()=>ge(ie["validation-message"]),Ce=()=>fe(`.${ie.actions} .${ie.confirm}`),Se=()=>fe(`.${ie.actions} .${ie.cancel}`),Ee=()=>fe(`.${ie.actions} .${ie.deny}`),_e=()=>fe(`.${ie.loader}`),Te=()=>ge(ie.actions),Ie=()=>ge(ie.footer),Ne=()=>ge(ie["timer-progress-bar"]),Re=()=>ge(ie.close),De=()=>{const e=ye();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort(((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),a=parseInt(t.getAttribute("tabindex")||"0");return n>a?1:n"-1"!==e.getAttribute("tabindex")));return[...new Set(n.concat(i))].filter((e=>Xe(e)))},ze=()=>Be(document.body,ie.shown)&&!Be(document.body,ie["toast-shown"])&&!Be(document.body,ie["no-backdrop"]),Oe=()=>{const e=ye();return!!e&&Be(e,ie.toast)},Me=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),a=n.querySelector("head");a&&Array.from(a.childNodes).forEach((t=>{e.appendChild(t)}));const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach((t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)}))}},Be=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{if(((e,t)=>{Array.from(e.classList).forEach((n=>{Object.values(ie).includes(n)||Object.values(se).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)}))})(e,t),!t.customClass)return;const a=t.customClass[n];a&&("string"==typeof a||a.forEach?Ve(e,a):oe(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof a}"`))},Le=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${ie.popup} > .${ie[t]}`);case"checkbox":return e.querySelector(`.${ie.popup} > .${ie.checkbox} input`);case"radio":return e.querySelector(`.${ie.popup} > .${ie.radio} input:checked`)||e.querySelector(`.${ie.popup} > .${ie.radio} input:first-child`);case"range":return e.querySelector(`.${ie.popup} > .${ie.range} input`);default:return e.querySelector(`.${ie.popup} > .${ie.input}`)}},Pe=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},je=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach((t=>{Array.isArray(e)?e.forEach((e=>{n?e.classList.add(t):e.classList.remove(t)})):n?e.classList.add(t):e.classList.remove(t)})))},Ve=(e,t)=>{je(e,t,!0)},Ue=(e,t)=>{je(e,t,!1)},We=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(n)}`&&(n=parseInt(n)),n||0===parseInt(n)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},qe=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"flex";e&&(e.style.display=t)},He=e=>{e&&(e.style.display="none")},Ke=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"block";e&&new MutationObserver((()=>{Ze(e,e.innerHTML,t)})).observe(e,{childList:!0,subtree:!0})},$e=(e,t,n,a)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,a)},Ze=function(e,t){t?qe(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:"flex"):He(e)},Xe=e=>!(!e||!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),Ye=e=>!!(e.scrollHeight>e.clientHeight),Qe=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),a=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||a>0},Je=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=Ne();n&&Xe(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout((()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"}),10))},et=`\n
    \n \n
      \n
      \n \n

      \n
      \n \n \n
      \n \n \n
      \n \n
      \n \n \n
      \n
      \n
      \n \n \n \n
      \n
      \n
      \n
      \n
      \n
      \n`.replace(/(^|\n)\s*/g,""),tt=()=>{te.currentInstance.resetValidationMessage()},nt=e=>{const t=(()=>{const e=me();return!!e&&(e.remove(),Ue([document.documentElement,document.body],[ie["no-backdrop"],ie["toast-shown"],ie["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return;const n=document.createElement("div");n.className=ie.container,t&&Ve(n,ie["no-transition"]),Me(n,et);const a="string"==typeof(i=e.target)?document.querySelector(i):i;var i;a.appendChild(n),(e=>{const t=ye();t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true")})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&Ve(me(),ie.rtl)})(a),(()=>{const e=ye(),t=We(e,ie.input),n=We(e,ie.file),a=e.querySelector(`.${ie.range} input`),i=e.querySelector(`.${ie.range} output`),s=We(e,ie.select),r=e.querySelector(`.${ie.checkbox} input`),o=We(e,ie.textarea);t.oninput=tt,n.onchange=tt,s.onchange=tt,r.onchange=tt,o.oninput=tt,a.oninput=()=>{tt(),i.value=a.value},a.onchange=()=>{tt(),i.value=a.value}})()},at=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?it(e,t):e&&Me(t,e)},it=(e,t)=>{e.jquery?st(t,e):Me(t,e.toString())},st=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},rt=(e,t)=>{const n=Te(),a=_e();n&&a&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?qe(n):He(n),Fe(n,t,"actions"),function(e,t,n){const a=Ce(),i=Ee(),s=Se();if(!a||!i||!s)return;ot(a,"confirm",n),ot(i,"deny",n),ot(s,"cancel",n),function(e,t,n,a){if(!a.buttonsStyling)return void Ue([e,t,n],ie.styled);Ve([e,t,n],ie.styled),a.confirmButtonColor&&(e.style.backgroundColor=a.confirmButtonColor,Ve(e,ie["default-outline"]));a.denyButtonColor&&(t.style.backgroundColor=a.denyButtonColor,Ve(t,ie["default-outline"]));a.cancelButtonColor&&(n.style.backgroundColor=a.cancelButtonColor,Ve(n,ie["default-outline"]))}(a,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,a),e.insertBefore(i,a)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(a,t)))}(n,a,t),Me(a,t.loaderHtml||""),Fe(a,t,"loader"))};function ot(e,t,n){const a=re(t);Ze(e,n[`show${a}Button`],"inline-block"),Me(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=ie[t],Fe(e,n,`${t}Button`)}const lt=(e,t)=>{const n=me();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||Ve([document.documentElement,document.body],ie["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in ie?Ve(e,ie[t]):(oe('The "position" parameter is not valid, defaulting to "center"'),Ve(e,ie.center))}(n,t.position),function(e,t){if(!t)return;Ve(e,ie[`grow-${t}`])}(n,t.grow),Fe(n,t,"container"))};var ut={innerParams:new WeakMap,domCache:new WeakMap};const ct=["input","file","range","select","radio","checkbox","textarea"],ht=e=>{if(!e.input)return;if(!bt[e.input])return Object.keys(bt).join(" | "),void e.input;const t=gt(e.input);if(!t)return;const n=bt[e.input](t,e);qe(t),e.inputAutoFocus&&setTimeout((()=>{Pe(n)}))},dt=(e,t)=>{const n=ye();if(!n)return;const a=Le(n,e);if(a){(e=>{for(let t=0;t{if(!e.input)return;const t=gt(e.input);t&&Fe(t,e,"input")},mt=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},ft=(e,t,n)=>{if(n.inputLabel){const a=document.createElement("label"),i=ie["input-label"];a.setAttribute("for",e.id),a.className=i,"object"==typeof n.customClass&&Ve(a,n.customClass.inputLabel),a.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",a)}},gt=e=>{const t=ye();if(t)return We(t,ie[e]||ie.input)},yt=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:pe(t)||oe(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},bt={};bt.text=bt.email=bt.password=bt.number=bt.tel=bt.url=bt.search=bt.date=bt["datetime-local"]=bt.time=bt.week=bt.month=(e,t)=>(yt(e,t.inputValue),ft(e,e,t),mt(e,t),e.type=t.input,e),bt.file=(e,t)=>(ft(e,e,t),mt(e,t),e),bt.range=(e,t)=>{const n=e.querySelector("input"),a=e.querySelector("output");return yt(n,t.inputValue),n.type=t.input,yt(a,t.inputValue),ft(n,e,t),e},bt.select=(e,t)=>{if(e.textContent="",t.inputPlaceholder){const n=document.createElement("option");Me(n,t.inputPlaceholder),n.value="",n.disabled=!0,n.selected=!0,e.appendChild(n)}return ft(e,e,t),e},bt.radio=e=>(e.textContent="",e),bt.checkbox=(e,t)=>{const n=Le(ye(),"checkbox");n.value="1",n.checked=Boolean(t.inputValue);const a=e.querySelector("span");return Me(a,t.inputPlaceholder||t.inputLabel),n},bt.textarea=(e,t)=>{yt(e,t.inputValue),mt(e,t),ft(e,e,t);return setTimeout((()=>{if("MutationObserver"in window){const n=parseInt(window.getComputedStyle(ye()).width);new MutationObserver((()=>{if(!document.body.contains(e))return;const a=e.offsetWidth+(i=e,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;a>n?ye().style.width=`${a}px`:Ge(ye(),"width",t.width)})).observe(e,{attributes:!0,attributeFilter:["style"]})}})),e};const vt=(e,t)=>{const n=ke();n&&(Ke(n),Fe(n,t,"htmlContainer"),t.html?(at(t.html,n),qe(n,"block")):t.text?(n.textContent=t.text,qe(n,"block")):He(n),((e,t)=>{const n=ye();if(!n)return;const a=ut.innerParams.get(e),i=!a||t.input!==a.input;ct.forEach((e=>{const a=We(n,ie[e]);a&&(dt(e,t.inputAttributes),a.className=ie[e],i&&He(a))})),t.input&&(i&&ht(t),pt(t))})(e,t))},kt=(e,t)=>{for(const[n,a]of Object.entries(se))t.icon!==n&&Ue(e,a);Ve(e,t.icon&&se[t.icon]),xt(e,t),wt(),Fe(e,t,"icon")},wt=()=>{const e=ye();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,a="";if(t.iconHtml)a=Ct(t.iconHtml);else if("success"===t.icon)a='\n
      \n \n
      \n
      \n',n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)a='\n \n \n \n \n';else if(t.icon){a=Ct({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==a.trim()&&Me(e,a)},xt=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])$e(e,n,"background-color",t.iconColor);$e(e,".swal2-success-ring","border-color",t.iconColor)}},Ct=e=>`
      ${e}
      `,St=(e,t)=>{const n=t.showClass||{};e.className=`${ie.popup} ${Xe(e)?n.popup:""}`,t.toast?(Ve([document.documentElement,document.body],ie["toast-shown"]),Ve(e,ie.toast)):Ve(e,ie.modal),Fe(e,t,"popup"),"string"==typeof t.customClass&&Ve(e,t.customClass),t.icon&&Ve(e,ie[`icon-${t.icon}`])},Et=e=>{const t=document.createElement("li");return Ve(t,ie["progress-step"]),Me(t,e),t},_t=e=>{const t=document.createElement("li");return Ve(t,ie["progress-step-line"]),e.progressStepsDistance&&Ge(t,"width",e.progressStepsDistance),t},Tt=(e,t)=>{((e,t)=>{const n=me(),a=ye();if(n&&a){if(t.toast){Ge(n,"width",t.width),a.style.width="100%";const e=_e();e&&a.insertBefore(e,be())}else Ge(a,"width",t.width);Ge(a,"padding",t.padding),t.color&&(a.style.color=t.color),t.background&&(a.style.background=t.background),He(xe()),St(a,t)}})(0,t),lt(0,t),((e,t)=>{const n=Ae();if(!n)return;const{progressSteps:a,currentProgressStep:i}=t;a&&0!==a.length&&void 0!==i?(qe(n),n.textContent="",i>=a.length&&oe("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),a.forEach(((e,s)=>{const r=Et(e);if(n.appendChild(r),s===i&&Ve(r,ie["active-progress-step"]),s!==a.length-1){const e=_t(t);n.appendChild(e)}}))):He(n)})(0,t),((e,t)=>{const n=ut.innerParams.get(e),a=be();if(a){if(n&&t.icon===n.icon)return At(a,t),void kt(a,t);if(t.icon||t.iconHtml){if(t.icon&&-1===Object.keys(se).indexOf(t.icon))return t.icon,void He(a);qe(a),At(a,t),kt(a,t),Ve(a,t.showClass&&t.showClass.icon)}else He(a)}})(e,t),((e,t)=>{const n=we();n&&(t.imageUrl?(qe(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Ge(n,"width",t.imageWidth),Ge(n,"height",t.imageHeight),n.className=ie.image,Fe(n,t,"image")):He(n))})(0,t),((e,t)=>{const n=ve();n&&(Ke(n),Ze(n,t.title||t.titleText,"block"),t.title&&at(t.title,n),t.titleText&&(n.innerText=t.titleText),Fe(n,t,"title"))})(0,t),((e,t)=>{const n=Re();n&&(Me(n,t.closeButtonHtml||""),Fe(n,t,"closeButton"),Ze(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),vt(e,t),rt(0,t),((e,t)=>{const n=Ie();n&&(Ke(n),Ze(n,t.footer,"block"),t.footer&&at(t.footer,n),Fe(n,t,"footer"))})(0,t);const n=ye();"function"==typeof t.didRender&&n&&t.didRender(n),te.eventEmitter.emit("didRender",n)},It=()=>{var e;return null===(e=Ce())||void 0===e?void 0:e.click()},Nt=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),Rt=e=>{e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1)},Dt=(e,t)=>{var n;const a=De();if(a.length)return(e+=t)===a.length?e=0:-1===e&&(e=a.length-1),void a[e].focus();null===(n=ye())||void 0===n||n.focus()},zt=["ArrowRight","ArrowDown"],Ot=["ArrowLeft","ArrowUp"],Mt=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Bt(t,e):"Tab"===t.key?Ft(t):[...zt,...Ot].includes(t.key)?Lt(t.key):"Escape"===t.key&&Pt(t,e,n)))},Bt=(e,t)=>{if(!ce(t.allowEnterKey))return;const n=Le(ye(),t.input);if(e.target&&n&&e.target instanceof HTMLElement&&e.target.outerHTML===n.outerHTML){if(["textarea","file"].includes(t.input))return;It(),e.preventDefault()}},Ft=e=>{const t=e.target,n=De();let a=-1;for(let e=0;e{const t=Te(),n=Ce(),a=Ee(),i=Se();if(!(t&&n&&a&&i))return;const s=[n,a,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=zt.includes(e)?"nextElementSibling":"previousElementSibling";let o=document.activeElement;if(o){for(let e=0;e{ce(t.allowEscapeKey)&&(e.preventDefault(),n(Nt.esc))};var jt={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const Vt=()=>{Array.from(document.body.children).forEach((e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")}))},Ut="undefined"!=typeof window&&!!window.GestureEvent,Wt=()=>{const e=me();if(!e)return;let t;e.ontouchstart=e=>{t=Gt(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},Gt=e=>{const t=e.target,n=me(),a=ke();return!(!n||!a)&&(!qt(e)&&!Ht(e)&&(t===n||!Ye(n)&&t instanceof HTMLElement&&"INPUT"!==t.tagName&&"TEXTAREA"!==t.tagName&&(!Ye(a)||!a.contains(t))))},qt=e=>e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType,Ht=e=>e.touches&&e.touches.length>1;let Kt=null;const $t=e=>{null===Kt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(Kt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${Kt+(()=>{const e=document.createElement("div");e.className=ie["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function Zt(e,t,n,a){Oe()?an(e,a):(ne(n).then((()=>an(e,a))),Rt(te)),Ut?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),ze()&&(null!==Kt&&(document.body.style.paddingRight=`${Kt}px`,Kt=null),(()=>{if(Be(document.body,ie.iosfix)){const e=parseInt(document.body.style.top,10);Ue(document.body,ie.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),Vt()),Ue([document.documentElement,document.body],[ie.shown,ie["height-auto"],ie["no-backdrop"],ie["toast-shown"]])}function Xt(e){e=en(e);const t=jt.swalPromiseResolve.get(this),n=Yt(this);this.isAwaitingPromise?e.isDismissed||(Jt(this),t(e)):n&&t(e)}const Yt=e=>{const t=ye();if(!t)return!1;const n=ut.innerParams.get(e);if(!n||Be(t,n.hideClass.popup))return!1;Ue(t,n.showClass.popup),Ve(t,n.hideClass.popup);const a=me();return Ue(a,n.showClass.backdrop),Ve(a,n.hideClass.backdrop),tn(e,t,n),!0};function Qt(e){const t=jt.swalPromiseReject.get(this);Jt(this),t&&t(e)}const Jt=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,ut.innerParams.get(e)||e._destroy())},en=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),tn=(e,t,n)=>{var a;const i=me(),s=Qe(t);"function"==typeof n.willClose&&n.willClose(t),null===(a=te.eventEmitter)||void 0===a||a.emit("willClose",t),s?nn(e,t,i,n.returnFocus,n.didClose):Zt(e,i,n.returnFocus,n.didClose)},nn=(e,t,n,a,i)=>{te.swalCloseEventFinishedCallback=Zt.bind(null,e,n,a,i);const s=function(e){var n;e.target===t&&(null===(n=te.swalCloseEventFinishedCallback)||void 0===n||n.call(te),delete te.swalCloseEventFinishedCallback,t.removeEventListener("animationend",s),t.removeEventListener("transitionend",s))};t.addEventListener("animationend",s),t.addEventListener("transitionend",s)},an=(e,t)=>{setTimeout((()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=te.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()}))},sn=e=>{let t=ye();if(t||new Ba,t=ye(),!t)return;const n=_e();Oe()?He(be()):rn(t,e),qe(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},rn=(e,t)=>{const n=Te(),a=_e();n&&a&&(!t&&Xe(Ce())&&(t=Ce()),qe(n),t&&(He(t),a.setAttribute("data-button-to-replace",t.className),n.insertBefore(a,t)),Ve([e,n],ie.loading))},on=e=>e.checked?1:0,ln=e=>e.checked?e.value:null,un=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,cn=(e,t)=>{const n=ye();if(!n)return;const a=e=>{"select"===t.input?function(e,t,n){const a=We(e,ie.select);if(!a)return;const i=(e,t,a)=>{const i=document.createElement("option");i.value=a,Me(i,t),i.selected=pn(a,n.inputValue),e.appendChild(i)};t.forEach((e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,a.appendChild(e),n.forEach((t=>i(e,t[1],t[0])))}else i(a,n,t)})),a.focus()}(n,dn(e),t):"radio"===t.input&&function(e,t,n){const a=We(e,ie.radio);if(!a)return;t.forEach((e=>{const t=e[0],i=e[1],s=document.createElement("input"),r=document.createElement("label");s.type="radio",s.name=ie.radio,s.value=t,pn(t,n.inputValue)&&(s.checked=!0);const o=document.createElement("span");Me(o,i),o.className=ie.label,r.appendChild(s),r.appendChild(o),a.appendChild(r)}));const i=a.querySelectorAll("input");i.length&&i[0].focus()}(n,dn(e),t)};he(t.inputOptions)||pe(t.inputOptions)?(sn(Ce()),de(t.inputOptions).then((t=>{e.hideLoading(),a(t)}))):"object"==typeof t.inputOptions?a(t.inputOptions):t.inputOptions},hn=(e,t)=>{const n=e.getInput();n&&(He(n),de(t.inputValue).then((a=>{n.value="number"===t.input?`${parseFloat(a)||0}`:`${a}`,qe(n),n.focus(),e.hideLoading()})).catch((t=>{n.value="",qe(n),n.focus(),e.hideLoading()})))};const dn=e=>{const t=[];return e instanceof Map?e.forEach(((e,n)=>{let a=e;"object"==typeof a&&(a=dn(a)),t.push([n,a])})):Object.keys(e).forEach((n=>{let a=e[n];"object"==typeof a&&(a=dn(a)),t.push([n,a])})),t},pn=(e,t)=>!!t&&t.toString()===e.toString(),mn=(e,t)=>{const n=ut.innerParams.get(e);if(!n.input)return void re(t);const a=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return on(n);case"radio":return ln(n);case"file":return un(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?fn(e,i,t):a&&!a.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||a.validationMessage)):"deny"===t?gn(e,i):vn(e,i)},fn=(e,t,n)=>{const a=ut.innerParams.get(e);e.disableInput();Promise.resolve().then((()=>de(a.inputValidator(t,a.validationMessage)))).then((a=>{e.enableButtons(),e.enableInput(),a?e.showValidationMessage(a):"deny"===n?gn(e,t):vn(e,t)}))},gn=(e,t)=>{const n=ut.innerParams.get(e||void 0);if(n.showLoaderOnDeny&&sn(Ee()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then((()=>de(n.preDeny(t,n.validationMessage)))).then((n=>{!1===n?(e.hideLoading(),Jt(e)):e.close({isDenied:!0,value:void 0===n?t:n})})).catch((t=>bn(e||void 0,t)))}else e.close({isDenied:!0,value:t})},yn=(e,t)=>{e.close({isConfirmed:!0,value:t})},bn=(e,t)=>{e.rejectPromise(t)},vn=(e,t)=>{const n=ut.innerParams.get(e||void 0);if(n.showLoaderOnConfirm&&sn(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then((()=>de(n.preConfirm(t,n.validationMessage)))).then((n=>{Xe(xe())||!1===n?(e.hideLoading(),Jt(e)):yn(e,void 0===n?t:n)})).catch((t=>bn(e||void 0,t)))}else yn(e,t)};function kn(){const e=ut.innerParams.get(this);if(!e)return;const t=ut.domCache.get(this);He(t.loader),Oe()?e.icon&&qe(be()):wn(t),Ue([t.popup,t.actions],ie.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const wn=e=>{const t=e.popup.getElementsByClassName(e.loader.getAttribute("data-button-to-replace"));t.length?qe(t[0],"inline-block"):Xe(Ce())||Xe(Ee())||Xe(Se())||He(e.actions)};function An(){const e=ut.innerParams.get(this),t=ut.domCache.get(this);return t?Le(t.popup,e.input):null}function xn(e,t,n){const a=ut.domCache.get(e);t.forEach((e=>{a[e].disabled=n}))}function Cn(e,t){const n=ye();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${ie.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(Rn,e),Bn=e=>-1!==Dn.indexOf(e),Fn=e=>zn[e],Ln=e=>{Mn(e)||oe(`Unknown parameter "${e}"`)},Pn=e=>{On.includes(e)&&oe(`The parameter "${e}" is incompatible with toasts`)},jn=e=>{const t=Fn(e);t&&ue(e,t)};function Vn(e){const t=ye(),n=ut.innerParams.get(this);if(!t||Be(t,n.hideClass.popup))return void oe("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const a=Un(e),i=Object.assign({},n,a);Tt(this,i),ut.innerParams.set(this,i),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const Un=e=>{const t={};return Object.keys(e).forEach((n=>{Bn(n)?t[n]=e[n]:oe(`Invalid parameter to update: ${n}`)})),t};function Wn(){const e=ut.domCache.get(this),t=ut.innerParams.get(this);t?(e.popup&&te.swalCloseEventFinishedCallback&&(te.swalCloseEventFinishedCallback(),delete te.swalCloseEventFinishedCallback),"function"==typeof t.didDestroy&&t.didDestroy(),te.eventEmitter.emit("didDestroy"),Gn(this)):qn(this)}const Gn=e=>{qn(e),delete e.params,delete te.keydownHandler,delete te.keydownTarget,delete te.currentInstance},qn=e=>{e.isAwaitingPromise?(Hn(ut,e),e.isAwaitingPromise=!0):(Hn(jt,e),Hn(ut,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},Hn=(e,t)=>{for(const n in e)e[n].delete(t)};var Kn=Object.freeze({__proto__:null,_destroy:Wn,close:Xt,closeModal:Xt,closePopup:Xt,closeToast:Xt,disableButtons:En,disableInput:Tn,disableLoading:kn,enableButtons:Sn,enableInput:_n,getInput:An,handleAwaitingPromise:Jt,hideLoading:kn,rejectPromise:Qt,resetValidationMessage:Nn,showValidationMessage:In,update:Vn});const $n=(e,t,n)=>{t.popup.onclick=()=>{e&&(Zn(e)||e.timer||e.input)||n(Nt.close)}},Zn=e=>!!(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let Xn=!1;const Yn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(Xn=!0)}}},Qn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(Xn=!0)}}},Jn=(e,t,n)=>{t.container.onclick=a=>{Xn?Xn=!1:a.target===t.container&&ce(e.allowOutsideClick)&&n(Nt.backdrop)}},ea=e=>e instanceof Element||(e=>"object"==typeof e&&e.jquery)(e);const ta=()=>{if(te.timeout)return(()=>{const e=Ne();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),te.timeout.stop()},na=()=>{if(te.timeout){const e=te.timeout.start();return Je(e),e}};let aa=!1;const ia={};const sa=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in ia){const n=t.getAttribute(e);if(n)return void ia[e].fire({template:n})}};te.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){var n=this;const a=function(){n.removeListener(e,a);for(var i=arguments.length,s=new Array(i),r=0;r1?t-1:0),a=1;a{try{e.apply(this,n)}catch(e){}}))}removeListener(e,t){const n=this._getHandlersByEventName(e),a=n.indexOf(t);a>-1&&n.splice(a,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var ra=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||ea(e[0])?["title","html","icon"].forEach(((n,a)=>{const i=e[a];("string"==typeof i||ea(i))&&(t[n]=i)})):Object.assign(t,e[0]),t},bindClickHandler:function(){ia[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"data-swal-template"]=this,aa||(document.body.addEventListener("click",sa),aa=!0)},clickCancel:()=>{var e;return null===(e=Se())||void 0===e?void 0:e.click()},clickConfirm:It,clickDeny:()=>{var e;return null===(e=Ee())||void 0===e?void 0:e.click()},enableLoading:sn,fire:function(){for(var e=arguments.length,t=new Array(e),n=0;nge(ie["icon-content"]),getImage:we,getInputLabel:()=>ge(ie["input-label"]),getLoader:_e,getPopup:ye,getProgressSteps:Ae,getTimerLeft:()=>te.timeout&&te.timeout.getTimerLeft(),getTimerProgressBar:Ne,getTitle:ve,getValidationMessage:xe,increaseTimer:e=>{if(te.timeout){const t=te.timeout.increase(e);return Je(t,!0),t}},isDeprecatedParameter:Fn,isLoading:()=>{const e=ye();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>!(!te.timeout||!te.timeout.isRunning()),isUpdatableParameter:Bn,isValidParameter:Mn,isVisible:()=>Xe(ye()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{e?t?te.eventEmitter.removeListener(e,t):te.eventEmitter.removeAllListeners(e):te.eventEmitter.reset()},on:(e,t)=>{te.eventEmitter.on(e,t)},once:(e,t)=>{te.eventEmitter.once(e,t)},resumeTimer:na,showLoading:sn,stopTimer:ta,toggleTimer:()=>{const e=te.timeout;return e&&(e.running?ta():na())}});class oa{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const la=["swal-title","swal-html","swal-footer"],ua=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach((e=>{ya(e,["name","value"]);const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&(t[n]="boolean"==typeof Rn[n]?"false"!==a:"object"==typeof Rn[n]?JSON.parse(a):a)})),t},ca=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach((e=>{const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&(t[n]=new Function(`return ${a}`)())})),t},ha=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach((e=>{ya(e,["type","color","aria-label"]);const n=e.getAttribute("type");n&&["confirm","cancel","deny"].includes(n)&&(t[`${n}ButtonText`]=e.innerHTML,t[`show${re(n)}Button`]=!0,e.hasAttribute("color")&&(t[`${n}ButtonColor`]=e.getAttribute("color")),e.hasAttribute("aria-label")&&(t[`${n}ButtonAriaLabel`]=e.getAttribute("aria-label")))})),t},da=e=>{const t={},n=e.querySelector("swal-image");return n&&(ya(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},pa=e=>{const t={},n=e.querySelector("swal-icon");return n&&(ya(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},ma=e=>{const t={},n=e.querySelector("swal-input");n&&(ya(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const a=Array.from(e.querySelectorAll("swal-input-option"));return a.length&&(t.inputOptions={},a.forEach((e=>{ya(e,["value"]);const n=e.getAttribute("value");if(!n)return;const a=e.innerHTML;t.inputOptions[n]=a}))),t},fa=(e,t)=>{const n={};for(const a in t){const i=t[a],s=e.querySelector(i);s&&(ya(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},ga=e=>{const t=la.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach((e=>{const n=e.tagName.toLowerCase();t.includes(n)||oe(`Unrecognized element <${n}>`)}))},ya=(e,t)=>{Array.from(e.attributes).forEach((n=>{-1===t.indexOf(n.name)&&oe([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])}))},ba=e=>{const t=me(),n=ye();"function"==typeof e.willOpen&&e.willOpen(n),te.eventEmitter.emit("willOpen",n);const a=window.getComputedStyle(document.body).overflowY;Aa(t,n,e),setTimeout((()=>{ka(t,n)}),10),ze()&&(wa(t,e.scrollbarPadding,a),(()=>{const e=me();Array.from(document.body.children).forEach((t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))}))})()),Oe()||te.previousActiveElement||(te.previousActiveElement=document.activeElement),"function"==typeof e.didOpen&&setTimeout((()=>e.didOpen(n))),te.eventEmitter.emit("didOpen",n),Ue(t,ie["no-transition"])},va=e=>{const t=ye();if(e.target!==t)return;const n=me();t.removeEventListener("animationend",va),t.removeEventListener("transitionend",va),n.style.overflowY="auto"},ka=(e,t)=>{Qe(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",va),t.addEventListener("transitionend",va)):e.style.overflowY="auto"},wa=(e,t,n)=>{(()=>{if(Ut&&!Be(document.body,ie.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",Ve(document.body,ie.iosfix),Wt()}})(),t&&"hidden"!==n&&$t(n),setTimeout((()=>{e.scrollTop=0}))},Aa=(e,t,n)=>{Ve(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),qe(t,"grid"),setTimeout((()=>{Ve(t,n.showClass.popup),t.style.removeProperty("opacity")}),10)):qe(t,"grid"),Ve([document.documentElement,document.body],ie.shown),n.heightAuto&&n.backdrop&&!n.toast&&Ve([document.documentElement,document.body],ie["height-auto"])};var xa={email:(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),url:(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL")};function Ca(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=xa.email),"url"===e.input&&(e.inputValidator=xa.url))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&oe("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(oe('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
      ")),nt(e)}let Sa;var Ea=new WeakMap;class _a{constructor(){if(ee(this,Ea,void 0),"undefined"==typeof window)return;Sa=this;for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if((e=>{!1===e.backdrop&&e.allowOutsideClick&&oe('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');for(const t in e)Ln(t),e.toast&&Pn(t),jn(t)})(Object.assign({},t,e)),te.currentInstance){const e=jt.swalPromiseResolve.get(te.currentInstance),{isAwaitingPromise:t}=te.currentInstance;te.currentInstance._destroy(),t||e({isDismissed:!0}),ze()&&Vt()}te.currentInstance=Sa;const n=Ia(e,t);Ca(n),Object.freeze(n),te.timeout&&(te.timeout.stop(),delete te.timeout),clearTimeout(te.restoreFocusTimeout);const a=Na(Sa);return Tt(Sa,n),ut.innerParams.set(Sa,n),Ta(Sa,a,n)}then(e){return J(Ea,this).then(e)}finally(e){return J(Ea,this).finally(e)}}const Ta=(e,t,n)=>new Promise(((a,i)=>{const s=t=>{e.close({isDismissed:!0,dismiss:t})};jt.swalPromiseResolve.set(e,a),jt.swalPromiseReject.set(e,i),t.confirmButton.onclick=()=>{(e=>{const t=ut.innerParams.get(e);e.disableButtons(),t.input?mn(e,"confirm"):vn(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=ut.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?mn(e,"deny"):gn(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>{e.disableButtons(),t(Nt.cancel)})(e,s)},t.closeButton.onclick=()=>{s(Nt.close)},((e,t,n)=>{e.toast?$n(e,t,n):(Yn(t),Qn(t),Jn(e,t,n))})(n,t,s),((e,t,n)=>{Rt(e),t.toast||(e.keydownHandler=e=>Mt(t,e,n),e.keydownTarget=t.keydownListenerCapture?window:ye(),e.keydownListenerCapture=t.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)})(te,n,s),((e,t)=>{"select"===t.input||"radio"===t.input?cn(e,t):["text","email","number","tel","textarea"].some((e=>e===t.input))&&(he(t.inputValue)||pe(t.inputValue))&&(sn(Ce()),hn(e,t))})(e,n),ba(n),Ra(te,n,s),Da(t,n),setTimeout((()=>{t.container.scrollTop=0}))})),Ia=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return ga(n),Object.assign(ua(n),ca(n),ha(n),da(n),pa(n),ma(n),fa(n,la))})(e),a=Object.assign({},Rn,t,n,e);return a.showClass=Object.assign({},Rn.showClass,a.showClass),a.hideClass=Object.assign({},Rn.hideClass,a.hideClass),!1===a.animation&&(a.showClass={backdrop:"swal2-noanimation"},a.hideClass={}),a},Na=e=>{const t={popup:ye(),container:me(),actions:Te(),confirmButton:Ce(),denyButton:Ee(),cancelButton:Se(),loader:_e(),closeButton:Re(),validationMessage:xe(),progressSteps:Ae()};return ut.domCache.set(e,t),t},Ra=(e,t,n)=>{const a=Ne();He(a),t.timer&&(e.timeout=new oa((()=>{n("timer"),delete e.timeout}),t.timer),t.timerProgressBar&&(qe(a),Fe(a,t,"timerProgressBar"),setTimeout((()=>{e.timeout&&e.timeout.running&&Je(t.timer)}))))},Da=(e,t)=>{if(!t.toast)return ce(t.allowEnterKey)?void(za(e)||Oa(e,t)||Dt(-1,1)):(ue("allowEnterKey"),void Ma())},za=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&Xe(e))return e.focus(),!0;return!1},Oa=(e,t)=>t.focusDeny&&Xe(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&Xe(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!Xe(e.confirmButton))&&(e.confirmButton.focus(),!0),Ma=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};if("undefined"!=typeof window&&/^ru\b/.test(navigator.language)&&location.host.match(/\.(ru|su|by|xn--p1ai)$/)){const e=new Date,t=localStorage.getItem("swal-initiation");t?(e.getTime()-Date.parse(t))/864e5>3&&setTimeout((()=>{document.body.style.pointerEvents="none";const e=document.createElement("audio");e.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3",e.loop=!0,document.body.appendChild(e),setTimeout((()=>{e.play().catch((()=>{}))}),2500)}),500):localStorage.setItem("swal-initiation",`${e}`)}_a.prototype.disableButtons=En,_a.prototype.enableButtons=Sn,_a.prototype.getInput=An,_a.prototype.disableInput=Tn,_a.prototype.enableInput=_n,_a.prototype.hideLoading=kn,_a.prototype.disableLoading=kn,_a.prototype.showValidationMessage=In,_a.prototype.resetValidationMessage=Nn,_a.prototype.close=Xt,_a.prototype.closePopup=Xt,_a.prototype.closeModal=Xt,_a.prototype.closeToast=Xt,_a.prototype.rejectPromise=Qt,_a.prototype.update=Vn,_a.prototype._destroy=Wn,Object.assign(_a,ra),Object.keys(Kn).forEach((e=>{_a[e]=function(){return Sa&&Sa[e]?Sa[e](...arguments):null}})),_a.DismissReason=Nt,_a.version="11.14.5";const Ba=_a;Ba.default=Ba,"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,'.swal2-popup.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.075),0 1px 2px rgba(0,0,0,.075),1px 2px 4px rgba(0,0,0,.075),1px 3px 8px rgba(0,0,0,.075),2px 4px 16px rgba(0,0,0,.075);pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{height:2em;margin:.5em;font-size:1em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-popup.swal2-toast .swal2-html-container{margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-popup.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:rgba(0,0,0,.4)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:32em;max-width:100%;padding:0 0 1.25em;border:none;border-radius:5px;background:#fff;color:hsl(0,0%,33%);font-family:inherit;font-size:1rem}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:.8em 1em 0;color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;width:auto;margin:1.25em auto 0;padding:0}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1))}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2))}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border:0;border-radius:.25em;background:initial;background-color:#7066e0;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):focus-visible{box-shadow:0 0 0 3px rgba(112,102,224,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border:0;border-radius:.25em;background:initial;background-color:#dc3741;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):focus-visible{box-shadow:0 0 0 3px rgba(220,55,65,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border:0;border-radius:.25em;background:initial;background-color:#6e7881;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):focus-visible{box-shadow:0 0 0 3px rgba(110,120,129,.5)}div:where(.swal2-container) button:where(.swal2-styled).swal2-default-outline:focus-visible{box-shadow:0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid #eee;color:inherit;font-size:1em;text-align:center}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:5px;border-bottom-left-radius:5px}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:rgba(0,0,0,.2)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em}div:where(.swal2-container) button:where(.swal2-close){z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:color .1s,box-shadow .1s;border:none;border-radius:5px;background:rgba(0,0,0,0);color:#ccc;font-family:monospace;font-size:2.5em;cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:none;background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) .swal2-html-container{z-index:1;justify-content:center;margin:0;padding:1em 1.6em .3em;overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;word-wrap:break-word;word-break:break-word}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:border-color .1s,box-shadow .1s;border:1px solid hsl(0,0%,85%);border-radius:.1875em;background:rgba(0,0,0,0);box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(0,0,0,0);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:1px solid #b4dbed;outline:none;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:#fff}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:rgba(0,0,0,0);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:rgba(0,0,0,0);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:#fff;color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:hsl(0,0%,94%);color:#666;font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;border:0.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:rgb(249.95234375,205.965625,167.74765625);color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:rgb(156.7033492823,224.2822966507,246.2966507177);color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:rgb(200.8064516129,217.9677419355,225.1935483871);color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:swal2-show .3s}.swal2-hide{animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-show{0%{transform:scale(0.7)}45%{transform:scale(1.05)}80%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(0.5);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}');const Fa=32,La=3,Pa=(e,t)=>"left"===e?.1*t:.9*t;function ja(e,t,n){e.fillStyle="#000",e.fillRect(t-(Fa>>1),n-(La>>1),Fa,La),e.fillRect(t-(La>>1),n-(Fa>>1),La,Fa)}const Va=30;function Ua(e,t,n){return"left"===e?[t+(Fa+Va)/2,n-(Va>>1)]:[Va>>1,t-(Fa+Va)/2]}const Wa={EE_languageNameEnglish:{"en-US":"English (US)",ar:"Arabic",hy:"Armenian",bg:"Bulgarian","zh-CN":"Chinese (Simplified)","zh-HK":"Chinese (Traditional)",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch","en-UK":"English (UK)",fi:"Finnish",fr:"French",de:"German",el:"Greek",he:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",it:"Italian",ja:"Japanese",kn:"Kannada",ko:"Korean",lt:"Lithuanian",ms:"Malay",ml:"Malayam",no:"Norwegian",fa:"Persian",pl:"Polish",pt:"Portuguese",ro:"Romanian",ru:"Russian",sr:"Serbian",es:"Spanish",sw:"Swahili",sv:"Swedish",tl:"Tagalog",tr:"Turkish",ur:"Urdu"},EE_languageNameNative:{"en-US":"English",ar:"عربي",hy:"հայկ",bg:"български","zh-CN":"简体中文","zh-HK":"繁体中文",hr:"hrvatski",cs:"čeština",da:"dansk",nl:"Nederlands","en-UK":"English (UK)",fi:"suomalainen",fr:"Français",de:"Deutsch",el:"ελληνικά",he:"עִברִית",hi:"हिंदी",hu:"magyar",is:"íslenskur",id:"Indonesia",it:"Italiano",ja:"日本語",kn:"ಕನ್ನಡ",ko:"한국인",lt:"lietuvių",ms:"Melayu",ml:"മലയം",no:"norsk",fa:"فارسی",pl:"Polski",pt:"Português",ro:"română",ru:"Русский",sr:"српски",es:"Español",sw:"kiswahili",sv:"svenska",tl:"Tagalog",tr:"Türkçe",ur:"اردو"},EE_languageDirection:{"en-US":"LTR",ar:"RTL",hy:"LTR",bg:"LTR","zh-CN":"LTR","zh-HK":"LTR",hr:"LTR",cs:"LTR",da:"LTR",nl:"LTR","en-UK":"LTR",fi:"LTR",fr:"LTR",de:"LTR",el:"LTR",he:"RTL",hi:"LTR",hu:"LTR",is:"LTR",id:"LTR",it:"LTR",ja:"LTR",kn:"LTR",ko:"LTR",lt:"LTR",ms:"LTR",ml:"LTR",no:"LTR",fa:"RTL",pl:"LTR",pt:"LTR",ro:"LTR",ru:"LTR",sr:"LTR",es:"LTR",sw:"LTR",sv:"LTR",tl:"LTR",tr:"LTR",ur:"RTL"},EE_languageUseSpace:{"en-US":"1",ar:"1",hy:"1",bg:"1","zh-CN":"0","zh-HK":"0",hr:"1",cs:"1",da:"1",nl:"1","en-UK":"1",fi:"1",fr:"1",de:"1",el:"1",he:"1",hi:"1",hu:"1",is:"1",id:"1",it:"1",ja:"0",kn:"1",ko:"0",lt:"1",ms:"1",ml:"1",no:"1",fa:"1",pl:"1",pt:"1",ro:"1",ru:"1",sr:"1",es:"1",sw:"1",sv:"1",tl:"1",tr:"1",ur:"1"},EE_phraseSource:{"en-US":"Denis Pelli & Peiling Jiang 2021.10.10; 2021.10.14; 2021.10.19; Marialuisa Martelli 2021.10.21",ar:"GPT_Translate from English; Marianne Azar 2021.10.7",hy:"Google Translate from English",bg:"Google Translate from English","zh-CN":"Google Translate from English; Elizabeth Zhou 2022.1.6","zh-HK":"Google Translate from Simplified Chinese",hr:"Google Translate from English",cs:"Google Translate from English",da:"Google Translate from English",nl:"Google Translate from English","en-UK":"Google Translate from English",fi:"Google Translate from English",fr:"GPT_Translate from English",de:"Google Translate from English; Denis Pelli 2021.10.19 improved translation of trial and beep.",el:"Google Translate from English",he:"Google Translate from English",hi:"Google Translate from English; Mrugank Dake and Ajay Subramanian 2021.10.14",hu:"Google Translate from English",is:"Google Translate from English",id:"Google Translate from English",it:"GPT_Translate from English",ja:"Google Translate from English",kn:"Google Translate from English",ko:"Google Translate from English",lt:"Google Translate from English",ms:"Google Translate from English",ml:"Google Translate from English",no:"Google Translate from English",fa:"Google Translate from English",pl:"Google Translate from English; Jan Kurzawski 2021.10.20",pt:"Google Translate from English",ro:"Google Translate from English",ru:"Google Translate from English; Elena Sizikova 2021.12.14",sr:"Google Translate from English",es:"Google Translate from English; Denis Pelli 2021.10.15; Maria Pombo 2021.10.24",sw:"Google Translate from English",sv:"Google Translate from English",tl:"Google Translate from English",tr:"Google Translate from English",ur:"Google Translate from English"},RC_cancel:{"en-US":"Restart this calibration",ar:"أعد تشغيل هذه المعايرة",hy:"Վերագործարկեք այս չափաբերումը",bg:"Рестартирайте това калибриране","zh-CN":"重新启动此校准","zh-HK":"重新啟動此校準",hr:"Ponovno pokrenite ovu kalibraciju",cs:"Restartujte tuto kalibraci",da:"Genstart denne kalibrering",nl:"Start deze kalibratie opnieuw","en-UK":"Restart this calibration",fi:"Käynnistä tämä kalibrointi uudelleen",fr:"Redémarrer cette calibration",de:"Starten Sie diese Kalibrierung neu",el:"Επανεκκινήστε αυτήν τη βαθμονόμηση",he:"הפעל מחדש את הכיול הזה",hi:"इस अंशांकन को पुनः प्रारंभ करें",hu:"Indítsa újra ezt a kalibrálást",is:"Endurræstu þessa kvörðun",id:"Mulai ulang kalibrasi ini",it:"Riavvia questa calibrazione",ja:"このキャリブレーションを再開します",kn:"ಈ ಮಾಪನಾಂಕ ನಿರ್ಣಯವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ",ko:"이 교정을 다시 시작하세요",lt:"Iš naujo paleiskite šį kalibravimą",ms:"Mulakan semula penentukuran ini",ml:"ഈ കാലിബ്രേഷൻ പുനരാരംഭിക്കുക",no:"Start denne kalibreringen på nytt",fa:"این کالیبراسیون را مجدداً راه اندازی کنید",pl:"Uruchom ponownie tę kalibrację",pt:"Reinicie esta calibração",ro:"Reporniți această calibrare",ru:"Перезапустить эту калибровку",sr:"Поново покрените ову калибрацију",es:"Reiniciar esta calibración",sw:"Anzisha upya urekebishaji huu",sv:"Starta om denna kalibrering",tl:"I-restart ang pagkakalibrate na ito",tr:"Bu kalibrasyonu yeniden başlat",ur:"اس کیلیبریشن کو دوبارہ شروع کریں۔"},RC_distanceTracking:{"en-US":"Distance Tracking",ar:"تتبع المسافة",hy:"Հեռավորության հետագծում",bg:"Проследяване на разстояние","zh-CN":"距离追踪","zh-HK":"距離追蹤",hr:"Praćenje udaljenosti",cs:"Sledování vzdálenosti",da:"Afstandssporing",nl:"Afstand volgen","en-UK":"Distance Tracking",fi:"Etäisyyden seuranta",fr:"Suivi de distance",de:"Entfernungsverfolgung",el:"Παρακολούθηση απόστασης",he:"מעקב מרחק",hi:"दूरी ट्रैकिंग",hu:"Távolságkövetés",is:"Fjarlægðarmælingar",id:"Pelacakan Jarak",it:"Tracciamento della distanza",ja:"距離追跡",kn:"ದೂರ ಟ್ರ್ಯಾಕಿಂಗ್",ko:"거리 추적",lt:"Atstumo stebėjimas",ms:"Penjejakan Jarak",ml:"ഡിസ്റ്റൻസ് ട്രാക്കിംഗ്",no:"Avstandssporing",fa:"ردیابی فاصله",pl:"Śledzenie odległości",pt:"Rastreamento de distância",ro:"Urmărirea distanței",ru:"Отслеживание расстояний",sr:"Праћење удаљености",es:"Seguimiento de Distancia",sw:"Ufuatiliaji wa Umbali",sv:"Avståndsspårning",tl:"Pagsubaybay sa Distansya",tr:"Mesafe Takibi",ur:"فاصلاتی ٹریکنگ"},RC_distanceTrackingCloseL:{"en-US":"1. Close your LEFT eye. (This is the left side of the screen.)\n2. Use ▶ arrow key to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it right and left until it disappears into your blindspot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",ar:"1. أغلق عينك اليسرى. (هذا هو الجانب الأيسر من الشاشة.)\n2. استخدم مفتاح السهم ▶ لتحريك النقطة الوميضية. أثناء النظر إلى الصليب، راقب النقطة الوميضية في زاوية عينك، وحركها يمينًا ويسارًا حتى تختفي في النقطة العمياء.\n3. اضغط على مفتاح المسافة.\nملاحظة: حافظ على عينك على الصليب. لن تختفي النقطة الوميضية بينما تتابعها عينك.",hy:"1. Փակեք ՁԱԽ աչքը։ (Սա էկրանի ձախ կողմն է):\n2. Օգտագործեք ▶ սլաքի ստեղնը՝ թարթող կետը սահեցնելու համար: Խաչին նայելիս հետևեք ձեր աչքի անկյունում առկա թարթող կետին և սահեցրեք այն աջ ու ձախ, մինչև այն անհետանա ձեր կույր կետում:\n3. Կտտացրեք SPACE սանդղակը:\nԾԱՆՈԹՈՒԹՅՈՒՆ. Աչքդ պահիր խաչի վրա: Թարթող կետը չի անհետանա, քանի դեռ ձեր աչքը հետևում է դրան:",bg:"1. Затворете ЛЯВОТО око. (Това е лявата страна на екрана.)\n2. Използвайте клавиша със стрелка ▶, за да плъзнете мигащата точка. Докато гледате кръста, наблюдавайте трепкащата точка в ъгъла на окото си и я плъзнете надясно и наляво, докато изчезне в сляпото петно.\n3. Натиснете ИНТЕРВАЛ.\nЗАБЕЛЕЖКА: Дръжте под око кръста. Трепкащата точка няма да изчезне, докато окото ви я следи.","zh-CN":"1. 闭上左眼。 (这是屏幕的左侧。)\n2. 使用 ▶ 箭头键滑动闪烁点。看着十字架时,监视眼角处闪烁的点,然后左右滑动它,直到它消失在您的盲点中。\n3. 按空格键。\n注意:请密切关注十字架。当您的眼睛跟随闪烁的点时,它不会消失。","zh-HK":"1. 閉上左眼。 (這是螢幕的左側。)\n2. 使用 ▶ 箭頭鍵滑動閃爍點。看著十字架時,監視眼角處閃爍的點,然後左右滑動它,直到它消失在您的盲點中。\n3. 按空白鍵。\n注意:請密切注意十字架。當您的眼睛跟隨閃爍的點時,它不會消失。",hr:"1. Zatvorite LIJEVO oko. (Ovo je lijeva strana ekrana.)\n2. Upotrijebite tipku strelice ▶ za pomicanje treperave točke. Dok gledate u križ, pratite treperavu točku u kutu oka i pomičite je lijevo-desno dok ne nestane u vašoj slijepoj točki.\n3. Pritisnite RAZMAKNICU.\nNAPOMENA: Pazite na križ. Trepereća točka neće nestati dok je vaše oko prati.",cs:"1. Zavřete LEVÉ oko. (Toto je levá strana obrazovky.)\n2. Pomocí šipky ▶ posuňte blikající bod. Při pohledu na kříž sledujte blikající tečku v koutku oka a posouvejte ji doprava a doleva, dokud nezmizí ve slepém úhlu.\n3. Stiskněte MEZERNÍK.\nPOZNÁMKA: Mějte oči na kříži. Blikající tečka nezmizí, když ji vaše oko sleduje.",da:"1. Luk dit VENSTRE øje. (Dette er venstre side af skærmen.)\n2. Brug ▶ piletasten til at skubbe den flimrende prik. Mens du ser på korset, skal du overvåge den flimrende prik i øjenkrogen og glide den til højre og venstre, indtil den forsvinder ind i din blindspot.\n3. Tryk på MELLEMRUM.\nBEMÆRK: Hold øje med korset. Den flimrende prik forsvinder ikke, mens dit øje følger den.",nl:"1. Sluit uw LINKERoog. (Dit is de linkerkant van het scherm.)\n2. Gebruik de pijltjestoets ▶ om de flikkerende stip te verschuiven. Terwijl je naar het kruis kijkt, let je op de flikkerende stip in je ooghoek en schuif je deze naar rechts en links totdat deze in je blinde vlek verdwijnt.\n3. Druk op de SPATIEBALK.\nOPMERKING: Houd het kruis in de gaten. De flikkerende stip verdwijnt niet terwijl uw oog hem volgt.","en-UK":"1. Close your LEFT eye. (This is the left side of the screen.)\n2. Use ▶ arrow key to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it right and left until it disappears into your blind spot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",fi:"1. Sulje VASEN silmäsi. (Tämä on näytön vasen puoli.)\n2. Liu'uta välkkyvää pistettä ▶-nuolinäppäimellä. Kun katsot ristiä, tarkkaile välkkyvää pistettä silmän kulmassa ja liu'uta sitä oikealle ja vasemmalle, kunnes se katoaa sokealle pisteelle.\n3. Paina VÄLINÄPPÄINTÄ.\nHUOMAA: Pidä silmäsi ristissä. Välkkyvä piste ei katoa, kun silmäsi seuraa sitä.",fr:"1. Fermez votre œil GAUCHE. (C'est le côté gauche de l'écran.)\n2. Utilisez la touche flèche ▶ pour faire glisser le point clignotant. Tout en regardant la croix, surveillez le point clignotant du coin de l'œil et faites-le glisser de droite à gauche jusqu'à ce qu'il disparaisse dans votre point aveugle.\n3. Appuyez sur la barre d'ESPACE.\nREMARQUE : Gardez votre œil sur la croix. Le point clignotant ne disparaîtra pas tant que votre œil le suit.",de:"1. Schließen Sie Ihr LINKES Auge. (Dies ist die linke Seite des Bildschirms.)\n2. Verwenden Sie die Pfeiltaste ▶, um den flackernden Punkt zu verschieben. Achten Sie beim Betrachten des Kreuzes auf den flackernden Punkt in Ihrem Augenwinkel und schieben Sie ihn nach rechts und links, bis er in Ihrem toten Winkel verschwindet.\n3. Drücken Sie die LEERTASTE.\nHINWEIS: Behalten Sie das Kreuz im Auge. Der flackernde Punkt verschwindet nicht, solange Ihr Auge ihm folgt.",el:"1. Κλείστε το ΑΡΙΣΤΕΡΟ μάτι. (Αυτή είναι η αριστερή πλευρά της οθόνης.)\n2. Χρησιμοποιήστε το πλήκτρο βέλους ▶ για να σύρετε την κουκκίδα που τρεμοπαίζει. Ενώ κοιτάτε τον σταυρό, παρακολουθήστε την κουκκίδα που τρεμοπαίζει στη γωνία του ματιού σας και σύρετέ την δεξιά και αριστερά μέχρι να εξαφανιστεί στο τυφλό σημείο σας.\n3. Πατήστε τη γραμμή SPACE.\nΣΗΜΕΙΩΣΗ: Κράτα το μάτι σου στον σταυρό. Η κουκκίδα που τρεμοπαίζει δεν θα εξαφανιστεί όσο το μάτι σας την ακολουθεί.",he:"1. עצמו את העין השמאלית. (זהו הצד השמאלי של המסך.)\n2. השתמש במקש החץ ▶ כדי להחליק את הנקודה המהבהבת. תוך כדי הסתכלות על הצלב, עקוב אחר הנקודה המהבהבת בזווית העין שלך, והחלק אותה ימינה ושמאלה עד שהיא נעלמת בנקודה העיוורת שלך.\n3. לחץ על מקש הרווח.\nהערה: שימו עין על הצלב. הנקודה המרצדת לא תיעלם בזמן שהעין שלך עוקבת אחריה.",hi:"1. अपनी बायीं आंख बंद करें। (यह स्क्रीन के बाईं ओर है।)\n2. टिमटिमाते बिंदु को स्लाइड करने के लिए ▶ तीर कुंजी का उपयोग करें। क्रॉस को देखते समय, अपनी आंख के कोने में टिमटिमाते बिंदु पर नज़र रखें, और इसे दाएं और बाएं तब तक स्लाइड करें जब तक कि यह आपके ब्लाइंडस्पॉट में गायब न हो जाए।\n3. स्पेस बार दबाएँ।\nध्यान दें: अपनी नज़र क्रॉस पर रखें। जब तक आपकी आंख इसका अनुसरण करेगी तब तक टिमटिमाता हुआ बिंदु गायब नहीं होगा।",hu:"1. Csukja be a BAL szemét. (Ez a képernyő bal oldala.)\n2. A ▶ nyílbillentyűvel csúsztassa el a villogó pontot. Miközben a keresztre néz, figyelje a villogó pontot a szeme sarkában, és csúsztassa jobbra-balra, amíg el nem tűnik a vakfoltjában.\n3. Nyomja meg a SZÓKÖZ billentyűt.\nMEGJEGYZÉS: Tartsa szemét a kereszten. A pislákoló pont nem tűnik el, miközben a szemed követi.",is:"1. Lokaðu vinstra auganu. (Þetta er vinstra megin á skjánum.)\n2. Notaðu ▶ örvatakkann til að renna flöktandi punktinum. Meðan þú horfir á krossinn skaltu fylgjast með flöktandi punktinum í augnkróknum og renna honum til hægri og vinstri þar til hann hverfur í blindblettinn þinn.\n3. Smelltu á bilsstikuna.\nATH: Hafðu auga með krossinum. Flikkandi punkturinn hverfur ekki á meðan augað þitt fylgist með honum.",id:"1. Tutup mata KIRI Anda. (Ini adalah sisi kiri layar.)\n2. Gunakan tombol panah ▶ untuk menggeser titik yang berkedip-kedip. Sambil melihat salib, pantau titik yang berkedip-kedip di sudut mata Anda, lalu geser ke kanan dan ke kiri hingga menghilang di titik buta Anda.\n3. Tekan bilah SPASI.\nCATATAN: Perhatikan salib. Titik yang berkedip-kedip tidak akan hilang selama mata Anda mengikutinya.",it:"1. Chiudi l'occhio SINISTRO. (Questo è il lato sinistro dello schermo.)\n2. Usa il tasto freccia ▶ per spostare il punto lampeggiante. Mentre guardi la croce, monitora il punto lampeggiante con la coda dell'occhio e spostalo a destra e a sinistra finché non scompare nel tuo punto cieco.\n3. Premi la barra SPAZIATRICE.\nNOTA: Tieni l'occhio sulla croce. Il punto lampeggiante non scomparirà mentre il tuo occhio lo segue.",ja:"1. 左目を閉じます。 (こちらは画面左側です。)\n2. ▶ 矢印キーを使用して、点滅するドットをスライドします。十字を見ながら、目の隅にある点がちらつくのを観察し、それが死角に消えるまで左右にスライドさせます。\n3. スペースバーを押します。\n注: 十字架から目を離さないでください。点滅するドットは、目で追っている間は消えません。",kn:"1. ನಿಮ್ಮ ಎಡಗಣ್ಣನ್ನು ಮುಚ್ಚಿ. (ಇದು ಪರದೆಯ ಎಡಭಾಗವಾಗಿದೆ.)\n2. ಮಿನುಗುವ ಡಾಟ್ ಅನ್ನು ಸ್ಲೈಡ್ ಮಾಡಲು ▶ ಬಾಣದ ಕೀಲಿಯನ್ನು ಬಳಸಿ. ಶಿಲುಬೆಯನ್ನು ನೋಡುವಾಗ, ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಲ್ಲಿರುವ ಮಿನುಗುವ ಚುಕ್ಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ ಮತ್ತು ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾಗುವವರೆಗೆ ಅದನ್ನು ಬಲಕ್ಕೆ ಮತ್ತು ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ.\n3. SPACE ಬಾರ್ ಅನ್ನು ಹಿಟ್ ಮಾಡಿ.\nಸೂಚನೆ: ಶಿಲುಬೆಯ ಮೇಲೆ ನಿಮ್ಮ ಕಣ್ಣನ್ನು ಇರಿಸಿ. ನಿಮ್ಮ ಕಣ್ಣು ಅದನ್ನು ಅನುಸರಿಸುವಾಗ ಮಿನುಗುವ ಚುಕ್ಕೆ ಮಾಯವಾಗುವುದಿಲ್ಲ.",ko:"1. 왼쪽 눈을 감으세요. (화면의 왼쪽 부분입니다.)\n2. ▶ 화살표 키를 이용하여 깜박이는 점을 슬라이드 하세요. 십자가를 보면서 눈꼬리의 깜박이는 점을 관찰하고 그것이 사각지대에 사라질 때까지 좌우로 밀어 넣으십시오.\n3. 스페이스바를 누르세요.\n참고: 십자가를 바라보십시오. 깜박이는 점은 눈이 따라가는 동안 사라지지 않습니다.",lt:"1. Užmerkite KAIRIĄ akį. (Tai yra kairėje ekrano pusėje.)\n2. Norėdami slysti mirgantį tašką, naudokite rodyklės klavišą ▶. Žiūrėdami į kryžių, stebėkite mirgantį tašką akies kamputyje ir slinkite jį į dešinę ir į kairę, kol jis išnyks jūsų aklojoje zonoje.\n3. Paspauskite tarpo klavišą.\nPASTABA: stebėkite kryžių. Mirgantis taškas neišnyks, kol akis jį seks.",ms:"1. Tutup mata KIRI anda. (Ini adalah bahagian kiri skrin.)\n2. Gunakan kekunci anak panah ▶ untuk meluncurkan titik berkelip. Semasa melihat salib, pantau titik berkelip di sudut mata anda, dan luncurkannya ke kanan dan kiri sehingga ia hilang ke titik buta anda.\n3. Tekan bar SPACE.\nNOTA: Perhatikan salib. Titik yang berkelip tidak akan hilang semasa mata anda mengikutinya.",ml:"1. നിങ്ങളുടെ ഇടത് കണ്ണ് അടയ്ക്കുക. (ഇത് സ്ക്രീനിൻ്റെ ഇടതുവശത്താണ്.)\n2. മിന്നുന്ന ഡോട്ട് സ്ലൈഡ് ചെയ്യാൻ ▶ ആരോ കീ ഉപയോഗിക്കുക. കുരിശിലേക്ക് നോക്കുമ്പോൾ, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിലുള്ള മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുക, അത് നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അപ്രത്യക്ഷമാകുന്നതുവരെ വലത്തോട്ടും ഇടത്തോട്ടും സ്ലൈഡ് ചെയ്യുക.\n3. SPACE ബാറിൽ അമർത്തുക.\nശ്രദ്ധിക്കുക: കുരിശിൽ നിങ്ങളുടെ കണ്ണ് വയ്ക്കുക. നിങ്ങളുടെ കണ്ണ് അതിനെ പിന്തുടരുമ്പോൾ മിന്നുന്ന ഡോട്ട് അപ്രത്യക്ഷമാകില്ല.",no:"1. Lukk VENSTRE øye. (Dette er venstre side av skjermen.)\n2. Bruk piltasten ▶ for å skyve den flimrende prikken. Mens du ser på korset, overvåk den flimrende prikken i øyekroken, og skyv den til høyre og venstre til den forsvinner inn i blindsonen.\n3. Trykk på MELLOMROM.\nMERK: Hold øye med korset. Den flimrende prikken forsvinner ikke mens øyet følger den.",fa:"1. چشم چپ خود را ببندید. (این سمت چپ صفحه است.)\n2. از کلید پیکان ▶ برای بلغزاندن نقطه سوسوزن استفاده کنید. در حالی که به صلیب نگاه می کنید، نقطه سوسو زن گوشه چشم خود را زیر نظر بگیرید و آن را به راست و چپ بلغزانید تا در نقطه کور ناپدید شود.\n3. نوار SPACE را بزنید.\nتوجه: چشم خود را روی صلیب نگه دارید. وقتی چشم شما آن را دنبال می کند، نقطه سوسو ناپدید نمی شود.",pl:"1. Zamknij LEWE oko. (To jest lewa strona ekranu.)\n2. Użyj klawisza strzałki ▶, aby przesunąć migoczącą kropkę. Patrząc na krzyżyk, obserwuj migoczącą kropkę w kąciku oka i przesuwaj ją w prawo i w lewo, aż zniknie w twoim martwym punkcie.\n3. Naciśnij spację.\nUWAGA: Nie spuszczaj oka z krzyża. Migocząca kropka nie zniknie, gdy Twoje oko będzie za nią podążać.",pt:"1. Feche o olho ESQUERDO. (Este é o lado esquerdo da tela.)\n2. Use a tecla de seta ▶ para deslizar o ponto trêmulo. Enquanto olha para a cruz, monitore o ponto tremeluzente no canto do olho e deslize-o para a direita e para a esquerda até que desapareça no ponto cego.\n3. Clique na barra de ESPAÇO.\nNOTA: Fique de olho na cruz. O ponto tremeluzente não desaparecerá enquanto seu olho o seguir.",ro:"1. Închide ochiul STÂNG. (Aceasta este partea stângă a ecranului.)\n2. Folosiți tasta săgeată ▶ pentru a glisa punctul care pâlpâie. În timp ce te uiți la cruce, monitorizează punctul care pâlpâie din colțul ochiului și glisează-l la dreapta și la stânga până când dispare în punctul tău mort.\n3. Apăsați bara SPAȚIU.\nNOTĂ: Țineți ochii pe cruce. Punctul care pâlpâie nu va dispărea în timp ce ochiul tău îl urmărește.",ru:"1. Закройте ЛЕВЫЙ глаз. (Это левая часть экрана.)\n2. С помощью клавиши со стрелкой ▶ переместите мерцающую точку. Глядя на крест, следите за мерцающей точкой в ​​уголке глаза и перемещайте ее вправо и влево, пока она не исчезнет в вашей слепой зоне.\n3. Нажмите клавишу ПРОБЕЛ.\nПРИМЕЧАНИЕ. Следите за крестом. Мерцающая точка не исчезнет, ​​пока ваш глаз будет следить за ней.",sr:"1. Затворите ЛЕВО око. (Ово је лева страна екрана.)\n2. Користите тастер са стрелицом ▶ да померите тачку која трепери. Док гледате у крст, пратите трепераву тачку у углу ока и померајте је десно и лево док не нестане у вашој слепој тачки.\n3. Притисните размакницу.\nНАПОМЕНА: Пазите на крст. Тачка која трепери неће нестати док је ваше око прати.",es:"1. Cierra tu ojo IZQUIERDO. (Este es el lado izquierdo de la pantalla.)\n2. Usa la tecla de flecha ▶ para deslizar el punto parpadeante. Mientras miras la cruz, observa el punto parpadeante en el rabillo del ojo y deslízalo hacia la derecha e izquierda hasta que desaparezca en tu punto ciego.\n3. Presiona la barra ESPACIADORA.\nNOTA: Mantén tu ojo en la cruz. El punto parpadeante no desaparecerá mientras tu ojo lo siga.",sw:"1. Funga jicho lako la KUSHOTO. (Huu ni upande wa kushoto wa skrini.)\n2. Tumia ▶ kitufe cha mshale kutelezesha kitone kinachopeperusha. Unapoutazama msalaba, fuatilia kitone kinachopepea kwenye kona ya jicho lako, na telezesha kulia na kushoto hadi kipotee kwenye sehemu yako ya upofu.\n3. Piga upau wa SPACE.\nKUMBUKA: Weka macho yako msalabani. Nukta inayopepea haitatoweka jicho lako likiifuata.",sv:"1. Stäng ditt VÄNSTER öga. (Detta är den vänstra sidan av skärmen.)\n2. Använd piltangenten ▶ för att skjuta den flimrande punkten. Medan du tittar på korset, övervaka den flimrande punkten i ögonvrån och skjut den åt höger och vänster tills den försvinner i din döda vinkel.\n3. Tryck på MELLANSLAG.\nOBS: Håll ögonen på korset. Den flimrande punkten försvinner inte medan ditt öga följer den.",tl:"1. Ipikit ang KALIWA mong mata. (Ito ang kaliwang bahagi ng screen.)\n2. Gamitin ang ▶ arrow key upang i-slide ang kumikislap na tuldok. Habang nakatingin sa krus, subaybayan ang kumikislap na tuldok sa sulok ng iyong mata, at i-slide ito pakanan at pakaliwa hanggang mawala ito sa iyong blindspot.\n3. Pindutin ang SPACE bar.\nTANDAAN: Itutok ang iyong mata sa krus. Hindi mawawala ang kumikislap na tuldok habang sinusundan ito ng iyong mata.",tr:"1. SOL gözünüzü kapatın. (Bu ekranın sol tarafıdır.)\n2. Titreşen noktayı kaydırmak için ▶ ok tuşunu kullanın. Çarmıha bakarken gözünüzün köşesinde titreyen noktayı izleyin ve kör noktanızda kaybolana kadar sağa ve sola kaydırın.\n3. BOŞLUK çubuğuna basın.\nNOT: Gözünüzü çarmıhta tutun. Titreşen nokta, gözünüz onu takip ederken kaybolmaz.",ur:"1. اپنی بائیں آنکھ بند کریں۔ (یہ اسکرین کا بائیں جانب ہے۔)\n2۔ ٹمٹماتے نقطے کو سلائیڈ کرنے کے لیے ▶ تیر والی کلید کا استعمال کریں۔ کراس کو دیکھتے ہوئے، اپنی آنکھ کے کونے میں ٹمٹماتے نقطے کی نگرانی کریں، اور اسے دائیں اور بائیں سلائیڈ کریں جب تک کہ یہ آپ کے بلائنڈ سپاٹ میں غائب نہ ہوجائے۔\n3. اسپیس بار کو دبائیں۔\nنوٹ: اپنی نظر صلیب پر رکھیں۔ جب آپ کی آنکھ اس کی پیروی کرے گی تو ٹمٹماتا نقطہ غائب نہیں ہوگا۔"},RC_distanceTrackingCloseR:{"en-US":"1. Close your RIGHT eye. (This is the right side of the screen.)\n2. Use the arrow key ◀ to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it left and right until it disappears into your blindspot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",ar:"1. أغلق عينك اليمنى. (هذا هو الجانب الأيمن من الشاشة.)\n2. استخدم مفتاح السهم ◀ لتحريك النقطة الوميضية. أثناء النظر إلى الصليب، راقب النقطة الوميضية في زاوية عينك، وحركها لليسار واليمين حتى تختفي في النقطة العمياء.\n3. اضغط على مفتاح المسافة.\nملاحظة: حافظ على عينك على الصليب. لن تختفي النقطة الوميضية بينما تتابعها عينك.",hy:"1. Փակեք ձեր աջ աչքը։ (Սա էկրանի աջ կողմն է):\n2. Օգտագործեք ◀ սլաքի ստեղնը՝ թարթող կետը սահեցնելու համար: Խաչին նայելիս հետևեք ձեր աչքի անկյունում առկա թարթող կետին և սահեցրեք այն աջ ու ձախ, մինչև այն անհետանա ձեր կույր կետում:\n3. Կտտացրեք SPACE սանդղակը:\nԾԱՆՈԹՈՒԹՅՈՒՆ. Աչքդ պահիր խաչի վրա: Թարթող կետը չի անհետանա, քանի դեռ ձեր աչքը հետևում է դրան:",bg:"1. Затворете ДЯСНОТО око. (Това е дясната страна на екрана.)\n2. Използвайте клавиша със стрелка ◀, за да плъзнете мигащата точка. Докато гледате кръста, наблюдавайте мигащата точка в ъгъла на окото си и я плъзгайте наляво и надясно, докато изчезне в сляпото петно.\n3. Натиснете ИНТЕРВАЛ.\nЗАБЕЛЕЖКА: Дръжте под око кръста. Трепкащата точка няма да изчезне, докато окото ви я следи.","zh-CN":"1. 闭上右眼。 (这是屏幕的右侧。)\n2. 使用箭头键 ◀ 滑动闪烁的点。看着十字架时,用眼角余光观察闪烁的点,然后左右滑动它,直到它消失在您的盲点中。\n3. 按空格键。\n注意:请密切关注十字架。当您的眼睛跟随闪烁的点时,它不会消失。","zh-HK":"1. 閉上右眼。 (這是螢幕的右側。)\n2. 使用箭頭鍵 ◀ 滑動閃爍的點。看著十字架時,用眼角余光觀察閃爍的點,然後左右滑動它,直到它消失在您的盲點中。\n3. 按空白鍵。\n注意:請密切注意十字架。當您的眼睛跟隨閃爍的點時,它不會消失。",hr:"1. Zatvorite DESNO oko. (Ovo je desna strana ekrana.)\n2. Koristite tipku sa strelicom ◀ za pomicanje treperave točke. Dok gledate u križ, pratite treperavu točku u kutu oka i pomičite je lijevo-desno dok ne nestane u vašoj slijepoj točki.\n3. Pritisnite RAZMAKNICU.\nNAPOMENA: Pazite na križ. Trepereća točka neće nestati dok je vaše oko prati.",cs:"1. Zavřete PRAVÉ oko. (Toto je pravá strana obrazovky.)\n2. Pomocí tlačítka se šipkou ◀ posuňte blikající bod. Při pohledu na kříž sledujte blikající tečku v koutku oka a posouvejte ji doleva a doprava, dokud nezmizí ve slepém úhlu.\n3. Stiskněte MEZERNÍK.\nPOZNÁMKA: Mějte oči na kříži. Blikající tečka nezmizí, když ji vaše oko sleduje.",da:"1. Luk dit HØJRE øje. (Dette er højre side af skærmen.)\n2. Brug piletasten ◀ til at skubbe den flimrende prik. Mens du ser på korset, skal du overvåge den flimrende prik i øjenkrogen og glide den til venstre og højre, indtil den forsvinder ind i din blindspot.\n3. Tryk på MELLEMRUM.\nBEMÆRK: Hold øje med korset. Den flimrende prik forsvinder ikke, mens dit øje følger den.",nl:"1. Sluit uw RECHTERoog. (Dit is de rechterkant van het scherm.)\n2. Gebruik de pijltjestoets ◀ om de flikkerende stip te verschuiven. Terwijl je naar het kruis kijkt, let je op de flikkerende stip in je ooghoek en schuif je deze naar links en rechts totdat deze in je blinde vlek verdwijnt.\n3. Druk op de SPATIEBALK.\nOPMERKING: Houd het kruis in de gaten. De flikkerende stip verdwijnt niet terwijl uw oog hem volgt.","en-UK":"1. Close your RIGHT eye. (This is the right side of the screen.)\n2. Use the arrow key ◀ to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it left and right until it disappears into your blind spot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",fi:"1. Sulje OIKEA silmäsi. (Tämä on näytön oikea puoli.)\n2. Liu'uta välkkyvää pistettä nuolinäppäimellä ◀. Kun katsot ristiä, tarkkaile välkkyvää pistettä silmän kulmassa ja liu'uta sitä vasemmalle ja oikealle, kunnes se katoaa sokealle pisteelle.\n3. Paina VÄLINÄPPÄINTÄ.\nHUOMAA: Pidä silmäsi ristissä. Välkkyvä piste ei katoa, kun silmäsi seuraa sitä.",fr:"1. Fermez votre œil DROIT. (C'est le côté droit de l'écran.)\n2. Utilisez la touche fléchée ◀ pour faire glisser le point clignotant. Tout en regardant la croix, surveillez le point clignotant du coin de votre œil et faites-le glisser de gauche à droite jusqu'à ce qu'il disparaisse dans votre angle mort.\n3. Appuyez sur la barre d'ESPACE.\nREMARQUE : Gardez votre œil sur la croix. Le point clignotant ne disparaîtra pas tant que votre œil le suit.",de:"1. Schließen Sie Ihr RECHTES Auge. (Dies ist die rechte Seite des Bildschirms.)\n2. Verwenden Sie die Pfeiltaste ◀, um den flackernden Punkt zu verschieben. Achten Sie beim Betrachten des Kreuzes auf den flackernden Punkt in Ihrem Augenwinkel und schieben Sie ihn nach links und rechts, bis er in Ihrem toten Winkel verschwindet.\n3. Drücken Sie die LEERTASTE.\nHINWEIS: Behalten Sie das Kreuz im Auge. Der flackernde Punkt verschwindet nicht, solange Ihr Auge ihm folgt.",el:"1. Κλείστε το ΔΕΞΙ μάτι. (Αυτή είναι η δεξιά πλευρά της οθόνης.)\n2. Χρησιμοποιήστε το πλήκτρο βέλους ◀ για να σύρετε την κουκκίδα που τρεμοπαίζει. Ενώ κοιτάτε τον σταυρό, παρακολουθήστε την κουκκίδα που τρεμοπαίζει στη γωνία του ματιού σας και σύρετέ την αριστερά και δεξιά μέχρι να εξαφανιστεί στο τυφλό σημείο σας.\n3. Πατήστε τη γραμμή SPACE.\nΣΗΜΕΙΩΣΗ: Κράτα το μάτι σου στον σταυρό. Η κουκκίδα που τρεμοπαίζει δεν θα εξαφανιστεί όσο το μάτι σας την ακολουθεί.",he:"1. עצמו את העין הימנית. (זהו הצד הימני של המסך.)\n2. השתמש במקש החץ ◀ כדי להחליק את הנקודה המהבהבת. תוך כדי הסתכלות על הצלב, עקוב אחר הנקודה המהבהבת בזווית העין שלך, והחלק אותה ימינה ושמאלה עד שהיא נעלמת בנקודה העיוורת שלך.\n3. לחץ על מקש הרווח.\nהערה: שימו עין על הצלב. הנקודה המרצדת לא תיעלם בזמן שהעין שלך עוקבת אחריה.",hi:"1. अपनी दाहिनी आंख बंद करें। (यह स्क्रीन का दाहिनी ओर है।)\n2. टिमटिमाते बिंदु को स्लाइड करने के लिए तीर कुंजी ◀ का उपयोग करें। क्रॉस को देखते समय, अपनी आंख के कोने में टिमटिमाते बिंदु पर नज़र रखें, और इसे तब तक बाएँ और दाएँ सरकाएँ जब तक कि यह आपके ब्लाइंडस्पॉट में गायब न हो जाए।\n3. स्पेस बार दबाएँ।\nध्यान दें: अपनी नज़र क्रॉस पर रखें। जब तक आपकी आंख इसका अनुसरण करेगी तब तक टिमटिमाता हुआ बिंदु गायब नहीं होगा।",hu:"1. Csukja be JOBB szemét. (Ez a képernyő jobb oldala.)\n2. A ◀ nyílbillentyűvel csúsztassa el a villogó pontot. Miközben a keresztre néz, figyelje a villogó pontot a szeme sarkában, és csúsztassa balra-jobbra, amíg el nem tűnik a vakfoltban.\n3. Nyomja meg a SZÓKÖZ billentyűt.\nMEGJEGYZÉS: Tartsa szemét a kereszten. A pislákoló pont nem tűnik el, miközben a szemed követi.",is:"1. Lokaðu HÆGRA auga. (Þetta er hægra megin á skjánum.)\n2. Notaðu örvatakkann ◀ til að renna flöktandi punktinum. Meðan þú horfir á krossinn skaltu fylgjast með flöktandi punktinum í augnkróknum og renna honum til vinstri og hægri þar til hann hverfur í blindblettinn þinn.\n3. Smelltu á bilsstikuna.\nATH: Hafðu auga með krossinum. Flikkandi punkturinn hverfur ekki á meðan augað þitt fylgist með honum.",id:"1. Tutup mata KANAN Anda. (Ini adalah sisi kanan layar.)\n2. Gunakan tombol panah ◀ untuk menggeser titik yang berkedip-kedip. Sambil melihat salib, pantau titik yang berkedip-kedip di sudut mata Anda, lalu geser ke kiri dan ke kanan hingga menghilang di titik buta Anda.\n3. Tekan bilah SPASI.\nCATATAN: Perhatikan salib. Titik yang berkedip-kedip tidak akan hilang selama mata Anda mengikutinya.",it:"1. Chiudi l'occhio DESTRO. (Questo è il lato destro dello schermo.) 2. Usa il tasto freccia ◀ per far scorrere il punto lampeggiante. Mentre guardi la croce, monitora il punto lampeggiante con la coda dell'occhio e fallo scorrere a sinistra e a destra finché non scompare nel tuo punto cieco. 3. Premi la barra SPAZIATRICE. NOTA: Tieni l'occhio sulla croce. Il punto lampeggiante non scomparirà mentre il tuo occhio lo segue.",ja:"1. 右目を閉じます。 (画面右側です。)\n2. 矢印キー ◀ を使用して、点滅するドットをスライドします。十字架を見ながら、目の隅にある点がちらつくのを観察し、それが死角に消えるまで左右にスライドさせます。\n3. スペースバーを押します。\n注: 十字架から目を離さないでください。点滅するドットは、目で追っている間は消えません。",kn:"1. ನಿಮ್ಮ ಬಲಗಣ್ಣನ್ನು ಮುಚ್ಚಿ. (ಇದು ಪರದೆಯ ಬಲಭಾಗವಾಗಿದೆ.)\n2. ಮಿನುಗುವ ಡಾಟ್ ಅನ್ನು ಸ್ಲೈಡ್ ಮಾಡಲು ಬಾಣದ ಕೀ ◀ ಬಳಸಿ. ಶಿಲುಬೆಯನ್ನು ನೋಡುವಾಗ, ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಲ್ಲಿ ಮಿನುಗುವ ಚುಕ್ಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ ಮತ್ತು ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾಗುವವರೆಗೆ ಎಡಕ್ಕೆ ಮತ್ತು ಬಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ.\n3. SPACE ಬಾರ್ ಅನ್ನು ಹಿಟ್ ಮಾಡಿ.\nಸೂಚನೆ: ಶಿಲುಬೆಯ ಮೇಲೆ ನಿಮ್ಮ ಕಣ್ಣನ್ನು ಇರಿಸಿ. ನಿಮ್ಮ ಕಣ್ಣು ಅದನ್ನು ಅನುಸರಿಸುವಾಗ ಮಿನುಗುವ ಚುಕ್ಕೆ ಮಾಯವಾಗುವುದಿಲ್ಲ.",ko:"1. 오른쪽 눈을 감으세요. (화면의 오른쪽 부분입니다.)\n2. 화살표 키를 사용하여 깜박이는 점을 이동합니다. 십자가를 보면서 눈꼬리의 깜박이는 점을 관찰하고 그것이 사각지대에 사라질 때까지 좌우로 밀어 넣으십시오.\n3. 스페이스바를 누르세요.\n참고: 십자가를 바라보십시오. 깜박이는 점은 눈이 따라가는 동안 사라지지 않습니다.",lt:"1. Užmerkite DEŠINĮ akį. (Tai yra dešinėje ekrano pusėje.)\n2. Naudokite rodyklės klavišą ◀, kad slystumėte mirksintį tašką. Žiūrėdami į kryžių, stebėkite mirgantį tašką akies kamputyje ir slinkite jį kairėn ir dešinėn, kol jis išnyks jūsų aklojoje zonoje.\n3. Paspauskite tarpo klavišą.\nPASTABA: stebėkite kryžių. Mirgantis taškas neišnyks, kol akis jį seks.",ms:"1. Tutup mata KANAN anda. (Ini adalah bahagian kanan skrin.)\n2. Gunakan kekunci anak panah ◀ untuk meluncurkan titik berkelip. Semasa melihat salib, pantau titik berkelip di sudut mata anda, dan luncurkannya ke kiri dan kanan sehingga ia hilang ke titik buta anda.\n3. Tekan bar SPACE.\nNOTA: Perhatikan salib. Titik yang berkelip tidak akan hilang semasa mata anda mengikutinya.",ml:"1. നിങ്ങളുടെ വലത് കണ്ണ് അടയ്ക്കുക. (ഇത് സ്ക്രീനിൻ്റെ വലതുഭാഗമാണ്.)\n2. മിന്നുന്ന ഡോട്ട് സ്ലൈഡ് ചെയ്യാൻ അമ്പടയാള കീ ◀ ഉപയോഗിക്കുക. കുരിശിലേക്ക് നോക്കുമ്പോൾ, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിലുള്ള മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുക, അത് നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അപ്രത്യക്ഷമാകുന്നതുവരെ ഇടത്തോട്ടും വലത്തോട്ടും സ്ലൈഡ് ചെയ്യുക.\n3. SPACE ബാറിൽ അമർത്തുക.\nശ്രദ്ധിക്കുക: കുരിശിൽ നിങ്ങളുടെ കണ്ണ് വയ്ക്കുക. നിങ്ങളുടെ കണ്ണ് അതിനെ പിന്തുടരുമ്പോൾ മിന്നുന്ന ഡോട്ട് അപ്രത്യക്ഷമാകില്ല.",no:"1. Lukk HØYRE øye. (Dette er høyre side av skjermen.)\n2. Bruk piltasten ◀ for å skyve den flimrende prikken. Mens du ser på korset, overvåk den flimrende prikken i øyekroken, og skyv den til venstre og høyre til den forsvinner inn i blindsonen.\n3. Trykk på MELLOMROM.\nMERK: Hold øye med korset. Den flimrende prikken forsvinner ikke mens øyet følger den.",fa:"1. چشم راست خود را ببندید. (این سمت راست صفحه است.)\n2. از کلید پیکان ◀ برای بلغزاندن نقطه سوسوزن استفاده کنید. در حالی که به صلیب نگاه می کنید، نقطه سوسوی گوشه چشم خود را زیر نظر بگیرید و آن را به چپ و راست بلغزانید تا در نقطه کور ناپدید شود.\n3. نوار SPACE را بزنید.\nتوجه: چشم خود را روی صلیب نگه دارید. وقتی چشم شما آن را دنبال می کند، نقطه سوسو ناپدید نمی شود.",pl:"1. Zamknij PRAWE oko. (To jest prawa strona ekranu.)\n2. Użyj klawisza strzałki ◀, aby przesunąć migoczącą kropkę. Patrząc na krzyżyk, obserwuj migoczącą kropkę w kąciku oka i przesuwaj ją w lewo i prawo, aż zniknie w twoim martwym punkcie.\n3. Naciśnij spację.\nUWAGA: Nie spuszczaj oka z krzyża. Migocząca kropka nie zniknie, gdy Twoje oko będzie za nią podążać.",pt:"1. Feche o olho DIREITO. (Este é o lado direito da tela.)\n2. Use a tecla de seta ◀ para deslizar o ponto tremeluzente. Enquanto olha para a cruz, monitore o ponto tremeluzente no canto do olho e deslize-o para a esquerda e para a direita até que desapareça no ponto cego.\n3. Clique na barra de ESPAÇO.\nNOTA: Fique de olho na cruz. O ponto tremeluzente não desaparecerá enquanto seu olho o seguir.",ro:"1. Închide ochiul DREPT. (Aceasta este partea dreaptă a ecranului.)\n2. Folosiți tasta săgeată ◀ pentru a glisa punctul care pâlpâie. În timp ce te uiți la cruce, monitorizează punctul care pâlpâie din colțul ochiului și glisează-l la stânga și la dreapta până când dispare în punctul orb.\n3. Apăsați bara SPAȚIU.\nNOTĂ: Țineți ochii pe cruce. Punctul care pâlpâie nu va dispărea în timp ce ochiul tău îl urmărește.",ru:"1. Закройте ПРАВЫЙ глаз. (Это правая часть экрана.)\n2. С помощью клавиши со стрелкой ◀ переместите мерцающую точку. Глядя на крест, следите за мерцающей точкой в ​​уголке глаза и перемещайте ее влево и вправо, пока она не исчезнет в вашей слепой зоне.\n3. Нажмите клавишу ПРОБЕЛ.\nПРИМЕЧАНИЕ. Следите за крестом. Мерцающая точка не исчезнет, ​​пока ваш глаз будет следить за ней.",sr:"1. Затворите ДЕСНО око. (Ово је десна страна екрана.)\n2. Користите тастер са стрелицом ◀ да померите тачку која трепери. Док гледате у крст, пратите трепераву тачку у углу ока и померајте је лево-десно док не нестане у вашој слепој тачки.\n3. Притисните размакницу.\nНАПОМЕНА: Пазите на крст. Тачка која трепери неће нестати док је ваше око прати.",es:"1. Cierra tu ojo DERECHO. (Este es el lado derecho de la pantalla.) 2. Usa la tecla de flecha ◀ para deslizar el punto parpadeante. Mientras miras la cruz, observa el punto parpadeante en el rabillo del ojo y deslízalo hacia la izquierda y la derecha hasta que desaparezca en tu punto ciego. 3. Presiona la barra ESPACIADORA. NOTA: Mantén tu ojo en la cruz. El punto parpadeante no desaparecerá mientras tu ojo lo siga.",sw:"1. Funga jicho lako la KULIA. (Huu ndio upande wa kulia wa skrini.)\n2. Tumia kitufe cha mshale ◀ kutelezesha kitone kinachoelea. Unapotazama msalaba, fuatilia kitone kinachopepea kwenye kona ya jicho lako, na ukitelezeshe kushoto na kulia hadi kipotee kwenye upofu wako.\n3. Piga upau wa SPACE.\nKUMBUKA: Weka macho yako msalabani. Nukta inayopepea haitatoweka jicho lako likiifuata.",sv:"1. Slut ditt HÖGER öga. (Detta är den högra sidan av skärmen.)\n2. Använd piltangenten ◀ för att skjuta den flimrande punkten. Medan du tittar på korset, övervaka den flimrande punkten i ögonvrån och skjut den åt vänster och höger tills den försvinner i din döda vinkel.\n3. Tryck på MELLANSLAG.\nOBS: Håll ögonen på korset. Den flimrande punkten försvinner inte medan ditt öga följer den.",tl:"1. Ipikit mo ang KANAN mong mata. (Ito ang kanang bahagi ng screen.)\n2. Gamitin ang arrow key ◀ upang i-slide ang kumikislap na tuldok. Habang nakatingin sa krus, subaybayan ang kumukutitap na tuldok sa sulok ng iyong mata, at i-slide ito pakaliwa at pakanan hanggang mawala ito sa iyong blindspot.\n3. Pindutin ang SPACE bar.\nTANDAAN: Itutok ang iyong mata sa krus. Hindi mawawala ang kumikislap na tuldok habang sinusundan ito ng iyong mata.",tr:"1. SAĞ gözünüzü kapatın. (Bu, ekranın sağ tarafıdır.)\n2. Titreşen noktayı kaydırmak için ok tuşunu ◀ kullanın. Çarmıha bakarken gözünüzün köşesinde titreyen noktayı izleyin ve kör noktanızda kaybolana kadar sola ve sağa kaydırın.\n3. BOŞLUK çubuğuna basın.\nNOT: Gözünüzü çarmıhta tutun. Titreşen nokta, gözünüz onu takip ederken kaybolmaz.",ur:"1. اپنی دائیں آنکھ بند کریں۔ (یہ اسکرین کا دائیں طرف ہے۔)\n2۔ ٹمٹماتے نقطے کو سلائیڈ کرنے کے لیے تیر والی کلید ◀ استعمال کریں۔ کراس کو دیکھتے ہوئے، اپنی آنکھ کے کونے میں ٹمٹماتے نقطے کی نگرانی کریں، اور اسے بائیں اور دائیں سلائیڈ کریں جب تک کہ یہ آپ کے بلائنڈ سپاٹ میں غائب نہ ہوجائے۔\n3. اسپیس بار کو دبائیں۔\nنوٹ: اپنی نظر صلیب پر رکھیں۔ جب آپ کی آنکھ اس کی پیروی کرے گی تو ٹمٹماتا نقطہ غائب نہیں ہوگا۔"},RC_distanceTrackingGuide:{"en-US":"Your eyes are xx1 cm from the screen, but the experiment needs xx2 cm. The experiment will resume when you reach the correct distance.",ar:"عيناك تبعدان xx1 سم عن الشاشة، لكن التجربة تحتاج إلى xx2 سم. ستستأنف التجربة عندما تصل إلى المسافة الصحيحة.",hy:"Ձեր աչքերը էկրանից հեռու են xx1 սմ, բայց փորձի համար անհրաժեշտ է xx2 սմ: Փորձը կվերսկսվի, երբ հասնեք ճիշտ հեռավորությանը:",bg:"Очите ви са на xx1 cm от екрана, но за експеримента са необходими xx2 cm. Експериментът ще се възобнови, когато достигнете правилното разстояние.","zh-CN":"你的眼睛距屏幕 xx1 厘米,但实验需要 xx2 厘米。当您到达正确的距离时,实验将继续。","zh-HK":"你的眼睛距離螢幕 xx1 厘米,但實驗需要 xx2 厘米。當您到達正確的距離時,實驗將繼續。",hr:"Vaše oči udaljene su xx1 cm od ekrana, ali eksperiment treba xx2 cm. Eksperiment će se nastaviti kada dosegnete točnu udaljenost.",cs:"Vaše oči jsou xx1 cm od obrazovky, ale experiment potřebuje xx2 cm. Experiment bude pokračovat, když dosáhnete správné vzdálenosti.",da:"Dine øjne er xx1 cm fra skærmen, men eksperimentet skal bruge xx2 cm. Eksperimentet genoptages, når du når den korrekte afstand.",nl:"Je ogen bevinden zich op xx1 cm van het scherm, maar voor het experiment is xx2 cm nodig. Het experiment wordt hervat zodra u de juiste afstand heeft bereikt.","en-UK":"Your eyes are xx1 cm from the screen, but the experiment needs xx2 cm. The experiment will resume when you reach the correct distance.",fi:"Silmäsi ovat xx1 cm näytöstä, mutta kokeeseen tarvitaan xx2 cm. Kokeilu jatkuu, kun saavutat oikean etäisyyden.",fr:"Vos yeux sont à xx1 cm de l'écran, mais l'expérience nécessite xx2 cm. L'expérience reprendra lorsque vous atteindrez la distance correcte.",de:"Ihre Augen sind xx1 cm vom Bildschirm entfernt, aber das Experiment benötigt xx2 cm. Das Experiment wird fortgesetzt, wenn Sie den richtigen Abstand erreicht haben.",el:"Τα μάτια σας απέχουν xx1 cm από την οθόνη, αλλά το πείραμα χρειάζεται xx2 cm. Το πείραμα θα συνεχιστεί όταν φτάσετε στη σωστή απόσταση.",he:'העיניים שלך מרוחקות xx1 ס"מ מהמסך, אבל הניסוי צריך xx2 ס"מ. הניסוי יתחדש כאשר תגיע למרחק הנכון.',hi:"आपकी आंखें स्क्रीन से xx1 सेमी दूर हैं, लेकिन प्रयोग के लिए xx2 सेमी की आवश्यकता है। जब आप सही दूरी पर पहुंच जाएंगे तो प्रयोग फिर से शुरू हो जाएगा।",hu:"A szeme xx1 cm-re van a képernyőtől, de a kísérlethez xx2 cm-re van szüksége. A kísérlet akkor folytatódik, ha eléri a megfelelő távolságot.",is:"Augun þín eru xx1 cm frá skjánum, en tilraunin þarf xx2 cm. Tilraunin mun halda áfram þegar þú nærð réttri fjarlægð.",id:"Mata Anda berjarak xx1 cm dari layar, namun eksperimen memerlukan xx2 cm. Eksperimen akan dilanjutkan ketika Anda mencapai jarak yang benar.",it:"I tuoi occhi sono a xx1 cm dallo schermo, ma l'esperimento richiede xx2 cm. L'esperimento riprenderà quando raggiungerai la distanza corretta.",ja:"あなたの目は画面から xx1 cm 離れていますが、実験には xx2 cm が必要です。正しい距離に到達すると実験が再開されます。",kn:"ನಿಮ್ಮ ಕಣ್ಣುಗಳು ಪರದೆಯಿಂದ xx1 cm, ಆದರೆ ಪ್ರಯೋಗಕ್ಕೆ xx2 cm ಅಗತ್ಯವಿದೆ. ನೀವು ಸರಿಯಾದ ದೂರವನ್ನು ತಲುಪಿದಾಗ ಪ್ರಯೋಗವು ಪುನರಾರಂಭವಾಗುತ್ತದೆ.",ko:"당신의 눈은 화면에서 xx1cm 떨어져 있지만 실험에는 xx2cm가 필요합니다. 올바른 거리에 도달하면 실험이 재개됩니다.",lt:"Jūsų akys yra xx1 cm atstumu nuo ekrano, bet eksperimentui reikia xx2 cm. Eksperimentas bus tęsiamas, kai pasieksite reikiamą atstumą.",ms:"Mata anda adalah xx1 cm dari skrin, tetapi percubaan memerlukan xx2 cm. Percubaan akan disambung semula apabila anda mencapai jarak yang betul.",ml:"നിങ്ങളുടെ കണ്ണുകൾ സ്ക്രീനിൽ നിന്ന് xx1 സെൻ്റിമീറ്ററാണ്, എന്നാൽ പരീക്ഷണത്തിന് xx2 സെൻ്റീമീറ്റർ ആവശ്യമാണ്. നിങ്ങൾ ശരിയായ ദൂരത്തിൽ എത്തുമ്പോൾ പരീക്ഷണം പുനരാരംഭിക്കും.",no:"Øynene dine er xx1 cm fra skjermen, men eksperimentet trenger xx2 cm. Eksperimentet gjenopptas når du når riktig avstand.",fa:"چشمان شما xx1 سانتی متر از صفحه نمایش فاصله دارد، اما آزمایش به xx2 سانتی متر نیاز دارد. با رسیدن به فاصله صحیح، آزمایش از سر گرفته می شود.",pl:"Twoje oczy znajdują się w odległości xx1 cm od ekranu, ale do eksperymentu potrzebne są xx2 cm. Eksperyment zostanie wznowiony, gdy osiągniesz odpowiednią odległość.",pt:"Seus olhos estão a xx1 cm da tela, mas o experimento precisa de xx2 cm. O experimento será retomado quando você atingir a distância correta.",ro:"Ochii tăi sunt la xx1 cm de ecran, dar experimentul are nevoie de xx2 cm. Experimentul se va relua când ajungeți la distanța corectă.",ru:"Ваши глаза находятся на расстоянии хх1 см от экрана, но для эксперимента нужно хх2 см. Эксперимент возобновится, когда вы достигнете правильного расстояния.",sr:"Ваше очи су кк1 цм од екрана, али за експеримент је потребно кк2 цм. Експеримент ће се наставити када достигнете тачну удаљеност.",es:"Tus ojos están a xx1 cm de la pantalla, pero el experimento necesita xx2 cm. El experimento se reanudará cuando alcances la distancia correcta.",sw:"Macho yako ni sentimita xx1 kutoka kwenye skrini, lakini jaribio linahitaji sentimita xx2. Jaribio litaendelea utakapofika umbali sahihi.",sv:"Dina ögon är xx1 cm från skärmen, men experimentet behöver xx2 cm. Experimentet kommer att återupptas när du når rätt avstånd.",tl:"Ang iyong mga mata ay xx1 cm mula sa screen, ngunit ang eksperimento ay nangangailangan ng xx2 cm. Magpapatuloy ang eksperimento kapag naabot mo ang tamang distansya.",tr:"Gözleriniz ekrandan xx1 cm uzakta, ancak deney için xx2 cm'ye ihtiyaç var. Doğru mesafeye ulaştığınızda deney devam edecektir.",ur:"آپ کی آنکھیں اسکرین سے xx1 سینٹی میٹر دور ہیں، لیکن تجربے کے لیے xx2 سینٹی میٹر کی ضرورت ہے۔ تجربہ دوبارہ شروع ہو جائے گا جب آپ صحیح فاصلے پر پہنچ جائیں گے۔"},RC_distanceTrackingIntroEnd:{"en-US":"Once you're done, distance tracking will begin.",ar:"بمجرد الانتهاء، سيبدأ تتبع المسافة.",hy:"Ավարտելուց հետո կսկսվի հեռավորության հետագծումը:",bg:"След като приключите, проследяването на разстоянието ще започне.","zh-CN":"在您完成后,视距追踪将开始。","zh-HK":"完成後,距離追蹤將開始。",hr:"Kada završite, započet će praćenje udaljenosti.",cs:"Jakmile budete hotovi, začne sledování vzdálenosti.",da:"Når du er færdig, begynder distancesporing.",nl:"Zodra u klaar bent, begint het volgen van de afstand.","en-UK":"Once you're done, distance tracking will commence.",fi:"Kun olet valmis, etäisyysseuranta alkaa.",fr:"Une fois que vous aurez terminé, le suivi de la distance commencera.",de:"Sobald Sie fertig sind, beginnt die Distanzverfolgung.",el:"Μόλις τελειώσετε, θα ξεκινήσει η παρακολούθηση απόστασης.",he:"לאחר שתסיים, יתחיל מעקב מרחק.",hi:"एक बार जब आपका काम पूरा हो जाएगा, तो दूरी की ट्रैकिंग शुरू हो जाएगी।",hu:"Ha végzett, megkezdődik a távolságkövetés.",is:"Þegar þú ert búinn hefst fjarlægðarmæling.",id:"Setelah Anda selesai, pelacakan jarak akan dimulai.",it:"Una volta terminato, inizierà il tracciamento della distanza.",ja:"「終わったら、距離の追跡が始まります。」",kn:"ಮುಗಿದ ನಂತರ, ದೂರದರ್ಶನ ಟ್ರ್ಯಾಕಿಂಗ್ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.",ko:"완료되면 거리 추적이 시작됩니다.",lt:"Kai baigsite, atstumo sekimas prasidės.",ms:"Sebaik sahaja anda selesai, penjejakan jarak akan bermula.",ml:"നിങ്ങൾ ചെയ്തുകഴിഞ്ഞാൽ, ദൂരം ട്രാക്കിംഗ് ആരംഭിക്കും.",no:'"Once you\'re done, distance tracking will begin."\n"Når du er ferdig, vil avstandssporing begynne."',fa:"پس از اتمام کار، ردیابی مسافت آغاز خواهد شد.",pl:"Gdy skończysz, rozpocznie się śledzenie odległości.",pt:"Quando terminar, o rastreamento de distância começará.",ro:"După ce ați terminat, va începe urmărirea distanței.",ru:"Как только вы закончите, начнется отслеживание расстояния.",sr:"Kada završite, praćenje udaljenosti će početi.",es:"Una vez que termines, comenzará el seguimiento de distancia.",sw:"Baada ya kumaliza, ufuatiliaji wa umbali utaanza.",sv:"När du är klar kommer distansspårningen att börja.",tl:"Kapag tapos ka na, magsisimula ang pagsubaybay sa distansya.",tr:"Tamamlandığında, mesafe takibi başlayacak.",ur:"جب آپ کام مکمل کر لیں، فاصلہ کی پیمائش شروع ہو جائے گی۔"},RC_distanceTrackingIntroStart:{"en-US":"❌ RC_distanceTrackingIntroStart is obsolete.",ar:"❌ RC_distanceTrackingIntroStart is obsolete.",hy:"❌ RC_distanceTrackingIntroStart-ը հնացած է:",bg:"❌ RC_distanceTrackingIntroStart е остарял.","zh-CN":"❌ RC_distanceTrackingIntroStart 已过时。","zh-HK":"❌ RC_distanceTrackingIntroStart 已過時。",hr:"❌ RC_distanceTrackingIntroStart je zastario.",cs:"❌ RC_distanceTrackingIntroStart je zastaralý.",da:"❌ RC_distanceTrackingIntroStart er forældet.",nl:"❌ RC_distanceTrackingIntroStart is verouderd.","en-UK":"RC_distanceTrackingIntroStart is obsolete.",fi:"❌ RC_distanceTrackingIntroStart on vanhentunut.",fr:"❌ RC_distanceTrackingIntroStart is obsolete.",de:"❌ RC_distanceTrackingIntroStart ist veraltet.",el:"❌ Το RC_distanceTrackingIntroStart είναι ξεπερασμένο.",he:"❌ RC_distanceTrackingIntroStart מיושן.",hi:"❌ RC_distanceTrackingIntroStart अप्रचलित है।",hu:"❌ Az RC_distanceTrackingIntroStart elavult.",is:"❌ RC_distanceTrackingIntroStart er úreltur.",id:"❌ RC_distanceTrackingIntroStart sudah usang.",it:"❌ RC_distanceTrackingIntroStart is obsolete.",ja:"❌ RC_distanceTrackingIntroStart is obsolete.",kn:"❌ RC_distanceTrackingIntroStart is obsolete.",ko:"❌ RC_distanceTrackingIntroStart is obsolete.",lt:"❌ RC_distanceTrackingIntroStart is obsolete.",ms:"❌ RC_distanceTrackingIntroStart is obsolete.",ml:"❌ RC_distanceTrackingIntroStart കാലഹരണപ്പെട്ടതാണ്.",no:"❌ RC_distanceTrackingIntroStart is obsolete.",fa:"❌ RC_distanceTrackingIntroStart is obsolete.",pl:"❌ RC_distanceTrackingIntroStart is obsolete.",pt:"❌ RC_distanceTrackingIntroStart is obsolete.",ro:"❌ RC_distanceTrackingIntroStart is obsolete.",ru:"❌ RC_distanceTrackingIntroStart is obsolete.",sr:"❌ RC_distanceTrackingIntroStart is obsolete.",es:"❌ RC_distanceTrackingIntroStart is obsolete.",sw:"❌ RC_distanceTrackingIntroStart is obsolete.",sv:"❌ RC_distanceTrackingIntroStart is obsolete.",tl:"❌ RC_distanceTrackingIntroStart is obsolete.",tr:"❌ RC_distanceTrackingIntroStart is obsolete.",ur:"❌ RC_distanceTrackingIntroStart is obsolete."},RC_distanceTrackingMoveCloser:{"en-US":"Move closer",ar:"اقترب أكثر",hy:"Մոտեցեք",bg:"Приближете се","zh-CN":"靠近一点。","zh-HK":"靠近一點",hr:"Primakni se bliže",cs:"Posuňte se blíž",da:"Flyt tættere på",nl:"Kom dichterbij","en-UK":"Move closer",fi:"Siirry lähemmäs",fr:"Rapproche-toi",de:"Gehen Sie näher heran",el:"Κινηθείτε πιο κοντά",he:"תתקרב",hi:"निकट आएं",hu:"Lépj közelebb",is:"Færðu þig nær",id:"Merapat",it:"Avvicinati",ja:"もっと近づいてください。",kn:"ಹತ್ತಿರಕ್ಕೆ ಬಾರಿಸಿ",ko:"더 가까이 다가가세요",lt:"Judėti arčiau",ms:"Bergerak lebih dekat",ml:"അടുത്തേക്ക് നീങ്ങുക",no:"Flytt nærmere",fa:"نزدیکتر بیایید",pl:"Podejdź bliżej",pt:"Aproxime-se",ro:"Apropie-te",ru:"Подойди ближе",sr:"Приђи ближе",es:"Acércate",sw:"Sogeza karibu",sv:"Flytta dig närmare",tl:"Lumapit ka",tr:"Daha yaklaş",ur:"قریب ہو جاؤ"},RC_distanceTrackingMoveFurther:{"en-US":"Move farther",ar:"ابتعد أكثر",hy:"Շարժվեք ավելի հեռու",bg:"Придвижете се по-далеч","zh-CN":"走得更远","zh-HK":"走得更遠",hr:"Pomakni se dalje",cs:"Přesuňte se dále",da:"Flyt længere",nl:"Ga verder","en-UK":"Move further",fi:"Siirry kauemmas",fr:"Éloigne-toi davantage",de:"Bewegen Sie sich weiter",el:"Μετακινηθείτε πιο μακριά",he:"זז רחוק יותר",hi:"आगे बढ़ो",hu:"Menj messzebbre",is:"Færðu þig lengra",id:"Bergerak lebih jauh",it:"Muoviti più lontano",ja:"もっと離れてください。",kn:"ದೂರ ಸರಿಯಿರಿ",ko:"더 멀리 이동",lt:"Pajudėk toliau",ms:"Bergerak lebih jauh",ml:"കൂടുതൽ ദൂരം നീങ്ങുക",no:"Flytt lenger",fa:"به دورتر حرکت کنید",pl:"Idź dalej",pt:"Vá mais longe",ro:"Muta-te mai departe",ru:"Двигайтесь дальше",sr:"Pomeri se dalje",es:"Mueve más lejos",sw:"Endelea mbali zaidi",sv:"Flytta längre",tl:"Lumipat ng mas malayo",tr:"Daha ileri git",ur:"اور دور جاؤ"},RC_rulerUnit:{"en-US":"1. If you have one, select your longest ruler or tape measure. \n2. What units are marked on it? (If several, choose one.) \n3. If you don’t have a ruler or tape measure, click None to proceed.",ar:"1. إذا كان لديك واحد، اختر أطول مسطرة أو شريط قياس لديك.\n2. ما هي الوحدات المعلّمة عليه؟ (إذا كان هناك عدة، اختر واحدة.)\n3. إذا لم يكن لديك مسطرة أو شريط قياس، انقر على لا شيء للمتابعة.",hy:"1. Եթե ունեք, ընտրեք ձեր ամենաերկար քանոնը կամ ժապավենը: \n2. Ի՞նչ միավորներ են նշված դրա վրա: (Եթե մի քանիսը, ընտրեք մեկը): \n3. Եթե չունեք քանոն կամ ժապավեն, սեղմեք Ոչ մեկը՝ շարունակելու համար:",bg:"1. Ако имате такъв, изберете най-дългата линийка или ролетка. \n2. Какви мерни единици са отбелязани на него? (Ако са няколко, изберете един.) \n3. Ако нямате линийка или ролетка, щракнете върху Няма, за да продължите.","zh-CN":"1. 如果有,请选择最长的尺子或卷尺。 \n2. 上面标注的单位是什么? (如果有多个,请选择一个。) \n3. 如果您没有尺子或卷尺,请单击“无”继续。","zh-HK":"1. 如果有,請選擇最長的尺子或捲尺。 \n2. 上面標註的單位是什麼? (如果有多個,請選擇一個。) \n3. 如果您沒有尺或捲尺,請按一下「無」繼續。",hr:"1. Ako ga imate, odaberite svoje najduže ravnalo ili metar. \n2. Koje su jedinice označene na njemu? (Ako ih je više, odaberite jedno.) \n3. Ako nemate ravnalo ili metar, kliknite Ništa za nastavak.",cs:"1. Pokud nějaké máte, vyberte si nejdelší pravítko nebo svinovací metr. \n2. Jaké jednotky jsou na něm vyznačeny? (Pokud je jich několik, vyberte jednu.) \n3. Pokud nemáte pravítko nebo svinovací metr, pokračujte kliknutím na Žádný.",da:"1. Hvis du har en, skal du vælge din længste lineal eller målebånd. \n2. Hvilke enheder er markeret på den? (Hvis flere, vælg én.) \n3. Hvis du ikke har en lineal eller et målebånd, skal du klikke på Ingen for at fortsætte.",nl:"1. Als je er een hebt, selecteer dan je langste liniaal of meetlint. \n2. Welke eenheden staan ​​erop aangegeven? (Als er meerdere zijn, kies er dan één.) \n3. Als u geen liniaal of meetlint heeft, klikt u op Geen om door te gaan.","en-UK":"1. If you have one, select your longest ruler or tape measure. \n2. What units are marked on it? (If several, choose one.) \n3. If you don’t have a ruler or tape measure, click None to proceed.",fi:"1. Jos sinulla on sellainen, valitse pisin viivain tai mittanauha. \n2. Mitä yksiköitä siihen on merkitty? (Jos useita, valitse yksi.) \n3. Jos sinulla ei ole viivainta tai mittanauhaa, jatka valitsemalla Ei mitään.",fr:"1. Si vous en avez un, sélectionnez votre règle ou mètre ruban le plus long.\n2. Quelles unités y sont marquées ? (Si plusieurs, choisissez-en une.)\n3. Si vous n'avez pas de règle ou de mètre ruban, cliquez sur Aucun pour continuer.",de:"1. Wenn Sie eines haben, wählen Sie Ihr längstes Lineal oder Maßband aus. \n2. Welche Einheiten sind darauf markiert? (Wenn mehrere, wählen Sie eine aus.) \n3. Wenn Sie kein Lineal oder Maßband haben, klicken Sie auf „Keine“, um fortzufahren.",el:"1. Εάν έχετε, επιλέξτε τον μεγαλύτερο χάρακα ή τη μεζούρα σας. \n2. Ποιες μονάδες σημειώνονται σε αυτό; (Εάν υπάρχουν πολλά, επιλέξτε ένα.) \n3. Εάν δεν έχετε χάρακα ή μεζούρα, κάντε κλικ στο Κανένα για να συνεχίσετε.",he:"1. אם יש לך אחד כזה, בחר את הסרגל או סרט המידה הארוכים ביותר. \n2. אילו יחידות מסומנות עליו? (אם כמה, בחר אחד.) \n3. אם אין לך סרגל או סרט מדידה, לחץ על None כדי להמשיך.",hi:"1. यदि आपके पास एक है, तो अपना सबसे लंबा रूलर या टेप माप चुनें। \n2. इस पर कौन सी इकाइयाँ अंकित हैं? (यदि अनेक हों तो एक चुनें।) \n3. यदि आपके पास रूलर या टेप माप नहीं है, तो आगे बढ़ने के लिए कोई नहीं पर क्लिक करें।",hu:"1. Ha rendelkezik ilyennel, válassza ki a leghosszabb vonalzót vagy mérőszalagot. \n2. Milyen mértékegységek vannak jelölve rajta? (Ha több, válasszon egyet.) \n3. Ha nincs vonalzója vagy mérőszalagja, kattintson a Nincs lehetőségre a folytatáshoz.",is:"1. Ef þú ert með einn skaltu velja lengstu reglustikuna þína eða málband. \n2. Hvaða einingar eru merktar á það? (Ef fleiri, veldu einn.) \n3. Ef þú ert ekki með reglustiku eða málband, smelltu á Ekkert til að halda áfram.",id:"1. Jika ada, pilih penggaris atau pita pengukur terpanjang Anda. \n2. Satuan apa yang ditandai di atasnya? (Jika beberapa, pilih salah satu.) \n3. Jika Anda tidak memiliki penggaris atau pita pengukur, klik Tidak Ada untuk melanjutkan.",it:"1. Se ne hai uno, seleziona il tuo righello o metro a nastro più lungo. \n2. Quali unità sono segnate su di esso? (Se ce ne sono diverse, scegline una.) \n3. Se non hai un righello o un metro a nastro, clicca Nessuno per procedere.",ja:"1. 持っている場合は、最長の定規または巻尺を選択します。 \n2. どの単位がマークされていますか? (複数ある場合は1つお選びください。) \n3. 定規や巻尺がない場合は、「なし」をクリックして続行します。",kn:"1. ನೀವು ಒಂದನ್ನು ಹೊಂದಿದ್ದರೆ, ನಿಮ್ಮ ಉದ್ದವಾದ ಆಡಳಿತಗಾರ ಅಥವಾ ಟೇಪ್ ಅಳತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ. \n2. ಅದರ ಮೇಲೆ ಯಾವ ಘಟಕಗಳನ್ನು ಗುರುತಿಸಲಾಗಿದೆ? (ಹಲವಾರು ಇದ್ದರೆ, ಒಂದನ್ನು ಆರಿಸಿ.) \n3. ನೀವು ರೂಲರ್ ಅಥವಾ ಟೇಪ್ ಅಳತೆಯನ್ನು ಹೊಂದಿಲ್ಲದಿದ್ದರೆ, ಮುಂದುವರೆಯಲು ಯಾವುದೂ ಇಲ್ಲ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ.",ko:"1. 가지고 있다면 가장 긴 자나 줄자를 선택하세요. \n2. 어떤 단위가 표시되어 있나요? (여러 개일 경우 하나를 선택하세요.) \n3. 자나 줄자가 없으면 없음을 클릭하여 계속 진행하세요.",lt:"1. Jei turite, pasirinkite ilgiausią liniuotę arba matavimo juostą. \n2. Kokie vienetai pažymėti ant jo? (Jei keli, pasirinkite vieną.) \n3. Jei neturite liniuotės arba matavimo juostos, spustelėkite Nėra, kad tęstumėte.",ms:"1. Jika anda mempunyai satu, pilih pembaris terpanjang atau pita pengukur anda. \n2. Apakah unit yang ditanda padanya? (Jika beberapa, pilih satu.) \n3. Jika anda tidak mempunyai pembaris atau pita pengukur, klik Tiada untuk meneruskan.",ml:"1. നിങ്ങൾക്ക് ഒരെണ്ണം ഉണ്ടെങ്കിൽ, നിങ്ങളുടെ ഏറ്റവും ദൈർഘ്യമേറിയ ഭരണാധികാരി അല്ലെങ്കിൽ ടേപ്പ് അളവ് തിരഞ്ഞെടുക്കുക. \n2. അതിൽ എന്ത് യൂണിറ്റുകൾ അടയാളപ്പെടുത്തിയിരിക്കുന്നു? (നിരവധി ആണെങ്കിൽ, ഒന്ന് തിരഞ്ഞെടുക്കുക.) \n3. നിങ്ങൾക്ക് ഒരു റൂളറോ ടേപ്പ് അളവോ ഇല്ലെങ്കിൽ, തുടരാൻ ഒന്നുമില്ല ക്ലിക്ക് ചെയ്യുക.",no:"1. Hvis du har en, velg den lengste linjalen eller målebåndet. \n2. Hvilke enheter er merket på den? (Hvis flere, velg én.) \n3. Hvis du ikke har en linjal eller målebånd, klikker du på Ingen for å fortsette.",fa:"1. اگر یکی دارید، بلندترین خط کش یا متر نوار خود را انتخاب کنید. \n2. چه واحدهایی روی آن مشخص شده است؟ (اگر چندین، یکی را انتخاب کنید.) \n3. اگر خط کش یا متر نوار ندارید، برای ادامه روی None کلیک کنید.",pl:"1. Jeśli masz, wybierz najdłuższą linijkę lub centymetr. \n2. Jakie jednostki są na nim zaznaczone? (Jeśli jest ich kilka, wybierz jeden.) \n3. Jeśli nie masz linijki ani taśmy mierniczej, kliknij Brak, aby kontynuować.",pt:"1. Se você tiver uma, selecione sua régua ou fita métrica mais longa. \n2. Quais unidades estão marcadas nele? (Se houver vários, escolha um.) \n3. Se você não tiver uma régua ou fita métrica, clique em Nenhum para continuar.",ro:"1. Dacă aveți una, selectați cea mai lungă riglă sau bandă de măsură. \n2. Ce unități sunt marcate pe el? (Dacă sunt mai multe, alegeți unul.) \n3. Dacă nu aveți o riglă sau o bandă de măsură, faceți clic pe Nimic pentru a continua.",ru:"1. Если она у вас есть, выберите самую длинную линейку или рулетку. \n2. Какие единицы измерения на нем обозначены? (Если несколько, выберите один.) \n3. Если у вас нет линейки или рулетки, нажмите «Нет», чтобы продолжить.",sr:"1. Ако га имате, изаберите најдужи лењир или меру. \n2. Које јединице су означене на њему? (Ако их је неколико, изаберите једну.) \n3. Ако немате лењир или меру, кликните на Ништа да бисте наставили.",es:"1. Si tienes uno, selecciona tu regla o cinta métrica más larga. \n2. ¿Qué unidades están marcadas en ella? (Si hay varias, elige una.) \n3. Si no tienes una regla o cinta métrica, haz clic en Ninguno para continuar.",sw:"1. Ikiwa unayo, chagua rula yako ndefu zaidi au kipimo cha tepi. \n2. Ni vitengo gani vilivyowekwa alama juu yake? (Ikiwa ni kadhaa, chagua moja.) \n3. Ikiwa huna rula au kipimo cha tepi, bofya Hakuna ili kuendelea.",sv:"1. Om du har en, välj din längsta linjal eller måttband. \n2. Vilka enheter är markerade på den? (Om flera, välj en.) \n3. Om du inte har en linjal eller måttband klickar du på Ingen för att fortsätta.",tl:"1. Kung mayroon ka, piliin ang iyong pinakamahabang ruler o tape measure. \n2. Anong mga yunit ang nakamarka dito? (Kung marami, pumili ng isa.) \n3. Kung wala kang ruler o tape measure, i-click ang Wala upang magpatuloy.",tr:"1. Eğer elinizde varsa en uzun cetvelinizi veya şerit metrenizi seçin. \n2. Üzerinde hangi birimler işaretlenmiştir? (Birkaç tane varsa birini seçin.) \n3. Cetveliniz veya şerit metreniz yoksa devam etmek için Yok'a tıklayın.",ur:"1. اگر آپ کے پاس ہے، تو اپنا سب سے لمبا حکمران یا ٹیپ پیمائش منتخب کریں۔ \n2. اس پر کون سی اکائیاں نشان زد ہیں؟ (اگر متعدد ہوں تو ایک کا انتخاب کریں۔) \n3. اگر آپ کے پاس حکمران یا ٹیپ پیمائش نہیں ہے، تو آگے بڑھنے کے لیے کوئی نہیں پر کلک کریں۔"},RC_howLong:{"en-US":"How long is your ruler or tape measure, in AAA?",ar:"ما هو طول مسطرتك أو شريط القياس الخاص بك، في AAA؟",hy:"Որքա՞ն երկար է ձեր քանոնը կամ ժապավենը AAA-ով:",bg:"Колко дълга е вашата линийка или ролетка в AAA?","zh-CN":"您的尺子或卷尺有多长(AAA)?","zh-HK":"您的尺或捲尺有多長(AAA)?",hr:"Koliko je dugo vaše ravnalo ili metar u AAA?",cs:"Jak dlouhé je vaše pravítko nebo svinovací metr v AAA?",da:"Hvor lang er din lineal eller målebånd i AAA?",nl:"Hoe lang is uw liniaal of meetlint, in AAA?","en-UK":"How long is your ruler or tape measure, in AAA?",fi:"Kuinka pitkä viivain tai mittanauhasi on AAA-muodossa?",fr:"Quelle est la longueur de votre règle ou mètre ruban, en AAA ?",de:"Wie lang ist Ihr Lineal oder Maßband in AAA?",el:"Πόσο μήκος έχει ο χάρακας ή η μεζούρα σας, σε ΑΑΑ;",he:"כמה זמן הסרגל או סרט המידה שלך ב-AAA?",hi:"आपका रूलर या टेप माप एएए में कितना लंबा है?",hu:"Milyen hosszú a vonalzód vagy mérőszalagod AAA-ban?",is:"Hversu langt er reglustikið eða málbandið þitt í AAA?",id:"Berapa panjang penggaris atau pita pengukur Anda, dalam ukuran AAA?",it:"Quanto è lungo il tuo righello o metro a nastro, in AAA?",ja:"あなたの定規または巻尺の長さは AAA 単位でどれくらいですか?",kn:"AAA ನಲ್ಲಿ ನಿಮ್ಮ ರೂಲರ್ ಅಥವಾ ಟೇಪ್ ಅಳತೆ ಎಷ್ಟು?",ko:"자나 줄자는 AAA 단위로 얼마나 긴가요?",lt:"Kokio ilgio jūsų liniuotė arba matavimo juosta yra AAA?",ms:"Berapa lama pembaris atau pita pengukur anda, dalam AAA?",ml:"AAA-യിൽ നിങ്ങളുടെ ഭരണാധികാരി അല്ലെങ്കിൽ ടേപ്പ് അളവ് എത്രയാണ്?",no:"Hvor lang er linjalen eller målebåndet ditt i AAA?",fa:"طول خط کش یا متر نوار شما، در AAA چقدر است؟",pl:"Jaką długość ma Twoja linijka lub miarka w formacie AAA?",pt:"Qual é o comprimento da sua régua ou fita métrica, em AAA?",ro:"Cât de lungă este rigla sau banda ta de măsură, în AAA?",ru:"Какова длина вашей линейки или рулетки в формате AAA?",sr:"Колико је дугачак ваш лењир или мерач траке, у ААА?",es:"¿Cuánto mide tu regla o cinta métrica, en AAA?",sw:"Je, kipimo chako cha rula au tepi ni cha muda gani, katika AAA?",sv:"Hur lång är din linjal eller måttband i AAA?",tl:"Gaano katagal ang iyong ruler o tape measure, sa AAA?",tr:"Cetvelinizin veya şerit metrenizin uzunluğu AAA cinsinden ne kadardır?",ur:"اے اے اے میں آپ کا حکمران یا ٹیپ پیمائش کتنی لمبی ہے؟"},RC_produceDistanceTitle:{"en-US":"Set Your Viewing Distance, Step 222 of 333",ar:"اضبط مسافة المشاهدة الخاصة بك، الخطوة 222 من 333",hy:"Սահմանեք ձեր դիտման հեռավորությունը, քայլ 222-ը 333-ից",bg:"Задайте вашето разстояние за гледане, стъпка 222 от 333","zh-CN":"设置您的观看距离,第 222 步(共 333 步)","zh-HK":"設定您的觀看距離,第 222 步(共 333 步)",hr:"Postavite udaljenost gledanja, korak 222 od 333",cs:"Nastavte svou pozorovací vzdálenost, krok 222 z 333",da:"Indstil din synsafstand, trin 222 af 333",nl:"Stel uw kijkafstand in, stap 222 van 333","en-UK":"Set Your Viewing Distance, Step 222 of 333",fi:"Aseta katseluetäisyys, vaihe 222/333",fr:"Réglez votre distance de visionnement, étape 222 sur 333",de:"Stellen Sie Ihren Betrachtungsabstand ein, Schritt 222 von 333",el:"Ορίστε την απόσταση προβολής σας, Βήμα 222 από 333",he:"הגדר את מרחק הצפייה שלך, שלב 222 מתוך 333",hi:"अपनी देखने की दूरी निर्धारित करें, 333 में से चरण 222",hu:"Állítsa be a látótávolságot, 222/333 lépés",is:"Stilltu útsýnisfjarlægð þína, skref 222 af 333",id:"Atur Jarak Pandang Anda, Langkah 222 dari 333",it:"Imposta la tua distanza di visione, passaggio 222 di 333",ja:"視聴距離を設定する、ステップ 222/333",kn:"ನಿಮ್ಮ ವೀಕ್ಷಣಾ ದೂರವನ್ನು ಹೊಂದಿಸಿ, ಹಂತ 222 ರಲ್ಲಿ 333",ko:"시청 거리 설정, 333단계 중 222단계",lt:"Nustatykite savo žiūrėjimo atstumą, 222 veiksmas iš 333",ms:"Tetapkan Jarak Tontonan Anda, Langkah 222 daripada 333",ml:"നിങ്ങളുടെ കാഴ്ച ദൂരം സജ്ജീകരിക്കുക, ഘട്ടം 222 / 333",no:"Still inn visningsavstand, trinn 222 av 333",fa:"فاصله مشاهده خود را تنظیم کنید، مرحله 222 از 333",pl:"Ustaw odległość oglądania, krok 222 z 333",pt:"Defina sua distância de visualização, Etapa 222 de 333",ro:"Setați distanța de vizualizare, Pasul 222 din 333",ru:"Установите расстояние просмотра, шаг 222 из 333",sr:"Подесите своју удаљеност гледања, корак 222 од 333",es:"Configura tu distancia de visualización, paso 222 de 333",sw:"Weka Umbali Wako wa Kutazama, Hatua ya 222 kati ya 333",sv:"Ställ in ditt visningsavstånd, steg 222 av 333",tl:"Itakda ang Iyong Distansya sa Pagtingin, Hakbang 222 ng 333",tr:"İzleme Mesafenizi Ayarlayın, Adım 222 / 333",ur:"اپنا دیکھنے کا فاصلہ طے کریں، مرحلہ 222 ​​از 333"},RC_produceDistance:{"en-US":"1. Measure the distance from the center of your screen to the front of your eye (either eye is fine). Use a ruler or tape measure, and ignore any glasses while measuring.\n2. Adjust your position by leaning forward or back, or by moving your chair, until the distance is 111 AAA.\n3. Once you’re at the correct distance, keep your head steady and set the ruler aside to ensure the camera has a clear view of your entire face.\n4. Press RETURN on your keyboard (or phone-screen keypad) to proceed. ",ar:"1. قم بقياس المسافة من مركز شاشتك إلى مقدمة عينك (أي عين تكون جيدة). استخدم مسطرة أو شريط قياس، وتجاهل أي نظارات أثناء القياس.\n2. قم بتعديل وضعيتك عن طريق الانحناء للأمام أو للخلف، أو بتحريك كرسيك، حتى تصبح المسافة 111 AAA.\n3. بمجرد أن تكون على المسافة الصحيحة، حافظ على رأسك ثابتًا وضع المسطرة جانبًا لضمان أن الكاميرا لديها رؤية واضحة لوجهك بالكامل.\n4. اضغط على RETURN على لوحة المفاتيح الخاصة بك (أو لوحة المفاتيح على شاشة الهاتف) للمتابعة.",hy:"1. Չափեք ձեր էկրանի կենտրոնից մինչև ձեր աչքի առջևի հատվածը (ցանկացած աչքը լավ է): Օգտագործեք քանոն կամ ժապավեն և չափելիս անտեսեք ցանկացած ակնոց:\n2. Կարգավորեք ձեր դիրքը՝ թեքվելով առաջ կամ հետ, կամ աթոռը շարժելով՝ մինչև հեռավորությունը 111 AAA:\n3. Երբ դուք ճիշտ հեռավորության վրա եք, ձեր գլուխը պահեք անշարժ և մի կողմ դրեք քանոնը, որպեսզի տեսախցիկը հստակ տեսնի ձեր ամբողջ դեմքը:\n4. Շարունակելու համար սեղմեք RETURN ստեղնաշարի (կամ հեռախոսի էկրանի ստեղնաշարի վրա): ",bg:"1. Измерете разстоянието от центъра на екрана до предната част на окото (и двете очи са наред). Използвайте линийка или рулетка и игнорирайте очилата, докато измервате.\n2. Регулирайте позицията си, като се наведете напред или назад или като преместите стола си, докато разстоянието стане 111 AAA.\n3. След като сте на правилното разстояние, дръжте главата си стабилна и оставете линийката настрани, за да сте сигурни, че камерата има ясен изглед към цялото ви лице.\n4. Натиснете RETURN на клавиатурата (или клавиатурата на екрана на телефона), за да продължите. ","zh-CN":"1. 测量屏幕中心到眼睛前方的距离(任意一只眼睛都可以)。使用尺子或卷尺进行测量,并忽略任何眼镜。\n2. 通过向前或向后倾斜或移动椅子来调整您的位置,直到距离为 111 AAA。\n3. 一旦达到正确的距离,请保持头部稳定并将尺子放在一边,以确保相机可以清晰地看到您的整个脸部。\n4. 按键盘(或电话屏幕键盘)上的 RETURN 继续。 ","zh-HK":"1. 測量螢幕中心到眼睛前方的距離(任一隻眼睛都可以)。使用尺或捲尺進行測量,並忽略任何眼鏡。\n2. 透過向前或向後傾斜或移動椅子來調整您的位置,直到距離為 111 AAA。\n3. 一旦達到正確的距離,請保持頭部穩定並將尺子放在一邊,以確保相機可以清楚地看到您的整個臉部。\n4. 按鍵盤(或電話螢幕鍵盤)上的 RETURN 繼續。 ",hr:"1. Izmjerite udaljenost od središta zaslona do prednjeg dijela oka (s oba oka je u redu). Koristite ravnalo ili mjernu traku i zanemarite naočale tijekom mjerenja.\n2. Prilagodite svoj položaj naginjući se naprijed ili natrag, ili pomičući stolac, dok udaljenost ne bude 111 AAA.\n3. Nakon što ste na ispravnoj udaljenosti, držite glavu mirno i postavite ravnalo u stranu kako bi kamera imala jasan pregled cijelog vašeg lica.\n4. Pritisnite RETURN na tipkovnici (ili tipkovnici na zaslonu telefona) za nastavak. ",cs:"1. Změřte vzdálenost od středu obrazovky k přední části oka (oba oko je v pořádku). Použijte pravítko nebo svinovací metr a při měření ignorujte brýle.\n2. Upravte svou polohu předklonem nebo vzad nebo posunutím židle, dokud nebude vzdálenost 111 AAA.\n3. Jakmile jste ve správné vzdálenosti, držte hlavu v klidu a odložte pravítko stranou, abyste zajistili, že kamera bude mít jasný výhled na celý váš obličej.\n4. Pokračujte stisknutím RETURN na klávesnici (nebo klávesnici na obrazovce telefonu). ",da:"1. Mål afstanden fra midten af ​​din skærm til forsiden af ​​dit øje (begge øjne er fine). Brug en lineal eller et målebånd, og ignorer eventuelle briller, mens du måler.\n2. Juster din position ved at læne dig frem eller tilbage, eller ved at flytte din stol, indtil afstanden er 111 AAA.\n3. Når du er i den rigtige afstand, skal du holde hovedet roligt og stille linealen til side for at sikre, at kameraet har frit udsyn til hele dit ansigt.\n4. Tryk på RETURN på dit tastatur (eller telefonskærmtastaturet) for at fortsætte. ",nl:"1. Meet de afstand vanaf het midden van uw scherm tot de voorkant van uw oog (beide ogen zijn prima). Gebruik een liniaal of meetlint en negeer een bril tijdens het meten.\n2. Pas uw positie aan door naar voren of naar achteren te leunen, of door uw stoel te verplaatsen, totdat de afstand 111 AAA is.\n3. Zodra u op de juiste afstand bent, houdt u uw hoofd stil en legt u de liniaal opzij, zodat de camera uw hele gezicht duidelijk kan zien.\n4. Druk op RETURN op uw toetsenbord (of het toetsenbord op het telefoonscherm) om door te gaan. ","en-UK":"1. Measure the distance from the centre of your screen to the front of your eye (either eye is fine). Use a ruler or tape measure, and ignore any glasses while measuring.\n2. Adjust your position by leaning forward or back, or by moving your chair, until the distance is 111 AAA.\n3. Once you’re at the correct distance, keep your head steady and set the ruler aside to ensure the camera has a clear view of your entire face.\n4. Press RETURN on your keyboard (or phone-screen keypad) to proceed.",fi:"1. Mittaa etäisyys näytön keskustasta silmäsi etuosaan (kumpi tahansa silmä on kunnossa). Käytä viivainta tai mittanauhaa ja jätä huomioimatta lasit mittauksen aikana.\n2. Säädä asentoasi nojaamalla eteenpäin tai taaksepäin tai liikuttamalla tuolia, kunnes etäisyys on 111 AAA.\n3. Kun olet oikealla etäisyydellä, pidä pää vakaana ja aseta viivain sivuun varmistaaksesi, että kameralla on selkeä näkymä koko kasvosi.\n4. Jatka painamalla näppäimistön (tai puhelimen näytön näppäimistön) RETURN-painiketta. ",fr:"1. Mesurez la distance entre le centre de votre écran et le devant de votre œil (n'importe quel œil convient). Utilisez une règle ou un mètre ruban, et ignorez les lunettes pendant la mesure. \n2. Ajustez votre position en vous penchant en avant ou en arrière, ou en déplaçant votre chaise, jusqu'à ce que la distance soit de 111 AAA. \n3. Une fois à la bonne distance, gardez la tête immobile et mettez la règle de côté pour que la caméra ait une vue dégagée de l'ensemble de votre visage. \n4. Appuyez sur RETOUR sur votre clavier (ou le clavier de l'écran de votre téléphone) pour continuer.",de:"1. Messen Sie den Abstand von der Mitte Ihres Bildschirms bis zur Vorderseite Ihres Auges (beide Augen sind in Ordnung). Verwenden Sie ein Lineal oder ein Maßband und ignorieren Sie beim Messen jegliche Brille.\n2. Passen Sie Ihre Position an, indem Sie sich nach vorne oder hinten lehnen oder Ihren Stuhl bewegen, bis der Abstand 111 AAA beträgt.\n3. Sobald Sie den richtigen Abstand erreicht haben, halten Sie Ihren Kopf ruhig und legen Sie das Lineal beiseite, um sicherzustellen, dass die Kamera Ihr gesamtes Gesicht klar sehen kann.\n4. Drücken Sie RETURN auf Ihrer Tastatur (oder dem Tastenfeld auf dem Telefonbildschirm), um fortzufahren. ",el:"1. Μετρήστε την απόσταση από το κέντρο της οθόνης σας στο μπροστινό μέρος του ματιού σας (κάθε από τα δύο μάτια είναι εντάξει). Χρησιμοποιήστε χάρακα ή μεζούρα και αγνοήστε τυχόν ποτήρια κατά τη μέτρηση.\n2. Προσαρμόστε τη θέση σας γέρνοντας προς τα εμπρός ή προς τα πίσω ή μετακινώντας την καρέκλα σας, έως ότου η απόσταση είναι 111 ΑΑΑ.\n3. Μόλις φτάσετε στη σωστή απόσταση, κρατήστε το κεφάλι σας σταθερό και αφήστε τον χάρακα στην άκρη για να βεβαιωθείτε ότι η κάμερα έχει καθαρή θέα ολόκληρου του προσώπου σας.\n4. Πατήστε RETURN στο πληκτρολόγιό σας (ή στο πληκτρολόγιο της οθόνης του τηλεφώνου) για να προχωρήσετε. ",he:"1. מדדו את המרחק ממרכז המסך לקדמת העין (כל אחת מהעיניים בסדר). השתמש בסרגל או בסרט מדידה, והתעלם מכל משקפיים בזמן המדידה.\n2. התאם את המיקום שלך על ידי הישענות קדימה או אחורה, או על ידי הזזת הכיסא שלך, עד שהמרחק הוא 111 AAA.\n3. ברגע שאתה במרחק הנכון, שמור על ראשך יציב והנח את הסרגל בצד כדי להבטיח שלמצלמה תהיה נוף ברור של כל הפנים שלך.\n4. לחץ על RETURN במקלדת (או במקלדת מסך הטלפון) כדי להמשיך. ",hi:"1. अपनी स्क्रीन के केंद्र से अपनी आंख के सामने तक की दूरी मापें (दोनों में से कोई भी आंख ठीक है)। एक रूलर या टेप माप का उपयोग करें, और मापते समय किसी भी चश्मे पर ध्यान न दें।\n2. आगे या पीछे झुककर, या अपनी कुर्सी को हिलाकर अपनी स्थिति को समायोजित करें, जब तक कि दूरी 111 एएए न हो जाए।\n3. एक बार जब आप सही दूरी पर हों, तो अपना सिर स्थिर रखें और रूलर को एक तरफ रख दें ताकि यह सुनिश्चित हो सके कि कैमरे को आपके पूरे चेहरे का स्पष्ट दृश्य दिखाई दे।\n4. आगे बढ़ने के लिए अपने कीबोर्ड (या फ़ोन-स्क्रीन कीपैड) पर रिटर्न दबाएँ। ",hu:"1. Mérje meg a távolságot a képernyő közepe és a szeme eleje között (mindegyik szem jó). Használjon vonalzót vagy mérőszalagot, és ne vegye figyelembe a szemüveget mérés közben.\n2. Állítsa be pozícióját előre vagy hátra dőlve, vagy a szék mozgatásával, amíg a távolság el nem éri a 111 AAA-t.\n3. Ha megfelelő távolságra van, tartsa stabilan a fejét, és tegye félre a vonalzót, hogy a kamera jól lássa az egész arcát.\n4. A folytatáshoz nyomja meg a RETURN gombot a billentyűzeten (vagy a telefon képernyőjén). ",is:"1. Mældu fjarlægðina frá miðju skjásins að framhlið augans (hvort augað er í lagi). Notaðu reglustiku eða málband og hunsa öll gleraugu á meðan þú mælir.\n2. Stilltu stöðu þína með því að halla þér fram eða aftur, eða með því að færa stólinn þinn, þar til fjarlægðin er 111 AAA.\n3. Þegar þú ert kominn í rétta fjarlægð skaltu halda höfðinu stöðugu og setja reglustikuna til hliðar til að tryggja að myndavélin hafi skýra sýn á allt andlitið á þér.\n4. Ýttu á RETURN á lyklaborðinu þínu (eða símaskjástakkaborðinu) til að halda áfram. ",id:"1. Ukur jarak dari tengah layar ke depan mata Anda (mata mana pun boleh-boleh saja). Gunakan penggaris atau pita pengukur, dan abaikan gelas apa pun saat mengukur.\n2. Sesuaikan posisi dengan cara mencondongkan tubuh ke depan atau ke belakang, atau dengan menggerakkan kursi, hingga jaraknya 111 AAA.\n3. Setelah Anda berada pada jarak yang tepat, jaga agar kepala Anda tetap stabil dan sisihkan penggaris untuk memastikan kamera dapat melihat seluruh wajah Anda dengan jelas.\n4. Tekan RETURN pada keyboard Anda (atau keypad layar ponsel) untuk melanjutkan. ",it:"1. Misura la distanza dal centro dello schermo alla parte anteriore dell'occhio (va bene qualsiasi occhio). Usa un righello o un metro a nastro e ignora eventuali occhiali durante la misurazione. 2. Regola la tua posizione sporgendoti in avanti o indietro, o spostando la sedia, fino a quando la distanza è di 111 AAA. 3. Una volta raggiunta la distanza corretta, mantieni la testa ferma e metti da parte il righello per garantire che la fotocamera abbia una visione chiara dell'intero viso. 4. Premi INVIO sulla tastiera (o sulla tastiera dello schermo del telefono) per procedere.",ja:"1. 画面の中心から目の前までの距離を測定します (どちらの目でも問題ありません)。定規や巻尺を使用し、測定中は眼鏡を無視してください。\n2. 距離が 111 AAA になるまで、前かがみになったり、椅子を動かしたりして、位置を調整します。\n3. 適切な距離に到達したら、頭を動かさず定規を脇に置き、カメラに顔全体がはっきりと映ることを確認します。\n4. キーボード (または電話画面のキーパッド) の RETURN を押して続行します。 ",kn:"1. ನಿಮ್ಮ ಪರದೆಯ ಮಧ್ಯಭಾಗದಿಂದ ನಿಮ್ಮ ಕಣ್ಣಿನ ಮುಂಭಾಗದ ಅಂತರವನ್ನು ಅಳೆಯಿರಿ (ಎರಡೂ ಕಣ್ಣು ಉತ್ತಮವಾಗಿರುತ್ತದೆ). ಆಡಳಿತಗಾರ ಅಥವಾ ಟೇಪ್ ಅಳತೆಯನ್ನು ಬಳಸಿ ಮತ್ತು ಅಳತೆ ಮಾಡುವಾಗ ಯಾವುದೇ ಕನ್ನಡಕವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ.\n2. ದೂರವು 111 AAA ಆಗುವವರೆಗೆ ಮುಂದಕ್ಕೆ ಅಥವಾ ಹಿಂದಕ್ಕೆ ಅಥವಾ ನಿಮ್ಮ ಕುರ್ಚಿಯನ್ನು ಚಲಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಸ್ಥಾನವನ್ನು ಹೊಂದಿಸಿ.\n3. ಒಮ್ಮೆ ನೀವು ಸರಿಯಾದ ದೂರದಲ್ಲಿದ್ದರೆ, ನಿಮ್ಮ ತಲೆಯನ್ನು ಸ್ಥಿರವಾಗಿರಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ಕ್ಯಾಮರಾ ನಿಮ್ಮ ಸಂಪೂರ್ಣ ಮುಖದ ಸ್ಪಷ್ಟ ನೋಟವನ್ನು ಹೊಂದಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ರೂಲರ್ ಅನ್ನು ಪಕ್ಕಕ್ಕೆ ಇರಿಸಿ.\n4. ಮುಂದುವರಿಯಲು ನಿಮ್ಮ ಕೀಬೋರ್ಡ್‌ನಲ್ಲಿ (ಅಥವಾ ಫೋನ್-ಸ್ಕ್ರೀನ್ ಕೀಪ್ಯಾಡ್) ರಿಟರ್ನ್ ಒತ್ತಿರಿ. ",ko:"1. 화면 중앙에서 눈 앞쪽까지의 거리를 측정합니다(어느 쪽 눈이라도 괜찮습니다). 자나 줄자를 사용하고 측정하는 동안 안경은 무시하십시오.\n2. 거리가 111 AAA가 될 때까지 앞뒤로 몸을 기울이거나 의자를 움직여 위치를 조정합니다.\n3. 올바른 거리에 도달한 후에는 머리를 안정시키고 카메라가 얼굴 전체를 선명하게 볼 수 있도록 자를 따로 보관해 두세요.\n4. 키보드(또는 휴대폰 화면 키패드)에서 RETURN을 눌러 계속 진행합니다. ",lt:"1. Išmatuokite atstumą nuo ekrano centro iki akies priekio (bet kuri akis tinka). Naudokite liniuotę arba matavimo juostą ir matavimo metu nekreipkite dėmesio į akinius.\n2. Sureguliuokite savo padėtį pasilenkdami į priekį arba atgal arba judindami kėdę, kol atstumas bus 111 AAA.\n3. Kai būsite tinkamu atstumu, laikykite galvą stabiliai ir padėkite liniuotę į šalį, kad fotoaparatas aiškiai matytų visą jūsų veidą.\n4. Norėdami tęsti, paspauskite RETURN klaviatūroje (arba telefono ekrano klaviatūroje). ",ms:"1. Ukur jarak dari tengah skrin anda ke hadapan mata anda (sama ada mata baik). Gunakan pembaris atau pita pengukur, dan abaikan sebarang cermin mata semasa mengukur.\n2. Laraskan kedudukan anda dengan bersandar ke hadapan atau belakang, atau dengan menggerakkan kerusi anda, sehingga jaraknya ialah 111 AAA.\n3. Sebaik sahaja anda berada pada jarak yang betul, pastikan kepala anda stabil dan ketepikan pembaris untuk memastikan kamera mempunyai pandangan yang jelas ke seluruh wajah anda.\n4. Tekan RETURN pada papan kekunci anda (atau pad kekunci skrin telefon) untuk meneruskan. ",ml:"1. നിങ്ങളുടെ സ്‌ക്രീനിൻ്റെ മധ്യഭാഗത്ത് നിന്ന് കണ്ണിൻ്റെ മുൻഭാഗത്തേക്കുള്ള ദൂരം അളക്കുക (ഒന്നുകിൽ കണ്ണ് നന്നായിരിക്കും). ഒരു റൂളർ അല്ലെങ്കിൽ ടേപ്പ് അളവ് ഉപയോഗിക്കുക, അളക്കുന്ന സമയത്ത് ഏതെങ്കിലും ഗ്ലാസുകൾ അവഗണിക്കുക.\n2. ദൂരം 111 എഎഎ ആകുന്നത് വരെ മുന്നോട്ട് അല്ലെങ്കിൽ പിന്നിലേക്ക് ചാഞ്ഞുകൊണ്ട് അല്ലെങ്കിൽ നിങ്ങളുടെ കസേര ചലിപ്പിച്ചുകൊണ്ട് നിങ്ങളുടെ സ്ഥാനം ക്രമീകരിക്കുക.\n3. നിങ്ങൾ കൃത്യമായ അകലത്തിൽ എത്തിക്കഴിഞ്ഞാൽ, നിങ്ങളുടെ തല സ്ഥിരമായി സൂക്ഷിക്കുകയും ക്യാമറയ്ക്ക് നിങ്ങളുടെ മുഴുവൻ മുഖവും വ്യക്തമായി കാണാമെന്ന് ഉറപ്പാക്കാൻ ഭരണാധികാരിയെ മാറ്റിവെക്കുകയും ചെയ്യുക.\n4. തുടരുന്നതിന് നിങ്ങളുടെ കീബോർഡിൽ (അല്ലെങ്കിൽ ഫോൺ-സ്ക്രീൻ കീപാഡ്) RETURN അമർത്തുക. ",no:"1. Mål avstanden fra midten av skjermen til forsiden av øyet (begge øyne er fine). Bruk en linjal eller målebånd, og ignorer eventuelle briller mens du måler.\n2. Juster posisjonen din ved å lene deg forover eller bakover, eller ved å flytte stolen, til avstanden er 111 AAA.\n3. Når du er i riktig avstand, hold hodet stødig og sett linjalen til side for å sikre at kameraet har fri sikt over hele ansiktet ditt.\n4. Trykk RETURN på tastaturet (eller telefonskjermtastaturet) for å fortsette. ",fa:"1. فاصله مرکز صفحه نمایش خود را تا جلوی چشم اندازه گیری کنید (هر کدام از چشم ها خوب است). از یک خط کش یا متر استفاده کنید و در حین اندازه گیری از هر عینکی چشم پوشی کنید.\n2. موقعیت خود را با خم شدن به جلو یا عقب یا با حرکت دادن صندلی تنظیم کنید تا فاصله 111 AAA شود.\n3. هنگامی که در فاصله صحیح قرار گرفتید، سر خود را ثابت نگه دارید و خط کش را کنار بگذارید تا مطمئن شوید دوربین دید واضحی از کل صورت شما دارد.\n4. برای ادامه، RETURN را روی صفحه کلید (یا صفحه کلید صفحه تلفن) فشار دهید. ",pl:"1. Zmierz odległość od środka ekranu do przedniej części oka (każde oko jest w porządku). Użyj linijki lub miarki i podczas pomiaru ignoruj ​​okulary.\n2. Dostosuj swoją pozycję, pochylając się do przodu, do tyłu lub przesuwając krzesło, aż odległość wyniesie 111 AAA.\n3. Gdy znajdziesz się we właściwej odległości, trzymaj głowę stabilnie i odłóż linijkę na bok, aby kamera dobrze widziała całą Twoją twarz.\n4. Naciśnij POWRÓT na klawiaturze (lub klawiaturze na ekranie telefonu), aby kontynuować. ",pt:"1. Meça a distância do centro da tela até a frente do olho (qualquer um dos olhos está bem). Use uma régua ou fita métrica e ignore os óculos durante a medição.\n2. Ajuste sua posição inclinando-se para frente ou para trás, ou movendo a cadeira, até que a distância seja 111 AAA.\n3. Quando estiver na distância correta, mantenha a cabeça firme e deixe a régua de lado para garantir que a câmera tenha uma visão clara de todo o seu rosto.\n4. Pressione RETURN no teclado (ou no teclado da tela do telefone) para continuar. ",ro:"1. Măsurați distanța de la centrul ecranului la partea din față a ochiului (fiecare ochi este bine). Folosiți o riglă sau o bandă de măsură și ignorați orice ochelari în timp ce măsurați.\n2. Reglați-vă poziția aplecându-vă înainte sau înapoi, sau mișcându-vă scaunul, până când distanța este de 111 AAA.\n3. Odată ce vă aflați la distanța corectă, țineți capul neclintit și lăsați rigla deoparte pentru a vă asigura că camera are o vedere clară a întregii fețe.\n4. Apăsați RETURN de pe tastatură (sau de pe ecranul telefonului) pentru a continua. ",ru:"1. Измерьте расстояние от центра экрана до передней части глаза (любой глаз в порядке). Используйте линейку или рулетку и не обращайте внимания на очки при измерении.\n2. Отрегулируйте свое положение, наклоняясь вперед или назад или перемещая стул до тех пор, пока расстояние не составит 111 ААА.\n3. Как только вы окажетесь на нужном расстоянии, держите голову ровно и отложите линейку в сторону, чтобы камера могла четко видеть все ваше лицо.\n4. Нажмите RETURN на клавиатуре (или клавиатуре экрана телефона), чтобы продолжить. ",sr:"1. Измерите растојање од центра екрана до предњег дела ока (свако око је у реду). Користите лењир или мерну траку и занемарите наочаре док мерите.\n2. Подесите свој положај нагињањем напред или назад, или померањем столице, све док растојање не буде 111 ААА.\n3. Када се нађете на тачној удаљености, држите главу мирно и одложите лењир да бисте осигурали да камера има јасан поглед на цело лице.\n4. Притисните РЕТУРН на тастатури (или тастатури на екрану телефона) да бисте наставили. ",es:"1. Mide la distancia desde el centro de tu pantalla hasta el frente de tu ojo (cualquiera de los dos está bien). Usa una regla o cinta métrica, e ignora cualquier gafas mientras mides. 2. Ajusta tu posición inclinándote hacia adelante o hacia atrás, o moviendo tu silla, hasta que la distancia sea de 111 AAA. 3. Una vez que estés a la distancia correcta, mantén la cabeza firme y deja la regla a un lado para asegurar que la cámara tenga una vista clara de toda tu cara. 4. Presiona RETURN en tu teclado (o teclado de pantalla del teléfono) para continuar.",sw:"1. Pima umbali kutoka katikati ya skrini yako hadi mbele ya jicho lako (jicho lolote ni sawa). Tumia rula au kipimo cha tepi, na upuuze miwani yoyote wakati wa kupima.\n2. Rekebisha msimamo wako kwa kuegemea mbele au nyuma, au kwa kusonga kiti chako, hadi umbali ni 111 AAA.\n3. Unapokuwa katika umbali ufaao, weka kichwa chako sawa na uweke rula kando ili kuhakikisha kuwa kamera ina mwonekano wazi wa uso wako wote.\n4. Bonyeza RETURN kwenye kibodi yako (au vitufe vya skrini ya simu) ili kuendelea. ",sv:"1. Mät avståndet från mitten av skärmen till framsidan av ögat (bdera ögat är bra). Använd en linjal eller ett måttband och ignorera eventuella glasögon medan du mäter.\n2. Justera din position genom att luta dig framåt eller bakåt, eller genom att flytta din stol, tills avståndet är 111 AAA.\n3. När du är på rätt avstånd, håll huvudet stadigt och ställ linjalen åt sidan för att säkerställa att kameran har fri sikt över hela ditt ansikte.\n4. Tryck på RETURN på ditt tangentbord (eller telefonens knappsats) för att fortsätta. ",tl:"1. Sukatin ang distansya mula sa gitna ng iyong screen hanggang sa harap ng iyong mata (alinman sa mata ay maayos). Gumamit ng ruler o tape measure, at huwag pansinin ang anumang baso habang sumusukat.\n2. Ayusin ang iyong posisyon sa pamamagitan ng paghilig pasulong o likod, o sa pamamagitan ng paggalaw ng iyong upuan, hanggang ang distansya ay 111 AAA.\n3. Kapag nasa tamang distansya ka na, panatilihing matatag ang iyong ulo at itabi ang ruler upang matiyak na malinaw na nakikita ng camera ang iyong buong mukha.\n4. Pindutin ang RETURN sa iyong keyboard (o phone-screen keypad) upang magpatuloy. ",tr:"1. Ekranınızın ortasından gözünüzün ön kısmına kadar olan mesafeyi ölçün (her iki göz de iyidir). Bir cetvel veya şerit metre kullanın ve ölçüm yaparken gözlükleri dikkate almayın.\n2. Mesafe 111 AAA olana kadar öne veya arkaya eğilerek veya sandalyenizi hareket ettirerek konumunuzu ayarlayın.\n3. Doğru mesafeye geldiğinizde başınızı sabit tutun ve kameranın tüm yüzünüzü net bir şekilde görmesini sağlamak için cetveli bir kenara bırakın.\n4. Devam etmek için klavyenizdeki (veya telefon ekranı tuş takımınızdaki) RETURN tuşuna basın. ",ur:"1. اپنی اسکرین کے مرکز سے اپنی آنکھ کے سامنے تک فاصلے کی پیمائش کریں (یا تو آنکھ ٹھیک ہے)۔ ایک حکمران یا ٹیپ کی پیمائش کا استعمال کریں، اور پیمائش کرتے وقت کسی بھی شیشے کو نظر انداز کریں.\n2. آگے یا پیچھے جھک کر، یا اپنی کرسی کو حرکت دے کر اپنی پوزیشن کو ایڈجسٹ کریں، جب تک کہ فاصلہ 111 AAA نہ ہو۔\n3. ایک بار جب آپ صحیح فاصلے پر ہوں، اپنے سر کو ساکت رکھیں اور اس بات کو یقینی بنانے کے لیے کہ کیمرہ آپ کے پورے چہرے کا واضح نظارہ کر سکتا ہے، حکمران کو ایک طرف رکھیں۔\n4. آگے بڑھنے کے لیے اپنے کی بورڈ (یا فون اسکرین کی پیڈ) پر RETURN دبائیں۔ "},RC_TestDistances:{"en-US":"Test Distances",ar:"اختبار المسافات",hy:"Փորձարկման հեռավորություններ",bg:"Тестови разстояния","zh-CN":"测试距离","zh-HK":"測試距離",hr:"Test udaljenosti",cs:"Testovací vzdálenosti",da:"Test afstande",nl:"Afstanden testen","en-UK":"Test Distances",fi:"Testietäisyydet",fr:"Tester les distances",de:"Testentfernungen",el:"Αποστάσεις δοκιμής",he:"מרחקי מבחן",hi:"दूरियाँ परीक्षण करें",hu:"Teszt távolságok",is:"Próf vegalengdir",id:"Jarak Tes",it:"Distanze di prova",ja:"テスト距離",kn:"ಪರೀಕ್ಷಾ ದೂರಗಳು",ko:"테스트 거리",lt:"Bandymo atstumai",ms:"Jarak Ujian",ml:"ടെസ്റ്റ് ദൂരങ്ങൾ",no:"Test avstander",fa:"فاصله های تست",pl:"Odległości testowe",pt:"Distâncias de teste",ro:"Distanțe de testare",ru:"Тестовые расстояния",sr:"Тест Дистанцес",es:"Prueba de distancias",sw:"Umbali wa Mtihani",sv:"Testa avstånd",tl:"Mga Distansya ng Pagsubok",tr:"Test Mesafeleri",ur:"ٹیسٹ فاصلے"},RC_canUsePhoneKeypad:{"en-US":"To respond, you can use the keypad on your phone.",ar:"للرد، يمكنك استخدام لوحة المفاتيح على هاتفك.",hy:"Պատասխանելու համար կարող եք օգտագործել ձեր հեռախոսի ստեղնաշարը:",bg:"За да отговорите, можете да използвате клавиатурата на телефона си.","zh-CN":"要回复,您可以使用手机上的键盘。","zh-HK":"要回复,您可以使用手機上的鍵盤。",hr:"Da biste odgovorili, možete koristiti tipkovnicu na telefonu.",cs:"Chcete-li odpovědět, můžete použít klávesnici na telefonu.",da:"For at svare kan du bruge tastaturet på din telefon.",nl:"Om te reageren kunt u het toetsenbord van uw telefoon gebruiken.","en-UK":"To respond, you can use the keypad on your mobile.",fi:"Voit vastata puhelimesi näppäimistön avulla.",fr:"Pour répondre, vous pouvez utiliser le clavier de votre téléphone.",de:"Um zu antworten, können Sie die Tastatur Ihres Telefons verwenden.",el:"Για να απαντήσετε, μπορείτε να χρησιμοποιήσετε το πληκτρολόγιο του τηλεφώνου σας.",he:"כדי להגיב, תוכל להשתמש בלוח המקשים בטלפון שלך.",hi:"उत्तर देने के लिए, आप अपने फ़ोन पर कीपैड का उपयोग कर सकते हैं।",hu:"A válaszadáshoz használhatja a telefon billentyűzetét.",is:"Til að svara geturðu notað takkaborðið á símanum þínum.",id:"Untuk merespons, Anda dapat menggunakan keypad di ponsel Anda.",it:"Per rispondere, puoi utilizzare il tastierino del tuo telefono.",ja:"応答するには、電話機のキーパッドを使用できます。",kn:"ಪ್ರತಿಕ್ರಿಯಿಸಲು, ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ನೀವು ಕೀಪ್ಯಾಡ್ ಅನ್ನು ಬಳಸಬಹುದು.",ko:"응답하려면 전화기의 키패드를 사용할 수 있습니다.",lt:"Ryšys veikia! Dabar uždaroma. Ačiū.",ms:"Untuk membalas, anda boleh menggunakan pad kekunci pada telefon anda.",ml:"പ്രതികരിക്കാൻ, നിങ്ങളുടെ ഫോണിലെ കീപാഡ് ഉപയോഗിക്കാം.",no:"Koblingen fungerer! Nå lukkes den. Takk.",fa:"اتصال کار می کند! حالا در حال بستن است. متشکرم.",pl:"Aby odpowiedzieć, możesz użyć klawiatury w telefonie.",pt:"A conexão funciona! Agora está sendo encerrada. Obrigado.",ro:"Pentru a răspunde, puteți utiliza tastatura de pe telefon.",ru:"Соединение работает! Сейчас закрываю. Спасибо.",sr:"Да бисте одговорили, можете користити тастатуру на свом телефону.",es:"Para responder, puedes usar el teclado de tu teléfono.",sw:"Ili kujibu, unaweza kutumia vitufe kwenye simu yako.",sv:"För att svara kan du använda knappsatsen på din telefon.",tl:"Upang tumugon, maaari mong gamitin ang keypad sa iyong telepono.",tr:"Yanıt vermek için telefonunuzun tuş takımını kullanabilirsiniz.",ur:"جواب دینے کے لیے، آپ اپنے فون پر کی پیڈ استعمال کر سکتے ہیں۔"},RC_distanceTrackingRedo:{"en-US":"PROBLEM? If the distance seems terribly wrong, click here to recalibrate it, and restart this block.",ar:"مشكلة؟ إذا كانت المسافة تبدو خاطئة بشكل كبير، انقر هنا لإعادة معايرتها، وأعد تشغيل هذا الجزء.",hy:"ԽՆԴԻՐ. Եթե ​​հեռավորությունը ահավոր սխալ է թվում, սեղմեք այստեղ՝ այն վերահաշվարկելու համար և վերագործարկեք այս բլոկը:",bg:"ПРОБЛЕМ? Ако разстоянието изглежда ужасно грешно, щракнете тук, за да го калибрирате отново и рестартирайте този блок.","zh-CN":"问题?如果距离看起来非常错误,请单击此处重新校准,然后重新启动此块。","zh-HK":"問題?如果距離看起來非常錯誤,請按一下此處重新校準,然後重新啟動此區塊。",hr:"PROBLEM? Ako se udaljenost čini užasno pogrešnom, kliknite ovdje da je ponovno kalibrirate i ponovno pokrenite ovaj blok.",cs:"PROBLÉM? Pokud se vzdálenost zdá strašně špatná, kliknutím sem ji překalibrujte a restartujte tento blok.",da:"PROBLEM? Hvis afstanden virker frygtelig forkert, skal du klikke her for at kalibrere den igen og genstarte denne blok.",nl:"PROBLEEM? Als de afstand vreselijk verkeerd lijkt, klik dan hier om deze opnieuw te kalibreren en start dit blok opnieuw.","en-UK":"PROBLEM? If the distance seems terribly wrong, click here to recalibrate it, and restart this section.",fi:"ONGELMA? Jos etäisyys vaikuttaa hirveän väärältä, napsauta tätä kalibroidaksesi sen uudelleen ja käynnistä tämä lohko uudelleen.",fr:"PROBLÈME ? Si la distance semble terriblement incorrecte, cliquez ici pour la recalibrer et redémarrez ce bloc.",de:"PROBLEM? Wenn der Abstand völlig falsch erscheint, klicken Sie hier, um ihn neu zu kalibrieren, und starten Sie diesen Block neu.",el:"ΠΡΟΒΛΗΜΑ; Εάν η απόσταση φαίνεται τρομερά λάθος, κάντε κλικ εδώ για να την επαναβαθμονομήσετε και επανεκκινήστε αυτό το μπλοκ.",he:"בְּעָיָה? אם המרחק נראה שגוי מאוד, לחץ כאן כדי לכייל אותו מחדש, והפעל מחדש את הבלוק הזה.",hi:"संकट? यदि दूरी बहुत गलत लगती है, तो इसे पुनः कैलिब्रेट करने के लिए यहां क्लिक करें, और इस ब्लॉक को पुनरारंभ करें।",hu:"PROBLÉMA? Ha a távolság nagyon rossznak tűnik, kattintson ide az újrakalibráláshoz, és indítsa újra ezt a blokkot.",is:"VANDAMÁL? Ef fjarlægðin virðist hræðilega röng, smelltu hér til að endurkvarða hana og endurræstu þessa blokk.",id:"MASALAH? Jika jaraknya tampak sangat salah, klik di sini untuk mengkalibrasi ulang, dan mulai ulang blok ini.",it:"PROBLEMA? Se la distanza sembra terribilmente sbagliata, fai clic qui per ricalibrarla e riavvia questo blocco.",ja:"問題?距離が著しく間違っていると思われる場合は、ここをクリックして距離を再調整し、このブロックを再開してください。",kn:"ಸಮಸ್ಯೆ? ದೂರವು ತುಂಬಾ ತಪ್ಪಾಗಿ ಕಂಡುಬಂದರೆ, ಅದನ್ನು ಮರುಮಾಪನ ಮಾಡಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ಈ ಬ್ಲಾಕ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.",ko:"문제? 거리가 심하게 잘못된 것 같으면 여기를 클릭하여 다시 보정하고 이 블록을 다시 시작하세요.",lt:"PROBLEMA? Jei atstumas atrodo labai neteisingas, spustelėkite čia, kad jį iš naujo sukalibruotumėte ir paleistumėte bloką iš naujo.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"പ്രശ്നം? ദൂരം വളരെ തെറ്റാണെന്ന് തോന്നുന്നുവെങ്കിൽ, അത് വീണ്ടും കാലിബ്രേറ്റ് ചെയ്യാൻ ഇവിടെ ക്ലിക്ക് ചെയ്യുക, ഈ ബ്ലോക്ക് റീസ്റ്റാർട്ട് ചെയ്യുക.",no:"PROBLEM? Hvis avstanden virker veldig feil, klikk her for å kalibrere den på nytt, og start denne blokken på nytt.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"PROBLEM? Jeśli odległość wydaje się strasznie niewłaściwa, kliknij tutaj, aby ją ponownie skalibrować i zrestartuj ten blok.",pt:"PROBLEMA? Se a distância parecer terrivelmente errada, clique aqui para recalibrá-la e reinicie este bloco.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"¿PROBLEMA? Si la distancia parece terriblemente incorrecta, haz clic aquí para recalibrarla y reiniciar este bloque.",sw:"TATIZO? Ikiwa umbali unaonekana kuwa mbaya sana, bofya hapa ili kuirekebisha upya, na uanzishe upya kizuizi hiki.",sv:"PROBLEM? Om avståndet verkar väldigt fel, klicka här för att kalibrera om det och starta om det här blocket.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"SORUN? Mesafe çok yanlış görünüyorsa, yeniden kalibre etmek için buraya tıklayın ve bu bloğu yeniden başlatın.",ur:"مسئلہ؟ اگر فاصلہ بہت غلط لگتا ہے، تو اسے دوبارہ ترتیب دینے کے لیے یہاں کلک کریں، اور اس بلاک کو دوبارہ شروع کریں۔"},RC_distanceTrackingTitle:{"en-US":"Find Your Blindspot",ar:"اكتشف النقطة العمياء لديك",hy:"Գտեք ձեր կույր կետը",bg:"Намерете своето сляпо петно","zh-CN":"找到你的盲点","zh-HK":"找到你的盲點",hr:"Pronađite svoju slijepu točku",cs:"Najděte svůj Blindspot",da:"Find din blindvinkel",nl:"Vind uw blinde vlek","en-UK":"Find Your Blindspot",fi:"Löydä sokeapiste",fr:"Trouvez votre angle mort",de:"Finden Sie Ihren blinden Fleck",el:"Βρείτε το Blindspot σας",he:"מצא את נקודת העיוור שלך",hi:"अपना ब्लाइंडस्पॉट ढूंढें",hu:"Találja meg vakfoltját",is:"Finndu blindblettinn þinn",id:"Temukan Titik Buta Anda",it:"Trova il tuo punto cieco",ja:"盲点を見つけよう",kn:"ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್ ಅನ್ನು ಹುಡುಕಿ",ko:"맹점 찾기",lt:"Raskite savo akląją tašką",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ട് കണ്ടെത്തുക",no:"Finn din blindsone",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Znajdź swój martwy punkt",pt:"Encontre o seu ponto cego",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Encuentra tu punto ciego",sw:"Tafuta Blindspot yako",sv:"Hitta din blinda vinkel",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Kör Noktanızı Bulun",ur:"اپنا بلائنڈ سپاٹ تلاش کریں۔"},RC_errorCameraUseDenied:{"en-US":"As stated in its description, this study is incompatible with ooo, and needs the BBB browser running on a DDD with at least 222 CPU cores",ar:"كما هو مذكور في وصفه، هذه الدراسة غير متوافقة مع ooo، وتحتاج إلى متصفح BBB يعمل على DDD مع ما لا يقل عن 222 نواة CPU.",hy:"Ինչպես նշված է իր նկարագրության մեջ, այս ուսումնասիրությունը անհամատեղելի է ooo-ի հետ և անհրաժեշտ է, որ BBB զննարկիչը աշխատի DDD-ով, որն ունի առնվազն 222 պրոցեսորային միջուկ:",bg:"Както е посочено в описанието му, това проучване е несъвместимо с ooo и се нуждае от браузър BBB, работещ на DDD с поне 222 CPU ядра","zh-CN":"正如其描述中所述,本研究与 ooo 不兼容,并且需要在至少 222 个 CPU 核心的 DDD 上运行 BBB 浏览器","zh-HK":"如其描述中所述,本研究與 ooo 不相容,並且需要在至少 222 個 CPU 核心的 DDD 上執行 BBB 瀏覽器",hr:"Kao što je navedeno u opisu, ova studija nije kompatibilna s ooo i treba BBB preglednik koji radi na DDD-u s najmanje 222 CPU jezgre",cs:"Jak je uvedeno v popisu, tato studie je nekompatibilní s ooo a potřebuje prohlížeč BBB běžící na DDD s alespoň 222 CPU jádry",da:"Som angivet i dens beskrivelse, er denne undersøgelse inkompatibel med ooo og kræver, at BBB-browseren kører på en DDD med mindst 222 CPU-kerner",nl:"Zoals vermeld in de beschrijving, is deze studie incompatibel met ooo en heeft de BBB-browser nodig die draait op een DDD met minimaal 222 CPU-kernen","en-UK":"As stated in its description, this study is incompatible with ooo, and needs the BBB browser running on a DDD with at least 222 CPU cores",fi:"Kuten sen kuvauksessa todetaan, tämä tutkimus ei ole yhteensopiva ooo:n kanssa ja vaatii BBB-selaimen, joka toimii DDD:llä, jossa on vähintään 222 CPU-ydintä",fr:"Comme indiqué dans sa description, cette étude est incompatible avec ooo et nécessite le navigateur BBB fonctionnant sur un DDD avec au moins 222 cœurs de processeur.",de:"Wie in der Beschreibung angegeben, ist diese Studie nicht mit ooo kompatibel und erfordert, dass der BBB-Browser auf einem DDD mit mindestens 222 CPU-Kernen läuft",el:"Όπως αναφέρεται στην περιγραφή της, αυτή η μελέτη δεν είναι συμβατή με το ooo και χρειάζεται το πρόγραμμα περιήγησης BBB να λειτουργεί σε DDD με τουλάχιστον 222 πυρήνες CPU",he:"כפי שצוין בתיאורו, מחקר זה אינו תואם ל-ooo, וזקוק לדפדפן BBB הפועל על DDD עם לפחות 222 ליבות מעבד",hi:"जैसा कि इसके विवरण में कहा गया है, यह अध्ययन ओओओ के साथ असंगत है, और कम से कम 222 सीपीयू कोर के साथ डीडीडी पर चलने वाले बीबीबी ब्राउज़र की आवश्यकता है",hu:"Amint a leírásában szerepel, ez a tanulmány nem kompatibilis az ooo-val, és legalább 222 CPU maggal rendelkező DDD-n futó BBB böngészőre van szüksége",is:"Eins og fram kemur í lýsingu hennar er þessi rannsókn ósamrýmanleg ooo og þarf að BBB vafra keyrir á DDD með að minnsta kosti 222 CPU kjarna",id:"Sebagaimana tercantum dalam uraiannya, penelitian ini tidak kompatibel dengan ooo, dan memerlukan browser BBB yang berjalan pada DDD dengan setidaknya 222 inti CPU",it:"Come indicato nella sua descrizione, questo studio è incompatibile con ooo e necessita del browser BBB in esecuzione su un DDD con almeno 222 core CPU.",ja:"説明に記載されているように、この調査は ooo と互換性がなく、少なくとも 222 CPU コアを備えた DDD 上で実行される BBB ブラウザが必要です。",kn:"ಅದರ ವಿವರಣೆಯಲ್ಲಿ ಹೇಳಿರುವಂತೆ, ಈ ಅಧ್ಯಯನವು ooo ನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ ಮತ್ತು ಕನಿಷ್ಠ 222 CPU ಕೋರ್‌ಗಳೊಂದಿಗೆ DDD ನಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿರುವ BBB ಬ್ರೌಸರ್ ಅಗತ್ಯವಿದೆ",ko:"설명에 명시된 바와 같이 이 연구는 ooo와 호환되지 않으며 최소 222개의 CPU 코어가 있는 DDD에서 실행되는 BBB 브라우저가 필요합니다.",lt:"Kaip nurodyta jo aprašyme, šis tyrimas nesuderinamas su ooo ir jam reikia BBB naršyklės, veikiančios DDD su mažiausiai 222 procesoriaus branduoliais.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"അതിൻ്റെ വിവരണത്തിൽ പറഞ്ഞിരിക്കുന്നതുപോലെ, ഈ പഠനം ooo-മായി പൊരുത്തപ്പെടുന്നില്ല, കൂടാതെ കുറഞ്ഞത് 222 CPU കോറുകളുള്ള DDD-യിൽ പ്രവർത്തിക്കുന്ന BBB ബ്രൗസർ ആവശ്യമാണ്",no:"Som nevnt i beskrivelsen, er denne studien inkompatibel med ooo, og trenger BBB-nettleseren som kjører på en DDD med minst 222 CPU-kjerner",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Jak stwierdzono w opisie, to badanie jest niekompatybilne z ooo i wymaga przeglądarki BBB działającej na DDD z co najmniej 222 rdzeniami procesora",pt:"Conforme declarado em sua descrição, este estudo é incompatível com ooo e precisa do navegador BBB rodando em um DDD com pelo menos 222 núcleos de CPU",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Según se indica en su descripción, este estudio es incompatible con ooo y necesita que el navegador BBB se ejecute en un DDD con al menos 222 núcleos de CPU.",sw:"Kama ilivyoelezwa katika maelezo yake, utafiti huu hauoani na ooo, na unahitaji kivinjari cha BBB kinachotumia DDD yenye angalau cores 222 za CPU.",sv:"Som anges i beskrivningen är denna studie inkompatibel med ooo och behöver BBB-webbläsaren köras på en DDD med minst 222 CPU-kärnor",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Açıklamasında belirtildiği gibi bu çalışma ooo ile uyumlu değildir ve en az 222 CPU çekirdeğine sahip bir DDD üzerinde çalışan BBB tarayıcısına ihtiyaç duymaktadır.",ur:"جیسا کہ اس کی تفصیل میں بتایا گیا ہے، یہ مطالعہ ooo کے ساتھ مطابقت نہیں رکھتا ہے، اور اسے کم از کم 222 CPU کور والے DDD پر چلنے والے BBB براؤزر کی ضرورت ہے۔"},RC_errorNoCamera:{"en-US":"This study needs to use the webcam. Granting access to your webcam is optional, but we can't continue without it. If you said No by mistake and now wish to grant access to your camera, please find the camera icon in the address bar, click it, allow camera access, and refresh the page. To refresh the page, tap the refresh icon “⟳” in the address bar.",ar:'تحتاج هذه الدراسة إلى استخدام كاميرا الويب. منح الوصول إلى كاميرا الويب الخاصة بك اختياري، لكن لا يمكننا المتابعة بدونها. إذا قلت لا عن طريق الخطأ وترغب الآن في منح الوصول إلى الكاميرا، يرجى العثور على أيقونة الكاميرا في شريط العنوان، انقر عليها، اسمح بالوصول إلى الكاميرا، وقم بتحديث الصفحة. لتحديث الصفحة، اضغط على أيقونة التحديث "⟳" في شريط العنوان.',hy:"Այս ուսումնասիրությունը պետք է օգտագործի վեբ-տեսախցիկը: Ձեր վեբ-տեսախցիկի մուտքի թույլտվությունը պարտադիր չէ, բայց մենք չենք կարող շարունակել առանց դրա: Եթե ​​սխալմամբ «Ոչ» եք ասել և այժմ ցանկանում եք մուտք գործել ձեր տեսախցիկ, խնդրում ենք գտնել տեսախցիկի պատկերակը հասցեագոտում, սեղմել այն, թույլ տալ տեսախցիկի մուտքը և թարմացնել էջը: Էջը թարմացնելու համար հասցեագոտում հպեք «⟳» թարմացման պատկերակին:",bg:"Това изследване трябва да използва уеб камерата. Предоставянето на достъп до вашата уеб камера не е задължително, но не можем да продължим без него. Ако сте казали Не по погрешка и сега искате да предоставите достъп до вашата камера, моля, намерете иконата на камерата в адресната лента, щракнете върху нея, разрешете достъп до камерата и опреснете страницата. За да опресните страницата, докоснете иконата за опресняване „⟳“ в адресната лента.","zh-CN":"本研究需要使用网络摄像头。授予对网络摄像头的访问权限是可选的,但如果没有它,我们就无法继续。如果您错误地说“否”,现在希望授予对相机的访问权限,请在地址栏中找到相机图标,单击它,允许相机访问,然后刷新页面。要刷新页面,请点击地址栏中的刷新图标“⟳”。","zh-HK":"本研究需使用網路攝影機。授予對網路攝影機的存取權限是可選的,但如果沒有它,我們就無法繼續。如果您錯誤地說“否”,現在希望授予對相機的訪問權限,請在地址欄中找到相機圖標,單擊它,允許相機訪問,然後刷新頁面。若要重新整理頁面,請點選網址列中的重新整理圖示「⟳」。",hr:"Ova studija mora koristiti web kameru. Odobravanje pristupa vašoj web kameri nije obavezno, ali ne možemo nastaviti bez njega. Ako ste greškom rekli Ne i sada želite odobriti pristup svojoj kameri, pronađite ikonu kamere u adresnoj traci, kliknite je, dopustite pristup kameri i osvježite stranicu. Da biste osvježili stranicu, dodirnite ikonu za osvježavanje “⟳” u adresnoj traci.",cs:"Tato studie musí používat webovou kameru. Udělení přístupu k vaší webové kameře je volitelné, ale bez něj nemůžeme pokračovat. Pokud jste omylem řekli Ne a nyní si přejete udělit přístup ke své kameře, najděte ikonu fotoaparátu v adresním řádku, klikněte na ni, povolte přístup k fotoaparátu a obnovte stránku. Chcete-li stránku obnovit, klepněte na ikonu obnovení „⟳“ v adresním řádku.",da:'Denne undersøgelse skal bruge webcam. Det er valgfrit at give adgang til dit webcam, men vi kan ikke fortsætte uden det. Hvis du sagde nej ved en fejl og nu ønsker at give adgang til dit kamera, skal du finde kameraikonet i adresselinjen, klikke på det, tillade kameraadgang og opdatere siden. For at opdatere siden skal du trykke på opdateringsikonet "⟳" i adresselinjen.',nl:"Bij dit onderzoek moet gebruik worden gemaakt van de webcam. Het verlenen van toegang tot je webcam is optioneel, maar we kunnen niet zonder. Als u per ongeluk Nee hebt gezegd en nu toegang tot uw camera wilt verlenen, zoek dan het camerapictogram in de adresbalk, klik erop, sta cameratoegang toe en vernieuw de pagina. Om de pagina te vernieuwen, tikt u op het vernieuwingspictogram “⟳” in de adresbalk.","en-UK":"This study needs to use the webcam. Granting access to your webcam is optional, but we can't continue without it. If you said No by mistake and now wish to grant access to your camera, please find the camera icon in the address bar, click it, allow camera access, and refresh the page. To refresh the page, tap the refresh icon “⟳” in the address bar.",fi:'Tässä tutkimuksessa on käytettävä verkkokameraa. Verkkokameran käyttöoikeuden myöntäminen on valinnaista, mutta emme voi jatkaa ilman sitä. Jos sanoit vahingossa Ei ja haluat nyt myöntää kamerasi käyttöoikeuden, etsi kamerakuvake osoitepalkista, napsauta sitä, salli kameran käyttö ja päivitä sivu. Päivitä sivu napauttamalla päivityskuvaketta "⟳" osoitepalkissa.',fr:"Cette étude nécessite l'utilisation de la webcam. Accorder l'accès à votre webcam est facultatif, mais nous ne pouvons pas continuer sans cela. Si vous avez dit Non par erreur et souhaitez maintenant accorder l'accès à votre caméra, veuillez trouver l'icône de la caméra dans la barre d'adresse, cliquez dessus, autorisez l'accès à la caméra et actualisez la page. Pour actualiser la page, appuyez sur l'icône d'actualisation \"⟳\" dans la barre d'adresse.",de:"Für diese Studie muss die Webcam verwendet werden. Das Gewähren des Zugriffs auf Ihre Webcam ist optional, wir können jedoch ohne diesen Zugriff nicht fortfahren. Wenn Sie versehentlich „Nein“ gesagt haben und nun Zugriff auf Ihre Kamera gewähren möchten, suchen Sie bitte das Kamerasymbol in der Adressleiste, klicken Sie darauf, erlauben Sie den Kamerazugriff und aktualisieren Sie die Seite. Um die Seite zu aktualisieren, tippen Sie auf das Aktualisierungssymbol „⟳“ in der Adressleiste.",el:'Αυτή η μελέτη πρέπει να χρησιμοποιεί την κάμερα web. Η παραχώρηση πρόσβασης στην κάμερα web είναι προαιρετική, αλλά δεν μπορούμε να συνεχίσουμε χωρίς αυτήν. Εάν είπατε όχι κατά λάθος και τώρα θέλετε να παραχωρήσετε πρόσβαση στην κάμερά σας, βρείτε το εικονίδιο της κάμερας στη γραμμή διευθύνσεων, κάντε κλικ σε αυτό, επιτρέψτε την πρόσβαση στην κάμερα και ανανεώστε τη σελίδα. Για να ανανεώσετε τη σελίδα, πατήστε το εικονίδιο ανανέωσης "⟳" στη γραμμή διευθύνσεων.',he:'מחקר זה צריך להשתמש במצלמת האינטרנט. הענקת גישה למצלמת האינטרנט שלך היא אופציונלית, אך איננו יכולים להמשיך בלעדיה. אם אמרת לא בטעות וברצונך להעניק גישה למצלמה שלך, אנא מצא את סמל המצלמה בשורת הכתובת, לחץ עליו, אפשר גישה למצלמה ורענן את הדף. כדי לרענן את הדף, הקש על סמל הרענון "⟳" בשורת הכתובת.',hi:'इस अध्ययन के लिए वेबकैम का उपयोग करना आवश्यक है. आपके वेबकैम तक पहुंच प्रदान करना वैकल्पिक है, लेकिन हम इसके बिना जारी नहीं रख सकते। यदि आपने गलती से नहीं कहा है और अब अपने कैमरे तक पहुंच प्रदान करना चाहते हैं, तो कृपया पता बार में कैमरा आइकन ढूंढें, इसे क्लिक करें, कैमरे तक पहुंच की अनुमति दें और पृष्ठ को रीफ्रेश करें। पेज को रीफ्रेश करने के लिए, एड्रेस बार में रीफ्रेश आइकन "⟳" पर टैप करें।',hu:"Ehhez a tanulmányhoz webkamerát kell használni. A webkamerához való hozzáférés megadása nem kötelező, de enélkül nem tudjuk folytatni. Ha tévedésből nemet mondott, és most hozzáférést szeretne biztosítani kamerájához, keresse meg a kamera ikont a címsorban, kattintson rá, engedélyezze a kamera elérését, és frissítse az oldalt. Az oldal frissítéséhez koppintson a „⟳” frissítés ikonra a címsorban.",is:"Þessi rannsókn þarf að nota vefmyndavélina. Að veita aðgang að vefmyndavélinni þinni er valfrjálst, en við getum ekki haldið áfram án hennar. Ef þú sagðir Nei fyrir mistök og vilt nú veita aðgang að myndavélinni þinni, vinsamlegast finndu myndavélartáknið á veffangastikunni, smelltu á það, leyfðu myndavélaraðgang og endurnýjaðu síðuna. Til að endurnýja síðuna, bankaðu á endurnýjunartáknið „⟳“ á veffangastikunni.",id:"Penelitian ini perlu menggunakan webcam. Memberikan akses ke webcam Anda bersifat opsional, namun kami tidak dapat melanjutkan tanpanya. Jika Anda tidak sengaja mengatakan Tidak dan sekarang ingin memberikan akses ke kamera Anda, temukan ikon kamera di bilah alamat, klik, izinkan akses kamera, dan segarkan halaman. Untuk menyegarkan halaman, ketuk ikon segarkan “⟳” di bilah alamat.",it:"Questo studio necessita dell'uso della webcam. Concedere l'accesso alla tua webcam è facoltativo, ma non possiamo continuare senza di esso. Se hai detto No per errore e ora desideri concedere l'accesso alla tua fotocamera, trova l'icona della fotocamera nella barra degli indirizzi, cliccala, consenti l'accesso alla fotocamera e aggiorna la pagina. Per aggiornare la pagina, tocca l'icona di aggiornamento \"⟳\" nella barra degli indirizzi.",ja:"この研究ではウェブカメラを使用する必要があります。 Web カメラへのアクセスを許可するかどうかはオプションですが、それなしでは続行できません。間違って「いいえ」と答えてしまい、カメラへのアクセスを許可したい場合は、アドレス バーでカメラ アイコンを見つけてクリックし、カメラへのアクセスを許可して、ページを更新してください。ページを更新するには、アドレスバーの更新アイコン「⟳」をタップします。",kn:'ಈ ಅಧ್ಯಯನವು ವೆಬ್‌ಕ್ಯಾಮ್ ಅನ್ನು ಬಳಸುವ ಅಗತ್ಯವಿದೆ. ನಿಮ್ಮ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡುವುದು ಐಚ್ಛಿಕವಾಗಿದೆ, ಆದರೆ ಅದು ಇಲ್ಲದೆ ನಾವು ಮುಂದುವರಿಯಲು ಸಾಧ್ಯವಿಲ್ಲ. ನೀವು ತಪ್ಪಾಗಿ ಇಲ್ಲ ಎಂದು ಹೇಳಿದರೆ ಮತ್ತು ಈಗ ನಿಮ್ಮ ಕ್ಯಾಮರಾಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಲು ಬಯಸಿದರೆ, ದಯವಿಟ್ಟು ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ ಕ್ಯಾಮರಾ ಐಕಾನ್ ಅನ್ನು ಹುಡುಕಿ, ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ, ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ ಮತ್ತು ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ. ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಲು, ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿರುವ ರಿಫ್ರೆಶ್ ಐಕಾನ್ "⟳" ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.',ko:"이 연구에서는 웹캠을 사용해야 합니다. 웹캠에 대한 액세스 권한을 부여하는 것은 선택 사항이지만, 웹캠 없이는 계속할 수 없습니다. 실수로 아니요라고 선택했고 이제 카메라에 대한 액세스 권한을 부여하려면 주소 표시줄에서 카메라 아이콘을 찾아 클릭한 후 카메라 액세스를 허용하고 페이지를 새로 고치세요. 페이지를 새로 고치려면 주소 표시줄에 있는 새로 고침 아이콘 “⟳”을 탭하세요.",lt:"Šiam tyrimui reikia naudoti internetinę kamerą. Prieigos prie žiniatinklio kameros suteikimas yra neprivalomas, bet negalime tęsti be jos. Jei per klaidą pasakėte Ne ir dabar norite suteikti prieigą prie savo fotoaparato, adreso juostoje raskite fotoaparato piktogramą, spustelėkite ją, leiskite pasiekti fotoaparatą ir atnaujinkite puslapį. Norėdami atnaujinti puslapį, adreso juostoje palieskite atnaujinimo piktogramą „⟳“.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:'ഈ പഠനത്തിന് വെബ്‌ക്യാം ഉപയോഗിക്കേണ്ടതുണ്ട്. നിങ്ങളുടെ വെബ്‌ക്യാമിലേക്ക് ആക്‌സസ് അനുവദിക്കുന്നത് ഓപ്‌ഷണലാണ്, എന്നാൽ ഇത് കൂടാതെ ഞങ്ങൾക്ക് തുടരാനാകില്ല. നിങ്ങൾ അബദ്ധവശാൽ ഇല്ല എന്ന് പറയുകയും ഇപ്പോൾ നിങ്ങളുടെ ക്യാമറയിലേക്ക് ആക്‌സസ് അനുവദിക്കാൻ ആഗ്രഹിക്കുകയും ചെയ്യുന്നുവെങ്കിൽ, വിലാസ ബാറിലെ ക്യാമറ ഐക്കൺ കണ്ടെത്തുക, അതിൽ ക്ലിക്ക് ചെയ്യുക, ക്യാമറ ആക്‌സസ് അനുവദിക്കുക, പേജ് പുതുക്കുക. പേജ് പുതുക്കാൻ, വിലാസ ബാറിലെ പുതുക്കിയ ഐക്കൺ "⟳" ടാപ്പ് ചെയ്യുക.',no:'Denne studien må bruke webkameraet. Å gi tilgang til webkameraet ditt er valgfritt, men vi kan ikke fortsette uten det. Hvis du sa nei ved en feiltakelse og nå ønsker å gi tilgang til kameraet ditt, kan du finne kameraikonet i adressefeltet, klikke på det, gi kameratilgang og oppdatere siden. For å oppdatere siden, trykk på oppdateringsikonet "⟳" i adressefeltet.',fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"W tym badaniu konieczne jest użycie kamery internetowej. Przyznanie dostępu do kamery internetowej jest opcjonalne, ale bez niego nie możemy kontynuować pracy. Jeśli przez pomyłkę odpowiedziałeś Nie, a teraz chcesz przyznać dostęp do swojej kamery, znajdź ikonę kamery w pasku adresu, kliknij ją, zezwól na dostęp do kamery i odśwież stronę. Aby odświeżyć stronę, dotknij ikony odświeżania „⟳” w pasku adresu.",pt:"Este estudo precisa usar a webcam. A concessão de acesso à sua webcam é opcional, mas não podemos continuar sem ela. Se você disse Não por engano e agora deseja conceder acesso à sua câmera, encontre o ícone da câmera na barra de endereço, clique nele, permita o acesso à câmera e atualize a página. Para atualizar a página, toque no ícone de atualização “⟳” na barra de endereço.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Este estudio necesita usar la cámara web. Otorgar acceso a tu cámara web es opcional, pero no podemos continuar sin ello. Si dijiste No por error y ahora deseas otorgar acceso a tu cámara, por favor encuentra el ícono de la cámara en la barra de direcciones, haz clic en él, permite el acceso a la cámara y actualiza la página. Para actualizar la página, toca el ícono de actualización “⟳” en la barra de direcciones.",sw:'Utafiti huu unahitaji kutumia kamera ya wavuti. Kutoa ufikiaji kwa kamera yako ya wavuti ni hiari, lakini hatuwezi kuendelea bila hiyo. Ikiwa ulisema Hapana kimakosa na sasa ungependa kutoa ufikiaji wa kamera yako, tafadhali tafuta aikoni ya kamera kwenye upau wa anwani, uibofye, ruhusu ufikiaji wa kamera na uonyeshe ukurasa upya. Ili kuonyesha upya ukurasa, gusa aikoni ya kuonyesha upya "⟳" katika upau wa anwani.',sv:'Denna studie måste använda webbkameran. Att ge åtkomst till din webbkamera är valfritt, men vi kan inte fortsätta utan den. Om du sa nej av misstag och nu vill ge åtkomst till din kamera, hitta kameraikonen i adressfältet, klicka på den, tillåt kameraåtkomst och uppdatera sidan. För att uppdatera sidan, tryck på uppdateringsikonen "⟳" i adressfältet.',tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bu çalışmada web kamerasının kullanılması gerekiyor. Web kameranıza erişim izni vermek isteğe bağlıdır ancak onsuz devam edemeyiz. Yanlışlıkla Hayır dediyseniz ve şimdi kameranıza erişim izni vermek istiyorsanız, lütfen adres çubuğunda kamera simgesini bulun, tıklayın, kamera erişimine izin verin ve sayfayı yenileyin. Sayfayı yenilemek için adres çubuğundaki “⟳” yenileme simgesine dokunun.",ur:'اس مطالعہ کو ویب کیم استعمال کرنے کی ضرورت ہے۔ آپ کے ویب کیم تک رسائی دینا اختیاری ہے، لیکن ہم اس کے بغیر جاری نہیں رکھ سکتے۔ اگر آپ نے غلطی سے نہیں کہا اور اب آپ اپنے کیمرے تک رسائی دینا چاہتے ہیں، تو براہ کرم ایڈریس بار میں کیمرہ آئیکن تلاش کریں، اس پر کلک کریں، کیمرے تک رسائی کی اجازت دیں، اور صفحہ کو ریفریش کریں۔ صفحہ کو ریفریش کرنے کے لیے، ایڈریس بار میں ریفریش آئیکن "⟳" کو تھپتھپائیں۔'},RC_gazeTracking:{"en-US":"Gaze Tracking",ar:"تتبع النظرات",hy:"Հայացքի հետևում",bg:"Проследяване на погледа","zh-CN":"视线追踪","zh-HK":"視線追蹤",hr:"Praćenje pogleda",cs:"Sledování pohledu",da:"Bliksporing",nl:"Blik volgen","en-UK":"Gaze Tracking",fi:"katseen seuranta",fr:"Suivi du regard",de:"Blickverfolgung",el:"Παρακολούθηση Βλέμματος",he:"מעקב מבט",hi:"टकटकी ट्रैकिंग",hu:"Tekintetkövetés",is:"Augnaráð",id:"Pelacakan Tatapan",it:"Tracciamento dello sguardo",ja:"視線追跡",kn:"ನೋಟ ಟ್ರ್ಯಾಕಿಂಗ್",ko:"시선 추적",lt:"Žvilgsnio sekimas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"നോട്ടം ട്രാക്കിംഗ്",no:"Blikksporing",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Śledzenie wzroku",pt:"Rastreamento de olhar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Seguimiento de la mirada",sw:"Ufuatiliaji wa Macho",sv:"Blickspårning",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bakış Takibi",ur:"نگاہوں سے باخبر رہنا"},RC_gazeTrackingIntro:{"en-US":'PLAY "CATCH THE CROSS!" Now we’ll set up gaze tracking, to monitor eye position. Keep your face in the video feed (see below). Click on the center of the cross, wherever it is. Make sure that your eyes are on it when you click it. When you click it, the cross will move to a new location. Click it in each new location, until the calibration is done. It\'s a game. Catch the cross!',ar:'العب "امسك الصليب!" الآن سنقوم بإعداد تتبع النظرات لمراقبة وضع العين. حافظ على وجهك في الفيديو (انظر أدناه). انقر على مركز الصليب أينما كان. تأكد من أن عينيك عليه عندما تنقر عليه. عندما تنقر عليه، سينتقل الصليب إلى موقع جديد. انقر عليه في كل موقع جديد حتى يتم الانتهاء من المعايرة. إنها لعبة. امسك الصليب!',hy:"ԽԱՂԱՑԵ՛Ք «CATCH THE CROSS»: Այժմ մենք կստեղծենք հայացքի հետևում՝ աչքի դիրքը վերահսկելու համար: Պահեք ձեր դեմքը տեսահոլովակում (տես ստորև): Սեղմեք խաչի կենտրոնի վրա, որտեղ էլ որ լինի: Համոզվեք, որ ձեր աչքերը դրա վրա են, երբ սեղմում եք այն: Երբ սեղմում եք այն, խաչը կտեղափոխվի նոր վայր: Սեղմեք այն յուրաքանչյուր նոր վայրում, մինչև ստուգաչափումն ավարտվի: Դա խաղ է: Բռնե՛ք խաչը։",bg:'ИГРАЙТЕ "ХВАНИ КРЪСТА!" Сега ще настроим проследяване на погледа, за да наблюдаваме позицията на очите. Дръжте лицето си във видео емисия (вижте по-долу). Кликнете върху центъра на кръста, където и да е той. Уверете се, че очите ви са върху него, когато щракнете върху него. Когато щракнете върху него, кръстът ще се премести на ново място. Кликнете върху него на всяко ново място, докато калибрирането приключи. Това е игра. Хвани кръста!',"zh-CN":"玩“抓住十字架!”现在我们将设置注视跟踪,以监控眼睛位置。将您的脸保持在视频源中(见下文)。单击十字的中心,无论它在哪里。单击它时请确保您的眼睛注视着它。当您单击它时,十字将移动到新位置。在每个新位置单击它,直到校准完成。这是一场游戏。抓住十字架!","zh-HK":"玩“抓住十字架!”現在我們將設置注視跟踪,以監控眼睛位置。將您的臉保持在視訊來源中(見下文)。點擊十字的中心,無論它在哪裡。單擊它時請確保您的眼睛注視著它。當您單擊它時,十字將移動到新位置。在每個新位置單擊它,直到校準完成。這是一場遊戲。抓住十字架!",hr:'IGRAJTE "UHVATI KRIŽ!" Sada ćemo postaviti praćenje pogleda kako bismo pratili položaj očiju. Zadržite svoje lice u video feedu (pogledajte dolje). Pritisnite središte križa, gdje god se nalazilo. Uvjerite se da su vam oči uprte u njega kada ga kliknete. Kada ga kliknete, križ će se pomaknuti na novo mjesto. Pritisnite ga na svakom novom mjestu, dok se kalibracija ne završi. To je igra. Uhvatite križ!',cs:'ZAHRAJTE SI "CHYTIT KŘÍŽ!" Nyní nastavíme sledování pohledu, abychom mohli sledovat polohu očí. Udržujte svůj obličej ve videu (viz níže). Klikněte na střed kříže, ať je kdekoli. Když na něj kliknete, ujistěte se, že na něj máte oči. Když na něj kliknete, kříž se přesune na nové místo. Klikněte na něj v každém novém místě, dokud nebude kalibrace dokončena. Je to hra. Chyťte kříž!',da:'SPIL "FANG KORSET!" Nu sætter vi bliksporing op for at overvåge øjenposition. Hold dit ansigt i videofeedet (se nedenfor). Klik på midten af ​​korset, uanset hvor det er. Sørg for, at dine øjne er på den, når du klikker på den. Når du klikker på det, flyttes krydset til en ny placering. Klik på den på hver ny placering, indtil kalibreringen er færdig. Det er et spil. Fang korset!',nl:'SPEEL "VANG HET KRUIS!" Nu gaan we gaze-tracking instellen om de oogpositie te controleren. Houd uw gezicht in de videofeed (zie hieronder). Klik op het midden van het kruis, waar het zich ook bevindt. Zorg ervoor dat uw ogen erop gericht zijn wanneer u erop klikt. Wanneer u erop klikt, verplaatst het kruis zich naar een nieuwe locatie. Klik erop op elke nieuwe locatie, totdat de kalibratie is voltooid. Het is een spel. Vang het kruis!',"en-UK":'PLAY "CATCH THE CROSS!" Now we’ll set up gaze tracking, to monitor eye position. Keep your face in the video feed (see below). Click on the centre of the cross, wherever it is. Make sure that your eyes are on it when you click it. When you click it, the cross will move to a new location. Click it in each new location, until the calibration is done. It\'s a game. Catch the cross!',fi:'PELAA "CATCH THE CROSS!" Nyt määritämme katseen seurannan silmän asennon seuraamiseksi. Pidä kasvosi videosyötteessä (katso alla). Napsauta ristin keskustaa, missä se on. Varmista, että silmäsi ovat siinä, kun napsautat sitä. Kun napsautat sitä, risti siirtyy uuteen paikkaan. Napsauta sitä jokaisessa uudessa paikassa, kunnes kalibrointi on valmis. Se on peli. Ota risti kiinni!',fr:"JOUER \"ATTRAPEZ LA CROIX !\" Nous allons maintenant configurer le suivi du regard, pour surveiller la position des yeux. Gardez votre visage dans le flux vidéo (voir ci-dessous). Cliquez sur le centre de la croix, où qu'elle soit. Assurez-vous que vos yeux sont dessus lorsque vous cliquez. Lorsque vous cliquez, la croix se déplacera vers un nouvel emplacement. Cliquez dessus à chaque nouvel emplacement, jusqu'à ce que l'étalonnage soit terminé. C'est un jeu. Attrapez la croix !",de:"SPIELEN SIE „FANG DAS KREUZ!“ Jetzt richten wir die Blickverfolgung ein, um die Augenposition zu überwachen. Behalten Sie Ihr Gesicht im Video-Feed (siehe unten). Klicken Sie auf die Mitte des Kreuzes, wo immer es sich befindet. Stellen Sie sicher, dass Ihre Augen darauf gerichtet sind, wenn Sie darauf klicken. Wenn Sie darauf klicken, wird das Kreuz an eine neue Position verschoben. Klicken Sie an jeder neuen Stelle darauf, bis die Kalibrierung abgeschlossen ist. Es ist ein Spiel. Fang das Kreuz!",el:'ΠΑΙΞΤΕ "CATCH THE CROSS!" Τώρα θα ρυθμίσουμε την παρακολούθηση βλέμματος, για να παρακολουθούμε τη θέση των ματιών. Κρατήστε το πρόσωπό σας στη ροή βίντεο (δείτε παρακάτω). Κάντε κλικ στο κέντρο του σταυρού, όπου κι αν βρίσκεται. Βεβαιωθείτε ότι τα μάτια σας είναι στραμμένα σε αυτό όταν το κάνετε κλικ. Όταν κάνετε κλικ σε αυτό, ο σταυρός θα μετακινηθεί σε μια νέα θέση. Κάντε κλικ σε κάθε νέα θέση, μέχρι να ολοκληρωθεί η βαθμονόμηση. Είναι ένα παιχνίδι. Πιάσε το σταυρό!',he:'שחקו "תפוס את הצלב!" כעת נגדיר מעקב מבט, כדי לנטר את מיקום העין. שמור את הפנים שלך בפיד הווידאו (ראה למטה). לחץ על מרכז הצלב, היכן שהוא. ודא שעיניך נשואות אליו כאשר אתה לוחץ עליו. כאשר תלחץ עליו, הצלב יעבור למיקום חדש. לחץ עליו בכל מיקום חדש, עד לסיום הכיול. זה משחק. לתפוס את הצלב!',hi:'खेलें "कैच द क्रॉस!" अब हम आंखों की स्थिति पर नजर रखने के लिए टकटकी ट्रैकिंग स्थापित करेंगे। वीडियो फ़ीड में अपना चेहरा रखें (नीचे देखें)। क्रॉस के केंद्र पर, चाहे वह कहीं भी हो, क्लिक करें। सुनिश्चित करें कि जब आप इसे क्लिक करें तो आपकी नजरें इस पर हों। जब आप इसे क्लिक करेंगे, तो क्रॉस एक नए स्थान पर चला जाएगा। अंशांकन पूरा होने तक इसे प्रत्येक नए स्थान पर क्लिक करें। यह एक खेल है. क्रॉस पकड़ो!',hu:'JÁTSSZA "CATCH THE CROSS!" Most beállítjuk a tekintetkövetést a szem helyzetének figyelésére. Tartsa arcát a videó hírfolyamában (lásd lent). Kattintson a kereszt közepére, bárhol is legyen. Győződjön meg róla, hogy a szeme rajta van, amikor rákattint. Ha rákattint, a kereszt új helyre kerül. Kattintson rá minden új helyen, amíg a kalibráció el nem készül. Ez egy játék. Fogd meg a keresztet!',is:'SPILAÐU "CATCH THE CROSS!" Nú munum við setja upp augnaráð til að fylgjast með augnstöðu. Haltu andlitinu þínu í myndbandsstraumnum (sjá hér að neðan). Smelltu á miðju krossins, hvar sem hann er. Gakktu úr skugga um að augun séu á því þegar þú smellir á það. Þegar þú smellir á hann færist krossinn á nýjan stað. Smelltu á það á hverjum nýjum stað þar til kvörðuninni er lokið. Það er leikur. Gríptu krossinn!',id:'MAINKAN "TANGKAP SALIB!" Sekarang kita akan menyiapkan pelacakan pandangan, untuk memantau posisi mata. Pertahankan wajah Anda di umpan video (lihat di bawah). Klik di tengah salib, dimanapun itu berada. Pastikan mata Anda tertuju padanya saat Anda mengkliknya. Saat Anda mengkliknya, salib akan berpindah ke lokasi baru. Klik di setiap lokasi baru, hingga kalibrasi selesai. Ini sebuah permainan. Tangkap salibnya!',it:'GIOCA "CATTURA LA CROCE!" Ora imposteremo il tracciamento dello sguardo, per monitorare la posizione degli occhi. Tieni il viso nel video (vedi sotto). Clicca al centro della croce, ovunque si trovi. Assicurati che i tuoi occhi siano su di essa quando la clicchi. Quando la clicchi, la croce si sposterà in una nuova posizione. Cliccala in ogni nuova posizione, fino a quando la calibrazione è completata. È un gioco. Cattura la croce!',ja:"「キャッチ・ザ・クロス」をプレイしよう!次に、目の位置を監視するために視線追跡を設定します。ビデオフィードに顔を映さないようにしてください (下記を参照)。十字の中心をクリックします(任意の場所)。クリックするときは必ず目を離さないようにしてください。クリックすると、十字が新しい位置に移動します。キャリブレーションが完了するまで、新しい場所ごとにクリックします。それはゲームです。クロスをキャッチ!",kn:'ಪ್ಲೇ "ಕ್ಯಾಚ್ ದಿ ಕ್ರಾಸ್!" ಈಗ ನಾವು ಕಣ್ಣಿನ ಸ್ಥಾನವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಲು ನೋಟ ಟ್ರ್ಯಾಕಿಂಗ್ ಅನ್ನು ಹೊಂದಿಸುತ್ತೇವೆ. ವೀಡಿಯೊ ಫೀಡ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಮುಖವನ್ನು ಇರಿಸಿ (ಕೆಳಗೆ ನೋಡಿ). ಶಿಲುಬೆಯ ಮಧ್ಯಭಾಗದಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ, ಅದು ಎಲ್ಲಿದ್ದರೂ. ನೀವು ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ನಿಮ್ಮ ಕಣ್ಣುಗಳು ಅದರ ಮೇಲೆ ಇರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. ನೀವು ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ, ಅಡ್ಡ ಹೊಸ ಸ್ಥಳಕ್ಕೆ ಚಲಿಸುತ್ತದೆ. ಮಾಪನಾಂಕ ನಿರ್ಣಯವು ಮುಗಿಯುವವರೆಗೆ ಪ್ರತಿ ಹೊಸ ಸ್ಥಳದಲ್ಲಿ ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. ಅದೊಂದು ಆಟ. ಶಿಲುಬೆಯನ್ನು ಹಿಡಿಯಿರಿ!',ko:'"십자가를 잡으세요!"를 플레이하세요. 이제 눈 위치를 모니터링하기 위해 시선 추적을 설정하겠습니다. 비디오 피드에 얼굴을 유지하세요(아래 참조). 십자가의 중앙이 어디에 있든 클릭하세요. 클릭할 때 눈이 거기에 있는지 확인하세요. 클릭하면 십자가가 새로운 위치로 이동합니다. 보정이 완료될 때까지 각각의 새 위치에서 클릭하세요. 그것은 게임이다. 십자가를 잡아라!',lt:'ŽAISKITE "PAGAUKITE KRYŽIUS!" Dabar nustatysime žvilgsnio sekimą, kad galėtume stebėti akių padėtį. Laikykite savo veidą vaizdo įrašų sklaidos kanale (žr. toliau). Spustelėkite kryžiaus centrą, kad ir kur jis būtų. Įsitikinkite, kad spustelėdami jį nukreipėte akis. Kai spustelėsite jį, kryžius persikels į naują vietą. Spustelėkite jį kiekvienoje naujoje vietoje, kol bus atliktas kalibravimas. Tai žaidimas. Pagauk kryžių!',ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:'കളിക്കുക "കുരിശ് പിടിക്കുക!" കണ്ണിൻ്റെ സ്ഥാനം നിരീക്ഷിക്കാൻ ഞങ്ങൾ ഇപ്പോൾ നോട്ട ട്രാക്കിംഗ് സജ്ജീകരിക്കും. വീഡിയോ ഫീഡിൽ നിങ്ങളുടെ മുഖം സൂക്ഷിക്കുക (ചുവടെ കാണുക). കുരിശ് എവിടെയായിരുന്നാലും അതിൻ്റെ മധ്യഭാഗത്ത് ക്ലിക്കുചെയ്യുക. നിങ്ങൾ അതിൽ ക്ലിക്ക് ചെയ്യുമ്പോൾ നിങ്ങളുടെ കണ്ണുകൾ അതിൽ ഉണ്ടെന്ന് ഉറപ്പാക്കുക. നിങ്ങൾ അതിൽ ക്ലിക്ക് ചെയ്യുമ്പോൾ, കുരിശ് ഒരു പുതിയ സ്ഥലത്തേക്ക് മാറും. കാലിബ്രേഷൻ പൂർത്തിയാകുന്നതുവരെ ഓരോ പുതിയ സ്ഥലത്തും അതിൽ ക്ലിക്ക് ചെയ്യുക. അതൊരു കളിയാണ്. കുരിശ് പിടിക്കുക!',no:'SPILL "CATCH THE CROSS!" Nå skal vi sette opp blikksporing for å overvåke øyeposisjon. Hold ansiktet ditt i videofeeden (se nedenfor). Klikk på midten av korset, uansett hvor det er. Pass på at øynene dine er på den når du klikker på den. Når du klikker på det, flyttes krysset til et nytt sted. Klikk den på hvert nytt sted, til kalibreringen er fullført. Det er et spill. Fang korset!',fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"ZAGRAJ „ZŁAP KRZYŻ!” Teraz skonfigurujemy śledzenie wzroku, aby monitorować położenie oczu. Trzymaj twarz w kanale wideo (patrz poniżej). Kliknij środek krzyża, gdziekolwiek się on znajduje. Kiedy klikniesz, upewnij się, że Twoje oczy są na niego skierowane. Po kliknięciu krzyżyk przesunie się w nowe miejsce. Kliknij go w każdej nowej lokalizacji, aż do zakończenia kalibracji. To jest gra. Złap krzyż!",pt:'JOGUE "PEGUE A CRUZ!" Agora vamos configurar o rastreamento do olhar para monitorar a posição dos olhos. Mantenha seu rosto no feed de vídeo (veja abaixo). Clique no centro da cruz, onde quer que esteja. Certifique-se de que seus olhos estejam voltados para ele ao clicar nele. Ao clicar nela, a cruz se moverá para um novo local. Clique nele em cada novo local, até que a calibração seja concluída. É um jogo. Pegue a cruz!',ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:'JUEGA "¡ATRAPA LA CRUZ!" Ahora configuraremos el seguimiento de la mirada para monitorear la posición de los ojos. Mantén tu rostro en el video (ver abajo). Haz clic en el centro de la cruz, donde sea que esté. Asegúrate de que tus ojos estén en ella cuando hagas clic. Cuando hagas clic, la cruz se moverá a una nueva ubicación. Haz clic en cada nueva ubicación, hasta que la calibración esté completa. Es un juego. ¡Atrapa la cruz!',sw:'CHEZA "CHAMAA MSALABA!" Sasa tutaweka ufuatiliaji wa macho, kufuatilia nafasi ya macho. Weka uso wako kwenye mpasho wa video (tazama hapa chini). Bonyeza katikati ya msalaba, popote ulipo. Hakikisha kuwa macho yako yanaitazama unapoibofya. Unapobofya, msalaba utahamia eneo jipya. Bofya katika kila eneo jipya, hadi urekebishaji utakapokamilika. Ni mchezo. Shika msalaba!',sv:'SPELA "CATCH THE CROSS!" Nu ska vi ställa in blickspårning för att övervaka ögonpositionen. Håll ditt ansikte i videoflödet (se nedan). Klicka på mitten av korset, var det än är. Se till att dina ögon är på den när du klickar på den. När du klickar på det flyttas krysset till en ny plats. Klicka på den på varje ny plats tills kalibreringen är klar. Det är ett spel. Fånga korset!',tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:'"HAÇI YAKALA!" OYNA Şimdi göz konumunu izlemek için bakış izlemeyi ayarlayacağız. Yüzünüzü video akışında tutun (aşağıya bakın). Nerede olursa olsun haçın merkezine tıklayın. Tıkladığınızda gözlerinizin üzerinde olduğundan emin olun. Tıkladığınızda çarpı yeni bir konuma taşınacaktır. Kalibrasyon tamamlanana kadar her yeni konumda buna tıklayın. Bu bir oyun. Haçı yakalayın!',ur:'"Catch the Cross!" کھیلیں اب ہم آنکھوں کی پوزیشن کی نگرانی کے لیے نگاہوں سے باخبر رہنے کے لیے سیٹ اپ کریں گے۔ اپنا چہرہ ویڈیو فیڈ میں رکھیں (نیچے دیکھیں)۔ کراس کے مرکز پر کلک کریں، جہاں کہیں بھی ہو۔ اس بات کو یقینی بنائیں کہ جب آپ اسے کلک کریں تو آپ کی نظریں اس پر ہیں۔ جب آپ اس پر کلک کریں گے، کراس ایک نئے مقام پر چلا جائے گا۔ ہر نئے مقام پر اس پر کلک کریں، جب تک کہ انشانکن مکمل نہ ہوجائے۔ یہ ایک کھیل ہے۔ صلیب کو پکڑو!'},RC_gazeTrackingNudge:{"en-US":"CATCH THE CROSS! We need your help. The eye tracker needs more training. As shown by the arrow, when you clicked, the tracker thought your gaze was far from the cross. Please click the cross at each new position. It's a game. Catch the cross!",ar:"امسك الصليب! نحن بحاجة إلى مساعدتك. يحتاج متتبع العين إلى مزيد من التدريب. كما هو موضح بالسهم، عندما نقرت، اعتقد المتتبع أن نظرك كان بعيدًا عن الصليب. يرجى النقر على الصليب في كل موضع جديد. إنها لعبة. امسك الصليب!",hy:"ԲՌՆԵՔ ԽԱՉԸ: Մենք ձեր օգնության կարիքն ունենք: Աչքի հետագծողին ավելի շատ մարզում է հարկավոր: Ինչպես ցույց է տալիս սլաքը, երբ դուք կտտացրել եք, հետախույզը կարծել է, որ ձեր հայացքը խաչից հեռու է: Խնդրում ենք սեղմել խաչը յուրաքանչյուր նոր դիրքում: Դա խաղ է: Բռնե՛ք խաչը։",bg:"ХВАНЕТЕ КРЪСТА! Имаме нужда от вашата помощ. Устройството за проследяване на очите се нуждае от повече обучение. Както е показано от стрелката, когато щракнете, тракерът смята, че погледът ви е далеч от кръста. Моля, щракнете върху кръста на всяка нова позиция. Това е игра. Хвани кръста!","zh-CN":"抓住十字架!我们需要你的帮助。眼动仪需要更多的训练。如箭头所示,当您点击时,追踪器认为您的目光远离十字架。请单击每个新位置处的叉号。这是一场游戏。抓住十字架!","zh-HK":"抓住十字架!我們需要你的幫助。眼動儀需要更多的訓練。如箭頭所示,當您點擊時,追蹤器認為您的目光遠離十字架。請點選每個新位置的叉號。這是一場遊戲。抓住十字架!",hr:"UHVATI KRIŽ! Trebamo vašu pomoć. Praćenju oka treba više obuke. Kao što je prikazano strelicom, kada ste kliknuli, tracker je mislio da je vaš pogled daleko od križa. Kliknite na križić na svakoj novoj poziciji. To je igra. Uhvatite križ!",cs:"CHYŤTE KŘÍŽ! Potřebujeme vaši pomoc. Eye tracker potřebuje více tréninku. Jak ukazuje šipka, když jste klikli, stopař si myslel, že váš pohled je daleko od kříže. Klikněte prosím na křížek u každé nové pozice. Je to hra. Chyťte kříž!",da:"FANG KORSET! Vi har brug for din hjælp. Eye trackeren har brug for mere træning. Som vist af pilen, når du klikkede, troede trackeren, at dit blik var langt fra korset. Klik venligst på krydset ved hver ny position. Det er et spil. Fang korset!",nl:"VANG HET KRUIS! Wij hebben uw hulp nodig. De eyetracker heeft meer training nodig. Zoals aangegeven door de pijl, dacht de tracker dat je blik ver van het kruis was verwijderd toen je klikte. Klik op het kruisje bij elke nieuwe positie. Het is een spel. Vang het kruis!","en-UK":"CATCH THE CROSS! We need your help. The eye tracker needs more training. As shown by the arrow, when you clicked, the tracker thought your gaze was far from the cross. Please click the cross at each new position. It's a game. Catch the cross!",fi:"OTA RISTISTÄ KAPPALE! Tarvitsemme apuasi. Katsemittari tarvitsee lisää koulutusta. Kuten nuolesta näkyy, kun napsautit, jäljitin luuli katseesi olevan kaukana rististä. Napsauta ristiä jokaisen uuden kohdan kohdalla. Se on peli. Ota risti kiinni!",fr:"ATTRAPEZ LA CROIX ! Nous avons besoin de votre aide. Le suivi oculaire a besoin de plus d'entraînement. Comme indiqué par la flèche, lorsque vous avez cliqué, le suivi a pensé que votre regard était loin de la croix. Veuillez cliquer sur la croix à chaque nouvelle position. C'est un jeu. Attrapez la croix !",de:"FANG DAS KREUZ! Wir brauchen Ihre Hilfe. Der Eyetracker benötigt mehr Schulung. Wie der Pfeil zeigt, ging der Tracker beim Klicken davon aus, dass Ihr Blick weit vom Kreuz entfernt war. Bitte klicken Sie bei jeder neuen Position auf das Kreuz. Es ist ein Spiel. Fang das Kreuz!",el:"ΠΙΑΣΕ ΤΟΝ ΣΤΑΥΡΟ! Χρειαζόμαστε τη βοήθειά σας. Το eye tracker χρειάζεται περισσότερη εκπαίδευση. Όπως φαίνεται από το βέλος, όταν κάνατε κλικ, ο ιχνηλάτης νόμιζε ότι το βλέμμα σας ήταν μακριά από το σταυρό. Κάντε κλικ στο σταυρό σε κάθε νέα θέση. Είναι ένα παιχνίδι. Πιάσε το σταυρό!",he:"תפוס את הצלב! אנחנו צריכים את עזרתכם. גשש העיניים זקוק לאימון נוסף. כפי שמוצג על ידי החץ, כאשר לחצת, הגשש חשב שהמבט שלך רחוק מהצלב. אנא לחץ על הצלב בכל עמדה חדשה. זה משחק. לתפוס את הצלב!",hi:"क्रॉस पकड़ो! हमे आपकी मदद की जरूरत है। आई ट्रैकर को अधिक प्रशिक्षण की आवश्यकता है। जैसा कि तीर से पता चलता है, जब आपने क्लिक किया, तो ट्रैकर को लगा कि आपकी नज़र क्रॉस से दूर है। कृपया प्रत्येक नई स्थिति पर क्रॉस पर क्लिक करें। यह एक खेल है. क्रॉस पकड़ो!",hu:"FOGJ EL A KERESZTET! Szükségünk van a segítségedre. A szemkövetőnek több képzésre van szüksége. Ahogy a nyíl mutatja, amikor kattintott, a nyomkövető azt gondolta, hogy a tekintete messze van a kereszttől. Kérjük, kattintson a keresztre minden új pozíciónál. Ez egy játék. Fogd meg a keresztet!",is:"GANGI KROSSINN! Við þurfum hjálp þína. Augnsporið þarf meiri þjálfun. Eins og örin sýnir, þegar þú smelltir, hélt rekjandann að augnaráð þitt væri langt frá krossinum. Vinsamlegast smelltu á krossinn við hverja nýja stöðu. Það er leikur. Gríptu krossinn!",id:"MENANGKAP SALIB! Kami membutuhkan bantuan Anda. Pelacak mata memerlukan lebih banyak pelatihan. Seperti yang ditunjukkan oleh panah, ketika Anda mengklik, pelacak mengira pandangan Anda jauh dari salib. Silakan klik tanda silang pada setiap posisi baru. Ini sebuah permainan. Tangkap salibnya!",it:"ACCHIAPPA LA CROCE! Abbiamo bisogno del tuo aiuto. Il tracciatore oculare ha bisogno di più allenamento. Come indicato dalla freccia, quando hai cliccato, il tracciatore ha pensato che il tuo sguardo fosse lontano dalla croce. Per favore, clicca sulla croce in ogni nuova posizione. È un gioco. Acchiappa la croce!",ja:"クロスをキャッチ!あなたの助けが必要です。アイトラッカーにはさらなるトレーニングが必要です。矢印で示されているように、クリックすると、トラッカーはあなたの視線が十字から遠く離れていると判断しました。新しい位置ごとにバツ印をクリックしてください。それはゲームです。クロスをキャッチ!",kn:"ಕ್ರಾಸ್ ಕ್ಯಾಚ್! ನಮಗೆ ನಿಮ್ಮ ಸಹಾಯ ಬೇಕು. ಕಣ್ಣಿನ ಟ್ರ್ಯಾಕರ್‌ಗೆ ಹೆಚ್ಚಿನ ತರಬೇತಿಯ ಅಗತ್ಯವಿದೆ. ಬಾಣದಿಂದ ತೋರಿಸಿರುವಂತೆ, ನೀವು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ, ನಿಮ್ಮ ನೋಟವು ಅಡ್ಡದಿಂದ ದೂರದಲ್ಲಿದೆ ಎಂದು ಟ್ರ್ಯಾಕರ್ ಭಾವಿಸಿದೆ. ದಯವಿಟ್ಟು ಪ್ರತಿ ಹೊಸ ಸ್ಥಾನದಲ್ಲಿ ಕ್ರಾಸ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. ಅದೊಂದು ಆಟ. ಶಿಲುಬೆಯನ್ನು ಹಿಡಿಯಿರಿ!",ko:"십자가를 잡으라! 여러분의 도움이 필요합니다. 아이트래커는 더 많은 훈련이 필요합니다. 화살표로 표시된 것처럼 클릭하면 추적기는 시선이 십자가에서 멀리 떨어져 있다고 생각했습니다. 각각의 새로운 위치에서 십자가를 클릭하십시오. 그것은 게임이다. 십자가를 잡아라!",lt:"PAGAUKITE KRYŽIUS! Mums reikia jūsų pagalbos. Akių stebėjimui reikia daugiau treniruočių. Kaip rodo rodyklė, kai spustelėjote, seklys manė, kad jūsų žvilgsnis buvo toli nuo kryžiaus. Kiekvienoje naujoje vietoje spustelėkite kryžių. Tai žaidimas. Pagauk kryžių!",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ക്രോസ് പിടിക്കുക! ഞങ്ങൾക്ക് നിങ്ങളുടെ സഹായം ആവശ്യമാണ്. ഐ ട്രാക്കറിന് കൂടുതൽ പരിശീലനം ആവശ്യമാണ്. അമ്പടയാളം കാണിക്കുന്നത് പോലെ, നിങ്ങൾ ക്ലിക്കുചെയ്യുമ്പോൾ, നിങ്ങളുടെ നോട്ടം കുരിശിൽ നിന്ന് വളരെ അകലെയാണെന്ന് ട്രാക്കർ കരുതി. ഓരോ പുതിയ സ്ഥാനത്തും ദയവായി ക്രോസിൽ ക്ലിക്ക് ചെയ്യുക. അതൊരു കളിയാണ്. കുരിശ് പിടിക്കുക!",no:"FANG KORSET! Vi trenger din hjelp. Øyesporeren trenger mer trening. Som vist av pilen, når du klikket, trodde sporeren at blikket ditt var langt fra korset. Vennligst klikk på krysset ved hver nye posisjon. Det er et spill. Fang korset!",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"ZŁAP KRZYŻ! Potrzebujemy twojej pomocy. Eye tracker wymaga więcej szkolenia. Jak pokazuje strzałka, po kliknięciu moduł śledzący pomyślał, że Twój wzrok jest daleko od krzyża. Proszę kliknąć krzyżyk przy każdej nowej pozycji. To jest gra. Złap krzyż!",pt:"PEGUE A CRUZ! Precisamos da sua ajuda. O rastreador ocular precisa de mais treinamento. Conforme mostrado pela seta, quando você clicou, o rastreador pensou que seu olhar estava longe da cruz. Clique na cruz em cada nova posição. É um jogo. Pegue a cruz!",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"¡ATRAPA LA CRUZ! Necesitamos tu ayuda. El rastreador ocular necesita más entrenamiento. Como muestra la flecha, cuando hiciste clic, el rastreador pensó que tu mirada estaba lejos de la cruz. Por favor, haz clic en la cruz en cada nueva posición. Es un juego. ¡Atrapa la cruz!",sw:"KAMATA MSALABA! Tunahitaji msaada wako. Kifuatilia macho kinahitaji mafunzo zaidi. Kama inavyoonyeshwa na mshale, ulipobofya, kifuatiliaji kilifikiri kuwa macho yako yalikuwa mbali na msalaba. Tafadhali bofya msalaba katika kila nafasi mpya. Ni mchezo. Shika msalaba!",sv:"FÅNG KORSET! Vi behöver din hjälp. Eye tracker behöver mer träning. Som pilen visar, när du klickade trodde spåraren att din blick var långt från korset. Klicka på krysset vid varje ny position. Det är ett spel. Fånga korset!",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"HARCAYI YAKALAYIN! Yardımına ihtiyacımız var. Göz takip cihazının daha fazla eğitime ihtiyacı var. Okla gösterildiği gibi, tıkladığınızda izleyici bakışınızın haçtan uzakta olduğunu düşünüyordu. Lütfen her yeni konumdaki çarpı işaretine tıklayın. Bu bir oyun. Haçı yakalayın!",ur:"کراس کو پکڑو! ہمیں آپ کی مدد کی ضرورت ہے۔ آئی ٹریکر کو مزید تربیت کی ضرورت ہے۔ جیسا کہ تیر سے دکھایا گیا ہے، جب آپ نے کلک کیا تو ٹریکر نے سوچا کہ آپ کی نگاہیں صلیب سے دور ہیں۔ براہ کرم ہر نئی پوزیشن پر کراس پر کلک کریں۔ یہ ایک کھیل ہے۔ صلیب کو پکڑو!"},RC_gazeTrackingTitle:{"en-US":"Set Up Gaze Tracking",ar:"إعداد تتبع النظرات",hy:"Կարգավորեք հայացքի հետևում",bg:"Настройте проследяване на погледа","zh-CN":"设置注视追踪","zh-HK":"設定注視追蹤",hr:"Postavite praćenje pogleda",cs:"Nastavte sledování pohledu",da:"Opsæt Gaze Tracking",nl:"Gaze-tracking instellen","en-UK":"Set Up Gaze Tracking",fi:"Määritä katseen seuranta",fr:"Configurer le suivi du regard",de:"Richten Sie die Blickverfolgung ein",el:"Ρύθμιση παρακολούθησης βλέμματος",he:"הגדר מעקב מבט",hi:"टकटकी ट्रैकिंग सेट करें",hu:"A Gaze Tracking beállítása",is:"Settu upp augnaráð",id:"Siapkan Pelacakan Pandangan",it:"Imposta il tracciamento dello sguardo",ja:"視線追跡のセットアップ",kn:"ನೋಟ ಟ್ರ್ಯಾಕಿಂಗ್ ಅನ್ನು ಹೊಂದಿಸಿ",ko:"시선 추적 설정",lt:"Nustatyti žvilgsnio sekimą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാഴ്ച ട്രാക്കിംഗ് സജ്ജീകരിക്കുക",no:"Sett opp blikksporing",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Skonfiguruj śledzenie wzroku",pt:"Configurar o rastreamento do olhar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Configurar seguimiento de mirada",sw:"Weka Ufuatiliaji wa Macho",sv:"Ställ in Gaze Tracking",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bakış Takibini Ayarlama",ur:"Gaze ٹریکنگ سیٹ اپ کریں۔"},RC_nearPointIntro:{"en-US":"We'll measure the distance between your eyes. Use the video image to watch your eyes. Hold a pen horizontally against your face in front of your eyes. Align your right and left thumb nails with the centers of your right and left pupils. Then bring the pen to the on-screen ruler to measure the separation between your thumbs. Allign your left thumb with zero and notice where your right thumb is. Put down the pen and click the ruler at that point. Finally, click OK to continue.",ar:"سنقيس المسافة بين عينيك. استخدم صورة الفيديو لمراقبة عينيك. امسك قلمًا أفقيًا أمام وجهك أمام عينيك. قم بمحاذاة أظافر إبهامك الأيمن والأيسر مع مراكز بؤبؤي عينيك الأيمن والأيسر. ثم أحضر القلم إلى المسطرة على الشاشة لقياس المسافة بين إبهاميك. قم بمحاذاة إبهامك الأيسر مع الصفر ولاحظ مكان إبهامك الأيمن. ضع القلم وانقر على المسطرة في تلك النقطة. أخيرًا، انقر على موافق للمتابعة.",hy:"Մենք չափելու ենք ձեր աչքերի հեռավորությունը: Ձեր աչքերը դիտելու համար օգտագործեք տեսանյութի պատկերը: Գրիչը ձեր դեմքին հորիզոնական պահեք ձեր աչքերի առաջ: Հավասարեցրեք ձեր աջ և ձախ բթամատի եղունգները ձեր աջ և ձախ աշակերտների կենտրոնների հետ: Այնուհետև գրիչը բերեք էկրանի քանոնի մոտ՝ ձեր բութ մատների միջև բաժանումը չափելու համար: Ձեր ձախ բութ մատը հավասարեցրեք զրոյի հետ և նկատեք, թե որտեղ է ձեր աջ բութ մատը: Գրիչը ցած դրեք և այդ կետում սեղմեք քանոնը: Վերջում սեղմեք OK՝ շարունակելու համար:",bg:"Ще измерим разстоянието между очите ви. Използвайте видео изображението, за да наблюдавате очите си. Дръжте писалка хоризонтално срещу лицето си пред очите си. Подравнете ноктите на десния и левия палец с центровете на дясната и лявата зеница. След това донесете писалката до линийката на екрана, за да измерите разстоянието между палците си. Подравнете левия си палец с нулата и забележете къде е десният палец. Поставете писалката и щракнете върху линийката в тази точка. Накрая щракнете върху OK, за да продължите.","zh-CN":"我们将测量您双眼之间的距离。使用视频图像观察您的眼睛。将笔水平放在眼前的脸上。将左右拇指指甲与左右瞳孔的中心对齐。然后将笔放在屏幕上的标尺上以测量拇指之间的间距。将左手拇指与零对齐,并注意右手拇指的位置。放下笔并在该点单击标尺。最后,单击“确定”继续。","zh-HK":"我們將測量您雙眼之間的距離。使用視訊影像觀察您的眼睛。將筆水平放在眼前的臉上。將左右拇指指甲與左右瞳孔的中心對齊。然後將筆放在螢幕上的標尺上以測量拇指之間的間距。將左手拇指與零對齊,並注意右手拇指的位置。放下筆並在該點點擊標尺。最後,按一下“確定”繼續。",hr:"Izmjerit ćemo udaljenost između vaših očiju. Koristite video sliku da promatrate svoje oči. Držite olovku vodoravno na licu ispred očiju. Poravnajte nokte desnog i lijevog palca sa središtima desne i lijeve zjenice. Zatim prinesite olovku ravnalu na zaslonu kako biste izmjerili razmak između svojih palaca. Poravnajte lijevi palac s nulom i primijetite gdje vam je desni palac. Spustite olovku i pritisnite ravnalo na tom mjestu. Na kraju kliknite OK za nastavak.",cs:"Změříme vám vzdálenost mezi očima. Pomocí videoobrazu sledujte své oči. Držte pero vodorovně na obličeji před očima. Zarovnejte pravé a levé nehty se středy pravé a levé zornice. Poté přiložte pero k pravítku na obrazovce a změřte vzdálenost mezi vašimi palci. Srovnejte levý palec s nulou a všimněte si, kde máte pravý palec. Položte pero a v tomto bodě klepněte na pravítko. Nakonec pokračujte kliknutím na OK.",da:"Vi måler afstanden mellem dine øjne. Brug videobilledet til at se dine øjne. Hold en kuglepen vandret mod dit ansigt foran dine øjne. Juster dine højre og venstre tommelfingernegle med midten af ​​dine højre og venstre pupiller. Tag derefter pennen hen til linealen på skærmen for at måle afstanden mellem dine tommelfingre. Ret din venstre tommelfinger mod nul, og læg mærke til, hvor din højre tommelfinger er. Læg pennen fra dig, og klik på linealen på det tidspunkt. Klik til sidst på OK for at fortsætte.",nl:"We meten de afstand tussen uw ogen. Gebruik het videobeeld om naar je ogen te kijken. Houd een pen horizontaal tegen uw gezicht, voor uw ogen. Lijn uw rechter- en linkerduimnagels uit met de middelpunten van uw rechter- en linkerpupillen. Breng vervolgens de pen naar de liniaal op het scherm om de afstand tussen uw duimen te meten. Lijn uw linkerduim uit met nul en merk op waar uw rechterduim is. Leg de pen neer en klik op dat punt met de liniaal. Klik ten slotte op OK om door te gaan.","en-UK":"We'll measure the distance between your eyes. Use the video image to watch your eyes. Hold a pen horizontally against your face in front of your eyes. Align your right and left thumb nails with the centres of your right and left pupils. Then bring the pen to the on-screen ruler to measure the separation between your thumbs. Align your left thumb with zero and notice where your right thumb is. Put down the pen and click the ruler at that point. Finally, click OK to continue.",fi:"Mittaamme silmiesi välisen etäisyyden. Käytä videokuvaa katsellaksesi silmiäsi. Pidä kynää vaakatasossa kasvojasi vasten silmiesi edessä. Kohdista oikean ja vasemman peukalon kynnesi oikean ja vasemman pupillisi keskikohtiin. Tuo sitten kynä näytön viivaimen luo mitataksesi peukalojesi välinen etäisyys. Kohdista vasen peukalosi nollaan ja huomaa, missä oikea peukalosi on. Aseta kynä alas ja napsauta viivainta siinä kohdassa. Jatka lopuksi napsauttamalla OK.",fr:"Nous mesurerons la distance entre vos yeux. Utilisez l'image vidéo pour observer vos yeux. Tenez un stylo horizontalement contre votre visage devant vos yeux. Alignez vos ongles de pouce droit et gauche avec le centre de vos pupilles droite et gauche. Ensuite, amenez le stylo à la règle à l'écran pour mesurer la séparation entre vos pouces. Alignez votre pouce gauche avec zéro et notez où se trouve votre pouce droit. Posez le stylo et cliquez sur la règle à cet endroit. Enfin, cliquez sur OK pour continuer.",de:"Wir messen den Abstand zwischen Ihren Augen. Benutzen Sie das Videobild, um Ihre Augen zu beobachten. Halten Sie einen Stift vor Ihren Augen waagerecht an Ihr Gesicht. Richten Sie Ihren rechten und linken Daumennagel an den Mittelpunkten Ihrer rechten und linken Pupille aus. Halten Sie dann den Stift an das Bildschirmlineal, um den Abstand zwischen Ihren Daumen zu messen. Richten Sie Ihren linken Daumen auf Null aus und achten Sie darauf, wo sich Ihr rechter Daumen befindet. Legen Sie den Stift ab und klicken Sie an dieser Stelle mit dem Lineal. Klicken Sie abschließend auf OK, um fortzufahren.",el:"Θα μετρήσουμε την απόσταση μεταξύ των ματιών σας. Χρησιμοποιήστε την εικόνα του βίντεο για να παρακολουθήσετε τα μάτια σας. Κρατήστε ένα στυλό οριζόντια στο πρόσωπό σας μπροστά στα μάτια σας. Ευθυγραμμίστε τα νύχια του δεξιού και του αριστερού αντίχειρα με το κέντρο της δεξιάς και της αριστερής κόρης σας. Στη συνέχεια, φέρτε το στυλό στον χάρακα της οθόνης για να μετρήσετε το διαχωρισμό μεταξύ των αντίχειρών σας. Ευθυγραμμίστε τον αριστερό σας αντίχειρα με το μηδέν και παρατηρήστε πού βρίσκεται ο δεξιός σας αντίχειρας. Αφήστε κάτω το στυλό και κάντε κλικ στο χάρακα σε εκείνο το σημείο. Τέλος, κάντε κλικ στο OK για να συνεχίσετε.",he:"אנו נמדוד את המרחק בין העיניים שלך. השתמש בתמונת הווידאו כדי לצפות בעיניים שלך. החזק עט אופקית מול הפנים שלך מול העיניים. יישר את ציפורני האגודל הימנית והשמאלית שלך עם מרכז האישונים הימניים והשמאליים שלך. לאחר מכן הביאו את העט לסרגל שעל המסך כדי למדוד את ההפרדה בין האגודלים. יישר את אגודל שמאל לאפס ושם לב היכן נמצא האגודל הימני. הנח את העט ולחץ על הסרגל באותה נקודה. לבסוף, לחץ על אישור כדי להמשיך.",hi:"हम आपकी आँखों के बीच की दूरी मापेंगे। अपनी आँखों को देखने के लिए वीडियो छवि का उपयोग करें। अपनी आंखों के सामने अपने चेहरे पर क्षैतिज रूप से एक पेन पकड़ें। अपने दाएं और बाएं अंगूठे के नाखूनों को अपने दाएं और बाएं पुतलियों के केंद्र के साथ संरेखित करें। फिर अपने अंगूठे के बीच की दूरी को मापने के लिए पेन को ऑन-स्क्रीन रूलर के पास लाएँ। अपने बाएं अंगूठे को शून्य पर संरेखित करें और ध्यान दें कि आपका दाहिना अंगूठा कहां है। पेन नीचे रखें और उस बिंदु पर रूलर पर क्लिक करें। अंत में, जारी रखने के लिए ओके पर क्लिक करें।",hu:"Megmérjük a távolságot a szemei ​​között. Használja a videoképet, hogy figyelje a szemét. Tartsa a tollat ​​vízszintesen az arcához, a szeme elé. Igazítsa jobb és bal hüvelykujjának körmét a jobb és bal pupillák középpontjához. Ezután vigye a tollat ​​a képernyőn megjelenő vonalzóhoz, hogy megmérje a hüvelykujjai közötti távolságot. Állítsa a bal hüvelykujját nullához, és figyelje meg, hol van a jobb hüvelykujja. Tegye le a tollat, és ezen a ponton kattintson a vonalzóra. Végül kattintson az OK gombra a folytatáshoz.",is:"Við mælum fjarlægðina á milli augna þinna. Notaðu myndbandsmyndina til að horfa á augun þín. Haltu penna láréttum að andliti þínu fyrir framan augun. Stilltu hægri og vinstri þumalfingursnöglum þínum við miðju hægri og vinstri sjáaldranna. Komdu síðan með pennann að reglustikunni á skjánum til að mæla bilið á milli þumalfingranna. Stilltu vinstri þumalfingri við núll og taktu eftir hvar hægri þumalfingur þinn er. Leggðu frá þér pennann og smelltu á reglustikuna á þeim tímapunkti. Að lokum, smelltu á OK til að halda áfram.",id:"Kami akan mengukur jarak antara mata Anda. Gunakan gambar video untuk memperhatikan mata Anda. Pegang pena secara horizontal di wajah Anda di depan mata Anda. Sejajarkan kuku ibu jari kanan dan kiri dengan titik tengah pupil kanan dan kiri. Kemudian dekatkan pena ke penggaris di layar untuk mengukur jarak antara ibu jari Anda. Sejajarkan ibu jari kiri Anda dengan angka nol dan perhatikan di mana ibu jari kanan Anda berada. Letakkan pena dan klik penggaris pada saat itu. Terakhir, klik OK untuk melanjutkan.",it:"Misureremo la distanza tra i tuoi occhi. Usa l'immagine video per osservare i tuoi occhi. Tieni una penna orizzontalmente contro il tuo viso davanti ai tuoi occhi. Allinea le unghie dei pollici destro e sinistro con i centri delle tue pupille destra e sinistra. Poi porta la penna al righello sullo schermo per misurare la separazione tra i tuoi pollici. Allinea il pollice sinistro con lo zero e nota dove si trova il pollice destro. Metti giù la penna e clicca sul righello a quel punto. Infine, clicca su OK per continuare.",ja:"あなたの目の間の距離を測定します。ビデオ画像を使用して目を観察してください。ペンを目の前で顔に対して水平に持ちます。左右の親指の爪を左右の瞳孔の中心に合わせます。次に、ペンを画面上の定規に持ってきて、親指の間の間隔を測定します。左手の親指をゼロに合わせて、右手の親指がどこにあるかに注目してください。ペンを置き、その時点で定規をクリックします。最後に、「OK」をクリックして続行します。",kn:"ನಿಮ್ಮ ಕಣ್ಣುಗಳ ನಡುವಿನ ಅಂತರವನ್ನು ನಾವು ಅಳೆಯುತ್ತೇವೆ. ನಿಮ್ಮ ಕಣ್ಣುಗಳನ್ನು ವೀಕ್ಷಿಸಲು ವೀಡಿಯೊ ಚಿತ್ರವನ್ನು ಬಳಸಿ. ನಿಮ್ಮ ಕಣ್ಣುಗಳ ಮುಂದೆ ನಿಮ್ಮ ಮುಖದ ವಿರುದ್ಧ ಪೆನ್ನನ್ನು ಅಡ್ಡಲಾಗಿ ಹಿಡಿದುಕೊಳ್ಳಿ. ನಿಮ್ಮ ಬಲ ಮತ್ತು ಎಡ ಹೆಬ್ಬೆರಳಿನ ಉಗುರುಗಳನ್ನು ನಿಮ್ಮ ಬಲ ಮತ್ತು ಎಡ ವಿದ್ಯಾರ್ಥಿಗಳ ಮಧ್ಯಭಾಗದೊಂದಿಗೆ ಜೋಡಿಸಿ. ನಂತರ ನಿಮ್ಮ ಹೆಬ್ಬೆರಳುಗಳ ನಡುವಿನ ಪ್ರತ್ಯೇಕತೆಯನ್ನು ಅಳೆಯಲು ಆನ್-ಸ್ಕ್ರೀನ್ ರೂಲರ್‌ಗೆ ಪೆನ್ ಅನ್ನು ತನ್ನಿ. ನಿಮ್ಮ ಎಡಗೈ ಹೆಬ್ಬೆರಳನ್ನು ಸೊನ್ನೆಯಿಂದ ಜೋಡಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಬಲ ಹೆಬ್ಬೆರಳು ಎಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ. ಪೆನ್ ಕೆಳಗೆ ಇರಿಸಿ ಮತ್ತು ಆ ಸಮಯದಲ್ಲಿ ರೂಲರ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. ಅಂತಿಮವಾಗಿ, ಮುಂದುವರೆಯಲು ಸರಿ ಕ್ಲಿಕ್ ಮಾಡಿ.",ko:"눈 사이의 거리를 측정해보겠습니다. 비디오 이미지를 사용하여 눈을 살펴보세요. 눈 앞에서 얼굴에 수평으로 펜을 대십시오. 오른쪽 및 왼쪽 엄지손가락 손톱을 오른쪽 및 왼쪽 동공의 중심에 맞춥니다. 그런 다음 펜을 화면의 눈금자에 가져와 엄지손가락 사이의 간격을 측정합니다. 왼쪽 엄지손가락을 0에 맞추고 오른쪽 엄지손가락이 어디에 있는지 확인하세요. 펜을 내려놓고 그 지점에서 눈금자를 클릭하세요. 마지막으로 확인을 클릭하여 계속하세요.",lt:"Mes išmatuosime atstumą tarp jūsų akių. Norėdami stebėti savo akis, naudokite vaizdo įrašo vaizdą. Laikykite rašiklį horizontaliai prie veido prieš akis. Sulygiuokite dešiniojo ir kairiojo nykščio nagus su dešiniojo ir kairiojo vyzdžių centrais. Tada nuneškite rašiklį prie ekrano liniuotės, kad pamatytumėte atstumą tarp nykščių. Kairįjį nykštį sulygiuokite su nuliu ir atkreipkite dėmesį, kur yra dešinysis nykštys. Nuleiskite rašiklį ir spustelėkite liniuotę toje vietoje. Galiausiai spustelėkite Gerai, kad tęstumėte.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"നിങ്ങളുടെ കണ്ണുകൾ തമ്മിലുള്ള ദൂരം ഞങ്ങൾ അളക്കും. നിങ്ങളുടെ കണ്ണുകൾ കാണാൻ വീഡിയോ ചിത്രം ഉപയോഗിക്കുക. നിങ്ങളുടെ കണ്ണുകൾക്ക് മുന്നിൽ നിങ്ങളുടെ മുഖത്തിന് നേരെ തിരശ്ചീനമായി ഒരു പേന പിടിക്കുക. നിങ്ങളുടെ വലത്, ഇടത് തള്ളവിരലുകളുടെ നഖങ്ങൾ നിങ്ങളുടെ വലത്, ഇടത് വിദ്യാർത്ഥികളുടെ മധ്യഭാഗത്ത് വിന്യസിക്കുക. തുടർന്ന് നിങ്ങളുടെ തള്ളവിരലുകൾ തമ്മിലുള്ള വേർതിരിവ് അളക്കാൻ ഓൺ-സ്‌ക്രീൻ റൂളറിലേക്ക് പേന കൊണ്ടുവരിക. നിങ്ങളുടെ ഇടത് തള്ളവിരൽ പൂജ്യം കൊണ്ട് വിന്യസിക്കുക, നിങ്ങളുടെ വലതു തള്ളവിരൽ എവിടെയാണെന്ന് ശ്രദ്ധിക്കുക. പേന താഴെയിട്ട് ആ ഘട്ടത്തിൽ റൂളറിൽ ക്ലിക്ക് ചെയ്യുക. അവസാനം, തുടരാൻ ശരി ക്ലിക്കുചെയ്യുക.",no:"Vi måler avstanden mellom øynene dine. Bruk videobildet til å se øynene dine. Hold en penn vannrett mot ansiktet foran øynene. Juster høyre og venstre tommelengle med midten av høyre og venstre pupille. Ta deretter pennen til linjalen på skjermen for å måle avstanden mellom tomlene. Juster venstre tommel mot null og legg merke til hvor høyre tommel er. Legg ned pennen og klikk på linjalen på det punktet. Til slutt klikker du OK for å fortsette.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierzymy odległość między Twoimi oczami. Użyj obrazu wideo, aby obserwować swoje oczy. Trzymaj długopis poziomo przy twarzy, przed oczami. Dopasuj paznokcie prawego i lewego kciuka do środków prawej i lewej źrenicy. Następnie zbliż pióro do linijki ekranowej i zmierz odległość między kciukami. Ustaw lewy kciuk na zero i zwróć uwagę, gdzie znajduje się prawy kciuk. Odłóż pióro i kliknij linijkę w tym miejscu. Na koniec kliknij OK, aby kontynuować.",pt:"Mediremos a distância entre seus olhos. Use a imagem do vídeo para observar seus olhos. Segure uma caneta horizontalmente contra o rosto, na frente dos olhos. Alinhe as unhas dos polegares direito e esquerdo com o centro das pupilas direita e esquerda. Em seguida, leve a caneta até a régua na tela para medir a separação entre os polegares. Alinhe o polegar esquerdo com zero e observe onde está o polegar direito. Abaixe a caneta e clique na régua nesse ponto. Por fim, clique em OK para continuar.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Mediremos la distancia entre tus ojos. Usa la imagen de video para observar tus ojos. Sostén un bolígrafo horizontalmente contra tu cara frente a tus ojos. Alinea las uñas de tus pulgares derecho e izquierdo con los centros de tus pupilas derecha e izquierda. Luego lleva el bolígrafo a la regla en pantalla para medir la separación entre tus pulgares. Alinea tu pulgar izquierdo con el cero y observa dónde está tu pulgar derecho. Deja el bolígrafo y haz clic en la regla en ese punto. Finalmente, haz clic en OK para continuar.",sw:"Tutapima umbali kati ya macho yako. Tumia picha ya video kutazama macho yako. Shikilia kalamu kwa usawa dhidi ya uso wako mbele ya macho yako. Sawazisha kucha zako za kidole gumba cha kulia na kushoto na vituo vya wanafunzi wako wa kulia na kushoto. Kisha leta kalamu kwenye rula ya skrini ili kupima utengano kati ya vidole gumba vyako. Linganisha kidole gumba chako cha kushoto na sifuri na utambue kidole gumba cha kulia kilipo. Weka kalamu chini na ubofye rula wakati huo. Hatimaye, bofya Sawa ili kuendelea.",sv:"Vi mäter avståndet mellan dina ögon. Använd videobilden för att titta på dina ögon. Håll en penna horisontellt mot ansiktet framför dina ögon. Rikta in dina högra och vänstra tumnaglar med mitten av dina högra och vänstra pupiller. Ta sedan med pennan till linjalen på skärmen för att mäta avståndet mellan tummarna. Rikta vänster tumme mot noll och lägg märke till var höger tumme är. Lägg ner pennan och klicka på linjalen vid den punkten. Klicka slutligen på OK för att fortsätta.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Gözlerinizin arasındaki mesafeyi ölçeceğiz. Gözlerinizi izlemek için video görüntüsünü kullanın. Bir kalemi gözlerinizin önünde yüzünüze yatay olarak tutun. Sağ ve sol başparmak tırnaklarınızı sağ ve sol gözbebeklerinizin merkezleriyle hizalayın. Daha sonra başparmaklarınız arasındaki mesafeyi ölçmek için kalemi ekran cetveline getirin. Sol baş parmağınızı sıfıra hizalayın ve sağ baş parmağınızın nerede olduğuna dikkat edin. Kalemi bırakın ve bu noktada cetvele tıklayın. Son olarak devam etmek için Tamam'a tıklayın.",ur:"ہم آپ کی آنکھوں کے درمیان فاصلے کی پیمائش کریں گے۔ اپنی آنکھوں کو دیکھنے کے لیے ویڈیو امیج کا استعمال کریں۔ اپنی آنکھوں کے سامنے اپنے چہرے کے خلاف افقی طور پر قلم پکڑیں۔ اپنے دائیں اور بائیں انگوٹھے کے ناخنوں کو اپنے دائیں اور بائیں شاگردوں کے مراکز کے ساتھ سیدھ میں رکھیں۔ پھر اپنے انگوٹھوں کے درمیان علیحدگی کی پیمائش کرنے کے لیے قلم کو آن اسکرین رولر پر لائیں۔ اپنے بائیں انگوٹھے کو صفر کے ساتھ سیدھا کریں اور دیکھیں کہ آپ کا دایاں انگوٹھا کہاں ہے۔ قلم نیچے رکھیں اور اس مقام پر حکمران پر کلک کریں۔ آخر میں، جاری رکھنے کے لیے ٹھیک ہے پر کلک کریں۔"},RC_nearPointTitle:{"en-US":"Measure Pupillary Distance",ar:"قياس المسافة بين الحدقتين",hy:"Չափել աշակերտի հեռավորությունը",bg:"Измерете зеничното разстояние","zh-CN":"测量瞳距","zh-HK":"測量瞳距",hr:"Izmjerite udaljenost zjenica",cs:"Změřte vzdálenost zornic",da:"Mål pupilafstand",nl:"Meet de pupilafstand","en-UK":"Measure Pupillary Distance",fi:"Mittaa pupillietäisyys",fr:"Mesurer la distance pupillaire",de:"Pupillenabstand messen",el:"Μετρήστε την απόσταση της κόρης",he:"למדוד מרחק אישונים",hi:"पुतली की दूरी मापें",hu:"Mérje meg a pupilla távolságát",is:"Mældu fjarlægð nemandans",id:"Ukur Jarak Pupil",it:"Misura la distanza interpupillare",ja:"瞳孔間距離の測定",kn:"ಪ್ಯೂಪಿಲ್ಲರಿ ದೂರವನ್ನು ಅಳೆಯಿರಿ",ko:"동공 거리 측정",lt:"Išmatuokite vyzdžių atstumą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"പ്യൂപ്പില്ലറി ദൂരം അളക്കുക",no:"Mål pupillavstand",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierz odległość źrenic",pt:"Medir a distância pupilar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Medir la distancia pupilar",sw:"Pima Umbali wa Pupillary",sv:"Mät pupillavstånd",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Gözbebeği Mesafesini Ölçün",ur:"Pupillary فاصلے کی پیمائش کریں"},RC_ok:{"en-US":"OK",ar:"حسنًا",hy:"Լավ",bg:"добре","zh-CN":"好的","zh-HK":"好的",hr:"U REDU",cs:"OK",da:"OK",nl:"OK","en-UK":"OK",fi:"OK",fr:"D'accord",de:"OK",el:"ΕΝΤΑΞΕΙ",he:"בְּסֵדֶר",hi:"ठीक है",hu:"RENDBEN",is:"Allt í lagi",id:"OKE",it:"Va bene",ja:"わかりました",kn:"ಸರಿ",ko:"좋아요",lt:"Gerai",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ശരി",no:"OK",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"OK",pt:"OK",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Está bien",sw:"Sawa",sv:"OK",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"TAMAM",ur:"ٹھیک ہے"},RC_panelButton:{"en-US":"Done",ar:"تم",hy:"Կատարված է",bg:"Готово","zh-CN":"完毕","zh-HK":"完畢",hr:"Gotovo",cs:"Hotovo",da:"Færdig",nl:"Klaar","en-UK":"Done",fi:"Tehty",fr:"Fait",de:"Erledigt",el:"Γινώμενος",he:"נַעֲשָׂה",hi:"हो गया",hu:"Kész",is:"Búið",id:"Selesai",it:"Fatto",ja:"終わり",kn:"ಮುಗಿದಿದೆ",ko:"완료",lt:"Atlikta",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ചെയ്തു",no:"Ferdig",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zrobione",pt:"Feito",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Hecho",sw:"Imekamilika",sv:"Gjort",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Tamamlamak",ur:"ہو گیا"},RC_panelIntro:{"en-US":" ",ar:'"""',hy:"#VALUE!",bg:"#VALUE!","zh-CN":"#VALUE!","zh-HK":"#VALUE!",hr:"#VALUE!",cs:"#VALUE!",da:"#VALUE!",nl:"#VALUE!","en-UK":"",fi:"#VALUE!",fr:"",de:"#VALUE!",el:"#VALUE!",he:"#VALUE!",hi:"#VALUE!",hu:"#VALUE!",is:"#VALUE!",id:"#VALUE!",it:'""',ja:"#VALUE!",kn:"#VALUE!",ko:"#VALUE!",lt:"#VALUE!",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"#VALUE!",no:"#VALUE!",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"#VALUE!",pt:"#VALUE!",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"",sw:"#VALUE!",sv:"#VALUE!",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"#VALUE!",ur:"#VALUE!"},RC_panelTitle:{"en-US":"Please press a button to calibrate",ar:"يرجى الضغط على زر للمعايرة",hy:"Խնդրում ենք սեղմել կոճակը չափաբերելու համար",bg:"Моля, натиснете бутон за калибриране","zh-CN":"请按按钮进行校准","zh-HK":"請按按鈕進行校準",hr:"Pritisnite gumb za kalibraciju",cs:"Pro kalibraci stiskněte tlačítko",da:"Tryk venligst på en knap for at kalibrere",nl:"Druk op een knop om te kalibreren","en-UK":"Please press a button to calibrate",fi:"Paina painiketta kalibroidaksesi",fr:"Veuillez appuyer sur un bouton pour calibrer.",de:"Bitte drücken Sie zum Kalibrieren eine Taste",el:"Πατήστε ένα κουμπί για βαθμονόμηση",he:"אנא לחץ על כפתור כדי לכייל",hi:"कृपया अंशांकन करने के लिए एक बटन दबाएँ",hu:"Kérjük, nyomja meg a gombot a kalibráláshoz",is:"Vinsamlegast ýttu á hnapp til að kvarða",id:"Silakan tekan tombol untuk mengkalibrasi",it:"Premere un pulsante per calibrare",ja:"ボタンを押して調整してください",kn:"ಮಾಪನಾಂಕ ನಿರ್ಣಯಿಸಲು ದಯವಿಟ್ಟು ಬಟನ್ ಒತ್ತಿರಿ",ko:"버튼을 눌러 교정하세요.",lt:"Norėdami sukalibruoti, paspauskite mygtuką",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാലിബ്രേറ്റ് ചെയ്യുന്നതിന് ദയവായി ഒരു ബട്ടൺ അമർത്തുക",no:"Trykk på en knapp for å kalibrere",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Naciśnij przycisk, aby skalibrować",pt:"Por favor, pressione um botão para calibrar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Por favor, presione un botón para calibrar.",sw:"Tafadhali bonyeza kitufe ili kurekebisha",sv:"Vänligen tryck på en knapp för att kalibrera",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Kalibre etmek için lütfen bir düğmeye basın",ur:"براہ کرم کیلیبریٹ کرنے کے لیے ایک بٹن دبائیں۔"},RC_panelTitleNext:{"en-US":"Thanks for calibrating. Hit the button to continue.",ar:"شكرًا على المعايرة. اضغط على الزر للمتابعة.",hy:"Շնորհակալություն չափորոշման համար: Շարունակելու համար սեղմեք կոճակը:",bg:"Благодаря за калибрирането. Натиснете бутона, за да продължите.","zh-CN":"感谢您的校准。点击按钮继续。","zh-HK":"感謝您的校準。點擊按鈕繼續。",hr:"Hvala na kalibraciji. Pritisnite gumb za nastavak.",cs:"Díky za kalibraci. Pokračujte stisknutím tlačítka.",da:"Tak for kalibreringen. Tryk på knappen for at fortsætte.",nl:"Bedankt voor het kalibreren. Druk op de knop om door te gaan.","en-UK":"Thanks for calibrating. Press the button to continue.",fi:"Kiitos kalibroinnista. Jatka painamalla painiketta.",fr:"Merci pour l'étalonnage. Appuyez sur le bouton pour continuer.",de:"Vielen Dank für die Kalibrierung. Klicken Sie auf die Schaltfläche, um fortzufahren.",el:"Ευχαριστώ για τη βαθμονόμηση. Πατήστε το κουμπί για να συνεχίσετε.",he:"תודה על הכיול. לחץ על הכפתור כדי להמשיך.",hi:"अंशांकन के लिए धन्यवाद. जारी रखने के लिए बटन दबाएँ.",hu:"Köszönöm a kalibrálást. Nyomja meg a gombot a folytatáshoz.",is:"Takk fyrir kvörðunina. Ýttu á hnappinn til að halda áfram.",id:"Terima kasih telah mengkalibrasi. Tekan tombol untuk melanjutkan.",it:"Grazie per la calibrazione. Premi il pulsante per continuare.",ja:"校正してくれてありがとう。続行するにはボタンを押してください。",kn:"ಮಾಪನಾಂಕ ನಿರ್ಣಯಿಸಿದ್ದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು. ಮುಂದುವರಿಸಲು ಬಟನ್ ಒತ್ತಿರಿ.",ko:"교정해 주셔서 감사합니다. 계속하려면 버튼을 누르세요.",lt:"Ačiū, kad sukalibravote. Norėdami tęsti, paspauskite mygtuką.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാലിബ്രേറ്റ് ചെയ്തതിന് നന്ദി. തുടരാൻ ബട്ടൺ അമർത്തുക.",no:"Takk for kalibreringen. Trykk på knappen for å fortsette.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Dziękuję za kalibrację. Naciśnij przycisk, aby kontynuować.",pt:"Obrigado por calibrar. Aperte o botão para continuar.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Gracias por calibrar. Presiona el botón para continuar.",sw:"Asante kwa kusawazisha. Bonyeza kitufe ili kuendelea.",sv:"Tack för kalibreringen. Tryck på knappen för att fortsätta.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Kalibrasyon için teşekkürler. Devam etmek için düğmeye basın.",ur:"کیلیبریٹ کرنے کا شکریہ۔ جاری رکھنے کے لیے بٹن کو دبائیں۔"},RC_panelIntroNext:{"en-US":" ",ar:'""',hy:"#VALUE!",bg:"#VALUE!","zh-CN":"#VALUE!","zh-HK":"#VALUE!",hr:"#VALUE!",cs:"#VALUE!",da:"#VALUE!",nl:"#VALUE!","en-UK":"",fi:"#VALUE!",fr:"",de:"#VALUE!",el:"#VALUE!",he:"#VALUE!",hi:"#VALUE!",hu:"#VALUE!",is:"#VALUE!",id:"#VALUE!",it:'""',ja:"#VALUE!",kn:"#VALUE!",ko:"#VALUE!",lt:"#VALUE!",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"#VALUE!",no:"#VALUE!",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"#VALUE!",pt:"#VALUE!",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"",sw:"#VALUE!",sv:"#VALUE!",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"#VALUE!",ur:"#VALUE!"},RC_panelUsesWebcam:{"en-US":"uses webcam",ar:"يستخدم كاميرا الويب",hy:"օգտագործում է վեբ-տեսախցիկ",bg:"използва уеб камера","zh-CN":"使用网络摄像头","zh-HK":"使用網路攝影機",hr:"koristi web kameru",cs:"používá webovou kameru",da:"bruger webcam",nl:"maakt gebruik van een webcam","en-UK":"uses webcam",fi:"käyttää web-kameraa",fr:"utilise la webcam",de:"nutzt Webcam",el:"χρησιμοποιεί κάμερα web",he:"משתמש במצלמת אינטרנט",hi:"वेबकैम का उपयोग करता है",hu:"webkamerát használ",is:"notar vefmyndavél",id:"menggunakan kamera web",it:"utilizza la webcam",ja:"ウェブカメラを使用します",kn:"ವೆಬ್‌ಕ್ಯಾಮ್ ಬಳಸುತ್ತದೆ",ko:"웹캠을 사용합니다",lt:"naudoja internetinę kamerą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വെബ്ക്യാം ഉപയോഗിക്കുന്നു",no:"bruker webkamera",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"korzysta z kamery internetowej",pt:"usa webcam",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"usa cámara web",sw:"inatumia webcam",sv:"använder webbkamera",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"web kamerasını kullanır",ur:"ویب کیم استعمال کرتا ہے۔"},RC_panelUsesWebcamPhone:{"en-US":"uses webcam and phone",ar:"يستخدم كاميرا الويب والهاتف",hy:"օգտագործում է վեբ-տեսախցիկ և հեռախոս",bg:"използва уеб камера и телефон","zh-CN":"使用网络摄像头和电话","zh-HK":"使用網路攝影機和電話",hr:"koristi web kameru i telefon",cs:"používá webovou kameru a telefon",da:"bruger webcam og telefon",nl:"maakt gebruik van webcam en telefoon","en-UK":"uses webcam and mobile",fi:"käyttää web-kameraa ja puhelinta",fr:"utilise la webcam et le téléphone",de:"nutzt Webcam und Telefon",el:"χρησιμοποιεί κάμερα web και τηλέφωνο",he:"משתמש במצלמת אינטרנט ובטלפון",hi:"वेबकैम और फ़ोन का उपयोग करता है",hu:"webkamerát és telefont használ",is:"notar vefmyndavél og síma",id:"menggunakan webcam dan telepon",it:"utilizza webcam e telefono",ja:"ウェブカメラと電話を使用する",kn:"ವೆಬ್‌ಕ್ಯಾಮ್ ಮತ್ತು ಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತದೆ",ko:"웹캠과 전화를 사용합니다",lt:"naudoja internetinę kamerą ir telefoną",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വെബ്‌ക്യാമും ഫോണും ഉപയോഗിക്കുന്നു",no:"bruker webkamera og telefon",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"korzysta z kamery internetowej i telefonu",pt:"usa webcam e telefone",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"usa cámara web y teléfono",sw:"hutumia kamera ya wavuti na simu",sv:"använder webbkamera och telefon",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"web kamerası ve telefon kullanıyor",ur:"ویب کیم اور فون استعمال کرتا ہے۔"},RC_performance:{"en-US":"Graphics Performance",ar:"أداء الرسوميات",hy:"Գրաֆիկական կատարում",bg:"Графична производителност","zh-CN":"图形性能","zh-HK":"圖形效能",hr:"Grafička izvedba",cs:"Grafický výkon",da:"Grafisk ydeevne",nl:"Grafische prestaties","en-UK":"Graphics Performance",fi:"Grafiikka suorituskyky",fr:"Performances graphiques",de:"Grafikleistung",el:"Απόδοση γραφικών",he:"ביצועים גרפיים",hi:"ग्राफ़िक्स प्रदर्शन",hu:"Grafikai teljesítmény",is:"Grafísk árangur",id:"Performa Grafis",it:"Prestazioni grafiche",ja:"グラフィックス性能",kn:"ಗ್ರಾಫಿಕ್ಸ್ ಕಾರ್ಯಕ್ಷಮತೆ",ko:"그래픽 성능",lt:"Grafikos našumas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഗ്രാഫിക്സ് പ്രകടനം",no:"Grafisk ytelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Wydajność grafiki",pt:"Desempenho gráfico",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Rendimiento de gráficos",sw:"Utendaji wa Graphics",sv:"Grafikprestanda",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Grafik Performansı",ur:"گرافکس کی کارکردگی"},RC_performanceIntro:{"en-US":"Please do not disturb. Drawing graphics to assess web browser performance ...",ar:"يرجى عدم الإزعاج. يتم رسم الرسوم البيانية لتقييم أداء متصفح الويب ...",hy:"Խնդրում եմ մի խանգարեք: Գծագրական գրաֆիկա՝ վեբ բրաուզերի կատարողականությունը գնահատելու համար...",bg:"Моля, не безпокойте. Рисуване на графики за оценка на ефективността на уеб браузъра...","zh-CN":"请不要打扰。绘制图形来评估网络浏览器性能...","zh-HK":"請不要打擾。繪製圖形來評估網頁瀏覽器效能...",hr:"Molim vas ne smetajte. Crtanje grafike za procjenu performansi web preglednika ...",cs:"Prosím, nerušit. Kreslení grafiky pro posouzení výkonu webového prohlížeče...",da:"Forstyr venligst ikke. Tegning af grafik for at vurdere webbrowserens ydeevne ...",nl:"Gelieve niet te storen. Afbeeldingen tekenen om de prestaties van de webbrowser te beoordelen...","en-UK":"Please do not disturb. Drawing graphics to assess web browser performance ...",fi:"Älä häiritse. Grafiikan piirtäminen verkkoselaimen suorituskyvyn arvioimiseksi...",fr:"Veuillez ne pas déranger. Création de graphiques pour évaluer les performances du navigateur web ...",de:"Bitte nicht stören. Zeichnen von Grafiken zur Beurteilung der Webbrowser-Leistung ...",el:"Παρακαλώ μην ενοχλείτε. Σχεδίαση γραφικών για την αξιολόγηση της απόδοσης του προγράμματος περιήγησης ιστού ...",he:"נא לא להפריע. ציור גרפיקה להערכת ביצועי דפדפן אינטרנט...",hi:"कृपया परेशान न करें। वेब ब्राउज़र के प्रदर्शन का आकलन करने के लिए ग्राफ़िक्स बनाना...",hu:"Kérem, ne zavarjanak. Grafika rajzolása a webböngésző teljesítményének értékeléséhez...",is:"Vinsamlegast ekki trufla. Teikning grafík til að meta árangur vafra ...",id:"Tolong jangan ganggu. Menggambar grafik untuk menilai kinerja browser web ...",it:"Per favore, non disturbare. Sto disegnando grafici per valutare le prestazioni del browser web ...",ja:"邪魔しないでください。グラフィックを描画して Web ブラウザのパフォーマンスを評価します ...",kn:"ದಯವಿಟ್ಟು ತೊಂದರೆ ಕೊಡಬೇಡಿ. ವೆಬ್ ಬ್ರೌಸರ್ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ನಿರ್ಣಯಿಸಲು ಗ್ರಾಫಿಕ್ಸ್ ಅನ್ನು ಚಿತ್ರಿಸುವುದು ...",ko:"방해하지 마십시오. 웹 브라우저 성능을 평가하기 위한 그래픽 그리기...",lt:"Prašome netrukdyti. Grafikos piešimas žiniatinklio naršyklės našumui įvertinti...",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ദയവായി ശല്യപ്പെടുത്തരുത്. വെബ് ബ്രൗസർ പ്രകടനം വിലയിരുത്താൻ ഗ്രാഫിക്സ് വരയ്ക്കുന്നു ...",no:"Vennligst ikke forstyrr. Tegner grafikk for å vurdere nettleserens ytelse ...",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Proszę nie przeszkadzać. Rysowanie grafiki w celu oceny wydajności przeglądarki internetowej...",pt:"Por favor, não perturbe. Desenhar gráficos para avaliar o desempenho do navegador da web...",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Por favor, no molestar. Dibujando gráficos para evaluar el rendimiento del navegador web ...",sw:"Tafadhali usisumbue. Kuchora michoro ili kutathmini utendakazi wa kivinjari cha wavuti ...",sv:"Vänligen stör inte. Rita grafik för att bedöma webbläsarens prestanda ...",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Lütfen rahatsız etmeyin. Web tarayıcısının performansını değerlendirmek için grafik çizmek...",ur:"پلیز ڈسٹرب نہ کریں۔ ویب براؤزر کی کارکردگی کا جائزہ لینے کے لیے گرافکس ڈرائنگ..."},RC_performanceTitle:{"en-US":"Graphics Performance",ar:"أداء الرسوميات",hy:"Գրաֆիկական կատարում",bg:"Графична производителност","zh-CN":"图形性能","zh-HK":"圖形效能",hr:"Grafička izvedba",cs:"Grafický výkon",da:"Grafisk ydeevne",nl:"Grafische prestaties","en-UK":"Graphics Performance",fi:"Grafiikka suorituskyky",fr:"Performances graphiques",de:"Grafikleistung",el:"Απόδοση γραφικών",he:"ביצועים גרפיים",hi:"ग्राफ़िक्स प्रदर्शन",hu:"Grafikai teljesítmény",is:"Grafísk árangur",id:"Performa Grafis",it:"Prestazioni grafiche",ja:"グラフィックス性能",kn:"ಗ್ರಾಫಿಕ್ಸ್ ಕಾರ್ಯಕ್ಷಮತೆ",ko:"그래픽 성능",lt:"Grafikos našumas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഗ്രാഫിക്സ് പ്രകടനം",no:"Grafisk ytelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Wydajność grafiki",pt:"Desempenho gráfico",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Rendimiento de gráficos",sw:"Utendaji wa Graphics",sv:"Grafikprestanda",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Grafik Performansı",ur:"گرافکس کی کارکردگی"},RC_privacyCamera:{"en-US":"ASSURANCE OF CAMERA PRIVACY. No photos or video are recorded. Each webcam frame is used only inside this computer, solely to estimate eye and gaze positions, and then erased, within 10 seconds. Only the eye and gaze positions are retained.",ar:"ضمان خصوصية الكاميرا. لا يتم تسجيل أي صور أو فيديو. يتم استخدام كل إطار من كاميرا الويب فقط داخل هذا الكمبيوتر، فقط لتقدير مواضع العين والنظرة، ثم يتم محوه خلال 10 ثوانٍ. يتم الاحتفاظ فقط بمواضع العين والنظرة.",hy:"Տեսախցիկի ԳԱՂՏՆԻՈՒԹՅԱՆ ԱՊԱՀՈՎՈՒՄ. Ոչ մի լուսանկար կամ տեսանյութ չի ձայնագրվում: Տեսախցիկի յուրաքանչյուր շրջանակ օգտագործվում է միայն այս համակարգչի ներսում՝ բացառապես աչքերի և հայացքի դիրքերը գնահատելու համար, այնուհետև ջնջվում է 10 վայրկյանի ընթացքում: Պահպանվում են միայն աչքի և հայացքի դիրքերը:",bg:"ГАРАНЦИЯ ЗА ПОВЕРИТЕЛНОСТ НА КАМЕРАТА. Не се записват снимки или видео. Всеки кадър на уеб камера се използва само в този компютър, единствено за оценка на позициите на очите и погледа, след което се изтрива в рамките на 10 секунди. Запазват се само позициите на очите и погледа.","zh-CN":"相机隐私的保证。没有记录照片或视频。每个网络摄像头帧仅在计算机内部使用,仅用于估计眼睛和注视位置,然后在 10 秒内删除。仅保留眼睛和凝视位置。","zh-HK":"相機隱私的保證。沒有記錄照片或影片。每個網路攝影機幀僅在電腦內部使用,僅用於估計眼睛和注視位置,然後在 10 秒內刪除。僅保留眼睛和凝視位置。",hr:"JAMSTVO PRIVATNOSTI KAMERE. Ne snimaju se fotografije ili videozapisi. Svaki okvir web kamere koristi se samo unutar ovog računala, isključivo za procjenu položaja očiju i pogleda, a zatim se briše unutar 10 sekundi. Zadržavaju se samo položaji očiju i pogleda.",cs:"ZAJIŠTĚNÍ SOUKROMÍ KAMERY. Nejsou zaznamenány žádné fotografie ani video. Každý snímek webové kamery se používá pouze uvnitř tohoto počítače, pouze k odhadu polohy očí a pohledu, a poté se během 10 sekund vymaže. Zachovány jsou pouze pozice očí a pohledu.",da:"SIKKERHED OM KAMERAENS FORTROLIGHED. Der optages ingen billeder eller video. Hver webcam-ramme bruges kun inde i denne computer, udelukkende til at vurdere øjen- og blikpositioner og slettes derefter inden for 10 sekunder. Kun øjen- og blikpositionerne bevares.",nl:"WAARBORGEN VAN CAMERA PRIVACY. Er worden geen foto's of video's opgenomen. Elk webcamframe wordt alleen in deze computer gebruikt, uitsluitend om de oog- en blikposities te schatten, en vervolgens binnen 10 seconden gewist. Alleen de oog- en blikposities blijven behouden.","en-UK":"ASSURANCE OF CAMERA PRIVACY. No photos or video are recorded. Each webcam frame is used only inside this computer, solely to estimate eye and gaze positions, and then erased, within 10 seconds. Only the eye and gaze positions are retained.",fi:"KAMERAN YKSITYISYYDEN TAKEMINEN. Valokuvia tai videoita ei tallenneta. Jokaista verkkokameran kehystä käytetään vain tämän tietokoneen sisällä, vain silmän ja katseen sijainnin arvioimiseen, ja se poistetaan sitten 10 sekunnin kuluessa. Vain silmän ja katseen asennot säilyvät.",fr:"ASSURANCE DE CONFIDENTIALITÉ DE LA CAMÉRA. Aucune photo ni vidéo n'est enregistrée. Chaque image de la webcam est utilisée uniquement à l'intérieur de cet ordinateur, uniquement pour estimer les positions des yeux et du regard, puis effacée, dans les 10 secondes. Seules les positions des yeux et du regard sont conservées.",de:"GEWÄHRLEISTUNG DER DATENSCHUTZ DER KAMERA. Es werden keine Fotos oder Videos aufgezeichnet. Jeder Webcam-Frame wird nur innerhalb dieses Computers verwendet, ausschließlich zur Schätzung der Augen- und Blickpositionen, und dann innerhalb von 10 Sekunden gelöscht. Lediglich die Augen- und Blickpositionen bleiben erhalten.",el:"ΔΙΑΣΦΑΛΙΣΗ ΑΠΟΡΡΗΤΟΥ ΤΗΣ ΚΑΜΕΡΑΣ. Δεν εγγράφονται φωτογραφίες ή βίντεο. Κάθε πλαίσιο κάμερας web χρησιμοποιείται μόνο μέσα σε αυτόν τον υπολογιστή, αποκλειστικά για την εκτίμηση της θέσης των ματιών και του βλέμματος, και στη συνέχεια διαγράφεται εντός 10 δευτερολέπτων. Διατηρούνται μόνο οι θέσεις των ματιών και του βλέμματος.",he:"הבטחה לפרטיות המצלמה. לא מוקלטים תמונות או וידאו. כל מסגרת של מצלמת אינטרנט משמשת רק בתוך מחשב זה, אך ורק כדי להעריך את עמדות העין והמבט, ולאחר מכן נמחקה, תוך 10 שניות. רק עמדות העין והמבט נשמרות.",hi:"कैमरे की गोपनीयता का आश्वासन. कोई फ़ोटो या वीडियो रिकॉर्ड नहीं किया जाता. प्रत्येक वेबकैम फ्रेम का उपयोग केवल इस कंप्यूटर के अंदर किया जाता है, केवल आंख और टकटकी की स्थिति का अनुमान लगाने के लिए, और फिर 10 सेकंड के भीतर मिटा दिया जाता है। केवल आंख और टकटकी की स्थिति को बरकरार रखा गया है।",hu:"A KAMERA ADATVÉDELME BIZTOSÍTÁSA. Nem rögzítenek fényképeket vagy videót. Minden webkamera keret csak a számítógépen belül használható, kizárólag a szem és a tekintet helyzetének becslésére, majd 10 másodpercen belül törlésre kerül. Csak a szem és a tekintet helyzete marad meg.",is:"FYRIR FRÆÐI MYNDAVÉR. Engar myndir eða myndskeið eru tekin upp. Hver vefmyndavélarrammi er aðeins notaður inni í þessari tölvu, eingöngu til að áætla augn- og augnastöður, og síðan eytt innan 10 sekúndna. Aðeins augn- og augnstöður haldast.",id:"JAMINAN PRIVASI KAMERA. Tidak ada foto atau video yang direkam. Setiap frame webcam hanya digunakan di dalam komputer ini, semata-mata untuk memperkirakan posisi mata dan pandangan, lalu dihapus, dalam waktu 10 detik. Hanya posisi mata dan pandangan yang dipertahankan.",it:"ASSICURAZIONE DELLA PRIVACY DELLA FOTOCAMERA. Nessuna foto o video viene registrato. Ogni fotogramma della webcam viene utilizzato solo all'interno di questo computer, esclusivamente per stimare le posizioni degli occhi e dello sguardo, e poi cancellato, entro 10 secondi. Solo le posizioni degli occhi e dello sguardo vengono conservate.",ja:"カメラのプライバシーの確保。写真やビデオは記録されません。各 Web カメラ フレームはこのコンピューター内でのみ目と視線の位置を推定するためにのみ使用され、その後 10 秒以内に消去されます。目と視線の位置のみが保持されます。",kn:"ಕ್ಯಾಮರಾ ಗೌಪ್ಯತೆಯ ಭರವಸೆ. ಯಾವುದೇ ಫೋಟೋಗಳು ಅಥವಾ ವೀಡಿಯೊಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗಿಲ್ಲ. ಪ್ರತಿಯೊಂದು ವೆಬ್‌ಕ್ಯಾಮ್ ಫ್ರೇಮ್ ಅನ್ನು ಈ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಮಾತ್ರ ಬಳಸಲಾಗುತ್ತದೆ, ಕೇವಲ ಕಣ್ಣು ಮತ್ತು ನೋಟದ ಸ್ಥಾನಗಳನ್ನು ಅಂದಾಜು ಮಾಡಲು ಮತ್ತು ನಂತರ 10 ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಅಳಿಸಲಾಗುತ್ತದೆ. ಕಣ್ಣು ಮತ್ತು ನೋಟದ ಸ್ಥಾನಗಳನ್ನು ಮಾತ್ರ ಉಳಿಸಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.",ko:"카메라 개인정보 보호 보장. 사진이나 동영상은 녹화되지 않습니다. 각 웹캠 프레임은 이 컴퓨터 내부에서만 눈과 시선 위치를 추정하는 데만 사용되며 10초 이내에 삭제됩니다. 눈과 응시 위치만 유지됩니다.",lt:"KAMEROS PRIVATUMO UŽTIKRINIMAS. Neįrašoma jokių nuotraukų ar vaizdo įrašų. Kiekvienas internetinės kameros rėmelis naudojamas tik šiame kompiuteryje, tik akių ir žvilgsnio padėčiai įvertinti, o tada per 10 sekundžių ištrinamas. Išlaikoma tik akių ir žvilgsnio padėtis.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ക്യാമറ സ്വകാര്യതയുടെ ഉറപ്പ്. ഫോട്ടോകളോ വീഡിയോകളോ രേഖപ്പെടുത്തിയിട്ടില്ല. ഓരോ വെബ്‌ക്യാം ഫ്രെയിമും ഈ കമ്പ്യൂട്ടറിനുള്ളിൽ മാത്രമേ ഉപയോഗിക്കുന്നുള്ളൂ, കണ്ണിൻ്റെയും നോട്ടത്തിൻ്റെയും സ്ഥാനങ്ങൾ കണക്കാക്കാൻ മാത്രം, തുടർന്ന് 10 സെക്കൻഡിനുള്ളിൽ മായ്‌ച്ചുകളയുന്നു. കണ്ണിൻ്റെയും നോട്ടത്തിൻ്റെയും സ്ഥാനങ്ങൾ മാത്രം നിലനിർത്തിയിരിക്കുന്നു.",no:"SIKRING OM KAMERAPERSONVERN. Ingen bilder eller video er tatt opp. Hver webkameraramme brukes kun inne i denne datamaskinen, utelukkende for å beregne øye- og blikkposisjoner, og slettes deretter innen 10 sekunder. Kun øye- og blikkposisjonene beholdes.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"ZAPEWNIENIE PRYWATNOŚCI KAMERY. Nie są rejestrowane żadne zdjęcia ani filmy. Każda klatka kamery internetowej jest używana wyłącznie wewnątrz tego komputera, wyłącznie w celu oszacowania pozycji oczu i wzroku, a następnie usuwana w ciągu 10 sekund. Zachowywane są tylko pozycje oczu i wzroku.",pt:"GARANTIA DE PRIVACIDADE DA CÂMERA. Nenhuma foto ou vídeo é gravado. Cada quadro da webcam é usado apenas dentro deste computador, apenas para estimar as posições dos olhos e do olhar, e depois apagado em 10 segundos. Apenas as posições dos olhos e do olhar são mantidas.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"GARANTÍA DE PRIVACIDAD DE LA CÁMARA. No se graban fotos ni videos. Cada fotograma de la cámara web se utiliza solo dentro de esta computadora, únicamente para estimar las posiciones de los ojos y la mirada, y luego se borra, dentro de 10 segundos. Solo se retienen las posiciones de los ojos y la mirada.",sw:"UHAKIKISHO WA FARAGHA YA KAMERA. Hakuna picha au video iliyorekodiwa. Kila fremu ya kamera ya wavuti inatumika ndani ya kompyuta hii pekee, ili kukadiria nafasi za macho na kutazama, na kufutwa, ndani ya sekunde 10. Nafasi za macho na macho pekee ndizo zinazobaki.",sv:"FÖRSÄKRING AV KAMERANS INTEGRITET. Inga foton eller video spelas in. Varje webbkameraram används endast inuti den här datorn, enbart för att uppskatta ögon- och blickpositioner, och raderas sedan inom 10 sekunder. Endast ögon- och blickpositionerna behålls.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"KAMERA GİZLİLİĞİ GÜVENCESİ. Hiçbir fotoğraf veya video kaydedilmez. Her web kamerası çerçevesi yalnızca bu bilgisayarın içinde, yalnızca göz ve bakış konumlarını tahmin etmek için kullanılır ve ardından 10 saniye içinde silinir. Yalnızca göz ve bakış pozisyonları korunur.",ur:"کیمرے کی رازداری کی یقین دہانی۔ کوئی تصویر یا ویڈیو ریکارڈ نہیں ہے۔ ہر ویب کیم کا فریم صرف اس کمپیوٹر کے اندر استعمال ہوتا ہے، صرف آنکھوں اور نگاہوں کی پوزیشنوں کا اندازہ لگانے کے لیے، اور پھر 10 سیکنڈ کے اندر مٹا دیا جاتا ہے۔ صرف آنکھ اور نگاہ کی پوزیشنیں برقرار ہیں۔"},RC_requestCamera:{"en-US":"To proceed, this study needs your permission to use the camera. ",ar:"للمتابعة، تحتاج هذه الدراسة إلى إذنك لاستخدام الكاميرا.",hy:"Շարունակելու համար այս ուսումնասիրությունը տեսախցիկը օգտագործելու համար ձեր թույլտվության կարիքն ունի: ",bg:"За да продължите, това проучване се нуждае от вашето разрешение за използване на камерата. ","zh-CN":"为了继续进行,本研究需要您的许可才能使用相机。 ","zh-HK":"為了繼續進行,本研究需要您的許可才能使用相機。 ",hr:"Za nastavak ovoj studiji potrebno je vaše dopuštenje za upotrebu kamere. ",cs:"Chcete-li pokračovat, tato studie potřebuje vaše povolení k použití fotoaparátu. ",da:"For at fortsætte skal denne undersøgelse have din tilladelse til at bruge kameraet. ",nl:"Om verder te kunnen gaan, heeft dit onderzoek uw toestemming nodig om de camera te gebruiken. ","en-UK":"To proceed, this study needs your permission to use the camera.",fi:"Tämä tutkimus tarvitsee luvan kameran käyttöön jatkaakseen. ",fr:"Pour continuer, cette étude a besoin de votre autorisation pour utiliser la caméra.",de:"Um fortzufahren, benötigt diese Studie Ihre Erlaubnis zur Verwendung der Kamera. ",el:"Για να συνεχίσει, αυτή η μελέτη χρειάζεται την άδειά σας για να χρησιμοποιήσει την κάμερα. ",he:"כדי להמשיך, מחקר זה זקוק לאישורך להשתמש במצלמה. ",hi:"आगे बढ़ने के लिए, इस अध्ययन को कैमरे का उपयोग करने के लिए आपकी अनुमति की आवश्यकता है। ",hu:"A folytatáshoz ehhez a tanulmányhoz az Ön engedélyére van szüksége a kamera használatához. ",is:"Til að halda áfram þarf þessi rannsókn leyfis þíns til að nota myndavélina. ",id:"Untuk melanjutkan, penelitian ini memerlukan izin Anda untuk menggunakan kamera. ",it:"Per procedere, questo studio necessita del tuo permesso per utilizzare la fotocamera.",ja:"この研究を続行するには、カメラの使用許可が必要です。 ",kn:"ಮುಂದುವರೆಯಲು, ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಈ ಅಧ್ಯಯನಕ್ಕೆ ನಿಮ್ಮ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ. ",ko:"이 연구를 진행하려면 카메라 사용에 대한 귀하의 허가가 필요합니다. ",lt:"Norint tęsti, šiam tyrimui reikalingas jūsų leidimas naudoti fotoaparatą. ",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"തുടരാൻ, ഈ പഠനത്തിന് ക്യാമറ ഉപയോഗിക്കാൻ നിങ്ങളുടെ അനുമതി ആവശ്യമാണ്. ",no:"For å fortsette trenger denne studien din tillatelse til å bruke kameraet. ",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Aby kontynuować badanie, potrzebujemy Twojej zgody na użycie aparatu. ",pt:"Para prosseguir, este estudo precisa da sua permissão para usar a câmera. ",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Para continuar, este estudio necesita su permiso para usar la cámara.",sw:"Ili kuendelea, utafiti huu unahitaji ruhusa yako ya kutumia kamera. ",sv:"För att fortsätta behöver den här studien din tillåtelse att använda kameran. ",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Devam etmek için bu çalışmanın kamerayı kullanma izninize ihtiyacı var. ",ur:"آگے بڑھنے کے لیے، اس مطالعہ کو کیمرہ استعمال کرنے کے لیے آپ کی اجازت درکار ہے۔ "},RC_screenSize:{"en-US":"Screen Size",ar:"حجم الشاشة",hy:"Էկրանի չափը",bg:"Размер на екрана","zh-CN":"屏幕尺寸","zh-HK":"螢幕尺寸",hr:"Veličina zaslona",cs:"Velikost obrazovky",da:"Skærmstørrelse",nl:"Schermgrootte","en-UK":"Screen Size",fi:"Näytön koko",fr:"Taille de l'écran",de:"Bildschirmgröße",el:"Μέγεθος οθόνης",he:"גודל מסך",hi:"स्क्रीन का साईज़",hu:"Képernyőméret",is:"Skjástærð",id:"Ukuran Layar",it:"Dimensione dello schermo",ja:"画面サイズ",kn:"ಪರದೆಯ ಗಾತ್ರ",ko:"화면 크기",lt:"Ekrano dydis",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"സ്ക്രീൻ വലിപ്പം",no:"Skjermstørrelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Rozmiar ekranu",pt:"Tamanho da tela",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Tamaño de pantalla",sw:"Ukubwa wa skrini",sv:"Skärmstorlek",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Ekran Boyutu",ur:"اسکرین کا سائز"},RC_screenSizeCredit:{"en-US":'Credit card suggested by the Li et al. (2020) "Virtual Chinrest" paper.',ar:'اقترح بطاقة الائتمان من قبل لي وآخرون (2020) في ورقة "الدعامة الذقنية الافتراضية".',hy:"Վարկային քարտը առաջարկվել է Li et al. (2020) «Վիրտուալ Չինրեստ» թուղթ.",bg:"Кредитна карта, предложена от Li et al. (2020) Хартия „Виртуална опора за брадичката“.","zh-CN":"李等人建议的信用卡。 (2020)“虚拟下颌托”论文。","zh-HK":"李等人建議的信用卡。 (2020)「虛擬下顎托」論文。",hr:'Kreditna kartica koju su predložili Li et al. (2020.) Rad "Virtualni naslon za bradu".',cs:"Kreditní karta navržená Li et al. (2020) Papír „Virtual Chinrest“.",da:'Kreditkort foreslået af Li et al. (2020) "Virtual Chinrest" papir.',nl:'Creditcard voorgesteld door Li et al. (2020) Papier "Virtuele kinsteun".',"en-UK":'Credit card suggested by the Li et al. (2020) "Virtual Chinrest" paper.',fi:'Li et al. ehdottama luottokortti. (2020) "Virtual Chinrest" -paperi.',fr:'Carte de crédit suggérée par l\'article "Virtual Chinrest" de Li et al. (2020).',de:"Von Li et al. vorgeschlagene Kreditkarte. (2020) Artikel „Virtual Chinrest“.",el:'Πιστωτική κάρτα που προτείνεται από τους Li et al. (2020) Χαρτί "Virtual Chinrest".',he:'כרטיס אשראי שהוצע על ידי Li et al. (2020) נייר "משענת סנטר וירטואלית".',hi:'ली एट अल द्वारा सुझाया गया क्रेडिट कार्ड। (2020) "वर्चुअल चिनरेस्ट" पेपर।',hu:"Li et al. által javasolt hitelkártya. (2020) „Virtuális álltámasz” papír.",is:"Kreditkort sem Li o.fl. (2020) „Virtual Chinrest“ blað.",id:'Kartu kredit disarankan oleh Li dkk. (2020) Makalah "Sandaran Dagu Virtual".',it:'Carta di credito suggerita dall\'articolo "Virtual Chinrest" di Li et al. (2020).',ja:"Liらによって提案されたクレジットカード。 (2020) 「仮想顎当て」論文。",kn:'ಲಿ ಮತ್ತು ಇತರರು ಸೂಚಿಸಿದ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್. (2020) "ವರ್ಚುವಲ್ ಚಿನ್‌ರೆಸ್ಟ್" ಪೇಪರ್.',ko:'Li 등이 제안한 신용 카드. (2020) "가상 턱받침" 논문.',lt:"Kreditinė kortelė, kurią pasiūlė Li ir kt. (2020) „Virtual Chinrest“ popierius.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:'Li et al നിർദ്ദേശിച്ച ക്രെഡിറ്റ് കാർഡ്. (2020) "വെർച്വൽ ചിൻറെസ്റ്റ്" പേപ്പർ.',no:'Kredittkort foreslått av Li et al. (2020) "Virtual Chinrest" papir.',fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Karta kredytowa zaproponowana przez Li i in. (2020) Artykuł „Wirtualny podbródek”.",pt:'Cartão de crédito sugerido por Li et al. (2020) Artigo "Virtual Chinrest".',ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:'Tarjeta de crédito sugerida por el artículo "Virtual Chinrest" de Li et al. (2020).',sw:'Kadi ya mkopo iliyopendekezwa na Li et al. (2020) karatasi ya "Virtual Chinrest".',sv:'Kreditkort som föreslagits av Li et al. (2020) "Virtual Chinrest" papper.',tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:'Li ve diğerleri tarafından önerilen kredi kartı. (2020) "Sanal Çenelik" makalesi.',ur:'لی ایٹ ال کے ذریعہ تجویز کردہ کریڈٹ کارڈ۔ (2020) "ورچوئل چنریسٹ" پیپر۔'},RC_screenSizeCreditCard:{"en-US":"a credit card",ar:"بطاقة ائتمان",hy:"վարկային քարտ",bg:"кредитна карта","zh-CN":"一张信用卡","zh-HK":"一張信用卡",hr:"kreditna kartica",cs:"kreditní kartou",da:"et kreditkort",nl:"een creditcard","en-UK":"a credit card",fi:"luottokortti",fr:"une carte de crédit",de:"eine Kreditkarte",el:"μια πιστωτική κάρτα",he:"כרטיס אשראי",hi:"एक क्रेडिट कार्ड",hu:"egy hitelkártya",is:"kreditkort",id:"kartu kredit",it:"una carta di credito",ja:"クレジットカード",kn:"ಒಂದು ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್",ko:"신용카드",lt:"kreditine kortele",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഒരു ക്രെഡിറ്റ് കാർഡ്",no:"et kredittkort",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"kartę kredytową",pt:"um cartão de crédito",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"una tarjeta de crédito",sw:"kadi ya mkopo",sv:"ett kreditkort",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"kredi kartı",ur:"ایک کریڈٹ کارڈ"},RC_screenSizeHave:{"en-US":"I have xxx with me.",ar:"لدي xxx معي.",hy:"Ես ունեմ xxx ինձ հետ:",bg:"Имам xxx с мен.","zh-CN":"我身边有xxx。","zh-HK":"我身邊有xxx。",hr:"Imam xxx sa sobom.",cs:"Mám s sebou xxx.",da:"Jeg har xxx med mig.",nl:"Ik heb xxx bij me.","en-UK":"I have xxx with me.",fi:"Minulla on xxx mukanani.",fr:"J'ai xxx avec moi.",de:"Ich habe xxx bei mir.",el:"Έχω xxx μαζί μου.",he:"יש לי xxx איתי.",hi:"मेरे साथ xxx है.",hu:"xxx van velem.",is:"Ég er með xxx með mér.",id:"Aku punya xxx bersamaku.",it:"Ho xxx con me.",ja:"私はxxxを持っています。",kn:"ನನ್ನ ಬಳಿ xxx ಇದೆ.",ko:"나에겐 xxx가 있다.",lt:"Aš turiu xxx su savimi.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"എൻ്റെ കൂടെ xxx ഉണ്ട്.",no:"Jeg har xxx med meg.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Mam przy sobie xxx.",pt:"Eu tenho xxx comigo.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Tengo xxx conmigo.",sw:"Nina xxx nami.",sv:"Jag har xxx med mig.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Yanımda xxx var.",ur:"میرے ساتھ xxx ہے۔"},RC_screenSizeIntro:{"en-US":"We will measure the size of this screen. Use the pull-down menu to choose something handy. You can use any common USB connector (including the one providing power to your computer) or a credit card (or any card of the same size). Place your object on the screen and move the slider to adjust the image to match your object's size. When they match, press RETURN (or click OK) to proceed.",ar:"سنقوم بقياس حجم هذه الشاشة. استخدم القائمة المنسدلة لاختيار شيء مناسب. يمكنك استخدام أي موصل USB شائع (بما في ذلك الموصل الذي يوفر الطاقة لجهاز الكمبيوتر الخاص بك) أو بطاقة ائتمان (أو أي بطاقة بنفس الحجم). ضع الشيء الخاص بك على الشاشة وحرك شريط التمرير لضبط الصورة لتتناسب مع حجم الشيء الخاص بك. عندما يتطابقان، اضغط على RETURN (أو انقر فوق OK) للمتابعة.",hy:"Մենք չափելու ենք այս էկրանի չափը։ Օգտագործեք բացվող ընտրացանկը՝ հարմար բան ընտրելու համար: Դուք կարող եք օգտագործել ցանկացած սովորական USB միակցիչ (ներառյալ այն մեկը, որն ապահովում է ձեր համակարգիչը) կամ վարկային քարտ (կամ նույն չափի ցանկացած քարտ): Տեղադրեք ձեր առարկան էկրանին և շարժեք սահիչը՝ պատկերը հարմարեցնելու ձեր օբյեկտի չափին: Երբ դրանք համընկնեն, սեղմեք RETURN (կամ սեղմեք OK)՝ շարունակելու համար:",bg:"Ще измерим размера на този екран. Използвайте падащото меню, за да изберете нещо удобно. Можете да използвате всеки общ USB конектор (включително този, който осигурява захранване на вашия компютър) или кредитна карта (или всяка карта със същия размер). Поставете вашия обект на екрана и преместете плъзгача, за да настроите изображението, за да съответства на размера на вашия обект. Когато съвпадат, натиснете RETURN (или щракнете върху OK), за да продължите.","zh-CN":"我们将测量该屏幕的尺寸。使用下拉菜单选择方便的内容。您可以使用任何常见的 USB 连接器(包括为计算机供电的连接器)或信用卡(或任何相同尺寸的卡)。将对象放在屏幕上并移动滑块以调整图像以匹配对象的大小。当它们匹配时,按 RETURN(或单击“确定”)继续。","zh-HK":"我們將測量該螢幕的尺寸。使用下拉式選單選擇方便的內容。您可以使用任何常見的 USB 連接器(包括為電腦供電的連接器)或信用卡(或任何相同尺寸的卡片)。將物件放在螢幕上並移動滑桿以調整影像以符合物件的大小。當它們匹配時,請按 RETURN(或按一下「確定」)繼續。",hr:"Izmjerit ćemo veličinu ovog zaslona. Pomoću padajućeg izbornika odaberite nešto što vam je zgodno. Možete koristiti bilo koji uobičajeni USB priključak (uključujući onaj koji napaja vaše računalo) ili kreditnu karticu (ili bilo koju karticu iste veličine). Postavite svoj objekt na zaslon i pomaknite klizač kako biste prilagodili sliku veličini vašeg objekta. Kada se podudaraju, pritisnite RETURN (ili kliknite OK) za nastavak.",cs:"Změříme velikost této obrazovky. Použijte rozbalovací nabídku a vyberte si něco užitečného. Můžete použít jakýkoli běžný konektor USB (včetně toho, který napájí váš počítač) nebo kreditní kartu (nebo jakoukoli kartu stejné velikosti). Umístěte objekt na obrazovku a posunutím posuvníku upravte obrázek tak, aby odpovídal velikosti vašeho objektu. Když se shodují, pokračujte stisknutím RETURN (nebo kliknutím na OK).",da:"Vi vil måle størrelsen på denne skærm. Brug rullemenuen til at vælge noget praktisk. Du kan bruge et hvilket som helst almindeligt USB-stik (inklusive det, der giver strøm til din computer) eller et kreditkort (eller et hvilket som helst kort af samme størrelse). Placer dit objekt på skærmen, og flyt skyderen for at justere billedet, så det passer til dit objekts størrelse. Når de matcher, skal du trykke på RETURN (eller klikke på OK) for at fortsætte.",nl:"Wij meten de grootte van dit scherm. Gebruik het vervolgkeuzemenu om iets handigs te kiezen. U kunt elke gewone USB-connector gebruiken (inclusief de connector die uw computer van stroom voorziet) of een creditcard (of een kaart van hetzelfde formaat). Plaats uw object op het scherm en verplaats de schuifregelaar om de afbeelding aan te passen aan de grootte van uw object. Als ze overeenkomen, drukt u op RETURN (of klikt u op OK) om door te gaan.","en-UK":"We will measure the size of this screen. Use the drop-down menu to choose something handy. You can use any common USB connector (including the one providing power to your computer) or a credit card (or any card of the same size). Place your object on the screen and move the slider to adjust the image to match your object's size. When they match, press RETURN (or click OK) to proceed.",fi:"Mittaamme tämän näytön koon. Käytä avattavaa valikkoa valitaksesi jotain kätevää. Voit käyttää mitä tahansa yleistä USB-liitintä (mukaan lukien se, joka antaa virtaa tietokoneellesi) tai luottokorttia (tai mitä tahansa samankokoista korttia). Aseta objekti näytölle ja säädä kuva vastaamaan objektisi kokoa liikuttamalla liukusäädintä. Kun ne täsmäävät, paina RETURN (tai napsauta OK) jatkaaksesi.",fr:"Nous allons mesurer la taille de cet écran. Utilisez le menu déroulant pour choisir quelque chose de pratique. Vous pouvez utiliser n'importe quel connecteur USB courant (y compris celui qui alimente votre ordinateur) ou une carte de crédit (ou toute carte de la même taille). Placez votre objet sur l'écran et déplacez le curseur pour ajuster l'image à la taille de votre objet. Lorsqu'ils correspondent, appuyez sur RETOUR (ou cliquez sur OK) pour continuer.",de:"Wir werden die Größe dieses Bildschirms messen. Verwenden Sie das Pulldown-Menü, um etwas Praktisches auszuwählen. Sie können jeden gängigen USB-Anschluss (einschließlich desjenigen, der Ihren Computer mit Strom versorgt) oder eine Kreditkarte (oder eine beliebige Karte derselben Größe) verwenden. Platzieren Sie Ihr Objekt auf dem Bildschirm und bewegen Sie den Schieberegler, um das Bild an die Größe Ihres Objekts anzupassen. Wenn sie übereinstimmen, drücken Sie die Eingabetaste (oder klicken Sie auf „OK“), um fortzufahren.",el:"Θα μετρήσουμε το μέγεθος αυτής της οθόνης. Χρησιμοποιήστε το αναπτυσσόμενο μενού για να επιλέξετε κάτι εύχρηστο. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε κοινή υποδοχή USB (συμπεριλαμβανομένης αυτής που παρέχει ρεύμα στον υπολογιστή σας) ή μια πιστωτική κάρτα (ή οποιαδήποτε κάρτα ίδιου μεγέθους). Τοποθετήστε το αντικείμενό σας στην οθόνη και μετακινήστε το ρυθμιστικό για να προσαρμόσετε την εικόνα ώστε να ταιριάζει με το μέγεθος του αντικειμένου σας. Όταν ταιριάζουν, πατήστε RETURN (ή κάντε κλικ στο OK) για να συνεχίσετε.",he:"אנו נמדוד את גודל המסך הזה. השתמש בתפריט הנפתח כדי לבחור משהו שימושי. אתה יכול להשתמש בכל מחבר USB נפוץ (כולל זה שמספק חשמל למחשב שלך) או בכרטיס אשראי (או כל כרטיס באותו גודל). הנח את האובייקט שלך על המסך והזז את המחוון כדי להתאים את התמונה כך שתתאים לגודל האובייקט שלך. כאשר הם תואמים, לחץ על RETURN (או לחץ על אישור) כדי להמשיך.",hi:"हम इस स्क्रीन का आकार मापेंगे. कोई उपयोगी चीज़ चुनने के लिए पुल-डाउन मेनू का उपयोग करें। आप किसी भी सामान्य यूएसबी कनेक्टर (आपके कंप्यूटर को पावर प्रदान करने वाले कनेक्टर सहित) या क्रेडिट कार्ड (या समान आकार के किसी भी कार्ड) का उपयोग कर सकते हैं। अपने ऑब्जेक्ट को स्क्रीन पर रखें और छवि को अपने ऑब्जेक्ट के आकार से मेल खाने के लिए समायोजित करने के लिए स्लाइडर को घुमाएँ। जब वे मेल खाते हैं, तो आगे बढ़ने के लिए रिटर्न दबाएँ (या ओके पर क्लिक करें)।",hu:"Megmérjük ennek a képernyőnek a méretét. A legördülő menü segítségével válasszon valami praktikusat. Használhat bármilyen általános USB-csatlakozót (beleértve azt is, amelyik a számítógép áramellátását biztosítja), vagy hitelkártyát (vagy bármilyen azonos méretű kártyát). Helyezze az objektumot a képernyőre, és mozgassa a csúszkát, hogy a képet az objektum méretéhez igazítsa. Ha megegyeznek, nyomja meg a RETURN gombot (vagy kattintson az OK gombra) a folytatáshoz.",is:"Við munum mæla stærð þessa skjás. Notaðu fellivalmyndina til að velja eitthvað hentugt. Þú getur notað hvaða algenga USB tengi sem er (þar á meðal það sem veitir tölvuna þína rafmagn) eða kreditkort (eða hvaða kort sem er af sömu stærð). Settu hlutinn þinn á skjáinn og færðu sleðann til að stilla myndina þannig að hún passi við stærð hlutarins. Þegar þeir passa saman, ýttu á RETURN (eða smelltu á OK) til að halda áfram.",id:"Kami akan mengukur ukuran layar ini. Gunakan menu tarik-turun untuk memilih sesuatu yang berguna. Anda dapat menggunakan konektor USB umum apa pun (termasuk konektor yang menyediakan daya ke komputer Anda) atau kartu kredit (atau kartu apa pun dengan ukuran yang sama). Tempatkan objek Anda di layar dan gerakkan penggeser untuk menyesuaikan gambar agar sesuai dengan ukuran objek Anda. Jika cocok, tekan RETURN (atau klik OK) untuk melanjutkan.",it:"Misureremo la dimensione di questo schermo. Usa il menu a tendina per scegliere qualcosa di comodo. Puoi usare qualsiasi connettore USB comune (incluso quello che fornisce alimentazione al tuo computer) o una carta di credito (o qualsiasi carta della stessa dimensione). Posiziona il tuo oggetto sullo schermo e sposta il cursore per regolare l'immagine in modo che corrisponda alla dimensione del tuo oggetto. Quando corrispondono, premi INVIO (o fai clic su OK) per procedere.",ja:"この画面のサイズを測ってみます。プルダウン メニューを使用して便利なものを選択します。一般的な USB コネクタ (コンピュータに電力を供給するコネクタを含む) またはクレジット カード (または同じサイズのカード) を使用できます。オブジェクトを画面上に配置し、スライダーを移動してオブジェクトのサイズに合わせて画像を調整します。一致したら、Return キーを押して (または [OK] をクリックして) 続行します。",kn:"ನಾವು ಈ ಪರದೆಯ ಗಾತ್ರವನ್ನು ಅಳೆಯುತ್ತೇವೆ. ಸೂಕ್ತವಾದ ಯಾವುದನ್ನಾದರೂ ಆಯ್ಕೆ ಮಾಡಲು ಪುಲ್-ಡೌನ್ ಮೆನು ಬಳಸಿ. ನೀವು ಯಾವುದೇ ಸಾಮಾನ್ಯ USB ಕನೆಕ್ಟರ್ (ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಪವರ್ ಒದಗಿಸುವುದು ಸೇರಿದಂತೆ) ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ (ಅಥವಾ ಅದೇ ಗಾತ್ರದ ಯಾವುದೇ ಕಾರ್ಡ್) ಅನ್ನು ಬಳಸಬಹುದು. ನಿಮ್ಮ ವಸ್ತುವನ್ನು ಪರದೆಯ ಮೇಲೆ ಇರಿಸಿ ಮತ್ತು ನಿಮ್ಮ ವಸ್ತುವಿನ ಗಾತ್ರಕ್ಕೆ ಹೊಂದಿಸಲು ಚಿತ್ರವನ್ನು ಹೊಂದಿಸಲು ಸ್ಲೈಡರ್ ಅನ್ನು ಸರಿಸಿ. ಅವು ಹೊಂದಿಕೆಯಾದಾಗ, ಮುಂದುವರೆಯಲು RETURN (ಅಥವಾ ಸರಿ ಕ್ಲಿಕ್ ಮಾಡಿ) ಒತ್ತಿರಿ.",ko:"이 화면의 크기를 측정해 보겠습니다. 풀다운 메뉴를 사용하여 편리한 항목을 선택하세요. 일반적인 USB 커넥터(컴퓨터에 전원을 공급하는 커넥터 포함)나 신용 카드(또는 동일한 크기의 카드)를 사용할 수 있습니다. 개체를 화면에 놓고 슬라이더를 움직여 개체의 크기에 맞게 이미지를 조정합니다. 일치하면 RETURN을 누르거나 확인을 클릭하여 계속 진행하세요.",lt:"Išmatuosime šio ekrano dydį. Norėdami pasirinkti ką nors patogaus, naudokite išskleidžiamąjį meniu. Galite naudoti bet kurią įprastą USB jungtį (įskaitant tą, kuri maitina jūsų kompiuterį) arba kredito kortelę (arba bet kurią tokio pat dydžio kortelę). Padėkite objektą ant ekrano ir perkelkite slankiklį, kad vaizdas atitiktų objekto dydį. Kai jie sutampa, paspauskite RETURN (arba spustelėkite Gerai), kad tęstumėte.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഈ സ്ക്രീനിൻ്റെ വലിപ്പം ഞങ്ങൾ അളക്കും. സൗകര്യപ്രദമായ എന്തെങ്കിലും തിരഞ്ഞെടുക്കാൻ പുൾ-ഡൗൺ മെനു ഉപയോഗിക്കുക. നിങ്ങൾക്ക് ഏതെങ്കിലും സാധാരണ USB കണക്ടറോ (നിങ്ങളുടെ കമ്പ്യൂട്ടറിന് പവർ നൽകുന്നതുൾപ്പെടെ) അല്ലെങ്കിൽ ഒരു ക്രെഡിറ്റ് കാർഡോ (അല്ലെങ്കിൽ അതേ വലിപ്പത്തിലുള്ള ഏതെങ്കിലും കാർഡ്) ഉപയോഗിക്കാം. നിങ്ങളുടെ ഒബ്‌ജക്‌റ്റ് സ്‌ക്രീനിൽ വയ്ക്കുക, നിങ്ങളുടെ ഒബ്‌ജക്‌റ്റിൻ്റെ വലുപ്പവുമായി പൊരുത്തപ്പെടുന്നതിന് ചിത്രം ക്രമീകരിക്കുന്നതിന് സ്ലൈഡർ നീക്കുക. അവ പൊരുത്തപ്പെടുമ്പോൾ, തുടരാൻ RETURN അമർത്തുക (അല്ലെങ്കിൽ ശരി ക്ലിക്കുചെയ്യുക).",no:"Vi vil måle størrelsen på denne skjermen. Bruk rullegardinmenyen for å velge noe praktisk. Du kan bruke en hvilken som helst vanlig USB-kontakt (inkludert den som gir strøm til datamaskinen din) eller et kredittkort (eller et hvilket som helst kort av samme størrelse). Plasser objektet på skjermen og flytt glidebryteren for å justere bildet slik at det passer med objektets størrelse. Når de samsvarer, trykk RETURN (eller klikk OK) for å fortsette.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierzymy rozmiar tego ekranu. Użyj menu rozwijanego, aby wybrać coś przydatnego. Możesz użyć dowolnego popularnego złącza USB (w tym tego, które zasila komputer) lub karty kredytowej (lub dowolnej karty o tym samym rozmiarze). Umieść obiekt na ekranie i przesuń suwak, aby dostosować obraz do rozmiaru obiektu. Kiedy pasują, naciśnij RETURN (lub kliknij OK), aby kontynuować.",pt:"Mediremos o tamanho desta tela. Use o menu suspenso para escolher algo útil. Você pode usar qualquer conector USB comum (incluindo aquele que fornece energia ao seu computador) ou um cartão de crédito (ou qualquer cartão do mesmo tamanho). Coloque o seu objeto na tela e mova o controle deslizante para ajustar a imagem de acordo com o tamanho do seu objeto. Quando corresponderem, pressione RETURN (ou clique em OK) para prosseguir.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Mediremos el tamaño de esta pantalla. Usa el menú desplegable para elegir algo práctico. Puedes usar cualquier conector USB común (incluido el que proporciona energía a tu computadora) o una tarjeta de crédito (o cualquier tarjeta del mismo tamaño). Coloca tu objeto en la pantalla y mueve el control deslizante para ajustar la imagen al tamaño de tu objeto. Cuando coincidan, presiona RETURN (o haz clic en OK) para continuar.",sw:"Tutapima ukubwa wa skrini hii. Tumia menyu ya kuvuta-chini ili kuchagua kitu kinachofaa. Unaweza kutumia kiunganishi chochote cha kawaida cha USB (pamoja na kile kinachotoa nishati kwa kompyuta yako) au kadi ya mkopo (au kadi yoyote ya ukubwa sawa). Weka kitu chako kwenye skrini na usogeze kitelezi ili kurekebisha picha ili ilingane na saizi ya kitu chako. Zinapolingana, bonyeza RETURN (au bofya SAWA) ili kuendelea.",sv:"Vi kommer att mäta storleken på denna skärm. Använd rullgardinsmenyn för att välja något praktiskt. Du kan använda vilken vanlig USB-kontakt som helst (inklusive den som ger ström till din dator) eller ett kreditkort (eller vilket kort som helst av samma storlek). Placera ditt objekt på skärmen och flytta reglaget för att justera bilden så att den matchar ditt objekts storlek. När de matchar, tryck på RETURN (eller klicka på OK) för att fortsätta.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bu ekranın boyutunu ölçeceğiz. Kullanışlı bir şey seçmek için açılır menüyü kullanın. Yaygın olarak kullanılan herhangi bir USB konektörünü (bilgisayarınıza güç sağlayan da dahil) veya kredi kartını (veya aynı boyuttaki herhangi bir kartı) kullanabilirsiniz. Nesnenizi ekrana yerleştirin ve görüntüyü nesnenizin boyutuna uyacak şekilde ayarlamak için kaydırıcıyı hareket ettirin. Eşleştiklerinde devam etmek için RETURN tuşuna basın (veya Tamam'a tıklayın).",ur:"ہم اس سکرین کے سائز کی پیمائش کریں گے۔ کوئی آسان چیز منتخب کرنے کے لیے پل ڈاؤن مینو کا استعمال کریں۔ آپ کوئی بھی عام USB کنیکٹر (بشمول آپ کے کمپیوٹر کو پاور فراہم کرنے والا) یا کریڈٹ کارڈ (یا اسی سائز کا کوئی کارڈ) استعمال کر سکتے ہیں۔ اپنے آبجیکٹ کو اسکرین پر رکھیں اور اپنے آبجیکٹ کے سائز سے ملنے والی تصویر کو ایڈجسٹ کرنے کے لیے سلائیڈر کو حرکت دیں۔ جب وہ مماثل ہو جائیں تو آگے بڑھنے کے لیے RETURN دبائیں (یا ٹھیک ہے پر کلک کریں)۔"},RC_screenSizeTitle:{"en-US":"Screen Size Calibration",ar:"معايرة حجم الشاشة",hy:"Էկրանի չափի չափորոշում",bg:"Калибриране на размера на екрана","zh-CN":"屏幕尺寸校准","zh-HK":"螢幕尺寸校準",hr:"Kalibracija veličine zaslona",cs:"Kalibrace velikosti obrazovky",da:"Kalibrering af skærmstørrelse",nl:"Kalibratie van schermgrootte","en-UK":"Screen Size Calibration",fi:"Näytön koon kalibrointi",fr:"Calibration de la taille de l'écran",de:"Kalibrierung der Bildschirmgröße",el:"Βαθμονόμηση μεγέθους οθόνης",he:"כיול גודל מסך",hi:"स्क्रीन आकार अंशांकन",hu:"Képernyőméret kalibrálása",is:"Kvörðun skjástærðar",id:"Kalibrasi Ukuran Layar",it:"Calibrazione della dimensione dello schermo",ja:"画面サイズの調整",kn:"ಪರದೆಯ ಗಾತ್ರದ ಮಾಪನಾಂಕ ನಿರ್ಣಯ",ko:"화면 크기 보정",lt:"Ekrano dydžio kalibravimas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"സ്‌ക്രീൻ സൈസ് കാലിബ്രേഷൻ",no:"Kalibrering av skjermstørrelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Kalibracja rozmiaru ekranu",pt:"Calibração do tamanho da tela",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Calibración del tamaño de pantalla",sw:"Urekebishaji wa Ukubwa wa Skrini",sv:"Kalibrering av skärmstorlek",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Ekran Boyutu Kalibrasyonu",ur:"اسکرین سائز کیلیبریشن"},RC_screenSizeUSBA:{"en-US":"a USB Type A connector",ar:"موصل USB نوع A",hy:"USB Type A միակցիչ",bg:"USB тип A конектор","zh-CN":"USB A 型连接器","zh-HK":"USB A 型連接器",hr:"USB tip A konektor",cs:"konektor USB typu A",da:"et USB Type A-stik",nl:"een USB Type A-connector","en-UK":"a USB Type A connector",fi:"USB Type A -liitin",fr:"un connecteur USB de type A",de:"einen USB-Typ-A-Anschluss",el:"μια υποδοχή USB τύπου Α",he:"מחבר USB מסוג A",hi:"एक यूएसबी टाइप ए कनेक्टर",hu:"A típusú USB csatlakozó",is:"USB tegund A tengi",id:"konektor USB Tipe A",it:"un connettore USB di tipo A",ja:"USB タイプ A コネクタ",kn:"ಯುಎಸ್ಬಿ ಟೈಪ್ ಎ ಕನೆಕ್ಟರ್",ko:"USB 유형 A 커넥터",lt:"A tipo USB jungtis",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഒരു യുഎസ്ബി ടൈപ്പ് എ കണക്ടർ",no:"en USB Type A-kontakt",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"złącze USB typu A",pt:"um conector USB tipo A",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"un conector USB Tipo A",sw:"kiunganishi cha Aina ya A ya USB",sv:"en USB typ A-kontakt",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"bir USB Tip A konektörü",ur:"ایک USB قسم A کنیکٹر"},RC_screenSizeUSBC:{"en-US":"a USB Type C connector",ar:"موصل USB نوع C",hy:"USB Type C միակցիչ",bg:"USB тип C конектор","zh-CN":"USB C 型连接器","zh-HK":"USB C 型連接器",hr:"USB Type C priključak",cs:"konektor USB typu C",da:"et USB Type C-stik",nl:"een USB Type C-connector","en-UK":"a USB Type C connector",fi:"USB Type C -liitin",fr:"un connecteur USB Type C",de:"ein USB-Typ-C-Anschluss",el:"μια υποδοχή USB Type C",he:"מחבר USB מסוג C",hi:"एक यूएसबी टाइप सी कनेक्टर",hu:"egy USB Type C csatlakozó",is:"USB Type C tengi",id:"konektor USB Tipe C",it:"un connettore USB di tipo C",ja:"USB タイプ C コネクタ",kn:"ಯುಎಸ್ಬಿ ಟೈಪ್ ಸಿ ಕನೆಕ್ಟರ್",ko:"USB 타입 C 커넥터",lt:"C tipo USB jungtis",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഒരു USB ടൈപ്പ് C കണക്ടർ",no:"en USB Type C-kontakt",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"złącze USB typu C",pt:"um conector USB Tipo C",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"un conector USB Tipo C",sw:"kiunganishi cha USB Aina ya C",sv:"en USB typ C-kontakt",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"bir USB Tip C konektörü",ur:"ایک USB ٹائپ سی کنیکٹر"},RC_starting:{"en-US":"Starting ...",ar:"البدء ...",hy:"Սկսվում է...",bg:"Стартиране...","zh-CN":"开始...","zh-HK":"開始...",hr:"Počinje...",cs:"Spuštění...",da:"Starter...",nl:"Beginnend...","en-UK":"Starting ...",fi:"Alkaen...",fr:"Début ...",de:"Beginnend ...",el:"Ξεκινώντας...",he:"מתחיל...",hi:"शुरू हो रहा है...",hu:"Kezdés...",is:"Byrjar...",id:"Mulai...",it:"Inizio ...",ja:"開始...",kn:"ಪ್ರಾರಂಭವಾಗುತ್ತಿದೆ...",ko:"시작 중...",lt:"Pradedama...",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ആരംഭിക്കുന്നു...",no:"Starter ...",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Rozpoczęcie...",pt:"Começando ...",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Comenzando ...",sw:"Inaanza...",sv:"Börjar...",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Başlıyor...",ur:"شروع ہو رہا ہے..."},RC_viewingBlindSpotCredit:{"en-US":"We enhanced the blindspot mapping of Li et al. (2020) by adding flicker and manual control.",ar:"قمنا بتحسين خريطة النقاط العمياء لـ Li وآخرون (2020) عن طريق إضافة الوميض والتحكم اليدوي.",hy:"Մենք բարելավեցինք Լի և այլոց կույր կետերի քարտեզագրումը: (2020)՝ ավելացնելով թարթում և ձեռքով կառավարում:",bg:"Подобрихме картографирането на слепите петна на Li et al. (2020) чрез добавяне на трептене и ръчно управление.","zh-CN":"我们增强了 Li 等人的盲点测绘。 (2020) 通过添加闪烁和手动控制。","zh-HK":"我們增強了 Li 等人的盲點測繪。 (2020) 透過新增閃爍和手動控制。",hr:"Poboljšali smo mapiranje slijepe točke Li et al. (2020) dodavanjem treperenja i ručne kontrole.",cs:"Vylepšili jsme mapování slepých skvrn Li et al. (2020) přidáním blikání a ručním ovládáním.",da:"Vi forbedrede blindspot-kortlægningen af ​​Li et al. (2020) ved at tilføje flimmer og manuel kontrol.",nl:"We hebben de blinde vlekkartering van Li et al. verbeterd. (2020) door flikkering en handmatige bediening toe te voegen.","en-UK":"We enhanced the blindspot mapping of Li et al. (2020) by adding flicker and manual control.",fi:"Paransimme Li et al.:n sokeapistekartoitusta. (2020) lisäämällä välkyntä ja manuaalinen ohjaus.",fr:"Nous avons amélioré la cartographie des angles morts de Li et al. (2020) en ajoutant un scintillement et un contrôle manuel.",de:"Wir haben die Blindspot-Kartierung von Li et al. verbessert. (2020) durch Hinzufügen von Flimmern und manueller Steuerung.",el:"Βελτιώσαμε τη χαρτογράφηση τυφλού σημείου των Li et al. (2020) προσθέτοντας τρεμόπαιγμα και χειροκίνητο έλεγχο.",he:"שיפרנו את מיפוי הנקודה העיוורת של Li et al. (2020) על ידי הוספת הבהוב ושליטה ידנית.",hi:"हमने ली एट अल की ब्लाइंडस्पॉट मैपिंग को बढ़ाया। (2020) झिलमिलाहट और मैनुअल नियंत्रण जोड़कर।",hu:"Javítottuk Li és munkatársai vakfolt-térképezését. (2020) villogás és kézi vezérlés hozzáadásával.",is:"Við bættum blindblettakortlagningu Li o.fl. (2020) með því að bæta við flökti og handstýringu.",id:"Kami meningkatkan pemetaan titik buta Li et al. (2020) dengan menambahkan kedipan dan kontrol manual.",it:"Abbiamo migliorato la mappatura dei punti ciechi di Li et al. (2020) aggiungendo il flicker e il controllo manuale.",ja:"Li らの盲点マッピングを強化しました。 (2020) ちらつきと手動制御を追加しました。",kn:"ನಾವು Li et al ನ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್ ಮ್ಯಾಪಿಂಗ್ ಅನ್ನು ವರ್ಧಿಸಿದ್ದೇವೆ. (2020) ಫ್ಲಿಕರ್ ಮತ್ತು ಹಸ್ತಚಾಲಿತ ನಿಯಂತ್ರಣವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ.",ko:"우리는 Li et al.의 맹점 매핑을 향상시켰습니다. (2020) 깜박임 및 수동 제어를 추가했습니다.",lt:"Patobulinome Li ir kt. (2020), pridedant mirgėjimą ir rankinį valdymą.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"Li et al ൻ്റെ ബ്ലൈൻഡ്‌സ്‌പോട്ട് മാപ്പിംഗ് ഞങ്ങൾ മെച്ചപ്പെടുത്തി. (2020) ഫ്ലിക്കറും മാനുവൽ നിയന്ത്രണവും ചേർത്ത്.",no:"Vi forbedret blindsonskartleggingen til Li et al. (2020) ved å legge til flimmer og manuell kontroll.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Udoskonaliliśmy mapowanie martwego punktu Li i in. (2020), dodając migotanie i sterowanie ręczne.",pt:"Melhoramos o mapeamento do ponto cego de Li et al. (2020) adicionando cintilação e controle manual.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Mejoramos el mapeo de puntos ciegos de Li et al. (2020) al agregar parpadeo y control manual.",sw:"Tuliboresha ramani ya upofu wa Li et al. (2020) kwa kuongeza flicker na udhibiti wa mwongozo.",sv:"Vi förbättrade blindfläckskartläggningen av Li et al. (2020) genom att lägga till flimmer och manuell kontroll.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Li ve arkadaşlarının kör nokta haritalamasını geliştirdik. (2020) titreşim ve manuel kontrol ekleyerek.",ur:"ہم نے لی ایٹ ال کی بلائنڈ سپاٹ میپنگ کو بڑھایا۔ (2020) فلکر اور دستی کنٹرول شامل کرکے۔"},RC_viewingBlindSpotRejected:{"en-US":"❌ Sorry, the most recent left and right measurements were inconsistent. Try again? Keep one eye closed. Focus on the cross and monitor the flashing dot out of the corner of your eye. Slide the dot left and right until it disappears into your blindspot, and then hit the SPACE bar. Maintain your viewing distance as you test both eyes.",ar:"❌ عذرًا، كانت القياسات الأخيرة لليسار واليمين غير متسقة. حاول مرة أخرى؟ حافظ على إغلاق عين واحدة. ركز على الصليب وراقب النقطة الوميضية من زاوية عينك. حرك النقطة لليسار واليمين حتى تختفي في النقطة العمياء، ثم اضغط على مفتاح المسافة. حافظ على مسافة المشاهدة أثناء اختبار كلتا العينين.",hy:"❌ Ներողություն, ձախ և աջ վերջին չափումները անհամապատասխան էին: Փորձե՞լ նորից: Մի աչքը փակ պահեք։ Կենտրոնացեք խաչի վրա և հետևեք ձեր աչքի անկյունից դուրս գտնվող թարթող կետին: Կետը սահեցրեք ձախ և աջ, մինչև այն անհետանա ձեր կույր կետի մեջ, այնուհետև սեղմեք SPACE սանդղակը: Պահպանեք ձեր դիտման հեռավորությունը, երբ փորձարկում եք երկու աչքերը:",bg:"❌ За съжаление последните леви и десни измервания не съответстват. Опитайте отново? Дръжте едното си око затворено. Фокусирайте се върху кръста и наблюдавайте мигащата точка с ъгъла на окото си. Плъзнете точката наляво и надясно, докато изчезне в сляпото петно, след което натиснете ИНТЕРВАЛ. Поддържайте разстоянието на гледане, докато тествате и двете очи.","zh-CN":"❌ 抱歉,最近的左右测量结果不一致。再试一次?闭上一只眼睛。将注意力集中在十字上,并用眼角余光观察闪烁的点。左右滑动该点,直到它消失在您的盲点中,然后按空格键。测试双眼时保持观看距离。","zh-HK":"❌ 抱歉,最近的左右測量結果不一致。再試一次?閉上一隻眼睛。將注意力集中在十字上,並用眼角餘光觀察閃爍的點。左右滑動該點,直到它消失在您的盲點中,然後按空白鍵。測試雙眼時保持觀看距離。",hr:"❌ Nažalost, posljednja mjerenja lijeve i desne strane nisu bila dosljedna. Pokušajte ponovno? Držite jedno oko zatvoreno. Usredotočite se na križ i promatrajte svjetlucavu točku krajičkom oka. Klizite točkom lijevo i desno dok ne nestane u vašoj mrtvoj točki, a zatim pritisnite RAZMAKNICU. Održavajte udaljenost gledanja dok testirate oba oka.",cs:"❌ Omlouváme se, poslední měření vlevo a vpravo byla nekonzistentní. Zkusit znovu? Mějte jedno oko zavřené. Zaměřte se na kříž a sledujte blikající tečku koutkem oka. Posouvejte tečku doleva a doprava, dokud nezmizí ve vašem slepém úhlu, a poté stiskněte MEZERNÍK. Při testování obou očí udržujte pozorovací vzdálenost.",da:"❌ Beklager, de seneste venstre og højre målinger var inkonsistente. Prøv igen? Hold det ene øje lukket. Fokuser på korset og overvåg den blinkende prik ud af øjenkrogen. Skub prikken til venstre og højre, indtil den forsvinder ind i din blindspot, og tryk derefter på MELLEMRUM. Hold din synsafstand, mens du tester begge øjne.",nl:"❌ Sorry, de meest recente linker- en rechtermetingen waren inconsistent. Opnieuw proberen? Houd één oog gesloten. Concentreer u op het kruis en let op de knipperende stip vanuit uw ooghoek. Schuif de stip naar links en rechts totdat deze in je blinde vlek verdwijnt en druk vervolgens op de SPATIEBALK. Houd uw kijkafstand aan terwijl u beide ogen test.","en-UK":"❌ Sorry, the most recent left and right measurements were inconsistent. Try again? Keep one eye closed. Focus on the cross and monitor the flashing dot out of the corner of your eye. Slide the dot left and right until it disappears into your blind spot, and then hit the SPACE bar. Maintain your viewing distance as you test both eyes.",fi:"❌ Valitettavasti viimeisimmät vasemman ja oikeanpuoleiset mittaukset olivat epäjohdonmukaisia. Yritätkö uudelleen? Pidä toinen silmä kiinni. Keskity ristiin ja tarkkaile vilkkuvaa pistettä silmäkulmassasi. Liu'uta pistettä vasemmalle ja oikealle, kunnes se katoaa sokealle pisteelle, ja paina sitten VÄLINÄPPÄINTÄ. Säilytä katseluetäisyys, kun testaat molempia silmiä.",fr:"❌ Désolé, les mesures les plus récentes à gauche et à droite étaient incohérentes. Réessayer ? Gardez un œil fermé. Concentrez-vous sur la croix et surveillez le point clignotant du coin de l'œil. Faites glisser le point vers la gauche et la droite jusqu'à ce qu'il disparaisse dans votre angle mort, puis appuyez sur la barre d'espace. Maintenez votre distance de vision pendant que vous testez les deux yeux.",de:"❌ Leider waren die letzten linken und rechten Messungen inkonsistent. Versuchen Sie es erneut? Halten Sie ein Auge geschlossen. Konzentrieren Sie sich auf das Kreuz und beobachten Sie den blinkenden Punkt aus dem Augenwinkel. Schieben Sie den Punkt nach links und rechts, bis er in Ihrem toten Winkel verschwindet, und drücken Sie dann die LEERTASTE. Halten Sie Ihren Sehabstand ein, während Sie beide Augen testen.",el:"❌ Λυπούμαστε, οι πιο πρόσφατες μετρήσεις αριστερά και δεξιά ήταν ασυνεπείς. Δοκιμάστε ξανά; Κρατήστε το ένα μάτι κλειστό. Εστιάστε στον σταυρό και παρακολουθήστε την κουκκίδα που αναβοσβήνει με την άκρη του ματιού σας. Σύρετε την κουκκίδα αριστερά και δεξιά μέχρι να εξαφανιστεί στο blindspot σας και, στη συνέχεια, πατήστε τη γραμμή SPACE. Διατηρήστε την απόσταση θέασής σας καθώς δοκιμάζετε και τα δύο μάτια.",he:"❌ מצטערים, המדידות האחרונות משמאל וימין לא היו עקביות. לנסות שוב? סגור עין אחת. התמקד בצלב ועקוב אחר הנקודה המהבהבת בזווית העין. החלק את הנקודה ימינה ושמאלה עד שהיא תיעלם בנקודה העיוורת שלך, ואז לחץ על מקש הרווח. שמור על מרחק צפייה בזמן שאתה בודק את שתי העיניים.",hi:"❌ क्षमा करें, नवीनतम बाएँ और दाएँ माप असंगत थे। पुनः प्रयास करें? एक आंख बंद रखें. क्रॉस पर ध्यान केंद्रित करें और अपनी आंख के कोने से चमकते बिंदु की निगरानी करें। बिंदु को बाएँ और दाएँ तब तक स्लाइड करें जब तक कि वह आपके ब्लाइंडस्पॉट में गायब न हो जाए, और फिर SPACE बार पर क्लिक करें। दोनों आँखों का परीक्षण करते समय अपनी देखने की दूरी बनाए रखें।",hu:"❌ Sajnáljuk, a legutóbbi bal és jobb oldali mérések következetlenek voltak. Megpróbálja újra? Tartsa az egyik szemét csukva. Koncentrálj a keresztre, és figyeld a villogó pontot a szemed sarkából. Csúsztassa a pontot balra és jobbra, amíg el nem tűnik a vakfoltban, majd nyomja meg a SZÓKÖZ billentyűt. Mindkét szem tesztelésekor tartsa be a látótávolságot.",is:"❌ Því miður, nýjustu vinstri og hægri mælingar voru ósamkvæmar. Reyna aftur? Hafðu annað augað lokað. Einbeittu þér að krossinum og fylgdu blikkandi punktinum út úr augnkróknum. Renndu punktinum til vinstri og hægri þar til hann hverfur inn í blindblettinn þinn og ýttu svo á bil. Haltu útsýnisfjarlægð þinni þegar þú prófar bæði augun.",id:"❌ Maaf, pengukuran kiri dan kanan terbaru tidak konsisten. Coba lagi? Tutup satu mata. Fokus pada tanda silang dan pantau titik berkedip dari sudut mata Anda. Geser titik ke kiri dan ke kanan hingga menghilang di titik buta Anda, lalu tekan bilah SPASI. Pertahankan jarak pandang Anda saat Anda menguji kedua mata.",it:"❌ Mi dispiace, le misurazioni più recenti a sinistra e a destra erano incoerenti. Vuoi riprovare? Tieni un occhio chiuso. Concentrati sulla croce e osserva il punto lampeggiante con la coda dell'occhio. Fai scorrere il punto a sinistra e a destra finché non scompare nel tuo punto cieco, quindi premi la barra SPAZIATRICE. Mantieni la distanza di visione mentre testi entrambi gli occhi.",ja:"❌ 申し訳ありませんが、最新の左右の測定値が一致していませんでした。もう一度やり直してください?片目を閉じたままにしてください。十字に焦点を合わせ、目の端に現れる点滅する点を監視してください。死角に消えるまでドットを左右にスライドさせ、スペース バーを押します。両目を検査するときは、観察距離を維持してください。",kn:"❌ ಕ್ಷಮಿಸಿ, ತೀರಾ ಇತ್ತೀಚಿನ ಎಡ ಮತ್ತು ಬಲ ಅಳತೆಗಳು ಅಸಮಂಜಸವಾಗಿವೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುವುದೇ? ಒಂದು ಕಣ್ಣು ಮುಚ್ಚಿ ಇರಿ. ಶಿಲುಬೆಯ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಿಂದ ಮಿನುಗುವ ಬಿಂದುವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ. ಡಾಟ್ ಅನ್ನು ಎಡಕ್ಕೆ ಮತ್ತು ಬಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ, ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾಗುವವರೆಗೆ, ತದನಂತರ SPACE ಬಾರ್ ಅನ್ನು ಒತ್ತಿರಿ. ನೀವು ಎರಡೂ ಕಣ್ಣುಗಳನ್ನು ಪರೀಕ್ಷಿಸುವಾಗ ನಿಮ್ಮ ವೀಕ್ಷಣಾ ಅಂತರವನ್ನು ಕಾಪಾಡಿಕೊಳ್ಳಿ.",ko:"❌ 죄송합니다. 가장 최근의 왼쪽 및 오른쪽 측정값이 일치하지 않았습니다. 다시 시도하시겠습니까? 한쪽 눈을 감고 있으세요. 십자가에 초점을 맞추고 눈 구석에서 깜박이는 점을 관찰하십시오. 점이 사각지대까지 사라질 때까지 점을 왼쪽과 오른쪽으로 민 다음 스페이스바를 누르세요. 두 눈을 테스트할 때 시청 거리를 유지하세요.",lt:"❌ Atsiprašome, paskutiniai kairės ir dešinės pusės matavimai buvo nenuoseklūs. Bandyti dar kartą? Laikykite vieną akį užmerktą. Sutelkite dėmesį į kryžių ir stebėkite mirksintį tašką akies kamputyje. Slinkite tašką kairėn ir dešinėn, kol jis išnyks jūsų aklojoje zonoje, tada paspauskite tarpo klavišą. Išlaikykite žiūrėjimo atstumą, kai tikrinate abi akis.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"❌ ക്ഷമിക്കണം, ഏറ്റവും പുതിയ ഇടത്, വലത് അളവുകൾ പൊരുത്തമില്ലാത്തതായിരുന്നു. വീണ്ടും ശ്രമിക്കുക? ഒരു കണ്ണ് അടയ്ക്കുക. കുരിശിൽ ഫോക്കസ് ചെയ്യുക, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിൽ നിന്ന് മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുക. നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അത് അപ്രത്യക്ഷമാകുന്നതുവരെ ഡോട്ട് ഇടത്തോട്ടും വലത്തോട്ടും സ്ലൈഡുചെയ്യുക, തുടർന്ന് സ്‌പെയ്‌സ് ബാറിൽ അമർത്തുക. രണ്ട് കണ്ണുകളും പരിശോധിക്കുമ്പോൾ നിങ്ങളുടെ കാഴ്ച ദൂരം നിലനിർത്തുക.",no:"❌ Beklager, de siste målingene til venstre og høyre var inkonsekvente. Prøv igjen? Hold ett øye lukket. Fokuser på korset og overvåk den blinkende prikken ut av øyekroken. Skyv prikken til venstre og høyre til den forsvinner inn i blindsonen din, og trykk deretter på MELLOMROM. Hold visningsavstanden mens du tester begge øynene.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"❌ Przepraszamy, ostatnie pomiary lewej i prawej strony były niespójne. Spróbuj ponownie? Trzymaj jedno oko zamknięte. Skup się na krzyżyku i obserwuj migającą kropkę kątem oka. Przesuwaj kropkę w lewo i w prawo, aż zniknie w twoim martwym punkcie, a następnie naciśnij klawisz SPACJA. Utrzymuj odległość patrzenia podczas badania obu oczu.",pt:"❌ Desculpe, as medições esquerda e direita mais recentes foram inconsistentes. Tentar novamente? Mantenha um olho fechado. Concentre-se na cruz e monitore o ponto piscando no canto do olho. Deslize o ponto para a esquerda e para a direita até que ele desapareça no ponto cego e, em seguida, pressione a barra de ESPAÇO. Mantenha a distância de visualização enquanto testa ambos os olhos.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"❌ Lo siento, las mediciones más recientes de izquierda y derecha fueron inconsistentes. ¿Intentar de nuevo? Mantén un ojo cerrado. Enfócate en la cruz y observa el punto parpadeante con el rabillo del ojo. Desliza el punto hacia la izquierda y la derecha hasta que desaparezca en tu punto ciego, y luego presiona la barra ESPACIADORA. Mantén tu distancia de visión mientras pruebas ambos ojos.",sw:"❌ Samahani, vipimo vya hivi majuzi zaidi vya kushoto na kulia havikuwa sawa. Ungependa kujaribu tena? Weka jicho moja limefungwa. Zingatia msalaba na ufuatilie nukta inayong'aa kutoka kwenye kona ya jicho lako. Telezesha kitone kushoto na kulia hadi kipotee kwenye upofu wako, kisha ugonge upau wa SPACE. Dumisha umbali wako wa kutazama unapojaribu macho yote mawili.",sv:"❌ Tyvärr, de senaste vänster- och högermåtten var inkonsekventa. Försök igen? Håll ett öga stängt. Fokusera på korset och övervaka den blinkande punkten i ögonvrån. Skjut punkten åt vänster och höger tills den försvinner i din döda vinkel och tryck sedan på MELLANSLAG. Behåll ditt synavstånd när du testar båda ögonen.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"❌ Üzgünüz, en son sol ve sağ ölçümler tutarsızdı. Tekrar deneyin? Bir gözünüzü kapalı tutun. Çarmıha odaklanın ve yanıp sönen noktayı gözünüzün köşesinden izleyin. Noktayı kör noktanızda kaybolana kadar sola ve sağa kaydırın ve ardından BOŞLUK çubuğuna basın. Her iki gözünüzü test ederken görüş mesafenizi koruyun.",ur:"❌ معذرت، حالیہ بائیں اور دائیں پیمائشیں متضاد تھیں۔ دوبارہ کوشش کریں؟ ایک آنکھ بند رکھیں۔ کراس پر توجہ مرکوز کریں اور اپنی آنکھ کے کونے سے چمکتے ہوئے نقطے کی نگرانی کریں۔ ڈاٹ کو بائیں اور دائیں سلائیڈ کریں جب تک کہ یہ آپ کے بلائنڈ سپاٹ میں غائب نہ ہو جائے، اور پھر SPACE بار کو ماریں۔ دونوں آنکھوں کی جانچ کرتے وقت اپنے دیکھنے کا فاصلہ برقرار رکھیں۔"},RC_viewingDistance:{"en-US":"Viewing Distance",ar:"مسافة المشاهدة",hy:"Դիտման հեռավորությունը",bg:"Разстояние за гледане","zh-CN":"观看距离","zh-HK":"觀看距離",hr:"Udaljenost gledanja",cs:"Zobrazovací vzdálenost",da:"Visningsafstand",nl:"Kijkafstand","en-UK":"Viewing Distance",fi:"Katseluetäisyys",fr:"Distance de visionnement",de:"Betrachtungsentfernung",el:"Απόσταση προβολής",he:"מרחק צפייה",hi:"देखने की दूरी",hu:"Megtekintési távolság",is:"Skoðunarfjarlægð",id:"Jarak Pandang",it:"Distanza di visione",ja:"視聴距離",kn:"ವೀಕ್ಷಣಾ ದೂರ",ko:"시청 거리",lt:"Žiūrėjimo atstumas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാണുന്ന ദൂരം",no:"Visningsavstand",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Odległość oglądania",pt:"Visualizando distância",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Distancia de visualización",sw:"Umbali wa Kutazama",sv:"Betraktningsavstånd",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Görüş Mesafesi",ur:"دیکھنے کا فاصلہ"},RC_viewingDistanceIntroTitle:{"en-US":"Explanation",ar:"تفسير",hy:"Բացատրություն",bg:"Обяснение","zh-CN":"解释","zh-HK":"解釋",hr:"Obrazloženje",cs:"Vysvětlení",da:"Forklaring",nl:"Uitleg","en-UK":"Explanation",fi:"Selitys",fr:"Explication",de:"Erläuterung",el:"Εξήγηση",he:"הֶסבֵּר",hi:"स्पष्टीकरण",hu:"Magyarázat",is:"Skýring",id:"Penjelasan",it:"Spiegazione",ja:"説明",kn:"ವಿವರಣೆ",ko:"설명",lt:"Paaiškinimas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വിശദീകരണം",no:"Forklaring",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Wyjaśnienie",pt:"Explicação",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Explicación",sw:"Maelezo",sv:"Förklaring",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Açıklama",ur:"وضاحت"},RC_viewingDistanceIntroLiMethod:{"en-US":"EXPLANATION. For this step, come closer, if necessary, so you're no farther than twice the screen width. Every eye has a blindspot. We'll find yours to discover how far your eye is from the screen. You'll be asked to close or cover one eye to isolate the other. While you focus on the cross, watch the flickering dot out of the corner of your eye, and hit RETURN when it disappears into your blindspot. Depending on viewing distance and screen size, the flickering dot typically will reach your blindspot before it gets to the middle of the screen. You'll do this with each eye, alternating, until the last two measurements are consistent. Please maintain your viewing distance as you test both eyes. NOTE. If the dot never disappears, it means that your eye is following the dot, instead of staying on the cross. This test needs you to keep your eye on the cross while monitoring the flickering dot in the corner of your eye. That's hard at first, but becomes easier with practice.",ar:"التفسير. لهذه الخطوة، اقترب إذا لزم الأمر، حتى لا تكون أبعد من ضعف عرض الشاشة. كل عين لديها نقطة عمياء. سنجد لك نقطتك العمياء لاكتشاف مدى بعد عينك عن الشاشة. سيُطلب منك إغلاق أو تغطية عين واحدة لعزل الأخرى. بينما تركز على الصليب، راقب النقطة الوميضية من زاوية عينك، واضغط على RETURN عندما تختفي في نقطتك العمياء. اعتمادًا على مسافة المشاهدة وحجم الشاشة، عادةً ما تصل النقطة الوميضية إلى نقطتك العمياء قبل أن تصل إلى منتصف الشاشة. ستقوم بذلك مع كل عين، بالتناوب، حتى تكون آخر قياسين متسقين. يرجى الحفاظ على مسافة المشاهدة الخاصة بك أثناء اختبار كلتا العينين. ملاحظة. إذا لم تختف النقطة أبدًا، فهذا يعني أن عينك تتبع النقطة، بدلاً من البقاء على الصليب. يحتاج هذا الاختبار إلى إبقاء عينك على الصليب أثناء مراقبة النقطة الوميضية في زاوية عينك. هذا صعب في البداية، لكنه يصبح أسهل مع الممارسة.",hy:"ԲԱՑԱՏՐՈՒԹՅՈՒՆ. Այս քայլին անհրաժեշտության դեպքում մոտեցեք, այնպես որ էկրանի լայնությունից երկու անգամ ավելի հեռու չեք: Յուրաքանչյուր աչք ունի կույր կետ: Մենք կգտնենք ձերը՝ պարզելու համար, թե որքան հեռու է ձեր աչքը էկրանից: Ձեզանից կպահանջվի փակել կամ փակել մի աչքը՝ մյուսը մեկուսացնելու համար: Մինչ դուք կենտրոնանում եք խաչի վրա, դիտեք թարթող կետը ձեր աչքի ծայրով և սեղմեք RETURN, երբ այն անհետանա ձեր կույր կետում: Կախված դիտման հեռավորությունից և էկրանի չափից՝ թարթող կետը սովորաբար կհասնի ձեր կույր կետին՝ նախքան էկրանի կեսին հասնելը: Դուք դա կանեք յուրաքանչյուր աչքով, հերթափոխով, մինչև վերջին երկու չափումները համապատասխանեն: Խնդրում ենք պահպանել դիտման հեռավորությունը երկու աչքը փորձարկելիս: ԾԱՆՈԹԱԳՐՈՒԹՅՈՒՆ. Եթե ​​կետը երբեք չի անհետանում, դա նշանակում է, որ ձեր աչքը խաչի վրա մնալու փոխարեն հետևում է կետին: Այս թեստի համար անհրաժեշտ է, որ դուք ձեր աչքը պահեք խաչի վրա՝ միաժամանակ հետևելով ձեր աչքի անկյունում թարթող կետին: Դա սկզբում դժվար է, բայց գործնականում ավելի հեշտ է դառնում:",bg:"ОБЯСНЕНИЕ. За тази стъпка се приближете, ако е необходимо, така че да не сте по-далече от два пъти ширината на екрана. Всяко око има сляпо петно. Ние ще намерим вашия, за да разберем колко далеч е окото ви от екрана. Ще бъдете помолени да затворите или покриете едното си око, за да изолирате другото. Докато се фокусирате върху кръста, наблюдавайте трепкащата точка с крайчеца на окото си и натиснете RETURN, когато изчезне в сляпото ви петно. В зависимост от разстоянието за гледане и размера на екрана, мигащата точка обикновено ще достигне сляпото ви петно, преди да стигне до средата на екрана. Ще правите това с всяко око, редувайки се, докато последните две измервания станат еднакви. Моля, спазвайте разстоянието на гледане, докато тествате и двете очи. ЗАБЕЛЕЖКА. Ако точката никога не изчезва, това означава, че окото ви следва точката, вместо да стои на кръста. Този тест изисква да държите очите си върху кръста, докато наблюдавате трепкащата точка в ъгъла на окото си. В началото е трудно, но става по-лесно с практиката.","zh-CN":"解释。对于此步骤,如有必要,请靠近一些,这样您的距离就不会超过屏幕宽度的两倍。每只眼睛都有一个盲点。我们会找到您的眼睛,以了解您的眼睛距屏幕有多远。系统会要求您闭上或遮住一只眼睛以隔离另一只眼睛。当你专注于十字架时,用眼角余光观察闪烁的点,当它消失在你的盲点中时按“返回”。根据观看距离和屏幕尺寸,闪烁点通常会在到达屏幕中间之前到达您的盲点。您将用每只眼睛交替执行此操作,直到最后两次测量结果一致。测试双眼时请保持观看距离。笔记。如果该点永远不会消失,则意味着您的眼睛正在追随该点,而不是停留在十字架上。该测试需要您将目光集中在十字架上,同时观察眼角闪烁的点。一开始这很难,但经过练习就会变得更容易。","zh-HK":"解釋。對於此步驟,如有必要,請靠近一些,這樣您的距離就不會超過螢幕寬度的兩倍。每隻眼睛都有一個盲點。我們會找到您的眼睛,以了解您的眼睛離螢幕有多遠。系統會要求您閉上或遮住一隻眼睛以隔離另一隻眼睛。當你專注於十字架時,用眼角余光觀察閃爍的點,當它消失在你的盲點中時按“返回”。根據觀看距離和螢幕尺寸,閃爍點通常會在到達螢幕中間之前到達您的盲點。您將用每隻眼睛交替執行此操作,直到最後兩次測量結果一致。測試雙眼時請保持觀看距離。筆記。如果該點永遠不會消失,則表示您的眼睛正在追隨該點,而不是停留在十字架上。此測試需要您將目光集中在十字架上,同時觀察眼角閃爍的點。一開始這很難,但經過練習就會變得更容易。",hr:"OBRAZLOŽENJE. Za ovaj korak, priđite bliže, ako je potrebno, tako da ne budete dalje od dvostruke širine zaslona. Svako oko ima slijepu mrlju. Pronaći ćemo vaš kako bismo otkrili koliko vam je oko udaljeno od ekrana. Od vas će se tražiti da zatvorite ili pokrijete jedno oko kako biste izolirali drugo. Dok se fokusirate na križ, promatrajte treperavu točku krajičkom oka i pritisnite RETURN kada nestane u vašoj slijepoj točki. Ovisno o udaljenosti gledanja i veličini zaslona, ​​titrajuća točka obično će dosegnuti vašu mrtvu točku prije nego što stigne do sredine zaslona. To ćete učiniti sa svakim okom, naizmjenično, sve dok posljednja dva mjerenja ne budu dosljedna. Održavajte udaljenost gledanja dok testirate oba oka. BILJEŠKA. Ako točka nikad ne nestane, to znači da vaše oko prati točku, umjesto da ostaje na križu. Ovaj test zahtijeva da pogled držite na križu dok promatrate svjetlucavu točkicu u kutu oka. To je u početku teško, ali s vježbom postaje lakše.",cs:"VYSVĚTLENÍ. Při tomto kroku se v případě potřeby přibližte, abyste nebyli dále než dvojnásobek šířky obrazovky. Každé oko má slepou skvrnu. Najdeme ten váš, abychom zjistili, jak daleko je vaše oko od obrazovky. Budete požádáni, abyste zavřeli nebo zakryli jedno oko, abyste izolovali druhé. Zatímco se soustředíte na kříž, sledujte koutkem oka blikající tečku, a když zmizí ve vašem slepém úhlu, stiskněte RETURN. V závislosti na vzdálenosti a velikosti obrazovky se blikající bod obvykle dostane do vašeho mrtvého bodu dříve, než se dostane do středu obrazovky. Budete to dělat s každým okem střídavě, dokud nebudou poslední dvě měření konzistentní. Při testování obou očí dodržujte pozorovací vzdálenost. POZNÁMKA. Pokud tečka nikdy nezmizí, znamená to, že vaše oko sleduje tečku, místo aby zůstalo na kříži. Tento test vyžaduje, abyste drželi oči na kříži a zároveň sledovali blikající tečku v koutku oka. Zpočátku je to těžké, ale s praxí se to zjednoduší.",da:"FORKLARING. Til dette trin skal du om nødvendigt komme tættere på, så du ikke er længere end det dobbelte af skærmens bredde. Hvert øje har en blind plet. Vi finder din for at finde ud af, hvor langt dit øje er fra skærmen. Du bliver bedt om at lukke eller dække det ene øje for at isolere det andet. Mens du fokuserer på korset, så se den flimrende prik ud af øjenkrogen, og tryk på RETURN, når den forsvinder i din blindspot. Afhængig af visningsafstand og skærmstørrelse vil den flimrende prik typisk nå din blindspot, før den når til midten af ​​skærmen. Du vil gøre dette med hvert øje, skiftevis, indtil de sidste to målinger er konsistente. Hold venligst din synsafstand, mens du tester begge øjne. NOTE. Hvis prikken aldrig forsvinder, betyder det, at dit øje følger prikken i stedet for at blive på korset. Denne test kræver, at du holder øje med korset, mens du overvåger den flimrende prik i øjenkrogen. Det er svært i starten, men det bliver lettere med træning.",nl:"UITLEG. Kom voor deze stap indien nodig dichterbij, zodat u niet verder bent dan tweemaal de schermbreedte. Ieder oog heeft een blinde vlek. Wij vinden de uwe om te ontdekken hoe ver uw oog van het scherm verwijderd is. U wordt gevraagd één oog te sluiten of af te dekken om het andere te isoleren. Terwijl je je op het kruis concentreert, bekijk je de flikkerende stip vanuit je ooghoek en druk je op RETURN zodra deze in je blinde vlek verdwijnt. Afhankelijk van de kijkafstand en de schermgrootte bereikt de flikkerende stip doorgaans uw blinde vlek voordat deze het midden van het scherm bereikt. Je doet dit afwisselend met elk oog, totdat de laatste twee metingen consistent zijn. Houd uw kijkafstand aan terwijl u beide ogen test. OPMERKING. Als de stip nooit verdwijnt, betekent dit dat uw oog de stip volgt, in plaats van op het kruis te blijven staan. Bij deze test moet u het kruis in de gaten houden terwijl u de flikkerende stip in uw ooghoek in de gaten houdt. Dat is in het begin moeilijk, maar wordt gemakkelijker naarmate je oefent.","en-UK":"EXPLANATION. For this step, come closer, if necessary, so you're no further than twice the screen width. Every eye has a blind spot. We'll find yours to discover how far your eye is from the screen. You'll be asked to close or cover one eye to isolate the other. While you focus on the cross, watch the flickering dot out of the corner of your eye, and hit RETURN when it disappears into your blind spot. Depending on viewing distance and screen size, the flickering dot typically will reach your blind spot before it gets to the middle of the screen. You'll do this with each eye, alternating, until the last two measurements are consistent. Please maintain your viewing distance as you test both eyes. NOTE. If the dot never disappears, it means that your eye is following the dot, instead of staying on the cross. This test needs you to keep your eye on the cross while monitoring the flickering dot in the corner of your eye. That's hard at first, but becomes easier with practice.",fi:"SELITYS. Tule tätä vaihetta varten tarvittaessa lähemmäksi, jotta et ole kauempana kuin kaksi kertaa näytön leveys. Jokaisella silmällä on sokeapiste. Löydämme omasi selvittääksemme, kuinka kaukana silmäsi on näytöstä. Sinua pyydetään sulkemaan tai peittämään toinen silmä toisen eristämiseksi. Kun keskityt ristiin, katso välkkyvää pistettä silmäkulmasta ja paina RETURN, kun se katoaa sokealle pisteelle. Katseluetäisyydestä ja näytön koosta riippuen välkkyvä piste saavuttaa yleensä sokean pisteen ennen kuin se tulee näytön keskelle. Teet tämän kummallakin silmällä vuorotellen, kunnes kaksi viimeistä mittausta ovat yhdenmukaisia. Säilytä katseluetäisyys, kun testaat molempia silmiä. HUOM. Jos piste ei koskaan katoa, se tarkoittaa, että silmäsi seuraa pistettä sen sijaan, että pysyisi ristillä. Tämä testi edellyttää, että pidät silmäsi ristissä ja tarkkailet välkkyvää pistettä silmäkulmassasi. Se on aluksi vaikeaa, mutta helpottaa harjoittelua.",fr:"EXPLICATION. Pour cette étape, rapprochez-vous si nécessaire, de sorte que vous ne soyez pas à plus de deux fois la largeur de l'écran. Chaque œil a un point aveugle. Nous allons trouver le vôtre pour découvrir à quelle distance votre œil est de l'écran. On vous demandera de fermer ou de couvrir un œil pour isoler l'autre. Pendant que vous vous concentrez sur la croix, regardez le point clignotant du coin de l'œil et appuyez sur RETOUR lorsqu'il disparaît dans votre point aveugle. Selon la distance de vision et la taille de l'écran, le point clignotant atteindra généralement votre point aveugle avant d'arriver au milieu de l'écran. Vous ferez cela avec chaque œil, en alternant, jusqu'à ce que les deux dernières mesures soient cohérentes. Veuillez maintenir votre distance de vision pendant que vous testez les deux yeux. REMARQUE. Si le point ne disparaît jamais, cela signifie que votre œil suit le point, au lieu de rester sur la croix. Ce test nécessite que vous gardiez votre œil sur la croix tout en surveillant le point clignotant dans le coin de votre œil. C'est difficile au début, mais cela devient plus facile avec la pratique.",de:"ERLÄUTERUNG. Gehen Sie für diesen Schritt bei Bedarf näher heran, sodass Sie nicht weiter als die doppelte Bildschirmbreite entfernt sind. Jedes Auge hat einen blinden Fleck. Wir finden Ihr Auge, um herauszufinden, wie weit Ihr Auge vom Bildschirm entfernt ist. Sie werden aufgefordert, ein Auge zu schließen oder abzudecken, um das andere zu isolieren. Während Sie sich auf das Kreuz konzentrieren, beobachten Sie aus dem Augenwinkel den flackernden Punkt und drücken Sie die Eingabetaste, wenn er in Ihrem toten Winkel verschwindet. Abhängig vom Betrachtungsabstand und der Bildschirmgröße erreicht der flackernde Punkt normalerweise Ihren toten Winkel, bevor er die Mitte des Bildschirms erreicht. Dies machen Sie abwechselnd mit jedem Auge, bis die letzten beiden Messungen übereinstimmen. Bitte halten Sie beim Testen beider Augen Ihren Sehabstand ein. NOTIZ. Wenn der Punkt nie verschwindet, bedeutet das, dass Ihr Auge dem Punkt folgt, anstatt am Kreuz zu bleiben. Bei diesem Test müssen Sie das Kreuz im Auge behalten und gleichzeitig den flackernden Punkt im Augenwinkel beobachten. Das ist zunächst schwierig, wird aber mit der Übung einfacher.",el:"ΕΞΗΓΗΣΗ. Για αυτό το βήμα, πλησιάστε, εάν είναι απαραίτητο, ώστε να μην είστε περισσότερο από το διπλάσιο του πλάτους της οθόνης. Κάθε μάτι έχει ένα τυφλό σημείο. Θα βρούμε το δικό σας για να ανακαλύψουμε πόσο απέχει το μάτι σας από την οθόνη. Θα σας ζητηθεί να κλείσετε ή να καλύψετε το ένα μάτι για να απομονώσετε το άλλο. Ενώ εστιάζετε στον σταυρό, παρακολουθήστε την κουκκίδα που τρεμοπαίζει με την άκρη του ματιού σας και πατήστε RETURN όταν εξαφανιστεί στο τυφλό σημείο σας. Ανάλογα με την απόσταση προβολής και το μέγεθος της οθόνης, η κουκκίδα που τρεμοπαίζει συνήθως φτάνει στο σημείο των τυφλών σας πριν φτάσει στο μέσο της οθόνης. Θα το κάνετε αυτό με κάθε μάτι, εναλλάξ, έως ότου οι δύο τελευταίες μετρήσεις είναι συνεπείς. Διατηρήστε την απόσταση θέασής σας καθώς δοκιμάζετε και τα δύο μάτια. ΣΗΜΕΙΩΜΑ. Εάν η τελεία δεν εξαφανιστεί ποτέ, σημαίνει ότι το μάτι σας ακολουθεί την κουκκίδα, αντί να μείνει στον σταυρό. Αυτή η δοκιμή χρειάζεται να κρατάτε το μάτι σας στο σταυρό ενώ παρακολουθείτε την κουκκίδα που τρεμοπαίζει στη γωνία του ματιού σας. Αυτό είναι δύσκολο στην αρχή, αλλά γίνεται πιο εύκολο με την εξάσκηση.",he:"הֶסבֵּר. לשלב זה, התקרבו, במידת הצורך, כך שאתם לא רחוקים מפי שניים מרוחב המסך. לכל עין יש נקודה עיוורת. אנחנו נמצא את שלך כדי לגלות כמה רחוקה העין שלך מהמסך. תתבקש לסגור או לכסות עין אחת כדי לבודד את השנייה. בזמן שאתה מתמקד על הצלב, צפה בנקודה המהבהבת בזווית העין שלך, ולחץ על RETURN כשהיא נעלמת בנקודה העיוורת שלך. בהתאם למרחק הצפייה ולגודל המסך, הנקודה המרצדת בדרך כלל תגיע לנקודה העיוורת שלך לפני שהיא מגיעה לאמצע המסך. אתה תעשה זאת עם כל עין, לסירוגין, עד ששתי המדידות האחרונות יהיו עקביות. נא לשמור על מרחק צפייה בזמן שאתה בודק את שתי העיניים. פֶּתֶק. אם הנקודה לעולם לא נעלמת, זה אומר שהעין שלך עוקבת אחרי הנקודה, במקום להישאר על הצלב. בדיקה זו מחייבת אותך לפקוח עין על הצלב תוך ניטור הנקודה המרצדת בזווית העין. זה קשה בהתחלה, אבל נעשה קל יותר עם התרגול.",hi:"स्पष्टीकरण। इस चरण के लिए, यदि आवश्यक हो तो करीब आएं, ताकि आप स्क्रीन की चौड़ाई से दोगुने से अधिक दूर न रहें। हर आँख में एक ब्लाइंडस्पॉट होता है। हम आपका पता लगाएंगे कि आपकी आंख स्क्रीन से कितनी दूर है। आपको दूसरी आंख को अलग करने के लिए एक आंख बंद करने या ढकने के लिए कहा जाएगा। जब आप क्रॉस पर ध्यान केंद्रित करते हैं, तो अपनी आंख के कोने से टिमटिमाते बिंदु को देखें, और जब यह आपके ब्लाइंडस्पॉट में गायब हो जाए तो रिटर्न दबाएं। देखने की दूरी और स्क्रीन आकार के आधार पर, टिमटिमाता बिंदु आमतौर पर स्क्रीन के मध्य तक पहुंचने से पहले आपके ब्लाइंडस्पॉट तक पहुंच जाएगा। आप इसे प्रत्येक आंख के साथ बारी-बारी से करेंगे, जब तक कि अंतिम दो माप एक समान न हो जाएं। कृपया दोनों आंखों का परीक्षण करते समय देखने की दूरी बनाए रखें। टिप्पणी। यदि बिंदु कभी गायब नहीं होता है, तो इसका मतलब है कि आपकी आंख क्रॉस पर रहने के बजाय बिंदु का अनुसरण कर रही है। इस परीक्षण के लिए आपको अपनी आंख के कोने में टिमटिमाते बिंदु की निगरानी करते हुए अपनी आंख को क्रॉस पर रखना होगा। यह शुरुआत में कठिन है, लेकिन अभ्यास के साथ आसान हो जाता है।",hu:"MAGYARÁZAT. Ehhez a lépéshez, ha szükséges, jöjjön közelebb, hogy ne legyen messzebb a képernyő szélességének kétszeresénél. Minden szemnek van vakfoltja. Megtaláljuk a magáét, hogy megtudjuk, milyen messze van a szeme a képernyőtől. Megkérjük, hogy csukja be vagy takarja le az egyik szemét, hogy elszigetelje a másikat. Amíg a keresztre fókuszál, figyelje a villogó pontot a szeme sarkából, és nyomja meg a RETURN gombot, amikor az eltűnik a vakfoltban. A megtekintési távolságtól és a képernyő méretétől függően a villogó pont általában eléri a vakfoltot, mielőtt a képernyő közepére érne. Ezt mindkét szemmel felváltva kell elvégezni, amíg az utolsó két mérés konzisztens lesz. Kérjük, tartsa be a látótávolságot, miközben mindkét szemét teszteli. JEGYZET. Ha a pont soha nem tűnik el, az azt jelenti, hogy a szemed követi a pontot, ahelyett, hogy a kereszten maradna. Ehhez a teszthez tartsa a szemét a kereszten, miközben figyeli a villogó pontot a szeme sarkában. Eleinte nehéz, de gyakorlással könnyebbé válik.",is:"SKÝRING. Fyrir þetta skref, komdu nær, ef nauðsyn krefur, svo þú sért ekki lengra en tvöfalda skjábreiddina. Hvert auga hefur blindan blett. Við finnum þitt til að uppgötva hversu langt augað þitt er frá skjánum. Þú verður beðinn um að loka eða hylja annað augað til að einangra hitt. Á meðan þú einbeitir þér að krossinum, horfðu á flöktandi punktinn út úr augnkróknum og ýttu á RETURN þegar hann hverfur í blindblettinn þinn. Það fer eftir áhorfsfjarlægð og skjástærð, flöktandi punkturinn nær venjulega blinda blettinum þínum áður en hann kemst á miðjan skjáinn. Þú munt gera þetta með hverju auga, til skiptis, þar til síðustu tvær mælingar eru í samræmi. Vinsamlegast haltu skoðunarfjarlægð þinni þegar þú prófar bæði augun. ATH. Ef punkturinn hverfur aldrei þýðir það að augað þitt fylgir punktinum í stað þess að vera á krossinum. Þetta próf þarf að hafa augun á krossinum á meðan þú fylgist með flöktandi punktinum í augnkróknum. Það er erfitt í fyrstu, en verður auðveldara með æfingum.",id:"PENJELASAN. Untuk langkah ini, mendekatlah, jika perlu, sehingga jarak Anda tidak lebih dari dua kali lebar layar. Setiap mata mempunyai titik buta. Kami akan menemukan milik Anda untuk mengetahui seberapa jauh mata Anda dari layar. Anda akan diminta untuk menutup atau menutupi satu mata untuk mengisolasi mata lainnya. Saat Anda fokus pada salib, perhatikan titik yang berkedip-kedip dari sudut mata Anda, dan tekan RETURN ketika titik tersebut menghilang di titik buta Anda. Tergantung pada jarak pandang dan ukuran layar, titik yang berkedip biasanya akan mencapai titik buta Anda sebelum mencapai bagian tengah layar. Anda akan melakukan ini dengan setiap mata, secara bergantian, hingga dua pengukuran terakhir konsisten. Harap menjaga jarak pandang Anda saat Anda menguji kedua mata. CATATAN. Jika titik tersebut tidak pernah hilang, berarti mata Anda mengikuti titik tersebut, bukannya tetap terpaku pada salib. Tes ini mengharuskan Anda mengawasi salib sambil memantau titik yang berkedip-kedip di sudut mata Anda. Itu sulit pada awalnya, tetapi menjadi lebih mudah dengan latihan.",it:"SPIEGAZIONE. Per questo passaggio, avvicinati, se necessario, in modo da non essere più lontano del doppio della larghezza dello schermo. Ogni occhio ha un punto cieco. Troveremo il tuo per scoprire quanto è lontano il tuo occhio dallo schermo. Ti verrà chiesto di chiudere o coprire un occhio per isolare l'altro. Mentre ti concentri sulla croce, osserva il punto lampeggiante con la coda dell'occhio e premi INVIO quando scompare nel tuo punto cieco. A seconda della distanza di visione e delle dimensioni dello schermo, il punto lampeggiante di solito raggiungerà il tuo punto cieco prima di arrivare al centro dello schermo. Farai questo con ciascun occhio, alternando, fino a quando le ultime due misurazioni saranno coerenti. Si prega di mantenere la distanza di visione mentre si testano entrambi gli occhi. NOTA. Se il punto non scompare mai, significa che il tuo occhio sta seguendo il punto, invece di rimanere sulla croce. Questo test richiede di mantenere l'occhio sulla croce mentre si monitora il punto lampeggiante con la coda dell'occhio. È difficile all'inizio, ma diventa più facile con la pratica.",ja:"説明。この手順では、必要に応じて、画面幅の 2 倍を超えないように近づいてください。どの目にも盲点があります。私たちはあなたの目を見つけて、あなたの目が画面からどのくらい離れているかを調べます。片方の目を閉じるか覆うようにして、もう片方の目を隔離するように求められます。十字に焦点を合わせている間、目の端にちらつく点を観察し、それが死角に消えたら RETURN を押します。視聴距離と画面サイズに応じて、通常、ちらつきドットは画面の中央に到達する前に死角に到達します。最後の 2 つの測定値が一致するまで、これを各目で交互に行います。両目を検査するときは、観察距離を維持してください。注記。点が消えない場合は、目が十字に留まらずに点を追っていることを意味します。このテストでは、目の隅にあるちらつく点を監視しながら、十字から目を離さないようにする必要があります。最初は難しいですが、練習すると簡単になります。",kn:"ವಿವರಣೆ ಈ ಹಂತಕ್ಕಾಗಿ, ಅಗತ್ಯವಿದ್ದರೆ ಹತ್ತಿರ ಬನ್ನಿ, ಆದ್ದರಿಂದ ನೀವು ಪರದೆಯ ಅಗಲಕ್ಕಿಂತ ಎರಡು ಪಟ್ಟು ಹೆಚ್ಚು ದೂರವಿರುವುದಿಲ್ಲ. ಪ್ರತಿಯೊಂದು ಕಣ್ಣಿಗೂ ಒಂದು ಕುರುಡು ಮಚ್ಚೆ ಇರುತ್ತದೆ. ನಿಮ್ಮ ಕಣ್ಣು ಪರದೆಯಿಂದ ಎಷ್ಟು ದೂರದಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಕಂಡುಹಿಡಿಯಲು ನಾವು ನಿಮ್ಮದನ್ನು ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ. ಒಂದು ಕಣ್ಣನ್ನು ಮುಚ್ಚಲು ಅಥವಾ ಇನ್ನೊಂದನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ಮುಚ್ಚಲು ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ. ನೀವು ಶಿಲುಬೆಯ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸುತ್ತಿರುವಾಗ, ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಿಂದ ಮಿನುಗುವ ಬಿಂದುವನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾದಾಗ ಹಿಂತಿರುಗಿ ಒತ್ತಿರಿ. ನೋಡುವ ದೂರ ಮತ್ತು ಪರದೆಯ ಗಾತ್ರವನ್ನು ಅವಲಂಬಿಸಿ, ಮಿನುಗುವ ಚುಕ್ಕೆಯು ಸಾಮಾನ್ಯವಾಗಿ ಪರದೆಯ ಮಧ್ಯಭಾಗಕ್ಕೆ ಬರುವ ಮೊದಲು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್ ಅನ್ನು ತಲುಪುತ್ತದೆ. ಕೊನೆಯ ಎರಡು ಅಳತೆಗಳು ಸ್ಥಿರವಾಗುವವರೆಗೆ ನೀವು ಇದನ್ನು ಪ್ರತಿ ಕಣ್ಣಿನಿಂದ ಪರ್ಯಾಯವಾಗಿ ಮಾಡುತ್ತೀರಿ. ನೀವು ಎರಡೂ ಕಣ್ಣುಗಳನ್ನು ಪರೀಕ್ಷಿಸುವಾಗ ದಯವಿಟ್ಟು ನಿಮ್ಮ ವೀಕ್ಷಣಾ ಅಂತರವನ್ನು ಕಾಪಾಡಿಕೊಳ್ಳಿ. ಗಮನಿಸಿ. ಚುಕ್ಕೆ ಎಂದಿಗೂ ಕಣ್ಮರೆಯಾಗದಿದ್ದರೆ, ನಿಮ್ಮ ಕಣ್ಣು ಶಿಲುಬೆಯಲ್ಲಿ ಉಳಿಯುವ ಬದಲು ಚುಕ್ಕೆಯನ್ನು ಅನುಸರಿಸುತ್ತಿದೆ ಎಂದರ್ಥ. ಈ ಪರೀಕ್ಷೆಯು ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಲ್ಲಿ ಮಿನುಗುವ ಬಿಂದುವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವಾಗ ನಿಮ್ಮ ಕಣ್ಣನ್ನು ಶಿಲುಬೆಯ ಮೇಲೆ ಇರಿಸುವ ಅಗತ್ಯವಿದೆ. ಇದು ಮೊದಲಿಗೆ ಕಷ್ಟ, ಆದರೆ ಅಭ್ಯಾಸದೊಂದಿಗೆ ಸುಲಭವಾಗುತ್ತದೆ.",ko:"설명. 이 단계에서는 필요한 경우 더 가까이 다가가십시오. 그러면 화면 너비의 두 배를 넘지 않게 됩니다. 모든 눈에는 맹점이 있습니다. 우리는 당신의 눈이 화면에서 얼마나 멀리 떨어져 있는지 알아낼 것입니다. 다른 쪽 눈을 격리하기 위해 한쪽 눈을 감거나 가리라는 요청을 받게 됩니다. 십자가에 초점을 맞추면서 눈꼬리에서 깜박이는 점을 관찰하고, 그것이 사각지대 속으로 사라지면 RETURN을 누르십시오. 시청 거리와 화면 크기에 따라 깜박이는 점이 일반적으로 화면 중앙에 도달하기 전에 사각지대에 도달합니다. 마지막 두 측정값이 일치할 때까지 각 눈을 번갈아 가며 이 작업을 수행합니다. 양쪽 눈을 검사할 때는 시청거리를 유지하시기 바랍니다. 메모. 점이 결코 사라지지 않는다면, 당신의 눈이 십자가 위에 머물지 않고 점을 따르고 있다는 뜻입니다. 이 테스트에서는 눈 구석에 깜박이는 점을 모니터링하면서 십자가를 계속 주시해야 합니다. 처음에는 어렵지만 연습하면 쉬워집니다.",lt:"PAAIŠKINIMAS. Norėdami atlikti šį veiksmą, prieikite arčiau, kad būtumėte ne toliau nei dvigubai didesnis už ekrano plotį. Kiekviena akis turi akląją dėmę. Surasime jūsų, kad sužinotume, kiek toli jūsų akis yra nuo ekrano. Jūsų bus paprašyta uždaryti arba uždengti vieną akį, kad izoliuotumėte kitą. Kol sutelkiate dėmesį į kryžių, stebėkite mirksintį tašką akies kamputyje ir paspauskite GRĮŽTI, kai jis išnyks jūsų aklojoje zonoje. Priklausomai nuo žiūrėjimo atstumo ir ekrano dydžio, mirksintis taškas paprastai pasieks jūsų akląją tašką, kol pasieks ekrano vidurį. Tai darysite su kiekviena akimi, pakaitomis, kol paskutiniai du matavimai bus vienodi. Išlaikykite žiūrėjimo atstumą, kai tikrinate abi akis. PASTABA. Jei taškas niekada nedingsta, tai reiškia, kad jūsų akis seka tašką, o ne lieka ant kryžiaus. Atliekant šį testą reikia nuolat stebėti kryžių ir stebėti mirgantį tašką akies kamputyje. Iš pradžių tai sunku, bet praktikuojant tampa lengviau.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വിശദീകരണം. ഈ ഘട്ടത്തിനായി, ആവശ്യമെങ്കിൽ അടുത്ത് വരൂ, അതിനാൽ നിങ്ങൾ സ്‌ക്രീൻ വീതിയുടെ ഇരട്ടിയിലധികം അകലെയല്ല. ഓരോ കണ്ണിനും ഒരു അന്ധതയുണ്ട്. നിങ്ങളുടെ കണ്ണ് സ്ക്രീനിൽ നിന്ന് എത്ര ദൂരെയാണെന്ന് കണ്ടെത്താൻ നിങ്ങളുടേത് ഞങ്ങൾ കണ്ടെത്തും. നിങ്ങളോട് ഒരു കണ്ണ് അടയ്‌ക്കാനോ മറയ്‌ക്കാനോ ആവശ്യപ്പെടും. നിങ്ങൾ കുരിശിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കുമ്പോൾ, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിൽ നിന്ന് മിന്നുന്ന ഡോട്ട് കാണുക, അത് നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അപ്രത്യക്ഷമാകുമ്പോൾ റിട്ടേൺ അമർത്തുക. കാണുന്ന ദൂരത്തെയും സ്‌ക്രീൻ വലുപ്പത്തെയും ആശ്രയിച്ച്, സ്‌ക്രീനിൻ്റെ മധ്യഭാഗത്ത് എത്തുന്നതിന് മുമ്പ് മിന്നുന്ന ഡോട്ട് സാധാരണയായി നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിൽ എത്തും. അവസാന രണ്ട് അളവുകൾ സ്ഥിരമാകുന്നതുവരെ നിങ്ങൾ ഇത് ഓരോ കണ്ണിലും ഒന്നിടവിട്ട് ചെയ്യും. രണ്ട് കണ്ണുകളും പരിശോധിക്കുമ്പോൾ നിങ്ങളുടെ കാഴ്ച അകലം പാലിക്കുക. കുറിപ്പ്. ഡോട്ട് ഒരിക്കലും അപ്രത്യക്ഷമാകുന്നില്ലെങ്കിൽ, നിങ്ങളുടെ കണ്ണ് കുരിശിൽ നിൽക്കുന്നതിന് പകരം ഡോട്ടിനെ പിന്തുടരുന്നു എന്നാണ് അർത്ഥമാക്കുന്നത്. നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിലുള്ള മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുമ്പോൾ നിങ്ങളുടെ കണ്ണ് കുരിശിൽ സൂക്ഷിക്കാൻ ഈ പരിശോധന ആവശ്യമാണ്. ഇത് ആദ്യം ബുദ്ധിമുട്ടാണ്, പക്ഷേ പരിശീലനത്തിലൂടെ എളുപ്പമാകും.",no:"FORKLARING. For dette trinnet, kom nærmere, om nødvendig, slik at du ikke er lenger enn to ganger skjermbredden. Hvert øye har en blindsone. Vi finner din for å finne ut hvor langt øyet ditt er fra skjermen. Du vil bli bedt om å lukke eller dekke det ene øyet for å isolere det andre. Mens du fokuserer på korset, se den flimrende prikken ut av øyekroken, og trykk RETURN når den forsvinner inn i blindsonen din. Avhengig av visningsavstand og skjermstørrelse, vil den flimrende prikken vanligvis nå blindsonen din før den kommer til midten av skjermen. Du vil gjøre dette med hvert øye, alternerende, til de to siste målingene er konsistente. Vennligst hold visningsavstanden mens du tester begge øynene. NOTE. Hvis prikken aldri forsvinner, betyr det at øyet ditt følger prikken, i stedet for å holde seg på korset. Denne testen krever at du holder øye med korset mens du overvåker den flimrende prikken i øyekroken. Det er vanskelig i begynnelsen, men blir lettere med trening.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"WYJAŚNIENIE. W tym kroku podejdź bliżej, jeśli to konieczne, tak aby nie znaleźć się dalej niż dwukrotność szerokości ekranu. Każde oko ma ślepą plamkę. Znajdziemy Twoje, aby sprawdzić, jak daleko Twoje oko znajduje się od ekranu. Zostaniesz poproszony o zamknięcie lub zasłonięcie jednego oka, aby odizolować drugie. Skupiając się na krzyżu, obserwuj migoczącą kropkę kątem oka i naciśnij POWRÓT, gdy zniknie w twoim martwym punkcie. W zależności od odległości oglądania i rozmiaru ekranu migocząca kropka zwykle dociera do martwego punktu, zanim dotrze do środka ekranu. Będziesz to robić naprzemiennie z każdym okiem, aż dwa ostatnie pomiary będą spójne. Podczas badania obu oczu zachowaj odległość widzenia. NOTATKA. Jeśli kropka nigdy nie znika, oznacza to, że Twoje oko podąża za kropką, zamiast pozostać na krzyżu. W tym teście musisz trzymać wzrok na krzyżu, jednocześnie obserwując migoczącą kropkę w kąciku oka. Na początku jest to trudne, ale wraz z praktyką staje się łatwiejsze.",pt:"EXPLICAÇÃO. Para esta etapa, aproxime-se, se necessário, para não ultrapassar o dobro da largura da tela. Cada olho tem um ponto cego. Encontraremos o seu para descobrir a que distância seu olho está da tela. Você será solicitado a fechar ou cobrir um olho para isolar o outro. Enquanto você foca na cruz, observe o ponto tremeluzente no canto do olho e pressione RETURN quando ele desaparecer no seu ponto cego. Dependendo da distância de visualização e do tamanho da tela, o ponto trêmulo normalmente atingirá seu ponto cego antes de chegar ao meio da tela. Você fará isso com cada olho, alternando, até que as duas últimas medidas sejam consistentes. Por favor, mantenha a distância de visualização enquanto testa ambos os olhos. OBSERVAÇÃO. Se o ponto nunca desaparecer, significa que o seu olho está seguindo o ponto, em vez de permanecer na cruz. Este teste exige que você fique de olho na cruz enquanto monitora o ponto tremeluzente no canto do olho. Isso é difícil no começo, mas fica mais fácil com a prática.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"EXPLICACIÓN. Para este paso, acérquese, si es necesario, para no estar a más del doble del ancho de la pantalla. Cada ojo tiene un punto ciego. Encontraremos el suyo para descubrir qué tan lejos está su ojo de la pantalla. Se le pedirá que cierre o cubra un ojo para aislar el otro. Mientras se enfoca en la cruz, observe el punto parpadeante con el rabillo del ojo y presione RETURN cuando desaparezca en su punto ciego. Dependiendo de la distancia de visualización y el tamaño de la pantalla, el punto parpadeante generalmente alcanzará su punto ciego antes de llegar al centro de la pantalla. Hará esto con cada ojo, alternando, hasta que las dos últimas mediciones sean consistentes. Por favor, mantenga su distancia de visualización mientras prueba ambos ojos. NOTA. Si el punto nunca desaparece, significa que su ojo está siguiendo el punto, en lugar de quedarse en la cruz. Esta prueba requiere que mantenga su ojo en la cruz mientras monitorea el punto parpadeante en el rabillo del ojo. Eso es difícil al principio, pero se vuelve más fácil con la práctica.",sw:"MAELEZO. Kwa hatua hii, njoo karibu, ikiwa ni lazima, ili usiwe mbali zaidi ya upana wa skrini mara mbili. Kila jicho lina upofu. Tutapata yako ili kugundua jinsi jicho lako lilivyo mbali na skrini. Utaulizwa kufunga au kufunika jicho moja ili kutenga jingine. Unapoangazia msalaba, tazama nukta inayopepea kutoka kwenye kona ya jicho lako, na ugonge RUDISHA inapopotea kwenye upofu wako. Kulingana na umbali wa kutazama na saizi ya skrini, nukta inayopepea kwa kawaida itafikia eneo lako la upofu kabla ya kufika katikati ya skrini. Utafanya hivi kwa kila jicho, ukibadilishana, hadi vipimo viwili vya mwisho vifanane. Tafadhali tunza umbali wako wa kutazama unapojaribu macho yote mawili. KUMBUKA. Ikiwa nukta haipotei kamwe, inamaanisha kwamba jicho lako linafuata dot, badala ya kukaa juu ya msalaba. Jaribio hili linahitaji uweke jicho lako kwenye msalaba huku ukifuatilia nukta inayopepea kwenye kona ya jicho lako. Hiyo ni ngumu mwanzoni, lakini inakuwa rahisi na mazoezi.",sv:"FÖRKLARING. För det här steget, kom närmare, om det behövs, så att du inte är längre än dubbelt så stor skärmbredd. Varje öga har en blind fläck. Vi hittar din för att upptäcka hur långt ditt öga är från skärmen. Du kommer att bli ombedd att stänga eller täcka ett öga för att isolera det andra. Medan du fokuserar på korset, titta på den flimrande pricken i ögonvrån och tryck på RETURN när den försvinner i din döda vinkel. Beroende på visningsavstånd och skärmstorlek kommer den flimrande punkten vanligtvis att nå din döda vinkel innan den når mitten av skärmen. Du kommer att göra detta med varje öga, omväxlande, tills de två sista mätningarna är konsekventa. Vänligen håll ditt synavstånd när du testar båda ögonen. NOTERA. Om pricken aldrig försvinner betyder det att ditt öga följer pricken, istället för att stanna på korset. Detta test kräver att du håller ögat på korset samtidigt som du övervakar den flimrande punkten i ögonvrån. Det är svårt i början, men det blir lättare med träning.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"AÇIKLAMA. Bu adım için gerekirse yaklaşın, böylece ekran genişliğinin iki katından daha uzakta olmayacaksınız. Her gözün bir kör noktası vardır. Gözünüzün ekrandan ne kadar uzakta olduğunu keşfetmek için sizinkini bulacağız. Diğerini izole etmek için bir gözünüzü kapatmanız veya kapatmanız istenecektir. Çarmıha odaklanırken gözünüzün ucuyla titreyen noktayı izleyin ve kör noktanızda kaybolduğunda RETURN tuşuna basın. İzleme mesafesine ve ekran boyutuna bağlı olarak, titreyen nokta genellikle ekranın ortasına gelmeden kör noktanıza ulaşacaktır. Son iki ölçüm tutarlı olana kadar bunu her gözünüzle dönüşümlü olarak yapacaksınız. Lütfen her iki gözünüzü test ederken görüş mesafenizi koruyun. NOT. Nokta hiç kaybolmuyorsa bu, gözünüzün haç üzerinde kalmak yerine noktayı takip ettiği anlamına gelir. Bu test, gözünüzün köşesinde titreşen noktayı izlerken gözünüzü artı üzerinde tutmanızı gerektirir. Bu ilk başta zordur, ancak pratik yaptıkça kolaylaşır.",ur:"وضاحت اس قدم کے لیے، اگر ضروری ہو تو قریب آئیں، تاکہ آپ اسکرین کی چوڑائی سے دوگنا دور نہ ہوں۔ ہر آنکھ کا ایک اندھا دھبہ ہوتا ہے۔ آپ کی آنکھ اسکرین سے کتنی دور ہے یہ جاننے کے لیے ہم آپ کو تلاش کریں گے۔ آپ کو دوسری آنکھ کو الگ کرنے کے لیے ایک آنکھ بند کرنے یا ڈھانپنے کو کہا جائے گا۔ جب آپ صلیب پر توجہ مرکوز کرتے ہیں، تو اپنی آنکھ کے کونے سے ٹمٹماتے نقطے کو دیکھیں، اور جب یہ آپ کے بلائنڈ سپاٹ میں غائب ہو جائے تو واپسی کو دبائیں۔ دیکھنے کے فاصلے اور اسکرین کے سائز پر منحصر ہے، ٹمٹماتا نقطہ عام طور پر اسکرین کے بیچ میں آنے سے پہلے آپ کے بلائنڈ سپاٹ تک پہنچ جائے گا۔ آپ یہ ہر آنکھ کے ساتھ کریں گے، باری باری، جب تک کہ آخری دو پیمائشیں برابر نہ ہوں۔ براہ کرم اپنی دونوں آنکھوں کی جانچ کرتے وقت دیکھنے کا فاصلہ برقرار رکھیں۔ نوٹ۔ اگر نقطہ کبھی غائب نہیں ہوتا ہے، تو اس کا مطلب ہے کہ آپ کی آنکھ صلیب پر رہنے کے بجائے نقطے کی پیروی کر رہی ہے۔ اس ٹیسٹ کے لیے ضروری ہے کہ آپ اپنی آنکھ کے کونے میں ٹمٹماتے نقطے کی نگرانی کرتے ہوئے اپنی نظر صلیب پر رکھیں۔ یہ سب سے پہلے مشکل ہے، لیکن مشق کے ساتھ آسان ہو جاتا ہے."},RC_viewingDistanceTitle:{"en-US":"Measure Viewing Distance",ar:"قياس مسافة المشاهدة",hy:"Չափել դիտման հեռավորությունը",bg:"Измерете разстоянието за гледане","zh-CN":"测量观看距离","zh-HK":"測量觀看距離",hr:"Izmjerite udaljenost gledanja",cs:"Změřte pozorovací vzdálenost",da:"Mål synsafstand",nl:"Meet de kijkafstand","en-UK":"Measure Viewing Distance",fi:"Mittaa katseluetäisyys",fr:"Mesurer la distance de visionnement",de:"Messen Sie den Betrachtungsabstand",el:"Μετρήστε την απόσταση θέασης",he:"מדידת מרחק צפייה",hi:"देखने की दूरी मापें",hu:"Mérje meg a nézési távolságot",is:"Mæla útsýnisfjarlægð",id:"Ukur Jarak Pandang",it:"Misura la distanza di visione",ja:"視聴距離の測定",kn:"ವೀಕ್ಷಣಾ ದೂರವನ್ನು ಅಳೆಯಿರಿ",ko:"시청 거리 측정",lt:"Išmatuokite žiūrėjimo atstumą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാണാനുള്ള ദൂരം അളക്കുക",no:"Mål visningsavstand",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierz odległość oglądania",pt:"Medir a distância de visualização",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Medir la distancia de visualización",sw:"Pima Umbali wa Kutazama",sv:"Mät betraktningsavstånd",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Görüş Mesafesini Ölçün",ur:"دیکھنے کے فاصلے کی پیمائش کریں۔"},T_proceed:{"en-US":"Proceed",ar:"تابع",hy:"Շարունակել",bg:"Продължете","zh-CN":"继续","zh-HK":"繼續",hr:"Nastavi",cs:"Pokračovat",da:"Fortsætte",nl:"Doorgaan","en-UK":"Proceed",fi:"Edetä",fr:"Procéder",de:"Fortfahren",el:"Προχωρώ",he:"לְהִתְקַדֵם",hi:"आगे बढ़ना",hu:"Folytassa",is:"Haltu áfram",id:"Melanjutkan",it:"Procedi",ja:"進む",kn:"ಮುಂದುವರೆಯಿರಿ",ko:"진행하다",lt:"Tęskite",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"തുടരുക",no:"Fortsette",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Przystępować",pt:"Prosseguir",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Proceder",sw:"Endelea",sv:"Fortsätta",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"İlerlemek",ur:"آگے بڑھیں۔"}},Ga=(e,{showIcon:t})=>({icon:t?"info":void 0,allowEscapeKey:!1,allowEnterKey:!1,allowOutsideClick:!1,showConfirmButton:!0,confirmButtonText:Wa.T_proceed[e.L],showClass:{popup:"fadeInUp",icon:""},hideClass:{popup:"fadeOutDown"},iconColor:e._CONST.COLOR.ORANGE,confirmButtonColor:"#aaa",customClass:{popup:"my__swal2__container",icon:"my__swal2__icon",title:"my__swal2__title",htmlContainer:`my__swal2__html rc-lang-${e.LD.toLowerCase()}`,confirmButton:"rc-button rc-go-button"}});let qa;"mocha"!==E._&&(qa=__webpack_require__(477).l);function Ha(e,t,n=!1,a=void 0){const i=t.control;let s=e._CONST.N.PPI_DONT_USE;e.screenPpi&&(s=e.screenPpi.value);let r=!0,o=[],l=0;const u=document.createElement("div");u.innerHTML='',e.background.appendChild(u),e._constructFloatInstructionElement("blind-spot-instruction",U.H.RC_distanceTrackingCloseL[e.L]),e._addCreditOnBackground(U.H.RC_viewingBlindSpotCredit[e.L]);const c=document.querySelector("#blind-spot-canvas"),h=c.getContext("2d"),d=document.getElementById("blind-spot-instruction");let p="left";e._setFloatInstructionElementPos(p,16);let m,f=Pa(p,c.width);const g=()=>{c.width=window.innerWidth,c.height=window.innerHeight,c.style.width=`${c.width}px`,c.style.height=`${c.height}px`,f=Pa(p,c.width),m=Ua(p,f,c.width)},y=new ResizeObserver((()=>{g()}));y.observe(e.background),g();let b=m["left"===p?0:1],v=b,k=e._CONST.COLOR.DARK_RED,w="left"===p?1:-1,A=W(null,e.keypadHandler,(()=>{C()}),!1);const x=(t=!0)=>{r=!1,i&&function(e,t){document.getElementById(e).removeEventListener("mousedown",t),document.getElementById(e).removeEventListener("touchstart",t)}("blind-spot-canvas",F),y.unobserve(e.background),e._removeBackground(),!e._trackingSetupFinishedStatus.distance&&t&&(e._trackingSetupFinishedStatus.distance=!0,e.gazeTracker.checkInitialized("distance",!1)&&e.endDistance()),(0,j.l)(O),(0,j.l)(M,"keyup")},C=async()=>{if("mocha"!==E._&&qa(),l+=1,o.push({dist:(0,_.Nh)(Ka(b,f,s),t.decimalPlace),v:w,closedEyeSide:p,crossX:f,circleX:b,ppi:s,timestamp:performance.now()}),2===Math.floor(l/t.repeatTesting))if(function(e){const t=[],n=[];for(const a of e)"left"===a.closedEyeSide?t.push(a.dist):n.push(a.dist);const a=(0,_.G8)(t),i=(0,_.G8)(n);return Math.abs(a-i)<.2*Math.min(a,i)}(o)){const i={value:(0,_.Nh)((0,_.JZ)($a(o)),t.decimalPlace),timestamp:performance.now(),method:e._CONST.VIEW_METHOD.B,raw:{...o}};let s;e.newViewingDistanceData=i,s=n?"trackDistance":"measureDistance",x(!1),A(),t.calibrateTrackDistanceCheckBool?await e._checkDistance(a,i,s,t.checkCallback,t.calibrateTrackDistanceCheckCm,t.callbackStatic):(0,_.nB)(a,i)}else{l=0;const t=o[0];z(t.v,t.closedEyeSide,t.crossX),o=[],Ba.fire({...Ga(e,{showIcon:!1}),icon:void 0,html:U.H.RC_viewingBlindSpotRejected[e.L],allowEnterKey:!0})}else l%t.repeatTesting==0?(A(),A=W(null,e.keypadHandler,(()=>{C()}),!1),"left"===p?(p="right",d.innerHTML=U.H.RC_distanceTrackingCloseR[e.L]):(p="left",d.innerHTML=U.H.RC_distanceTrackingCloseL[e.L]),e._setFloatInstructionElementPos(p,16),z(1,p,Pa(p,c.width),!1,!0)):(w=-w,D(p,m))};let S=!1,T=null;const I=t=>{S||(N(),S=!0,k=e._CONST.COLOR.RED,T=setInterval((()=>{"ArrowLeft"===t.key?(b-=10,R()):"ArrowRight"===t.key&&(b+=10,R())}),30))},N=()=>{S=!1,k=e._CONST.COLOR.DARK_RED,T&&(clearInterval(T),T=null)},R=()=>{v=(0,_.AU)(b,...m),b=v},D=(e,t)=>{const n=t["left"===e?0:1],a=Math.abs(t[1]-t[0])/4;let i=(0,_.Av)(n-a,n+a);(i-t[0])*(i-t[1])>0&&(i=2*n-i),b=i},z=(t,n,a,i=!0,s=!0)=>{w=t,p=n,f=a,m=Ua(p,f,c.width),i&&(d.innerHTML="left"===p?U.H.RC_distanceTrackingCloseL[e.L]:U.H.RC_distanceTrackingCloseR[e.L],e._setFloatInstructionElementPos(p,16)),s&&(b=m["left"===p?0:1],D(n,m))},O=(0,j.m)({Escape:t.showCancelButton?x:void 0,Enter:C," ":C,ArrowLeft:i?I:_.Md,ArrowRight:i?I:_.Md}),M=(0,j.m)({ArrowLeft:i?N:_.Md,ArrowRight:i?N:_.Md},"keyup");(0,V.F)(e.L,e.background,{go:C,cancel:t.showCancelButton?x:void 0,custom:{callback:()=>{Ba.fire({...Ga(e,{showIcon:!1}),icon:void 0,html:U.H.RC_viewingDistanceIntroLiMethod[e.L],allowEnterKey:!0})},content:U.H.RC_viewingDistanceIntroTitle[e.L]}},e.params.showCancelButton);const B={x:null,circleX:null},F=t=>{const n=!!t.touches?.[0];let a,i;if(n||t.preventDefault(),n?(a=t.touches[0].clientX,i=t.touches[0].clientY):(a=t.clientX,i=t.clientY),s=b,r=c.height/2,o=a,l=i,(0,_.ll)(s,r,o,l)>1){B.x=a,B.circleX=b;const i=document.getElementById("blind-spot-canvas");k=e._CONST.COLOR.RED,i.classList.replace("cursor-grab","cursor-grabbing");const s=e=>{let a;t.preventDefault(),e.preventDefault(),a=n?e.touches[0].clientX:e.clientX,b=B.circleX+a-B.x,b=(0,_.AU)(b,...Ua(p,f,c.width))};n?document.addEventListener("touchmove",s):document.addEventListener("mousemove",s);const r=()=>{n?(document.removeEventListener("touchend",r),document.removeEventListener("touchmove",s)):(document.removeEventListener("mouseup",r),document.removeEventListener("mousemove",s)),B.x=null,B.circleX=null,k=e._CONST.COLOR.DARK_RED,i.classList.replace("cursor-grabbing","cursor-grab")};n?document.addEventListener("touchend",r):document.addEventListener("mouseup",r)}var s,r,o,l};i&&function(e,t){document.getElementById(e).addEventListener("mousedown",t),document.getElementById(e).addEventListener("touchstart",t)}("blind-spot-canvas",F);const L=performance.now();let P=L;const G=()=>{h.clearRect(0,0,c.width,c.height),ja(h,f,c.height/2),P=performance.now(),function(e,t,n,a,i,s,r=!0){t.beginPath(),t.arc(n,a,Va>>1,0,2*Math.PI),t.closePath(),t.fillStyle=r?i%125<63?s:"#fff":s,t.fill()}(0,h,b,c.height/2,Math.round(P-L),k,t.sparkle),i||(b+=5*w,R()),r?requestAnimationFrame(G):h.clearRect(0,0,c.width,c.height)};requestAnimationFrame(G)}function Ka(e,t,n){return Math.abs(t-e)/n/(a=15,Math.tan(a*Math.PI/180))/.3937;var a}function $a(e){const t=[];for(const n of e)t.push(n.dist);return t}function Za(e,t={framerate:60,break:!1}){let n=0,a=0,i=0;const s=1e3/t.framerate,r=()=>{t.break||requestAnimationFrame(r),n=performance.now(),i=n-a,i>s&&(a=n-i%s,e())};requestAnimationFrame(r)}E.A.prototype.measureDistance=function(e={},t=void 0){if(!this.checkInitialized())return;let n;(0,_.$k)(),n=(e.control,U.H.RC_viewingDistanceIntroLiMethod[this.L]);const a=Object.assign({fullscreen:!1,repeatTesting:1,sparkle:!0,decimalPlace:1,control:!0,headline:`📏 ${U.H.RC_viewingDistanceTitle[this.L]}`,description:n,check:!1,checkCallback:!1,showCancelButton:!0},e);this.getFullscreen(a.fullscreen),this._addBackground(),this._replaceBackground((0,_.$O)(a.headline,null,!0,"")),Ha(this,a,!1,t)};var Xa=__webpack_require__(2646);const Ya=async e=>{if(navigator.permissions?.query)return navigator.permissions.query({name:"camera"}).then((async t=>{if("prompt"===t.state)return await Ba.fire({...Ga(e,{showIcon:!1}),icon:void 0,imageUrl:"data:image/png;base64,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",imageWidth:480,imageAlt:"Please allow camera access",html:`${U.H.RC_requestCamera[e.L]}
      ${U.H.RC_privacyCamera[e.L]}`})})).catch((e=>{}))},Qa={video:!1};E.A.prototype.trackDistance=async function(e={},t=void 0,n=void 0){if(!this.checkInitialized())return;let a;(0,_.$k)(),!1===this.gazeTracker.webgazer.getTracker().modelLoaded&&this.gazeTracker.webgazer.getTracker().loadModel(),a=(void 0!==e.control&&e.control,U.H.RC_viewingDistanceIntroLiMethod[this.L]);const i=Object.assign({fullscreen:!1,repeatTesting:1,sparkle:!0,pipWidthPx:this._CONST.N.VIDEO_W[this.isMobile.value?"MOBILE":"DESKTOP"],showVideo:!0,showFaceOverlay:!1,decimalPlace:1,framerate:3,desiredDistanceCm:void 0,desiredDistanceTolerance:1.2,desiredDistanceMonitor:!1,desiredDistanceMonitorCancelable:!1,desiredDistanceMonitorAllowRecalibrate:!0,nearPoint:!0,showNearPoint:!1,control:!0,headline:`📏 ${U.H.RC_distanceTrackingTitle[this.L]}`,description:U.H.RC_distanceTrackingIntroStart[this.L]+(0,Xa.G)(this.L)+a+(0,Xa.G)(this.L)+U.H.RC_distanceTrackingIntroEnd[this.L],check:!1,checkCallback:null,showCancelButton:!0,callbackStatic:t},e);try{this.viewingDistanceAllowedPreciseBool=e.viewingDistanceAllowedPreciseBool}catch(e){this.viewingDistanceAllowedPreciseBool=!1}if(this.getFullscreen(i.fullscreen),this.gazeTracker.checkInitialized("distance"))return this.gazeTracker._toFixedN=i.decimalPlace,this.showNearPoint(i.showNearPoint),this.showVideo(i.showVideo),void this.showFaceOverlay(i.showFaceOverlay);this._addBackground(),this._constructFloatInstructionElement("gaze-system-instruction",U.H.RC_starting[this.L]),await Ya(this);const s=(e,n=!0)=>{this.showVideo(Qa.video),Qa.video=!1,this.gazeTracker.checkInitialized("gaze",!1)&&this.showGazer(r),n&&(0,_.nB)(t,e),ni.current=e},r=this.gazeTracker.webgazer.params.showGazeDot,o=async()=>{this._addBackground(),this._replaceBackground((0,_.$O)(i.headline,null,!0,"")),this.gazeTracker.checkInitialized("gaze",!1)&&this.showGazer(!1),Ha(this,i,!0,s)};ti.pipWidthPx=i.pipWidthPx,ti.decimalPlace=i.decimalPlace,ti.framerate=i.framerate,ti.nearPoint=i.nearPoint,ti.showNearPoint=i.showNearPoint,ti.desiredDistanceCm=i.desiredDistanceCm,ti.desiredDistanceTolerance=i.desiredDistanceTolerance,ti.desiredDistanceMonitor=i.desiredDistanceMonitor,ti.desiredDistanceMonitorCancelable=i.desiredDistanceMonitorCancelable,ti.desiredDistanceMonitorAllowRecalibrate=i.desiredDistanceMonitorAllowRecalibrate,Qa.video=i.showVideo,this.gazeTracker._init({toFixedN:1,showVideo:!0,showFaceOverlay:i.showFaceOverlay},"distance"),this._trackingSetupFinishedStatus.distance=!1;const l={options:i,callbackStatic:t,callbackTrack:n};i.nearPoint?Ja(this,(()=>this._measurePD({},o)),n,l):Ja(this,o,n,l)},E.A.prototype.setViewingDistanceAllowedPreciseBool=function(e=!0){this.viewingDistanceAllowedPreciseBool=e};const Ja=async(e,t,n,a)=>{await e.gazeTracker.webgazer.getTracker().loadModel(),e.gazeTracker.beginVideo({pipWidthPx:ti.pipWidthPx},(()=>{e._removeFloatInstructionElement(),(0,_.nB)(t),hi(e,ti,n,a)}))},ei=(e,t)=>Math.hypot(e.x-t.x,e.y-t.y,e.z-t.z),ti={pipWidthPx:0,decimalPlace:2,framerate:3,nearPoint:!0,showNearPoint:!1,desiredDistanceCm:void 0,desiredDistanceTolerance:1.2,desiredDistanceMonitor:!1,desiredDistanceMonitorCancelable:!1,desiredDistanceMonitorAllowRecalibrate:!0},ni={current:null};let ai=null,ii=null,si=null;const ri={framerate:20,break:!0};let oi=null,li=!1,ui=0,ci=1;const hi=async(e,t,n,a)=>{(0,_.yy)(1e3).then((async()=>{let i;ui=0,ci=1;const s=await e.gazeTracker.webgazer.getTracker().model,r=e.screenPpi?e.screenPpi.value:e._CONST.N.PPI_DONT_USE;!e.screenPpi&&t.nearPoint,t.nearPoint&&t.showNearPoint&&(oi=document.createElement("div"),oi.id="rc-near-point-dot",document.body.appendChild(oi),Object.assign(oi.style,{display:"block",zIndex:999999,width:"10px",height:"10px",background:"green",position:"fixed",top:"-15px",left:"-15px"})),li=!1;const{desiredDistanceCm:o,desiredDistanceTolerance:l,desiredDistanceMonitor:u,desiredDistanceMonitorCancelable:c,desiredDistanceMonitorAllowRecalibrate:h}=t;e._distanceTrackNudging.distanceCorrectEnabled=!0,e._distanceTrackNudging.distanceDesired=o,e._distanceTrackNudging.distanceAllowedRatio=l,si=async()=>{ii||(ii=document.getElementById("webgazerVideoCanvas"));const l=performance.now();if(i=await s.estimateFaces(ii),i.length){e._trackingVideoFrameTimestamps.distance+=l;const s=i[0].keypoints;if(5===ci){if(ui+=ei(s[133],s[362]),ui/=5,e._trackingVideoFrameTimestamps.distance/=5,null!==ni.current){if(!ai){const t=pi(r),n=Math.sqrt(ni.current.value**2-t**2);ni.current.value=n,ai=ui*ni.current.value,!0!==a.options.calibrateTrackDistanceCheckBool&&e._removeBackground(),e._trackingSetupFinishedStatus.distance=!0,li=!0}const i=performance.now(),l=Math.round(i-e._trackingVideoFrameTimestamps.distance),d={value:(0,_.Nh)(ai/ui,t.decimalPlace),timestamp:i,method:e._CONST.VIEW_METHOD.F,latencyMs:l};let p;e.newViewingDistanceData=d,(li||u)&&(o&&e.nudgeDistance(c,h,a),li=!1),t.nearPoint&&(p=di(e,t,ii,s,ui,i,r,l)),n&&"function"==typeof n&&(e.gazeTracker.defaultDistanceTrackCallback=n,n({value:{viewingDistanceCm:d.value,nearPointCm:p?p.value:[null,null],latencyMs:l},timestamp:i,method:e._CONST.VIEW_METHOD.F}))}ui=0,ci=1,e._trackingVideoFrameTimestamps.distance=0}else ui+=ei(s[133],s[362]),++ci}},ri.break=!1,ri.framerate=5*t.framerate,Za(si,ri)}))},di=(e,t,n,a,i,s,r,o)=>{const l=((e,t,n)=>[(-t.x-n.x+e.videoWidth)/2,(-t.y-n.y+e.videoHeight)/2])(n,a[133],a[362]);l.forEach(((t,n)=>{l[n]=(e.PDCm?e.PDCm.value:e._CONST.N.PD_DONT_USE)*t/i}));const u={value:{x:(0,_.Nh)(l[0],t.decimalPlace),y:(0,_.Nh)(l[1]+screen.height/2*2.54/r,t.decimalPlace),latencyMs:o},timestamp:s};e.newNearPointData=u;if(t.showNearPoint){const e=u.value.x*r/2.54,t=u.value.y*r/2.54;Object.assign(oi.style,{left:screen.width/2-window.screenLeft+e-5+"px",top:screen.height/2-window.screenTop-(window.outerHeight-window.innerHeight)-t-5+"px"})}return u};E.A.prototype.pauseDistance=function(){return this.gazeTracker.checkInitialized("distance",!0)&&!this._trackingPaused.distance?(ri.break=!0,oi&&(oi.style.display="none"),this._trackingVideoFrameTimestamps.distance=0,this._trackingPaused.distance=!0,this.pauseNudger(),this):null},E.A.prototype.resumeDistance=function(){return this.gazeTracker.checkInitialized("distance",!0)&&this._trackingPaused.distance?(ri.break=!1,oi&&(oi.style.display="block"),ui=0,ci=1,this._trackingVideoFrameTimestamps.distance=0,Za(si,ri),this._trackingPaused.distance=!1,this.resumeNudger(),this):null},E.A.prototype.endDistance=function(e=!1,t=!0){return this.gazeTracker.checkInitialized("distance",!0)?(ri.break=!0,ri.framerate=20,ti.pipWidthPx=0,ti.decimalPlace=2,ti.framerate=3,ti.nearPoint=!0,ti.showNearPoint=!1,ti.desiredDistanceCm=void 0,ti.desiredDistanceTolerance=1.2,ti.desiredDistanceMonitor=!1,ti.desiredDistanceMonitorCancelable=!1,ti.desiredDistanceMonitorAllowRecalibrate=!0,ni.current=null,ai=null,ii=null,si=null,li=!1,this._trackingVideoFrameTimestamps.distance=0,this._trackingPaused.distance=!1,oi&&(document.body.removeChild(oi),oi=null),this.endNudger(),t&&this.gazeTracker.end("distance",e),this):null},E.A.prototype.getDistanceNow=async function(e=null){if(!this.checkInitialized()||!this.gazeTracker.checkInitialized("distance",!0)||!ri.break)return;const t=e||this.gazeTracker.defaultDistanceTrackCallback,n=document.querySelector("#webgazerVideoFeed"),a=await this.gazeTracker.webgazer.getTracker().model,i=performance.now(),s=await a.estimateFaces(n);if(s.length){const e=s[0].scaledMesh,a=ei(e[133],e[362]),r=performance.now(),o=r-i;this.newViewingDistanceData={value:(0,_.Nh)(ai/a,ti.decimalPlace),timestamp:r,method:this._CONST.VIEW_METHOD.F,latencyMs:o};const l=this.newViewingDistanceData;let u;return ti.nearPoint&&(u=di(this,ti,n,e,a,r,this.screenPpi?this.screenPpi.value:this._CONST.N.PPI_DONT_USE,o)),(0,_.nB)(t,{value:{viewingDistanceCm:l.value,nearPointCm:u?u.value:null,latencyMs:o},timestamp:r,method:this._CONST.VIEW_METHOD.F}),l}return null},E.A.prototype.showNearPoint=function(e=!0){if(this.gazeTracker.checkInitialized("distance",!1)){const t=document.querySelector("#rc-near-point-dot");t&&(t.display=e?"block":"none")}};const pi=e=>2.54*(window.screen.height/2/e);E.A.prototype.nudgeDistance=function(e,t,n){if(this.checkInitialized()&&this._distanceTrackNudging.distanceDesired){if(this.viewingDistanceCm&&this.viewingDistanceCm.method===this._CONST.VIEW_METHOD.F){if(!mi(this.viewingDistanceCm.value,this._distanceTrackNudging.distanceDesired,this._distanceTrackNudging.distanceAllowedRatio)){const a=()=>{this._removeNudger(),clearInterval(this._distanceTrackNudging.distanceCorrecting),this._distanceTrackNudging.distanceCorrecting=null,(0,j.l)(s)},i=async()=>{this.endDistance(),this._addBackground(),await(0,_.yy)(2e3),this.trackDistance(n.options,n.callbackStatic,n.callbackTrack)},s=(0,j.m)(e?{Escape:this.endNudger}:{});if(null===this._distanceTrackNudging.distanceCorrecting&&this._distanceTrackNudging.distanceCorrectEnabled){const[n,r,o,l]=fi(this);let u=e?{cancel:()=>{this.endNudger()}}:{};t&&(u={...u,custom:{callback:i,content:U.H.RC_distanceTrackingRedo[this.L]}}),(e||t)&&(0,V.F)(this.L,this.nudger,u,this.params.showCancelButton);const c=()=>{n.innerHTML=gi(this,this.viewingDistanceCm.value,this._distanceTrackNudging.distanceDesired),r.innerHTML=this.viewingDistanceAllowedPreciseBool?this.viewingDistanceCm.value.toFixed(1):Math.round(this.viewingDistanceCm.value),o.innerHTML=Math.round(this._distanceTrackNudging.distanceDesired),this._distanceTrackNudging.needEasyEyesKeypadBeyondCm&&this._distanceTrackNudging.distanceDesired>this._distanceTrackNudging.needEasyEyesKeypadBeyondCm?l.innerHTML=` ${U.H.RC_canUsePhoneKeypad[this.L]}`:l.innerHTML=""};c(),this._distanceTrackNudging.distanceCorrecting=setInterval((()=>{c(),mi(this.viewingDistanceCm.value,this._distanceTrackNudging.distanceDesired,this._distanceTrackNudging.distanceAllowedRatio)&&(a(),(0,j.l)(s))}),200)}else this._distanceTrackNudging.distanceCorrecting&&!this._distanceTrackNudging.distanceCorrectEnabled&&a();return!1}return!0}return!1}};const mi=(e,t,n)=>{if(!yi(n))return!1;const a=t*n,i=t/n;return e<=Math.max(a,i)&&e>=Math.min(a,i)},fi=e=>(e._addNudger(`
      \n

      \n

      ${U.H.RC_distanceTrackingGuide[e.L].replace("xx1",'').replace("xx2",'')}

      \n
      \n `),[document.querySelector("#rc-distance-correct-instruction"),document.querySelector("#rc-distance-now"),document.querySelector("#rc-distance-desired"),document.querySelector("#rc-can-use-keypad")]),gi=(e,t,n)=>t>=n?U.H.RC_distanceTrackingMoveCloser[e.L]:U.H.RC_distanceTrackingMoveFurther[e.L],yi=e=>!Number.isNaN(e)&&(e>0&&1!==e);E.A.prototype.setDistanceDesired=function(e,t=null,n=null){return this._distanceTrackNudging.distanceDesired=e,n&&(this._distanceTrackNudging.needEasyEyesKeypadBeyondCm=n),t&&yi(t)&&(this._distanceTrackNudging.distanceAllowedRatio=t),e},E.A.prototype._addNudger=function(e){if(null!==this.nudger)return;let t=document.getElementById("calibration-nudger");return t||(t=document.createElement("div"),t.id="calibration-nudger",t.className=`calibration-nudger rc-lang-${this.LD.toLowerCase()}`,document.body.classList.add("lock-view"),document.body.appendChild(t),t.style.background=this.params.backgroundColor),e&&(t.innerHTML=e),this._nudger.element=t,this.nudger},E.A.prototype._removeNudger=function(){const e=document.getElementById("calibration-nudger");return!!e&&(document.body.classList.remove("lock-view"),document.body.removeChild(e),this._nudger={element:null},!0)},E.A.prototype.pauseNudger=function(){document.body.classList.add("hide-nudger")},E.A.prototype.resumeNudger=function(){document.body.classList.remove("hide-nudger")},E.A.prototype.endNudger=function(){return!!this._distanceTrackNudging.distanceCorrectEnabled&&(this._removeNudger(),this._distanceTrackNudging.distanceCorrectEnabled=!1,this._distanceTrackNudging.distanceCorrecting&&clearInterval(this._distanceTrackNudging.distanceCorrecting),this._distanceTrackNudging.distanceCorrecting=null,this._distanceTrackNudging.distanceDesired=null,this._distanceAllowedRatio=null,!0)};function bi(e,t,n,a,i){const s=setInterval((()=>{const r=document.getElementById("webgazerVideoContainer");r&&(clearInterval(s),r.style.height=t/Number.parseInt(r.style.width)*Number.parseInt(r.style.height)+"px",r.style.width=`${t}px`,r.style.opacity=n,a.setVideoViewerSize(Number.parseInt(r.style.width),Number.parseInt(r.style.height)),vi(e,r),setTimeout((()=>{e.videoOpacity(),e.isMobile.value?r.style.transition="right 0.5s, top 0.5s, width 0.5s, height 0.5s, border-radius 0.5s":r.style.transition="left 0.5s, bottom 0.5s, width 0.5s, height 0.5s, border-radius 0.5s",(0,_.nB)(i)}),700))}),100)}function vi(e,t){e.isMobile.value?(t.style.left="unset",t.style.right=e._CONST.N.VIDEO_MARGIN,t.style.top=e._CONST.N.VIDEO_MARGIN,t.style.bottom="unset"):(t.style.left=e._CONST.N.VIDEO_MARGIN,t.style.right="unset",t.style.top="unset",t.style.bottom=e._CONST.N.VIDEO_MARGIN_BOTTOM)}const ki={video:!1,videoWidth:0,videoHeight:0,opacity:1,gaze:!1,faceOverlay:!1},wi=.9;E.A.prototype._measurePD=async function(e={},t=void 0){if(!this.checkInitialized())return;(0,_.$k)();const n=Object.assign({fullscreen:!1,headline:`👁️ ${U.H.RC_nearPointTitle[this.L]}`,description:U.H.RC_nearPointIntro[this.L],shortDescription:U.H.RC_nearPointIntro[this.L]},e);this.getFullscreen(n.fullscreen),await(0,_.yy)(1e3),this._replaceBackground(),this._replaceBackground((0,_.$O)(n.headline,n.shortDescription,!0));const a=this.screenPpi?this.screenPpi.value:this._CONST.N.PPI_DONT_USE,[i,s]=Ai(this),[r,o]=Si(this,a,i,s),l=(e=!0)=>{r.removeEventListener("mousedown",o),this._removeBackground(),this.showVideo(ki.video),this.showGazer(ki.gaze),this.showFaceOverlay(ki.faceOverlay),this.gazeTracker.webgazer.showFaceFeedbackBox(!0),Object.assign(document.querySelector("#webgazerVideoContainer").style,{height:ki.videoHeight,width:ki.videoWidth,opacity:ki.opacity,borderRadius:"5px"}),vi(this,document.querySelector("#webgazerVideoContainer")),Object.assign(document.querySelector("#webgazerVideoFeed").style,{height:ki.videoHeight,width:ki.videoWidth,top:"unset",transform:"scale(-1, 1)",transformOrigin:"unset"}),ki.video=!1,ki.videoWidth=0,ki.videoHeight=0,ki.opacity=1,ki.gaze=!1,ki.faceOverlay=!1,!this._trackingSetupFinishedStatus.distance&&e&&(this._trackingSetupFinishedStatus.distance=!0,this.endDistance()),(0,j.l)(c)},u=()=>{if(-100!==Ci){const e={value:2.54*Ci/a,timestamp:performance.now()};return this.newPDData=e,l(!1),(0,_.nB)(t,e)}},c=(0,j.m)({Escape:l,Enter:u," ":u});(0,V.F)(this.L,this.background,{go:u,cancel:l},this.params.showCancelButton),setTimeout((()=>{Ba.fire({...Ga(this,{showIcon:!1}),icon:void 0,imageUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAADwCAIAAABXFyDtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGx2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA3LTI0VDExOjU3OjU0LTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wOC0yNFQyMjoyNDo1MC0wNDowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wOC0yNFQyMjoyNDo1MC0wNDowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiMTIzYjE3ZS0wMzUzLTQ4YWEtOGJkYy0zNTk0YmRkODBjMjEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4MjdjNGM2Yi1jMzExLTE3NGQtYTgxZC0zZGUyN2JmMTgxYjAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNWZiNzMxNi1hNDFiLTQyZTYtYmJiNy0yYTY2ODgxMzI1YTAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjA1ZmI3MzE2LWE0MWItNDJlNi1iYmI3LTJhNjY4ODEzMjVhMCIgc3RFdnQ6d2hlbj0iMjAyMS0wNy0yNFQxMTo1Nzo1NC0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQ3MjQ3ZjY2LTllZjItNDgzNy1hMGYzLWFmNzdmZDBjNDUxMyIgc3RFdnQ6d2hlbj0iMjAyMS0wNy0yNFQxMjozNTo1My0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmIxMjNiMTdlLTAzNTMtNDhhYS04YmRjLTM1OTRiZGQ4MGMyMSIgc3RFdnQ6d2hlbj0iMjAyMS0wOC0yNFQyMjoyNDo1MC0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+e9Ws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",imageWidth:480,imageAlt:"Measurement Instruction",html:n.description})}),700)};const Ai=e=>{const t=document.querySelector("#webgazerVideoFeed");if(t)return xi(e,t,document.querySelector("#webgazerVideoCanvas"),document.querySelector("#webgazerVideoContainer"))},xi=(e,t,n,a,i=null)=>{const s=.3*window.innerWidth/Number.parseInt(t.style.width)*Number.parseInt(t.style.height);ki.videoWidth=a.style.width,ki.videoHeight=a.style.height,ki.opacity=a.style.opacity;const r={height:`${Math.round(s)}px`,width:`${Math.round(window.innerWidth*wi)}px`,opacity:1,borderRadius:"15px"};Object.assign(a.style,r),e.isMobile.value?Object.assign(a.style,{right:`${Math.round(.5*window.innerWidth*.09999999999999998)}px`,top:`${Math.round(.5*(window.innerHeight-s))}px`}):Object.assign(a.style,{left:`${Math.round(.5*window.innerWidth*.09999999999999998)}px`,bottom:`${Math.round(.5*(window.innerHeight-s))}px`});const o={height:`${Math.round(s*wi/.3)}px`,width:`${Math.round(window.innerWidth*wi)}px`,top:`${Math.round(.6000000000000001*-s)}px`,transform:"scale(-2, 2)",transformOrigin:"center"};return Object.assign(t.style,o),ki.video=e.gazeTracker.webgazer.params.showVideo,ki.gaze=e.gazeTracker.webgazer.params.showGazeDot,ki.faceOverlay=e.gazeTracker.webgazer.params.showFaceOverlay,ki.video||e.showVideo(!0),ki.gaze&&e.showGazer(!1),ki.faceOverlay&&e.showFaceOverlay(!1),e.gazeTracker.webgazer.showFaceFeedbackBox(!1),[window.innerWidth*wi,s]};let Ci=-100;const Si=(e,t,n,a)=>{const i=document.createElement("div");i.id="rc-ruler",Object.assign(i.style,{height:.9*(window.innerHeight-a)/2+"px",width:2*window.innerWidth+"px",left:.25*(window.innerWidth-n)+"px",bottom:0,backgroundColor:"#FFD523dd",borderRadius:"7px 0 0 0",boxSizing:"border-box",borderBottom:"5px solid #bb6600"}),e.background.appendChild(i);const s=document.createElement("div");s.id="rc-ruler-scales",i.appendChild(s);const r=2.54*(i.clientWidth-60)/t;for(let n=0;n<=10*(0,_.Nh)(r,1);n++){const a=document.createElement("div"),i=.1*n*t/2.54+"px";if(a.className="rc-ruler-scale "+(n%10==0?"rc-ruler-major":n%5==0?"rc-ruler-secondary":"rc-ruler-minor"),a.style.left=i,s.appendChild(a),n%10==0){const t=document.createElement("p");t.className="rc-ruler-scale-text",t.style.left=i,t.innerHTML=n/10,s.appendChild(t),0===n&&(t.style.color=e._CONST.COLOR.DARK_RED)}}let o=document.createElement("div");s.appendChild(o),o.outerHTML=z(),o=document.querySelector("#size-arrow"),o.setAttribute("preserveAspectRatio","none"),o.style.left="-100px",o.style.top="40px",document.getElementById("size-arrow-fill").setAttribute("fill",e._CONST.COLOR.DARK_RED);const l=e=>{Ci=e.offsetX-30,o.style.left=`${Ci}px`;const t=e=>{Ci=e.offsetX-30,o.style.left=`${Ci}px`};i.addEventListener("mousemove",t),i.addEventListener("mouseup",(function e(){i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",e)}))};return i.addEventListener("mousedown",l),[i,l]};function Ei(e){return Ei="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ei(e)}var _i=/^\s+/,Ti=/\s+$/;function Ii(e,t){if(t=t||{},(e=e||"")instanceof Ii)return e;if(!(this instanceof Ii))return new Ii(e,t);var n=function(e){var t={r:0,g:0,b:0},n=1,a=null,i=null,s=null,r=!1,o=!1;"string"==typeof e&&(e=function(e){e=e.replace(_i,"").replace(Ti,"").toLowerCase();var t,n=!1;if(Hi[e])e=Hi[e],n=!0;else if("transparent"==e)return{r:0,g:0,b:0,a:0,format:"name"};if(t=ss.rgb.exec(e))return{r:t[1],g:t[2],b:t[3]};if(t=ss.rgba.exec(e))return{r:t[1],g:t[2],b:t[3],a:t[4]};if(t=ss.hsl.exec(e))return{h:t[1],s:t[2],l:t[3]};if(t=ss.hsla.exec(e))return{h:t[1],s:t[2],l:t[3],a:t[4]};if(t=ss.hsv.exec(e))return{h:t[1],s:t[2],v:t[3]};if(t=ss.hsva.exec(e))return{h:t[1],s:t[2],v:t[3],a:t[4]};if(t=ss.hex8.exec(e))return{r:Yi(t[1]),g:Yi(t[2]),b:Yi(t[3]),a:ts(t[4]),format:n?"name":"hex8"};if(t=ss.hex6.exec(e))return{r:Yi(t[1]),g:Yi(t[2]),b:Yi(t[3]),format:n?"name":"hex"};if(t=ss.hex4.exec(e))return{r:Yi(t[1]+""+t[1]),g:Yi(t[2]+""+t[2]),b:Yi(t[3]+""+t[3]),a:ts(t[4]+""+t[4]),format:n?"name":"hex8"};if(t=ss.hex3.exec(e))return{r:Yi(t[1]+""+t[1]),g:Yi(t[2]+""+t[2]),b:Yi(t[3]+""+t[3]),format:n?"name":"hex"};return!1}(e));"object"==Ei(e)&&(rs(e.r)&&rs(e.g)&&rs(e.b)?(l=e.r,u=e.g,c=e.b,t={r:255*Zi(l,255),g:255*Zi(u,255),b:255*Zi(c,255)},r=!0,o="%"===String(e.r).substr(-1)?"prgb":"rgb"):rs(e.h)&&rs(e.s)&&rs(e.v)?(a=Ji(e.s),i=Ji(e.v),t=function(e,t,n){e=6*Zi(e,360),t=Zi(t,100),n=Zi(n,100);var a=Math.floor(e),i=e-a,s=n*(1-t),r=n*(1-i*t),o=n*(1-(1-i)*t),l=a%6,u=[n,r,s,s,o,n][l],c=[o,n,n,r,s,s][l],h=[s,s,o,n,n,r][l];return{r:255*u,g:255*c,b:255*h}}(e.h,a,i),r=!0,o="hsv"):rs(e.h)&&rs(e.s)&&rs(e.l)&&(a=Ji(e.s),s=Ji(e.l),t=function(e,t,n){var a,i,s;function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}if(e=Zi(e,360),t=Zi(t,100),n=Zi(n,100),0===t)a=i=s=n;else{var o=n<.5?n*(1+t):n+t-n*t,l=2*n-o;a=r(l,o,e+1/3),i=r(l,o,e),s=r(l,o,e-1/3)}return{r:255*a,g:255*i,b:255*s}}(e.h,a,s),r=!0,o="hsl"),e.hasOwnProperty("a")&&(n=e.a));var l,u,c;return n=$i(n),{ok:r,format:e.format||o,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}(e);this._originalInput=e,this._r=n.r,this._g=n.g,this._b=n.b,this._a=n.a,this._roundA=Math.round(100*this._a)/100,this._format=t.format||n.format,this._gradientType=t.gradientType,this._r<1&&(this._r=Math.round(this._r)),this._g<1&&(this._g=Math.round(this._g)),this._b<1&&(this._b=Math.round(this._b)),this._ok=n.ok}function Ni(e,t,n){e=Zi(e,255),t=Zi(t,255),n=Zi(n,255);var a,i,s=Math.max(e,t,n),r=Math.min(e,t,n),o=(s+r)/2;if(s==r)a=i=0;else{var l=s-r;switch(i=o>.5?l/(2-s-r):l/(s+r),s){case e:a=(t-n)/l+(t>1)+720)%360;--t;)a.h=(a.h+i)%360,s.push(Ii(a));return s}function qi(e,t){t=t||6;for(var n=Ii(e).toHsv(),a=n.h,i=n.s,s=n.v,r=[],o=1/t;t--;)r.push(Ii({h:a,s:i,v:s})),s=(s+o)%1;return r}Ii.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var e,t,n,a=this.toRgb();return e=a.r/255,t=a.g/255,n=a.b/255,.2126*(e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},setAlpha:function(e){return this._a=$i(e),this._roundA=Math.round(100*this._a)/100,this},toHsv:function(){var e=Ri(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=Ri(this._r,this._g,this._b),t=Math.round(360*e.h),n=Math.round(100*e.s),a=Math.round(100*e.v);return 1==this._a?"hsv("+t+", "+n+"%, "+a+"%)":"hsva("+t+", "+n+"%, "+a+"%, "+this._roundA+")"},toHsl:function(){var e=Ni(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=Ni(this._r,this._g,this._b),t=Math.round(360*e.h),n=Math.round(100*e.s),a=Math.round(100*e.l);return 1==this._a?"hsl("+t+", "+n+"%, "+a+"%)":"hsla("+t+", "+n+"%, "+a+"%, "+this._roundA+")"},toHex:function(e){return Di(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return function(e,t,n,a,i){var s=[Qi(Math.round(e).toString(16)),Qi(Math.round(t).toString(16)),Qi(Math.round(n).toString(16)),Qi(es(a))];if(i&&s[0].charAt(0)==s[0].charAt(1)&&s[1].charAt(0)==s[1].charAt(1)&&s[2].charAt(0)==s[2].charAt(1)&&s[3].charAt(0)==s[3].charAt(1))return s[0].charAt(0)+s[1].charAt(0)+s[2].charAt(0)+s[3].charAt(0);return s.join("")}(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:Math.round(this._r),g:Math.round(this._g),b:Math.round(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+")":"rgba("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:Math.round(100*Zi(this._r,255))+"%",g:Math.round(100*Zi(this._g,255))+"%",b:Math.round(100*Zi(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+Math.round(100*Zi(this._r,255))+"%, "+Math.round(100*Zi(this._g,255))+"%, "+Math.round(100*Zi(this._b,255))+"%)":"rgba("+Math.round(100*Zi(this._r,255))+"%, "+Math.round(100*Zi(this._g,255))+"%, "+Math.round(100*Zi(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(Ki[Di(this._r,this._g,this._b,!0)]||!1)},toFilter:function(e){var t="#"+zi(this._r,this._g,this._b,this._a),n=t,a=this._gradientType?"GradientType = 1, ":"";if(e){var i=Ii(e);n="#"+zi(i._r,i._g,i._b,i._a)}return"progid:DXImageTransform.Microsoft.gradient("+a+"startColorstr="+t+",endColorstr="+n+")"},toString:function(e){var t=!!e;e=e||this._format;var n=!1,a=this._a<1&&this._a>=0;return t||!a||"hex"!==e&&"hex6"!==e&&"hex3"!==e&&"hex4"!==e&&"hex8"!==e&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this._a?this.toName():this.toRgbString()},clone:function(){return Ii(this.toString())},_applyModification:function(e,t){var n=e.apply(null,[this].concat([].slice.call(t)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(Fi,arguments)},brighten:function(){return this._applyModification(Li,arguments)},darken:function(){return this._applyModification(Pi,arguments)},desaturate:function(){return this._applyModification(Oi,arguments)},saturate:function(){return this._applyModification(Mi,arguments)},greyscale:function(){return this._applyModification(Bi,arguments)},spin:function(){return this._applyModification(ji,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(Gi,arguments)},complement:function(){return this._applyCombination(Vi,arguments)},monochromatic:function(){return this._applyCombination(qi,arguments)},splitcomplement:function(){return this._applyCombination(Wi,arguments)},triad:function(){return this._applyCombination(Ui,[3])},tetrad:function(){return this._applyCombination(Ui,[4])}},Ii.fromRatio=function(e,t){if("object"==Ei(e)){var n={};for(var a in e)e.hasOwnProperty(a)&&(n[a]="a"===a?e[a]:Ji(e[a]));e=n}return Ii(e,t)},Ii.equals=function(e,t){return!(!e||!t)&&Ii(e).toRgbString()==Ii(t).toRgbString()},Ii.random=function(){return Ii.fromRatio({r:Math.random(),g:Math.random(),b:Math.random()})},Ii.mix=function(e,t,n){n=0===n?0:n||50;var a=Ii(e).toRgb(),i=Ii(t).toRgb(),s=n/100;return Ii({r:(i.r-a.r)*s+a.r,g:(i.g-a.g)*s+a.g,b:(i.b-a.b)*s+a.b,a:(i.a-a.a)*s+a.a})},Ii.readability=function(e,t){var n=Ii(e),a=Ii(t);return(Math.max(n.getLuminance(),a.getLuminance())+.05)/(Math.min(n.getLuminance(),a.getLuminance())+.05)},Ii.isReadable=function(e,t,n){var a,i,s=Ii.readability(e,t);switch(i=!1,(a=function(e){var t,n;t=((e=e||{level:"AA",size:"small"}).level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),"AA"!==t&&"AAA"!==t&&(t="AA");"small"!==n&&"large"!==n&&(n="small");return{level:t,size:n}}(n)).level+a.size){case"AAsmall":case"AAAlarge":i=s>=4.5;break;case"AAlarge":i=s>=3;break;case"AAAsmall":i=s>=7}return i},Ii.mostReadable=function(e,t,n){var a,i,s,r,o=null,l=0;i=(n=n||{}).includeFallbackColors,s=n.level,r=n.size;for(var u=0;ul&&(l=a,o=Ii(t[u]));return Ii.isReadable(e,o,{level:s,size:r})||!i?o:(n.includeFallbackColors=!1,Ii.mostReadable(e,["#fff","#000"],n))};var Hi=Ii.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},Ki=Ii.hexNames=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}(Hi);function $i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function Zi(e,t){(function(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!=e.indexOf("%")}(e);return e=Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(e*t,10)/100),Math.abs(e-t)<1e-6?1:e%t/parseFloat(t)}function Xi(e){return Math.min(1,Math.max(0,e))}function Yi(e){return parseInt(e,16)}function Qi(e){return 1==e.length?"0"+e:""+e}function Ji(e){return e<=1&&(e=100*e+"%"),e}function es(e){return Math.round(255*parseFloat(e)).toString(16)}function ts(e){return Yi(e)/255}var ns,as,is,ss=(as="[\\s|\\(]+("+(ns="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+ns+")[,|\\s]+("+ns+")\\s*\\)?",is="[\\s|\\(]+("+ns+")[,|\\s]+("+ns+")[,|\\s]+("+ns+")[,|\\s]+("+ns+")\\s*\\)?",{CSS_UNIT:new RegExp(ns),rgb:new RegExp("rgb"+as),rgba:new RegExp("rgba"+is),hsl:new RegExp("hsl"+as),hsla:new RegExp("hsla"+is),hsv:new RegExp("hsv"+as),hsva:new RegExp("hsva"+is),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function rs(e){return!!ss.CSS_UNIT.exec(e)}var os=__webpack_require__(782);const ls=e=>e/2.54,us={video:!1,gazer:!1};function cs(e,t){e.background?e._replaceBackground((0,_.$O)(t.headline,t.description)):e._addBackground((0,_.$O)(t.headline,t.description)),e._constructFloatInstructionElement("gaze-system-instruction",U.H.RC_starting[e.L])}E.A.prototype.calibrateGaze=function(e={},t=void 0){if(!this.gazeTracker.checkInitialized("gaze",!0))return;(0,_.$k)();const n=Object.assign({greedyLearner:!1,calibrationCount:1,headline:`👀 ${U.H.RC_gazeTrackingTitle[this.L]}`,description:U.H.RC_gazeTrackingIntro[this.L]},e);n.nudge=!1,us.video=this.gazeTracker.webgazer.params.showVideo,us.gazer=this.gazeTracker.webgazer.params.showGazeDot,us.video||this.showVideo(!0),us.gazer||this.showGazer(!0),this.gazeTracker.webgazer.params.greedyLearner=n.greedyLearner,cs(this,n);const a=hs(this,n,(()=>{this._removeBackground(),(0,j.l)(i),(0,_.nB)(t,{timestamp:performance.now()})})),i=(0,j.m)({Escape:()=>{a.deleteSelf(!1),this._removeBackground(),this.showVideo(us.video),this.showGazer(us.gazer),us.video=!1,us.gazer=!1,this._trackingSetupFinishedStatus.gaze||(this._trackingSetupFinishedStatus.gaze=!0,this.endGaze()),(0,j.l)(i)}})};const hs=(e,t,n)=>(e._removeFloatInstructionElement(),new ds(e,document.body,t,us,n));class ds{constructor(e,t,n,a,i){this._sequentialOrder(n.nudge),this.nudge=n.nudge,this.RC=e,this.clickThresholdBase=os.Y?1:n.calibrationCount,this.clicks=0,this.position=this.order.shift(),this.clickThreshold=this.clickThresholdBase,this.r=this.RC._CONST.N.GAZE_CALIBRATION.R,this.div=document.createElement("div");const s=document.createElement("div"),r=document.createElement("div");this.div.className="rc-crosshair",this.div.id="rc-crosshair",s.className="rc-crosshair-component rc-crosshair-vertical",r.className="rc-crosshair-component rc-crosshair-horizontal",r.style.height=s.style.width=`${La}px`,r.style.width=s.style.height=`${Fa}px`,this.div.style.background=e.params.backgroundColor;const o=Ii(e.params.backgroundColor).toRgb();this.div.style.background=`rgba(${o.r}, ${o.g}, ${o.b}, 0.75)`,this.div.appendChild(s),this.div.appendChild(r),this.parent=t,this.parent.appendChild(this.div),this.placeDot(),this.handleClick=this.takeClick.bind(this),this.div.addEventListener("click",this.handleClick,!1),this.originalStyles=a,this.endCalibrationCallback=i}placeDot(){Object.assign(this.div.style,[{left:`${this.RC._CONST.N.GAZE_CALIBRATION.MARGIN}px`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px)`,right:"unset"},{left:window.innerWidth-this.RC._CONST.N.GAZE_CALIBRATION.R-this.RC._CONST.N.GAZE_CALIBRATION.MARGIN+"px",right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerWidth)}px)`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerWidth)}px)`,right:"unset"}][this.position[0]],[{top:`${this.RC._CONST.N.GAZE_CALIBRATION.MARGIN}px`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px)`,bottom:"unset"},{top:window.innerHeight-this.RC._CONST.N.GAZE_CALIBRATION.R-this.RC._CONST.N.GAZE_CALIBRATION.MARGIN+"px",bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerHeight)}px)`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerHeight)}px)`,bottom:"unset"}][this.position[1]])}takeClick(e){if(this.clickAtCenter(e)){this.clicks++,this.clicks>=this.clickThreshold&&(this.order.length?(this.position=this.order.shift(),this.clickThreshold=this.clickThresholdBase,this.placeDot(),this.clicks=0):this.deleteSelf(!0));const e=document.querySelectorAll(".leader-line");e&&e.map((e=>{e.style.opacity=0}))}}deleteSelf(e=!0){this.div.removeEventListener("click",this.handleClick,!1),this.parent.removeChild(this.div),e&&(this.nudge||this.RC.showVideo(this.originalStyles.video),this.nudge||(this.originalStyles.video=!1),this.RC.showGazer(this.originalStyles.gazer),this.originalStyles.gazer=!1,(0,_.nB)(this.endCalibrationCallback),this.nudge||(this.RC._trackingSetupFinishedStatus.gaze=!0))}clickAtCenter(e){const{x:t,y:n}=(0,_.KY)(e),{left:a,top:i,right:s,bottom:r}=this.div.getBoundingClientRect(),o=(a+s)/2,l=(i+r)/2;return t>=o-5&&t<=o+5&&n>=l-5&&n<=l+5}_randomOrder(){this.order=[];for(const e of[0,1,2])for(const t of[0,1,2])this.order.push([e,t]);(0,_.k4)(this.order)}_sequentialOrder(e=!1){this.order=e?[[1,1],[1,3],[4,1],[1,4],[3,1],[1,1],[1,4],[4,1],[1,3],[3,1],[1,1]]:os.Y?[[0,0],[2,0],[2,2],[0,2],[1,1]]:[[1,1],[1,0],[2,0],[2,1],[2,2],[1,2],[0,2],[0,1],[0,0],[1,1],[1,2],[2,2],[2,1],[2,0],[1,0],[0,0],[0,1],[0,2],[1,1],[1,5],[6,5],[6,1],[6,6],[1,6],[5,6],[5,1],[5,5],[1,1],[1,6],[6,6],[6,1],[6,5],[1,5],[5,5],[5,1],[5,6],[1,1],[1,4],[4,1],[1,3],[3,1],[1,1],[1,3],[4,1],[1,4],[3,1],[1,1]]}getOffsetPx(e,t=null){const n=(a=e,i=this.RC.screenPpi?this.RC.screenPpi.value:this.RC._CONST.N.PPI_DONT_USE,s=this.RC.viewingDistanceCm?this.RC.viewingDistanceCm.value:this.RC._CONST.N.VIEW_DIST_DONT_USE,ls(i)*s*Math.tan(a*(Math.PI/180)));var a,i,s;return t?Math.min(n,t):n}}E.A.prototype.trackGaze=async function(e={},t=null,n=null){if(!this.checkInitialized())return;(0,_.$k)(),!1===this.gazeTracker.webgazer.getTracker().modelLoaded&&this.gazeTracker.webgazer.getTracker().loadModel();const a=Object.assign({fullscreen:!1,greedyLearner:!1,framerate:60,showGazer:!0,showVideo:!0,pipWidthPx:this._CONST.N.VIDEO_W[this.isMobile.value?"MOBILE":"DESKTOP"],showFaceOverlay:!1,calibrationCount:1,thresholdDeg:10,decimalPlace:0,headline:`👀 ${U.H.RC_gazeTrackingTitle[this.L]}`,description:U.H.RC_gazeTrackingIntro[this.L]},e);if(this.getFullscreen(a.fullscreen),this.gazeTracker.checkInitialized("gaze"))return this.gazeTracker._toFixedN=a.decimalPlace,this.showGazer(a.showGazer),this.showVideo(a.showVideo),this.showFaceOverlay(a.showFaceOverlay),this.gazeTracker.attachNewCallback(n),void(this.gazeTracker.defaultGazeCallback=n);this._addBackground(),await Ya(this),this.gazeTracker._init({greedyLearner:a.greedyLearner,framerate:a.framerate,toFixedN:a.decimalPlace,showVideo:a.showVideo,showFaceOverlay:a.showFaceOverlay,showGazer:a.showGazer},"gaze"),cs(this,a);const i={pipWidthPx:a.pipWidthPx},s={greedyLearner:a.greedyLearner,calibrationCount:a.calibrationCount,headline:a.headline,description:a.description};this.gazeTracker.begin(i,(()=>{this._trackingSetupFinishedStatus.gaze=!1,this.calibrateGaze(s,r)}));const r=e=>{(0,_.nB)(t,e),this.gazeTracker.webgazer.params.greedyLearner||this.gazeTracker.stopLearning({click:!0,move:!0});return a.thresholdDeg,this.gazeTracker.attachNewCallback(n),void(this.gazeTracker.defaultGazeCallback=n)}},E.A.prototype.getGazeNow=async function(e={},t=null){if(!(this.checkInitialized()&&this.gazeTracker.checkInitialized("gaze",!0)&&this.gazeTracker.webgazer.params.paused&&this._trackingPaused.gaze))return;const n=Object.assign({wait:0,frames:5},e),a=t||this.gazeTracker.defaultGazeCallback;return await this.gazeTracker.getGazeNow(n,a)},E.A.prototype.pauseGaze=function(){!this.gazeTracker.checkInitialized("gaze",!0)&&this._trackingPaused.gaze||(this._trackingPaused.gaze=!0,this.gazeTracker.pause())},E.A.prototype.resumeGaze=function(){(this.gazeTracker.checkInitialized("gaze",!0)||this._trackingPaused.gaze)&&(this._trackingPaused.gaze=!1,this.gazeTracker.resume())},E.A.prototype.endGaze=function(e=!1){this.gazeTracker.checkInitialized("gaze",!0)&&(this._trackingPaused.gaze=!1,this.gazeTracker.end("gaze",e))},E.A.prototype.gazeLearning=function(e,t){const n=Object.assign({click:!0,move:!0},t);e?this.gazeTracker.startLearning(n):this.gazeTracker.stopLearning(n)},E.A.prototype.showGazer=function(e=!0){this.gazeTracker.checkInitialized("gaze",!1)&&this.gazeTracker.showGazer(e)},E.A.prototype.showVideo=function(e=!0){this.gazeTracker.checkInitialized("",!1)&&this.gazeTracker.showVideo(e)},E.A.prototype.showFaceOverlay=function(e=!0){this.gazeTracker.checkInitialized("gaze",!1)&&this.gazeTracker.showFaceOverlay(e)};var ps=__webpack_require__(7158),ms=__webpack_require__.n(ps);const fs={gazer:!1,gazeLearning:!1,gazePaused:!1},gs={current:null};E.A.prototype.nudgeGaze=function(e={},t=void 0){if(!this.checkInitialized()||!this.gazeTracker.checkInitialized("gaze",!0))return;const n=Object.assign({showOffset:!0},e);if(this._gazeTrackNudging.isCorrectingGaze)return;this._gazeTrackNudging.isCorrectingGaze=!0;let a=document.getElementById("gaze-nudger");a||(a=document.createElement("div"),a.id="gaze-nudger",a.className=`gaze-nudger rc-lang-${this.LD.toLowerCase()}`,document.body.classList.add("lock-view"),document.body.appendChild(a),a.style.background=this.params.backgroundColor);const i=`

      ${U.H.RC_gazeTrackingNudge[this.L]}

      `;a.innerHTML+=i;const s=ys(this,a,t);if(this._nudger.gazeElement=a,n.showOffset){const e=document.createElement("div");e.id="fake-gaze-dot",e.style.position="absolute",e.style.left=this.gazePositionPx.value.x-5+"px",e.style.top=this.gazePositionPx.value.y-5+"px",e.style.width="10px",e.style.height="10px",e.style.borderRadius="50%",e.style.background="transparent",e.style.zIndex="9999999999",document.body.appendChild(e),gs.current=new(ms())(ms().pointAnchor(e,{x:"50%",y:"50%"}),ms().pointAnchor(s,{x:"50%",y:"50%"}),{path:"straight",color:this._CONST.COLOR.DARK_RED,startPlug:"disc"});const t=document.querySelector(".leader-line");t.style.zIndex=9999999999,t.style.opacity=.7,t.style.transitionDuration="0.2s"}fs.gazePaused=this._trackingPaused.gaze,fs.gazer=this.gazeTracker.webgazer.params.showGazeDot,fs.gazeLearning=this.gazeTracker._learning,fs.gazePaused&&this.resumeGaze(),fs.gazer||this.showGazer(!0),fs.gazeLearning||this.gazeLearning(!0,{click:!0,move:!1})};const ys=(e,t,n)=>new ds(e,t,{greedyLearner:!1,calibrationCount:1,nudge:!0},fs,(()=>{t.remove(),t=null,e._nudgerElement=null,document.body.classList.remove("lock-view"),fs.gazePaused&&e.pauseGaze(),fs.gazePaused=!1,gs.current&&(gs.current.remove(),gs.current=null),e._gazeTrackNudging.isCorrectingGaze=!1,(0,_.nB)(n)}));var bs=__webpack_require__(4948),vs=__webpack_require__.n(bs);let ks=!1;E.A.prototype.getGazeAccuracy=function(e={},t=void 0,n=void 0){if(!this.checkInitialized())return!1;(0,_.$k)();const a=this.screenPpi,i=this.viewingDistanceCm;if(!a||!i)return!1;const s=Object.assign({backgroundColor:"#eee",thresholdDeg:10,decimalPlace:3},e);this._addBackground();const r=document.createElement("div");r.innerHTML='',this.background.appendChild(r);const o=document.querySelector("#gaze-accuracy-canvas"),l=o.getContext("2d"),u=()=>{o.width=window.innerWidth,o.height=window.innerHeight,o.style.width=`${o.width}px`,o.style.height=`${o.height}px`},c=new ResizeObserver((()=>{u()}));return c.observe(this.background),u(),vs().fire({...Ga(this,{showIcon:!0}),html:"We will measure your gaze accuracy. Please do not move the mouse and look at the fixation at the middle of the screen for the next 5 seconds."}).then((()=>{ks=!0,ws(o,l,s),this.gazeTracker.startStoringPoints(),(0,_.yy)(5e3).then((()=>{ks=!1,this.gazeTracker.stopStoringPoints();const e=this.gazeTracker.webgazer.getStoredPoints(),r=As({x:o.width/2,y:o.height/2},e,a.value,i.value);this.newGazeAccuracyData={value:(0,_.Nh)(r,s.decimalPlace),timestamp:performance.now()},r{const a=()=>{t.fillStyle=n.backgroundColor,t.fillRect(0,0,e.width,e.height),ja(t,e.width/2,e.height/2),ks&&requestAnimationFrame(a)};requestAnimationFrame(a)},As=(e,t,n,a)=>{let i=0;for(let s=0;s0;)n=Math.random()*t|0,t--,Is(e,t,n)}function _s(e,t,n){return Math.max(e,Math.min(t,n))}function Ts(e){return e%2==0?e:e+1}function Is(e,t,n){const a=e[t];e[t]=e[n],e[n]=a}function Ns(e,t){if(!e)throw new Error("string"==typeof t?t:t())}function Rs(e,t,n=""){Ns(Os(e,t),(()=>n+` Shapes ${e} and ${t} must match`))}function Ds(e){Ns(null!=e,(()=>"The input to the tensor constructor must be a non-null value."))}function zs(e){if(0===e.length)return 1;let t=e[0];for(let n=1;n0),n,a){return new Promise(((i,s)=>{let r=0;const o=()=>{if(e())return void i();r++;const l=t(r);null!=n&&r>=n?s():null!=a?a(o,l):setTimeout(o,l)};o()}))}function Ps(e,t){let n=1,a=-1;for(let t=0;t=0)n*=e[t];else if(-1===e[t]){if(-1!==a)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${a} and dim ${t}`);a=t}else if(e[t]<0)throw Error(`Shapes can not be < 0. Found ${e[t]} at dim ${t}`);if(-1===a){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(0===n)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);const i=e.slice();return i[a]=t/n,i}function js(e,t){const n=t.length;return Ns((e=null==e?t.map(((e,t)=>t)):[].concat(e)).every((e=>e>=-n&&e`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`)),Ns(e.every((e=>Ms(e))),(()=>`All values in axis param must be integers but got axis ${e}`)),e.map((e=>e<0?n+e:e))}function Vs(e,t){const n=[],a=[],i=null!=t&&Array.isArray(t)&&0===t.length,s=null==t||i?null:js(t,e).sort();let r=0;for(let t=0;tt)&&1===e[t]&&(n.push(e[t]),a.push(t)),s[r]<=t&&r++}1!==e[t]&&(n.push(e[t]),a.push(t))}return{newShape:n,keptDims:a}}function Us(e,t){return Ws(e,t)}function Ws(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else if("bool"===e)n=new Uint8Array(t);else{if("string"!==e)throw new Error(`Unknown data type ${e}`);n=new Array(t)}return n}function Gs(e,t){return"complex64"!==t&&(("float32"!==t||"complex64"===e)&&(("int32"!==t||"float32"===e||"complex64"===e)&&("bool"!==t||"bool"!==e)))}function qs(e){if("float32"===e||"int32"===e)return 4;if("complex64"===e)return 8;if("bool"===e)return 1;throw new Error(`Unknown dtype ${e}`)}function Hs(e){return"string"==typeof e||e instanceof String}function Ks(e){return"number"==typeof e}function $s(e){return Array.isArray(e)?$s(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray?"int32":Ks(e)?"float32":Hs(e)?"string":"boolean"==typeof e?"bool":"float32"}function Zs(e){return!!(e&&e.constructor&&e.call&&e.apply)}function Xs(e,t){for(let n=t;n=0;--a)n[a]=n[a+1]*e[a+1];return n}function Qs(e,t,n,a=!1){const i=new Array;if(1===t.length){const s=t[0]*(a?2:1);for(let t=0;te*t))*(a?2:1);for(let t=0;te*t))*(n?2:1);if(0===a)return[];if(a!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return Qs(0,e,t,n)}function er(e,t){const n=tr(e,t);for(let e=0;ee*t),1);if(null==t||"float32"===t)return Js(e,new Float32Array(n));if("int32"===t)return Js(e,new Int32Array(n));if("bool"===t)return Js(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function ar(e){e.forEach((t=>{Ns(Number.isInteger(t)&&t>=0,(()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`))}))}function ir(e,t,n){if(0===t)return 0;if(1===t)return e[0];let a=e[e.length-1];for(let t=0;t{const[t,n]=e.split(":");this.urlFlags[t]=function(e,t){const n=t.toLowerCase();return"true"===n||"false"===n?"true"===n:""+ +n===n?+n:t}(0,n)}))}}}function ur(e){const t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,((e,...n)=>(function(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}(t,n[0],n[1]),n.join("=")))),t}function cr(){return dr}let hr,dr=null;function pr(){if(null==hr){let e;if("undefined"!=typeof window)e=window;else if(void 0!==__webpack_require__.g)e=__webpack_require__.g;else if("undefined"!=typeof process)e=process;else{if("undefined"==typeof self)throw new Error("Could not find a global object");e=self}hr=e}return hr}function mr(e,t){const n=function(){const e=pr();return null==e._tfGlobals&&(e._tfGlobals=new Map),e._tfGlobals}();if(n.has(e))return n.get(e);{const a=t();return n.set(e,a),n.get(e)}}const fr="Abs",gr="Acos",yr="Acosh",br="Add",vr="AddN",kr="All",wr="Any",Ar="ArgMax",xr="ArgMin",Cr="Asin",Sr="Asinh",Er="Atan",_r="Atanh",Tr="Atan2",Ir="AvgPool",Nr="AvgPoolGrad",Rr="AvgPool3D",Dr="AvgPool3DGrad",zr="BatchMatMul",Or="BatchToSpaceND",Mr="Bincount",Br="BitwiseAnd",Fr="BroadcastArgs",Lr="Cast",Pr="Ceil",jr="ClipByValue",Vr="Complex",Ur="ComplexAbs",Wr="Concat",Gr="Conv2D",qr="Conv2DBackpropFilter",Hr="Conv2DBackpropInput",Kr="Conv3D",$r="Conv3DBackpropFilterV2",Zr="Conv3DBackpropInputV2",Xr="Cos",Yr="Cosh",Qr="Cumprod",Jr="Cumsum",eo="CropAndResize",to="DenseBincount",no="DepthToSpace",ao="DepthwiseConv2dNative",io="DepthwiseConv2dNativeBackpropFilter",so="DepthwiseConv2dNativeBackpropInput",ro="Diag",oo="Dilation2D",lo="Dilation2DBackpropInput",uo="Dilation2DBackpropFilter",co="Draw",ho="RealDiv",po="Einsum",mo="Elu",fo="EluGrad",go="Erf",yo="Equal",bo="Exp",vo="ExpandDims",ko="Expm1",wo="FFT",Ao="Fill",xo="FlipLeftRight",Co="Floor",So="FloorDiv",Eo="FusedBatchNorm",_o="GatherV2",To="GatherNd",Io="Greater",No="GreaterEqual",Ro="Identity",Do="IFFT",zo="Imag",Oo="IsFinite",Mo="IsInf",Bo="IsNan",Fo="LeakyRelu",Lo="Less",Po="LessEqual",jo="LinSpace",Vo="Log",Uo="Log1p",Wo="LogicalAnd",Go="LogicalNot",qo="LogicalOr",Ho="LRN",Ko="LRNGrad",$o="Max",Zo="Maximum",Xo="MaxPool",Yo="MaxPoolGrad",Qo="MaxPool3D",Jo="MaxPool3DGrad",el="MaxPoolWithArgmax",tl="Mean",nl="Min",al="Minimum",il="MirrorPad",sl="Mod",rl="Multinomial",ol="Multiply",ll="Neg",ul="NotEqual",cl="NonMaxSuppressionV3",hl="NonMaxSuppressionV4",dl="NonMaxSuppressionV5",pl="OnesLike",ml="OneHot",fl="Pack",gl="PadV2",yl="Pow",bl="Prelu",vl="Prod",kl="RaggedGather",wl="RaggedRange",Al="RaggedTensorToTensor",xl="Range",Cl="Real",Sl="Reciprocal",El="Relu",_l="Reshape",Tl="ResizeNearestNeighbor",Il="ResizeNearestNeighborGrad",Nl="ResizeBilinear",Rl="ResizeBilinearGrad",Dl="Relu6",zl="Reverse",Ol="Round",Ml="Rsqrt",Bl="ScatterNd",Fl="TensorScatterUpdate",Ll="SearchSorted",Pl="Select",jl="Selu",Vl="Slice",Ul="Sin",Wl="Sinh",Gl="Sign",ql="Sigmoid",Hl="Softplus",Kl="Sqrt",$l="Sum",Zl="SpaceToBatchND",Xl="SplitV",Yl="Softmax",Ql="SparseFillEmptyRows",Jl="SparseReshape",eu="SparseSegmentMean",tu="SparseSegmentSum",nu="SparseToDense",au="SquaredDifference",iu="Square",su="StaticRegexReplace",ru="StridedSlice",ou="StringNGrams",lu="StringSplit",uu="StringToHashBucketFast",cu="Sub",hu="Tan",du="Tanh",pu="Tile",mu="TopK",fu="Transform",gu="Transpose",yu="Unique",bu="Unpack",vu="UnsortedSegmentSum",ku="ZerosLike",wu="Step",Au="FromPixels",xu="RotateWithOffset",Cu="_FusedMatMul",Su="FusedConv2D",Eu="FusedDepthwiseConv2D";function _u(...e){!cr().getBool("IS_TEST")&&cr().getBool("PROD")}function Tu(...e){!cr().getBool("IS_TEST")&&cr().getBool("PROD")}const Iu=mr("kernelRegistry",(()=>new Map)),Nu=mr("gradRegistry",(()=>new Map));function Ru(e,t){const n=Bu(e,t);return Iu.get(n)}function Du(e){return Nu.get(e)}function zu(e){const t=Iu.entries(),n=[];for(;;){const{done:a,value:i}=t.next();if(a)break;const[s,r]=i,[o]=s.split("_");o===e&&n.push(r)}return n}function Ou(e){const{kernelName:t,backendName:n}=e,a=Bu(t,n);Iu.has(a)&&_u(),Iu.set(a,e)}function Mu(e){const{kernelName:t}=e;Nu.has(t)&&cr().getBool("DEBUG")&&_u(),Nu.set(t,e)}function Bu(e,t){return`${t}_${e}`}function Fu(e){return e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray}var Lu=__webpack_require__(3122);const Pu=__webpack_require__.n(Lu)()||Lu;function ju(e){return Pu.fromString(e,!0,16)}const Vu=ju("c3a5c85c97cb3127"),Uu=ju("b492b66fbe98f273"),Wu=ju("9ae16a3b2f90404f");function Gu(e){return e.xor(e.shru(47))}function qu(e,t,n){const a=e.slice(t,t+n);return Pu.fromBytes(Array.from(a),!0,!0)}function Hu(e,t){return qu(e,t,8)}function Ku(e,t){return qu(e,t,4)}function $u(e,t){return 0===t?e:e.shru(t).or(e.shl(64-t))}function Zu(e,t,n=ju("9ddfea08eb382d69")){let a=e.xor(t).mul(n);a=a.xor(a.shru(47));let i=t.xor(a).mul(n);return i=i.xor(i.shru(47)),i=i.mul(n),i}function Xu(e,t,n,a){return function(e,t,n,a,i,s){i=i.add(e),s=$u(s.add(i).add(a),21);const r=i;return i=(i=i.add(t)).add(n),s=s.add($u(i,44)),[i.add(a),s.add(r)]}(Hu(e,t),Hu(e,t+8),Hu(e,t+16),Hu(e,t+24),n,a)}function Yu(e,t=e.length){const n=Pu.fromNumber(81,!0);if(t<=32)return t<=16?function(e,t=e.length){if(t>=8){const n=Wu.add(2*t),a=Hu(e,0).add(Wu),i=Hu(e,t-8);return Zu($u(i,37).mul(n).add(a),$u(a,25).add(i).mul(n),n)}if(t>=4){const n=Wu.add(2*t);return Zu(Ku(e,0).shl(3).add(t),Ku(e,t-4),n)}if(t>0){const n=e[0]+(e[t>>1]<<8),a=t+(e[t-1]<<2);return Gu(Wu.mul(n).xor(Vu.mul(a))).mul(Wu)}return Wu}(e,t):function(e,t=e.length){const n=Wu.add(2*t),a=Hu(e,0).mul(Uu),i=Hu(e,8),s=Hu(e,t-8).mul(n),r=Hu(e,t-16).mul(Wu);return Zu($u(a.add(i),43).add($u(s,30)).add(r),a.add($u(i.add(Wu),18)).add(s),n)}(e,t);if(t<=64)return function(e,t=e.length){const n=Wu.add(2*t),a=Hu(e,0).mul(Wu),i=Hu(e,8),s=Hu(e,t-8).mul(n),r=Hu(e,t-16).mul(Wu),o=$u(a.add(i),43).add($u(s,30)).add(r),l=Zu(o,a.add($u(i.add(Wu),18)).add(s),n),u=Hu(e,16).mul(n),c=Hu(e,24),h=o.add(Hu(e,t-32)).mul(n),d=l.add(Hu(e,t-24)).mul(n);return Zu($u(u.add(c),43).add($u(h,30)).add(d),u.add($u(c.add(a),18)).add(h),n)}(e,t);let a=n,i=n.mul(Uu).add(113),s=Gu(i.mul(Wu).add(113)).mul(Wu),r=[Pu.UZERO,Pu.UZERO],o=[Pu.UZERO,Pu.UZERO];a=a.mul(Wu).add(Hu(e,0));let l=0;const u=64*(t-1>>6),c=u+(t-1&63)-63;do{a=$u(a.add(i).add(r[0]).add(Hu(e,l+8)),37).mul(Uu),i=$u(i.add(r[1]).add(Hu(e,l+48)),42).mul(Uu),a=a.xor(o[1]),i=i.add(r[0]).add(Hu(e,l+40)),s=$u(s.add(o[0]),33).mul(Uu),r=Xu(e,l,r[1].mul(Uu),a.add(o[0])),o=Xu(e,l+32,s.add(o[1]),i.add(Hu(e,l+16))),[s,a]=[a,s],l+=64}while(l!==u);const h=Uu.add(s.and(255).shl(1));return l=c,o[0]=o[0].add(t-1&63),r[0]=r[0].add(o[0]),o[0]=o[0].add(r[0]),a=$u(a.add(i).add(r[0]).add(Hu(e,l+8)),37).mul(h),i=$u(i.add(r[1]).add(Hu(e,l+48)),42).mul(h),a=a.xor(o[1].mul(9)),i=i.add(r[0].mul(9).add(Hu(e,l+40))),s=$u(s.add(o[0]),33).mul(h),r=Xu(e,l,r[1].mul(h),a.add(o[0])),o=Xu(e,l+32,s.add(o[1]),i.add(Hu(e,l+16))),[s,a]=[a,s],Zu(Zu(r[0],o[0],h).add(Gu(i).mul(Vu)).add(s),Zu(r[1],o[1],h).add(a),h)}function Qu(e,t){return"string"===t?tc(e):Ju([e],t)}function Ju(e,t){if("string"===t)throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=ic(e)),cr().getBool("DEBUG")&&function(e,t){for(let n=0;n{a=n()};let s;const r=ec();if(this.backendTimer.timerAvailable())s=this.backendTimer.time(i);else{i();for(const e of a)e.dataSync();s=Promise.resolve({kernelMs:ec()-r})}if(cr().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let t=0;t{rc(t,n.dtype,e)}))}return{kernelName:e,outputs:a,inputs:t,timeMs:s.then((e=>e.kernelMs)),extraInfo:s.then((e=>null!=e.getExtraProfileInfo?e.getExtraProfileInfo():""))}}logKernelProfile(e){const{kernelName:t,outputs:n,timeMs:a,inputs:i,extraInfo:s}=e;n.forEach((e=>{Promise.all([e.data(),a,s]).then((n=>{this.logger.logKernelProfile(t,e,n[0],n[1],i,n[2])}))}))}}function rc(e,t,n){if("float32"!==t)return!1;for(let t=0;t0?a:""} `}}}}const lc=20,uc=3,cc=7;function hc(e,t,n,a){const i=Ys(t),s=function(e,t,n,a){const i=zs(t),s=a[a.length-1],r=new Array(s).fill(0),o=t.length,l="complex64"===n?fc(e):e;if(o>1)for(let e=0;e" "+e)).join("\n")),l.join("\n")}function dc(e,t,n){let a;return a=Array.isArray(e)?`${parseFloat(e[0].toFixed(cc))} + ${parseFloat(e[1].toFixed(cc))}j`:Hs(e)?`'${e}'`:"bool"===n?pc(e):parseFloat(e.toFixed(cc)).toString(),Fs(a,t)}function pc(e){return 0===e?"false":"true"}function mc(e,t,n,a,i,s=!0){const r="complex64"===n?2:1,o=t[0],l=t.length;if(0===l){if("complex64"===n){return[dc(fc(e)[0],0,n)]}return"bool"===n?[pc(e[0])]:[e[0].toString()]}if(1===l){if(o>lc){const t=uc*r;let a=Array.from(e.slice(0,t)),s=Array.from(e.slice((o-uc)*r,o*r));return"complex64"===n&&(a=fc(a),s=fc(s)),["["+a.map(((e,t)=>dc(e,i[t],n))).join(", ")+", ..., "+s.map(((e,t)=>dc(e,i[o-uc+t],n))).join(", ")+"]"]}return["["+("complex64"===n?fc(e):Array.from(e)).map(((e,t)=>dc(e,i[t],n))).join(", ")+"]"]}const u=t.slice(1),c=a.slice(1),h=a[0]*r,d=[];if(o>lc){for(let t=0;t0?d[0]+p:"");for(let e=1;e`Length of values '${e}' does not match the size inferred by the shape '${this.size}'.`))}if("complex64"===t)throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||Ws(t,this.size),this.strides=Ys(e)}set(e,...t){0===t.length&&(t=[0]),Ns(t.length===this.rank,(()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`));const n=this.locToIndex(t);this.values[n]=e}get(...e){0===e.length&&(e=[0]);let t=0;for(const n of e){if(n<0||n>=this.shape[t]){const t=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(t)}t++}let n=e[e.length-1];for(let t=0;tnc(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataToGPU(e){return this.throwIfDisposed(),yc().readToGPU(this.dataId,e)}dataSync(){this.throwIfDisposed();const e=yc().readSync(this.dataId);if("string"===this.dtype)try{return e.map((e=>nc(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();const e=await yc().read(this.dataId);return"string"===this.dtype?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(this.kerasMask&&this.kerasMask.dispose(),yc().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return bc.print(this,e)}clone(){return this.throwIfDisposed(),bc.clone(this)}toString(e=!1){return hc(this.dataSync(),this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),bc.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),yc().makeVariable(this,e,t,n)}}function wc(){return mr("Tensor",(()=>kc))}Object.defineProperty(kc,Symbol.hasInstance,{value:e=>!!e&&null!=e.data&&null!=e.dataSync&&null!=e.throwIfDisposed}),wc();class Ac extends kc{constructor(e,t,n,a){super(e.shape,e.dtype,e.dataId,a),this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!Os(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);yc().disposeTensor(this),this.dataId=e.dataId,yc().incRef(this,null)}dispose(){yc().disposeVariable(this),this.isDisposedInternal=!0}}var xc,Cc,Sc,Ec,_c,Tc,Ic,Nc,Rc,Dc;Object.defineProperty(Ac,Symbol.hasInstance,{value:e=>e instanceof kc&&null!=e.assign&&e.assign instanceof Function}),(Cc=xc||(xc={})).R0="R0",Cc.R1="R1",Cc.R2="R2",Cc.R3="R3",Cc.R4="R4",Cc.R5="R5",Cc.R6="R6",(Ec=Sc||(Sc={})).float32="float32",Ec.int32="int32",Ec.bool="int32",Ec.complex64="complex64",(Tc=_c||(_c={})).float32="float32",Tc.int32="int32",Tc.bool="bool",Tc.complex64="complex64",(Nc=Ic||(Ic={})).float32="float32",Nc.int32="float32",Nc.bool="float32",Nc.complex64="complex64",(Dc=Rc||(Rc={})).float32="complex64",Dc.int32="complex64",Dc.bool="complex64",Dc.complex64="complex64";const zc={float32:Ic,int32:Sc,bool:_c,complex64:Rc};function Oc(e,t){if("string"===e||"string"===t){if("string"===e&&"string"===t)return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return zc[e][t]}function Mc(e){return Oc(e,"int32")}function Bc(e){return null!=e&&"object"==typeof e&&"texture"in e&&e.texture instanceof WebGLTexture}function Fc(e){return"undefined"!=typeof GPUBuffer&&null!=e&&"object"==typeof e&&"buffer"in e&&e.buffer instanceof GPUBuffer}function Lc(e,t){if(e.dtype===t.dtype)return[e,t];const n=Oc(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function Pc(e,t){return t.some((t=>t.id===e.id))}function jc(e){const t=[];return Vc(e,t,new Set),t}function Vc(e,t,n){if(null==e)return;if(e instanceof kc)return void t.push(e);if(a=e,!Array.isArray(a)&&"object"!=typeof a)return;var a;const i=e;for(const e in i){const a=i[e];n.has(a)||(n.add(a),Vc(a,t,n))}}function Uc(e){return null!=e.kernelName}class Wc{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map((e=>e.name))))}}}dispose(){for(const e in this.registeredVariables)this.registeredVariables[e].dispose()}}class Gc{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new Wc}async ready(){if(null!=this.pendingBackendInit)return this.pendingBackendInit.then((()=>{}));if(null!=this.backendInstance)return;const e=this.getSortedBackends();for(let t=0;t{null!=e.setupFunc&&e.setupFunc(this.backendInstance)}))}disposeRegisteredKernels(e){zu(e).forEach((t=>{null!=t.disposeFunc&&t.disposeFunc(this.registry[e])}))}initializeBackend(e){const t=this.registryFactory[e];if(null==t)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{const n=t.factory();if(!n||n instanceof Cs||"function"!=typeof n.then)return this.registry[e]=n,{success:!0,asyncInit:!1};{const t=++this.pendingBackendInitId,a=n.then((n=>!(t(tthis.registryFactory[t].priority-this.registryFactory[e].priority))}initializeBackendsAndReturnBest(){const e=this.getSortedBackends();for(let t=0;tthis.startScope(a)),(()=>this.endScope(n)),(()=>(n=t(),n)))}scopedRun(e,t,n){e();try{const e=n();return t(),e}catch(e){throw t(),e}}nextTensorId(){return Gc.nextTensorId++}nextVariableId(){return Gc.nextVariableId++}clone(e){const t=Hc.runKernel(Ro,{x:e}),n={x:e};return this.addTapeNode(this.state.activeScope.name,n,[t],(e=>({x:()=>{const t={x:e},n={dtype:"float32"};return Hc.runKernel(Lr,t,n)}})),[],{}),t}runKernel(e,t,n){null==this.backendName&&this.backend;if(!(null!=Ru(e,this.backendName)))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){const a=this.backend.numDataIds();let i=0;n.forEach((e=>{i+="complex64"===e.dtype?3:1}));const s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],r=a-t-i-s;if(r>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${r} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[];const a=this.isTapeOn(),i=this.state.numBytes,s=this.state.numTensors;let r,o;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0),null==this.backendName&&this.backend;const l=Uc(e)?e.kernelName:null!=this.state.activeScope?this.state.activeScope.name:"";if(Uc(e)){const{kernelName:t,inputs:i,attrs:s}=e;null==this.backendName&&this.backend;const l=Ru(t,this.backendName);Ns(null!=l,(()=>`Cannot find registered kernel '${t}' for backend '${this.backendName}'`)),r=()=>{const e=this.backend.numDataIds();o=l.kernelFunc({inputs:i,attrs:s,backend:this.backend});const r=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(t,e,r);const u=r.map((e=>null!=e.rank?e:this.makeTensorFromTensorInfo(e)));if(a){const e=this.getTensorsForGradient(t,i,u);n=this.saveTensorsForBackwardMode(e)}return u}}else{const{forwardFunc:t}=e,i=e=>{a&&(n=e.map((e=>this.keep(this.clone(e)))))};r=()=>{const e=this.backend.numDataIds();o=this.tidy((()=>t(this.backend,i)));const n=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,e,n),n}}const{inputs:u,attrs:c}=e,h=Uc(e)?null:e.backwardsFunc;let d;return this.scopedRun((()=>this.state.kernelDepth++),(()=>this.state.kernelDepth--),(()=>{this.ENV.getBool("DEBUG")||this.state.profiling?(d=this.profiler.profileKernel(l,u,(()=>r())),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(d),t=d.outputs):t=r()})),a&&this.addTapeNode(l,u,t,h,n,c),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-i,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(u).map((e=>null!=u[e]?u[e].shape:null)),outputShapes:t.map((e=>e.shape)),kernelTimeMs:d.timeMs,extraInfo:d.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map((e=>this.keep(this.clone(e))))}getTensorsForGradient(e,t,n){const a=Du(e);if(null!=a){const e=a.inputsToSave||[],i=a.outputsToSave||[];let s;a.saveAllInputs?(Ns(Array.isArray(t),(()=>"saveAllInputs is true, expected inputs to be an array.")),s=Object.keys(t).map((e=>t[e]))):s=e.map((e=>t[e]));const r=n.filter(((e,t)=>i[t]));return s.concat(r)}return[]}makeTensor(e,t,n,a){if(null==e)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",a=a||this.backend;let i=e;"string"===n&&Hs(e[0])&&(i=e.map((e=>tc(e))));const s=a.write(i,t,n),r=new kc(t,n,s,this.nextTensorId());if(this.trackTensor(r,a),"string"===n){const e=this.state.tensorInfo.get(s),t=function(e){if(null==e)return 0;let t=0;return e.forEach((e=>t+=e.length)),t}(i);this.state.numBytes+=t-e.bytes,e.bytes=t}return r}makeTensorFromDataId(e,t,n,a){const i={dataId:e,shape:t,dtype:n=n||"float32"};return this.makeTensorFromTensorInfo(i,a)}makeTensorFromTensorInfo(e,t){const{dataId:n,shape:a,dtype:i}=e,s=new kc(a,i,n,this.nextTensorId());return this.trackTensor(s,t),s}makeVariable(e,t=!0,n,a){n=n||this.nextVariableId().toString(),null!=a&&a!==e.dtype&&(e=e.cast(a));const i=new Ac(e,t,n,this.nextTensorId());if(null!=this.state.registeredVariables[i.name])throw new Error(`Variable with name ${i.name} was already registered`);return this.state.registeredVariables[i.name]=i,this.incRef(i,this.backend),i}trackTensor(e,t){this.state.numTensors++,"string"===e.dtype&&this.state.numStringTensors++;let n=0;"complex64"!==e.dtype&&"string"!==e.dtype&&(n=e.size*qs(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof Ac||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;const t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,"string"===e.dtype&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),"complex64"!==e.dtype&&"string"!==e.dtype){const t=e.size*qs(e.dtype);this.state.numBytes-=t}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(const e in this.state.registeredVariables){const t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),null!=this.state.registeredVariables[e.name]&&delete this.state.registeredVariables[e.name]}memory(){const e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,null==e.reasons&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;const t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map((e=>e.totalBytesSnapshot))),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(const e of this.state.activeProfile.kernels)e.kernelTimeMs=await e.kernelTimeMs,e.extraInfo=await e.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&0===this.state.kernelDepth}addTapeNode(e,t,n,a,i,s){const r={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:i},o=Du(e);null!=o&&(a=o.gradFunc),null!=a&&(r.gradient=e=>(e=e.map(((e,t)=>{if(null==e){const e=n[t],a=tr(e.size,e.dtype);return this.makeTensor(a,e.shape,e.dtype)}return e})),a(e.length>1?e:e[0],i,s))),this.state.activeTape.push(r)}keep(e){return e.kept=!0,e}startTape(){0===this.state.gradientDepth&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){const t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){const t=jc(e),n=new Set(t.map((e=>e.id)));for(let e=0;e{e.kept||e.scopeId!==a.id||this.track(e)}))}gradients(e,t,n,a=!1){if(Ns(t.length>0,(()=>"gradients() received an empty list of xs.")),null!=n&&"float32"!==n.dtype)throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);const i=this.scopedRun((()=>this.startTape()),(()=>this.endTape()),(()=>this.tidy("forward",e)));Ns(i instanceof kc,(()=>"The result y returned by f() must be a tensor."));const s=function(e,t,n){const a={},i={};for(let e=0;ea[e.id]=!0)),o=!0,i[s.id]=!0;break}if(o)break}}const s={};s[n.id]=!0;const r={};for(let t=e.length-1;t>=0;t--){const n=e[t],a=n.inputs;for(let e=0;e0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",(()=>{const e={};e[i.id]=null==n?function(e){const t=er(zs(e),"float32");return Hc.makeTensor(t,e,"float32")}(i.shape):n,function(e,t,n,a){for(let i=t.length-1;i>=0;i--){const s=t[i],r=[];if(s.outputs.forEach((t=>{const n=e[t.id];null!=n?r.push(n):r.push(null)})),null==s.gradient)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);const o=s.gradient(r);for(const t in s.inputs){if(!(t in o))throw new Error(`Cannot backprop through input ${t}. Available gradients found: ${Object.keys(o)}.`);const i=n((()=>o[t]()));if("float32"!==i.dtype)throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${t} must have 'float32' dtype, but has '${i.dtype}'`);const r=s.inputs[t];if(!Os(i.shape,r.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${t}' has shape '${i.shape}', which does not match the shape of the input '${r.shape}'`);if(null==e[r.id])e[r.id]=i;else{const t=e[r.id];e[r.id]=a(t,i),t.dispose()}}}}(e,s,(e=>this.tidy(e)),Kc);const a=t.map((t=>e[t.id]));return 0===this.state.gradientDepth&&(this.state.activeTape.forEach((e=>{for(const t of e.saved)t.dispose()})),this.state.activeTape=null),{value:i,grads:a}}))}customGrad(e){return Ns(Zs(e),(()=>"The f passed in customGrad(f) must be a function.")),(...t)=>{let n;Ns(t.every((e=>e instanceof kc)),(()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors"));const a={};t.forEach(((e,t)=>{a[t]=e}));return this.runKernelFunc({forwardFunc:(a,i)=>(n=e(...t,i),Ns(n.value instanceof kc,(()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor")),Ns(Zs(n.gradFunc),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.")),n.value),backwardsFunc:(e,a)=>{const i=n.gradFunc(e,a),s=Array.isArray(i)?i:[i];Ns(s.length===t.length,(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).")),Ns(s.every((e=>e instanceof kc)),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."));const r={};return s.forEach(((e,t)=>{r[t]=()=>e})),r},inputs:a})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}readToGPU(e,t){return this.state.tensorInfo.get(e).backend.readToGPU(e,t)}async time(e){const t=ec(),n=await this.backend.time(e);return n.wallMs=ec()-t,n}track(e){return null!=this.state.activeScope&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new Wc;for(const e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}function qc(){const e=pr();if(null==e._tfengine){const t=new lr(e);e._tfengine=new Gc(t)}var t;return t=e._tfengine.ENV,dr=t,yc=()=>e._tfengine,e._tfengine}Gc.nextTensorId=0,Gc.nextVariableId=0;const Hc=qc();function Kc(e,t){const n={a:e,b:t};return Hc.runKernel(br,n)}let $c;function Zc(e){if(void 0!==$c)return $c;if(e||"undefined"!=typeof navigator&&null!=navigator){if(e||(e=navigator),"ReactNative"===e.product)return!0;const t=e.userAgent||e.vendor||("undefined"!=typeof window?window.opera:"");if(!t){const t=e;return t.userAgentData&&t.userAgentData.mobile}return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4))}return!1}function Xc(){return"undefined"!=typeof window&&null!=window.document||"undefined"!=typeof WorkerGlobalScope}const Yc=cr();function Qc(e,t){let n=e;if(ac(e))return"string"===t?[]:[e.length];if(Bc(e)){const t=e.channels||"RGBA";return[e.height,e.width*t.length]}if(Fc(e))return[e.buffer.size/(null==t?4:qs(t))];if(!Array.isArray(e))return[];const a=[];for(;Array.isArray(n)||ac(n)&&"string"!==t;)a.push(n.length),n=n[0];return Array.isArray(e)&&cr().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&Jc(e,a,[]),a}function Jc(e,t,n){if(n=n||[],!Array.isArray(e)&&!ac(e))return void Ns(0===t.length,(()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`));Ns(t.length>0,(()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`)),Ns(e.length===t[0],(()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`));const a=t.slice(1);for(let t=0;t=0&&(i=a),eh(a,i,t,n),null==e||!ac(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e){const a=null==e?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${a}'`)}const s=Qc(e,i);ac(e)||Array.isArray(e)||(e=[e]);const r="string"!==i?Ju(e,i):ic(e,[],!0);return Hc.makeTensor(r,s,i)}function nh(e,t,n,a="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map(((e,i)=>th(e,`${t}[${i}]`,n,a)))}Yc.registerFlag("DEBUG",(()=>!1),(e=>{})),Yc.registerFlag("IS_BROWSER",(()=>Xc())),Yc.registerFlag("IS_NODE",(()=>"undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.node)),Yc.registerFlag("IS_CHROME",(()=>"undefined"!=typeof navigator&&null!=navigator&&null!=navigator.userAgent&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor))),Yc.registerFlag("IS_SAFARI",(()=>"undefined"!=typeof navigator&&null!=navigator&&null!=navigator.userAgent&&/Safari/.test(navigator.userAgent)&&/Apple/.test(navigator.vendor))),Yc.registerFlag("PROD",(()=>!1)),Yc.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",(()=>Yc.getBool("DEBUG"))),Yc.registerFlag("DEPRECATION_WARNINGS_ENABLED",(()=>!0)),Yc.registerFlag("IS_TEST",(()=>!1)),Yc.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",(()=>Yc.getBool("DEBUG"))),Yc.registerFlag("WRAP_TO_IMAGEBITMAP",(()=>!1)),Yc.registerFlag("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU",(()=>!1)),Yc.registerFlag("USE_SETTIMEOUTCUSTOM",(()=>!1));const ah="__op";function ih(e){const t=Object.keys(e);if(1!==t.length)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0];const a=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n+=ah;const i=(...e)=>{Hc.startScope(n);try{const t=a(...e);return rr(t),Hc.endScope(t),t}catch(e){throw Hc.endScope(null),e}};return Object.defineProperty(i,"name",{value:n,configurable:!0}),i}const sh=ih({complex_:function(e,t){const n=th(e,"real","complex"),a=th(t,"imag","complex");Rs(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);const i={real:n,imag:a};return Hc.runKernel(Vr,i)}});function rh(e,t,n,a){if(null==a)a=$s(e);else if("complex64"===a)throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(Fc(e)||Bc(e)){if("float32"!==a&&"int32"!==a)throw new Error(`Creating tensor from GPU data only supports 'float32'|'int32' dtype, while the dtype is ${a}.`);return Hc.backend.createTensorFromGPUData(e,t||n,a)}if(!ac(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e)throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(null!=t){ar(t);const e=zs(t),a=zs(n);Ns(e===a,(()=>`Based on the provided shape, [${t}], the tensor should have ${e} values but has ${a}`));for(let e=0;e`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `))}}return ac(e)||Array.isArray(e)||(e=[e]),t=t||n,e="string"!==a?Ju(e,a):ic(e,[],!0),Hc.makeTensor(e,t,a)}function oh(e,t,n){return rh(e,t,Qc(e,n),n)}const lh={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8};class uh{static join(e){return new uh(e).slice()}constructor(e){if(this.shards=[],this.previousShardIndex=0,null==e)return;if(e instanceof Array||(e=[e]),0===(e=e.map((e=>ac(e)?e.buffer:e))).length)return;this.bufferUniformSize=e[0].byteLength;let t=0;for(let n=0;n=this.byteLength)return-1;if(null!=this.bufferUniformSize)return this.previousShardIndex=Math.floor(e/this.bufferUniformSize),this.previousShardIndex;function t(t){return e=t.end?1:0}if(0===t(this.shards[this.previousShardIndex]))return this.previousShardIndex;const n=function(e,t){let n=0,a=e.length;for(;n<=a;){const i=Math.floor((a-n)/2)+n,s=t(e[i]);if(0===s)return i;s<0?a=i:n=i+1}return-1}(this.shards,t);return-1===n?-1:(this.previousShardIndex=n,this.previousShardIndex)}}function ch(){return Hc}function hh(){return Hc.memory()}function dh(e,t){return Hc.tidy(e,t)}function ph(e){jc(e).forEach((e=>e.dispose()))}function mh(e){return Hc.keep(e)}function fh(e,t,n=1){return Hc.registerBackend(e,t,n)}function gh(){return Hc.backend}vc=function(e){cr().getBool("DEPRECATION_WARNINGS_ENABLED")};const yh=4;async function bh(e,t){const n=[],a=[],i=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);for(let s=0;s{const t=await o.bytes(),n=t.reduce(((e,t)=>e+t.length),0)+yh*t.length,a=new Uint8Array(n);let i=0;for(let e=0;en.slice(i+e,i+t)));a[e.name]=Ah(e,n.slice(i,i+t)),i+=t}return a}function kh(e,t){const n=zs(e.shape);let a;if("quantization"in e){const t=e.quantization;a=lh[t.dtype]}else{if("string"===e.dtype){let e=0;for(let a=0;a{let t=e<<13,n=0;for(;!(8388608&t);)n-=8388608,t<<=1;return t&=-8388609,n+=947912704,t|n},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let e=1024;e<2048;e++)t[e]=939524096+(e-1024<<13);return t}(),t=function(){const e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}(),n=function(){const e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}();return a=>{const i=new ArrayBuffer(4*a.length),s=new Uint32Array(i);for(let i=0;i>10]+(1023&r)]+t[r>>10];s[i]=o}return new Float32Array(i)}}();r=e(u)}}else{if("int32"!==a)throw new Error(`Unsupported dtype in weight '${n}': ${a}`);if("uint8"!==i.dtype&&"uint16"!==i.dtype)throw new Error(`Unsupported quantization type ${i.dtype} for weight type int32.`);r=new Int32Array(u.length);for(let e=0;e(i=await xh(a,i,t),i.slice(e,t))));i=await xh(a,i,t);const s=i.slice(0,t);i=i.slice(t);const r=Ah(e,s);if(n[e.name]=r,"webgpu"===Hc.backendName){const e=gh();"uploadToGPU"in e&&zs(r.shape)>=cr().get("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD")&&e.uploadToGPU(r.dataId)}}return n}function Sh(e){if(null===e)throw new Error(`Invalid input value: ${JSON.stringify(e)}`);let t=0;const n=[];e.forEach((e=>{if(t+=e.byteLength,n.push(e.byteLength===e.buffer.byteLength?e:new e.constructor(e)),!(e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${e.constructor.name}`)}));const a=new Uint8Array(t);let i=0;return n.forEach((e=>{a.set(new Uint8Array(e.buffer),i),i+=e.byteLength})),a.buffer}const Eh="undefined"!=typeof Buffer&&("undefined"==typeof Blob||"undefined"==typeof atob||"undefined"==typeof btoa);function _h(e){return Eh?Buffer.byteLength(e,"utf8"):new Blob([e]).size}function Th(e){return uh.join(e)}function Ih(e){for(e=e.trim();e.endsWith("/");)e=e.slice(0,e.length-1);const t=e.split("/");return t[t.length-1]}function Nh(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),null!=e.initializerSignature&&(n.initializerSignature=e.initializerSignature),null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),n}function Rh(e,t,n){const a={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(null!=e.trainingConfig&&(a.trainingConfig=e.trainingConfig),null!=e.weightsManifest){if(!t)throw new Error("modelJSON has weightsManifest but weightSpecs is null");if(!n)throw new Error("modelJSON has weightsManifest but weightData is null");a.weightSpecs=t,a.weightData=n}return null!=e.signature&&(a.signature=e.signature),null!=e.userDefinedMetadata&&(a.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(a.modelInitializer=e.modelInitializer),null!=e.initializerSignature&&(a.initializerSignature=e.initializerSignature),a}async function Dh(e,t){let n,a;return null!=e.weightsManifest&&([n,a]=await t(e.weightsManifest)),Rh(e,n,a)}function zh(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:null==e.modelTopology?0:_h(JSON.stringify(e.modelTopology)),weightSpecsBytes:null==e.weightSpecs?0:_h(JSON.stringify(e.weightSpecs)),weightDataBytes:null==e.weightData?0:new uh(e.weightData).byteLength}}function Oh(e){const t=[];for(const n of e)t.push(...n.weights);return t}class Mh{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return null==Mh.instance&&(Mh.instance=new Mh),Mh.instance}static registerSaveRouter(e){Mh.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Mh.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Mh.getHandlers(e,"save")}static getLoadHandlers(e,t){return Mh.getHandlers(e,"load",t)}static getHandlers(e,t,n){const a=[];return("load"===t?Mh.getInstance().loadRouters:Mh.getInstance().saveRouters).forEach((t=>{const i=t(e,n);null!==i&&a.push(i)})),a}}const Bh=e=>Mh.registerSaveRouter(e),Fh=e=>Mh.registerLoadRouter(e),Lh=e=>Mh.getSaveHandlers(e),Ph=(e,t)=>Mh.getLoadHandlers(e,t),jh="tensorflowjs",Vh="models_store",Uh="model_info_store";function Wh(){if(!cr().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");const e="undefined"==typeof window?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(null==t)throw new Error("The current browser does not appear to support IndexedDB.");return t}function Gh(e){const t=e.result;t.createObjectStore(Vh,{keyPath:"modelPath"}),t.createObjectStore(Uh,{keyPath:"modelPath"})}class qh{constructor(e){if(this.indexedDB=Wh(),null==e||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise(((e,n)=>{const a=this.indexedDB.open(jh,1);a.onupgradeneeded=()=>Gh(a),a.onsuccess=()=>{const i=a.result;if(null==t){const t=i.transaction(Vh,"readonly"),a=t.objectStore(Vh).get(this.modelPath);a.onsuccess=()=>{if(null==a.result)return i.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));e(a.result.modelArtifacts)},a.onerror=e=>(i.close(),n(a.error)),t.oncomplete=()=>i.close()}else{t.weightData=uh.join(t.weightData);const a=zh(t),s=i.transaction(Uh,"readwrite");let r,o,l=s.objectStore(Uh);try{r=l.put({modelPath:this.modelPath,modelArtifactsInfo:a})}catch(e){return n(e)}r.onsuccess=()=>{o=i.transaction(Vh,"readwrite");const r=o.objectStore(Vh);let u;try{u=r.put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:a})}catch(e){return n(e)}u.onsuccess=()=>e({modelArtifactsInfo:a}),u.onerror=e=>{l=s.objectStore(Uh);const t=l.delete(this.modelPath);t.onsuccess=()=>(i.close(),n(u.error)),t.onerror=e=>(i.close(),n(u.error))}},r.onerror=e=>(i.close(),n(r.error)),s.oncomplete=()=>{null==o?i.close():o.oncomplete=()=>i.close()}}},a.onerror=e=>n(a.error)}))}}qh.URL_SCHEME="indexeddb://";const Hh=e=>{return cr().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(qh.URL_SCHEME)?(t=e.slice(qh.URL_SCHEME.length),new qh(t)):null;var t};Mh.registerSaveRouter(Hh),Mh.registerLoadRouter(Hh);class Kh{constructor(){this.indexedDB=Wh()}async listModels(){return new Promise(((e,t)=>{const n=this.indexedDB.open(jh,1);n.onupgradeneeded=()=>Gh(n),n.onsuccess=()=>{const a=n.result,i=a.transaction(Uh,"readonly"),s=i.objectStore(Uh).getAll();s.onsuccess=()=>{const t={};for(const e of s.result)t[e.modelPath]=e.modelArtifactsInfo;e(t)},s.onerror=e=>(a.close(),t(s.error)),i.oncomplete=()=>a.close()},n.onerror=e=>t(n.error)}))}async removeModel(e){var t;return e=(t=e).startsWith(qh.URL_SCHEME)?t.slice(qh.URL_SCHEME.length):t,new Promise(((t,n)=>{const a=this.indexedDB.open(jh,1);a.onupgradeneeded=()=>Gh(a),a.onsuccess=()=>{const i=a.result,s=i.transaction(Uh,"readwrite"),r=s.objectStore(Uh),o=r.get(e);let l;o.onsuccess=()=>{if(null==o.result)return i.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{const a=r.delete(e),s=()=>{l=i.transaction(Vh,"readwrite");const a=l.objectStore(Vh).delete(e);a.onsuccess=()=>t(o.result.modelArtifactsInfo),a.onerror=e=>n(o.error)};a.onsuccess=s,a.onerror=e=>(s(),i.close(),n(o.error))}},o.onerror=e=>(i.close(),n(o.error)),s.oncomplete=()=>{null==l?i.close():l.oncomplete=()=>i.close()}},a.onerror=e=>n(a.error)}))}}const $h="/",Zh="tensorflowjs_models",Xh="info",Yh="model_topology",Qh="weight_specs",Jh="weight_data",ed="model_metadata";function td(e){return{info:[Zh,e,Xh].join($h),topology:[Zh,e,Yh].join($h),weightSpecs:[Zh,e,Qh].join($h),weightData:[Zh,e,Jh].join($h),modelMetadata:[Zh,e,ed].join($h)}}function nd(e){for(const t of Object.values(e))window.localStorage.removeItem(t)}function ad(e){const t=e.split($h);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join($h)}class id{constructor(e){if(!cr().getBool("IS_BROWSER")||"undefined"==typeof window||void 0===window.localStorage)throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,null==e||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=td(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{const t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),a=zh(e),i=uh.join(e.weightData);try{this.LS.setItem(this.keys.info,JSON.stringify(a)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,function(e){if(Eh)return Buffer.from(e).toString("base64");const t=new Uint8Array(e);let n="";for(let e=0,a=t.length;e{return cr().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(id.URL_SCHEME)?(t=e.slice(id.URL_SCHEME.length),new id(t)):null;var t};Mh.registerSaveRouter(sd),Mh.registerLoadRouter(sd);class rd{constructor(){Ns(cr().getBool("IS_BROWSER"),(()=>"Current environment is not a web browser")),Ns("undefined"==typeof window||void 0!==window.localStorage,(()=>"Current browser does not appear to support localStorage")),this.LS=window.localStorage}async listModels(){const e={},t=Zh+$h,n=$h+Xh;for(let a=0;a"scheme must not be undefined or null.")),e.endsWith(od)&&(e=e.slice(0,e.indexOf(od))),Ns(e.length>0,(()=>"scheme must not be an empty string."));const n=ld.getInstance();Ns(null==n.managers[e],(()=>`A model store manager is already registered for scheme '${e}'.`)),n.managers[e]=t}static getManager(e){const t=ld.getInstance().managers[e];if(null==t)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(ld.getInstance().managers)}}function ud(e){if(-1===e.indexOf(od))throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ld.getSchemes().join(",")}`);return{scheme:e.split(od)[0],path:e.split(od)[1]}}async function cd(e,t,n=!1){Ns(e!==t,(()=>`Old path and new path are the same: '${e}'`));const a=Mh.getLoadHandlers(e);Ns(a.length>0,(()=>`Copying failed because no load handler is found for source URL ${e}.`)),Ns(a.length<2,(()=>`Copying failed because more than one (${a.length}) load handlers for source URL ${e}.`));const i=a[0],s=Mh.getSaveHandlers(t);Ns(s.length>0,(()=>`Copying failed because no save handler is found for destination URL ${t}.`)),Ns(s.length<2,(()=>`Copying failed because more than one (${a.length}) save handlers for destination URL ${t}.`));const r=s[0],o=ud(e).scheme,l=ud(e).path,u=o===ud(e).scheme,c=await i.load();n&&u&&await ld.getManager(o).removeModel(l);const h=await r.save(c);return n&&!u&&await ld.getManager(o).removeModel(l),h.modelArtifactsInfo}async function hd(){const e=ld.getSchemes(),t={};for(const n of e){const e=await ld.getManager(n).listModels();for(const a in e){t[n+od+a]=e[a]}}return t}async function dd(e){const t=ud(e);return ld.getManager(t.scheme).removeModel(t.path)}async function pd(e,t){return cd(e,t,!1)}async function md(e,t){return cd(e,t,!0)}class fd{constructor(){this.messageName="setTimeoutCustom",this.functionRefs=[],this.handledMessageCount=0,this.hasEventListener=!1}fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return null==this.textEncoder&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}setTimeoutCustom(e,t){"undefined"!=typeof window&&cr().getBool("USE_SETTIMEOUTCUSTOM")?(this.functionRefs.push(e),setTimeout((()=>{window.postMessage({name:this.messageName,index:this.functionRefs.length-1},"*")}),t),this.hasEventListener||(this.hasEventListener=!0,window.addEventListener("message",(e=>{if(e.source===window&&e.data.name===this.messageName){e.stopPropagation();(0,this.functionRefs[e.data.index])(),this.handledMessageCount++,this.handledMessageCount===this.functionRefs.length&&(this.functionRefs=[],this.handledMessageCount=0)}}),!0))):setTimeout(e,t)}isTypedArray(e){return Fu(e)}}if(cr().get("IS_BROWSER")){cr().setPlatform("browser",new fd);try{ld.registerManager(id.URL_SCHEME,new rd)}catch(e){}try{ld.registerManager(qh.URL_SCHEME,new Kh)}catch(e){}}const gd=()=>__webpack_require__(8273);let yd;class bd{constructor(){this.util=__webpack_require__(9830),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return null!=cr().global.fetch?cr().global.fetch(e,t):(null==yd&&(yd=gd()),yd(e,t))}now(){const e=process.hrtime();return 1e3*e[0]+e[1]/1e6}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return 0===e.length?"":new this.util.TextDecoder(t).decode(e)}isTypedArray(e){return this.util.types.isFloat32Array(e)||this.util.types.isInt32Array(e)||this.util.types.isUint8Array(e)||this.util.types.isUint8ClampedArray(e)}}function vd(e,t="float32",n){return t=t||"float32",ar(e),new gc(e,t,n)}cr().get("IS_NODE")&&!cr().get("IS_BROWSER")&&cr().setPlatform("node",new bd);const kd=ih({cast_:function(e,t){const n=th(e,"x","cast");if(!function(e){return"bool"===e||"complex64"===e||"float32"===e||"int32"===e||"string"===e}(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if("string"===t&&"string"!==n.dtype||"string"!==t&&"string"===n.dtype)throw new Error("Only strings can be casted to strings");const a={x:n},i={dtype:t};return Hc.runKernel(Lr,a,i)}});const wd=ih({clone_:function(e){const t={x:th(e,"x","clone","string_or_numeric")};return Hc.runKernel(Ro,t)}});function Ad(e,t=!1){}qc();bc={buffer:vd,cast:kd,clone:wd,print:Ad};const xd=ih({add_:function(e,t){let n=th(e,"a","add"),a=th(t,"b","add");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(br,i)}});const Cd=ih({floorDiv_:function(e,t){let n=th(e,"a","floorDiv"),a=th(t,"b","floorDiv");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(So,i)}});const Sd=ih({div_:function(e,t){let n=th(e,"a","div"),a=th(t,"b","div");if([n,a]=Lc(n,a),"int32"===n.dtype&&"int32"===a.dtype)return Cd(n,a);const i={a:n,b:a};return Hc.runKernel(ho,i,{})}});const Ed=ih({mul_:function(e,t){let n=th(e,"a","mul"),a=th(t,"b","mul");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(ol,i)}});const _d=ih({sqrt_:function(e){const t={x:th(e,"x","sqrt","float32")};return Hc.runKernel(Kl,t)}});const Td=ih({square_:function(e){const t=th(e,"x","square");return Hc.runKernel("Square",{x:t},{})}});const Id=ih({zerosLike_:function(e){const t={x:th(e,"x","zerosLike")};return Hc.runKernel(ku,t)}});function Nd(e){return Hc.customGrad(e)}function Rd(e,t){if((ac(e)&&"string"!==t||Array.isArray(e))&&"complex64"!==t)throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if("string"===t&&ac(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return rh(e,[],[],t)}const Dd=new Map,zd=new Map;class Od{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}}class Md{constructor(){this.classNameMap={}}static getMap(){return null==Md.instance&&(Md.instance=new Md),Md.instance}static register(e){Md.getMap().classNameMap[e.className]=[e,e.fromConfig]}}function Bd(e,t,n){Ns(null!=e.className,(()=>"Class being registered does not have the static className property defined.")),Ns("string"==typeof e.className,(()=>"className is required to be a string, but got type "+typeof e.className)),Ns(e.className.length>0,(()=>"Class being registered has an empty-string as its className, which is disallowed.")),void 0===t&&(t="Custom"),void 0===n&&(n=e.className);const a=t+">"+n;return Md.register(e),Dd.set(a,e),zd.set(e,a),e}class Fd extends Od{minimize(e,t=!1,n){const{value:a,grads:i}=this.computeGradients(e,n);if(null!=n){const e=n.map((e=>({name:e.name,tensor:i[e.name]})));this.applyGradients(e)}else this.applyGradients(i);return ph(i),t?a:(a.dispose(),null)}get iterations(){return null==this.iterations_&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return function(e,t){Ns(Zs(e),(()=>"The f passed in variableGrads(f) must be a function")),Ns(null==t||Array.isArray(t)&&t.every((e=>e instanceof Ac)),(()=>"The varList passed in variableGrads(f, varList) must be an array of variables"));const n=null!=t;if(!n){t=[];for(const e in Hc.registeredVariables)t.push(Hc.registeredVariables[e])}const a=n?t.filter((e=>!e.trainable)):null,i=t.length;Ns((t=t.filter((e=>e.trainable))).length>0,(()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${i} variables is trainable.`));const{value:s,grads:r}=Hc.gradients(e,t,null,!0);Ns(r.some((e=>null!=e)),(()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize().")),Ns(0===s.rank,(()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${s.rank} tensor`));const o={};return t.forEach(((e,t)=>{null!=r[t]&&(o[e.name]=r[t])})),null!=a&&a.forEach((e=>o[e.name]=null)),{value:s,grads:o}}(e,t)}dispose(){null!=this.iterations_&&ph(this.iterations_)}async saveIterations(){return null==this.iterations_&&(this.iterations_=0),{name:"iter",tensor:Rd(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}}Object.defineProperty(Fd,Symbol.hasInstance,{value:e=>null!=e.minimize&&null!=e.computeGradients&&null!=e.applyGradients});class Ld extends Fd{static get className(){return"Adadelta"}constructor(e,t,n=null){super(),this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],null==n&&(this.epsilon=Hc.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t],i=!1;null==this.accumulatedGrads[n]&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:dh((()=>Id(a).variable(i)))}),null==this.accumulatedUpdates[n]&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:dh((()=>Id(a).variable(i)))});const s=Array.isArray(e)?e[n].tensor:e[t];if(null==s)return;const r=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;dh((()=>{const e=xd(Ed(r,this.rho),Ed(Td(s),1-this.rho)),t=Ed(Sd(_d(xd(o,this.epsilon)),_d(xd(r,this.epsilon))),s),n=xd(Ed(o,this.rho),Ed(Td(t),1-this.rho));r.assign(e),o.assign(n);const i=xd(Ed(t,-this.learningRate),a);a.assign(i)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedUpdates&&(ph(this.accumulatedGrads.map((e=>e.variable))),ph(this.accumulatedUpdates.map((e=>e.variable))))}async getWeights(){const e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){const t=(e=await this.extractIterations(e)).length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedUpdates=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}}function Pd(e,t,n){ar(e);const a={shape:e,value:t,dtype:n=n||$s(t)};return Hc.runKernel(Ao,{},a)}class jd extends Fd{static get className(){return"Adagrad"}constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t];if(null==this.accumulatedGrads[n]){const e=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:dh((()=>Pd(a.shape,this.initialAccumulatorValue).variable(e)))}}const i=Array.isArray(e)?e[n].tensor:e[t];if(null==i)return;const s=this.accumulatedGrads[n].variable;dh((()=>{const e=xd(s,Td(i));s.assign(e);const t=xd(Ed(Sd(i,_d(xd(e,Hc.backend.epsilon()))),-this.learningRate),a);a.assign(t)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedGrads&&ph(this.accumulatedGrads.map((e=>e.variable)))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulatedGrads=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}}const Vd=ih({pow_:function(e,t){let n=th(e,"base","pow"),a=th(t,"exp","pow");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(yl,i)}});const Ud=ih({sub_:function(e,t){let n=th(e,"a","sub"),a=th(t,"b","sub");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(cu,i)}});class Wd extends Fd{static get className(){return"Adam"}constructor(e,t,n,a=null){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=a,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],dh((()=>{this.accBeta1=Rd(t).variable(),this.accBeta2=Rd(n).variable()})),null==a&&(this.epsilon=Hc.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);dh((()=>{const n=Ud(1,this.accBeta1),a=Ud(1,this.accBeta2);t.forEach(((t,i)=>{const s=Hc.registeredVariables[t],r=!1;null==this.accumulatedFirstMoment[i]&&(this.accumulatedFirstMoment[i]={originalName:`${t}/m`,variable:dh((()=>Id(s).variable(r)))}),null==this.accumulatedSecondMoment[i]&&(this.accumulatedSecondMoment[i]={originalName:`${t}/v`,variable:dh((()=>Id(s).variable(r)))});const o=Array.isArray(e)?e[i].tensor:e[t];if(null==o)return;const l=this.accumulatedFirstMoment[i].variable,u=this.accumulatedSecondMoment[i].variable,c=xd(Ed(l,this.beta1),Ed(o,1-this.beta1)),h=xd(Ed(u,this.beta2),Ed(Td(o),1-this.beta2)),d=Sd(c,n),p=Sd(h,a);l.assign(c),u.assign(h);const m=xd(Ed(Sd(d,xd(_d(p),this.epsilon)),-this.learningRate),s);s.assign(m)})),this.accBeta1.assign(Ed(this.accBeta1,this.beta1)),this.accBeta2.assign(Ed(this.accBeta2,this.beta2))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&ph(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedSecondMoment&&ph(this.accumulatedSecondMoment.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e),dh((()=>{this.accBeta1.assign(Vd(this.beta1,this.iterations_+1)),this.accBeta2.assign(Vd(this.beta2,this.iterations_+1))}));const t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedSecondMoment=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}}const Gd=ih({abs_:function(e){const t=th(e,"x","abs");if("complex64"===t.dtype){const e={x:t};return Hc.runKernel(Ur,e)}{const e={x:t};return Hc.runKernel(fr,e)}}});function qd(e,t){const n=e.length,a=[];for(let i=0;i1&&1===r&&a.unshift(s)}return a}function Hd(e,t){const n=[];for(let a=0;a1)&&n.unshift(s)}return n}function Kd(e,t){const n=Math.max(e.length,t.length),a=new Array(n);for(let i=0;i{this.iteration=Rd(0).variable(),this.accBeta1=Rd(t).variable()})),null==a&&(this.epsilon=Hc.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);dh((()=>{const n=Ud(1,this.accBeta1),a=Sd(-this.learningRate,xd(Ed(this.iteration,this.decay),1));t.forEach(((t,i)=>{const s=Hc.registeredVariables[t],r=!1;null==this.accumulatedFirstMoment[i]&&(this.accumulatedFirstMoment[i]={originalName:`${t}/m`,variable:Id(s).variable(r)}),null==this.accumulatedWeightedInfNorm[i]&&(this.accumulatedWeightedInfNorm[i]={originalName:`${t}/v`,variable:Id(s).variable(r)});const o=Array.isArray(e)?e[i].tensor:e[t];if(null==o)return;const l=this.accumulatedFirstMoment[i].variable,u=this.accumulatedWeightedInfNorm[i].variable,c=xd(Ed(l,this.beta1),Ed(o,1-this.beta1)),h=Ed(u,this.beta2),d=Gd(o),p=$d(h,d);l.assign(c),u.assign(p);const m=xd(Ed(Sd(a,n),Sd(c,xd(p,this.epsilon))),s);s.assign(m)})),this.iteration.assign(xd(this.iteration,1)),this.accBeta1.assign(Ed(this.accBeta1,this.beta1))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&ph(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedWeightedInfNorm&&ph(this.accumulatedWeightedInfNorm.map((e=>e.variable)))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}}class Xd extends Fd{static get className(){return"SGD"}constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Array.isArray(e)?e[n].tensor:e[t];if(null==a)return;const i=Hc.registeredVariables[t];dh((()=>{const e=xd(Ed(this.c,a),i);i.assign(e)}))})),this.incrementIterations()}setLearningRate(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=mh(Rd(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(0!==(e=await this.extractIterations(e)).length)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}}class Yd extends Xd{static get className(){return"Momentum"}constructor(e,t,n=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Rd(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t];if(null==this.accumulations[n]){const e=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:dh((()=>Id(a).variable(e)))}}const i=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];null!=s&&dh((()=>{let e;const t=xd(Ed(this.m,i),s);e=this.useNesterov?xd(Ed(this.c,xd(s,Ed(t,this.m))),a):xd(Ed(this.c,t),a),i.assign(t),a.assign(e)}))})),this.incrementIterations()}dispose(){this.m.dispose(),null!=this.accumulations&&ph(this.accumulations.map((e=>e.variable)))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulations=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}}class Qd extends Fd{static get className(){return"RMSProp"}constructor(e,t=.9,n=0,a=null,i=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=a,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=i,null==a&&(this.epsilon=Hc.backend.epsilon()),null==e)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t],i=!1;null==this.accumulatedMeanSquares[n]&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:dh((()=>Id(a).variable(i)))}),null==this.accumulatedMoments[n]&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:dh((()=>Id(a).variable(i)))}),null==this.accumulatedMeanGrads[n]&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:dh((()=>Id(a).variable(i)))});const s=Array.isArray(e)?e[n].tensor:e[t];if(null==s)return;const r=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;dh((()=>{const e=xd(Ed(r,this.decay),Ed(Td(s),1-this.decay));if(this.centered){const t=this.accumulatedMeanGrads[n].variable,i=xd(Ed(t,this.decay),Ed(s,1-this.decay)),l=Sd(Ed(s,this.learningRate),_d(Ud(e,xd(Td(i),this.epsilon)))),u=xd(Ed(o,this.momentum),l);r.assign(e),t.assign(i),o.assign(u);const c=Ud(a,u);a.assign(c)}else{const e=xd(Ed(r,this.decay),Ed(Td(s),1-this.decay)),t=xd(Ed(o,this.momentum),Sd(Ed(s,this.learningRate),_d(xd(e,this.epsilon))));r.assign(e),o.assign(t);const n=Ud(a,t);a.assign(n)}}))})),this.incrementIterations()}dispose(){null!=this.accumulatedMeanSquares&&ph(this.accumulatedMeanSquares.map((e=>e.variable))),null!=this.accumulatedMeanGrads&&this.centered&&ph(this.accumulatedMeanGrads.map((e=>e.variable))),null!=this.accumulatedMoments&&ph(this.accumulatedMoments.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);const t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedMoments=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.centered&&(this.accumulatedMeanGrads=e.slice(2*t,3*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}}const Jd=[Ld,jd,Wd,Zd,Yd,Qd,Xd];function ep(e){return new Promise((e=>setTimeout(e))).then(e)}class tp{constructor(e){if(!cr().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(tp.URL_SCHEME)&&(e=e.slice(tp.URL_SCHEME.length)),null!=e&&0!==e.length||(e="model"),this.modelJsonFileName=e+".json",this.weightDataFileName=e+".weights.bin"}async save(e){if("undefined"==typeof document)throw new Error("Browser downloads are not supported in this environment since `document` is not present");const t=uh.join(e.weightData),n=window.URL.createObjectURL(new Blob([t],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{const t=Nh(e,[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}]),a=window.URL.createObjectURL(new Blob([JSON.stringify(t)],{type:"application/json"})),i=null==this.modelJsonAnchor?document.createElement("a"):this.modelJsonAnchor;if(i.download=this.modelJsonFileName,i.href=a,await ep((()=>i.dispatchEvent(new MouseEvent("click")))),null!=e.weightData){const e=null==this.weightDataAnchor?document.createElement("a"):this.weightDataAnchor;e.download=this.weightDataFileName,e.href=n,await ep((()=>e.dispatchEvent(new MouseEvent("click"))))}return{modelArtifactsInfo:zh(e)}}}}tp.URL_SCHEME="downloads://";class np{constructor(e){if(null==e||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise(((e,t)=>{const n=new FileReader;n.onload=n=>{const a=JSON.parse(n.target.result),i=a.modelTopology;if(null==i)return void t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));if(null==a.weightsManifest)return void t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));if(0===this.weightsFiles.length)return void e({modelTopology:i});const s=Dh(a,(e=>this.loadWeights(e)));e(s)},n.onerror=e=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),n.readAsText(this.jsonFile)}))}loadWeights(e){const t=[],n=[];for(const a of e)t.push(...a.weights),n.push(...a.paths);const a=this.checkManifestAndWeightFiles(e),i=n.map((e=>this.loadWeightsFile(e,a[e])));return Promise.all(i).then((e=>[t,e]))}loadWeightsFile(e,t){return new Promise(((n,a)=>{const i=new FileReader;i.onload=e=>{const t=e.target.result;n(t)},i.onerror=t=>a(`Failed to weights data from file of path '${e}'.`),i.readAsArrayBuffer(t)}))}checkManifestAndWeightFiles(e){const t=[],n=this.weightsFiles.map((e=>Ih(e.name))),a={};for(const i of e)i.paths.forEach((e=>{const i=Ih(e);if(-1!==t.indexOf(i))throw new Error(`Duplicate file basename found in weights manifest: '${i}'`);if(t.push(i),-1===n.indexOf(i))throw new Error(`Weight file with basename '${i}' is not provided.`);a[e]=this.weightsFiles[n.indexOf(i)]}));if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return a}}function ap(e){return new np(e)}function ip(e,t,n,a){!function(e){Ns(null!=e&&Array.isArray(e)&&e.length>0,(()=>"promises must be a none empty array"))}(e),function(e,t){Ns(e>=0&&e<=1,(()=>`Progress fraction must be in range [0, 1], but got startFraction ${e}`)),Ns(t>=0&&t<=1,(()=>`Progress fraction must be in range [0, 1], but got endFraction ${t}`)),Ns(t>=e,(()=>`startFraction must be no more than endFraction, but got startFraction ${e} and endFraction ${t}`))}(n=null==n?0:n,a=null==a?1:a);let i=0;return Promise.all(e.map((s=>(s.then((s=>{const r=n+ ++i/e.length*(a-n);return t(r),s})),s))))}async function sp(e,t){null==t&&(t={});const n=null==t.fetchFunc?cr().platform.fetch:t.fetchFunc,a=e.map((e=>n(e,t.requestInit,{isBinary:!0}))),i=(null==t.onProgress?await Promise.all(a):await ip(a,t.onProgress,0,.5)).map((e=>e.arrayBuffer()));return null==t.onProgress?await Promise.all(i):await ip(i,t.onProgress,.5,1)}async function rp(e,t="",n,a){return op((e=>sp(e,{requestInit:a})))(e,t,n)}function op(e){return async(t,n="",a)=>{const i=t.map((()=>!1)),s={},r=null!=a?a.map((()=>!1)):[],o=[];if(t.forEach(((e,t)=>{let n=0;e.weights.forEach((e=>{const l="quantization"in e?e.quantization.dtype:e.dtype,u=lh[l]*zs(e.shape),c=()=>{i[t]=!0,null==s[t]&&(s[t]=[]),s[t].push({manifestEntry:e,groupOffset:n,sizeBytes:u})};null!=a?a.forEach(((t,n)=>{t===e.name&&(c(),r[n]=!0)})):c(),o.push(e.name),n+=u}))})),!r.every((e=>e))){const e=a.filter(((e,t)=>!r[t]));throw new Error(`Could not find weights in manifest with names: ${e.join(", ")}. \nManifest JSON has weights with names: ${o.join(", ")}.`)}const l=i.reduce(((e,t,n)=>(t&&e.push(n),e)),[]),u=[];l.forEach((e=>{t[e].paths.forEach((e=>{const t=n+(n.endsWith("/")?"":"/")+e;u.push(t)}))}));const c=await e(u),h={};let d=0;return l.forEach((e=>{const n=t[e].paths.length,a=new uh(c.slice(d,d+n));s[e].forEach((e=>{const t=vh(a.slice(e.groupOffset,e.groupOffset+e.sizeBytes),[e.manifestEntry]);for(const e in t)h[e]=t[e]})),d+=n})),h}}Mh.registerSaveRouter((e=>cr().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(tp.URL_SCHEME)?function(e="model"){return new tp(e)}(e.slice(tp.URL_SCHEME.length)):null));class lp{constructor(e,t){if(this.DEFAULT_METHOD="POST",null==t&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.weightUrlConverter=t.weightUrlConverter,null!=t.fetchFunc?(Ns("function"==typeof t.fetchFunc,(()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)")),this.fetch=t.fetchFunc):this.fetch=cr().platform.fetch,Ns(null!=e&&e.length>0,(()=>"URL path for http must not be null, undefined or empty.")),Array.isArray(e)&&Ns(2===e.length,(()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`)),this.path=e,null!=t.requestInit&&null!=t.requestInit.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{},this.loadOptions=t}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");const t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;const n=Nh(e,[{paths:["./model.weights.bin"],weights:e.weightSpecs}]);if(t.body.append("model.json",new Blob([JSON.stringify(n)],{type:"application/json"}),"model.json"),null!=e.weightData){const n=uh.join(e.weightData);t.body.append("model.weights.bin",new Blob([n],{type:"application/octet-stream"}),"model.weights.bin")}const a=await this.fetch(this.path,t);if(a.ok)return{modelArtifactsInfo:zh(e),responses:[a]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${a.status}.`)}async loadModelJSON(){const e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(e){let t=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?t+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":t+=" Please make sure the server is serving valid JSON for this request.",new Error(t)}const n=t.modelTopology,a=t.weightsManifest;if(null==n&&null==a)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return t}async load(){if(this.loadOptions.streamWeights)return this.loadStream();return Dh(await this.loadModelJSON(),(e=>this.loadWeights(e)))}async loadStream(){const e=await this.loadModelJSON(),t=await this.getWeightUrls(e.weightsManifest),n=Oh(e.weightsManifest);return Object.assign(Object.assign({},e),{weightSpecs:n,getWeightStream:()=>function(e,t){var n;const a=null==t.fetchFunc?cr().platform.fetch:t.fetchFunc;let i,s=0;return null===(n=t.onProgress)||void 0===n||n.call(t,0),new ReadableStream({pull:async n=>{for(var r;st?e.substring(n):"";return[a+"/",i]}(t),i=this.weightPathPrefix||n,s=[],r=[];for(const t of e)for(const e of t.paths)null!=this.weightUrlConverter?r.push(this.weightUrlConverter(e)):s.push(i+e+a);return this.weightUrlConverter&&s.push(...await Promise.all(r)),s}async loadWeights(e){const t=await this.getWeightUrls(e);return[Oh(e),await sp(t,this.loadOptions)]}}function up(e){return null!=e.match(lp.URL_SCHEME_REGEX)}lp.URL_SCHEME_REGEX=/^https?:\/\//;const cp=(e,t)=>{if("undefined"==typeof fetch&&(null==t||null==t.fetchFunc))return null;{let n=!0;if(n=Array.isArray(e)?e.every((e=>up(e))):up(e),n)return hp(e,t)}return null};function hp(e,t){return new lp(e,t)}function dp(e,t){return hp(e,t)}Mh.registerSaveRouter(cp),Mh.registerLoadRouter(cp);class pp{constructor(e){this.modelArtifacts=e}load(){return this.modelArtifacts}}class mp{constructor(e){this.saveHandler=e}save(e){return this.saveHandler(e)}}class fp{constructor(e){e.load&&(this.load=()=>Promise.resolve(e.load())),e.save&&(this.save=t=>Promise.resolve(e.save(t)))}}function gp(e,t,n,a){return new fp(yp(...arguments))}function yp(e,t,n,a){if(1===arguments.length){const t=null!=e.modelTopology||null!=e.weightSpecs;return new pp(t?e:{modelTopology:e})}return new pp({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:a})}function bp(e){return new mp(e)}function vp(e){return new mp(e)}function kp(e,t,n){if(Ds(e),null!=t&&3!==t.length)throw new Error("tensor3d() requires shape to have three numbers");const a=Qc(e,n);if(3!==a.length&&1!==a.length)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return rh(e,t,a,n)}let wp,Ap=!1;function xp(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(null==e)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,a=!1,i=!1,s=!1,r=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if("undefined"!=typeof ImageData&&e instanceof ImageData)a=!0;else if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement)i=!0;else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)s=!0;else if(null!=e.getContext)r=!0;else{if(!("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap))throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);o=!0}if(null!=Ru(Au,Hc.backendName)){const n={pixels:e},a={numChannels:t};return Hc.runKernel(Au,n,a)}const[l,u]=i?[e.videoWidth,e.videoHeight]:[e.width,e.height];let c,h;if(r)c=e.getContext("2d").getImageData(0,0,l,u).data;else if(a||n)c=e.data;else if(s||i||o){if(null==wp)if("undefined"==typeof document){if("undefined"==typeof OffscreenCanvas||"undefined"==typeof OffscreenCanvasRenderingContext2D)throw new Error("Cannot parse input in current context. Reason: OffscreenCanvas Context2D rendering is not supported.");wp=new OffscreenCanvas(1,1).getContext("2d")}else wp=document.createElement("canvas").getContext("2d",{willReadFrequently:!0});wp.canvas.width=l,wp.canvas.height=u,wp.drawImage(e,0,0,l,u),c=wp.getImageData(0,0,l,u).data}if(4===t)h=new Int32Array(c);else{const e=l*u;h=new Int32Array(e*t);for(let n=0;n4||2===t)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${t}`);if("float32"!==e.dtype&&"int32"!==e.dtype)throw new Error(`Unsupported type for toPixels: ${e.dtype}. Please use float32 or int32 tensors.`)}async function Sp(e,t){let n=th(e,"img","toPixels");if(!(e instanceof kc)){const e=n;n=kd(e,"int32"),e.dispose()}Cp(n);const[a,i]=n.shape.slice(0,2),s=2===n.rank?1:n.shape[2],r=await n.data(),o="float32"===n.dtype?255:1,l=new Uint8ClampedArray(i*a*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${i}.`)}else if("int32"===n.dtype&&(i<0||i>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${i}.`);1===s?(t[0]=i*o,t[1]=i*o,t[2]=i*o):t[a]=i*o}const a=4*e;l[a+0]=Math.round(t[0]),l[a+1]=Math.round(t[1]),l[a+2]=Math.round(t[2]),l[a+3]=Math.round(t[3])}if(null!=t){if(!Ap){null!=Ru(co,Hc.backendName)&&(Ap=!0)}t.width=i,t.height=a;const e=t.getContext("2d"),n=new ImageData(l,i,a);e.putImageData(n,0,0)}return n!==e&&n.dispose(),l}const Ep=ih({fromPixels_:xp}),_p=-2,Tp=-1;function Ip(e,t,n){const a=e.shape.length;Ns(a===t.length,(()=>`Error in slice${a}D: Length of begin ${t} must match the rank of the array (${a}).`)),Ns(a===n.length,(()=>`Error in slice${a}D: Length of size ${n} must match the rank of the array (${a}).`));for(let i=0;i`Error in slice${a}D: begin[${i}] + size[${i}] (${t[i]+n[i]}) would overflow input.shape[${i}] (${e.shape[i]})`))}function Np(e){const t=[];let n=0;for(;e>0;)1&e&&t.push(n),e/=2,n++;return t}function Rp(e,t,n){const a=[];for(let i=0;i0){const l=t[0],u=n+1;c=Bp(r,l,u,a,e),h=Fp(o,l,u,i,e),d=Dp(s,l,u,e)}else for(let t=0;t-1)s[i]=0;else{const r=zp(t,n,i);let o=a[r];e&1<-1)s[i]=Number.MAX_SAFE_INTEGER;else{const r=zp(t,n,i);let o=a[r];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);const l=a[i];return r<0&&(r+=l),r=_s(0,r,l-1),r}function jp(e,t,n,a,i,s){let r=t[i];const o=n[i]||1;(e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);const l=a[i];return r<0&&(r+=l),r=o>0?_s(0,r,l):_s(-1,r,l-1),r}function Vp(e,t,n){let a=n.length;for(let e=0;e1){a=e;break}for(let i=a+1;i0||n[i]!==e[i])return!1;return!0}function Up(e,t){let n=e.length>0?e[e.length-1]:1;for(let a=0;a{Ns(-1!==e,(()=>"slice() does not support negative begin indexing."))})),s=null==n?new Array(i).fill(-1):"number"==typeof n?[n,...new Array(i-1).fill(-1)]:n.lengtht>=0?t:(Ns(-1===t,(()=>`Negative size values should be exactly -1 but got ${t} for the slice() size at index ${n}.`)),e.shape[n]-a[n]))),[a,s]}function Gp(e,t,n,a,i,s,r,o,l){let u;if(null==a?(u=new Array(t.length),u.fill(1)):u=a,null!=r&&r&r-1)throw new Error("Multiple ellipses in slice is not allowed.");let c=!1;const h={dims:u.length,numAddAxisAfterEllipsis:0,begin:t.slice(),end:n.slice(),strides:u.slice(),beginMask:i,endMask:s,ellipsisMask:r,newAxisMask:o,shrinkAxisMask:l};for(let e=0;e0?0:-1,d.strides[t]>0?a:a-1];if(n&&d.strides[t]<=0)throw Error("only stride 1 allowed on non-range indexing.");f=f&&1===d.strides[t];const r=!!(d.beginMask&1<=a)throw Error(`slice index ${d.begin[t]} of dimension ${t} out of bounds.`)}else d.begin[t]=qp(d.begin[t],0,d.strides[t],a,i,s),d.end[t]=qp(d.end[t],1,d.strides[t],a,i,s);const e=1===d.strides[t]&&0===d.begin[t]&&d.end[t]===a;p=p&&e,m=m&&(0===t&&1===d.strides[t]||e)}else p=p&&1===d.strides[t]&&r,m=m&&(0===t&&1===d.strides[t]||r);let o,l=!1;if(d.beginValid&&d.endValid?(o=d.end[t]-d.begin[t],l=!0):n?(o=1,l=!0):r&&a>=0&&(o=d.strides[t]<0?-a:a,l=!0),l){let e;e=0===o||o<0!=d.strides[t]<0?0:Math.trunc(o/d.strides[t])+(o%d.strides[t]!=0?1:0),g.push(e)}else g.push(-1)}for(let e=0;e=0?y.push(g[t]):t===_p&&y.push(1)}return{finalShapeSparse:y.filter(((e,t)=>d.finalShapeGatherIndices[t]!==_p)),finalShape:y,isIdentity:p,sliceDim0:m,isSimpleSlice:f,begin:d.begin,end:d.end,strides:d.strides}}function qp(e,t,n,a,i,s){if(i[t])return n>0?s[t]:s[t+1&1];{const t=e<0?a+e:e;return ts[1]?s[1]:t}}const Hp=ih({acos_:function(e){const t={x:th(e,"x","acos")};return Hc.runKernel(gr,t)}});const Kp=ih({acosh_:function(e){const t={x:th(e,"x","acosh")};return Hc.runKernel(yr,t)}});const $p=ih({addN_:function(e){Ns(Array.isArray(e),(()=>"The argument passed to tf.addN() must be a list of tensors")),Ns(e.length>=1,(()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`));const t=e.map(((e,t)=>th(e,`tensors${t}`,"addN"))),n=t[0];t.forEach((e=>{if(e.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")})),t.forEach((e=>{if(!Os(e.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")}));const a=t;return Hc.runKernel(vr,a)}});const Zp=ih({all_:function(e,t=null,n=!1){const a={x:th(e,"x","all","bool")},i={axis:t,keepDims:n};return Hc.runKernel(kr,a,i)}});const Xp=ih({any_:function(e,t=null,n=!1){const a={x:th(e,"x","any","bool")},i={axis:t,keepDims:n};return Hc.runKernel(wr,a,i)}});const Yp=ih({argMax_:function(e,t=0){const n={x:th(e,"x","argMax")},a={axis:t};return Hc.runKernel(Ar,n,a)}});const Qp=ih({argMin_:function(e,t=0){const n={x:th(e,"x","argMin")},a={axis:t};return Hc.runKernel(xr,n,a)}});const Jp=ih({asin_:function(e){const t={x:th(e,"x","asin")};return Hc.runKernel(Cr,t)}});const em=ih({asinh_:function(e){const t={x:th(e,"x","asinh")};return Hc.runKernel(Sr,t)}});const tm=ih({atan_:function(e){const t={x:th(e,"x","atan")};return Hc.runKernel(Er,t)}});const nm=ih({atan2_:function(e,t){let n=th(e,"a","atan2"),a=th(t,"b","atan2");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(Tr,i)}});const am=ih({atanh_:function(e){const t={x:th(e,"x","atanh")};return Hc.runKernel(_r,t)}});function im(e,t,n,a,i="NHWC",s){return om(e,[...t,e[3]],n,s,a,null,null,ym(i))}function sm(e,t,n,a,i,s,r="channelsLast"){const[o,l]=cm(t);let u;if("channelsLast"===r)u=[o,l,e[3],e[3]];else{if("channelsFirst"!==r)throw new Error(`Unknown dataFormat ${r}`);u=[o,l,e[1],e[1]]}return om(e,u,n,a,i,s,!1,r)}function rm(e,t,n,a,i,s,r="NDHWC"){const[o,l,u]=hm(t);let c,h;if("NDHWC"===r)h="channelsLast",c=[o,l,u,e[4],e[4]];else{if("NCDHW"!==r)throw new Error(`Unknown dataFormat ${r}`);h="channelsFirst",c=[o,l,u,e[1],e[1]]}return lm(e,c,n,a,i,!1,h,s)}function om(e,t,n,a,i,s,r=!1,o="channelsLast"){let[l,u,c,h]=[-1,-1,-1,-1];if("channelsLast"===o)[l,u,c,h]=e;else{if("channelsFirst"!==o)throw new Error(`Unknown dataFormat ${o}`);[l,h,u,c]=e}const[d,p,,m]=t,[f,g]=cm(n),[y,b]=cm(a),v=dm(d,y),k=dm(p,b),{padInfo:w,outHeight:A,outWidth:x}=function(e,t,n,a,i,s,r,o,l){let u,c,h;if("number"==typeof e){u={top:e,bottom:e,left:e,right:e,type:0===e?"VALID":"NUMBER"};const i=function(e,t,n,a,i){null==a&&(a=um(e,t,n));const s=e[0],r=e[1],o=pm((s-t+2*a)/n+1,i),l=pm((r-t+2*a)/n+1,i);return[o,l]}([t,n],s,a,e,o);c=i[0],h=i[1]}else if("same"===e){c=Math.ceil(t/a),h=Math.ceil(n/i);const e=Math.max(0,(c-1)*a+s-t),o=Math.max(0,(h-1)*i+r-n),l=Math.floor(e/2),d=e-l,p=Math.floor(o/2);u={top:l,bottom:d,left:p,right:o-p,type:"SAME"}}else if("valid"===e)u={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((t-s+1)/a),h=Math.ceil((n-r+1)/i);else{if("object"!=typeof e)throw Error(`Unknown padding parameter: ${e}`);{const d="channelsLast"===l?e[1][0]:e[2][0],p="channelsLast"===l?e[1][1]:e[2][1],m="channelsLast"===l?e[2][0]:e[3][0],f="channelsLast"===l?e[2][1]:e[3][1];u={top:d,bottom:p,left:m,right:f,type:0===d&&0===p&&0===m&&0===f?"VALID":"EXPLICIT"},c=pm((t-s+d+p)/a+1,o),h=pm((n-r+m+f)/i+1,o)}}return{padInfo:u,outHeight:c,outWidth:h}}(i,u,c,f,g,v,k,s,o),C=r?m*h:m;let S;return"channelsFirst"===o?S=[l,C,A,x]:"channelsLast"===o&&(S=[l,A,x,C]),{batchSize:l,dataFormat:o,inHeight:u,inWidth:c,inChannels:h,outHeight:A,outWidth:x,outChannels:C,padInfo:w,strideHeight:f,strideWidth:g,filterHeight:d,filterWidth:p,effectiveFilterHeight:v,effectiveFilterWidth:k,dilationHeight:y,dilationWidth:b,inShape:e,outShape:S,filterShape:t}}function lm(e,t,n,a,i,s=!1,r="channelsLast",o){let[l,u,c,h,d]=[-1,-1,-1,-1,-1];if("channelsLast"===r)[l,u,c,h,d]=e;else{if("channelsFirst"!==r)throw new Error(`Unknown dataFormat ${r}`);[l,d,u,c,h]=e}const[p,m,f,,g]=t,[y,b,v]=hm(n),[k,w,A]=hm(a),x=dm(p,k),C=dm(m,w),S=dm(f,A),{padInfo:E,outDepth:_,outHeight:T,outWidth:I}=function(e,t,n,a,i,s,r,o,l,u,c){let h,d,p,m;"valid"===e&&(e=0);if("number"==typeof e){h={top:e,bottom:e,left:e,right:e,front:e,back:e,type:0===e?"VALID":"NUMBER"};const f=function(e,t,n,a,i,s){null==i&&(i=um(e,t[0],a[0]));const r=[0,0,0,n];for(let n=0;n<3;n++)e[n]+2*i>=t[n]&&(r[n]=pm((e[n]-t[n]+2*i)/a[n]+1,s));return r}([t,n,a,1],[o,l,u],1,[i,s,r],e,c);d=f[0],p=f[1],m=f[2]}else{if("same"!==e)throw Error(`Unknown padding parameter: ${e}`);{d=Math.ceil(t/i),p=Math.ceil(n/s),m=Math.ceil(a/r);const e=(d-1)*i+o-t,c=(p-1)*s+l-n,f=(m-1)*r+u-a,g=Math.floor(e/2),y=e-g,b=Math.floor(c/2),v=c-b,k=Math.floor(f/2);h={top:b,bottom:v,left:k,right:f-k,front:g,back:y,type:"SAME"}}}return{padInfo:h,outDepth:d,outHeight:p,outWidth:m}}(i,u,c,h,y,b,v,x,C,S,o),N=s?g*d:g;let R;return"channelsFirst"===r?R=[l,N,_,T,I]:"channelsLast"===r&&(R=[l,_,T,I,N]),{batchSize:l,dataFormat:r,inDepth:u,inHeight:c,inWidth:h,inChannels:d,outDepth:_,outHeight:T,outWidth:I,outChannels:N,padInfo:E,strideDepth:y,strideHeight:b,strideWidth:v,filterDepth:p,filterHeight:m,filterWidth:f,effectiveFilterDepth:x,effectiveFilterHeight:C,effectiveFilterWidth:S,dilationDepth:k,dilationHeight:w,dilationWidth:A,inShape:e,outShape:R,filterShape:t}}function um(e,t,n,a=1){const i=dm(t,a);return Math.floor((e[0]*(n-1)-n+i)/2)}function cm(e){return"number"==typeof e?[e,e,e]:2===e.length?[e[0],e[1],1]:e}function hm(e){return"number"==typeof e?[e,e,e]:e}function dm(e,t){return t<=1?e:e+(e-1)*(t-1)}function pm(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function mm(e){const[t,n,a]=cm(e);return 1===t&&1===n&&1===a}function fm(e,t){return mm(e)||mm(t)}function gm(e){return cm(e).every((e=>e>0))}function ym(e){if("NHWC"===e)return"channelsLast";if("NCHW"===e)return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function bm(e,t,n){if(null!=n){if("string"==typeof t)throw Error(`Error in ${e}: pad must be an integer when using dimRoundingMode ${n} but got pad ${t}.`);if("number"==typeof t)Ns(Ms(t),(()=>`Error in ${e}: pad must be an integer when using dimRoundingMode ${n} but got pad ${t}.`));else{if("object"!=typeof t)throw Error(`Error in ${e}: Unknown padding parameter: ${t}`);t.forEach((t=>{t.forEach((t=>{Ns(Ms(t),(()=>`Error in ${e}: pad must be an integer when using dimRoundingMode ${n} but got pad ${t}.`))}))}))}}}const vm=ih({reshape_:function(e,t){const n={x:th(e,"x","reshape","string_or_numeric")},a={shape:t};return Hc.runKernel(_l,n,a)}});const km=ih({avgPool_:function(e,t,n,a,i){const s=th(e,"x","avgPool","float32");Ns(fm(n,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`));let r=s,o=!1;3===s.rank&&(o=!0,r=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]])),Ns(4===r.rank,(()=>`Error in avgPool: x must be rank 4 but got rank ${r.rank}.`)),bm("avgPool",a,i);const l={x:r},u={filterSize:t,strides:n,pad:a,dimRoundingMode:i};let c=Hc.runKernel(Ir,l,u);return c=kd(c,s.dtype),o?vm(c,[c.shape[1],c.shape[2],c.shape[3]]):c}});const wm=ih({avgPool3d_:function(e,t,n,a,i,s="NDHWC"){const r=th(e,"x","avgPool3d","float32");let o=r,l=!1;4===r.rank&&(l=!0,o=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]])),Ns(5===o.rank,(()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`)),Ns("NDHWC"===s,(()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`)),Ns("number"==typeof n&&n>0||Array.isArray(n)&&n[0]>0&&n[1]>0&&n[2]>0,(()=>`Error in avgPool3d: Stride must be > 0, but got '${n}'`)),bm("avgPool3d",a,i);const u={x:o},c={filterSize:t,strides:n,pad:a,dimRoundingMode:i,dataFormat:s};let h=Hc.runKernel(Rr,u,c);return h=kd(h,o.dtype),l?vm(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}});const Am=ih({concat_:function(e,t=0){Ns(e.length>=1,(()=>"Pass at least one tensor to concat"));const n=nh(e,"tensors","concat","string_or_numeric");if("complex64"===n[0].dtype&&n.forEach((e=>{if("complex64"!==e.dtype)throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${e.dtype}. `)})),1===n.length)return wd(n[0]);const a=n,i={axis:t};return Hc.runKernel(Wr,a,i)}});const xm=ih({matMul_:function(e,t,n=!1,a=!1){let i=th(e,"a","matMul"),s=th(t,"b","matMul");[i,s]=Lc(i,s);const r={a:i,b:s},o={transposeA:n,transposeB:a};return Hc.runKernel(zr,r,o)}});const Cm=ih({sigmoid_:function(e){const t={x:th(e,"x","sigmoid","float32")};return Hc.runKernel(ql,t)}});const Sm=ih({slice_:function(e,t,n){const a=th(e,"x","slice","string_or_numeric");if(0===a.rank)throw new Error("Slicing scalar is not possible");const i={x:a},s={begin:t,size:n};return Hc.runKernel(Vl,i,s)}});const Em=ih({tanh_:function(e){const t={x:th(e,"x","tanh","float32")};return Hc.runKernel(du,t)}});const _m=ih({basicLSTMCell_:function(e,t,n,a,i,s){const r=th(e,"forgetBias","basicLSTMCell"),o=th(t,"lstmKernel","basicLSTMCell"),l=th(n,"lstmBias","basicLSTMCell"),u=th(a,"data","basicLSTMCell"),c=th(i,"c","basicLSTMCell"),h=th(s,"h","basicLSTMCell"),d=Am([u,h],1),p=xm(d,o),m=xd(p,l),f=m.shape[0],g=m.shape[1]/4,y=[f,g],b=Sm(m,[0,0],y),v=Sm(m,[0,g],y),k=Sm(m,[0,2*g],y),w=Sm(m,[0,3*g],y),A=xd(Ed(Cm(b),Em(v)),Ed(c,Cm(xd(r,k))));return[A,Ed(Em(A),Cm(w))]}});const Tm=ih({batchToSpaceND_:function(e,t,n){const a=th(e,"x","batchToSpaceND"),i=t.reduce(((e,t)=>e*t));Ns(a.rank>=1+t.length,(()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`)),Ns(n.length===t.length,(()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`)),Ns(a.shape[0]%i==0,(()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${i}`));const s={x:a},r={blockShape:t,crops:n};return Hc.runKernel(Or,s,r)}});const Im=ih({batchNorm_:function(e,t,n,a,i,s){null==s&&(s=.001);const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(o.rank===l.rank,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),Ns(null==c||o.rank===c.rank,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),Ns(null==u||o.rank===u.rank,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));const h={x:function(e){let t;return t=0===e.rank||1===e.rank?vm(e,[1,1,1,e.size]):2===e.rank?vm(e,[1,1,e.shape[0],e.shape[1]]):3===e.rank?vm(e,[1,e.shape[0],e.shape[1],e.shape[2]]):e,t}(r),scale:u,offset:c,mean:o,variance:l},d={varianceEpsilon:s},p=Hc.runKernel(Eo,h,d);return vm(p,r.shape)}});const Nm=ih({batchNorm2d_:function(e,t,n,a,i,s){const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;return null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(2===r.rank,(()=>`Error in batchNorm2D: x must be rank 2 but got rank ${r.rank}.`)),Ns(2===o.rank||1===o.rank,(()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`)),Ns(2===l.rank||1===l.rank,(()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`)),null!=u&&Ns(2===u.rank||1===u.rank,(()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${u.rank}.`)),null!=c&&Ns(2===c.rank||1===c.rank,(()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${c.rank}.`)),Im(r,o,l,c,u,s)}});const Rm=ih({batchNorm3d_:function(e,t,n,a,i,s){const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;return null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(3===r.rank,(()=>`Error in batchNorm3D: x must be rank 3 but got rank ${r.rank}.`)),Ns(3===o.rank||1===o.rank,(()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`)),Ns(3===l.rank||1===l.rank,(()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`)),null!=u&&Ns(3===u.rank||1===u.rank,(()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${u.rank}.`)),null!=c&&Ns(3===c.rank||1===c.rank,(()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${c.rank}.`)),Im(r,o,l,c,u,s)}});const Dm=ih({batchNorm4d_:function(e,t,n,a,i,s){const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;return null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(4===r.rank,(()=>`Error in batchNorm4D: x must be rank 4 but got rank ${r.rank}.`)),Ns(4===o.rank||1===o.rank,(()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`)),Ns(4===l.rank||1===l.rank,(()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`)),null!=u&&Ns(4===u.rank||1===u.rank,(()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${u.rank}.`)),null!=c&&Ns(4===c.rank||1===c.rank,(()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${c.rank}.`)),Im(r,o,l,c,u,s)}});const zm=ih({bincount_:function(e,t,n){const a=th(e,"x","bincount"),i=th(t,"weights","bincount");Ns("int32"===a.dtype,(()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`)),Ns(n>=0,(()=>`size must be non-negative, but got ${n}.`)),Ns(i.size===a.size||0===i.size,(()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${i.shape}.`));const s={x:a,weights:i},r={size:n};return Hc.runKernel(Mr,s,r)}});const Om=ih({bitwiseAnd_:function(e,t){const n=th(e,"x","bitwiseAnd"),a=th(t,"y","bitwiseAnd");if(!Os(n.shape,a.shape))throw new Error(`BitwiseAnd: Tensors must have the same shape. x: ${n.shape}, y: ${a.shape}`);if("int32"!==n.dtype||"int32"!==a.dtype)throw new Error(`BitwiseAnd: Only supports 'int32' values in tensor, found type of x: ${n.dtype} and type of y: ${a.dtype}`);const i={a:n,b:a};return Hc.runKernel(Br,i)}});const Mm=ih({broadcastArgs_:function(e,t){const n=th(e,"s0","broadcastArgs","int32"),a=th(t,"s1","broadcastArgs","int32");if(1!==n.rank)throw new Error(`broadcastArgs(): first input must be a vector (rank=1). Has rank ${n.rank}`);if(1!==a.rank)throw new Error(`broadcastArgs(): second input must be a vector (rank=1). Has rank ${a.rank}`);const i={s0:n,s1:a};return Hc.runKernel(Fr,i)}});const Bm=ih({broadcastTo_:function(e,t){let n=th(e,"broadcastTo","x");const a=n.shape;if(ar(t),t.lengthn.rank){const e=n.shape.slice();for(;e.length=0;e--)if(i[e]===t[e])s[e]=1;else if(1!==n.shape[e])throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(0===s.map(((e,t)=>e>1?t:-1)).filter((e=>e>=0)).length)return wd(n);const r={x:n},o={reps:s};return Hc.runKernel(pu,r,o)}});const Fm=ih({ceil_:function(e){const t={x:th(e,"x","ceil","float32")};return Hc.runKernel(Pr,t)}});const Lm=ih({clipByValue_:function(e,t,n){const a=th(e,"x","clipByValue");if(Ns(t<=n,(()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`)),t===n)return Pd(a.shape,t,a.dtype);const i={x:a},s={clipValueMin:t,clipValueMax:n};return Hc.runKernel(jr,i,s)}});const Pm=ih({concat1d_:function(e){return Am(e,0)}});const jm=ih({concat2d_:function(e,t){return Am(e,t)}});const Vm=ih({concat3d_:function(e,t){return Am(e,t)}});const Um=ih({concat4d_:function(e,t){return Am(e,t)}});const Wm=ih({conv2d_:function(e,t,n,a,i="NHWC",s=[1,1],r){const o=th(e,"x","conv2d","float32"),l=th(t,"filter","conv2d","float32");let u=o,c=!1;3===o.rank&&(c=!0,u=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),Ns(4===u.rank,(()=>`Error in conv2d: input must be rank 4, but got rank ${u.rank}.`)),Ns(4===l.rank,(()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`)),bm("conv2d",a,r);const h="NHWC"===i?u.shape[3]:u.shape[1];Ns(h===l.shape[2],(()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${l.shape[2]}.`)),Ns(fm(n,s),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`)),Ns(gm(s),(()=>"Error in conv2D: Dilated rates should be larger than 0.")),Ns(gm(n),(()=>"Error in conv2D: Strides should be larger than 0."));const d={x:u,filter:l},p={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r},m=Hc.runKernel(Gr,d,p);return c?vm(m,[m.shape[1],m.shape[2],m.shape[3]]):m}});const Gm=ih({conv1d_:function(e,t,n,a,i="NWC",s=1,r){const o=th(e,"x","conv1d"),l=th(t,"filter","conv1d");let u=o,c=!1;2===o.rank&&(c=!0,u=vm(o,[1,o.shape[0],o.shape[1]])),Ns(3===u.rank,(()=>`Error in conv1d: input must be rank 3, but got rank ${u.rank}.`)),Ns(3===l.rank,(()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`)),bm("conv1d",a,r),Ns(u.shape[2]===l.shape[1],(()=>`Error in conv1d: depth of input (${u.shape[2]}) must match input depth for filter ${l.shape[1]}.`)),Ns(fm(n,s),(()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`)),Ns(gm(s),(()=>"Error in conv1D: Dilated rates should be larger than 0.")),Ns(gm(n),(()=>"Error in conv1D: Stride should be larger than 0.")),Ns("NWC"===i,(()=>`Error in conv1d: got dataFormat of ${i} but only NWC is currently supported.`));const h=vm(l,[1,l.shape[0],l.shape[1],l.shape[2]]),d=vm(u,[u.shape[0],1,u.shape[1],u.shape[2]]),p=Wm(d,h,[1,n],a,"NHWC",[1,s],r);return vm(p,c?[p.shape[2],p.shape[3]]:[p.shape[0],p.shape[2],p.shape[3]])}});const qm=ih({conv2DBackpropInput_:function(e,t,n,a,i,s="NHWC",r){Ns(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let o=e,l=t,u=!1;3===t.rank&&(u=!0,l=vm(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),Ns(4===o.length,(()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`)),Ns(4===l.rank,(()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`)),Ns(4===n.rank,(()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`));const c="NHWC"===s?o[3]:o[1],h="NHWC"===s?l.shape[3]:l.shape[1];Ns(c===n.shape[2],(()=>`Error in conv2dDerInput: depth of input (${c}) must match input depth for filter ${n.shape[2]}.`)),Ns(h===n.shape[3],(()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`)),bm("conv2dDerInput",i,r);const d={dy:l,filter:n},p={strides:a,pad:i,dataFormat:s,dimRoundingMode:r,inputShape:o},m=Hc.runKernel(Hr,d,p);return u?vm(m,[m.shape[1],m.shape[2],m.shape[3]]):m}});const Hm=ih({conv2dTranspose_:function(e,t,n,a,i,s){const r=th(e,"x","conv2dTranspose"),o=th(t,"filter","conv2dTranspose");return qm(n,r,o,a,i,"NHWC",s)}});const Km=ih({conv3d_:function(e,t,n,a,i="NDHWC",s=[1,1,1]){const r=th(e,"x","conv3d"),o=th(t,"filter","conv3d");let l=r,u=!1;4===r.rank&&(u=!0,l=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]])),Ns(5===l.rank,(()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`)),Ns(5===o.rank,(()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`)),Ns(l.shape[4]===o.shape[3],(()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`)),Ns(fm(n,s),(()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`)),Ns("NDHWC"===i,(()=>`Error in conv3d: got dataFormat of ${i} but only NDHWC is currently supported.`)),Ns(gm(s),(()=>"Error in conv3D: Dilated rates should be larger than 0.")),Ns(gm(n),(()=>"Error in conv3D: Strides should be larger than 0."));const c={x:l,filter:o},h={strides:n,pad:a,dataFormat:i,dilations:s},d=Hc.runKernel(Kr,c,h);return u?vm(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}});const $m=ih({conv3DBackpropInput_:function(e,t,n,a,i){Ns(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let s=e,r=t,o=!1;4===t.rank&&(o=!0,r=vm(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);const l=s[4],u=r.shape[4];Ns(5===s.length,(()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`)),Ns(5===r.rank,(()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${r.rank}`)),Ns(5===n.rank,(()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`)),Ns(l===n.shape[3],(()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`)),Ns(u===n.shape[4],(()=>`Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${n.shape[4]}.`));const c={dy:r,filter:n},h={pad:i,strides:a,inputShape:s},d=Hc.runKernel(Zr,c,h);return o?vm(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}});const Zm=ih({conv3dTranspose_:function(e,t,n,a,i){const s=th(e,"x","conv3dTranspose"),r=th(t,"filter","conv3dTranspose");return $m(n,s,r,a,i)}});const Xm=ih({cos_:function(e){const t={x:th(e,"x","cos","float32")};return Hc.runKernel(Xr,t)}});const Ym=ih({cosh_:function(e){const t={x:th(e,"x","cosh","float32")};return Hc.runKernel(Yr,t)}});const Qm=ih({cumprod_:function(e,t=0,n=!1,a=!1){const i={x:th(e,"x","cumprod")},s={axis:t,exclusive:n,reverse:a};return Hc.runKernel(Qr,i,s)}});const Jm=ih({cumsum_:function(e,t=0,n=!1,a=!1){const i={x:th(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:a};return Hc.runKernel(Jr,i,s)}});const ef=ih({denseBincount_:function(e,t,n,a=!1){const i=th(e,"x","denseBincount"),s=th(t,"weights","denseBincount");Ns("int32"===i.dtype,(()=>`Error in denseBincount: input dtype must be int32, but got ${i.dtype}`)),Ns(i.rank<=2,(()=>`Error in denseBincount: input must be at most rank 2, but got rank ${i.rank}.`)),Ns(n>=0,(()=>`size must be non-negative, but got ${n}.`)),Ns(s.size===i.size||0===s.size,(()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${i.shape}, weights shape: ${s.shape}.`));const r={x:i,weights:s},o={size:n,binaryOutput:a};return Hc.runKernel(to,r,o)}});const tf=ih({depthToSpace_:function(e,t,n="NHWC"){const a=th(e,"x","depthToSpace","float32"),i="NHWC"===n?a.shape[1]:a.shape[2],s="NHWC"===n?a.shape[2]:a.shape[3],r="NHWC"===n?a.shape[3]:a.shape[1];Ns(t>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${t}`)),Ns(i*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${i} and ${t} for depthToSpace with input shape\n ${a.shape}`)),Ns(s*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${s} and ${t} for depthToSpace with input shape\n ${a.shape}`)),Ns(r%(t*t)==0,(()=>`Dimension size must be evenly divisible by ${t*t} but is ${r} for depthToSpace with input shape ${a.shape}`));const o={x:a},l={blockSize:t,dataFormat:n};return Hc.runKernel(no,o,l)}});const nf=ih({depthwiseConv2d_:function(e,t,n,a,i="NHWC",s=[1,1],r){const o=th(e,"x","depthwiseConv2d","float32"),l=th(t,"filter","depthwiseConv2d","float32");let u=o,c=!1;3===o.rank&&(c=!0,u=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),Ns(4===u.rank,(()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${u.rank}.`)),Ns(4===l.rank,(()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`));const h="NHWC"===i?u.shape[3]:u.shape[1];Ns(h===l.shape[2],(()=>`Error in depthwiseConv2d: number of input channels (${h}) must match the inChannels dimension in filter ${l.shape[2]}.`)),bm("depthwiseConv2d",a,r);const d={x:u,filter:l},p={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r},m=Hc.runKernel(ao,d,p);return c?vm(m,[m.shape[1],m.shape[2],m.shape[3]]):m}});const af=ih({diag_:function(e){const t={x:th(e,"x","diag")};return Hc.runKernel(ro,t)}});const sf=ih({dilation2d_:function(e,t,n,a,i=[1,1],s="NHWC"){const r=th(e,"x","dilation2d"),o=th(t,"filter","dilation2d");Ns(3===r.rank||4===r.rank,(()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${r.rank}.`)),Ns(3===o.rank,(()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`)),Ns("NHWC"===s,(()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`));let l=r,u=!1;3===r.rank&&(l=vm(r,[1,r.shape[0],r.shape[1],r.shape[2]]),u=!0),Ns(l.shape[3]===o.shape[2],(()=>`Error in dilation2d: input and filter must have the same depth: ${l.shape[3]} vs ${o.shape[2]}`));const c={x:l,filter:o},h={strides:n,pad:a,dilations:i},d=Hc.runKernel(oo,c,h);return u?vm(d,[d.shape[1],d.shape[2],d.shape[3]]):d}});const rf=ih({equal_:function(e,t){let n=th(e,"a","equal","string_or_numeric"),a=th(t,"b","equal","string_or_numeric");[n,a]=Lc(n,a),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(yo,i)}});const of=ih({where_:function(e,t,n){const a=th(t,"a","where"),i=th(n,"b","where"),s=th(e,"condition","where","bool"),r=Kd(Kd(s.shape,a.shape),i.shape),o={condition:Bm(s,r),t:Bm(a,r),e:Bm(i,r)};return Hc.runKernel(Pl,o)}});const lf=ih({divNoNan_:function(e,t){let n=th(e,"a","div"),a=th(t,"b","div");[n,a]=Lc(n,a);const i=Sd(n,a),s=Id(i),r=rf(a,s);return of(r,s,i)}});const uf=ih({dot_:function(e,t){const n=th(e,"t1","dot"),a=th(t,"t2","dot");Ns(!(1!==n.rank&&2!==n.rank||1!==a.rank&&2!==a.rank),(()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${a.rank}.`));const i=1===n.rank?n.size:n.shape[1],s=1===a.rank?a.size:a.shape[0];if(Ns(i===s,(()=>`Error in dot: inner dimensions of inputs must match, but got ${i} and ${s}.`)),1===n.rank&&1===a.rank){const e=vm(n,[1,-1]),t=vm(a,[-1,1]),i=xm(e,t);return vm(i,[])}if(1===n.rank&&2===a.rank){const e=vm(n,[1,-1]),t=vm(a,[a.shape[0],a.shape[1]]),i=xm(e,t);return vm(i,[i.size])}if(2===n.rank&&1===a.rank){const e=vm(a,[-1,1]),t=xm(n,e);return vm(t,[t.size])}{const e=vm(a,[a.shape[0],a.shape[1]]);return xm(n,e)}}});const cf=ih({einsum_:function(e,...t){const n=t.map(((e,t)=>th(e,`tensors${t}`,"einsum"))),a={equation:e};return Hc.runKernel(po,n,a)}});const hf=ih({elu_:function(e){const t={x:th(e,"x","elu","float32")};return Hc.runKernel(mo,t)}});const df=ih({ensureShape_:function(e,t){const n=th(e,"x","ensureShape","string_or_numeric");if(!function(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;for(let n=0;n"Input dtype must be `int32` or `float32`.")),"int32"===t.dtype&&(t=kd(t,"float32"));const n={x:t};return Hc.runKernel(go,n)}});function mf(e,t){for(let n=0;ne[t]))]}function yf(e,t){return ff(e,t.map((e=>1)),t)}function bf(e,t,n){Ns(mf(t,n),(()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`))}function vf(e,t){if(mf(e,t))return null;const n=[];for(let a=0;an.push(e))),n}function kf(e){return e.map(((e,t)=>[t,e])).sort(((e,t)=>e[1]-t[1])).map((e=>e[0]))}function wf(e,t){const n=[];for(let a=t-e;a"Axis must be <= rank of the tensor"));const a={input:n},i={dim:t};return Hc.runKernel(vo,a,i)}});const Nf=ih({expm1_:function(e){const t={x:th(e,"x","expm1")};return Hc.runKernel(ko,t)}});const Rf=ih({tile_:function(e,t){const n=th(e,"x","tile","string_or_numeric");Ns(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`));const a={x:n},i={reps:t};return Hc.runKernel(pu,a,i)}});const Df=ih({eye_:function(e,t,n,a="float32"){null==t&&(t=e);const i=vd([e,t],a),s=e<=t?e:t;for(let e=0;e`Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${s.rank}.`)),Ns(Ms(t),(()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`));let r=s,o=!1;3===s.rank&&(o=!0,r=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]]));const l={x:r},u={depthRadius:t,bias:n,alpha:a,beta:i},c=Hc.runKernel(Ho,l,u);return o?vm(c,[c.shape[1],c.shape[2],c.shape[3]]):c}});const Hf=ih({log_:function(e){const t={x:th(e,"x","log","float32")};return Hc.runKernel(Vo,t)}});const Kf=ih({log1p_:function(e){const t={x:th(e,"x","log1p")};return Hc.runKernel(Uo,t)}});const $f=ih({neg_:function(e){const t={x:th(e,"x","neg")};return Hc.runKernel(ll,t)}});const Zf=ih({softplus_:function(e){const t={x:th(e,"x","softplus")};return Hc.runKernel(Hl,t)}});const Xf=ih({logSigmoid_:function(e){const t=th(e,"x","logSigmoid");return Nd((e=>({value:$f(Zf($f(e))),gradFunc:t=>Ed(t,Cm($f(e)))})))(t)}});const Yf=ih({logSoftmax_:function(e,t=-1){const n=th(e,"logits","logSoftmax");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Nd(((e,n)=>{const a=Af(e,t,!0),i=Ud(e,a),s=Ud(kd(i,"float32"),Hf(Cf(Tf(i),t,!0)));n([s]);return{value:s,gradFunc:(e,n)=>{const[a]=n,i=Tf(a);return Ud(e,Ed(Cf(e,t,!0),i))}}}))(n)}});const Qf=ih({logSumExp_:function(e,t=null,n=!1){const a=th(e,"x","logSumExp"),i=js(t,a.shape),s=Af(a,i,!0),r=Ud(a,s),o=Tf(r),l=Cf(o,i),u=Hf(l),c=xd(vm(s,u.shape),u);if(n){const e=yf(c.shape,i);return vm(c,e)}return c}});const Jf=ih({logicalAnd_:function(e,t){const n=th(e,"a","logicalAnd","bool"),a=th(t,"b","logicalAnd","bool");Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(Wo,i)}});const eg=ih({logicalNot_:function(e){const t={x:th(e,"x","logicalNot","bool")};return Hc.runKernel(Go,t)}});const tg=ih({logicalOr_:function(e,t){const n=th(e,"a","logicalOr","bool"),a=th(t,"b","logicalOr","bool");Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(qo,i)}});const ng=ih({logicalXor_:function(e,t){const n=th(e,"a","logicalXor","bool"),a=th(t,"b","logicalXor","bool");return Kd(n.shape,a.shape),Jf(tg(e,t),eg(Jf(e,t)))}}),ag=2147483648;const ig=ih({searchSorted_:function(e,t,n="left"){const a=th(e,"sortedSequence","searchSorted"),i=th(t,"values","searchSorted"),s=a.shape[a.shape.length-1],r=i.shape[i.shape.length-1],o=vm(a,[-1,s]),l=vm(i,[-1,r]);if(o.rank<2)throw new Error("Sorted input argument must be at least 2-dimensional");if(o.shape[0]!==l.shape[0])throw new Error("Leading dimension of 'sortedSequence' and 'values' must match.");if(zs(l.shape)>=ag)throw new Error("values tensor size must less than 2147483648");if(o.shape[1]>=ag)throw new Error(`trailing dim_size must less than 2147483648 for int32 output type, was ${o.shape[1]}`);const u={sortedSequence:o,values:l},c={side:n};return Hc.runKernel(Ll,u,c)}});function sg(e,t){return ig(e,t,"left")}const rg=ih({maxPool_:function(e,t,n,a,i){const s=th(e,"x","maxPool");let r=s,o=!1;3===s.rank&&(o=!0,r=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]])),Ns(4===r.rank,(()=>`Error in maxPool: input must be rank 4 but got rank ${r.rank}.`)),Ns(fm(n,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`)),bm("maxPool",a,i);const l={x:r},u={filterSize:t,strides:n,pad:a,dimRoundingMode:i},c=Hc.runKernel(Xo,l,u);return o?vm(c,[c.shape[1],c.shape[2],c.shape[3]]):c}});const og=ih({maxPool3d_:function(e,t=[1,1,1],n,a,i,s="NDHWC"){const r=th(e,"x","maxPool3d");let o=r,l=!1;4===r.rank&&(l=!0,o=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]])),Ns(5===o.rank,(()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`)),Ns("NDHWC"===s,(()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`)),bm("maxPool3d",a,i);const u={x:o},c={filterSize:t,strides:n,pad:a,dimRoundingMode:i,dataFormat:s},h=Hc.runKernel(Qo,u,c);return l?vm(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}});const lg=ih({maxPoolWithArgmax_:function(e,t,n,a,i=!1){const s={x:th(e,"x","maxPoolWithArgmax")},r={filterSize:t,strides:n,pad:a,includeBatchInIndex:i},o=Hc.runKernel(el,s,r);return{result:o[0],indexes:o[1]}}});const ug=ih({mean_:function(e,t=null,n=!1){const a={x:th(e,"x","mean")},i={axis:t,keepDims:n};return Hc.runKernel(tl,a,i)}});function cg(e,t="float32"){if(ar(e),"complex64"===t){const t=cg(e,"float32"),n=cg(e,"float32");return sh(t,n)}const n=tr(zs(e),t);return Hc.makeTensor(n,e,t)}function hg(e,t="float32"){if(ar(e),"complex64"===t){const t=hg(e,"float32"),n=cg(e,"float32");return sh(t,n)}const n=er(zs(e),t);return Hc.makeTensor(n,e,t)}function dg(e,t,{indexing:n="xy"}={}){if("xy"!==n&&"ij"!==n)throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(void 0===e)return[];let a=th(e,"x","meshgrid",e instanceof kc?e.dtype:"float32");if(void 0===t)return[a];let i=th(t,"y","meshgrid",t instanceof kc?t.dtype:"float32");const s=zs(a.shape),r=zs(i.shape);return"xy"===n?(a=vm(a,[1,-1]),i=vm(i,[-1,1]),[xm(hg([r,1],a.dtype),a),xm(i,hg([1,s],i.dtype))]):(a=vm(a,[-1,1]),i=vm(i,[1,-1]),[xm(a,hg([1,r],a.dtype)),xm(hg([s,1],i.dtype),i)])}const pg=ih({minimum_:function(e,t){let n=th(e,"a","minimum"),a=th(t,"b","minimum");[n,a]=Lc(n,a),"bool"===n.dtype&&(n=kd(n,"int32"),a=kd(a,"int32")),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(al,i)}});const mg=ih({mirrorPad_:function(e,t,n){Ns("reflect"===n||"symmetric"===n,(()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`));const a=th(e,"x","mirrorPad");if(0===a.rank)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");Ns(t.length===a.rank,(()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`));const i="reflect"===n?1:0;for(let e=0;e"Invalid number of paddings. Must be length of 2 each.")),Ns(t[e][0]>=0&&t[e][0]<=a.shape[e]-i&&t[e][1]>=0&&t[e][1]<=a.shape[e]-i,(()=>`Padding in dimension ${e} cannot be greater than or equal to ${a.shape[e]-i} or less than 0 for input of shape ${a.shape}`));const s={paddings:t,mode:n},r={x:a};return Hc.runKernel(il,r,s)}});const fg=ih({mod_:function(e,t){let n=th(e,"a","mod"),a=th(t,"b","mod");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(sl,i)}});const gg=ih({moments_:function(e,t=null,n=!1){const a=js(t,(e=th(e,"x","moments")).shape),i=ug(e,a,n);let s=i.shape;n||(s=yf(i.shape,a));const r=Td(Ud(kd(e,"float32"),vm(i,s)));return{mean:i,variance:ug(r,a,n)}}});const yg=ih({multiRNNCell_:function(e,t,n,a){const i=th(t,"data","multiRNNCell"),s=nh(n,"c","multiRNNCell"),r=nh(a,"h","multiRNNCell");let o=i;const l=[];for(let t=0;t2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${r}`);n=n||Math.random();const o={logits:1===r?vm(i,[1,-1]):i},l={numSamples:t,seed:n,normalized:a},u=Hc.runKernel(rl,o,l);return 1===r?vm(u,[u.size]):u}});const vg=ih({notEqual_:function(e,t){let n=th(e,"a","notEqual","string_or_numeric"),a=th(t,"b","notEqual","string_or_numeric");[n,a]=Lc(n,a),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(ul,i)}});const kg=ih({oneHot_:function(e,t,n=1,a=0,i="int32"){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);const s={indices:th(e,"indices","oneHot","int32")},r={dtype:i,depth:t,onValue:n,offValue:a};return Hc.runKernel(ml,s,r)}});const wg=ih({onesLike_:function(e){const t={x:th(e,"x","onesLike")};return Hc.runKernel(pl,t)}});const Ag=ih({outerProduct_:function(e,t){const n=th(e,"v1","outerProduct"),a=th(t,"v2","outerProduct");Ns(1===n.rank&&1===a.rank,(()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${a.rank}.`));const i=vm(n,[-1,1]),s=vm(a,[1,-1]);return xm(i,s)}});const xg=ih({pad_:function(e,t,n=0){const a=th(e,"x","pad");if(0===a.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const i={paddings:t,constantValue:n},s={x:a};return Hc.runKernel(gl,s,i)}});const Cg=ih({pad1d_:function(e,t,n=0){return Ns(2===t.length,(()=>"Invalid number of paddings. Must be length of 2.")),xg(e,[t],n)}});const Sg=ih({pad2d_:function(e,t,n=0){return Ns(2===t.length&&2===t[0].length&&2===t[1].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),xg(e,t,n)}});const Eg=ih({pad3d_:function(e,t,n=0){return Ns(3===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),xg(e,t,n)}});const _g=ih({pad4d_:function(e,t,n=0){return Ns(4===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length&&2===t[3].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),xg(e,t,n)}});const Tg=ih({spaceToBatchND_:function(e,t,n){const a=th(e,"x","spaceToBatchND");Ns(a.rank>=1+t.length,(()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`)),Ns(n.length===t.length,(()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`)),Ns(a.shape.reduce(((e,a,i)=>i>0&&i<=t.length?e&&(a+n[i-1][0]+n[i-1][1])%t[i-1]==0:e),!0),(()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`));const i={x:a},s={blockShape:t,paddings:n};return Hc.runKernel(Zl,i,s)}});const Ig=ih({pool_:function(e,t,n,a,i,s,r){null==i&&(i=[1,1]),null==s&&(s=1),0===a&&(a="valid");const o=th(e,"x","maxPool");let l=o,u=!1;3===o.rank&&(u=!0,l=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),Ns(fm(s,i),(()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${i}'`));const c=sm(l.shape,t,s,i,a),h=[c.dilationHeight,c.dilationWidth];let d;d="same"===a?function(e,t){const n=e.map(((e,n)=>e+(e-1)*(t[n]-1))),a=n.map((e=>e-1)),i=a.map((e=>Math.floor(e/2))),s=a.map(((e,t)=>e-i[t]));return a.map(((e,t)=>[i[t],s[t]]))}([c.filterHeight,c.filterWidth],h):[[0,0],[0,0]];const p=1===h[0]&&1===h[1],[m,f]=function(e,t,n){const a=n.map((e=>e[0])),i=n.map((e=>e[1])),s=e.concat(a,i),r=t.map(((e,t)=>(e-s[t]%e)%e)),o=i.map(((e,t)=>e+r[t])),l=t.map(((e,t)=>[a[t],o[t]])),u=t.map(((e,t)=>[0,r[t]]));return[l,u]}([c.inHeight,c.inWidth],h,d),g=p?a:"valid",y=p?l:Tg(l,h,m),b=("avg"===n?()=>km(y,t,s,g,r):()=>rg(y,t,s,g,r))(),v=p?b:Tm(b,h,f);return u?vm(v,[v.shape[1],v.shape[2],v.shape[3]]):v}});const Ng=ih({prelu_:function(e,t){const n={x:th(e,"x","prelu"),alpha:th(t,"alpha","prelu")};return Hc.runKernel(bl,n)}});const Rg=ih({prod_:function(e,t=null,n=!1){let a=th(e,"x","prod");"bool"===a.dtype&&(a=kd(a,"int32"));const i={x:a},s={axis:t,keepDims:n};return Hc.runKernel(vl,i,s)}});const Dg=ih({raggedGather_:function(e,t,n,a){const i={paramsNestedSplits:e.map(((e,t)=>th(e,`tensors${t}`,"raggedGather","int32"))),paramsDenseValues:th(t,"paramsDenseValues","raggedGather"),indices:th(n,"indices","raggedGather","int32")},s={outputRaggedRank:a},r=Hc.runKernel(kl,i,s);return{outputNestedSplits:r.slice(0,r.length-1),outputDenseValues:r[r.length-1]}}});const zg=ih({raggedRange_:function(e,t,n){const a=th(e,"starts","raggedRange"),i={starts:a,limits:th(t,"limits","raggedRange",a.dtype),deltas:th(n,"deltas","raggedRange",a.dtype)},s=Hc.runKernel(wl,i);return{rtNestedSplits:s[0],rtDenseValues:s[1]}}});const Og=ih({raggedTensorToTensor_:function(e,t,n,a,i){const s=th(e,"shape","raggedTensorToTensor","int32"),r=th(t,"values","raggedTensorToTensor"),o={shape:s,values:r,defaultValue:th(n,"defaultValue","raggedTensorToTensor",r.dtype),rowPartitionTensors:a.map(((e,t)=>th(e,`tensors${t}`,"raggedTensorToTensor","int32")))},l={rowPartitionTypes:i};return Hc.runKernel(Al,o,l)}});const Mg=ih({rand_:function(e,t,n){ar(e);const a=zs(e);let i=null;if(null==n||"float32"===n)i=new Float32Array(a);else if("int32"===n)i=new Int32Array(a);else{if("bool"!==n)throw new Error(`Unknown data type ${n}`);i=new Uint8Array(a)}for(let e=0;e=1||0===s);const r=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*a*r,t=this.mean+this.stdDev*i*r,this.truncated&&!this.isValidTruncated(e)||(n=!0)}return this.truncated&&!this.isValidTruncated(t)||(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}}class Lg{constructor(e,t,n,a){this.alpha=e,this.beta=1/t,this.dtype=n;const i=a||Math.random();this.randu=Bg.alea(i.toString()),this.randn=new Fg(0,1,n,!1,this.randu()),this.d=e<1?e+2/3:e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,a,i,s;for(;;){do{a=this.randn.nextValue(),s=1+this.c*a}while(s<=0);if(s*=s*s,e=a*a,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),i=this.randu(),inull==this.dtype||"float32"===this.dtype,this.min=e,this.range=t-e,this.dtype=n,null==a&&(a=Math.random()),"number"==typeof a&&(a=a.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=Bg.alea(a)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}}const jg=ih({randomGamma_:function(e,t,n=1,a="float32",i){if(ar(e),null==n&&(n=1),null==a&&(a="float32"),"float32"!==a&&"int32"!==a)throw new Error(`Unsupported data type ${a}`);const s=new Lg(t,n,a,i),r=vd(e,a);for(let e=0;e`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`)),Xg(t,0)}});const Qg=ih({reverse2d_:function(e,t){const n=th(e,"x","reverse");return Ns(2===n.rank,(()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`)),Xg(n,t)}});const Jg=ih({reverse3d_:function(e,t){const n=th(e,"x","reverse");return Ns(3===n.rank,(()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`)),Xg(n,t)}});const ey=ih({reverse4d_:function(e,t){const n=th(e,"x","reverse");return Ns(4===n.rank,(()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`)),Xg(n,t)}});const ty=ih({round_:function(e){const t={x:th(e,"x","round")};return Hc.runKernel(Ol,t)}});const ny=ih({rsqrt_:function(e){const t={x:th(e,"x","rsqrt","float32")};return Hc.runKernel(Ml,t)}});const ay=ih({selu_:function(e){const t={x:th(e,"x","selu")};return Hc.runKernel(jl,t)}});const iy=ih({separableConv2d_:function(e,t,n,a,i,s=[1,1],r="NHWC"){const o=th(e,"x","separableConv2d"),l=th(t,"depthwiseFilter","separableConv2d"),u=th(n,"pointwiseFilter","separableConv2d");let c=o,h=!1;if(3===o.rank&&(h=!0,c=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),"NCHW"===r)throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");Ns(4===c.rank,(()=>`Error in separableConv2d: input must be rank 4, but got rank ${c.rank}.`)),Ns(4===l.rank,(()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`)),Ns(4===u.rank,(()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`)),Ns(1===u.shape[0],(()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${u.shape[0]}.`)),Ns(1===u.shape[1],(()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${u.shape[1]}.`));const d=l.shape[2],p=l.shape[3];Ns(u.shape[2]===d*p,(()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${d*p}, but got ${u.shape[2]}.`));const m=nf(c,l,a,i,r,s),f=Wm(m,u,1,"valid",r);return h?vm(f,[f.shape[1],f.shape[2],f.shape[3]]):f}});const sy=async function(e,t){const n=th(e,"x","setdiff1d"),a=th(t,"y","setdiff1d");Ns(n.dtype===a.dtype,(()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${a.dtype}).`)),Ns(1===n.rank,(()=>`x should be 1D tensor, but got x (${n.shape}).`)),Ns(1===a.rank,(()=>`y should be 1D tensor, but got y (${a.shape}).`));const i=await n.data(),s=await a.data(),r=new Set(s);let o=0;for(let e=0;e`slice1d expects a rank-1 tensor, but got a rank-${a.rank} tensor`)),Sm(a,[t],[n])}});const cy=ih({slice2d_:function(e,t,n){const a=th(e,"x","slice2d");return Ns(2===a.rank,(()=>`slice2d expects a rank-2 tensor, but got a rank-${a.rank} tensor`)),Sm(a,t,n)}});const hy=ih({slice3d_:function(e,t,n){const a=th(e,"x","slice3d");return Ns(3===a.rank,(()=>`slice3d expects a rank-3 tensor, but got a rank-${a.rank} tensor`)),Sm(a,t,n)}});const dy=ih({slice4d_:function(e,t,n){const a=th(e,"x","slice4d");return Ns(4===a.rank,(()=>`slice4d expects a rank-4 tensor, but got a rank-${a.rank} tensor`)),Sm(a,t,n)}});const py=ih({softmax_:function(e,t=-1){const n=th(e,"logits","softmax","float32");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);const a={logits:n},i={dim:t};return Hc.runKernel(Yl,a,i)}});const my=ih({fft_:function(e){Ns("complex64"===e.dtype,(()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`));const t={input:e};return Hc.runKernel(wo,t)}});const fy=ih({ifft_:function(e){Ns("complex64"===e.dtype,(()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`));const t={input:e};return Hc.runKernel(Do,t)}});const gy=ih({irfft_:function(e){const t=e.shape[e.shape.length-1],n=e.size/t;let a;if(t<=2){const i=vm(e,[n,t]);a=fy(i)}else{const i=[n,2*(t-1)],s=vm(Hg(e),[n,t]),r=vm(Ff(e),[n,t]),o=Xg(Sm(s,[0,1],[n,t-2]),1),l=Ed(Xg(Sm(r,[0,1],[n,t-2]),1),Rd(-1)),u=Am([s,o],1),c=Am([r,l],1),h=vm(sh(u,c),[i[0],i[1]]);a=fy(h)}if(a=Hg(a),3===e.rank&&0!==e.shape[0]){const t=a,n=e.shape[0];a=vm(a,[n,a.shape[0]/n,a.shape[1]]),t.dispose()}return a}});const yy=ih({split_:function(e,t,n=0){const a={x:th(e,"x","split")},i={numOrSizeSplits:t,axis:n};return Hc.runKernel(Xl,a,i)}});const by=ih({rfft_:function(e,t){Ns("float32"===e.dtype,(()=>`The dtype for rfft() must be real value but got ${e.dtype}`));let n=e.shape[e.shape.length-1];const a=e.size/n;let i;if(null!=t&&t0)),s=e.shape.map((e=>e));s[e.shape.length-1]=t,i=Sm(e,a,s),n=t}else if(null!=t&&t>n){const a=e.shape.map((e=>e));a[e.shape.length-1]=t-n,i=Am([e,cg(a)],e.shape.length-1),n=t}else i=e;const s=Id(i),r=vm(sh(i,s),[a,n]),o=my(r),l=Math.floor(n/2)+1,u=Hg(o),c=Ff(o),h=yy(u,[l,n-l],u.shape.length-1),d=yy(c,[l,n-l],c.shape.length-1),p=i.shape.slice();return p[i.shape.length-1]=l,vm(sh(h[0],d[0]),p)}});const vy=ih({squaredDifference_:function(e,t){let n=th(e,"a","squaredDifference"),a=th(t,"b","squaredDifference");[n,a]=Lc(n,a),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(au,i,{})}});const ky=ih({squeeze_:function(e,t){const n=th(e,"x","squeeze","string_or_numeric");return vm(n,Vs(n.shape,t).newShape)}});const wy=ih({stack_:function(e,t=0){const n=nh(e,"tensors","stack","string_or_numeric");Ns(n.length>=1,(()=>"Pass at least one tensor to tf.stack")),n.length>0&&Ns(t<=n[0].rank,(()=>"Axis must be <= rank of the tensor"));const a=n,i={axis:t};return Hc.runKernel(fl,a,i)}});const Ay=ih({step_:function(e,t=0){const n={x:th(e,"x","step")},a={alpha:t};return Hc.runKernel(wu,n,a)}});const xy=ih({stridedSlice_:function(e,t,n,a,i=0,s=0,r=0,o=0,l=0){const u={x:th(e,"x","stridedSlice","string_or_numeric")},c={begin:t,end:n,strides:a,beginMask:i,endMask:s,ellipsisMask:r,newAxisMask:o,shrinkAxisMask:l};return Hc.runKernel(ru,u,c)}});const Cy=ih({tan_:function(e){const t={x:th(e,"x","tan","float32")};return Hc.runKernel(hu,t)}});function Sy(e,t){Ds(e);const n=Qc(e,t);if(1!==n.length)throw new Error("tensor1d() requires values to be a flat/TypedArray");return rh(e,null,n,t)}function Ey(e,t,n){if(Ds(e),null!=t&&2!==t.length)throw new Error("tensor2d() requires shape to have two numbers");const a=Qc(e,n);if(2!==a.length&&1!==a.length)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return rh(e,t,a,n)}function _y(e,t,n){if(Ds(e),null!=t&&4!==t.length)throw new Error("tensor4d() requires shape to have four numbers");const a=Qc(e,n);if(4!==a.length&&1!==a.length)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return rh(e,t,a,n)}function Ty(e,t,n){if(Ds(e),null!=t&&5!==t.length)throw new Error("tensor5d() requires shape to have five numbers");const a=Qc(e,n);if(5!==a.length&&1!==a.length)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return rh(e,t,a,n)}function Iy(e,t,n){if(Ds(e),null!=t&&6!==t.length)throw new Error("tensor6d() requires shape to have six numbers");const a=Qc(e,n);if(6!==a.length&&1!==a.length)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return rh(e,t=t||a,a,n)}function Ny(e,t,n){const a=t.rank>1?t.shape[t.rank-1]:1,i=t.rank>1?t.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${a}, and batchDim: ${i}.`;if(n.rank1?t.shape[a-1]:1,s=n.length;let r=1;for(let e=i;e= 0 but got ${t}`);if(t>i)throw new Error(`'k' passed to topk() must be <= the last dimension (${i}) but got ${t}`);const s={x:a},r={k:t,sorted:n},[o,l]=Hc.runKernel(mu,s,r);return{values:o,indices:l}}});const My=ih({truncatedNormal_:function(e,t=0,n=1,a,i){if(ar(e),null!=a&&"bool"===a)throw new Error("Unsupported data type $ { dtype }");const s=new Fg(t,n,a,!0,i),r=vd(e,a);for(let e=0;e0,(()=>"The input tensor must be at least 1D"));const a={x:n},i={axis:t},[s,r]=Hc.runKernel(yu,a,i);return{values:s,indices:r}}});const Fy=ih({unsortedSegmentSum_:function(e,t,n){const a=th(e,"x","unsortedSegmentSum"),i=th(t,"segmentIds","unsortedSegmentSum","int32");Ns(Ms(n),(()=>"numSegments must be of dtype int"));const s={x:a,segmentIds:i},r={numSegments:n};return Hc.runKernel(vu,s,r)}});const Ly=ih({unstack_:function(e,t=0){const n=th(e,"x","unstack","string_or_numeric");Ns(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`));const a={value:n},i={axis:t};return Hc.runKernel(bu,a,i)}});function Py(e,t){return ig(e,t,"right")}function jy(e,t=!0,n,a){return Hc.makeVariable(e,t,n,a)}function Vy(e,t){const n=[];for(let e=0;e0,(()=>"mask cannot be scalar")),Rs(o.slice(s,s+r),i.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let e=s;et)).reverse()),Ns(a.rank===t.length,(()=>`Error in transpose: rank of input ${a.rank} must match length of perm ${t}.`)),t.forEach((e=>{Ns(e>=0&&e"All entries in 'perm' must be between 0 and "+(a.rank-1)+` but got ${t}`))})),a.rank<=1)return a.clone();const i={x:a},s={perm:t};return"complex64"===a.dtype?dh((()=>{let e=Hg(a),t=Ff(a);return e=Hc.runKernel(gu,{x:e},s),t=Hc.runKernel(gu,{x:t},s),n&&(t=$f(t)),sh(e,t)})):Hc.runKernel(gu,i,s)}});const qy=ih({movingAverage_:function(e,t,n,a,i=!0){const s=th(e,"v","movingAverage"),r=th(t,"x","movingAverage"),o=th(n,"decay","movingAverage");var l,u;u=r,Ns((l=s).dtype===u.dtype,(()=>`The dtypes of the first(${l.dtype}) and second(${u.dtype}) input must match`)),Ns(Os(s.shape,r.shape),(()=>"Shape mismatch in v and x"));const c=Rd(1),h=Ud(c,o);let d=Ed(Ud(r,s),h);if(i){Ns(null!=a,(()=>"When using zeroDebias: true, step is required."));const e=th(a,"step","movingAverage");d=Sd(d,Ud(c,Vd(o,e)))}return xd(s,d)}});const Hy=ih({scatterND_:function(e,t,n){ar(n);const a=th(e,"indices","scatterND","int32"),i=th(t,"updates","scatterND");Ry(i,a,n);const s={indices:a,updates:i},r={shape:n};return Hc.runKernel(Bl,s,r)}});const Ky=ih({sparseToDense_:function(e,t,n,a=0){ar(n);const i=th(e,"sparseIndices","sparseToDense","int32"),s=th(t,"sparseValues","sparseToDense","string_or_numeric"),r=th(a,"defaultValue","sparseToDense",s.dtype);!function(e,t,n,a){if("int32"!==e.dtype)throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);const i=e.rank>0?e.shape[0]:1,s=e.rank>1?e.shape[1]:1;if(n.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${s}.`);const r=t.size;if(0!==t.rank&&(1!==t.rank||r!==i))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${i}]`);if(t.dtype!==a.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}(i,s,n,r);const o={sparseIndices:i,sparseValues:s,defaultValue:r},l={outputShape:n};return Hc.runKernel(nu,o,l)}});const $y=ih({gatherND_:function(e,t){const n=th(t,"indices","gatherND","int32"),a={params:th(e,"x","gatherND","string_or_numeric"),indices:n};return Hc.runKernel(To,a)}});const Zy=ih({dropout_:function(e,t,n,a){const i=th(e,"x","dropout");if(Ns("float32"===i.dtype,(()=>`x has to be a floating point tensor since it's going to be scaled, but got a ${i.dtype} tensor instead.`)),Ns(t>=0&&t<1,(()=>`rate must be a float in the range [0, 1), but got ${t}.`)),0===t)return e instanceof kc?i.clone():i;const s=function(e,t){if(null==t)return e.shape.slice();if(Os(e.shape,t))return t;if(e.shape.length===t.length){const n=[];for(let a=0;a1,(()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${a.rank}`)),Ns(a.rank-1===i.rank,(()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${a.rank} and targets rank ${i.rank}`)),Rs(a.shape.slice(0,a.shape.length-1),i.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");const s=a.shape[a.shape.length-1];Ns(n>0&&n<=s,(()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`));const r=await a.data(),o=await i.data(),[l,u]=[r.length/s,s],c=Us("bool",l);for(let e=0;et.value-e.value)),c[e]=0;for(let t=0;t`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`)),Ns(4===l.rank,(()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`)),Ns(4===n.length,(()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`));const u="NHWC"===s?o.shape[3]:o.shape[1],c="NHWC"===s?l.shape[3]:l.shape[1];Ns(u===n[2],(()=>`Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${n[2]}.`)),Ns(c===n[3],(()=>`Error in conv2dDerFilter: depth of dy (${c}) must match output depth for filter (${n[3]}).`)),bm("conv2dDerFilter",i,r);const h={x:o,dy:l},d={strides:a,pad:i,dataFormat:s,dimRoundingMode:r,filterShape:n};return Hc.runKernel(qr,h,d)}});function eb(e,t,n){if(null==n||"linear"===n)return e;if("relu"===n)return Ed(e,Ay(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function tb(e,t){let n=t;const a=Hd(e.shape,t.shape);return a.length>0&&(n=Cf(n,a)),vm(n,e.shape)}function nb(e,t,n,a){if("linear"===t)return e;if("relu"===t)return $g(e);if("elu"===t)return hf(e);if("relu6"===t)return Zg(e);if("prelu"===t)return Ng(e,n);if("leakyrelu"===t)return Vf(e,a);if("sigmoid"===t)return Cm(e);throw new Error(`Unknown fused activation ${t}.`)}const ab=(e,t)=>!(e>0)||"linear"===t;const ib=ih({fusedConv2d_:function({x:e,filter:t,strides:n,pad:a,dataFormat:i="NHWC",dilations:s=[1,1],dimRoundingMode:r,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(l=l||"linear",!1===ab(Hc.state.gradientDepth,l)){Ns("NHWC"===i,(()=>`Error in fused conv2d: got dataFormat of ${i} but only NHWC is currently supported for the case of gradient depth is 0 and the activation is not linear.`));let h=Wm(e,t,n,a,i,s,r);return null!=o&&(h=xd(h,o)),nb(h,l,u,c)}const h=th(e,"x","conv2d","float32"),d=th(t,"filter","conv2d","float32");let p=h,m=!1;3===h.rank&&(m=!0,p=vm(h,[1,h.shape[0],h.shape[1],h.shape[2]])),Ns(4===p.rank,(()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`)),Ns(4===d.rank,(()=>`Error in fused conv2d: filter must be rank 4, but got rank ${d.rank}.`)),bm("fused conv2d",a,r);const f="NHWC"===i?p.shape[3]:p.shape[1];Ns(d.shape[2]===f,(()=>`Error in conv2d: depth of input (${f}) must match input depth for filter ${d.shape[2]}.`)),Ns(fm(n,s),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`));const g=om(p.shape,d.shape,n,s,a,r);let y,b;if(null!=o&&(y=th(o,"bias","fused conv2d"),[y]=Lc(y,h),"NHWC"===i?Kd(g.outShape,y.shape):(Ns(y.shape.length<=1,(()=>`Error in fused conv2d: only supports scalar or 1-D Tensor bias for NCHW format but got the bias of rank-${y.shape.length}.`)),Ns(0===y.shape.length||y.shape[0]===g.outChannels||1===y.shape[0],(()=>`Error in fused conv2d: bias shape (${y.shape}) is not compatible with the number of output channels (${g.outChannels})`)))),null!=u){const e=u.shape;if(Ns(e.length<=1||3===e.length,(()=>`Error in fused conv2d: only supports scalar, 1-D Tensor or 3-D Tensor PReLU activation weights but got a tensor of rank-${e.length}.`)),1===e.length)Ns(1===e[0]||e[0]===g.outChannels,(()=>`Error in fused conv2d: PReLU activation weights (${e}) is not compatible with the number of output channels (${g.outChannels}).`));else if(3===e.length)try{Kd(e,g.outShape)}catch(t){const n=`Error in fused conv2d: PReLU activation weights (${e}) is not compatible with the output shape of the conv2d (${g.outShape}).`;throw Error(n)}b=th(u,"prelu weights","fused conv2d")}const v=(e,t)=>{Ns("NHWC"===i,(()=>`Error in gradient of fused conv2D: got dataFormat of ${i} but only NHWC is currently supported.`));const[r,o,u,c]=t,h=eb(e,u,l);Ns(mm(s),(()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`));const d=[qm(o.shape,h,r,n,a),Jy(o,h,r.shape,n,a)];if(null!=c){const e=tb(c,h);d.push(e)}return d},k={x:p,filter:d,bias:y,preluActivationWeights:b},w={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r,activation:l,leakyreluAlpha:c};if(null==o){const e=Nd(((e,t,n)=>{let a=Hc.runKernel(Su,k,w);return n([t,e,a]),m&&(a=vm(a,[a.shape[1],a.shape[2],a.shape[3]])),{value:a,gradFunc:v}}));return e(p,d)}{const e=Nd(((e,t,n,a)=>{let i=Hc.runKernel(Su,k,w);return a([t,e,i,n]),m&&(i=vm(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:v}}));return e(p,d,y)}}});const sb=ih({depthwiseConv2dNativeBackpropFilter_:function(e,t,n,a,i,s=[1,1],r){let o=e;3===e.rank&&(o=vm(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;3===l.rank&&(l=vm(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const u={x:o,dy:l},c={strides:a,pad:i,dimRoundingMode:r,dilations:s,filterShape:n};return Hc.runKernel(io,u,c)}});const rb=ih({depthwiseConv2dNativeBackpropInput_:function(e,t,n,a,i,s=[1,1],r){let o=t,l=!1;3===t.rank&&(l=!0,o=vm(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const u={dy:o,filter:n},c={strides:a,pad:i,dimRoundingMode:r,dilations:s,inputShape:e},h=Hc.runKernel(so,u,c);return l?vm(h,[h.shape[1],h.shape[2],h.shape[3]]):h}});const ob=ih({fusedDepthwiseConv2d_:function({x:e,filter:t,strides:n,pad:a,dataFormat:i="NHWC",dilations:s=[1,1],dimRoundingMode:r,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(!1===ab(Hc.state.gradientDepth,l)){let h=nf(e,t,n,a,i,s,r);return null!=o&&(h=xd(h,o)),nb(h,l,u,c)}const h=th(e,"x","depthwiseConv2d","float32"),d=th(t,"filter","depthwiseConv2d","float32");let p=h,m=!1;3===h.rank&&(m=!0,p=vm(h,[1,h.shape[0],h.shape[1],h.shape[2]])),Ns(4===p.rank,(()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`)),Ns(4===d.rank,(()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${d.rank}.`)),Ns(p.shape[3]===d.shape[2],(()=>`Error in fused depthwiseConv2d: number of input channels (${p.shape[3]}) must match the inChannels dimension in filter ${d.shape[2]}.`)),null==s&&(s=[1,1]),Ns(fm(n,s),(()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`)),bm("fused depthwiseConv2d",a,r);const f=om(p.shape,d.shape,n,s,a,r,!0);let g,y;null!=o&&(g=th(o,"bias","fused conv2d"),[g]=Lc(g,h),Kd(f.outShape,g.shape)),null!=u&&(y=th(u,"prelu weights","fused depthwiseConv2d"));const b=(e,t)=>{Ns(mm(s),(()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`));const[i,o,u,c]=t,h=eb(e,u,l),d=rb(o.shape,h,i,n,a,s,r),p=sb(o,h,i.shape,n,a,s,r);if(null!=c){return[d,p,tb(g,h)]}return[d,p]},v={x:p,filter:d,bias:g,preluActivationWeights:y},k={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r,activation:l,leakyreluAlpha:c};if(null==o){const e=Nd(((e,t,n)=>{let a=Hc.runKernel(Eu,v,k);return n([t,e,a]),m&&(a=vm(a,[a.shape[1],a.shape[2],a.shape[3]])),{value:a,gradFunc:b}}));return e(p,d)}{const e=Nd(((e,t,n,a)=>{let i=Hc.runKernel(Eu,v,k);return a([t,e,i,n]),m&&(i=vm(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:b}}));return e(p,d,g)}}});const lb=ih({fusedMatMul_:function({a:e,b:t,transposeA:n=!1,transposeB:a=!1,bias:i,activation:s="linear",preluActivationWeights:r,leakyreluAlpha:o=.2}){if(!1===ab(Hc.state.gradientDepth,s)){let l=xm(e,t,n,a);return null!=i&&(l=xd(l,i)),nb(l,s,r,o)}let l=th(e,"a","fused matMul"),u=th(t,"b","fused matMul");[l,u]=Lc(l,u);const c=n?l.shape[l.rank-2]:l.shape[l.rank-1],h=a?u.shape[u.rank-1]:u.shape[u.rank-2],d=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=a?u.shape[u.rank-2]:u.shape[u.rank-1],m=l.shape.slice(0,-2),f=u.shape.slice(0,-2),g=zs(m),y=zs(f);Ns(c===h,(()=>`Error in fused matMul: inner shapes (${c}) and (${h}) of Tensors with shapes ${l.shape} and ${u.shape} and transposeA=${n} and transposeB=${a} must match.`));const b=Kd(l.shape.slice(0,-2),u.shape.slice(0,-2)).concat([d,p]),v=vm(l,n?[g,c,d]:[g,d,c]),k=vm(u,a?[y,p,h]:[y,h,p]);let w,A;null!=i&&(w=th(i,"bias","fused matMul"),[w]=Lc(w,l),Kd(b,w.shape)),null!=r&&(A=th(r,"prelu weights","fused matMul"));const x=(e,t)=>{const[r,o,l,u]=t,c=eb(vm(e,l.shape),l,s);let h,d;if(n||a?!n&&a?(h=xm(c,o,!1,!1),d=xm(c,r,!0,!1)):n&&!a?(h=xm(o,c,!1,!0),d=xm(r,c,!1,!1)):(h=xm(o,c,!0,!0),d=xm(c,r,!0,!0)):(h=xm(c,o,!1,!0),d=xm(r,c,!0,!1)),null!=i){return[h,d,tb(u,c)]}return[h,d]},C={a:v,b:k,bias:w,preluActivationWeights:A},S={transposeA:n,transposeB:a,activation:s,leakyreluAlpha:o};if(null==i){const e=Nd(((e,t,n)=>{const a=Hc.runKernel(Cu,C,S);return n([e,t,a]),{value:vm(a,b),gradFunc:x}}));return e(v,k)}{const e=Nd(((e,t,n,a)=>{const i=Hc.runKernel(Cu,C,S);return a([e,t,i,n]),{value:vm(i,b),gradFunc:x}}));return e(v,k,w)}}});const ub=ih({hammingWindow_:function(e){return Yy(e,.54,.46)}});const cb=ih({hannWindow_:function(e){return Yy(e,.5,.5)}});const hb=ih({frame_:function(e,t,n,a=!1,i=0){let s=0;const r=[];for(;s+t<=e.size;)r.push(Sm(e,s,t)),s+=n;if(a)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${r.rank}.`)),Ns(2===o.rank&&4===o.shape[1],(()=>`Error in cropAndResize: boxes must be have size [${u},4] but had shape ${o.shape}.`)),Ns(1===l.rank&&l.shape[0]===u,(()=>`Error in cropAndResize: boxInd must be have size [${u}] but had shape ${o.shape}.`)),Ns(2===a.length,(()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`)),Ns(a[0]>=1&&a[1]>=1,(()=>`cropSize must be atleast [1,1], but was ${a}`)),Ns("bilinear"===i||"nearest"===i,(()=>`method must be bilinear or nearest, but was ${i}`));const c={image:r,boxes:o,boxInd:l},h={method:i,extrapolationValue:s,cropSize:a};return Hc.runKernel(eo,c,h)}});const mb=ih({flipLeftRight_:function(e){const t=th(e,"image","flipLeftRight","float32");Ns(4===t.rank,(()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`));const n={image:t};return Hc.runKernel(xo,n,{})}});const fb=ih({grayscaleToRGB_:function(e){const t=th(e,"image","grayscaleToRGB"),n=t.rank-1,a=t.shape[n];Ns(t.rank>=2,(()=>`Error in grayscaleToRGB: images must be at least rank 2, but got rank ${t.rank}.`)),Ns(1===a,(()=>`Error in grayscaleToRGB: last dimension of a grayscale image should be size 1, but got size ${a}.`));const i=new Array(t.rank);return i.fill(1,0,n),i[n]=3,Rf(t,i)}});const gb=ih({rgbToGrayscale_:function(e){const t=th(e,"image","RGBToGrayscale"),n=t.rank-1,a=t.shape[n];Ns(t.rank>=2,(()=>`Error in RGBToGrayscale: images must be at least rank 2, but got rank ${t.rank}.`)),Ns(3===a,(()=>`Error in RGBToGrayscale: last dimension of an RGB image should be size 3, but got size ${a}.`));const i=t.dtype,s=kd(t,"float32"),r=Sy([.2989,.587,.114]);let o;switch(t.rank){case 2:o=cf("ij,j->i",s,r);break;case 3:o=cf("ijk,k->ij",s,r);break;case 4:o=cf("ijkl,l->ijk",s,r);break;case 5:o=cf("ijklm,m->ijkl",s,r);break;case 6:o=cf("ijklmn,n->ijklm",s,r);break;default:throw new Error("Not a valid tensor rank.")}return o=If(o,-1),kd(o,i)}});const yb=ih({rotateWithOffset_:function(e,t,n=0,a=.5){const i=th(e,"image","rotateWithOffset","float32");Ns(4===i.rank,(()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${i.rank}.`));const s={image:i},r={radians:t,fillValue:n,center:a};return Hc.runKernel(xu,s,r)}});function bb(e,t,n,a,i,s){null==a&&(a=.5),null==i&&(i=Number.NEGATIVE_INFINITY),null==s&&(s=0);const r=e.shape[0];return n=Math.min(n,r),Ns(0<=a&&a<=1,(()=>`iouThreshold must be in [0, 1], but was '${a}'`)),Ns(2===e.rank,(()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`)),Ns(4===e.shape[1],(()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`)),Ns(1===t.rank,(()=>"scores must be a 1D tensor")),Ns(t.shape[0]===r,(()=>`scores has incompatible shape with boxes. Expected ${r}, but was ${t.shape[0]}`)),Ns(0<=s&&s<=1,(()=>`softNmsSigma must be in [0, 1], but was '${s}'`)),{maxOutputSize:n,iouThreshold:a,scoreThreshold:i,softNmsSigma:s}}const vb=ih({nonMaxSuppression_:function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY){const s=th(e,"boxes","nonMaxSuppression","float32"),r=th(t,"scores","nonMaxSuppression","float32"),o=bb(s,r,n,a,i),l={maxOutputSize:n=o.maxOutputSize,iouThreshold:a=o.iouThreshold,scoreThreshold:i=o.scoreThreshold};return Hc.runKernel(cl,{boxes:s,scores:r},l)}});function kb(e,t,n){const a=function(e,t,n){return function(e,t,n){let a=0,i=e.length,s=0,r=!1;for(;a>>1);const o=n(t,e[s]);o>0?a=s+1:(i=s,r=!o)}return r?a:-a-1}(e,t,n||wb)}(e,t,n),i=a<0?-(a+1):a;e.splice(i,0,t)}function wb(e,t){return e>t?1:ei&&u.push({score:t[e],boxIndex:e,suppressBeginIndex:0});u.sort(Tb);const c=s>0?-.5/s:0,h=[],d=[];for(;h.length0;){const t=u.pop(),{score:n,boxIndex:s,suppressBeginIndex:r}=t;if(n=r;--n){const r=Eb(e,s,h[n]);if(r>=a){o=!0;break}if(t.score=t.score*_b(a,c,r),t.score<=i)break}t.suppressBeginIndex=h.length,o||(t.score===n?(h.push(s),d.push(t.score)):t.score>i&&kb(u,t,Tb))}const p=h.length,m=n-p;o&&m>0&&(h.push(...new Array(m).fill(0)),d.push(...new Array(m).fill(0)));const f={selectedIndices:h};return r&&(f.selectedScores=d),l&&(f.validOutputs=p),f}function Eb(e,t,n){const a=e.subarray(4*t,4*t+4),i=e.subarray(4*n,4*n+4),s=Math.min(a[0],a[2]),r=Math.min(a[1],a[3]),o=Math.max(a[0],a[2]),l=Math.max(a[1],a[3]),u=Math.min(i[0],i[2]),c=Math.min(i[1],i[3]),h=Math.max(i[0],i[2]),d=Math.max(i[1],i[3]),p=(o-s)*(l-r),m=(h-u)*(d-c);if(p<=0||m<=0)return 0;const f=Math.max(s,u),g=Math.max(r,c),y=Math.min(o,h),b=Math.min(l,d),v=Math.max(y-f,0)*Math.max(b-g,0);return v/(p+m-v)}function _b(e,t,n){const a=Math.exp(t*n*n);return n<=e?a:0}function Tb(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}const Ib=async function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY){const s=th(e,"boxes","nonMaxSuppressionAsync"),r=th(t,"scores","nonMaxSuppressionAsync"),o=bb(s,r,n,a,i);n=o.maxOutputSize,a=o.iouThreshold,i=o.scoreThreshold;const l=await Promise.all([s.data(),r.data()]),u=l[0],c=l[1],{selectedIndices:h}=Ab(u,c,n,a,i);return s!==e&&s.dispose(),r!==t&&r.dispose(),Sy(h,"int32")};const Nb=ih({nonMaxSuppressionWithScore_:function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=0){const r=th(e,"boxes","nonMaxSuppression"),o=th(t,"scores","nonMaxSuppression"),l=bb(r,o,n,a,i,s),u={boxes:r,scores:o},c={maxOutputSize:n=l.maxOutputSize,iouThreshold:a=l.iouThreshold,scoreThreshold:i=l.scoreThreshold,softNmsSigma:s=l.softNmsSigma},h=Hc.runKernel(dl,u,c);return{selectedIndices:h[0],selectedScores:h[1]}}});const Rb=async function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=0){const r=th(e,"boxes","nonMaxSuppressionAsync"),o=th(t,"scores","nonMaxSuppressionAsync"),l=bb(r,o,n,a,i,s);n=l.maxOutputSize,a=l.iouThreshold,i=l.scoreThreshold,s=l.softNmsSigma;const u=await Promise.all([r.data(),o.data()]),c=u[0],h=u[1],{selectedIndices:d,selectedScores:p}=Cb(c,h,n,a,i,s);return r!==e&&r.dispose(),o!==t&&o.dispose(),{selectedIndices:Sy(d,"int32"),selectedScores:Sy(p)}};const Db=ih({nonMaxSuppressionPadded_:function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=!1){const r=th(e,"boxes","nonMaxSuppression"),o=th(t,"scores","nonMaxSuppression"),l=bb(r,o,n,a,i,null),u={boxes:r,scores:o},c={maxOutputSize:l.maxOutputSize,iouThreshold:l.iouThreshold,scoreThreshold:l.scoreThreshold,padToMaxOutputSize:s},h=Hc.runKernel(hl,u,c);return{selectedIndices:h[0],validOutputs:h[1]}}});const zb=async function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=!1){const r=th(e,"boxes","nonMaxSuppressionAsync"),o=th(t,"scores","nonMaxSuppressionAsync"),l=bb(r,o,n,a,i,null),u=l.maxOutputSize,c=l.iouThreshold,h=l.scoreThreshold,[d,p]=await Promise.all([r.data(),o.data()]),{selectedIndices:m,validOutputs:f}=xb(d,p,u,c,h,s);return r!==e&&r.dispose(),o!==t&&o.dispose(),{selectedIndices:Sy(m,"int32"),validOutputs:Rd(f,"int32")}};const Ob=ih({resizeBilinear_:function(e,t,n=!1,a=!1){const i=th(e,"images","resizeBilinear");Ns(3===i.rank||4===i.rank,(()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${i.rank}.`)),Ns(2===t.length,(()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`)),Ns(!1===a||!1===n,(()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false."));let s=i,r=!1;3===i.rank&&(r=!0,s=vm(i,[1,i.shape[0],i.shape[1],i.shape[2]]));const[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:a,size:t},u=Hc.runKernel(Nl,o,l);return r?vm(u,[u.shape[1],u.shape[2],u.shape[3]]):u}});const Mb=ih({resizeNearestNeighbor_:function(e,t,n=!1,a=!1){const i=th(e,"images","resizeNearestNeighbor");Ns(3===i.rank||4===i.rank,(()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${i.rank}.`)),Ns(2===t.length,(()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`)),Ns("float32"===i.dtype||"int32"===i.dtype,(()=>"`images` must have `int32` or `float32` as dtype")),Ns(!1===a||!1===n,(()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false."));let s=i,r=!1;3===i.rank&&(r=!0,s=vm(i,[1,i.shape[0],i.shape[1],i.shape[2]]));const[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:a,size:t},u=Hc.runKernel(Tl,o,l);return r?vm(u,[u.shape[1],u.shape[2],u.shape[3]]):u}});const Bb=ih({threshold_:function(e,t="binary",n=!1,a=.5){const i=th(e,"image","threshold"),s=i.shape[0]*i.shape[1];let r,o,l,u,c=Ed(Sy([a]),255);if(Ns(3===i.rank,(()=>`Error in threshold: image must be rank 3,but got rank ${i.rank}.`)),Ns(3===i.shape[2]||1===i.shape[2],(()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${i.shape[2]}.`)),Ns("int32"===i.dtype||"float32"===i.dtype,(()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${i.dtype}.`)),Ns("otsu"===t||"binary"===t,(()=>`Method must be binary or otsu, but was ${t}`)),3===i.shape[2]){[r,o,l]=yy(i,[1,1,1],-1);const e=Ed(r,.2989),t=Ed(o,.587),n=Ed(l,.114);u=xd(xd(e,t),n)}else u=e;if("otsu"===t){c=function(e,t){let n,a,i,s,r,o,l=Sy([-1]),u=Sy([0]),c=Sy([0]);for(let h=0;h`Error in transform: image must be rank 4,but got rank ${r.rank}.`)),Ns(2===o.rank&&(o.shape[0]===r.shape[0]||1===o.shape[0])&&8===o.shape[1],(()=>"Error in transform: Input transform should be batch x 8 or 1 x 8")),Ns(null==s||2===s.length,(()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`));const l={image:r,transforms:o},u={interpolation:n,fillMode:a,fillValue:i,outputShape:s};return Hc.runKernel(fu,l,u)}});const Lb=ih({bandPart_:function(e,t,n){const a=th(e,"a","bandPart");Ns(a.rank>=2,(()=>`bandPart(): Rank must be at least 2, got ${a.rank}.`));const i=a.shape,[s,r]=a.shape.slice(-2);let o,l;"number"==typeof t?(Ns(t%1==0,(()=>`bandPart(): numLower must be an integer, got ${t}.`)),Ns(t<=s,(()=>`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`)),o=th(t<0?s:t,"numLower","bandPart")):(Ns("int32"===t.dtype,(()=>"bandPart(): numLower's dtype must be an int32.")),o=of(Uf(t,0),s,pg(t,s))),"number"==typeof n?(Ns(n%1==0,(()=>`bandPart(): numUpper must be an integer, got ${n}.`)),Ns(n<=r,(()=>`bandPart(): numUpper (${n}) must not be greater than the number of columns (${r}).`)),l=th(n<0?r:n,"numUpper","bandPart")):(Ns("int32"===n.dtype,(()=>"bandPart(): numUpper's dtype must be an int32.")),l=of(Uf(n,0),r,pg(n,r)));const u=vm(qg(0,s,1,"int32"),[-1,1]),c=qg(0,r,1,"int32"),h=Ud(u,c),d=Jf(Wf(h,o),Bf(h,$f(l))),p=cg([s,r],a.dtype);return vm(wy(Ly(vm(a,[-1,s,r])).map((e=>of(d,e,p)))),i)}});const Pb=ih({gramSchmidt_:function(e){let t;if(Array.isArray(e)){t=!1,Ns(null!=e&&e.length>0,(()=>"Gram-Schmidt process: input must not be null, undefined, or empty"));const n=e[0].shape[0];for(let t=1;t`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[t].shape[0]} vs. ${n})`))}else t=!0,e=yy(e,e.shape[0],0).map((e=>ky(e,[0])));Ns(e.length<=e[0].shape[0],(()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`));const n=[],a=e;for(let t=0;t{let e=a[t];if(t>0)for(let a=0;a{Ns(2===e.shape.length,(()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`));const n=e.shape[0],a=e.shape[1];let i=Df(n),s=wd(e);const r=Ey([[1]],[1,1]);let o=wd(r);const l=n>=a?a:n;for(let e=0;e{const t=Sm(s,[e,e],[n-e,1]),l=Ef(t),u=Sm(s,[e,e],[1,1]),c=of(Mf(u,0),Ey([[-1]]),Ey([[1]])),h=Ud(u,Ed(c,l)),d=Sd(t,h);o=1===d.shape[0]?wd(r):Am([r,Sm(d,[1,0],[d.shape[0]-1,d.shape[1]])],0);const p=$f(Sd(xm(c,h),l)),m=Sm(s,[e,0],[n-e,a]),f=Ed(p,o),g=Gy(o);if(0===e)s=Ud(m,xm(f,xm(g,m)));else{const t=Ud(m,xm(f,xm(g,m)));s=Am([Sm(s,[0,0],[e,a]),t],0)}const y=Gy(f),b=Sm(i,[0,e],[n,i.shape[1]-e]);if(0===e)i=Ud(b,xm(xm(b,o),y));else{const t=Ud(b,xm(xm(b,o),y));i=Am([Sm(i,[0,0],[n,e]),t],1)}return[o,s,i]})),ph([t,l,u])}return!t&&n>a&&(i=Sm(i,[0,0],[n,a]),s=Sm(s,[0,0],[a,a])),[i,s]}))}const Vb=ih({qr_:function(e,t=!1){if(Ns(e.rank>=2,(()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`)),2===e.rank)return jb(e,t);{const n=e.shape.slice(0,e.shape.length-2).reduce(((e,t)=>e*t)),a=Ly(vm(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),i=[],s=[];a.forEach((e=>{const[n,a]=jb(e,t);i.push(n),s.push(a)}));return[vm(wy(i,0),e.shape),vm(wy(s,0),e.shape)]}}});var Ub,Wb;(Wb=Ub||(Ub={}))[Wb.NONE=0]="NONE",Wb[Wb.MEAN=1]="MEAN",Wb[Wb.SUM=2]="SUM",Wb[Wb.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS";const Gb=ih({computeWeightedLoss_:function(e,t,n=Ub.SUM_BY_NONZERO_WEIGHTS){const a=th(e,"losses","computeWeightedLoss");let i=null;null!=t&&(i=th(t,"weights","computeWeightedLoss"));const s=null==i?a:Ed(a,i);if(n===Ub.NONE)return s;if(n===Ub.SUM)return Cf(s);if(n===Ub.MEAN){if(null==i)return ug(s);{const e=a.size/i.size,t=Sd(Cf(s),Cf(i));return e>1?Sd(t,Rd(e)):t}}if(n===Ub.SUM_BY_NONZERO_WEIGHTS){if(null==i)return Sd(Cf(s),Rd(a.size));{const e=Ed(i,hg(a.shape)),t=kd(Cf(vg(e,Rd(0))),"float32");return Sd(Cf(s),t)}}throw Error(`Unknown reduction: ${n}`)}});const qb=ih({absoluteDifference_:function(e,t,n,a=Ub.SUM_BY_NONZERO_WEIGHTS){const i=th(e,"labels","absoluteDifference"),s=th(t,"predictions","absoluteDifference");let r=null;null!=n&&(r=th(n,"weights","absoluteDifference")),Rs(i.shape,s.shape,"Error in absoluteDifference: ");const o=Gd(Ud(i,s));return Gb(o,r,a)}});const Hb=ih({cosineDistance_:function(e,t,n,a,i=Ub.SUM_BY_NONZERO_WEIGHTS){const s=th(e,"labels","cosineDistance"),r=th(t,"predictions","cosineDistance");let o=null;null!=a&&(o=th(a,"weights","cosineDistance")),Rs(s.shape,r.shape,"Error in cosineDistance: ");const l=Rd(1),u=Ud(l,Cf(Ed(s,r),n,!0));return Gb(u,o,i)}});const Kb=ih({hingeLoss_:function(e,t,n,a=Ub.SUM_BY_NONZERO_WEIGHTS){let i=th(e,"labels","hingeLoss");const s=th(t,"predictions","hingeLoss");let r=null;null!=n&&(r=th(n,"weights","hingeLoss")),Rs(i.shape,s.shape,"Error in hingeLoss: ");const o=Rd(1);i=Ud(Ed(Rd(2),i),o);const l=$g(Ud(o,Ed(i,s)));return Gb(l,r,a)}});const $b=ih({huberLoss_:function(e,t,n,a=1,i=Ub.SUM_BY_NONZERO_WEIGHTS){const s=th(e,"labels","huberLoss"),r=th(t,"predictions","huberLoss");let o=null;null!=n&&(o=th(n,"weights","huberLoss")),Rs(s.shape,r.shape,"Error in huberLoss: ");const l=Rd(a),u=Gd(Ud(r,s)),c=pg(u,l),h=Ud(u,c),d=xd(Ed(Rd(.5),Td(c)),Ed(l,h));return Gb(d,o,i)}});const Zb=ih({logLoss_:function(e,t,n,a=1e-7,i=Ub.SUM_BY_NONZERO_WEIGHTS){const s=th(e,"labels","logLoss"),r=th(t,"predictions","logLoss");let o=null;null!=n&&(o=th(n,"weights","logLoss")),Rs(s.shape,r.shape,"Error in logLoss: ");const l=Rd(1),u=Rd(a),c=$f(Ed(s,Hf(xd(r,u)))),h=Ed(Ud(l,s),Hf(xd(Ud(l,r),u))),d=Ud(c,h);return Gb(d,o,i)}});const Xb=ih({meanSquaredError_:function(e,t,n,a=Ub.SUM_BY_NONZERO_WEIGHTS){const i=th(e,"labels","meanSquaredError"),s=th(t,"predictions","meanSquaredError");let r=null;null!=n&&(r=th(n,"weights","meanSquaredError")),Rs(i.shape,s.shape,"Error in meanSquaredError: ");const o=vy(i,s);return Gb(o,r,a)}});const Yb=ih({sigmoidCrossEntropy_:function(e,t,n,a=0,i=Ub.SUM_BY_NONZERO_WEIGHTS){let s=th(e,"multiClassLabels","sigmoidCrossEntropy");const r=th(t,"logits","sigmoidCrossEntropy");let o=null;if(null!=n&&(o=th(n,"weights","sigmoidCrossEntropy")),Rs(s.shape,r.shape,"Error in sigmoidCrossEntropy: "),a>0){const e=Rd(a),t=Rd(1),n=Rd(.5);s=xd(Ed(s,Ud(t,e)),Ed(n,e))}const l=function(e,t){const n=th(e,"labels","sigmoidCrossEntropyWithLogits"),a=th(t,"logits","sigmoidCrossEntropyWithLogits");Rs(n.shape,a.shape,"Error in sigmoidCrossEntropyWithLogits: ");const i=$g(a),s=Ed(a,n),r=Kf(Tf($f(Gd(a))));return xd(Ud(i,s),r)}(s,r);return Gb(l,o,i)}});const Qb=ih({softmaxCrossEntropy_:function(e,t,n,a=0,i=Ub.SUM_BY_NONZERO_WEIGHTS){let s=th(e,"onehotLabels","softmaxCrossEntropy");const r=th(t,"logits","softmaxCrossEntropy");let o=null;if(null!=n&&(o=th(n,"weights","softmaxCrossEntropy")),Rs(s.shape,r.shape,"Error in softmaxCrossEntropy: "),a>0){const e=Rd(a),t=Rd(1),n=Rd(s.shape[1]);s=xd(Ed(s,Ud(t,e)),Sd(e,n))}const l=function(e,t,n=-1){if(-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);const a=Nd(((e,t,a)=>{const i=Qf(t,[n],!0),s=Ud(kd(t,"float32"),i);a([e,s]);const r=$f(Ed(s,e));return{value:Cf(r,[n]),gradFunc:(e,t)=>{const[a,i]=t,s=yf(e.shape,[n]);return[Ed(vm(e,s),Ud(kd(a,"float32"),Tf(i))),Ed(vm(e,s),Ud(Tf(i),kd(a,"float32")))]}}}));return a(e,t)}(s,r);return Gb(l,o,i)}});const Jb={fft:my,ifft:fy,rfft:by,irfft:gy},ev={hammingWindow:ub,hannWindow:cb,frame:hb,stft:db},tv={flipLeftRight:mb,grayscaleToRGB:fb,resizeNearestNeighbor:Mb,resizeBilinear:Ob,rgbToGrayscale:gb,rotateWithOffset:yb,cropAndResize:pb,nonMaxSuppression:vb,nonMaxSuppressionAsync:Ib,nonMaxSuppressionWithScore:Nb,nonMaxSuppressionWithScoreAsync:Rb,nonMaxSuppressionPadded:Db,nonMaxSuppressionPaddedAsync:zb,threshold:Bb,transform:Fb},nv={bandPart:Lb,gramSchmidt:Pb,qr:Vb},av={absoluteDifference:qb,computeWeightedLoss:Gb,cosineDistance:Hb,hingeLoss:Kb,huberLoss:$b,logLoss:Zb,meanSquaredError:Xb,sigmoidCrossEntropy:Yb,softmaxCrossEntropy:Qb},iv={sparseFillEmptyRows:ih({sparseFillEmptyRows_:function(e,t,n,a){const i=th(e,"indices","sparseFillEmptyRows","int32"),s=th(t,"values","sparseFillEmptyRows"),r=th(n,"denseShape","sparseFillEmptyRows","int32"),o=th(a,"defaultValue","sparseFillEmptyRows",s.dtype);if(2!==i.rank)throw new Error(`Indices should be Tensor2D but received shape\n ${i.shape}`);if(1!==s.rank)throw new Error(`Values should be Tensor1D but received shape ${s.shape}`);if(1!==r.rank)throw new Error(`Dense shape should be Tensor1D but received shape ${r.shape}`);if(0!==o.rank)throw new Error(`Default value should be a scalar but received shape ${o.shape}`);const l={indices:i,values:s,denseShape:r,defaultValue:o},u=Hc.runKernel(Ql,l);return{outputIndices:u[0],outputValues:u[1],emptyRowIndicator:u[2],reverseIndexMap:u[3]}}}),sparseReshape:ih({sparseReshape_:function(e,t,n){const a=th(e,"inputIndices","sparseReshape","int32"),i=th(t,"inputShape","sparseReshape","int32"),s=th(n,"newShape","sparseReshape","int32");if(2!==a.rank)throw new Error(`Input indices should be Tensor2D but received shape\n ${a.shape}`);if(1!==i.rank)throw new Error(`Input shape should be Tensor1D but received shape ${i.shape}`);if(1!==s.rank)throw new Error(`New shape should be Tensor1D but received shape ${s.shape}`);const r={inputIndices:a,inputShape:i,newShape:s},o=Hc.runKernel(Jl,r);return{outputIndices:o[0],outputShape:o[1]}}}),sparseSegmentMean:ih({sparseSegmentMean_:function(e,t,n){const a=th(e,"data","sparseSegmentMean"),i=th(t,"indices","sparseSegmentMean","int32"),s=th(n,"segmentIds","sparseSegmentMean","int32");if(a.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${i.shape}`);if(1!==s.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${s.shape}`);const r={data:a,indices:i,segmentIds:s};return Hc.runKernel(eu,r)}}),sparseSegmentSum:ih({sparseSegmentSum_:function(e,t,n){const a=th(e,"data","sparseSegmentSum"),i=th(t,"indices","sparseSegmentSum","int32"),s=th(n,"segmentIds","sparseSegmentSum","int32");if(a.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${i.shape}`);if(1!==s.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${s.shape}`);const r={data:a,indices:i,segmentIds:s};return Hc.runKernel(tu,r)}})},sv={stringNGrams:ih({stringNGrams_:function(e,t,n,a,i,s,r,o){const l=th(e,"data","stringNGrams","string");if("string"!==l.dtype)throw new Error("Data must be of datatype string");if(1!==l.shape.length)throw new Error(`Data must be a vector, saw: ${l.shape}`);const u=th(t,"dataSplits","stringNGrams");if("int32"!==u.dtype)throw new Error("Data splits must be of datatype int32");const c={separator:n,nGramWidths:a,leftPad:i,rightPad:s,padWidth:r,preserveShortSequences:o},h={data:l,dataSplits:u},d=Hc.runKernel(ou,h,c);return{nGrams:d[0],nGramsSplits:d[1]}}}),stringSplit:ih({stringSplit_:function(e,t,n=!0){const a=th(e,"input","stringSplit","string"),i=th(t,"delimiter","stringSplit","string");if(1!==a.rank)throw new Error(`Input should be Tensor1D but received shape ${a.shape}`);if(0!==i.rank)throw new Error(`Delimiter should be a scalar but received shape ${i.shape}`);const s={skipEmpty:n},r={input:a,delimiter:i},o=Hc.runKernel(lu,r,s);return{indices:o[0],values:o[1],shape:o[2]}}}),stringToHashBucketFast:ih({stringToHashBucketFast_:function(e,t){const n=th(e,"input","stringToHashBucketFast","string"),a={numBuckets:t};if(t<=0)throw new Error("Number of buckets must be at least 1");const i={input:n};return Hc.runKernel(uu,i,a)}}),staticRegexReplace:ih({staticRegexReplace_:function(e,t,n,a=!0){const i=th(e,"input","staticRegexReplace","string"),s={pattern:t,rewrite:n,replaceGlobal:a};return Hc.runKernel(su,{x:i},s)}})};const rv=class{static sgd(e){return new Xd(e)}static momentum(e,t,n=!1){return new Yd(e,t,n)}static rmsprop(e,t=.9,n=0,a=null,i=!1){return new Qd(e,t,n,a,i)}static adam(e=.001,t=.9,n=.999,a=null){return new Wd(e,t,n,a)}static adadelta(e=.001,t=.95,n=null){return new Ld(e,t,n)}static adamax(e=.002,t=.9,n=.999,a=null,i=0){return new Zd(e,t,n,a,i)}static adagrad(e,t=.1){return new jd(e,t)}},ov="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:"undefined"!=typeof setImmediate?setImmediate:e=>e();function lv(){return new Promise((e=>ov((()=>e()))))}function uv(e,t){const n=e[0].length;e.forEach(((e,t)=>{Ns(e.length===n,(()=>`Error in concat${n}D: rank of tensors[${t}] must be the same as the rank of the rest (${n})`))})),Ns(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`));const a=e[0];e.forEach(((e,i)=>{for(let s=0;s`Error in concat${n}D: Shape of tensors[${i}] (${e}) does not match the shape of the rest (${a}) along the non-concatenated axis ${i}.`))}))}function cv(e,t){const n=e[0].slice();for(let a=1;a=0)if(o>=0){if(o!==s)throw new Error(`rt input.shape and shape=${t} are incompatible: rt input.shape[${i+e}] = ${s} but shape[${i+e}] = ${o}`)}else a[r]=s}return a}function mv(e){const t={FIRST_DIM_SIZE:hv.FIRST_DIM_SIZE,VALUE_ROWIDS:hv.VALUE_ROWIDS,ROW_LENGTHS:hv.ROW_LENGTHS,ROW_SPLITS:hv.ROW_SPLITS,ROW_LIMITS:hv.ROW_LIMITS,ROW_STARTS:hv.ROW_STARTS},n=[];for(const a of e){if(!(a in t))break;n.push(t[a])}return n}function fv(e){return 0===e.length?0:e[0]===hv.FIRST_DIM_SIZE?e.length-1:e.length}function gv(e,t){if(null==e||null==t)return;const n=e.length,a=t.length;if(n>=a)throw new Error(`defaultValue.shape=${e} and ragged tensor flatValues.shape=${t}, are incompatible: defaultValue.rank = ${n} must be less than ragged tensor input flatValues.rank = ${a})`);for(let i=0;i=0&&a>=0&&1!==n&&n!==a)throw new Error(`defaultValue.shape=${e}, and ragged tensor input flatValues.shape=${t} are incompatible: defaultValue.shape[${i-e.length}] = ${n} but ragged tensor input.flatValues.shape[${i-e.length}] = ${a}`)}}(dv=hv||(hv={}))[dv.FIRST_DIM_SIZE=0]="FIRST_DIM_SIZE",dv[dv.VALUE_ROWIDS=1]="VALUE_ROWIDS",dv[dv.ROW_LENGTHS=2]="ROW_LENGTHS",dv[dv.ROW_SPLITS=3]="ROW_SPLITS",dv[dv.ROW_LIMITS=4]="ROW_LIMITS",dv[dv.ROW_STARTS=5]="ROW_STARTS";const yv=30;function bv(e){return e<=yv?e:Xs(e,Math.floor(Math.sqrt(e)))}function vv(e,t,n){return[n*("number"==typeof e?e:e[0]),t*("number"==typeof e?e:e[1])]}function kv(e,t,n,a=!0){let i=[];if(a)i=i.concat(t.slice(0)),i.push(e[0]/n),i=i.concat(e.slice(1));else{i=i.concat(e[0]);const n=t.length;for(let a=0;a=2*t+1||a%2==1?i.push(a):n.push(a);a.push(...n),a.push(0),a.push(...i)}return a}function Av(e,t,n,a=!0){const i=[];a?i.push(e[0]/n):i.push(e[0]*n);for(let n=1;nn)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[a-1]} vs. ${n}`);if(0===zs(e.shape))throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);const i=t.shape,s=i[i.length-1];let r=1;for(let e=0;ee/u)),1].slice(0,s);return[l,r,u,c]}const Ev=1.7580993408473768,_v=1.0507009873554805,Tv=.3275911,Iv=.254829592,Nv=-.284496736,Rv=1.421413741,Dv=-1.453152027,zv=1.061405429;function Ov(e,t){if(e.length!==t.length)throw new Error(`Cannot merge real and imag arrays of different lengths. real:${e.length}, imag: ${t.length}.`);const n=new Float32Array(2*e.length);for(let a=0;a/g,Gv=",",qv="...";function Hv(e,t){const n=((e=e.replace(/\s/g,"")).length-e.replace(Wv,"").length)/Uv.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error(`Equation must contain exactly one arrow ("${Uv}").`);const[a,i]=e.split(Uv);Ns(-1===a.indexOf(qv),(()=>`The ellipsis notation ("${qv}") is not supported yet.`));const s=a.split(Gv),r=s.length;if(t!==r)throw new Error(`Expected ${r} input tensors, received ${t}`);if(r>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");const o=[];for(let e=0;e-1!==e.indexOf(t))))throw new Error(`Output subscripts contain the label ${t} not present in the input subscripts.`);-1===o.indexOf(t)&&o.push(t)}for(let e=0;e-1!==e)),{permutationIndices:n,expandDims:a}}function $v(e,t,n){const a=new Array(e);for(let e=0;e`Expected dimension ${a[t[e][n]]} at axis ${n} of input shaped ${JSON.stringify(i)}, but got dimension ${i[n]}`))}}function Zv(e,t){const n=e,a=[];let i=0;0===e.length&&n.push(-1),i=e.length+1;for(let e=0;ee===t))}function Yv(e,t){const n=[];for(let a=0;a"Number of splits must evenly divide the axis.")),a=new Array(t).fill(e.shape[n]/t);else{Ns(t.reduce(((e,t)=>(-1===t&&(e+=1),e)),0)<=1,(()=>"There should be only one negative value in split array."));const i=t.indexOf(-1);if(-1!==i){const a=t.reduce(((e,t)=>t>0?e+t:e));t[i]=e.shape[n]-a}Ns(e.shape[n]===t.reduce(((e,t)=>e+t)),(()=>"The sum of sizes must match the size of the axis dimension.")),a=t}return a}function Jv(e){return`Received SparseTensor with denseShape[0] = 0 but\n indices.shape[0] = ${e}`}function ek(e,t){return`indices(${e}, 0) is invalid: ${t} < 0`}function tk(e,t,n){return`indices(${e}, 0) is invalid: ${t} >= ${n}`}function nk(e,t){return`only one output dimension may be -1, not both ${e} and ${t}`}function ak(e,t){return`size ${e} must be non-negative, not ${t}`}function ik(){return"reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero"}function sk(e,t){return`Input to reshape is a SparseTensor with ${zs(e)}\n dense values, but the requested shape requires a multiple of ${zs(t)}. inputShape=${e} outputShape= ${t}`}function rk(e,t){return`Input to reshape is a tensor with ${zs(e)} dense values, but the requested shape has ${zs(t)}. inputShape=${e} outputShape=${t}`}function ok(){return"segment ids must be >= 0"}function lk(){return"segment ids are not increasing"}function uk(e,t){return`Segment id ${e} out of range [0, ${t}), possibly because segmentIds input is not sorted.`}function ck(e,t,n){return`Bad: indices[${e}] == ${t} out of range [0, ${n})`}function hk(e,t){let n,a=!1;for(e<=yv?(n=e,a=!0):n=Xs(e,Math.floor(Math.sqrt(e)));!a;)n>t||n===e?a=!0:n=Xs(e,n+1);return n}function dk(e,t,n){const a=[],i=e.length;for(let s=0;si))throw new Error(`Expect batchDims in the range of [-${i}, ${i}], but got ${a}`);if(a<0&&(a+=i),a>s)throw new Error(`batchDims (${a}) must be less than rank(x) (\n ${s}).`);if(nnc(e)))}catch(e){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${e}`)}}function fk(e){return e.map((e=>tc(e)))}!function(){for(const e of Jd)Bd(e)}();const gk={kernelName:fr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Ay(kd(n,"float32"),-1))}}},yk={kernelName:gr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=Td(kd(n,"float32")),a=_d(Ud(Rd(1),t));return $f(Sd(e,a))}}}},bk={kernelName:yr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=_d(Ud(Td(kd(n,"float32")),1));return Sd(e,t)}}}},vk={kernelName:br,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{let t=e;const a=Hd(n.shape,i);return a.length>0&&(t=Cf(t,a)),vm(t,n.shape)},b:()=>{let t=e;const n=Hd(a.shape,i);return n.length>0&&(t=Cf(t,n)),vm(t,a.shape)}}}},kk={kernelName:vr,saveAllInputs:!0,gradFunc:(e,t)=>{const n={};return t.forEach(((t,a)=>{n[a]=()=>e.clone()})),n}},wk={kernelName:Ar,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Id(n)}}},Ak={kernelName:xr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Id(n)}}},xk={kernelName:Cr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,_d(Ud(Rd(1),Td(kd(n,"float32")))))}}},Ck={kernelName:Sr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=_d(xd(Rd(1),Td(kd(n,"float32"))));return Sd(e,t)}}}},Sk={kernelName:Tr,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=xd(Td(n),Td(a));let s=Ed(e,Sd(a,t));const r=Hd(n.shape,i);return r.length>0&&(s=Cf(s,r)),vm(s,n.shape)},b:()=>{const t=xd(Td(n),Td(a));let s=$f(Ed(e,Sd(n,t)));const r=Hd(a.shape,i);return r.length>0&&(s=Cf(s,r)),vm(s,a.shape)}}}},Ek={kernelName:Er,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,xd(Td(kd(n,"float32")),1))}}},_k={kernelName:_r,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,Ud(Rd(1),Td(kd(n,"float32"))))}}};const Tk=ih({avgPool3dGrad_:function(e,t,n,a,i,s){const r=th(e,"dy","avgPool3dGrad"),o=th(t,"input","avgPool3dGrad");let l=r,u=o,c=!1;4===o.rank&&(c=!0,l=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]),u=vm(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]])),Ns(5===l.rank,(()=>`Error in avgPool3dGrad: dy must be rank 5 but got rank ${l.rank}.`)),Ns(5===u.rank,(()=>`Error in avgPool3dGrad: input must be rank 5 but got rank ${u.rank}.`)),bm("avgPool3dGrad",i,s);const h={dy:l,input:u},d={filterSize:n,strides:a,pad:i,dimRoundingMode:s},p=Hc.runKernel(Dr,h,d);return c?vm(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}}),Ik={kernelName:Rr,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{filterSize:i,strides:s,pad:r,dimRoundingMode:o}=n;return{x:()=>Tk(e,a,i,s,r,o)}}};const Nk=ih({avgPoolGrad_:function(e,t,n,a,i){const s=th(e,"dy","avgPoolGrad"),r=th(t,"input","avgPoolGrad");Ns(r.rank===s.rank,(()=>`Rank of input (${r.rank}) does not match rank of dy (${s.rank})`));let o=r,l=s,u=!1;3===r.rank&&(u=!0,o=vm(r,[1,r.shape[0],r.shape[1],r.shape[2]]),l=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]])),Ns(4===l.rank,(()=>`Error in avgPoolGrad: dy must be rank 4 but got rank ${l.rank}.`)),Ns(4===o.rank,(()=>`Error in avgPoolGrad: input must be rank 4 but got rank ${o.rank}.`));const c={dy:l,input:o},h={filterSize:n,strides:a,pad:i},d=Hc.runKernel(Nr,c,h);return u?vm(d,[d.shape[1],d.shape[2],d.shape[3]]):d}}),Rk={kernelName:Ir,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{filterSize:i,strides:s,pad:r}=n;return{x:()=>Nk(e,a,i,s,r)}}},Dk={kernelName:zr,inputsToSave:["a","b"],gradFunc:(e,t,n)=>{const[a,i]=t,{transposeA:s,transposeB:r}=n;return s||r?!s&&r?{a:()=>xm(e,i,!1,!1),b:()=>xm(e,a,!0,!1)}:s&&!r?{a:()=>xm(i,e,!1,!0),b:()=>xm(a,e,!1,!1)}:{a:()=>xm(i,e,!0,!0),b:()=>xm(e,a,!0,!0)}:{a:()=>xm(e,i,!1,!0),b:()=>xm(a,e,!0,!1)}}},zk={kernelName:Or,gradFunc:(e,t,n)=>{const{blockShape:a,crops:i}=n;return{x:()=>Tg(e,a,i)}}},Ok={kernelName:"BroadcastTo",gradFunc:(e,t,n)=>{const a=n,i=a.inputShape,s=a.shape,r=Array.from(s);for(let e=i.length-1;e>=0;e--)if(i[e]===s[e])r[e]=1;else if(1!==i[e])throw new Error(`broadcastTo(): [${i}] cannot be broadcast to [${s}].`);const o=[];for(let e=0;e1&&o.push(e);return{x:()=>Cf(e,o,!0)}}},Mk={kernelName:Lr,gradFunc:e=>({x:()=>e.clone()})},Bk={kernelName:Pr,gradFunc:e=>({x:()=>Id(e)})},Fk={kernelName:jr,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{clipValueMin:i,clipValueMax:s}=n;return{x:()=>of(Jf(Bf(a,i),Wf(a,s)),e,Id(e))}}},Lk={kernelName:Ur,inputsToSave:["x"],gradFunc:gk.gradFunc},Pk={kernelName:Wr,saveAllInputs:!0,gradFunc:(e,t,n)=>{const a=t.map((e=>e.shape)),{axis:i}=n,s=js(i,t[0].shape)[0],r=a.map((e=>e[s]));return yy(e,r,s).map((e=>()=>e))}},jk={kernelName:Gr,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const[a,i]=t,{dilations:s,strides:r,pad:o,dataFormat:l}=n;return Ns(mm(s),(()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`)),{x:()=>qm(a.shape,e,i,r,o,l),filter:()=>Jy(a,e,i.shape,r,o,l)}}},Vk={kernelName:Hr,inputsToSave:["dy","filter"],gradFunc:(e,t,n)=>{const[a,i]=t,{strides:s,pad:r,dataFormat:o,dimRoundingMode:l}=n;return{dy:()=>Wm(e,i,s,r,o,1,l),filter:()=>Jy(e,a,i.shape,s,r,o,l)}}};const Uk=ih({conv3DBackpropFilter_:function(e,t,n,a,i){let s=e;4===e.rank&&(s=vm(e,[1,e.shape[0],e.shape[1],e.shape[2],e.shape[3]]));let r=t;4===r.rank&&(r=vm(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]])),Ns(5===s.rank,(()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${s.shape}.`)),Ns(5===r.rank,(()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${r.shape}.`)),Ns(5===n.length,(()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${n}.`)),Ns(s.shape[4]===n[3],(()=>`Error in conv3dDerFilter: depth of input ${s.shape[4]}) must match input depth in filter (${n[3]}.`)),Ns(r.shape[4]===n[4],(()=>`Error in conv3dDerFilter: depth of dy (${r.shape[4]}) must match output depth for filter (${n[4]}).`));const o={x:s,dy:r},l={strides:a,pad:i,filterShape:n};return Hc.runKernel($r,o,l)}}),Wk={kernelName:Kr,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const{dilations:a,strides:i,pad:s}=n;Ns(mm(a),(()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${a}'`));const[r,o]=t;return{x:()=>$m(r.shape,e,o,i,s),filter:()=>Uk(r,e,o.shape,i,s)}}},Gk={kernelName:Xr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed($f(oy(kd(n,"float32"))),e)}}},qk={kernelName:Yr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(ly(kd(n,"float32")),e)}}},Hk={kernelName:Jr,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{axis:i,exclusive:s,reverse:r}=n;return{x:()=>{const t=vf([i],a.rank);let n=Jm(e,i,s,!r);return null!=t&&(n=Gy(n,t)),n}}}},Kk={kernelName:ao,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const{dilations:a,strides:i,pad:s,dimRoundingMode:r}=n,o=null==a?[1,1]:a;Ns(mm(o),(()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${o}'`));const[l,u]=t;return Ns(4===l.rank,(()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${l.rank}.`)),Ns(4===u.rank,(()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${u.rank}.`)),Ns(l.shape[3]===u.shape[2],(()=>`Error in gradient of depthwiseConv2d: number of input channels (${l.shape[3]}) must match the inChannels dimension in filter ${u.shape[2]}.`)),Ns(fm(i,o),(()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${o}'.`)),bm("depthwiseConv2d",s,r),{x:()=>rb(l.shape,e,u,i,s,o,r),filter:()=>sb(l,e,u.shape,i,s,o,r)}}},$k={kernelName:oo,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const[a,i]=t,s={x:a,filter:i,dy:e},r={x:a,filter:i,dy:e};return{x:()=>Hc.runKernel(lo,s,n),filter:()=>Hc.runKernel(uo,r,n)}}},Zk={kernelName:mo,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t,a={dy:e,y:n};return{x:()=>Hc.runKernel(fo,a)}}},Xk={kernelName:go,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t,a=Ed(Tf($f(Td(n))),2/Math.sqrt(Math.PI));return{x:()=>Ed(e,a)}}},Yk={kernelName:bo,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,n)}}},Qk={kernelName:vo,inputsToSave:["input"],gradFunc:(e,t)=>{const[n]=t;return{input:()=>vm(e,n.shape)}}},Jk={kernelName:ko,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Tf(n))}}},ew={kernelName:Co,gradFunc:e=>({x:()=>Id(e)})},tw={kernelName:So,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Sd(e,kd(a,"float32")),s=Hd(n.shape,i);return s.length>0?vm(Cf(t,s),n.shape):t},b:()=>{let t=Ed(e,kd(n,"float32"));const s=Hd(a.shape,i);s.length>0&&(t=vm(Cf(t,s),a.shape));const r=Td(a);return $f(Sd(t,kd(r,"float32")))}}}},nw={kernelName:Eo,inputsToSave:["x","mean","variance","scale"],gradFunc:(e,t,n)=>{const{varianceEpsilon:a}=n,[i,s,r,o]=t,l=null==o?Rd(1):o,u=Hd(s.shape,i.shape),c=[];if(1===s.rank){for(let e=0;e1===s.rank?vm(Ed(Ed(e,Rf(vm(p,[1,1,1,s.shape[0]]),c)),l),i.shape):vm(Ed(Ed(e,p),l),i.shape),mean:()=>{let e=Ed(Ed(p,Rd(-1)),d);return 1===s.rank&&(e=Cf(e,u)),vm(e,s.shape)},variance:()=>{let e=Ed(Ed(m,h),d);return 1===s.rank&&(e=Cf(e,u)),vm(e,s.shape)},scale:()=>{const t=Ed(h,p);let n=Ed(e,t);return 1===s.rank&&(n=Cf(n,u)),vm(n,s.shape)},offset:()=>{let t=e;return 1===s.rank&&(t=Cf(t,u)),vm(t,s.shape)}}}},aw={kernelName:_o,inputsToSave:["x","indices"],gradFunc:(e,t,n)=>{const[a,i]=t,{axis:s,batchDims:r}=n,o=js(s,a.shape)[0],l=(e,t,n)=>()=>{const a=e.shape,i=t.size,r=a.slice(0,o),l=r.length,u=a.slice(s,a.length).slice(1),c=u.length,h=iw(0,l),d=iw(l+1,l+1+c),p=sw([r,[i],u]),m=vm(n,p),f=vm(t,[i]),g=sw([[l],h,d]),y=Gy(m,g);let b=Fy(y,f,e.shape[o]);const v=kf(g);return b=Gy(b,v),b};if(1===r){const t=a.shape[0],n=a.split(t,0);return{x:()=>{const t=wy(n.map(((t,n)=>l(t,i.slice(n,1),e.slice(n,1))())));return t.reshape(a.shape)},indices:()=>i}}return{x:l(a,i,e),indices:()=>i}}};function iw(e,t){const n=[];for(let a=e;a{const[n,a]=t;return{a:()=>Id(n),b:()=>Id(a)}}},ow={kernelName:Ro,gradFunc:e=>({x:()=>kd(e,"float32")})},lw={kernelName:Oo,gradFunc:e=>({x:()=>Id(e)})},uw={kernelName:Mo,gradFunc:e=>({x:()=>Id(e)})},cw={kernelName:Bo,gradFunc:e=>({x:()=>Id(e)})},hw={kernelName:Fo,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{alpha:i}=n,s=Mf(a,0);return{x:()=>of(s,e,Ed(e,i))}}},dw={kernelName:Uo,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,xd(n,1))}}},pw={kernelName:Vo,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,kd(n,"float32"))}}},mw={kernelName:"LogSoftmax",inputsToSave:[],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a]=t,{axis:i}=n;return{logits:()=>{const t=Tf(a);return Ud(e,Ed(Cf(e,i,!0),t))}}}};const fw=ih({localResponseNormalizationBackprop_:function(e,t,n,a=5,i=1,s=1,r=.5){const o={x:e,y:t,dy:n},l={depthRadius:a,bias:i,alpha:s,beta:r};return Hc.runKernel(Ko,o,l)}}),gw={kernelName:Ho,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a,i]=t,{depthRadius:s,bias:r,alpha:o,beta:l}=n;return{x:()=>fw(a,i,e,s,r,o,l)}}};function yw(e,t,n,a){return t.rankEd(e,kd(rf(n,t),e.dtype))}}const bw={kernelName:$o,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const a=n,{reductionIndices:i}=a,s=t[0],r=yw(e,t[1],s,js(i,s.shape));return{x:()=>r.x()}}},vw={kernelName:Zo,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t;return{a:()=>Ed(e,kd(Bf(n,a),"float32")),b:()=>Ed(e,kd(Uf(n,a),"float32"))}}};const kw=ih({maxPool3dGrad_:function(e,t,n,a,i,s,r){const o=th(e,"dy","maxPool3dGrad"),l=th(t,"input","maxPool3dGrad"),u=th(n,"output","maxPool3dGrad");let c=o,h=l,d=u,p=!1;4===l.rank&&(p=!0,c=vm(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]]),h=vm(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),d=vm(u,[1,u.shape[0],u.shape[1],u.shape[2],u.shape[3]])),Ns(5===c.rank,(()=>`Error in maxPool3dGrad: dy must be rank 5 but got rank ${c.rank}.`)),Ns(5===h.rank,(()=>`Error in maxPool3dGrad: input must be rank 5 but got rank ${h.rank}.`)),Ns(5===d.rank,(()=>`Error in maxPool3dGrad: output must be rank 5 but got rank ${d.rank}.`)),bm("maxPool3dGrad",s,r);const m={dy:c,input:h,output:d},f={filterSize:a,strides:i,pad:s,dimRoundingMode:r},g=Hc.runKernel(Jo,m,f);return p?vm(g,[g.shape[1],g.shape[2],g.shape[3],g.shape[4]]):g}}),ww={kernelName:Qo,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a,i]=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=n;return{x:()=>kw(e,a,i,s,r,o,l)}}};const Aw=ih({maxPoolGrad_:function(e,t,n,a,i,s,r){const o=th(e,"dy","maxPoolGrad"),l=th(t,"input","maxPoolGrad"),u=th(n,"output","maxPoolGrad");Ns(l.rank===o.rank,(()=>`Rank of input (${l.rank}) does not match rank of dy (${o.rank})`)),Ns(4===o.rank,(()=>`Error in maxPoolGrad: dy must be rank 4 but got rank ${o.rank}.`)),Ns(4===l.rank,(()=>`Error in maxPoolGrad: input must be rank 4 but got rank ${l.rank}.`)),bm("maxPoolGrad",s,r);const c={dy:o,input:l,output:u},h={filterSize:a,strides:i,pad:s,dimRoundingMode:r};return Hc.runKernel(Yo,c,h)}}),xw={kernelName:fl,saveAllInputs:!0,gradFunc:(e,t,n)=>{const{axis:a}=n;return Ly(e,a).map((e=>()=>e))}},Cw={kernelName:gl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const a=t[0],{paddings:i}=n,s=i.map((e=>e[0]));return{x:()=>Sm(e,s,a.shape)}}};function Sw(e,t,n){const a=e.shape.length,i=a-n.length,s=vf(n,a);let r=e;null!=s&&(r=Gy(e,s));const o=r.shape.slice(),l=o.splice(a-n.length,n.length).reduce(((e,t)=>e*t),1);o.push(l);let u=function(e,t,n){const a=e.shape.slice();a[n]=1;const i=vm(t,a),s=Qm(e,n,!0,!1),r=Qm(e,n,!0,!0),o=Ed(s,r);return Ed(i,o)}(r.reshape(o),t,i);if(u=u.reshape(r.shape),null!=s){const e=kf(s);u=Gy(u,e)}return u}const Ew={kernelName:Zl,gradFunc:(e,t,n)=>{const{blockShape:a,paddings:i}=n;return{x:()=>Tm(e,a,i)}}},_w={kernelName:Xl,gradFunc:(e,t,n)=>{const{axis:a}=n;return{x:()=>Am(e,a)}}};const Tw=[gk,yk,bk,vk,kk,wk,Ak,xk,Ck,Sk,Ek,_k,Ik,Rk,Dk,zk,Ok,Mk,Bk,Fk,Lk,Pk,Vk,jk,Wk,Gk,qk,Hk,Kk,$k,{kernelName:ho,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Sd(e,kd(a,"float32")),s=Hd(n.shape,i);return s.length>0?vm(Cf(t,s),n.shape):t},b:()=>{let t=Ed(e,kd(n,"float32"));const s=Hd(a.shape,i);s.length>0&&(t=vm(Cf(t,s),a.shape));const r=Td(a);return $f(Sd(t,kd(r,"float32")))}}}},Zk,Xk,Yk,Qk,Jk,tw,ew,nw,aw,rw,ow,lw,uw,cw,hw,dw,pw,mw,gw,bw,bw,vw,ww,{kernelName:Xo,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a,i]=t,{filterSize:s,strides:r,pad:o}=n;return{x:()=>Aw(e,a,i,s,r,o)}}},{kernelName:tl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{axis:i}=n,s=js(i,a.shape),r=zs(gf(a.shape,s)[1]);return{x:()=>{const t=a.shape.slice();s.forEach((e=>{t[e]=1}));const n=vm(e,t);return Sd(Ed(n,hg(a.shape,"float32")),r)}}}},{kernelName:nl,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const a=n,{axis:i}=a,[s,r]=t,o=yw(e,r,s,js(i,s.shape));return{x:()=>o.x()}}},{kernelName:al,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t;return{a:()=>Ed(e,kd(Wf(n,a),"float32")),b:()=>Ed(e,kd(Mf(n,a),"float32"))}}},{kernelName:il,inputsToSave:["x"],gradFunc:(e,t,n)=>{const a=t[0],{paddings:i}=n,s=i.map((e=>e[0]));return{x:()=>Sm(e,s,a.shape)}}},{kernelName:sl,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Hd(n.shape,i);return t.length>0?vm(Cf(e,t),n.shape):e},b:()=>{const t=Ed(e,$f(zf(Sd(n,a)))),s=Hd(a.shape,i);return s.length>0?vm(Cf(t,s),a.shape):t}}}},{kernelName:ol,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Ed(e,kd(a,"float32")),s=Hd(n.shape,i);return s.length>0?vm(Cf(t,s),n.shape):t},b:()=>{const t=Ed(e,kd(n,"float32")),s=Hd(a.shape,i);return s.length>0?vm(Cf(t,s),a.shape):t}}}},{kernelName:ll,gradFunc:e=>({x:()=>$f(e)})},{kernelName:ml,inputsToSave:["indices"],gradFunc:(e,t)=>{const n=t[0];return{indices:()=>cg(n.shape,"float32")}}},{kernelName:pl,gradFunc:e=>({x:()=>Id(e)})},xw,Cw,Cw,{kernelName:yl,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(e,t)=>{const[n,a,i]=t,s=n,r=a,o=Kd(s.shape,r.shape);return{a:()=>{const t=kd(r,"float32");let n=Ed(e,Ed(t,Vd(s,Ud(t,Rd(1)))));const a=Hd(s.shape,o);return a.length>0&&(n=Cf(n,a)),vm(n,s.shape)},b:()=>{const t=Mf(s,0),n=of(t,Hf(s),Id(s));let a=Ed(e,Ed(i,n));const l=Hd(r.shape,o);return l.length>0&&(a=Cf(a,l)),vm(a,r.shape)}}}},{kernelName:bl,inputsToSave:["x","alpha"],gradFunc:(e,t)=>{const[n,a]=t,i=Mf(n,0);return{x:()=>of(i,e,Ed(e,a)),alpha:()=>{let t=of(i,Id(e),Ed(e,n));const s=Hd(a.shape,e.shape);return s.length>0&&(t=Cf(t,s)),vm(t,a.shape)}}}},{kernelName:vl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{axis:i}=n;let s=[];return s=null==i?a.shape.map(((e,t)=>t)):"number"==typeof i?[i]:i,{x:()=>Sw(a,e,s)}}},{kernelName:Sl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,$f(Td(n)))}}},{kernelName:Dl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t,a=Ed(Wf(n,6),Ay(n));return{x:()=>Ed(e,kd(a,"float32"))}}},{kernelName:El,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,kd(Ay(n),"float32"))}}},{kernelName:_l,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>vm(e,n.shape)}}},{kernelName:Nl,inputsToSave:["images"],gradFunc:(e,t,n)=>{const[a]=t,i={dy:e,images:a};return{images:()=>Hc.runKernel(Rl,i,n)}}},{kernelName:Tl,inputsToSave:["images"],gradFunc:(e,t,n)=>{const[a]=t,i={dy:e,images:a};return{images:()=>Hc.runKernel(Il,i,n)}}},{kernelName:zl,gradFunc:(e,t,n)=>{const{dims:a}=n,i=js(a,e.shape);return{x:()=>Xg(e,i)}}},{kernelName:Ol,gradFunc:e=>({x:()=>Id(e)})},{kernelName:Ml,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>$f(Sd(e,Ed(Vd(n,1.5),2)))}}},{kernelName:Pl,inputsToSave:["condition"],gradFunc:(e,t)=>{const[n]=t;return{condition:()=>kd(Id(n),"float32"),t:()=>Ed(e,kd(n,e.dtype)),e:()=>Ed(e,kd(eg(n),e.dtype))}}},{kernelName:jl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=Mf(n,Rd(0)),a=Rd(Ev),i=Rd(_v),s=Ed(e,i),r=Ed(Ed(e,a),Tf(kd(n,"float32")));return of(t,s,r)}}}},{kernelName:ql,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Ed(n,Ud(Rd(1),n)))}}},{kernelName:Gl,gradFunc:e=>({x:()=>Id(e)})},{kernelName:Ul,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(Xm(kd(n,"float32")),e)}}},{kernelName:Wl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(Ym(kd(n,"float32")),e)}}},{kernelName:Vl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{begin:i,size:s}=n,r=a.shape,[o,l]=Wp(a,i,s),u=[];for(let t=0;txg(e,u)}}},{kernelName:Yl,outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a]=t,{dim:i}=n,s=Ed(e,a);return{logits:()=>Ud(s,Ed(Cf(s,[i],true),a))}}},{kernelName:Hl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Cm(n))}}},Ew,Ew,_w,_w,{kernelName:Kl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,Ed(_d(kd(n,"float32")),2))}}},{kernelName:au,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Rd(2);return{a:()=>Ed(e,Ed(i,Ud(n,a))),b:()=>Ed(e,Ed(i,Ud(a,n)))}}},{kernelName:iu,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Ed(kd(n,"float32"),2))}}},{kernelName:wu,gradFunc:e=>({x:()=>Id(e)})},{kernelName:cu,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{let t=e;const a=Hd(n.shape,i);return a.length>0&&(t=Cf(t,a)),vm(t,n.shape)},b:()=>{let t=e;const n=Hd(a.shape,i);return n.length>0&&(t=Cf(t,n)),vm($f(t),a.shape)}}}},{kernelName:$l,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,i=a.shape.slice(),{axis:s}=n;js(s,a.shape).forEach((e=>{i[e]=1}));const r=vm(e,i),o=Ed(r,hg(a.shape,"float32"));return{x:()=>o}}},{kernelName:hu,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,Td(Xm(n)))}}},{kernelName:du,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(Ud(Rd(1),Td(n)),e)}}},{kernelName:pu,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{reps:i}=n;return{x:()=>{let t=Id(a);if(1===a.rank)for(let n=0;n{const a=n,{perm:i}=a,s=kf(i);return{x:()=>Gy(e,s)}}},{kernelName:bu,gradFunc:(e,t,n)=>{const a=n,{axis:i}=a;return{value:()=>wy(e,i)}}},{kernelName:vu,inputsToSave:["segmentIds"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>function(e,t){const n=$d(t,Id(t)),a=Of(e,n);let i=Bf(t,Rd(0,"int32"));const s=a.rank-i.rank;for(let e=0;e({x:()=>Id(e)})}];for(const e of Tw)Mu(e);wc().prototype.abs=function(){return this.throwIfDisposed(),Gd(this)},wc().prototype.acos=function(){return this.throwIfDisposed(),Hp(this)},wc().prototype.acosh=function(){return this.throwIfDisposed(),Kp(this)},wc().prototype.add=function(e){return this.throwIfDisposed(),xd(this,e)},wc().prototype.all=function(e,t){return this.throwIfDisposed(),Zp(this,e,t)},wc().prototype.any=function(e,t){return this.throwIfDisposed(),Xp(this,e,t)},wc().prototype.argMax=function(e){return this.throwIfDisposed(),Yp(this,e)},wc().prototype.argMin=function(e){return this.throwIfDisposed(),Qp(this,e)},wc().prototype.asScalar=function(){return this.throwIfDisposed(),Ns(1===this.size,(()=>"The array must have only 1 element.")),vm(this,[])},wc().prototype.asType=function(e){return this.throwIfDisposed(),kd(this,e)},wc().prototype.as1D=function(){return this.throwIfDisposed(),vm(this,[this.size])},wc().prototype.as2D=function(e,t){return this.throwIfDisposed(),vm(this,[e,t])},wc().prototype.as3D=function(e,t,n){return this.throwIfDisposed(),vm(this,[e,t,n])},wc().prototype.as4D=function(e,t,n,a){return this.throwIfDisposed(),vm(this,[e,t,n,a])},wc().prototype.as5D=function(e,t,n,a,i){return this.throwIfDisposed(),vm(this,[e,t,n,a,i])},wc().prototype.asin=function(){return this.throwIfDisposed(),Jp(this)},wc().prototype.asinh=function(){return this.throwIfDisposed(),em(this)},wc().prototype.atan=function(){return this.throwIfDisposed(),tm(this)},wc().prototype.atan2=function(e){return this.throwIfDisposed(),nm(this,e)},wc().prototype.atanh=function(){return this.throwIfDisposed(),am(this)},wc().prototype.avgPool=function(e,t,n,a){return this.throwIfDisposed(),km(this,e,t,n,a)},wc().prototype.batchToSpaceND=function(e,t){return this.throwIfDisposed(),Tm(this,e,t)},wc().prototype.batchNorm=function(e,t,n,a,i){return this.throwIfDisposed(),Im(this,e,t,n,a,i)},wc().prototype.broadcastTo=function(e){return this.throwIfDisposed(),Bm(this,e)},wc().prototype.cast=function(e){return this.throwIfDisposed(),kd(this,e)},wc().prototype.ceil=function(){return this.throwIfDisposed(),Fm(this)},wc().prototype.clipByValue=function(e,t){return this.throwIfDisposed(),Lm(this,e,t)},wc().prototype.concat=function(e,t){return this.throwIfDisposed(),e instanceof kc&&(e=[e]),Am([this,...e],t)},wc().prototype.conv1d=function(e,t,n,a,i,s){return this.throwIfDisposed(),Gm(this,e,t,n,a,i,s)},wc().prototype.conv2dTranspose=function(e,t,n,a,i){return this.throwIfDisposed(),Hm(this,e,t,n,a,i)},wc().prototype.conv2d=function(e,t,n,a,i,s){return this.throwIfDisposed(),Wm(this,e,t,n,a,i,s)},wc().prototype.cos=function(){return this.throwIfDisposed(),Xm(this)},wc().prototype.cosh=function(){return this.throwIfDisposed(),Ym(this)},wc().prototype.cumprod=function(e,t,n){return this.throwIfDisposed(),Qm(this,e,t,n)},wc().prototype.cumsum=function(e,t,n){return this.throwIfDisposed(),Jm(this,e,t,n)},wc().prototype.depthToSpace=function(e,t){return this.throwIfDisposed(),tf(this,e,t)},wc().prototype.depthwiseConv2d=function(e,t,n,a,i,s){return this.throwIfDisposed(),nf(this,e,t,n,a,i,s)},wc().prototype.dilation2d=function(e,t,n,a,i){return this.throwIfDisposed(),sf(this,e,t,n,a,i)},wc().prototype.divNoNan=function(e){return this.throwIfDisposed(),lf(this,e)},wc().prototype.div=function(e){return this.throwIfDisposed(),Sd(this,e)},wc().prototype.dot=function(e){return this.throwIfDisposed(),uf(this,e)},wc().prototype.elu=function(){return this.throwIfDisposed(),hf(this)},wc().prototype.equal=function(e){return this.throwIfDisposed(),rf(this,e)},wc().prototype.erf=function(){return this.throwIfDisposed(),pf(this)},wc().prototype.euclideanNorm=function(e,t){return this.throwIfDisposed(),_f(this,e,t)},wc().prototype.exp=function(){return this.throwIfDisposed(),Tf(this)},wc().prototype.expandDims=function(e){return this.throwIfDisposed(),If(this,e)},wc().prototype.expm1=function(){return this.throwIfDisposed(),Nf(this)},wc().prototype.fft=function(){return this.throwIfDisposed(),my(this)},wc().prototype.flatten=function(){return this.throwIfDisposed(),vm(this,[this.size])},wc().prototype.floor=function(){return this.throwIfDisposed(),zf(this)},wc().prototype.floorDiv=function(e){return this.throwIfDisposed(),Cd(this,e)},wc().prototype.gather=function(e,t,n){return this.throwIfDisposed(),Of(this,e,t,n)},wc().prototype.greaterEqual=function(e){return this.throwIfDisposed(),Bf(this,e)},wc().prototype.greater=function(e){return this.throwIfDisposed(),Mf(this,e)},wc().prototype.ifft=function(){return this.throwIfDisposed(),fy(this)},wc().prototype.irfft=function(){return this.throwIfDisposed(),gy(this)},wc().prototype.isFinite=function(){return this.throwIfDisposed(),Lf(this)},wc().prototype.isInf=function(){return this.throwIfDisposed(),Pf(this)},wc().prototype.isNaN=function(){return this.throwIfDisposed(),jf(this)},wc().prototype.leakyRelu=function(e){return this.throwIfDisposed(),Vf(this,e)},wc().prototype.lessEqual=function(e){return this.throwIfDisposed(),Wf(this,e)},wc().prototype.less=function(e){return this.throwIfDisposed(),Uf(this,e)},wc().prototype.localResponseNormalization=function(e,t,n,a){return this.throwIfDisposed(),qf(this,e,t,n,a)},wc().prototype.logSigmoid=function(){return this.throwIfDisposed(),Xf(this)},wc().prototype.logSoftmax=function(e){return this.throwIfDisposed(),Yf(this,e)},wc().prototype.logSumExp=function(e,t){return this.throwIfDisposed(),Qf(this,e,t)},wc().prototype.log=function(){return this.throwIfDisposed(),Hf(this)},wc().prototype.log1p=function(){return this.throwIfDisposed(),Kf(this)},wc().prototype.logicalAnd=function(e){return this.throwIfDisposed(),Jf(this,e)},wc().prototype.logicalNot=function(){return this.throwIfDisposed(),eg(this)},wc().prototype.logicalOr=function(e){return this.throwIfDisposed(),tg(this,e)},wc().prototype.logicalXor=function(e){return this.throwIfDisposed(),ng(this,e)},wc().prototype.matMul=function(e,t,n){return this.throwIfDisposed(),xm(this,e,t,n)},wc().prototype.maxPool=function(e,t,n,a){return this.throwIfDisposed(),rg(this,e,t,n,a)},wc().prototype.max=function(e,t){return this.throwIfDisposed(),Af(this,e,t)},wc().prototype.maximum=function(e){return this.throwIfDisposed(),$d(this,e)},wc().prototype.mean=function(e,t){return this.throwIfDisposed(),ug(this,e,t)},wc().prototype.min=function(e,t){return this.throwIfDisposed(),xf(this,e,t)},wc().prototype.minimum=function(e){return this.throwIfDisposed(),pg(this,e)},wc().prototype.mirrorPad=function(e,t){return this.throwIfDisposed(),mg(this,e,t)},wc().prototype.mod=function(e){return this.throwIfDisposed(),fg(this,e)},wc().prototype.mul=function(e){return this.throwIfDisposed(),Ed(this,e)},wc().prototype.neg=function(){return this.throwIfDisposed(),$f(this)},wc().prototype.norm=function(e,t,n){return this.throwIfDisposed(),Ef(this,e,t,n)},wc().prototype.notEqual=function(e){return this.throwIfDisposed(),vg(this,e)},wc().prototype.oneHot=function(e,t=1,n=0){return this.throwIfDisposed(),kg(this,e,t,n)},wc().prototype.onesLike=function(){return this.throwIfDisposed(),wg(this)},wc().prototype.pad=function(e,t){return this.throwIfDisposed(),xg(this,e,t)},wc().prototype.pool=function(e,t,n,a,i,s){return this.throwIfDisposed(),Ig(this,e,t,n,a,i,s)},wc().prototype.pow=function(e){return this.throwIfDisposed(),Vd(this,e)},wc().prototype.prelu=function(e){return this.throwIfDisposed(),Ng(this,e)},wc().prototype.prod=function(e,t){return this.throwIfDisposed(),Rg(this,e,t)},wc().prototype.reciprocal=function(){return this.throwIfDisposed(),Kg(this)},wc().prototype.relu=function(){return this.throwIfDisposed(),$g(this)},wc().prototype.relu6=function(){return this.throwIfDisposed(),Zg(this)},wc().prototype.reshapeAs=function(e){return this.throwIfDisposed(),vm(this,e.shape)},wc().prototype.reshape=function(e){return this.throwIfDisposed(),vm(this,e)},wc().prototype.resizeBilinear=function(e,t,n){return this.throwIfDisposed(),Ob(this,e,t,n)},wc().prototype.resizeNearestNeighbor=function(e,t,n){return this.throwIfDisposed(),Mb(this,e,t,n)},wc().prototype.reverse=function(e){return this.throwIfDisposed(),Xg(this,e)},wc().prototype.rfft=function(){return this.throwIfDisposed(),by(this)},wc().prototype.round=function(){return this.throwIfDisposed(),ty(this)},wc().prototype.rsqrt=function(){return this.throwIfDisposed(),ny(this)},wc().prototype.selu=function(){return this.throwIfDisposed(),ay(this)},wc().prototype.separableConv2d=function(e,t,n,a,i,s){return this.throwIfDisposed(),iy(this,e,t,n,a,i,s)},wc().prototype.sigmoid=function(){return this.throwIfDisposed(),Cm(this)},wc().prototype.sign=function(){return this.throwIfDisposed(),ry(this)},wc().prototype.sin=function(){return this.throwIfDisposed(),oy(this)},wc().prototype.sinh=function(){return this.throwIfDisposed(),ly(this)},wc().prototype.slice=function(e,t){return this.throwIfDisposed(),Sm(this,e,t)},wc().prototype.softmax=function(e){return this.throwIfDisposed(),py(this,e)},wc().prototype.softplus=function(){return this.throwIfDisposed(),Zf(this)},wc().prototype.spaceToBatchND=function(e,t){return this.throwIfDisposed(),Tg(this,e,t)},wc().prototype.split=function(e,t){return this.throwIfDisposed(),yy(this,e,t)},wc().prototype.sqrt=function(){return this.throwIfDisposed(),_d(this)},wc().prototype.square=function(){return this.throwIfDisposed(),Td(this)},wc().prototype.squaredDifference=function(e){return this.throwIfDisposed(),vy(this,e)},wc().prototype.squeeze=function(e){return this.throwIfDisposed(),ky(this,e)},wc().prototype.stack=function(e,t){this.throwIfDisposed();const n=e instanceof kc?[this,e]:[this,...e];return wy(n,t)},wc().prototype.step=function(e){return this.throwIfDisposed(),Ay(this,e)},wc().prototype.stridedSlice=function(e,t,n,a,i,s,r,o){return this.throwIfDisposed(),xy(this,e,t,n,a,i,s,r,o)},wc().prototype.sub=function(e){return this.throwIfDisposed(),Ud(this,e)},wc().prototype.sum=function(e,t){return this.throwIfDisposed(),Cf(this,e,t)},wc().prototype.tan=function(){return this.throwIfDisposed(),Cy(this)},wc().prototype.tanh=function(){return this.throwIfDisposed(),Em(this)},wc().prototype.tile=function(e){return this.throwIfDisposed(),Rf(this,e)},wc().prototype.toBool=function(){return this.throwIfDisposed(),kd(this,"bool")},wc().prototype.toFloat=function(){return this.throwIfDisposed(),kd(this,"float32")},wc().prototype.toInt=function(){return this.throwIfDisposed(),kd(this,"int32")},wc().prototype.topk=function(e,t){return this.throwIfDisposed(),Oy(this,e,t)},wc().prototype.transpose=function(e){return this.throwIfDisposed(),Gy(this,e)},wc().prototype.unique=function(e){return this.throwIfDisposed(),By(this,e)},wc().prototype.unsortedSegmentSum=function(e,t){return this.throwIfDisposed(),Fy(this,e,t)},wc().prototype.unstack=function(e){return this.throwIfDisposed(),Ly(this,e)},wc().prototype.where=function(e,t){return this.throwIfDisposed(),of(e,this,t)},wc().prototype.zerosLike=function(){return this.throwIfDisposed(),Id(this)};class Iw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Iw.prototype)}}class Nw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Nw.prototype)}}class Rw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Rw.prototype)}}class Dw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Dw.prototype)}}class zw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,zw.prototype)}}Error;class Ow{constructor(e){this.maxEntries=e||100,this.cache=new Map}get(e){let t;return this.cache.has(e)&&(t=this.cache.get(e),this.cache.delete(e),this.cache.set(e,t)),t}put(e,t){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.maxEntries){const e=this.cache.keys().next().value;this.cache.delete(e)}this.cache.set(e,t)}getMaxEntries(){return this.maxEntries}setMaxEntries(e){if(e<0)throw new Error(`The maxEntries of LRU caches must be at least 0, but got ${e}.`);if(this.maxEntries>e)for(let t=0;tt.toUpperCase()))}let Uw={};function Ww(e){if(null==e)return null;const t={};return t.className=e.getClassName(),t.config=e.getConfig(),t}function Gw(e){if(null!=e&&"object"==typeof e)if(Array.isArray(e))e.forEach((e=>Gw(e)));else{const t=Object.keys(e);for(const n of t){const t=e[n];null!=t&&"object"==typeof t&&(Array.isArray(t)||"ndarray"!==t.type||"number"!=typeof t.value?Gw(t):e[n]=t.value)}}}function qw(e,t={},n={},a="object",i=!1){if("string"==typeof e){const i=e;let s;if(i in n)s=n[i];else if(i in Uw)s=Uw[i];else if(s=t[i],null==s)throw new Rw(`Unknown ${a}: ${e}. This may be due to one of the following reasons:\n1. The ${a} is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code.\n2. The custom ${a} is defined in JavaScript, but is not registered properly with tf.serialization.registerClass().`);return s}{const s=e;if(null==s.className||null==s.config)throw new Rw(`${a}: Improper config format: ${JSON.stringify(s)}.\n'className' and 'config' must set.`);const r=s.className;let o,l;if(r in n?[o,l]=n[r]:r in Uw?[o,l]=Uw.className:r in t&&([o,l]=t[r]),null==o)throw new Rw(`Unknown ${a}: ${r}. This may be due to one of the following reasons:\n1. The ${a} is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code.\n2. The custom ${a} is defined in JavaScript, but is not registered properly with tf.serialization.registerClass().`);if(null!=l){const e={};for(const t of Object.keys(Uw))e[t]=Uw[t];for(const t of Object.keys(n))e[t]=n[t];s.config.customObjects=e;const t=Object.assign({},Uw);for(const e of Object.keys(n))Uw[e]=n[e];Gw(s.config);const a=l(o,s.config,n,i);return Uw=Object.assign({},t),a}{const e=Object.assign({},Uw);for(const e of Object.keys(n))Uw[e]=n[e];const t=new o(s.config);return Uw=Object.assign({},e),t}}}function Hw(e,t){return-1*function(e,t){return et?1:0}(e,t)}function Kw(e){if(null==e)return e;const t=[];for(const n of e)-1===t.indexOf(n)&&t.push(n);return t}function $w(e){if(null==e)throw new Rw(`Invalid value in obj: ${JSON.stringify(e)}`);for(const t in e)if(e.hasOwnProperty(t))return!1;return!0}function Zw(e,t,n){if(null!=n&&e.indexOf(n)<0)throw new Rw(`${n} is not a valid ${t}. Valid values are ${e} or null/undefined.`)}function Xw(e,t,n=0,a=1/0){return Bw(n>=0),Bw(a>=n),Array.isArray(e)&&e.length>=n&&e.length<=a&&e.every((e=>typeof e===t))}function Yw(e,t){Array.isArray(e)?(Ns(e.length>0,(()=>`${t} is unexpectedly an empty array.`)),e.forEach(((e,n)=>Yw(e,`element ${n+1} of ${t}`)))):Ns(Number.isInteger(e)&&e>0,(()=>`Expected ${t} to be a positive integer, but got ${Qw(e)}.`))}function Qw(e){return null===e?"null":Array.isArray(e)?"["+e.map((e=>Qw(e))).join(",")+"]":"string"==typeof e?`"${e}"`:`${e}`}function Jw(e){return"relu"===e?"relu":"linear"===e?"linear":"elu"===e?"elu":null}let eA=0;function tA(){return eA++}const nA={};function aA(e=""){return e in nA||(nA[e]=0),nA[e]+=1,e+nA[e].toString()}const iA=["channelsFirst","channelsLast"],sA=["nearest","bilinear"],rA=["valid","same","causal"],oA=["max","avg"],lA=["sum","mul","concat","ave"],uA=new Map;function cA(e){Zw(iA,"DataFormat",e)}function hA(e){Zw(rA,"PaddingMode",e)}function dA(e){Zw(oA,"PoolMode",e)}const pA=[],mA="/";function fA(e,t){pA.push(e);try{const e=t();return pA.pop(),e}catch(e){throw pA.pop(),e}}function gA(e){if(!vA(e))throw new Error("Not a valid tensor name: '"+e+"'");return(0===pA.length?"":pA.join(mA)+mA)+e}function yA(e){if(!vA(e))throw new Error("Not a valid tensor name: '"+e+"'");uA.has(e)||uA.set(e,0);const t=uA.get(e);if(uA.set(e,uA.get(e)+1),t>0){const n=`${e}_${t}`;return uA.set(n,1),n}return e}const bA=new RegExp(/^[A-Za-z0-9][-A-Za-z0-9\._\/]*$/);function vA(e){return!!e.match(bA)}function kA(e,t,n){null==t&&(t=0),null==n&&(n=e.length);let a=1;for(let i=t;it&&(t=a)}return t}function xA(e,t){if(t{switch(e.rank){case 1:return uy(e,t,n);case 2:return cy(e,[t,0],[n,e.shape[1]]);case 3:return hy(e,[t,0,0],[n,e.shape[1],e.shape[2]]);case 4:return dy(e,[t,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3]]);case 5:return Sm(e,[t,0,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3],e.shape[4]]);case 6:return Sm(e,[t,0,0,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3],e.shape[4],e.shape[5]]);default:throw new Rw(`sliceAlongFirstAxis() received an unsupported tensor rank: ${e.rank}`)}}))}function IA(e,t,n){return dh((()=>{switch(e.rank){case 1:return uy(e,t,n);case 2:return cy(e,[0,t],[e.shape[0],n]);case 3:return hy(e,[0,0,t],[e.shape[0],e.shape[1],n]);case 4:return dy(e,[0,0,0,t],[e.shape[0],e.shape[1],e.shape[2],n]);default:throw new Rw(`sliceAlongLastAxis() received an unsupported tensor rank: ${e.rank}`)}}))}function NA(e,t,n,a){return dh((()=>{switch(e.rank){case 1:return uy(e,t,n);case 2:switch(a){case 1:return TA(e,t,n);case 2:return IA(e,t,n);default:throw new Rw(`The axis is not within the rank of the tensor ${a}`)}case 3:switch(a){case 1:return TA(e,t,n);case 2:return hy(e,[0,t,0],[e.shape[0],n,e.shape[2]]);case 3:return IA(e,t,n);default:throw new Rw(`The axis is not within the rank of the tensor ${a}`)}case 4:switch(a){case 1:return TA(e,t,n);case 2:return dy(e,[0,t,0,0],[e.shape[0],n,e.shape[2],e.shape[3]]);case 3:return dy(e,[0,0,t,0],[e.shape[0],e.shape[1],n,e.shape[3]]);case 4:return IA(e,t,n);default:throw new Rw(`The axis is not within the rank of the tensor ${a}`)}default:throw new Rw(`sliceAlongLastAxis() received an unsupported tensor rank: ${e.rank}`)}}))}function RA(e,t=-1){let n;return t<0&&(n=e[0].rank,t=0!==n?n:0),t===e[0].rank&&(t=-1),Am(e,t)}function DA(e,t){switch(e.rank){case 1:return Pm([e,t]);case 2:return jm([e,t],0);case 3:return Vm([e,t],0);case 4:return Um([e,t],0);default:throw new Rw(`concatAlongFirstAxis() received an unsupported tensor rank: ${e.rank}`)}}function zA(e,t){if(Array.isArray(t)||(t=[t]),e.rank!==t.length)throw new Rw(`The length of input n (${t.length}) does not match the number of dimensions in input x (${e.rank})`);return Rf(e,t)}function OA(e,t=0,n=1,a,i){return Vg(e,t,n,a,i)}function MA(e,t,n,a){if(e.rank<2||t.rank<2)throw new Dw(`dot requires both inputs to be rank >= 2 but got x shape = ${e.shape} and y shape = ${t.shape}`);if(t.rank>=3){if(e.shape.slice(-1)[0]!==t.shape.slice(-2)[0])throw new Dw(`If rank y >= 3, then the second last dim of y must equal the last dim of x but got x shape = ${e.shape} and y shape = ${t.shape}`)}if(2===e.rank&&2===t.rank){return lb({a:e,b:t,transposeA:!1,transposeB:!1,bias:a?LA(e.rank,a,"channelsLast"):null,activation:n})}{const i=e.shape.slice(),s=i.pop();e=vm(e,[-1,s]);const r=t.shape.slice(),o=r.pop(),l=r.pop(),u=[...r,o],c=Array.from({length:t.rank},((e,n)=>0===n?t.rank-2:n<=t.rank-2?n-1:n));t=vm(Gy(t,c),[l,-1]);const h=[...i,...u];return vm(lb({a:e,b:t,transposeA:!1,transposeB:!1,bias:a?LA(e.rank,a,"channelsLast"):null,activation:n}),h)}}function BA(e,t,n){return dh((()=>(t=Array.isArray(t)?Sy(t,"int32"):kd(t,"int32"),Of(e,t,n))))}function FA(e){return Ed(e,e)}function LA(e,t,n){const a=t.shape;if(1!==t.rank&&t.rank!==e)throw new Rw(`Unexpected bias dimensions: ${t.rank}; expected it to be 1 or ${e}`);if(5===e){if("channelsFirst"===n)return 1===a.length?vm(t,[1,a[0],1,1,1]):vm(t,[1,a[3],a[0],a[1],a[2]]);if("channelsLast"===n)return 1===a.length?vm(t,[1,1,1,1,a[0]]):vm(t,[1].concat(a))}else if(4===e){if("channelsFirst"===n)return 1===a.length?vm(t,[1,a[0],1,1]):vm(t,[1,a[2],a[0],a[1]]);if("channelsLast"===n)return 1===a.length?vm(t,[1,1,1,a[0]]):vm(t,[1].concat(a))}else if(3===e){if("channelsFirst"===n)return 1===a.length?vm(t,[1,a[0],1]):vm(t,[1,a[1],a[0]]);if("channelsLast"===n)return 1===a.length?vm(t,[1,1,a[0]]):vm(t,[1].concat(a))}else if(e<3)return t;throw new Rw(`Unsupported input rank by biasAdd: ${t.rank}`)}function PA(e,t,n){return dh((()=>(null==n&&(n="channelsLast"),cA(n),xd(e,LA(e.rank,t,n)))))}function jA(e,t,n,a){return dh((()=>Zy(e,t,n,a)))}function VA(e,t,n=!1){return n?e():t()}const UA=["fanIn","fanOut","fanAvg"],WA=["normal","uniform","truncatedNormal"];class GA extends Od{fromConfigUsesCustomObjects(){return!1}getConfig(){return{}}}class qA extends GA{apply(e,t){return cg(e,t)}}qA.className="Zeros",Bd(qA);class HA extends GA{apply(e,t){return hg(e,t)}}HA.className="Ones",Bd(HA);class KA extends GA{constructor(e){if(super(),"object"!=typeof e)throw new Rw(`Expected argument of type ConstantConfig but got ${e}`);if(void 0===e.value)throw new Rw(`config must have value set but got ${e}`);this.value=e.value}apply(e,t){return dh((()=>Ed(Rd(this.value),hg(e,t))))}getConfig(){return{value:this.value}}}KA.className="Constant",Bd(KA);class $A extends GA{constructor(e){super(),this.DEFAULT_MINVAL=-.05,this.DEFAULT_MAXVAL=.05,this.minval=e.minval||this.DEFAULT_MINVAL,this.maxval=e.maxval||this.DEFAULT_MAXVAL,this.seed=e.seed}apply(e,t){return Wg(e,this.minval,this.maxval,t,this.seed)}getConfig(){return{minval:this.minval,maxval:this.maxval,seed:this.seed}}}$A.className="RandomUniform",Bd($A);class ZA extends GA{constructor(e){super(),this.DEFAULT_MEAN=0,this.DEFAULT_STDDEV=.05,this.mean=e.mean||this.DEFAULT_MEAN,this.stddev=e.stddev||this.DEFAULT_STDDEV,this.seed=e.seed}apply(e,t){if("float32"!==(t=t||"float32")&&"int32"!==t)throw new Dw(`randomNormal does not support dType ${t}.`);return OA(e,this.mean,this.stddev,t,this.seed)}getConfig(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}}}ZA.className="RandomNormal",Bd(ZA);class XA extends GA{constructor(e){super(),this.DEFAULT_MEAN=0,this.DEFAULT_STDDEV=.05,this.mean=e.mean||this.DEFAULT_MEAN,this.stddev=e.stddev||this.DEFAULT_STDDEV,this.seed=e.seed}apply(e,t){if("float32"!==(t=t||"float32")&&"int32"!==t)throw new Dw(`truncatedNormal does not support dType ${t}.`);return My(e,this.mean,this.stddev,t,this.seed)}getConfig(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}}}XA.className="TruncatedNormal",Bd(XA);class YA extends GA{constructor(e){super(),this.gain=null!=e.gain?e.gain:1}apply(e,t){return dh((()=>{if(2!==e.length||e[0]!==e[1])throw new Rw("Identity matrix initializer can only be used for 2D square matrices.");return Ed(this.gain,Df(e[0]))}))}getConfig(){return{gain:this.gain}}}YA.className="Identity",Bd(YA);class QA extends GA{constructor(e){if(super(),e.scale<0)throw new Rw(`scale must be a positive float. Got: ${e.scale}`);var t;this.scale=null==e.scale?1:e.scale,this.mode=null==e.mode?"fanIn":e.mode,t=this.mode,Zw(UA,"FanMode",t),this.distribution=null==e.distribution?"normal":e.distribution,function(e){Zw(WA,"Distribution",e)}(this.distribution),this.seed=e.seed}apply(e,t){const n=function(e,t="channelsLast"){let n,a;if(cA(t),2===e.length)n=e[0],a=e[1];else if(-1!==[3,4,5].indexOf(e.length)){if("channelsFirst"===t){const t=kA(e,2);n=e[1]*t,a=e[0]*t}else if("channelsLast"===t){const t=kA(e,0,e.length-2);n=e[e.length-2]*t,a=e[e.length-1]*t}}else{const t=kA(e);n=Math.sqrt(t),a=Math.sqrt(t)}return[n,a]}(e),a=n[0],i=n[1];let s=this.scale;if("fanIn"===this.mode?s/=Math.max(1,a):"fanOut"===this.mode?s/=Math.max(1,i):s/=Math.max(1,(a+i)/2),"normal"===this.distribution){const n=Math.sqrt(s);if("float32"!==(t=t||"float32")&&"int32"!==t)throw new Dw(`${this.getClassName()} does not support dType ${t}.`);return My(e,0,n,t,this.seed)}{const n=Math.sqrt(3*s);return Wg(e,-n,n,t,this.seed)}}getConfig(){return{scale:this.scale,mode:this.mode,distribution:this.distribution,seed:this.seed}}}QA.className="VarianceScaling",Bd(QA);class JA extends QA{constructor(e){super({scale:1,mode:"fanAvg",distribution:"uniform",seed:null==e?null:e.seed})}getClassName(){return QA.className}}JA.className="GlorotUniform",Bd(JA);class ex extends QA{constructor(e){super({scale:1,mode:"fanAvg",distribution:"normal",seed:null==e?null:e.seed})}getClassName(){return QA.className}}ex.className="GlorotNormal",Bd(ex);class tx extends QA{constructor(e){super({scale:2,mode:"fanIn",distribution:"normal",seed:null==e?null:e.seed})}getClassName(){return QA.className}}tx.className="HeNormal",Bd(tx);class nx extends QA{constructor(e){super({scale:2,mode:"fanIn",distribution:"uniform",seed:null==e?null:e.seed})}getClassName(){return QA.className}}nx.className="HeUniform",Bd(nx);class ax extends QA{constructor(e){super({scale:1,mode:"fanIn",distribution:"normal",seed:null==e?null:e.seed})}getClassName(){return QA.className}}ax.className="LeCunNormal",Bd(ax);class ix extends QA{constructor(e){super({scale:1,mode:"fanIn",distribution:"uniform",seed:null==e?null:e.seed})}getClassName(){return QA.className}}ix.className="LeCunUniform",Bd(ix);class sx extends GA{constructor(e){super(),this.DEFAULT_GAIN=1,this.ELEMENTS_WARN_SLOW=2e3,this.gain=null==e.gain?this.DEFAULT_GAIN:e.gain,this.seed=e.seed}apply(e,t){return dh((()=>{if(e.length<2)throw new Dw("Shape must be at least 2D.");if("int32"!==t&&"float32"!==t&&void 0!==t)throw new TypeError(`Unsupported data type ${t}.`);const n=zs(e.slice(0,-1)),a=e[e.length-1];this.ELEMENTS_WARN_SLOW;const i=OA([Math.max(a,n),Math.min(a,n)],0,1,t,this.seed),s=nv.qr(i,!1);let r=s[0];const o=s[1].flatten().stridedSlice([0],[Math.min(a,n)*Math.min(a,n)],[Math.min(a,n)+1]);return r=Ed(r,o.sign()),ne*t));return t}const fx="Variable";class gx{constructor(e,t="float32",n=fx,a=!0,i=null){this.dtype=null==t?"float32":t,this.shape=e.shape,this.id=tA(),n=null==n?fx:n,this.originalName=gA(n),this.name=yA(this.originalName),this.trainable_=a,this.constraint=i,this.val=jy(e,this.trainable_,this.name,this.dtype)}read(){return this.assertNotDisposed(),this.val}write(e){return this.assertNotDisposed(),function(e,t){if(e.shape.toString()!==t.shape.toString())throw new Error("Shape mismatch: "+JSON.stringify(e.shape)+" vs. "+JSON.stringify(t.shape))}(this.val,e),this.val.id!==e.id&&(this.val.assign(e),null!=this.constraint&&this.val.assign(this.constraint.apply(this.val))),this}dispose(){this.assertNotDisposed(),this.val.dispose()}assertNotDisposed(){if(this.val.isDisposed)throw new Error(`LayersVariable ${this.name} is already disposed.`)}get trainable(){return this.trainable_}set trainable(e){this.trainable_=e,this.val.trainable=e}}function yx(e){return e.map((e=>e.read()))}function bx(e){e.forEach((e=>{e[0].write(e[1])}))}class vx{constructor(e){this.dtype=e.dtype,this.shape=e.shape,null!=e.shape?this.ndim=e.shape.length:this.ndim=e.ndim,this.maxNDim=e.maxNDim,this.minNDim=e.minNDim,this.axes=e.axes||{}}}class kx{constructor(e,t,n,a,i,s,r){this.dtype=e,this.shape=t,this.sourceLayer=n,this.inputs=a,this.callArgs=i,this.outputTensorIndex=r,this.id=tA(),null!=s&&(this.originalName=gA(s),this.name=yA(this.originalName)),this.rank=t.length}}let wx=0;class Ax{constructor(e,t){this.callArgs=t,this.id=wx++,this.outboundLayer=e.outboundLayer,this.inboundLayers=e.inboundLayers,this.nodeIndices=e.nodeIndices,this.tensorIndices=e.tensorIndices,this.inputTensors=e.inputTensors,this.outputTensors=e.outputTensors,this.inputMasks=e.inputMasks,this.outputMasks=e.outputMasks,this.inputShapes=e.inputShapes,this.outputShapes=e.outputShapes;for(const t of e.inboundLayers)null!=t&&t.outboundNodes.push(this);e.outboundLayer.inboundNodes.push(this)}getConfig(){const e=[];for(const t of this.inboundLayers)null!=t?e.push(t.name):e.push(null);return{outboundLayer:this.outboundLayer?this.outboundLayer.name:null,inboundLayers:e,nodeIndices:this.nodeIndices,tensorIndices:this.tensorIndices}}}let xx=0;class Cx extends Od{constructor(e={}){super(),this._callHook=null,this._addedWeightNames=[],this._stateful=!1,this.id=xx++,this.activityRegularizer=null,this.inputSpec=null,this.supportsMasking=!1,this._trainableWeights=[],this._nonTrainableWeights=[],this._losses=[],this._updates=[],this._built=!1,this.inboundNodes=[],this.outboundNodes=[];let t=e.name;if(!t){const e=this.getClassName();t=jw(e)+"_"+aA(e)}if(this.name=t,this.trainable_=null==e.trainable||e.trainable,null!=e.inputShape||null!=e.batchInputShape){let t;if(null!=e.batchInputShape)t=e.batchInputShape;else if(null!=e.inputShape){let n=null;null!=e.batchSize&&(n=e.batchSize),t=[n].concat(e.inputShape)}this.batchInputShape=t;let n=e.dtype;null==n&&(n=e.inputDType),null==n&&(n="float32"),this.dtype=n}null!=e.weights?this.initialWeights=e.weights:this.initialWeights=null,this._refCount=null,this.fastWeightInitDuringBuild=!1}static nodeKey(e,t){return e.name+"_ib-"+t.toString()}getNodeAtIndex(e,t){if(0===this.inboundNodes.length)throw new Nw(`The layer has never been called and thus has no defined ${t}.`);if(this.inboundNodes.length<=e)throw new Rw(`Asked to get ${t} at node ${e}, but the layer has only ${this.inboundNodes.length} inbound nodes.`);return this.inboundNodes[e]}getInputAt(e){return Lw(this.getNodeAtIndex(e,"input").inputTensors)}getOutputAt(e){return Lw(this.getNodeAtIndex(e,"output").outputTensors)}get input(){if(this.inboundNodes.length>1)throw new Iw(`Layer ${this.name} has multiple inbound nodes, hence the notion of "layer input" is ill-defined. Use \`getInputAt(nodeIndex)\` instead.`);if(0===this.inboundNodes.length)throw new Iw(`Layer ${this.name} is not connected, no input to return.`);return Lw(this.getNodeAtIndex(0,"input").inputTensors)}get output(){if(0===this.inboundNodes.length)throw new Iw(`Layer ${this.name} has no inbound nodes.`);if(this.inboundNodes.length>1)throw new Iw(`Layer ${this.name} has multiple inbound nodes, hence the notion of "layer output" is ill-defined. Use \`getOutputAt(nodeIndex)\` instead.`);return Lw(this.getNodeAtIndex(0,"output").outputTensors)}get losses(){return this._losses}calculateLosses(){return this.losses.map((e=>e()))}get updates(){return this._updates}get built(){return this._built}set built(e){this._built=e}get trainable(){return this.trainable_}set trainable(e){this._trainableWeights.forEach((t=>t.trainable=e)),this.trainable_=e}get trainableWeights(){return this.trainable_?this._trainableWeights.filter((e=>e.trainable)):[]}set trainableWeights(e){this._trainableWeights=e}get nonTrainableWeights(){return this.trainable?this._trainableWeights.filter((e=>!e.trainable)).concat(this._nonTrainableWeights):this._trainableWeights.concat(this._nonTrainableWeights)}set nonTrainableWeights(e){this._nonTrainableWeights=e}get weights(){return this.trainableWeights.concat(this.nonTrainableWeights)}get stateful(){return this._stateful}resetStates(){if(!this.stateful)throw new Error("Cannot call the resetStates() method of a non-stateful Layer object.")}assertInputCompatibility(e){const t=Pw(e);if(null==this.inputSpec||0===this.inputSpec.length)return;const n=Pw(this.inputSpec);if(t.length!==n.length)throw new Rw(`Layer ${this.name} expects ${n.length} inputs, but it received ${t.length} input tensors. Input received: ${e}`);for(let e=0;ei.maxNDim)throw new Rw(`Input ${e} is incompatible with layer ${this.name}: expected max_ndim=${i.maxNDim}, found ndim=${s}`);if(null!=i.minNDim&&s=0?t[a]:t[t.length+a];if(null!=s&&-1===[s,null].indexOf(r))throw new Rw(`Input ${e} is incompatible with layer ${this.name}: expected axis ${a} of input shape to have value ${s} but got shape ${t}.`)}}if(null!=i.shape)for(let t=0;t{if(!this.built){this.assertInputCompatibility(e);const t=[];for(const n of Pw(e))t.push(n.shape);this.build(Lw(t)),this.built=!0,this.initialWeights&&this.setWeights(this.initialWeights),null===this._refCount&&i&&(this._refCount=1)}if(this.assertInputCompatibility(e),i){let a=this.call(e,t);this.supportsMasking&&this.setMaskMetadata(e,a);const i=Pw(a),s=[];for(let e of i)-1!==n.indexOf(e)&&(e=e.clone()),s.push(e);if(a=Lw(s),null!=this.activityRegularizer)throw new Dw("Layer invocation in the presence of activity regularizer(s) is not supported yet.");return a}{const n=function(e){e=Pw(e);const t=[];for(const n of e)t.push(n.shape);return Lw(t)}(e),a=this.computeOutputShape(n);let i;const s="float32";if(this.warnOnIncompatibleInputShape(Array.isArray(e)?n[0]:n),i=null!=a&&a.length>0&&Array.isArray(a[0])?a.map(((n,a)=>new kx(s,n,this,Pw(e),t,this.name,a))):new kx(s,a,this,Pw(e),t,this.name),this.addInboundNode(e,i,null,null,n,a,t),this._refCount++,null!=this.activityRegularizer)throw new Dw("Layer invocation in the presence of activity regularizer(s) is not supported yet.");return i}}))}warnOnIncompatibleInputShape(e){if(null!=this.batchInputShape)if(e.length!==this.batchInputShape.length);else{let t=!1;this.batchInputShape.forEach(((n,a)=>{null!=n&&null!=e[a]&&e[a]!==n&&(t=!0)}))}}get outputShape(){if(null==this.inboundNodes||0===this.inboundNodes.length)throw new Iw(`The layer ${this.name} has never been called and thus has no defined output shape.`);const e=[];for(const t of this.inboundNodes){const n=JSON.stringify(t.outputShapes);-1===e.indexOf(n)&&e.push(n)}if(1===e.length){const e=this.inboundNodes[0].outputShapes;return Array.isArray(e)&&Array.isArray(e[0])&&1===e.length?e[0]:e}throw new Iw(`The layer ${this.name} has multiple inbound nodes with different output shapes. Hence the notion of "output shape" is ill-defined for the layer.`)}countParams(){if(!this.built)throw new Nw(`You tried to call countParams() on ${this.name}, but the layer is not built yet. Build it first by calling build(batchInputShape).`);return mx(this.weights)}build(e){this.built=!0}getWeights(e=!1){return yx(e?this.trainableWeights:this.weights)}setWeights(e){dh((()=>{const t=this.weights;if(t.length!==e.length)throw new Rw(`You called setWeights(weights) on layer "${this.name}" with a weight list of length ${e.length}, but the layer was expecting ${t.length} weights. Provided weights: ${e}...`);if(0===t.length)return;const n=[],a=yx(t);for(let i=0;ii.apply(u.read()))),null==s&&(s=!0),s?this._trainableWeights.push(u):this._nonTrainableWeights.push(u),u}setFastWeightInitDuringBuild(e){this.fastWeightInitDuringBuild=e}addLoss(e){null==e||Array.isArray(e)&&0===e.length||(e=Pw(e),void 0!==this._losses&&null!==this._losses&&this.losses.push(...e))}computeOutputShape(e){return e}computeMask(e,t){if(!this.supportsMasking){if(null!=t){if(!Array.isArray(t))throw new TypeError(`Layer ${this.name} does not support masking, but was passed an inputMask.`);t.forEach((e=>{if(null!=e)throw new TypeError(`Layer ${this.name} does not support masking, but was passed an inputMask.`)}))}return null}return t}setMaskMetadata(e,t,n){if(!this.supportsMasking)return;const a=this.computeMask(e,n),i=Pw(t),s=Pw(a);if(i.length!==s.length)throw new Error(`${this.name} outputs ${i.length} tensors but ${i.length} masks for those tensors`);for(let e=0;ee.dispose())),this.weights.length}assertNotDisposed(){if(0===this._refCount)throw new Error(`Layer '${this.name}' is already disposed.`)}dispose(){if(!this.built)throw new Error(`Cannot dispose Layer ${this.name} because it has not been built yet.`);if(null===this._refCount)throw new Error(`Cannot dispose Layer ${this.name} because it has not been used yet.`);this.assertNotDisposed();let e=0;return 0==--this._refCount&&(e=this.disposeWeights()),{refCountAfterDispose:this._refCount,numDisposedVariables:e}}}function Sx(e,t,n){if((null==t||null!=n&&n>0)&&(t=e.sourceLayer,n=e.nodeIndex),0===t.inboundNodes.length)return[e];{const e=t.inboundNodes[n];if(0===e.inboundLayers.length)return e.inputTensors;{const t=[];for(let n=0;ne.name)),l=[],u=t.names();for(const e of o)-1!==u.indexOf(e)?l.push(t.getValue(e)):l.push(null);null!=a&&(a.maxNumTensors=-1/0,a.minNumTensors=1/0);const c=o.join(",")+"|"+t.names().sort().join(",");let h,d=Tx.get(c);if(null==d){const e=function(e,t){Ns(null!=e&&e.length>0,(()=>"Expected at least one fetch, got none"));let n=[],a={};if(1===e.length){const i=Dx(e[0],t);n=i.sorted,a=i.recipientMap}else{const i=new Set;for(const s of e){const{sorted:e,recipientMap:r}=Dx(s,t);for(const t of e)i.has(t.name)||(n.push(t),i.add(t.name));for(const e in r)null==a[e]&&(a[e]=new Set),r[e].forEach((t=>a[e].add(t)))}}return{sorted:n,recipientCounts:Rx(a)}}(r,t);d=e.sorted,h=e.recipientCounts,Tx.put(c,d),Ix.put(c,h)}h={},i||Object.assign(h,Ix.get(c));const p=new _x(t);for(let e=0;ea.maxNumTensors&&(a.maxNumTensors=e),e0;){const e=s[s.length-1];if(n.has(e.name)){s.pop();continue}const t=r[r.length-1]===s.length-1;if(0===e.inputs.length||t)s.pop(),a.push(e),n.add(e.name),t&&r.pop();else{r.push(s.length-1);for(const t of e.inputs)null==i[t.name]&&(i[t.name]=new Set),i[t.name].add(e.name),n.has(t.name)||s.push(t)}}return{sorted:a,recipientMap:i}}function zx(e){let t;if(1===e.sourceLayer.inboundNodes.length)t=e.sourceLayer.output;else{let n=null;for(let t=0;t_d(Cf(Ed(e,e),t,!0))))}cr().registerFlag("TOPOLOGICAL_SORT_CACHE_MAX_ENTRIES",(()=>100),(function(e){null!=Tx&&Tx.setMaxEntries(e),null!=Ix&&Ix.setMaxEntries(e)}));class Mx extends Od{getConfig(){return{}}}class Bx extends Mx{constructor(e){super(),this.defaultMaxValue=2,this.defaultAxis=0,this.maxValue=null!=e.maxValue?e.maxValue:this.defaultMaxValue,this.axis=null!=e.axis?e.axis:this.defaultAxis}apply(e){return dh((()=>{const t=Ox(e,this.axis),n=Lm(t,0,this.maxValue);return Ed(e,Sd(n,xd(SA(),t)))}))}getConfig(){return{maxValue:this.maxValue,axis:this.axis}}}Bx.className="MaxNorm",Bd(Bx);class Fx extends Mx{constructor(e){super(),this.defaultAxis=0,this.axis=null!=e.axis?e.axis:this.defaultAxis}apply(e){return dh((()=>Sd(e,xd(SA(),Ox(e,this.axis)))))}getConfig(){return{axis:this.axis}}}Fx.className="UnitNorm",Bd(Fx);class Lx extends Mx{apply(e){return $g(e)}}Lx.className="NonNeg",Bd(Lx);class Px extends Mx{constructor(e){super(),this.defaultMinValue=0,this.defaultMaxValue=1,this.defaultRate=1,this.defaultAxis=0,this.minValue=null!=e.minValue?e.minValue:this.defaultMinValue,this.maxValue=null!=e.maxValue?e.maxValue:this.defaultMaxValue,this.rate=null!=e.rate?e.rate:this.defaultRate,this.axis=null!=e.axis?e.axis:this.defaultAxis}apply(e){return dh((()=>{const t=Ox(e,this.axis),n=xd(Ed(this.rate,Lm(t,this.minValue,this.maxValue)),Ed(1-this.rate,t));return Ed(e,Sd(n,xd(SA(),t)))}))}getConfig(){return{minValue:this.minValue,maxValue:this.maxValue,rate:this.rate,axis:this.axis}}}Px.className="MinMaxNorm",Bd(Px);const jx={maxNorm:"MaxNorm",minMaxNorm:"MinMaxNorm",nonNeg:"NonNeg",unitNorm:"UnitNorm"};function Vx(e){return Ww(e)}function Ux(e,t={}){return qw(e,Md.getMap().classNameMap,t,"constraint")}function Wx(e){if(null==e)return null;if("string"==typeof e){return Ux({className:e in jx?jx[e]:e,config:{}})}return e instanceof Mx?e:Ux(e)}async function Gx(e){if(null==e)return;const t=[],n=[],a=[];for(const i in e){const s=e[i];if("number"!=typeof s){const e=s;t.push(e.data()),n.push(i),a.push(e)}}if(t.length>0){const i=await Promise.all(t);for(let t=0;txd(this.totals[e],Ed(a,n))));this.totals[e]=i,null!=t&&t.dispose()}}}async onEpochEnd(e,t){if(null!=t)for(const e of this.params.metrics)null!=this.totals[e]&&("number"==typeof this.totals[e]?t[e]=this.totals[e]/this.seen:dh((()=>{const n=Ed(Sd(1,this.seen),this.totals[e]);t[e]=n,this.totals[e].dispose(),mh(t[e])})))}}class Yx extends $x{async onTrainBegin(e){this.epoch=[],this.history={}}async onEpochEnd(e,t){null==t&&(t={}),this.epoch.push(e);for(const e in t)null==this.history[e]&&(this.history[e]=[]),this.history[e].push(t[e])}async syncData(){const e=[],t=[],n=[];for(const a in this.history){const i=this.history[a];for(let s=0;s{const r=null!=n?n():ec();return r-inew Qx(e,t)))}class eC{constructor(){}static registerCallbackConstructor(e,t){Ns(e>=0&&Number.isInteger(e),(()=>`Verbosity level is expected to be an integer >= 0, but got ${e}`)),eC.checkForDuplicate(t),null==eC.constructors[e]&&(eC.constructors[e]=[]),eC.constructors[e].push(t)}static checkForDuplicate(e){for(const t in eC.constructors){eC.constructors[+t].forEach((t=>{if(t===e)throw new Rw("Duplicate callback constructor.")}))}}static clear(){eC.constructors={}}static createCallbacks(e){const t=[];for(const n in eC.constructors){const a=+n;e>=a&&t.push(...eC.constructors[a])}return t.map((e=>new e))}}function tC(e,t,n,a,i,s,r,o,l){const u=new Yx,c=[new Xx,...eC.createCallbacks(t)];null!=e&&c.push(...e),c.push(u);const h=new Zx(c);return h.setParams({epochs:n,initialEpoch:a,samples:i,steps:s,batchSize:r,verbose:t,doValidation:o,metrics:l}),{callbackList:h,history:u}}function nC(e,t={},n=!1){return qw(e,Md.getMap().classNameMap,t,"layer",n)}function aC(e,t){return dh((()=>{"float32"!==e.dtype&&(e=kd(e,"float32"));const n=Cf(FA(e),t,!0),a=Pd(n.shape,SA()),i=_d($d(n,a));return Sd(e,i)}))}function iC(e,t){return dh((()=>ug(FA(Ud(t,e)),-1)))}function sC(e,t){return dh((()=>ug(Gd(Ud(t,e)),-1)))}function rC(e,t){return dh((()=>{const n=Ud(e,t),a=Lm(Gd(e),SA(),Number.MAX_VALUE),i=Gd(Sd(n,a));return Ed(100,ug(i,-1))}))}function oC(e,t){return dh((()=>{const n=Lm(t,SA(),Number.MAX_VALUE),a=Hf(xd(1,n)),i=Lm(e,SA(),Number.MAX_VALUE),s=Hf(xd(1,i));return ug(FA(Ud(a,s)),-1)}))}function lC(e,t,n=!1){return dh((()=>{if(n)t=py(t);else{const e=Cf(t,t.shape.length-1,!0);t=Sd(t,e)}return t=Lm(t,SA(),1-SA()),$f(Cf(Ed(kd(e,"float32"),Hf(t)),t.shape.length-1))}))}function uC(e,t,n=!1){return dh((()=>{const a=kd(zf(function(e){const t=[kA(e.shape)];return vm(e,t)}(e)),"int32"),i=(t=Lm(t,SA(),1-SA())).shape;return lC(vm(kg(a,i[i.length-1]),i),t,n)}))}function cC(e,t){return dh((()=>{let n;return n=Lm(t,SA(),1-SA()),n=Hf(Sd(n,Ud(1,n))),ug(function(e,t){if(!Os(e.shape,t.shape))throw new Rw(`logits and labels must have the same shape, but got shapes ${JSON.stringify(e.shape)} and ${JSON.stringify(t.shape)}`);return dh((()=>{const n=$g(t),a=$f(Gd(t));return xd(Ud(n,Ed(t,e)),Kf(Tf(a)))}))}(e,n),-1)}))}function hC(e,t){return dh((()=>{const n=Lm(e,SA(),1),a=Lm(t,SA(),1);return Cf(Ed(e,Hf(Sd(n,a))),-1)}))}function dC(e,t){return dh((()=>{const n=aC(e,-1),a=aC(t,-1),i=Ed(n,a);return $f(Cf(i,-1))}))}eC.constructors={};const pC={meanSquaredError:iC,meanAbsoluteError:sC,meanAbsolutePercentageError:rC,meanSquaredLogarithmicError:oC,squaredHinge:function(e,t){return dh((()=>{const n=$d(0,Ud(1,Ed(e,t)));return ug(FA(n),-1)}))},hinge:function(e,t){return dh((()=>{const n=$d(0,Ud(1,Ed(e,t)));return ug(n,-1)}))},categoricalHinge:function(e,t){return dh((()=>{const n=Cf(Ed(e,t),-1),a=Af(Ed(Ud(1,e),t),-1);return $d(0,xd(1,Ud(a,n)))}))},logcosh:function(e,t){return dh((()=>{const n=Math.log(2),a=Ud(t,e),i=Ud(xd(a,Zf(Ed(-2,a))),n);return ug(i,-1)}))},categoricalCrossentropy:lC,sparseCategoricalCrossentropy:uC,binaryCrossentropy:cC,kullbackLeiblerDivergence:hC,poisson:function(e,t){return dh((()=>{const n=Hf(xd(SA(),t));return ug(Ud(t,Ed(e,n)),-1)}))},cosineProximity:dC};function mC(e){if("string"==typeof e){if(e in pC)return pC[e];let t=`Unknown loss ${e}`;throw e.toLowerCase().includes("softmaxcrossentropy")&&(t=`Unknown loss ${e}. Use "categoricalCrossentropy" as the string name for tf.losses.softmaxCrossEntropy`),new Rw(t)}return e}function fC(e,t){return dh((()=>{const n=Ed(.5,wg(t)),a=EA(Mf(t,n),e.dtype);return ug(rf(e,a),-1)}))}function gC(e,t){return dh((()=>EA(rf(Yp(e,-1),Yp(t,-1)),"float32")))}function yC(e,t){return dh((()=>kd(Cf(Jf(rf(e,1),rf(t,1))),"float32")))}function bC(e,t){return cC(e,t)}function vC(e,t){return e.rank===t.rank&&(e=ky(e,[e.rank-1])),(t=Yp(t,-1)).dtype!==e.dtype&&(t=kd(t,e.dtype)),kd(rf(e,t),"float32")}const kC=lC,wC=uC,AC={binaryAccuracy:fC,categoricalAccuracy:gC,precision:function(e,t){return dh((()=>{const n=yC(e,t),a=function(e,t){return dh((()=>kd(Cf(Jf(rf(e,0),rf(t,1))),"float32")))}(e,t),i=xd(n,a);return kd(of(Mf(i,0),Sd(n,i),0),"float32")}))},categoricalCrossentropy:kC,sparseCategoricalCrossentropy:wC,mse:iC,MSE:iC,mae:sC,MAE:sC,mape:rC,MAPE:rC,cosine:dC};function xC(e){if("string"==typeof e&&e in AC)return AC[e];if("string"!=typeof e&&null!=e)return e;throw new Rw(`Unknown metric ${e}`)}function CC(e){if(Bw(null!==e,`Unknown LossOrMetricFn ${e}`),"string"==typeof e)return e;{let t;for(const n of Object.keys(pC))if(pC[n]===e){t=n;break}if(void 0!==t)return t;for(const n of Object.keys(AC))if(AC[n]===e){t=n;break}return void 0!==t?t:e.name}}function SC(e,t,n=!1){if(null==e||"object"!=typeof e||Object.getPrototypeOf(e)!==Object.prototype||!EC(e))throw new Error("User-defined metadata is expected to be a JSON object, but is not.");if(n){JSON.stringify(e).length}}function EC(e){if(null===e)return!0;if("object"==typeof e){if(Object.getPrototypeOf(e)===Object.prototype){const t=Object.keys(e);for(const n of t){if("string"!=typeof n)return!1;if(!EC(e[n]))return!1}return!0}if(Array.isArray(e)){for(const t of e)if(!EC(t))return!1;return!0}return!1}{const t=typeof e;return"string"===t||"number"===t||"boolean"===t}}function _C(e,t,n,a=console.log){const i=function(e){let t=!0;const n=[],a=[];for(const t in e.nodesByDepth)n.push(e.nodesByDepth[t]);for(const e of n){if(e.length>1||1===e.length&&e[0].inboundLayers.length>1){t=!1;break}a.push(...e)}if(t)for(const n of e.layers){let e=!1;for(const i of n.inboundNodes)if(-1!==a.indexOf(i)){if(e){t=!1;break}e=!0}if(!t)break}return t}(e),s=["Layer (type)","Input Shape","Output shape","Param #"];let r;if(i?(t=t||90,n=n||[.32,.61,.89,1]):(t=t||115,n=n||[.24,.48,.7,.8,1]),n[n.length-1]<=1&&(n=n.map((e=>Math.floor(t*e)))),!i){s.push("Receives inputs"),r=[];for(const t in e.nodesByDepth)r.push(...e.nodesByDepth[t])}a("_".repeat(t)),TC(s,n,a),a("=".repeat(t));const o=e.layers;for(let e=0;e0&&(a=a.slice(0,a.length-1)+" "),a+=e[n],a=a.slice(0,t[n]),a+=" ".repeat(t[n]-a.length);n(a)}function IC(e,t,n){let a,i;try{i=e.inboundNodes.map((e=>JSON.stringify(e.inputShapes))).join(",")}catch(e){i="multiple"}try{a=JSON.stringify(e.outputShape)}catch(e){a="multiple"}TC([`${e.name} (${e.getClassName()})`,i,a,e.countParams().toString()],t,n)}function NC(e,t,n,a){let i,s;try{s=e.inboundNodes.map((e=>JSON.stringify(e.inputShapes))).join(",")}catch(e){s="multiple"}try{i=JSON.stringify(e.outputShape)}catch(e){i="multiple"}const r=[];for(const t of e.inboundNodes)if(!(null!=n&&n.length>0&&-1===n.indexOf(t)))for(let e=0;ee.name))}`);Kw(this.outputs).length,this.outputs.length,this.inputLayers=[],this.inputLayersNodeIndices=[],this.inputLayersTensorIndices=[],this.outputLayers=[],this.outputLayersNodeIndices=[],this.outputLayersTensorIndices=[],this.layers=[],this.internalContainerRefs=[];for(const e of this.outputs){const t=e.sourceLayer,n=e.nodeIndex,a=e.tensorIndex;this.outputLayers.push(t),this.outputLayersNodeIndices.push(n),this.outputLayersTensorIndices.push(a)}for(const e of this.inputs){const t=e.sourceLayer,n=e.nodeIndex,a=e.tensorIndex;Bw(0===n,"input layer has >1 nodes"),Bw(0===a,"input layer has >1 tensors"),this.inputLayers.push(t),this.inputLayersNodeIndices.push(n),this.inputLayersTensorIndices.push(a)}this.inputNames=[],this.outputNames=[],this.feedInputShapes=[],this.feedInputNames=[],this.feedOutputNames=[];for(let t=0;te.shape)),this.internalOutputShapes=this.outputs.map((e=>e.shape));const t={},n={},a={},i={},s={},r=[],o=(e,t,n,a,i,l)=>{null!=a&&null!=i&&null!=l||(a=e.sourceLayer,i=e.nodeIndex,l=e.tensorIndex);const u=a.inboundNodes[i];if(-1!==n.indexOf(u))throw new Nw(`The tensor ${e.name} at layer "${a.name}" is part of a cycle.`);if(-1!==t.indexOf(u))return;this.containerNodes.add(MC.nodeKey(a,i)),a.id in s||(s[a.id]=Object.keys(s).length),-1===n.indexOf(u)&&n.push(u);const c=u.inboundLayers.length;for(let e=0;e=0;)n.splice(n.indexOf(u),1);r.push(u)},l=[],u=[];for(const e of this.outputs)o(e,l,u);const c=r.slice().reverse();for(const e of c){n[e.id]=e,e.id in t||(t[e.id]=0);let s=t[e.id];const r=null==a[e.outboundLayer.id]?0:a[e.outboundLayer.id];s=Math.max(s,r),a[e.outboundLayer.id]=s,i[e.outboundLayer.id]=e.outboundLayer,t[e.id]=s;for(let a=0;aparseInt(e,10))).sort(Hw);this.layers=[];for(const e of p){const t=d[e];t.sort(((e,t)=>{const n=s[e.id],a=s[t.id];return na?1:0}));for(const e of t)e instanceof MC&&this.internalContainerRefs.push(e),this.layers.push(e)}this.layersByDepth=d,p=Object.keys(h).map((e=>parseInt(e,10))).sort(Hw);const m=this.inputs.slice(),f=[];for(const e of p)for(const t of h[e]){const e=t.outboundLayer;if(null!=e){for(const n of t.inputTensors)if(-1===m.indexOf(n))throw new Nw(`Graph disconnected: cannot obtain value for tensor ${n} at layer "${e.name}". The following previous layers were accessed without issue: ${f}`);for(const e of t.outputTensors)m.push(e);f.push(e.name)}}this.nodesByDepth=h;const g=this.layers.map((e=>e.name));for(const e of g){const t=g.filter((t=>t===e)).length;if(1!==t)throw new Nw(`The name "${e}" is used ${t} times in the model. All layer names should be unique. Layer names: `+JSON.stringify(g))}this.outboundNodes=[],this.inboundNodes=[],new Ax({outboundLayer:this,inboundLayers:[],nodeIndices:[],tensorIndices:[],inputTensors:this.inputs,outputTensors:this.outputs,inputMasks:this.inputs.map((e=>null)),outputMasks:this.outputs.map((e=>null)),inputShapes:this.inputs.map((e=>e.shape)),outputShapes:this.outputs.map((e=>e.shape))}),this.built=!0,this._refCount=1}assertNotDisposed(){if(0===this._refCount)throw new Error(`Container '${this.name}' is already disposed.`)}dispose(){this.assertNotDisposed();const e={refCountAfterDispose:null,numDisposedVariables:0};if(0==--this._refCount){for(const t of this.layers)e.numDisposedVariables+=t.dispose().numDisposedVariables;for(const t of this.internalContainerRefs)e.numDisposedVariables+=t.dispose().numDisposedVariables}return e.refCountAfterDispose=this._refCount,e}get trainable(){return this.trainable_}set trainable(e){this.layers.forEach((t=>{t._trainableWeights.forEach((t=>t.trainable=e))})),this.trainable_=e}get trainableWeights(){if(this._trainableWeights.length>0)throw new Rw("Container instance unexpectedly contains _trainableWeights.The trainable weights of a Container are a union of the trainable weights of its consituent Layers. Its own _trainableWeights must remain an empty Array.");if(!this.trainable)return[];let e=[];for(const t of this.layers)e=e.concat(t.trainableWeights);return e}get nonTrainableWeights(){const e=[];for(const t of this.layers)e.push(...t.nonTrainableWeights);if(!this.trainable){const t=[];for(const e of this.layers)t.push(...e.trainableWeights);return t.concat(e)}return e}get weights(){return this.trainableWeights.concat(this.nonTrainableWeights)}loadWeights(e,t=!0){const n={};let a=0;const i=(e=>{const t=Object.keys(e);if(0===t.length)return!1;const n=t[0].split("/");return!isNaN(parseInt(n[n.length-1],10))})(e);i&&this.parseWeights(e);for(const e of this.layers)for(const[t,s]of e.weights.entries()){const e=i?`${s.name.split("/").slice(0,-1).join("/")+"/"}${t}`:s.originalName;if(null!=n[e])throw new Rw(`Duplicate weight name: ${e}`);n[e]=s,a++}const s=[];for(const a in e){let i=a;if(null==n[a]){const e=a.split("/");i=e.slice(0,-2).concat([e[e.length-1]]).join("/")}if(null!=n[i])s.push([n[i],e[a]]);else if(t)throw new Rw(`Provided weight data has no target variable: ${a}`);delete n[i]}if(t){const e=[];for(const t in n)e.push(t);if(e.length>0)throw new Rw(`${e.length} of ${a} weights are not set: ${e}`)}bx(s)}parseWeights(e){for(const t in Object.keys(e)){const n=t.split("/"),a=["vars","layer_checkpoint_dependencies"],i=n.map((e=>e.startsWith("_")?e.slice(1):e)).filter((e=>!a.includes(e))).join("/");i!==t&&(e[i]=e[t],delete e[t])}}updatedConfig(){const e=this.getConfig(),t={};return t.className=this.getClassName(),t.config=e,t.kerasVersion=`tfjs-layers ${OC}`,t.backend="TensorFlow.js",t}toJSON(e,t=!0){const n=zC(this.updatedConfig());return t?JSON.stringify(n):n}call(e,t){return dh((()=>{e=Pw(e);const n=new _x;for(let t=0;t{let n;return e=Pw(e),n=null==t?Mw(null,e.length):Pw(t),this.runInternalGraph(e,n)[1]}))}computeOutputShape(e){const t=hx(e);if(t.length!==this.inputLayers.length)throw new Rw(`Invalid inputShape argument ${e}: model has ${this.inputLayers.length} tensor inputs.`);const n={};for(let e=0;eparseInt(e,10))).sort(Hw);if(a.length>1)for(const e of a){const t=this.nodesByDepth[e];for(const e of t){const t=e.outboundLayer;if(-1!==this.inputLayers.map((e=>e.id)).indexOf(t.id))continue;const a=[];for(let t=0;tparseInt(e,10))).sort(Hw);for(const e of a){const t=this.nodesByDepth[e];for(const e of t){const t=e.outboundLayer,a=e.inputTensors,i=e.outputTensors,s=new Array;for(const e of a)e.id in n&&s.push(n[e.id]);if(s.length===a.length){let a,r,o,l,u={};if(null!=e.callArgs&&(u=e.callArgs),1===s.length){const[e,n]=s[0];null==u.mask&&(u.mask=n),o=Pw(t.call(e,u)),l=Pw(t.computeMask(e,n)),a=[e],r=[n]}else a=s.map((e=>e[0])),r=s.map((e=>e[1])),null==u.mask&&(u.mask=r),o=Pw(t.call(a,u)),l=Pw(t.computeMask(a,r));if(t.activityRegularizer)throw new Dw("LayersModel invocation with concrete Tensor value(s) in the presence of activity regularizer(s) is not supported yet.");for(let e=0;e{const e=[];for(const t of this.layers)for(let n=0;n0){const e=[];for(let n=0;n0&&e.apply(Lw(n),a)}function l(e){const n=e.name,s=nC(e,null!=t.customObjects?t.customObjects:{});s.setFastWeightInitDuringBuild(a),i[n]=s;e.inboundNodes.forEach((e=>{if(!(e instanceof Array))throw new Rw(`Corrupted configuration, expected array for nodeData: ${e}`);r(s,e)}))}const u=t.name,c=t.layers;for(const e of c)l(e);for(;!$w(s);)for(const e of c){const t=i[e.name];if(t.name in s){const e=s[t.name];delete s[t.name];for(const n of e)o(t,n)}}const h=[],d=[],p=t.inputLayers;for(const e of p){const t=e[0],n=e[1],a=e[2];Bw(t in i);const s=i[t].inboundNodes[n].outputTensors;h.push(s[a])}const m=t.outputLayers;for(const e of m){const t=e[0],n=e[1],a=e[2];Bw(t in i);const s=i[t].inboundNodes[n].outputTensors;d.push(s[a])}return new e({inputs:h,outputs:d,name:u})}get stateful(){if(this._stateful)throw new Rw("Container instance unexpectedly has _stateful = true. The statefulness of a Container is determined by the Layers it contains. Its _stateful property must remain the default false.");for(const e of this.layers)if(e.stateful)return!0;return!1}resetStates(){dh((()=>{this.layers.forEach((e=>{e.stateful&&e.resetStates()}))}))}}function BC(e,t,n){const a=t.length;if(null==e||Array.isArray(e)&&0===e.length)return t.map((e=>null));if(1===a)return Array.isArray(e)&&1===e.length?e:"object"==typeof e&&t[0]in e?[e[t[0]]]:[e];if(Array.isArray(e)){if(e.length!==a)throw new Error(`Provided ${n} is an array of ${e.length} element(s), but the model has ${a} outputs. Make sure a set of weights is provided for each model output.`);return e}if("object"==typeof e&&Object.keys(e).length>0&&"object"==typeof e[Object.keys(e)[0]]){const n=[];return t.forEach((t=>{t in e?n.push(e[t]):n.push(null)})),n}throw new Error(`The model has multiple (${a}) outputs, so ${n} must be either an array with ${a} elements or an object with ${t} keys. Provided ${n} not understood: ${JSON.stringify(e)}`)}function FC(e,t){return BC(e,t,"classWeight")}async function LC(e,t,n,a){if(null!=t||null!=a)throw new Error("Support sampleWeight is not implemented yet");if(null!=n){const t=dh((()=>{if(1===e.shape.length)return wd(e);if(2===e.shape.length){if(e.shape[1]>1){return Yp(e,1)}if(1===e.shape[1])return vm(e,[e.shape[0]]);throw new Error(`Encountered unexpected last-dimension size (${e.shape[1]}) during handling of class weights. The size is expected to be >= 1.`)}throw new Error(`Unexpected rank of target (y) tensor (${e.rank}) during handling of class weights. The rank is expected to be 1 or 2.`)})),a=Array.from(await t.data());ph(t);const i=[];return a.forEach((e=>{if(null==n[e])throw new Error(`classWeight must contain all classes in the training data. The class ${e} exists in the data but not in classWeight`);i.push(n[e])})),Sy(i,"float32")}return null}function PC(e,t){return Ed(e,t)}function jC(e,t){let n,a;const i=t;n=i.xs,a=i.ys,Ns(null!=n&&null!=a,(()=>`A Dataset iterator for fitDataset() is expected to generate objects of the form \`{xs: xVal, ys: yVal}\`, where the two values may be \`tf.Tensor\`, an array of Tensors, or a map of string to Tensor. The provided Dataset instead generates ${t}`));const s=VC("input",e.inputNames,n),r=VC("output",e.outputNames,a),o=s[0].shape[0];Ns(s.length===e.inputs.length,(()=>`LayersModel has ${e.inputs.length} inputs, but the dataset provides ${s.length} inputs. (Expected input keys: ${JSON.stringify(e.inputNames)})`)),Ns(r.length===e.outputs.length,(()=>`LayersModel has ${e.outputs.length} outputs, but the dataset provides ${r.length} outputs. (Expected output keys: ${JSON.stringify(e.outputNames)})`));for(let t=0;t`Batch size mismatch: input ${e.inputNames[t]} has ${s[t].shape[0]}; expected ${o} based on input ${e.inputNames[0]}.`));for(let t=0;t`Batch size mismatch: output ${e.outputNames[t]} has ${r[t].shape[0]}; expected ${o} based on input ${e.inputNames[0]}.`));return{xs:s,ys:r}}function VC(e,t,n){if(n instanceof kc)return[n];if(Array.isArray(n))return Ns(n.length===t.length,(()=>`Received an array of ${n.length} Tensors, but expected ${t.length} to match the ${e} keys ${t}.`)),n;{const a=[];for(const i of t){if(null==n[i])throw new Rw(`The feature data generated by the dataset lacks the required ${e} key '${i}'.`);a.push(n[i])}return a}}async function UC(e,t,n){const a=null!=n.batchesPerEpoch;if(Ns(null!=e.optimizer,(()=>"You must compile a model before training/testing. Use LayersModel.compile(modelCompileConfig).")),Ns(null!=n,(()=>"For fitDataset(), the 2nd argument (config) is required, but it is not provided in this call.")),Ns(null!=n.epochs&&n.epochs>0&&Number.isInteger(n.epochs),(()=>`For fitDataset(), config.epochs is expected to be a positive integer, but got ${n.epochs}`)),Ns(!a||n.batchesPerEpoch>0&&Number.isInteger(n.batchesPerEpoch),(()=>`For fitDataset(), config.batchesPerEpoch is expected to be a positive integer if specified, but got ${n.batchesPerEpoch}`)),Ns(null==n.validationSplit,(()=>"`validationSplit` is not supported by `fitDataset()`. Use validationData instead.")),e.isTraining)throw new Error("Cannot start training because another fit() call is ongoing.");e.isTraining=!0;try{const i=null!=n.validationData;let s,r;if(i)if(WC(n.validationData))Ns(null==n.validationBatches||n.validationBatches>0&&Number.isInteger(n.validationBatches),(()=>`For fitDataset() with dataset-based validation, config.validationBatches is expected not to be provided, or to be a positive integer, but got ${n.validationBatches}`));else{const e=function(e){if(3===e.length)throw new Dw("Validation with sample weights is not implemented yet.");return{xs:e[0],ys:e[1]}}(n.validationData);s=e.xs,r=e.ys}const o=e.makeTrainFunction(),l=e.getDedupedMetricsNames();let u;u=i?l.slice().concat(l.map((e=>"val_"+e))):l.slice();const c=Jx(n.callbacks,n.yieldEvery),h=null==n.verbose?1:n.verbose,{callbackList:d,history:p}=tC(c,h,n.epochs,null,null,function(e,t){let n=null;null!=t.batchesPerEpoch?n=t.batchesPerEpoch:Number.isFinite(e.size)&&(n=e.size);return n}(t,n),null,i,u);d.setModel(e),e.history=p,await d.onTrainBegin(),e.stopTraining_=!1;let m=null==n.initialEpoch?0:n.initialEpoch,f=await t.iterator();for(;m=n.batchesPerEpoch:t.done){if(i){let t;t=WC(n.validationData)?Pw(await e.evaluateDataset(n.validationData,{batches:n.validationBatches})):Pw(e.evaluate(s,r,{batchSize:null==n.validationBatchSize?32:n.validationBatchSize,verbose:0}));for(let n=0;n0&&Number.isInteger(e),(()=>`batchSize is required to be a positive integer, but got ${e}`))}function qC(e,t,n){return null==e?[null]:Array.isArray(e)?e.map((e=>TA(e,t,n-t))):TA(e,t,n-t)}function HC(e,t){return dh((()=>null==e?null:Array.isArray(e)?e.map((e=>HC(e,t))):BA(e,"int32"===t.dtype?t:kd(t,"int32"))))}function KC(e,t){const n=[];let a=0,i=null;for(;a=e&&(i=e),n.push([a,i]),a=i;return n}function $C(e){const t=[];e instanceof kc&&(e=[e]);for(let n=0;nn.push(e.id)));else if(null!=t)for(const e in t){const a=t[e];n.push(a.id)}const a=[];if(e instanceof kc)-1===n.indexOf(e.id)&&a.push(e);else if(Array.isArray(e))e.forEach((e=>{-1===n.indexOf(e.id)&&a.push(e)}));else if(null!=e)for(const t in e){const i=e[t];-1===n.indexOf(i.id)&&a.push(i)}a.forEach((e=>{e.isDisposed||e.dispose()}))}function XC(e){return Array.isArray(e)}function YC(e){return!function(e){return e instanceof kc}(e)&&!XC(e)}function QC(e,t,n,a=!0,i=""){if(null==t||0===t.length){if(null!=e){let t=!1;if(XC(e)&&e.length>0)t=!0;else if(YC(e)){for(const n in e)if(e.hasOwnProperty(n)){t=!0;break}}else t=!0;if(t)throw new Rw(`Error when checking model ${i} expected no data, but got ${e}`)}return[]}if(null==e)return t.map((e=>null));let s;if(YC(e)){s=[];for(const n of t){if(null==e[n])throw new Rw(`No data provided for "${n}". Need data for each key in: ${t}`);s.push(e[n])}}else if(XC(e)){if(e.length!==t.length)throw new Rw(`Error when checking model ${i}: the Array of Tensors that you are passing to your model is not the size the model expected. Expected to see ${t.length} Tensor(s), but instead got the following list of Tensor(s): ${e}`);s=e}else{if(t.length>1)throw new Rw(`The model ${i} expects ${t.length} Tensor(s), but only received one Tensor. Found: Tensor with shape ${e.shape}`);s=[e]}if(s=$C(s),null!=n)for(let e=0;e=0&&s!==o)throw new Rw(`${i} expected a batch of elements where each example has shape [${n[e].slice(1,n[e].length)}] (i.e.,tensor shape [*,${n[e].slice(1,n[e].length)}]) but the ${i} received an input with ${r.shape[0]} examples, each with shape [${r.shape.slice(1,r.shape.length)}] (tensor shape [${r.shape}])`)}}return s}function JC(e,t,n,a=!0,i=""){let s;if(Array.isArray(e)){if(e.length!==t.length)throw new Rw(`Error when checking model ${i}: the Array of Tensors that you are passing to your model is not the size the the model expected. Expected to see ${t.length} Tensor(s), but instead got ${e.length} Tensors(s).`);s=e}else{if(t.length>1)throw new Rw(`The model expects ${t.length} ${i} Tensors, but only received one Tensor. Found: array with shape ${JSON.stringify(e.shape)}.`);s=[e]}if(null!=n)for(let e=0;erv.adagrad(.01),Adadelta:()=>rv.adadelta(1,.95,SA()),Adam:()=>rv.adam(.001,.9,.999,SA()),Adamax:()=>rv.adamax(.002,.9,.999,SA(),0),RMSProp:()=>rv.rmsprop(.001,.9,0,SA()),SGD:()=>rv.sgd(.01)};if(t.adagrad=t.Adagrad,t.adadelta=t.Adadelta,t.adam=t.Adam,t.adamax=t.Adamax,t.rmsprop=t.RMSProp,t.sgd=t.SGD,e in t)return t[e]();throw new Rw(`Unknown Optimizer ${e}`)}(e.optimizer),this.isOptimizerOwned=!0;else{if(!(e.optimizer instanceof Fd))throw new Rw("User-defined optimizer must be an instance of tf.Optimizer.");this.optimizer_=e.optimizer,this.isOptimizerOwned=!1}let t=[];if(Array.isArray(e.loss)||"string"==typeof e.loss||"function"==typeof e.loss)if(Array.isArray(e.loss)){if(e.loss.length!==this.outputs.length)throw new Rw(`When passing an Array as loss, it should have one entry per model output. The model has ${this.outputs.length} output(s), but you passed loss=${e.loss}.`);const n=e.loss;t=n.map((e=>mC(e)))}else{const n=mC(e.loss);this.outputs.forEach((e=>{t.push(n)}))}else{e.loss=e.loss;for(const t in e.loss)if(-1===this.outputNames.indexOf(t))throw new Rw(`Unknown entry in loss dictionary: "${t}". Only expected the following keys: ${this.outputNames}`);for(const n of this.outputNames)e.loss[n],t.push(mC(e.loss[n]))}this.lossFunctions=t,this.feedOutputNames=[],this.feedOutputShapes=[],this.feedLossFns=[];for(let e=0;e{for(let e=0;e1&&(this.metricsTensors.push([t,e]),this.metricsNames.push(this.outputNames[e]+"_loss"))}}));const a=function(e,t){if(null==e||Array.isArray(e)&&0===e.length)return t.map((e=>[]));let n;if("string"==typeof e||"function"==typeof e)n=[e];else{if(!Array.isArray(e)&&"object"!=typeof e)throw new TypeError(`Type of metrics argument not understood. Expected an string,function, Array, or Object, found: ${e}`);n=e}if(Array.isArray(n))return t.map((e=>n));{const e=[];for(const a of t){let t=n.hasOwnProperty(a)?n[a]:[];Array.isArray(t)||(t=[t]),e.push(t)}return e}}(e.metrics,this.outputNames),i=(e,t,n)=>{this.outputNames.length>1&&(t=this.outputNames[e]+"_"+t),this.metricsNames.push(t),this.metricsTensors.push([n,e])};fA("metric",(()=>{for(let e=0;e{let n,a,s;for(const r of t){if("string"==typeof r&&-1!==["accuracy","acc","crossentropy","ce"].indexOf(r)){const t=this.internalOutputShapes[e];let i;1===t[t.length-1]||this.lossFunctions[e]===cC?-1!==["accuracy","acc"].indexOf(r)?a=fC:-1!==["crossentropy","ce"].indexOf(r)&&(a=bC):this.lossFunctions[e]===uC?-1!==["accuracy","acc"].indexOf(r)?a=vC:-1!==["crossentropy","ce"].indexOf(r)&&(a=wC):-1!==["accuracy","acc"].indexOf(r)?a=gC:-1!==["crossentropy","ce"].indexOf(r)&&(a=kC),-1!==["accuracy","acc"].indexOf(r)?i="acc":-1!==["crossentropy","ce"].indexOf(r)&&(i="ce"),s=a,n=""+i}else{const e=xC(r);s=e,n=""+CC(r)}let t;fA(n,(()=>{t=s})),i(e,n,t)}})(a[e])}})),this.collectedTrainableWeights=this.trainableWeights}checkTrainableWeightsConsistency(){null!=this.collectedTrainableWeights&&(this.trainableWeights.length,this.collectedTrainableWeights.length)}evaluate(e,t,n={}){const a=null==n.batchSize?32:n.batchSize;GC(a);const i=this.standardizeUserDataXY(e,t,!0,a);try{const e=i[0].concat(i[1]);this.makeTestFunction();const t=this.testFunction;return Lw(this.testLoop(t,e,a,n.verbose,n.steps))}finally{ZC(i[0],e),ZC(i[1],t)}}async evaluateDataset(e,t){return this.makeTestFunction(),async function(e,t,n){const a=null!=(n=n||{}).batches,i=e.testFunction;let s=[];if(n.verbose>0)throw new Dw("Verbose mode is not implemented yet.");Ns(!a||n.batches>0&&Number.isInteger(n.batches),(()=>`Test loop expects \`batches\` to be a positive integer, but received ${JSON.stringify(n.batches)}`));const r="function"==typeof t.next?t:await t.iterator();let o=0,l=0;for(;!a||l{if(t.value){const{xs:n,ys:a}=jC(e,t.value),r=n.concat(a),u=dh((()=>i(r)));if(ph(r),0===l)for(let e=0;exd(s[e],Ed(c,t)))),l>0&&ph(n)}ph(u),o+=c,++l}return s})),t.done)break}for(let e=0;ee.name));for(let a=0;a0){const n=[];throw t.forEach(((t,a)=>{null==t&&n.push(e[a])})),new Rw(`Cannot find SymbolicTensors for output name(s): ${JSON.stringify(n)}`)}return t}predictLoop(e,t=32,n=!1){return dh((()=>{const a=this.checkNumSamples(e);if(n)throw new Dw("Verbose predictLoop() is not implemented yet.");const i=KC(a,t),s=this.outputs.map((e=>[]));for(let t=0;t{const n=i[t][0],a=i[t][1],s=qC(e,n,a),r=[];if(Array.isArray(s))for(let e=0;es[t].push(e)))}return Lw(s.map((e=>Am(e,0))))}))}predict(e,t={}){const n=$C(e);JC(n,this.inputNames,this.feedInputShapes,!1);try{const e=null==t.batchSize?32:t.batchSize;return GC(e),this.predictLoop(n,e)}finally{ZC(n,e)}}predictOnBatch(e){JC(e,this.inputNames,this.feedInputShapes,!0);const t=(Array.isArray(e)?e[0]:e).shape[0];return this.predictLoop(e,t)}standardizeUserDataXY(e,t,n=!0,a){if(null==this.optimizer_)throw new Nw("You must compile a model before training/testing. Use LayersModel.compile(modelCompileArgs).");const i=[];for(let e=0;ee.shape[0])));a.sort();const i=Kw(t.map((e=>e.shape[0])));if(i.sort(),a.length>1)throw new Rw(`All input Tensors (x) should have the same number of samples. Got array shapes: ${JSON.stringify(e.map((e=>e.shape)))}`);if(i.length>1)throw new Rw(`All target Tensors (y) should have the same number of samples. Got array shapes: ${JSON.stringify(t.map((e=>e.shape)))}`);if(a.length>0&&i.length>0&&!Os(a,i))throw new Rw(`Input Tensors should have the same number of samples as target Tensors. Found ${a[0]} input sample(s) and ${i[0]} target sample(s).`)}(e=QC(e,this.feedInputNames,this.feedInputShapes,!1,"input"),t=QC(t,this.feedOutputNames,i,!1,"target")),function(e,t,n){const a=[iC,cC,lC];for(let i=0;i0&&e[0].shape[0]%a!=0)throw new Rw(`In a stateful network, you should only pass inputs with a number of samples that is divisible by the batch size ${a}. Found: ${e[0].shape[0]} sample(s).`);return[e,t]}async standardizeUserData(e,t,n,a,i=!0,s){const[r,o]=this.standardizeUserDataXY(e,t,i,s);if(null!=n)throw new Error("sample weight is not supported yet.");let l=null;if(null!=a){const e=FC(a,this.outputNames);l=[];for(let t=0;t{const s=this.checkNumSamples(t,n,i,"steps"),r=[];if(a>0)throw new Dw("Verbose mode is not implemented yet.");if(null!=i)throw new Dw("steps mode in testLoop() is not implemented yet");{const a=KC(s,n),i=Sy(xA(0,s));for(let n=0;n1){i+=`_${Fw(e.slice(0,n),a)}`}t.push(i)}return t}makeTrainFunction(){return e=>{const t=[],n=e.slice(0,this.inputs.length),a=e.slice(this.inputs.length,this.inputs.length+this.outputs.length),i=e.slice(this.inputs.length+this.outputs.length,this.inputs.length+2*this.outputs.length),s=[],r=this.collectedTrainableWeights.map((e=>e.read()));return[this.optimizer_.minimize((()=>{const e=[];for(let t=0;t1&&e{l=xd(l,e)})),l}),!0,r)].concat(s)}}makeTestFunction(){this.testFunction=e=>dh((()=>{const t=[];let n;const a=e.slice(0,this.inputs.length),i=e.slice(this.inputs.length,this.inputs.length+this.outputs.length),s=[];for(let e=0;e0){if(g=!0,2!==n.validationData.length)throw 3===n.validationData.length?new Dw("validationData including sample weights is not supported yet."):new Rw(`When passing validation data, it must contain 2 (valX, valY) or 3 (valX, valY, valSampleWeight) items; ${n.validationData} is invalid.`);o=n.validationData[0],l=n.validationData[1];const e=!0,t=await this.standardizeUserData(o,l,null,null,e,d);u=t[0],c=t[1],f=u.concat(c)}else if(null!=n.validationSplit&&n.validationSplit>0&&n.validationSplit<1){g=!0;const e=Math.floor(a[0].shape[0]*(1-n.validationSplit)),t=a[0].shape[0];u=qC(a,e,t),s=a,a=qC(a,0,e),c=qC(i,e,t),r=i,i=qC(i,0,e),f=u.concat(c)}else null!=n.validationSteps&&(g=!0);const y=a.concat(i).concat(h);this.checkTrainableWeightsConsistency();const b=this.makeTrainFunction(),v=this.getDedupedMetricsNames();let k,w;g?(this.makeTestFunction(),k=this.testFunction,w=v.slice().concat(v.map((e=>"val_"+e)))):(k=null,f=[],w=v.slice());const A=Jx(n.callbacks,n.yieldEvery);return await this.fitLoop(b,y,v,d,n.epochs,n.verbose,A,k,f,n.shuffle,w,n.initialEpoch,null,null)}finally{this.isTraining=!1,ZC(a,e),ZC(i,t),ZC(s,e),ZC(r,t),ZC(u,o),ZC(c,l),null!=h&&ph(h)}}async fitLoop(e,t,n,a,i,s,r,o,l,u,c,h,d,p){null==a&&(a=32),null==i&&(i=1),null==u&&(u=!0),null==h&&(h=0);let m=!1;if(null!=o&&null!=l&&(m=!0),null!=p&&(m=!0,null==d))throw new Rw("Can only use `validationSteps` when doing step-wise training, i.e., `stepsPerEpoch` must be set.");const f=this.checkNumSamples(t,a,d,"steps_per_epoch");let g;null!=f&&(g=xA(0,f)),null==s&&(s=1);const{callbackList:y,history:b}=tC(r,s,i,h,f,d,a,m,c);y.setModel(this),this.history=b,await y.onTrainBegin(),this.stopTraining_=!1;for(let s=h;s{const h=r[u][0],d=r[u][1],p=TA(s,h,d-h);c.batch=u,c.size=d-h;const f=HC(t,p),g=e(f);for(let e=0;ejw(e)))}else{const t=Object.keys(this.loss);e={};const n=this.loss;for(const a of t){if("string"!=typeof n[a])throw new Error("Serialization of non-string loss is not supported.");e[a]=jw(n[a])}}return e}getMetricIdentifiers(){if("string"==typeof this.metrics||"function"==typeof this.metrics)return[jw(CC(this.metrics))];if(Array.isArray(this.metrics))return this.metrics.map((e=>jw(CC(e))));{const e={};for(const t in this.metrics)e[t]=jw(CC(this.metrics[t]));return e}}getTrainingConfig(){return{loss:this.getLossIdentifiers(),metrics:this.getMetricIdentifiers(),optimizer_config:{class_name:this.optimizer.getClassName(),config:this.optimizer.getConfig()}}}loadTrainingConfig(e){if(null!=e.weighted_metrics)throw new Error("Loading weight_metrics is not supported yet.");if(null!=e.loss_weights)throw new Error("Loading loss_weights is not supported yet.");if(null!=e.sample_weight_mode)throw new Error("Loading sample_weight_mode is not supported yet.");const t=nC(DC(e.optimizer_config));let n,a;if("string"==typeof e.loss)n=Vw(e.loss);else if(Array.isArray(e.loss))n=e.loss.map((e=>Vw(e)));else if(null!=e.loss){n={};for(const t in e.loss)n[t]=Vw(e.loss[t])}if(Array.isArray(e.metrics))a=e.metrics.map((e=>Vw(e)));else if(null!=e.metrics){a={};for(const t in e.metrics)a[t]=Vw(e.metrics[t])}this.compile({loss:n,metrics:a,optimizer:t})}async save(e,t){if("string"==typeof e){const t=Lh(e);if(0===t.length)throw new Rw(`Cannot find any save handlers for URL '${e}'`);if(t.length>1)throw new Rw(`Found more than one (${t.length}) save handlers for URL '${e}'`);e=t[0]}if(null==e.save)throw new Rw("LayersModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");const n=await bh(this.getNamedWeights(t)),a={modelTopology:this.toJSON(null,!1),format:"layers-model",generatedBy:`TensorFlow.js tfjs-layers v${OC}`,convertedBy:null};if(null!=t&&t.includeOptimizer&&null!=this.optimizer){a.trainingConfig=this.getTrainingConfig();const e="optimizer",{data:t,specs:i}=await bh(await this.optimizer.getWeights(),e);n.specs.push(...i),n.data=Th([n.data,t])}if(null!=this.userDefinedMetadata){const e=!0;SC(this.userDefinedMetadata,this.name,e),a.userDefinedMetadata=this.userDefinedMetadata}return a.weightData=n.data,a.weightSpecs=n.specs,e.save(a)}setUserDefinedMetadata(e){SC(e,this.name),this.userDefinedMetadata=e}getUserDefinedMetadata(){return this.userDefinedMetadata}}eS.className="Model",Bd(eS);class tS extends eS{}tS.className="Functional",Bd(tS);class nS extends eS{constructor(e){if(super({inputs:[],outputs:[]}),e=e||{},this.trainable=!0,this.built=!1,this.name=null!=e.name?e.name:aA("sequential_"),null!=e.layers)for(const t of e.layers)this.add(t)}checkShape(e){if(e.inboundNodes[0].outputTensors[0].shape.some((e=>e<0)))throw new Rw(`Negative dimension size caused by adding layer ${e.name} with input shape [${e.inboundNodes[0].inputTensors[0].shape}]`)}add(e){const t=e instanceof nS||e instanceof eS;let n;if(t){if(n=e,1!==n.outputs.length)throw new Rw("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");if(1!==n.inputs.length)throw new Rw("All layers in a Sequential model should have a single input tensor. For multi-input layers, use the functional API.")}if(0===this.outputs.length){if(0===e.inboundNodes.length){if(null==e.batchInputShape)throw new Rw("The first layer in a Sequential model must get an `inputShape` or `batchInputShape` argument.");const t=function(e){if(null==e.batchShape&&null==e.shape)throw new Error("Please provide to Input either a `shape` or a `batchShape` argument. Note that `shape` does not include the batch dimension.");if(null!=e.batchShape&&null!=e.shape)throw new Rw("Please provide either a `shape` or `batchShape` argument to Input, but not both.");let t=e.batchShape;null!=e.shape&&null==t&&(t=[null].concat(e.shape));let n=e.dtype;return null==n&&(n="float32"),new Ex({batchInputShape:t,name:e.name,dtype:n,sparse:e.sparse}).inboundNodes[0].outputTensors[0]}({batchShape:e.batchInputShape,dtype:e.dtype,name:e.name+"_input"});e.apply(t)}if(t)this.outputs=n.outputs,this.inputs=n.inputs;else{if(1!==e.inboundNodes.length)throw new Rw(`A layer added to a Sequential model must not already be connected somewhere else. LayersModel received layer ${e.name} which has ${e.inboundNodes.length} pre-existing inbound connections.`);if(1!==e.inboundNodes[0].outputTensors.length)throw new Rw("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");this.checkShape(e),this.outputs=[e.inboundNodes[0].outputTensors[0]],this.inputs=Sx(this.outputs[0])}this.inboundNodes=[],new Ax({outboundLayer:this,inboundLayers:[],nodeIndices:[],tensorIndices:[],inputTensors:this.inputs,outputTensors:this.outputs,inputMasks:Mw(null,this.inputs.length),outputMasks:[null],inputShapes:this.inputs.map((e=>e.shape)),outputShapes:this.outputs[0].shape})}else{const t=e.apply(this.outputs[0]);if(Array.isArray(t))throw new TypeError("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");this.checkShape(e),this.outputs=[t],this.inboundNodes[0].outputTensors=this.outputs,this.inboundNodes[0].outputShapes=[this.outputs[0].shape]}this.layers.push(e),this.built=!1}pop(){if(0===this.layers.length)throw new TypeError("There are no layers in the model.");if(this.layers.pop(),0===this.layers.length)this.outputs=[],this.inboundNodes=[],this.outboundNodes=[];else{const e=this.layers.length-1;this.layers[e].outboundNodes=[],this.outputs=[this.layers[e].output],this.inboundNodes[0].outputTensors=this.outputs,this.inboundNodes[0].outputShapes=[this.outputs[0].shape]}}call(e,t){return null==this.model&&this.build(),this.model.call(e,t)}build(e){if(px(e),0===this.inputs.length||0===this.outputs.length)throw new TypeError("Sequential model cannot be built: model is empty. Add some layers first.");this.model=new eS({inputs:this.inputs,outputs:this.outputs[0],name:this.name+"_model"}),this.model.trainable=this.trainable,this.supportsMasking=this.model.supportsMasking,this.inputLayers=this.model.inputLayers,this.inputLayersNodeIndices=this.model.inputLayersNodeIndices,this.inputLayersTensorIndices=this.model.inputLayersTensorIndices,this.outputLayers=this.model.outputLayers,this.outputLayersNodeIndices=this.model.outputLayersNodeIndices,this.outputLayersTensorIndices=this.model.outputLayersTensorIndices,this.nodesByDepth=this.model.nodesByDepth,this.containerNodes=this.model.containerNodes,this.outputNames=this.model.outputNames,this.inputNames=this.model.inputNames,this.built=!0}countParams(){return this.built||this.build(),super.countParams()}summary(e,t,n=console.log){this.built||this.build(),super.summary(e,t,n)}setWeights(e){null==this.model&&this.build(),this.model.setWeights(e)}evaluate(e,t,n={}){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.evaluate(e,t,n)}async evaluateDataset(e,t){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.evaluateDataset(e,t)}predict(e,t={}){return null==this.model&&this.build(),this.model.predict(e,t)}predictOnBatch(e){return null==this.model&&this.build(),this.model.predictOnBatch(e)}compile(e){this.build(),this.model.compile(e),this.optimizer_=this.model.optimizer,this.isOptimizerOwned=this.model.isOptimizerOwned,this.loss=this.model.loss,this.metrics=this.model.metrics,this.metricsTensors=this.model.metricsTensors,this.metricsNames=this.model.metricsNames}get optimizer(){return null==this.model?void 0:this.model.optimizer}set optimizer(e){this.model.optimizer=e}async fit(e,t,n={}){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.fit(e,t,n)}async fitDataset(e,t){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.fitDataset(e,t)}async trainOnBatch(e,t){return this.model.trainOnBatch(e,t)}static fromConfig(e,t,n={},a=!1){let i,s={};if(t instanceof Array){if(null==t[0].className||"Merge"===t[0].className)throw new Rw("Legacy serialization format not supported yet.");i=t}else Ns(null!=t.layers,(()=>"When the config data for a Sequential model is not an Array, it must be an Object that contains the 'layers' field.")),i=t.layers,delete t.layers,s=t;const r=new e(s);if(!(r instanceof nS))throw new Dw(`Sequential.fromConfig called on non-Sequential input: ${r}`);for(const e of i){const t=nC(e,void 0,a);a&&t.setFastWeightInitDuringBuild(!0),r.add(t)}return r}set stopTraining(e){if(null==this.model)throw new Rw("Cannot set the stopTraining property of a sequential model before it is compiled.");this.model.stopTraining=e}get stopTraining(){if(null==this.model)throw new Rw("Cannot get the stopTraining property of a sequential model before it is compiled.");return this.model.stopTraining}getConfig(){const e=[];for(const t of this.layers){const n={};n.className=t.getClassName(),n.config=t.getConfig(),e.push(n)}return{name:this.name,layers:e}}}nS.className="Sequential",Bd(nS);class aS extends Od{getConfig(){return{}}}class iS extends aS{apply(e,t=1){return function(e,t=1){if(1!==t)throw new Dw(`Support for alpha values other than 1 (${t}) is not implemented yet.`);return hf(e)}(e,t)}}iS.className="elu",Bd(iS);class sS extends aS{apply(e){return ay(e)}}sS.className="selu",Bd(sS);class rS extends aS{apply(e){return $g(e)}}rS.className="relu",Bd(rS);class oS extends aS{apply(e){return dh((()=>pg(6,$g(e))))}}oS.className="relu6",Bd(oS);class lS extends aS{apply(e){return e}}lS.className="linear",Bd(lS);class uS extends aS{apply(e){return Cm(e)}}uS.className="sigmoid",Bd(uS);class cS extends aS{apply(e){return function(e){return dh((()=>{const t=xd(.5,Ed(.2,e));return Lm(t,0,1)}))}(e)}}cS.className="hardSigmoid",Bd(cS);class hS extends aS{apply(e){return Zf(e)}}hS.className="softplus",Bd(hS);class dS extends aS{apply(e){return function(e){return dh((()=>Sd(e,xd(Gd(e),1))))}(e)}}dS.className="softsign",Bd(dS);class pS extends aS{apply(e){return Em(e)}}pS.className="tanh",Bd(pS);class mS extends aS{apply(e,t=-1){return py(e,t)}}mS.className="softmax",Bd(mS);class fS extends aS{apply(e,t=-1){return Yf(e,t)}}fS.className="logSoftmax",Bd(fS);class gS extends aS{apply(e){return dh((()=>dh((()=>{const t=Math.sqrt(2),n=Ed(.5,xd(1,pf(Sd(e,t))));return Ed(e,n)}))))}}gS.className="gelu",Bd(gS);class yS extends aS{apply(e){return dh((()=>Ed(.5,Ed(e,xd(1,Em(Ed(_d(Sd(2,Math.PI)),xd(e,Ed(.044715,Vd(e,3))))))))))}}yS.className="gelu_new",Bd(yS);class bS extends aS{apply(e){return dh((()=>Ed(e,Em(Zf(e)))))}}bS.className="mish",Bd(bS);class vS extends aS{apply(e,t=1){return dh((()=>Ed(Cm(Ed(e,t)),e)))}}function kS(e){return e.getClassName()}function wS(e,t={}){return qw(e,Md.getMap().classNameMap,t,"activation")}function AS(e){if(null==e){const e={className:"linear",config:{}};return wS(e)}if("string"==typeof e){const t={};return t.className=e,t.config={},wS(t)}return e instanceof aS?e:wS(e)}function xS(e){if(null!=e&&"object"!=typeof e)throw new Error(`Argument to L1L2 regularizer's constructor is expected to be an object, but received: ${e}`)}vS.className="swish",Bd(vS);class CS extends Od{}class SS extends CS{constructor(e){super(),xS(e),this.l1=null==e||null==e.l1?.01:e.l1,this.l2=null==e||null==e.l2?.01:e.l2,this.hasL1=0!==this.l1,this.hasL2=0!==this.l2}apply(e){return dh((()=>{let t=cg([1]);return this.hasL1&&(t=xd(t,Cf(Ed(this.l1,Gd(e))))),this.hasL2&&(t=xd(t,Cf(Ed(this.l2,FA(e))))),vm(t,[])}))}getConfig(){return{l1:this.l1,l2:this.l2}}static fromConfig(e,t){return new e({l1:t.l1,l2:t.l2})}}SS.className="L1L2",Bd(SS);const ES={l1l2:"L1L2"};function _S(e){return Ww(e)}function TS(e,t={}){return qw(e,Md.getMap().classNameMap,t,"regularizer")}function IS(e){if(null==e)return null;if("string"==typeof e){return TS({className:e in ES?ES[e]:e,config:{}})}return e instanceof CS?e:TS(e)}class NS extends Cx{constructor(e){super(null==e?{}:e),this.supportsMasking=!0,null!=e&&(this.maxValue=e.maxValue)}call(e,t){e=dx(e);let n=$g(e);return null!=this.maxValue&&(n=Lm(n,0,this.maxValue)),n}computeOutputShape(e){return e}getConfig(){const e={maxValue:this.maxValue},t=super.getConfig();return Object.assign(e,t),e}}NS.className="ReLU",Bd(NS);class RS extends Cx{constructor(e){super(null==e?{}:e),this.DEFAULT_ALPHA=.3,null==e&&(e={}),this.alpha=null==e.alpha?this.DEFAULT_ALPHA:e.alpha}call(e,t){const n=dx(e);return Vf(n,this.alpha)}computeOutputShape(e){return e}getConfig(){const e={alpha:this.alpha},t=super.getConfig();return Object.assign(e,t),e}}RS.className="LeakyReLU",Bd(RS);class DS extends Cx{constructor(e){if(super(null==e?{}:e),this.DEFAULT_ALPHA_INITIALIZER="zeros",null==e&&(e={}),this.supportsMasking=!0,this.alphaInitializer=ux(e.alphaInitializer||this.DEFAULT_ALPHA_INITIALIZER),this.alphaRegularizer=IS(e.alphaRegularizer),this.alphaConstraint=Wx(e.alphaConstraint),null==e.sharedAxes)this.sharedAxes=null;else if(Array.isArray(e.sharedAxes))this.sharedAxes=e.sharedAxes;else{if("number"!=typeof e.sharedAxes)throw new Rw(`Expected sharedAxes to be a number or an array of numbers, but got ${e.sharedAxes}`);this.sharedAxes=[e.sharedAxes]}}build(e){const t=(e=px(e)).slice(1);if(null!=this.sharedAxes)for(const e of this.sharedAxes)t[e-1]=1;this.alpha=this.addWeight("alpha",t,"float32",this.alphaInitializer,this.alphaRegularizer,!0,this.alphaConstraint);const n={};if(null!=this.sharedAxes)for(let t=1;t{let n=dx(e);const a=t.mask;if(null!=a){const e=Ed(Ud(hg(n.shape),kd(a,n.dtype)),Rd(-1e9));n=xd(n,e)}return this.axis instanceof Array?this.axis.length>1?Tf(Ud(n,Qf(n,this.axis,!0))):this.softmax(n,this.axis[0]):this.softmax(n,this.axis)}))}computeOutputShape(e){return e}getConfig(){const e={axis:this.axis},t=super.getConfig();return Object.assign(e,t),e}}function BS(e,t,n){if("number"==typeof e)return Mw(e,t);if(e.length!==t)throw new Rw(`The ${n} argument must be an integer or tuple of ${t} integers. Received: ${e.length} elements.`);for(let i=0;i(cA(t),"channelsFirst"===t?Gy(e,[0,2,3,1]):e)))}function jS(e,t){return dh((()=>(cA(t),"channelsFirst"===t?Gy(e,[0,2,3,4,1]):e)))}function VS(e,t,n,a=1,i="valid",s,r=1){return dh((()=>{if(null==s&&(s="channelsLast"),cA(s),3!==e.shape.length)throw new Rw(`The input of a conv1dWithBias operation should be 3, but is ${e.shape.length} instead.`);if(3!==t.shape.length)throw new Rw(`The kernel for a conv1dWithBias operation should be 3, but is ${t.shape.length} instead`);if(null!=n&&1!==n.shape.length)throw new Rw(`The bias for a conv1dWithBias operation should be 1, but is ${n.shape.length} instead`);if("channelsFirst"===s&&(e=Gy(e,[0,2,1])),"causal"===i)throw new Dw("The support for CAUSAL padding mode in conv1dWithBias is not implemented yet.");let o=Gm(e,t,a,"same"===i?"same":"valid","NWC",r);return null!=n&&(o=PA(o,n)),o}))}function US(e,t,n,a=[1,1],i="valid",s,r,o=null){return dh((()=>{if(null==s&&(s="channelsLast"),cA(s),3!==e.rank&&4!==e.rank)throw new Rw(`conv2dWithBiasActivation expects input to be of rank 3 or 4, but received ${e.rank}.`);if(3!==t.rank&&4!==t.rank)throw new Rw(`conv2dWithBiasActivation expects kernel to be of rank 3 or 4, but received ${e.rank}.`);let l=PS(e,s);if("causal"===i)throw new Dw("The support for CAUSAL padding mode in conv1dWithBias is not implemented yet.");return l=ib({x:l,filter:t,strides:a,pad:"same"===i?"same":"valid",dilations:r,dataFormat:"NHWC",bias:n,activation:o}),"channelsFirst"===s&&(l=Gy(l,[0,3,1,2])),l}))}function WS(e,t,n,a=[1,1,1],i="valid",s,r){return dh((()=>{if(null==s&&(s="channelsLast"),cA(s),4!==e.rank&&5!==e.rank)throw new Rw(`conv3dWithBias expects input to be of rank 4 or 5, but received ${e.rank}.`);if(4!==t.rank&&5!==t.rank)throw new Rw(`conv3dWithBias expects kernel to be of rank 4 or 5, but received ${e.rank}.`);let o=jS(e,s);if("causal"===i)throw new Dw("The support for CAUSAL padding mode in conv3dWithBias is not implemented yet.");return o=Km(o,t,a,"same"===i?"same":"valid","NDHWC",r),null!=n&&(o=PA(o,n)),"channelsFirst"===s&&(o=Gy(o,[0,4,1,2,3])),o}))}MS.className="Softmax",Bd(MS);class GS extends Cx{constructor(e,t){if(super(t),this.bias=null,this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_BIAS_INITIALIZER="zeros",GS.verifyArgs(t),this.rank=e,Yw(this.rank,"rank"),1!==this.rank&&2!==this.rank&&3!==this.rank)throw new Dw(`Convolution layer for rank other than 1, 2, or 3 (${this.rank}) is not implemented yet.`);if(this.kernelSize=BS(t.kernelSize,e,"kernelSize"),this.strides=BS(null==t.strides?1:t.strides,e,"strides"),this.padding=null==t.padding?"valid":t.padding,hA(this.padding),this.dataFormat=null==t.dataFormat?"channelsLast":t.dataFormat,cA(this.dataFormat),this.activation=AS(t.activation),this.useBias=null==t.useBias||t.useBias,this.biasInitializer=ux(t.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.biasConstraint=Wx(t.biasConstraint),this.biasRegularizer=IS(t.biasRegularizer),this.activityRegularizer=IS(t.activityRegularizer),this.dilationRate=BS(null==t.dilationRate?1:t.dilationRate,e,"dilationRate"),1===this.rank&&Array.isArray(this.dilationRate)&&1!==this.dilationRate.length)throw new Rw(`dilationRate must be a number or an array of a single number for 1D convolution, but received ${JSON.stringify(this.dilationRate)}`);if(2===this.rank){if("number"==typeof this.dilationRate)this.dilationRate=[this.dilationRate,this.dilationRate];else if(2!==this.dilationRate.length)throw new Rw(`dilationRate must be a number or array of two numbers for 2D convolution, but received ${JSON.stringify(this.dilationRate)}`)}else if(3===this.rank)if("number"==typeof this.dilationRate)this.dilationRate=[this.dilationRate,this.dilationRate,this.dilationRate];else if(3!==this.dilationRate.length)throw new Rw(`dilationRate must be a number or array of three numbers for 3D convolution, but received ${JSON.stringify(this.dilationRate)}`)}static verifyArgs(e){if(Bw("kernelSize"in e,"required key 'kernelSize' not in config"),"number"!=typeof e.kernelSize&&!Xw(e.kernelSize,"number",1,3))throw new Rw(`BaseConv expects config.kernelSize to be number or number[] with length 1, 2, or 3, but received ${JSON.stringify(e.kernelSize)}.`)}getConfig(){const e={kernelSize:this.kernelSize,strides:this.strides,padding:this.padding,dataFormat:this.dataFormat,dilationRate:this.dilationRate,activation:kS(this.activation),useBias:this.useBias,biasInitializer:lx(this.biasInitializer),biasRegularizer:_S(this.biasRegularizer),activityRegularizer:_S(this.activityRegularizer),biasConstraint:Vx(this.biasConstraint)},t=super.getConfig();return Object.assign(e,t),e}}class qS extends GS{constructor(e,t){super(e,t),this.kernel=null,qS.verifyArgs(t),this.filters=t.filters,Yw(this.filters,"filters"),this.kernelInitializer=ux(t.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.kernelConstraint=Wx(t.kernelConstraint),this.kernelRegularizer=IS(t.kernelRegularizer)}build(e){e=px(e);const t="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[t])throw new Rw(`The channel dimension of the input should be defined. Found ${e[t]}`);const n=e[t],a=this.kernelSize.concat([n,this.filters]);this.kernel=this.addWeight("kernel",a,null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[{ndim:this.rank+2,axes:{[t]:n}}],this.built=!0}call(e,t){return dh((()=>{let t;e=dx(e);const n=null==this.bias?null:this.bias.read(),a=Jw(this.activation.getClassName());if(null!=a&&2===this.rank)t=US(e,this.kernel.read(),n,this.strides,this.padding,this.dataFormat,this.dilationRate,a);else{if(1===this.rank)t=VS(e,this.kernel.read(),n,this.strides[0],this.padding,this.dataFormat,this.dilationRate[0]);else if(2===this.rank)t=US(e,this.kernel.read(),n,this.strides,this.padding,this.dataFormat,this.dilationRate);else{if(3!==this.rank)throw new Dw("convolutions greater than 3D are not implemented yet.");t=WS(e,this.kernel.read(),n,this.strides,this.padding,this.dataFormat,this.dilationRate)}null!=this.activation&&(t=this.activation.apply(t))}return t}))}computeOutputShape(e){e=px(e);const t=[],n="channelsLast"===this.dataFormat?e.slice(1,e.length-1):e.slice(2);for(let e=0;e 0 but got ${JSON.stringify(e.filters)}`)}}class HS extends qS{constructor(e){super(2,e),HS.verifyArgs(e)}getConfig(){const e=super.getConfig();return delete e.rank,e}static verifyArgs(e){if("number"!=typeof e.kernelSize&&!Xw(e.kernelSize,"number",1,2))throw new Rw(`Conv2D expects config.kernelSize to be number or number[] with length 1 or 2, but received ${JSON.stringify(e.kernelSize)}.`)}}HS.className="Conv2D",Bd(HS);class KS extends qS{constructor(e){super(3,e),KS.verifyArgs(e)}getConfig(){const e=super.getConfig();return delete e.rank,e}static verifyArgs(e){if("number"!=typeof e.kernelSize&&(!Array.isArray(e.kernelSize)||1!==e.kernelSize.length&&3!==e.kernelSize.length))throw new Rw(`Conv3D expects config.kernelSize to be number or [number, number, number], but received ${JSON.stringify(e.kernelSize)}.`)}}KS.className="Conv3D",Bd(KS);class $S extends HS{constructor(e){if(super(e),this.inputSpec=[new vx({ndim:4})],"same"!==this.padding&&"valid"!==this.padding)throw new Rw(`Conv2DTranspose currently supports only padding modes 'same' and 'valid', but received padding mode ${this.padding}`)}build(e){if(4!==(e=px(e)).length)throw new Rw("Input should have rank 4; Received input shape: "+JSON.stringify(e));const t="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[t])throw new Rw("The channel dimension of the inputs should be defined. Found `None`.");const n=e[t],a=this.kernelSize.concat([this.filters,n]);this.kernel=this.addWeight("kernel",a,"float32",this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],"float32",this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[new vx({ndim:4,axes:{[t]:n}})],this.built=!0}call(e,t){return dh((()=>{let t=dx(e);if(4!==t.shape.length)throw new Rw(`Conv2DTranspose.call() expects input tensor to be rank-4, but received a tensor of rank-${t.shape.length}`);const n=t.shape,a=n[0];let i,s;"channelsFirst"===this.dataFormat?(i=2,s=3):(i=1,s=2);const r=n[i],o=n[s],l=this.kernelSize[0],u=this.kernelSize[1],c=this.strides[0],h=this.strides[1],d=[a,LS(r,c,l,this.padding),LS(o,h,u,this.padding),this.filters];"channelsLast"!==this.dataFormat&&(t=Gy(t,[0,2,3,1]));let p=Hm(t,this.kernel.read(),d,this.strides,this.padding);return"channelsLast"!==this.dataFormat&&(p=Gy(p,[0,3,1,2])),null!=this.bias&&(p=PA(p,this.bias.read(),this.dataFormat)),null!=this.activation&&(p=this.activation.apply(p)),p}))}computeOutputShape(e){const t=(e=px(e)).slice();let n,a,i;"channelsFirst"===this.dataFormat?(n=1,a=2,i=3):(n=3,a=1,i=2);const s=this.kernelSize[0],r=this.kernelSize[1],o=this.strides[0],l=this.strides[1];return t[n]=this.filters,t[a]=LS(t[a],o,s,this.padding),t[i]=LS(t[i],l,r,this.padding),t}getConfig(){const e=super.getConfig();return delete e.dilationRate,e}}$S.className="Conv2DTranspose",Bd($S);class ZS extends KS{constructor(e){if(super(e),this.inputSpec=[new vx({ndim:5})],"same"!==this.padding&&"valid"!==this.padding)throw new Rw(`Conv3DTranspose currently supports only padding modes 'same' and 'valid', but received padding mode ${this.padding}`)}build(e){if(5!==(e=px(e)).length)throw new Rw("Input should have rank 5; Received input shape: "+JSON.stringify(e));const t="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[t])throw new Rw("The channel dimension of the inputs should be defined. Found `None`.");const n=e[t],a=this.kernelSize.concat([this.filters,n]);this.kernel=this.addWeight("kernel",a,"float32",this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],"float32",this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[new vx({ndim:5,axes:{[t]:n}})],this.built=!0}call(e,t){return dh((()=>{let t=dx(e);if(5!==t.shape.length)throw new Rw(`Conv3DTranspose.call() expects input tensor to be rank-4, but received a tensor of rank-${t.shape.length}`);const n=t.shape,a=n[0];let i,s,r;"channelsFirst"===this.dataFormat?(r=2,i=3,s=4):(r=1,i=2,s=3);const o=n[r],l=n[i],u=n[s],c=this.kernelSize[0],h=this.kernelSize[1],d=this.kernelSize[2],p=this.strides[0],m=this.strides[1],f=this.strides[2],g=[a,LS(o,p,c,this.padding),LS(l,m,h,this.padding),LS(u,f,d,this.padding),this.filters];"channelsLast"!==this.dataFormat&&(t=Gy(t,[0,2,3,4,1]));let y=Zm(t,this.kernel.read(),g,this.strides,this.padding);return"channelsLast"!==this.dataFormat&&(y=Gy(y,[0,4,1,2,3])),null!==this.bias&&(y=PA(y,this.bias.read(),this.dataFormat)),null!==this.activation&&(y=this.activation.apply(y)),y}))}computeOutputShape(e){const t=(e=px(e)).slice();let n,a,i,s;"channelsFirst"===this.dataFormat?(n=1,a=2,i=3,s=4):(n=4,a=1,i=2,s=3);const r=this.kernelSize[0],o=this.kernelSize[1],l=this.kernelSize[2],u=this.strides[0],c=this.strides[1],h=this.strides[2];return t[n]=this.filters,t[a]=LS(t[a],u,r,this.padding),t[i]=LS(t[i],c,o,this.padding),t[s]=LS(t[s],h,l,this.padding),t}getConfig(){const e=super.getConfig();return delete e.dilationRate,e}}ZS.className="Conv3DTranspose",Bd(ZS);class XS extends qS{constructor(e,t){if(super(e,t),this.DEFAULT_DEPTHWISE_INITIALIZER="glorotUniform",this.DEFAULT_POINTWISE_INITIALIZER="glorotUniform",this.depthwiseKernel=null,this.pointwiseKernel=null,null==t.filters)throw new Rw("The `filters` configuration field is required by SeparableConv, but is unspecified.");if(null!=t.kernelInitializer||null!=t.kernelRegularizer||null!=t.kernelConstraint)throw new Rw("Fields kernelInitializer, kernelRegularizer and kernelConstraint are invalid for SeparableConv2D. Use depthwiseInitializer, depthwiseRegularizer, depthwiseConstraint, pointwiseInitializer, pointwiseRegularizer and pointwiseConstraint instead.");if(null!=t.padding&&"same"!==t.padding&&"valid"!==t.padding)throw new Rw(`SeparableConv${this.rank}D supports only padding modes: 'same' and 'valid', but received ${JSON.stringify(t.padding)}`);this.depthMultiplier=null==t.depthMultiplier?1:t.depthMultiplier,this.depthwiseInitializer=ux(t.depthwiseInitializer||this.DEFAULT_DEPTHWISE_INITIALIZER),this.depthwiseRegularizer=IS(t.depthwiseRegularizer),this.depthwiseConstraint=Wx(t.depthwiseConstraint),this.pointwiseInitializer=ux(t.depthwiseInitializer||this.DEFAULT_POINTWISE_INITIALIZER),this.pointwiseRegularizer=IS(t.pointwiseRegularizer),this.pointwiseConstraint=Wx(t.pointwiseConstraint)}build(e){if((e=px(e)).length{let t;if(e=dx(e),1===this.rank)throw new Dw("1D separable convolution is not implemented yet.");return 2===this.rank&&("channelsFirst"===this.dataFormat&&(e=Gy(e,[0,2,3,1])),t=iy(e,this.depthwiseKernel.read(),this.pointwiseKernel.read(),this.strides,this.padding,this.dilationRate,"NHWC")),this.useBias&&(t=PA(t,this.bias.read(),this.dataFormat)),null!=this.activation&&(t=this.activation.apply(t)),"channelsFirst"===this.dataFormat&&(t=Gy(t,[0,3,1,2])),t}))}getConfig(){const e=super.getConfig();return delete e.rank,delete e.kernelInitializer,delete e.kernelRegularizer,delete e.kernelConstraint,e.depthwiseInitializer=lx(this.depthwiseInitializer),e.pointwiseInitializer=lx(this.pointwiseInitializer),e.depthwiseRegularizer=_S(this.depthwiseRegularizer),e.pointwiseRegularizer=_S(this.pointwiseRegularizer),e.depthwiseConstraint=Vx(this.depthwiseConstraint),e.pointwiseConstraint=Vx(this.pointwiseConstraint),e}}XS.className="SeparableConv";class YS extends XS{constructor(e){super(2,e)}}YS.className="SeparableConv2D",Bd(YS);class QS extends qS{constructor(e){super(1,e),QS.verifyArgs(e),this.inputSpec=[{ndim:3}]}getConfig(){const e=super.getConfig();return delete e.rank,delete e.dataFormat,e}static verifyArgs(e){if("number"!=typeof e.kernelSize&&!Xw(e.kernelSize,"number",1,1))throw new Rw(`Conv1D expects config.kernelSize to be number or number[] with length 1, but received ${JSON.stringify(e.kernelSize)}.`)}}QS.className="Conv1D",Bd(QS);class JS extends Cx{constructor(e){super(e),"number"==typeof e.cropping?this.cropping=[[e.cropping,e.cropping],[e.cropping,e.cropping]]:"number"==typeof e.cropping[0]?this.cropping=[[e.cropping[0],e.cropping[0]],[e.cropping[1],e.cropping[1]]]:this.cropping=e.cropping,this.dataFormat=void 0===e.dataFormat?"channelsLast":e.dataFormat,this.inputSpec=[{ndim:4}]}computeOutputShape(e){return"channelsFirst"===this.dataFormat?[e[0],e[1],e[2]-this.cropping[0][0]-this.cropping[0][1],e[3]-this.cropping[1][0]-this.cropping[1][1]]:[e[0],e[1]-this.cropping[0][0]-this.cropping[0][1],e[2]-this.cropping[1][0]-this.cropping[1][1],e[3]]}call(e,t){return dh((()=>{if(e=dx(e),"channelsLast"===this.dataFormat){const t=NA(e,this.cropping[0][0],e.shape[1]-this.cropping[0][0]-this.cropping[0][1],2);return NA(t,this.cropping[1][0],e.shape[2]-this.cropping[1][1]-this.cropping[1][0],3)}{const t=NA(e,this.cropping[0][0],e.shape[2]-this.cropping[0][0]-this.cropping[0][1],3);return NA(t,this.cropping[1][0],e.shape[3]-this.cropping[1][1]-this.cropping[1][0],4)}}))}getConfig(){const e={cropping:this.cropping,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}JS.className="Cropping2D",Bd(JS);class eE extends Cx{constructor(e){var t;super(e),this.DEFAULT_SIZE=[2,2],this.inputSpec=[{ndim:4}],this.size=null==e.size?this.DEFAULT_SIZE:e.size,this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),this.interpolation=null==e.interpolation?"nearest":e.interpolation,t=this.interpolation,Zw(sA,"InterpolationFormat",t)}computeOutputShape(e){if("channelsFirst"===this.dataFormat){const t=null==e[2]?null:this.size[0]*e[2],n=null==e[3]?null:this.size[1]*e[3];return[e[0],e[1],t,n]}{const t=null==e[1]?null:this.size[0]*e[1],n=null==e[2]?null:this.size[1]*e[2];return[e[0],t,n,e[3]]}}call(e,t){return dh((()=>{let t=dx(e);const n=t.shape;if("channelsFirst"===this.dataFormat){t=Gy(t,[0,2,3,1]);const e=this.size[0]*n[2],a=this.size[1]*n[3],i="nearest"===this.interpolation?tv.resizeNearestNeighbor(t,[e,a]):tv.resizeBilinear(t,[e,a]);return Gy(i,[0,3,1,2])}{const e=this.size[0]*n[1],a=this.size[1]*n[2];return"nearest"===this.interpolation?tv.resizeNearestNeighbor(t,[e,a]):tv.resizeBilinear(t,[e,a])}}))}getConfig(){const e={size:this.size,dataFormat:this.dataFormat,interpolation:this.interpolation},t=super.getConfig();return Object.assign(e,t),e}}eE.className="UpSampling2D",Bd(eE);class tE extends GS{constructor(e){super(2,e),this.depthwiseKernel=null,this.depthMultiplier=null==e.depthMultiplier?1:e.depthMultiplier,this.depthwiseInitializer=ux(e.depthwiseInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.depthwiseConstraint=Wx(e.depthwiseConstraint),this.depthwiseRegularizer=IS(e.depthwiseRegularizer)}build(e){if((e=px(e)).length<4)throw new Rw(`Inputs to DepthwiseConv2D should have rank 4. Received input shape: ${JSON.stringify(e)}.`);const t="channelsFirst"===this.dataFormat?1:3;if(null==e[t]||e[t]<0)throw new Rw(`The channel dimension of the inputs to DepthwiseConv2D should be defined, but is not (${e[t]}).`);const n=e[t],a=[this.kernelSize[0],this.kernelSize[1],n,this.depthMultiplier];this.depthwiseKernel=this.addWeight("depthwise_kernel",a,null,this.depthwiseInitializer,this.depthwiseRegularizer,!0,this.depthwiseConstraint),this.useBias?this.bias=this.addWeight("bias",[n*this.depthMultiplier],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return dh((()=>{let t=function(e,t,n=[1,1],a="valid",i,s){return dh((()=>{null==i&&(i="channelsLast"),cA(i);let r=PS(e,i);if(4!==e.rank)throw new Rw(`Input for depthwiseConv2d is required to be 4-D, but is instead ${e.rank}-D`);if(4!==t.rank)throw new Rw(`depthwiseKernel is required to be 4-D, but is instead ${t.rank}-D`);return r=nf(r,t,n,"same"===a?"same":"valid","NHWC",s),"channelsFirst"===i&&(r=Gy(r,[0,3,1,2])),r}))}(e=dx(e),this.depthwiseKernel.read(),this.strides,this.padding,this.dataFormat,null);return this.useBias&&(t=PA(t,this.bias.read(),this.dataFormat)),null!=this.activation&&(t=this.activation.apply(t)),t}))}computeOutputShape(e){e=px(e);const t="channelsFirst"===this.dataFormat?e[2]:e[1],n="channelsFirst"===this.dataFormat?e[3]:e[2],a="channelsFirst"===this.dataFormat?e[1]*this.depthMultiplier:e[3]*this.depthMultiplier,i=FS(t,this.kernelSize[0],this.padding,this.strides[0]),s=FS(n,this.kernelSize[1],this.padding,this.strides[1]);return"channelsFirst"===this.dataFormat?[e[0],a,i,s]:[e[0],i,s,a]}getConfig(){const e=super.getConfig();return e.depthMultiplier=this.depthMultiplier,e.depthwiseInitializer=lx(this.depthwiseInitializer),e.depthwiseRegularizer=_S(this.depthwiseRegularizer),e.depthwiseConstraint=Vx(this.depthwiseRegularizer),e}}function nE(e,t,n,a){if(Array.isArray(e)){if(null!=t||null!=n)throw new Rw("When inputs is an array, neither initialState or constants should be provided");null!=a&&(n=e.slice(e.length-a,e.length),e=e.slice(0,e.length-a)),e.length>1&&(t=e.slice(1,e.length)),e=e[0]}function i(e){return null==e||Array.isArray(e)?e:[e]}return{inputs:e,initialState:t=i(t),constants:n=i(n)}}function aE(e,t,n,a=!1,i,s,r=!1,o=!1){return dh((()=>{const r=t.shape.length;if(r<3)throw new Rw(`Input should be at least 3D, but is ${r}D.`);const l=[1,0].concat(xA(2,r));if(t=Gy(t,l),null!=s)throw new Dw("The rnn() functoin of the deeplearn.js backend does not support constants yet.");null!=i&&((i=kd(kd(i,"bool"),"float32")).rank===r-1&&(i=If(i,-1)),i=Gy(i,l)),a&&(t=Xg(t,0),null!=i&&(i=Xg(i,0)));const u=[];let c,h=n;const d=t.shape[0],p=Ly(t);let m,f;null!=i&&(m=Ly(i));for(let t=0;te(n,h)));if(null==i)c=a[0],h=a[1];else{const e=dh((()=>{const e=m[t],n=Ud(wg(e),e);return{output:xd(Ed(a[0],e),Ed(h[0],n)),newStates:h.map(((t,i)=>xd(Ed(a[1][i],e),Ed(t,n))))}}));c=e.output,h=e.newStates}o&&u.push(c)}if(o){f=wy(u,1)}return[c,f,h]}))}tE.className="DepthwiseConv2D",Bd(tE);class iE extends Cx{constructor(e){let t;if(super(e),null==e.cell)throw new Rw("cell property is missing for the constructor of RNN.");if(t=Array.isArray(e.cell)?new dE({cells:e.cell}):e.cell,null==t.stateSize)throw new Rw("The RNN cell should have an attribute `stateSize` (tuple of integers, one integer per RNN state).");this.cell=t,this.returnSequences=null!=e.returnSequences&&e.returnSequences,this.returnState=null!=e.returnState&&e.returnState,this.goBackwards=null!=e.goBackwards&&e.goBackwards,this._stateful=null!=e.stateful&&e.stateful,this.unroll=null!=e.unroll&&e.unroll,this.supportsMasking=!0,this.inputSpec=[new vx({ndim:3})],this.stateSpec=null,this.states_=null,this.numConstants=null,this.keptStates=[]}getStates(){if(null==this.states_){return xA(0,Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1).map((e=>null))}return this.states_}setStates(e){this.states_=e}computeOutputShape(e){cx(e)&&(e=e[0]);let t=this.cell.stateSize;Array.isArray(t)||(t=[t]);const n=t[0];let a;if(a=this.returnSequences?[e[0],e[1],n]:[e[0],n],this.returnState){const n=[];for(const a of t)n.push([e[0],a]);return[a].concat(n)}return a}computeMask(e,t){return dh((()=>{Array.isArray(t)&&(t=t[0]);const e=this.returnSequences?t:null;if(this.returnState){const t=this.states.map((e=>null));return[e].concat(t)}return e}))}get states(){if(null==this.states_){const e=Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1,t=[];for(let n=0;ne.shape[e.shape.length-1])),i))throw new Rw(`An initialState was passed that is not compatible with cell.stateSize. Received stateSpec=${this.stateSpec}; However cell.stateSize is ${this.cell.stateSize}`)}else this.stateSpec=i.map((e=>new vx({shape:[null,e]})));this.stateful&&this.resetStates()}resetStates(e,t=!1){dh((()=>{if(!this.stateful)throw new Iw("Cannot call resetStates() on an RNN Layer that is not stateful.");const n=this.inputSpec[0].shape[0];if(null==n)throw new Rw("If an RNN is stateful, it needs to know its batch size. Specify the batch size of your input tensors: \n- If using a Sequential model, specify the batch size by passing a `batchInputShape` option to your first layer.\n- If using the functional API, specify the batch size by passing a `batchShape` option to your Input layer.");if(null==this.states_)Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((e=>cg([n,e]))):this.states_=[cg([n,this.cell.stateSize])];else if(null==e)ph(this.states_),null!=this.keptStates&&(ph(this.keptStates),this.keptStates=[]),Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((e=>cg([n,e]))):this.states_[0]=cg([n,this.cell.stateSize]);else{if(Array.isArray(e)||(e=[e]),e.length!==this.states_.length)throw new Rw(`Layer ${this.name} expects ${this.states_.length} state(s), but it received ${e.length} state value(s). Input received: ${e}`);!0===t?this.keptStates.push(this.states_.slice()):ph(this.states_);for(let t=0;tmh(e.clone())))}))}apply(e,t){let n=null==t?null:t.initialState,a=null==t?null:t.constants;null==t&&(t={});const i=nE(e,n,a,this.numConstants);e=i.inputs,n=i.initialState,a=i.constants;let s=[],r=[];if(null!=n){t.initialState=n,s=s.concat(n),this.stateSpec=[];for(const e of n)this.stateSpec.push(new vx({shape:e.shape}));r=r.concat(this.stateSpec)}null!=a&&(t.constants=a,s=s.concat(a),this.numConstants=a.length);if(s[0]instanceof kx){const n=[e].concat(s),a=this.inputSpec.concat(r),i=this.inputSpec;this.inputSpec=a;const o=super.apply(n,t);return this.inputSpec=i,o}return super.apply(e,t)}call(e,t){return dh((()=>{const n=null==t?null:t.mask,a=null==t?null:t.training;let i=null==t?null:t.initialState;e=dx(e),null==i&&(i=this.stateful?this.states_:this.getInitialState(e));const s=Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1;if(i.length!==s)throw new Rw(`RNN Layer has ${s} state(s) but was passed ${i.length} initial state(s).`);this.unroll;const r={training:a},o=aE(((e,t)=>{const n=this.cell.call([e].concat(t),r);return[n[0],n.slice(1)]}),e,i,this.goBackwards,n,null,this.unroll,this.returnSequences),l=o[0],u=o[1],c=o[2];this.stateful&&this.resetStates(c,a);const h=this.returnSequences?u:l;return this.returnState?[h].concat(c):h}))}getInitialState(e){return dh((()=>{let t=cg(e.shape);return t=Cf(t,[1,2]),t=_A(t),Array.isArray(this.cell.stateSize)?this.cell.stateSize.map((e=>e>1?zA(t,[1,e]):t)):this.cell.stateSize>1?[zA(t,[1,this.cell.stateSize])]:[t]}))}get trainableWeights(){return this.trainable?this.cell.trainableWeights:[]}get nonTrainableWeights(){return this.trainable?this.cell.nonTrainableWeights:this.cell.weights}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),null!=this.cell&&this.cell.setFastWeightInitDuringBuild(e)}getConfig(){const e=super.getConfig(),t={returnSequences:this.returnSequences,returnState:this.returnState,goBackwards:this.goBackwards,stateful:this.stateful,unroll:this.unroll};null!=this.numConstants&&(t.numConstants=this.numConstants);const n=this.cell.getConfig();return this.getClassName()===iE.className&&(t.cell={className:this.cell.getClassName(),config:n}),Object.assign(Object.assign(Object.assign({},n),e),t)}static fromConfig(e,t,n={}){const a=nC(t.cell,n);return new e(Object.assign(t,{cell:a}))}}iE.className="RNN",Bd(iE);class sE extends Cx{}class rE extends sE{constructor(e){super(e),this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",this.units=e.units,Yw(this.units,"units"),this.activation=AS(null==e.activation?this.DEFAULT_ACTIVATION:e.activation),this.useBias=null==e.useBias||e.useBias,this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=ux(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelRegularizer=IS(e.kernelRegularizer),this.recurrentRegularizer=IS(e.recurrentRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.kernelConstraint=Wx(e.kernelConstraint),this.recurrentConstraint=Wx(e.recurrentConstraint),this.biasConstraint=Wx(e.biasConstraint),this.dropout=wA([1,AA([0,null==e.dropout?0:e.dropout])]),this.recurrentDropout=wA([1,AA([0,null==e.recurrentDropout?0:e.recurrentDropout])]),this.dropoutFunc=e.dropoutFunc,this.stateSize=this.units,this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){e=px(e),this.kernel=this.addWeight("kernel",[e[e.length-1],this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias?this.bias=this.addWeight("bias",[this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return dh((()=>{if(2!==e.length)throw new Rw(`SimpleRNNCell expects 2 input Tensors, got ${e.length}.`);let n=e[1];e=e[0];const a=null!=t.training&&t.training;let i;0wg(e),rate:this.dropout,training:a,dropoutFunc:this.dropoutFunc})),0wg(n),rate:this.recurrentDropout,training:a,dropoutFunc:this.dropoutFunc}));const s=this.dropoutMask,r=this.recurrentDropoutMask;i=MA(null!=s?Ed(e,s):e,this.kernel.read()),null!=this.bias&&(i=PA(i,this.bias.read())),null!=r&&(n=Ed(n,r));let o=xd(i,MA(n,this.recurrentKernel.read()));return null!=this.activation&&(o=this.activation.apply(o)),[o,o]}))}getConfig(){const e=super.getConfig(),t={units:this.units,activation:kS(this.activation),useBias:this.useBias,kernelInitializer:lx(this.kernelInitializer),recurrentInitializer:lx(this.recurrentInitializer),biasInitializer:lx(this.biasInitializer),kernelRegularizer:_S(this.kernelRegularizer),recurrentRegularizer:_S(this.recurrentRegularizer),biasRegularizer:_S(this.biasRegularizer),activityRegularizer:_S(this.activityRegularizer),kernelConstraint:Vx(this.kernelConstraint),recurrentConstraint:Vx(this.recurrentConstraint),biasConstraint:Vx(this.biasConstraint),dropout:this.dropout,recurrentDropout:this.recurrentDropout};return Object.assign(Object.assign({},e),t)}}rE.className="SimpleRNNCell",Bd(rE);class oE extends iE{constructor(e){e.cell=new rE(e),super(e)}call(e,t){return dh((()=>{null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}static fromConfig(e,t){return new e(t)}}oE.className="SimpleRNN",Bd(oE);class lE extends sE{constructor(e){if(super(e),this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_RECURRENT_ACTIVATION="hardSigmoid",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",e.resetAfter)throw new Rw("GRUCell does not support reset_after parameter set to true.");this.units=e.units,Yw(this.units,"units"),this.activation=AS(void 0===e.activation?this.DEFAULT_ACTIVATION:e.activation),this.recurrentActivation=AS(void 0===e.recurrentActivation?this.DEFAULT_RECURRENT_ACTIVATION:e.recurrentActivation),this.useBias=null==e.useBias||e.useBias,this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=ux(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelRegularizer=IS(e.kernelRegularizer),this.recurrentRegularizer=IS(e.recurrentRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.kernelConstraint=Wx(e.kernelConstraint),this.recurrentConstraint=Wx(e.recurrentConstraint),this.biasConstraint=Wx(e.biasConstraint),this.dropout=wA([1,AA([0,null==e.dropout?0:e.dropout])]),this.recurrentDropout=wA([1,AA([0,null==e.recurrentDropout?0:e.recurrentDropout])]),this.dropoutFunc=e.dropoutFunc,this.implementation=e.implementation,this.stateSize=this.units,this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){const t=(e=px(e))[e.length-1];this.kernel=this.addWeight("kernel",[t,3*this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,3*this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias?this.bias=this.addWeight("bias",[3*this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return dh((()=>{if(2!==e.length)throw new Rw(`GRUCell expects 2 input Tensors (inputs, h, c), got ${e.length}.`);const n=null!=t.training&&t.training;let a=e[1];e=e[0],0wg(e),rate:this.dropout,training:n,count:3,dropoutFunc:this.dropoutFunc})),0wg(a),rate:this.recurrentDropout,training:n,count:3,dropoutFunc:this.dropoutFunc}));const i=this.dropoutMask,s=this.recurrentDropoutMask;let r,o,l;0{null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}static fromConfig(e,t){return 0===t.implmentation&&(t.implementation=1),new e(t)}}uE.className="GRU",Bd(uE);class cE extends sE{constructor(e){super(e),this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_RECURRENT_ACTIVATION="hardSigmoid",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",this.units=e.units,Yw(this.units,"units"),this.activation=AS(void 0===e.activation?this.DEFAULT_ACTIVATION:e.activation),this.recurrentActivation=AS(void 0===e.recurrentActivation?this.DEFAULT_RECURRENT_ACTIVATION:e.recurrentActivation),this.useBias=null==e.useBias||e.useBias,this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=ux(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.unitForgetBias=e.unitForgetBias,this.kernelRegularizer=IS(e.kernelRegularizer),this.recurrentRegularizer=IS(e.recurrentRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.kernelConstraint=Wx(e.kernelConstraint),this.recurrentConstraint=Wx(e.recurrentConstraint),this.biasConstraint=Wx(e.biasConstraint),this.dropout=wA([1,AA([0,null==e.dropout?0:e.dropout])]),this.recurrentDropout=wA([1,AA([0,null==e.recurrentDropout?0:e.recurrentDropout])]),this.dropoutFunc=e.dropoutFunc,this.implementation=e.implementation,this.stateSize=[this.units,this.units],this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){var t;const n=(e=px(e))[e.length-1];let a;if(this.kernel=this.addWeight("kernel",[n,4*this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,4*this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias){if(this.unitForgetBias){const e=this.biasInitializer,n=this.units;a=new((t=class extends GA{apply(t,a){const i=e.apply([n]),s=(new HA).apply([n]),r=e.apply([2*n]);return DA(DA(i,s),r)}}).className="CustomInit",t)}else a=this.biasInitializer;this.bias=this.addWeight("bias",[4*this.units],null,a,this.biasRegularizer,!0,this.biasConstraint)}else this.bias=null;this.built=!0}call(e,t){return dh((()=>{const n=null!=t.training&&t.training;if(3!==e.length)throw new Rw(`LSTMCell expects 3 input Tensors (inputs, h, c), got ${e.length}.`);let a=e[1];const i=e[2];e=e[0],0wg(e),rate:this.dropout,training:n,count:4,dropoutFunc:this.dropoutFunc})),0wg(a),rate:this.recurrentDropout,training:n,count:4,dropoutFunc:this.dropoutFunc}));const s=this.dropoutMask,r=this.recurrentDropoutMask;let o,l,u,c;0{null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}static fromConfig(e,t){return 0===t.implmentation&&(t.implementation=1),new e(t)}}hE.className="LSTM",Bd(hE);class dE extends sE{constructor(e){super(e),this.cells=e.cells}get stateSize(){const e=[];for(const t of this.cells.slice().reverse())Array.isArray(t.stateSize)?e.push(...t.stateSize):e.push(t.stateSize);return e}call(e,t){return dh((()=>{let n=e.slice(1);const a=[];for(const e of this.cells.slice().reverse())Array.isArray(e.stateSize)?a.push(n.splice(0,e.stateSize.length)):a.push(n.splice(0,1));a.reverse();const i=[];let s;for(let r=0;r{fA(`RNNCell_${a}`,(()=>{n.build(e),t=Array.isArray(n.stateSize)?n.stateSize[0]:n.stateSize,e=[e[0],t]}))})),this.built=!0}getConfig(){const e=super.getConfig(),t={cells:this.cells.map((e=>({className:e.getClassName(),config:e.getConfig()})))};return Object.assign(Object.assign({},e),t)}static fromConfig(e,t,n={}){const a=[];for(const e of t.cells)a.push(nC(e,n));return new e({cells:a})}get trainableWeights(){if(!this.trainable)return[];const e=[];for(const t of this.cells)e.push(...t.trainableWeights);return e}get nonTrainableWeights(){const e=[];for(const t of this.cells)e.push(...t.nonTrainableWeights);if(!this.trainable){const t=[];for(const e of this.cells)t.push(...e.trainableWeights);return t.concat(e)}return e}getWeights(){const e=[];for(const t of this.cells)e.push(...t.weights);return yx(e)}setWeights(e){const t=[];for(const n of this.cells){const a=n.weights.length,i=e.splice(a);for(let e=0;enull!=s?s(t(),n):jA(t(),n),o=()=>VA(r,t,a);if(!i||i<=1)return mh(o().clone());return Array(i).fill(void 0).map(o).map((e=>mh(e.clone())))}dE.className="StackedRNNCells",Bd(dE);var mE=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(a=Object.getOwnPropertySymbols(e);i{if(null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null),t&&t.constants)throw new Rw("ConvRNN2D cell does not support constants");const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}computeOutputShape(e){let t=this.computeSingleOutputShape(e);return this.returnSequences||(t=[t[0],...t.slice(2)]),this.returnState&&(t=[t,...Array(2).fill([e[0],...t.slice(-3)])]),t}getInitialState(e){return dh((()=>{const{stateSize:t}=this.cell,n=e.shape,a=this.computeSingleOutputShape(n),i=cg([a[0],...a.slice(2)]);return Array.isArray(t)?Array(t.length).fill(i):[i]}))}resetStates(e,t=!1){dh((()=>{if(!this.stateful)throw new Iw("Cannot call resetStates() on an RNN Layer that is not stateful.");const n=this.inputSpec[0].shape,a=this.computeSingleOutputShape(n),i=[a[0],...a.slice(2)];if(null==n[0])throw new Rw("If an RNN is stateful, it needs to know its batch size. Specify the batch size of your input tensors: \n- If using a Sequential model, specify the batch size by passing a `batchInputShape` option to your first layer.\n- If using the functional API, specify the batch size by passing a `batchShape` option to your Input layer.");if(null==this.getStates())Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((()=>cg(i))):this.states_=[cg(i)];else if(null==e)ph(this.states_),null!=this.keptStates&&(ph(this.keptStates),this.keptStates=[]),Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((()=>cg(i))):this.states_[0]=cg(i);else{if(Array.isArray(e)||(e=[e]),e.length!==this.states_.length)throw new Rw(`Layer ${this.name} expects ${this.states_.length} state(s), but it received ${e.length} state value(s). Input received: ${e}`);t?this.keptStates.push(this.states_.slice()):ph(this.states_);for(let t=0;tmh(e.clone())))}))}computeSingleOutputShape(e){const{dataFormat:t,filters:n,kernelSize:a,padding:i,strides:s,dilationRate:r}=this.cell,o="channelsFirst"===t,l=e[o?3:2],u=e[o?4:3],c=FS(l,a[0],i,s[0],r[0]),h=FS(u,a[1],i,s[1],r[1]);return[...e.slice(0,2),...o?[n,c,h]:[c,h,n]]}}fE.className="ConvRNN2D";class gE extends cE{constructor(e){const{filters:t,kernelSize:n,strides:a,padding:i,dataFormat:s,dilationRate:r}=e;super(Object.assign(Object.assign({},e),{units:t})),this.filters=t,Yw(this.filters,"filters"),this.kernelSize=BS(n,2,"kernelSize"),this.kernelSize.forEach((e=>Yw(e,"kernelSize"))),this.strides=BS(a||1,2,"strides"),this.strides.forEach((e=>Yw(e,"strides"))),this.padding=i||"valid",hA(this.padding),this.dataFormat=s||"channelsLast",cA(this.dataFormat),this.dilationRate=BS(r||1,2,"dilationRate"),this.dilationRate.forEach((e=>Yw(e,"dilationRate")))}build(e){var t;e=px(e);const n="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[n])throw new Rw(`The channel dimension of the input should be defined. Found ${e[n]}`);const a=e[n],i=this.kernelSize.concat([a,4*this.filters]);this.kernel=this.addWeight("kernel",i,null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint);const s=this.kernelSize.concat([this.filters,4*this.filters]);if(this.recurrentKernel=this.addWeight("recurrent_kernel",s,null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias){let e;if(this.unitForgetBias){const n=this.biasInitializer,a=this.filters;e=new((t=class extends GA{apply(e,t){return RA([n.apply([a]),hg([a]),n.apply([2*a])])}}).className="CustomInit",t)}else e=this.biasInitializer;this.bias=this.addWeight("bias",[4*this.filters],null,e,this.biasRegularizer,!0,this.biasConstraint)}this.built=!0}call(e,t){return dh((()=>{if(3!==e.length)throw new Rw(`ConvLSTM2DCell expects 3 input Tensors (inputs, h, c), got ${e.length}.`);const n=t.training||!1,a=e[0],i=e[1],s=e[2];0wg(a),rate:this.dropout,training:n,count:4,dropoutFunc:this.dropoutFunc}));const r=this.dropoutMask,o=(e,t,n)=>t&&t[n]?Ed(t[n],e):e;let l=o(a,r,0),u=o(a,r,1),c=o(a,r,2),h=o(a,r,3);0wg(i),rate:this.recurrentDropout,training:n,count:4,dropoutFunc:this.dropoutFunc}));const d=this.recurrentDropoutMask;let p=o(i,d,0),m=o(i,d,1),f=o(i,d,2),g=o(i,d,3);const[y,b,v,k]=yy(this.kernel.read(),4,3),[w,A,x,C]=this.useBias?yy(this.bias.read(),4):[null,null,null,null];l=this.inputConv(l,y,w,this.padding),u=this.inputConv(u,b,A,this.padding),c=this.inputConv(c,v,x,this.padding),h=this.inputConv(h,k,C,this.padding);const[S,E,_,T]=yy(this.recurrentKernel.read(),4,3);p=this.recurrentConv(p,S),m=this.recurrentConv(m,E),f=this.recurrentConv(f,_),g=this.recurrentConv(g,T);const I=this.recurrentActivation.apply(xd(l,p)),N=this.recurrentActivation.apply(xd(u,m)),R=xd(Ed(N,s),Ed(I,this.activation.apply(xd(c,f)))),D=Ed(this.recurrentActivation.apply(xd(h,g)),this.activation.apply(R));return[D,D,R]}))}getConfig(){const e=super.getConfig(),{units:t}=e,n=mE(e,["units"]),a={filters:this.filters,kernelSize:this.kernelSize,padding:this.padding,dataFormat:this.dataFormat,dilationRate:this.dilationRate,strides:this.strides};return Object.assign(Object.assign({},n),a)}inputConv(e,t,n,a){const i=Wm(e,t,this.strides,a||"valid","channelsFirst"===this.dataFormat?"NCHW":"NHWC",this.dilationRate);return n?PA(i,n,this.dataFormat):i}recurrentConv(e,t){return Wm(e,t,1,"same","channelsFirst"===this.dataFormat?"NCHW":"NHWC")}}gE.className="ConvLSTM2DCell",Bd(gE);class yE extends fE{constructor(e){const t=new gE(e);super(Object.assign(Object.assign({},e),{cell:t}))}static fromConfig(e,t){return new e(t)}}yE.className="ConvLSTM2D",Bd(yE);class bE extends Cx{constructor(e){super(e),this.rate=Math.max(Math.min(e.rate,1),0),this.noiseShape=e.noiseShape,this.seed=e.seed,this.supportsMasking=!0}getNoiseShape(e){if(null==this.noiseShape)return this.noiseShape;const t=e.shape,n=[];for(let e=0;e{this.invokeCallHook(e,t);const n=dx(e);if(0jA(n,this.rate,a,this.seed)),(()=>n),e)}return e}))}getConfig(){const e={rate:this.rate,noiseShape:this.noiseShape,seed:this.seed},t=super.getConfig();return Object.assign(e,t),e}dispose(){return super.dispose()}}bE.className="Dropout",Bd(bE);class vE extends bE{constructor(e){super(e),this.inputSpec=[{ndim:3}]}getNoiseShape(e){const t=e.shape;return[t[0],1,t[2]]}}vE.className="SpatialDropout1D",Bd(vE);class kE extends Cx{constructor(e){if(super(e),this.activation=null,this.useBias=!0,this.kernel=null,this.bias=null,this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_BIAS_INITIALIZER="zeros",null==e.batchInputShape&&null==e.inputShape&&null!=e.inputDim){let t=null;null!=e.batchSize&&(t=e.batchSize),this.batchInputShape=[t,e.inputDim]}this.units=e.units,Yw(this.units,"units"),this.activation=AS(e.activation),null!=e.useBias&&(this.useBias=e.useBias),this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelConstraint=Wx(e.kernelConstraint),this.biasConstraint=Wx(e.biasConstraint),this.kernelRegularizer=IS(e.kernelRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.activityRegularizer=IS(e.activityRegularizer),this.supportsMasking=!0,this.inputSpec=[{minNDim:2}]}build(e){const t=(e=px(e))[e.length-1];null==this.kernel&&(this.kernel=this.addWeight("kernel",[t,this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint))),this.inputSpec=[{minNDim:2,axes:{[-1]:t}}],this.built=!0}computeOutputShape(e){const t=(e=px(e)).slice();return t[t.length-1]=this.units,t}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e),a=Jw(this.activation.getClassName());let i;return null!=a?i=MA(n,this.kernel.read(),a,this.bias?this.bias.read():null):(i=MA(n,this.kernel.read()),null!=this.bias&&(i=PA(i,this.bias.read())),null!=this.activation&&(i=this.activation.apply(i))),i}))}getConfig(){const e={units:this.units,activation:kS(this.activation),useBias:this.useBias,kernelInitializer:lx(this.kernelInitializer),biasInitializer:lx(this.biasInitializer),kernelRegularizer:_S(this.kernelRegularizer),biasRegularizer:_S(this.biasRegularizer),activityRegularizer:_S(this.activityRegularizer),kernelConstraint:Vx(this.kernelConstraint),biasConstraint:Vx(this.biasConstraint)},t=super.getConfig();return Object.assign(e,t),e}}kE.className="Dense",Bd(kE);class wE extends Cx{constructor(e){super(e=e||{}),this.inputSpec=[{minNDim:3}],this.dataFormat=e.dataFormat}computeOutputShape(e){e=px(e);for(const t of e.slice(1))if(null==t)throw new Rw(`The shape of the input to "Flatten" is not fully defined (got ${e.slice(1)}). Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model.`);return[e[0],kA(e,1)]}call(e,t){return dh((()=>{this.invokeCallHook(e,t);let n=dx(e);if("channelsFirst"===this.dataFormat&&n.rank>1){const e=[0];for(let t=2;t{this.invokeCallHook(e,t);const n=dx(e);return this.activation.apply(n)}))}getConfig(){const e={activation:kS(this.activation)},t=super.getConfig();return Object.assign(e,t),e}}AE.className="Activation",Bd(AE);class xE extends Cx{constructor(e){super(e),this.n=e.n,this.inputSpec=[{ndim:2}]}computeOutputShape(e){return[e[0],this.n,e[1]]}call(e,t){return dh((()=>{return e=dx(e),t=e,n=this.n,dh((()=>{if(2!==t.shape.length)throw new Rw(`repeat() expects a rank-2 tensor, but received a rank-${t.shape.length} tensor.`);return zA(_A(t,1),[1,n,1])}));var t,n}))}getConfig(){const e={n:this.n},t=super.getConfig();return Object.assign(e,t),e}}xE.className="RepeatVector",Bd(xE);class CE extends Cx{constructor(e){super(e),this.targetShape=e.targetShape;for(let e=0;e{this.invokeCallHook(e,t);const n=dx(e),a=n.shape,i=a.slice(0,1).concat(this.fixUnknownDimension(a.slice(1),this.targetShape));return vm(n,i)}))}getConfig(){const e={targetShape:this.targetShape},t=super.getConfig();return Object.assign(e,t),e}}CE.className="Reshape",Bd(CE);class SE extends Cx{constructor(e){if(super(e),null==e.dims)throw new Error("Required configuration field `dims` is missing during Permute constructor call.");if(!Array.isArray(e.dims))throw new Error(`Permute constructor requires \`dims\` to be an Array, but received ${e.dims} instead.`);const t=xA(1,e.dims.length+1);if(!Os(e.dims.slice().sort(),t))throw new Error("Invalid permutation `dims`: "+JSON.stringify(e.dims)+" `dims` must contain consecutive integers starting from 1.");this.dims=e.dims,this.dimsIncludingBatch=[0].concat(this.dims),this.inputSpec=[new vx({ndim:this.dims.length+1})]}computeOutputShape(e){const t=(e=px(e)).slice();return this.dims.forEach(((n,a)=>{t[a+1]=e[n]})),t}call(e,t){return Gy(dx(e),this.dimsIncludingBatch)}getConfig(){const e={dims:this.dims},t=super.getConfig();return Object.assign(e,t),e}}SE.className="Permute",Bd(SE);class EE extends Cx{constructor(e){super(null==e?{}:e),this.supportsMasking=!0,this.maskValue=null!=e?null==e.maskValue?0:e.maskValue:0}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={maskValue:this.maskValue};return Object.assign(t,e),t}computeMask(e,t){const n=dx(e);return Xp(vg(n,this.maskValue),-1)}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e),a=Xp(vg(n,this.maskValue),-1,!0);return Ed(n,kd(a,n.dtype))}))}}EE.className="Masking",Bd(EE);class _E extends Cx{constructor(e){if(super(e),this.embeddings=null,this.DEFAULT_EMBEDDINGS_INITIALIZER="randomUniform",null==e.batchInputShape&&null==e.inputShape){let t=null;null!=e.batchSize&&(t=e.batchSize),null==e.inputLength?this.batchInputShape=[t,null]:this.batchInputShape=[t].concat(Pw(e.inputLength))}this.inputDim=e.inputDim,Yw(this.inputDim,"inputDim"),this.outputDim=e.outputDim,Yw(this.outputDim,"outputDim"),this.embeddingsInitializer=ux(e.embeddingsInitializer||this.DEFAULT_EMBEDDINGS_INITIALIZER),this.embeddingsRegularizer=IS(e.embeddingsRegularizer),this.activityRegularizer=IS(e.activityRegularizer),this.embeddingsConstraint=Wx(e.embeddingsConstraint),this.maskZero=e.maskZero,this.supportsMasking=e.maskZero,this.inputLength=e.inputLength}build(e){this.embeddings=this.addWeight("embeddings",[this.inputDim,this.outputDim],this.dtype,this.embeddingsInitializer,this.embeddingsRegularizer,!0,this.embeddingsConstraint),this.built=!0}warnOnIncompatibleInputShape(e){}computeMask(e,t){return dh((()=>this.maskZero?(e=dx(e),vg(e,Id(e))):null))}computeOutputShape(e){if(e=px(e),null==this.inputLength)return[...e,this.outputDim];const t=Pw(this.inputLength);if(t.length!==e.length-1)throw new Rw(`"inputLength" is ${this.inputLength}, but received input shape has shape ${e}`);{let n=0;for(let a=0;a{this.invokeCallHook(e,t);let n=dx(e);"int32"!==n.dtype&&(n=EA(n,"int32"));const a=BA(this.embeddings.read(),vm(n,[n.size]));return vm(a,px(this.computeOutputShape(n.shape)))}))}getConfig(){const e={inputDim:this.inputDim,outputDim:this.outputDim,embeddingsInitializer:lx(this.embeddingsInitializer),embeddingsRegularizer:_S(this.embeddingsRegularizer),activityRegularizer:_S(this.activityRegularizer),embeddingsConstraint:Vx(this.embeddingsConstraint),maskZero:this.maskZero,inputLength:this.inputLength},t=super.getConfig();return Object.assign(e,t),e}}_E.className="Embedding",Bd(_E);class TE extends Cx{constructor(e){super(e||{}),this.supportsMasking=!0}mergeFunction(e){throw new Dw}computeElementwiseOpOutputShape(e,t){if(null==e||null==t)return null;if(e.length1)throw new Rw(`Can not merge tensors with different batch sizes. Got tensors with shapes: ${JSON.stringify(e)}.`);let n=null==e[0]?null:e[0].slice(1);for(let t=1;te.length));-1===e.indexOf(null)&&1===Kw(a).length?this.reshapeRequired=!1:this.reshapeRequired=!0}call(e,t){return dh((()=>{if(this.reshapeRequired){const t=[],n=e.map((e=>e.rank));if(-1===n.indexOf(null)){const a=AA(n);for(let n of e){const e=n.rank;for(let t=0;t1){const i=xA(1,e).concat([0]);t.push(Gy(a,i)),n=!0}else t.push(a)}let a=this.mergeFunction(t);const i=a.rank;if(n)if(null==i){const e=a.shape,t=e[e.length-1],n=[t].concat(e.slice(0,e.length-1));a=vm(Gy(vm(a,[-1,t]),[1,0]),n)}else if(i>1){const e=[i-1].concat(xA(0,i-1));a=Gy(a,e)}return a}}return this.mergeFunction(e)}))}computeOutputShape(e){let t;t=null==e[0]?null:e[0].slice(1);for(let n=1;n{if(null==t)return null;if(!Array.isArray(t))throw new Rw("`mask` should be an Array");if(!Array.isArray(e))throw new Rw("`inputs` should be an Array");if(t.length!==e.length)throw new Rw(`The Array 'inputs' and 'mask' are expected to have the same length, but have different lengths (${e.length} vs ${t.length})`);if(t.every((e=>null==e)))return null;let n=(t=t.map((e=>null==e?e:If(e,0))))[0];for(let e=1;e{let t=e[0].clone();for(let n=1;n{let t=e[0].clone();for(let n=1;n{let t=e[0].clone();for(let n=1;n{let t=e[0];for(let n=1;n{let t=e[0];for(let n=1;n1)throw new Rw("A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got input shapes: "+JSON.stringify(e))}mergeFunction(e){return dh((()=>RA(e,this.axis)))}computeOutputShape(e){if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Rw("A `Concatenate` layer should be called on a list of inputs.");const t=e,n=t[0].slice(),a=this.axis<0?n.length+this.axis:this.axis;for(const e of t.slice(1)){if(null==n[a]||null==e[a]){n[a]=null;break}n[a]+=e[a]}return n}computeMask(e,t){if(null==t)return null;if(!Array.isArray(t))throw new Rw("`mask` should be an array for Concatenate");if(!Array.isArray(e))throw new Rw("`inputs` should be an array for Concatenate");if(t.length!==e.length)throw new Rw(`Mismatch in the length of mask (${t.length}) and the legnth of inputs (${e.length})`);return dh((()=>{let n=!0;if(t.forEach((e=>{null==e||(n=!1)})),n)return null;const a=[];for(let n=0;n"A `Dot` layer should be called on a list of exactly 2 inputs."));const t=e[0],n=e[1];if(t.length>3||n.length>3)throw new Dw("Dot layer does not support tensors of 4D or higher rank yet.");const a=this.interpretAxes(t,n);if(t[a[0]]!==n[a[1]])throw new Rw(`Dimension incompatibility: ${t[a[0]]} !== ${n[a[1]]}`)}mergeFunction(e){if(2!==e.length)throw new Rw(`A \`Dot\` layer must be called on exactly 2 inputs, but received ${e.length} input(s).`);let t,n=e[0],a=e[1];return t=Array.isArray(this.axes)?this.axes.map(((t,n)=>ME(t,e[n].shape.length))):[ME(this.axes,n.shape.length),ME(this.axes,a.shape.length)],this.normalize&&(n=aC(n,t[0]),a=aC(a,t[1])),function(e,t,n){if(e.shape.length>3||t.shape.length>3)throw new Dw("batchDot is not implemented for tensors of 4D or higher rank yet");if(Ns(e.shape.length>=2,(()=>`batchDot requires the rank of x to be >= 2, but got ${e.shape.length}`)),Ns(e.shape.length>=2,(()=>`batchDot requires the rank of y to be >= 2, but got ${t.shape.length}`)),"number"==typeof n&&(n=[n,n]),"complex64"===e.dtype||"complex64"===t.dtype)throw new Dw("batchDot is not implemented for complex64-type Tensors yet.");const a=e.shape.length,i=t.shape.length;null==n&&(n=[a-1,i-2]);const s=n;return dh((()=>{let n,r;if(a>i){n=a-i;const e=[];for(let t=0;ta){n=i-a;const t=[];for(let e=0;e0){let e;e=a>i?a+i-3:a-1;const t=[];for(let a=e;a"A `Dot` layer should be called on a list of exactly 2 inputs."));const t=e[0].slice(),n=e[1].slice();if(t.length>3||n.length>3)throw new Dw("Dot layer does not support tensors of 4D or higher rank yet.");const a=this.interpretAxes(t,n);t.splice(a[0],1),n.splice(a[1],1),n.splice(0,1);const i=t.concat(n);return 1===i.length&&i.push(1),i}computeMask(e,t){return null}getConfig(){const e={axes:this.axes,normalize:this.normalize},t=super.getConfig();return Object.assign(e,t),e}}BE.className="Dot",Bd(BE);class FE extends Cx{constructor(e){super(e),this.supportsMasking=!0,this.stddev=e.stddev}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={stddev:this.stddev};return Object.assign(t,e),t}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e);return VA((()=>xd(OA(n.shape,0,this.stddev),n)),(()=>n),t.training||!1)}))}}FE.className="GaussianNoise",Bd(FE);class LE extends Cx{constructor(e){super(e),this.supportsMasking=!0,this.rate=e.rate}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={rate:this.rate};return Object.assign(t,e),t}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e);if(this.rate>0&&this.rate<1){return VA((()=>{const e=Math.sqrt(this.rate/(1-this.rate));return Ed(n,OA(n.shape,1,e))}),(()=>n),t.training||!1)}return n}))}}LE.className="GaussianDropout",Bd(LE);class PE extends Cx{constructor(e){super(e),this.supportsMasking=!0,this.rate=e.rate,this.noiseShape=e.noiseShape}_getNoiseShape(e){return this.noiseShape||dx(e).shape}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={rate:this.rate};return Object.assign(t,e),t}call(e,t){return dh((()=>{if(this.rate<1&&this.rate>0){const n=this._getNoiseShape(e);return VA((()=>{const t=dx(e),a=-1.7580993408473766;let i=Bf(Wg(n),this.rate);i=EA(i,"float32");const s=((1-this.rate)*(1+this.rate*a**2))**-.5,r=-s*a*this.rate,o=xd(Ed(t,i),Ed(xd(i,-1),a));return xd(Ed(o,s),r)}),(()=>dx(e)),t.training||!1)}return e}))}}function jE(e,t,n,a,i,s=.001){let r;if(2===e.rank)r=Nm(e,t,n,a,i,s);else if(3===e.rank)r=Rm(e,t,n,a,i,s);else{if(4!==e.rank)throw new Dw(`batchNormalization is not implemented for array of rank ${e.rank} yet`);r=Dm(e,t,n,a,i,s)}return r}function VE(e,t,n,a,i=.001){return Os(a.slice().sort(),xA(0,e.rank-1))?function(e,t,n,a,i=.001){return dh((()=>{const s=gg(e,a),r=s.mean,o=s.variance;return[jE(e,r,o,n,t,i),r,o]}))}(e,t,n,a,i):function(e,t,n,a,i=.001){return dh((()=>{const s=gg(e,a),r=s.mean,o=s.variance,l=[];for(const t of xA(0,e.rank))-1!==a.indexOf(t)?l.push(1):l.push(e.shape[t]);const u=vm(r,l),c=vm(o,l),h=null==t?null:vm(t,l),d=null==n?null:vm(n,l);return[jE(e,u,c,d,h,i),r,o]}))}(e,t,n,a,i)}PE.className="AlphaDropout",Bd(PE);class UE extends Cx{constructor(e){null==e&&(e={}),super(e),this.supportsMasking=!0,this.axis=null==e.axis?-1:e.axis,this.momentum=null==e.momentum?.99:e.momentum,this.epsilon=null==e.epsilon?.001:e.epsilon,this.center=null==e.center||e.center,this.scale=null==e.scale||e.scale,this.betaInitializer=ux(e.betaInitializer||"zeros"),this.gammaInitializer=ux(e.gammaInitializer||"ones"),this.movingMeanInitializer=ux(e.movingMeanInitializer||"zeros"),this.movingVarianceInitializer=ux(e.movingVarianceInitializer||"ones"),this.betaConstraint=Wx(e.betaConstraint),this.gammaConstraint=Wx(e.gammaConstraint),this.betaRegularizer=IS(e.betaRegularizer),this.gammaRegularizer=IS(e.gammaRegularizer)}build(e){e=px(e);const t=this.axis>=0?this.axis:this.axis+e.length,n=e[t];if(null==n)throw new Rw(`Axis ${t} of input tensor should have a defined dimension but the layer received an input with shape ${JSON.stringify(e)}.`);this.inputSpec=[new vx({ndim:e.length,axes:{[t]:n}})];const a=[n];this.scale&&(this.gamma=this.addWeight("gamma",a,null,this.gammaInitializer,this.gammaRegularizer,!0,this.gammaConstraint)),this.center&&(this.beta=this.addWeight("beta",a,null,this.betaInitializer,this.betaRegularizer,!0,this.betaConstraint)),this.movingMean=this.addWeight("moving_mean",a,null,this.movingMeanInitializer,null,!1),this.movingVariance=this.addWeight("moving_variance",a,null,this.movingVarianceInitializer,null,!1),this.built=!0}call(e,t){return dh((()=>{const n=null!=t.training&&t.training,a=dx(e),i=a.shape,s=i.length,r=xA(0,s),o=this.axis>=0?this.axis:this.axis+s;r.splice(o,1);const l=Mw(1,s);l[o]=i[o];const u=r.slice();u.sort();const c=!Os(u,xA(0,s).slice(0,s-1));if(!n)return(()=>{if(c){const e=vm(this.movingMean.read(),l),t=vm(this.movingVariance.read(),l),n=this.center?vm(this.beta.read(),l):null,i=this.scale?vm(this.gamma.read(),l):null;return jE(a,e,t,n,i,this.epsilon)}return jE(a,this.movingMean.read(),this.movingVariance.read(),null==this.beta?null:this.beta.read(),null==this.gamma?null:this.gamma.read(),this.epsilon)})();const[h,d,p]=VE(a,this.gamma.read(),this.beta.read(),r,this.epsilon),m=(e,t,n)=>{dh((()=>{const a=1-n,i=e.read(),s=Ed(Ud(i,t),a);e.write(Ud(i,s))}))};return(()=>{m(this.movingMean,d,this.momentum),m(this.movingVariance,p,this.momentum)})(),h}))}getConfig(){const e={axis:this.axis,momentum:this.momentum,epsilon:this.epsilon,center:this.center,scale:this.scale,betaInitializer:lx(this.betaInitializer),gammaInitializer:lx(this.gammaInitializer),movingMeanInitializer:lx(this.movingMeanInitializer),movingVarianceInitializer:lx(this.movingVarianceInitializer),betaRegularizer:_S(this.betaRegularizer),gammaRegularizer:_S(this.gammaRegularizer),betaConstraint:Vx(this.betaConstraint),gammaConstraint:Vx(this.gammaConstraint)},t=super.getConfig();return Object.assign(e,t),e}}UE.className="BatchNormalization",Bd(UE);class WE extends Cx{constructor(e){if(null==e&&(e={}),super(e),this.axis=null==e.axis?-1:e.axis,"number"==typeof this.axis){if(!Number.isInteger(this.axis))throw new Error(`Expected axis to be an integer, but received ${this.axis}`)}else{if(!Array.isArray(this.axis))throw new Error(`Expected axis to be an integer or an array of integers, but received ${JSON.stringify(this.axis)}`);for(const e of this.axis)if(!Number.isInteger(e))throw new Error(`Expected axis to be an array of integers, but received ${JSON.stringify(this.axis)}`)}this.epsilon=null==e.epsilon?.001:e.epsilon,this.center=null==e.center||e.center,this.scale=null==e.scale||e.scale,this.betaInitializer=ux(e.betaInitializer||"zeros"),this.gammaInitializer=ux(e.gammaInitializer||"ones"),this.betaRegularizer=IS(e.betaRegularizer),this.gammaRegularizer=IS(e.gammaRegularizer),this.supportsMasking=!0}build(e){const t=(e=px(e)).length;"number"==typeof this.axis&&(this.axis=[this.axis]);for(let e=0;e=t)throw new Error(`Invalid axis: ${e}`);if(this.axis.length!==Kw(this.axis).length)throw new Error(`Found duplicate axes in: ${this.axis}`);const n=this.axis.map((t=>e[t])),a=!0;this.scale?this.gamma=this.addWeight("gamma",n,"float32",this.gammaInitializer,this.gammaRegularizer,a):this.gamma=null,this.center?this.beta=this.addWeight("beta",n,"float32",this.betaInitializer,this.betaRegularizer,a):this.beta=null,this.built=!0}call(e,t){const n=dx(e),a=n.shape,i=a.length;return dh((()=>{let{mean:e,variance:t}=gg(n,this.axis,!0);const s=Mw(1,i);for(const e of this.axis)s[e]=a[e];const r=e=>null!=e&&e.shape.length!==i?vm(e,s):e;let o=this.scale?r(this.gamma.read()):null,l=this.center?r(this.beta.read()):null;const u=[],c=[];for(let e=0;e=0?e[2]+this.padding[0][0]+this.padding[0][1]:null,n=null!=e[3]&&e[3]>=0?e[3]+this.padding[1][0]+this.padding[1][1]:null,[e[0],e[1],t,n]):(t=null!=e[1]&&e[1]>=0?e[1]+this.padding[0][0]+this.padding[0][1]:null,n=null!=e[2]&&e[2]>=0?e[2]+this.padding[1][0]+this.padding[1][1]:null,[e[0],t,n,e[3]])}call(e,t){return dh((()=>{return t=dx(e),n=this.padding,a=this.dataFormat,dh((()=>{if(4!==t.rank)throw new Rw(`temporalPadding expects input tensor to be 4-D, but received a ${t.rank}-D tensor.`);if(null==n&&(n=[[1,1],[1,1]]),2!==n.length||2!==n[0].length||2!==n[1].length)throw new Rw("spatial2dPadding expects `padding` to be an Array of two Arrays, each of which is an Array of two integers.");if(null==a&&(a="channelsLast"),"channelsLast"!==a&&"channelsFirst"!==a)throw new Rw(`Unknown data format: ${a}. Supported data formats are 'channelsLast' and 'channelsFirst.`);let e;return e="channelsFirst"===a?[[0,0],[0,0],n[0],n[1]]:[[0,0],n[0],n[1],[0,0]],xg(t,e)}));var t,n,a}))}getConfig(){const e={padding:this.padding,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}function qE(e,t,n,a,i,s){return dh((()=>{let r;cA(i),dA(s),hA(a),null==n&&(n=[1,1]),null==a&&(a="valid"),null==i&&(i="channelsLast"),null==s&&(s="max"),e=PS(e,i);const o="same"===a?"same":"valid";return r="max"===s?rg(e,t,n,o):km(e,t,n,o),"channelsFirst"===i&&(r=Gy(r,[0,3,1,2])),r}))}function HE(e,t,n,a,i,s){return dh((()=>{let r;cA(i),dA(s),hA(a),null==n&&(n=[1,1,1]),null==a&&(a="valid"),null==i&&(i="channelsLast"),null==s&&(s="max"),e=jS(e,i);const o="same"===a?"same":"valid";return r="max"===s?og(e,t,n,o):wm(e,t,n,o),"channelsFirst"===i&&(r=Gy(r,[0,4,1,2,3])),r}))}GE.className="ZeroPadding2D",Bd(GE);class KE extends Cx{constructor(e){if(null==e.poolSize&&(e.poolSize=2),super(e),"number"==typeof e.poolSize)this.poolSize=[e.poolSize];else{if(!Array.isArray(e.poolSize)||1!==e.poolSize.length||"number"!=typeof e.poolSize[0])throw new Rw(`poolSize for 1D convolutional layer must be a number or an Array of a single number, but received ${JSON.stringify(e.poolSize)}`);this.poolSize=e.poolSize}if(Yw(this.poolSize,"poolSize"),null==e.strides)this.strides=this.poolSize;else if("number"==typeof e.strides)this.strides=[e.strides];else{if(!Array.isArray(e.strides)||1!==e.strides.length||"number"!=typeof e.strides[0])throw new Rw(`strides for 1D convolutional layer must be a number or an Array of a single number, but received ${JSON.stringify(e.strides)}`);this.strides=e.strides}Yw(this.strides,"strides"),this.padding=null==e.padding?"valid":e.padding,hA(this.padding),this.inputSpec=[new vx({ndim:3})]}computeOutputShape(e){const t=FS((e=px(e))[1],this.poolSize[0],this.padding,this.strides[0]);return[e[0],t,e[2]]}call(e,t){return dh((()=>{this.invokeCallHook(e,t),e=_A(dx(e),2);const n=this.poolingFunction(dx(e),[this.poolSize[0],1],[this.strides[0],1],this.padding,"channelsLast");return ky(n,[2])}))}getConfig(){const e={poolSize:this.poolSize,padding:this.padding,strides:this.strides},t=super.getConfig();return Object.assign(e,t),e}}class $E extends KE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"max")}}$E.className="MaxPooling1D",Bd($E);class ZE extends KE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"avg")}}ZE.className="AveragePooling1D",Bd(ZE);class XE extends Cx{constructor(e){if(null==e.poolSize&&(e.poolSize=[2,2]),super(e),this.poolSize=Array.isArray(e.poolSize)?e.poolSize:[e.poolSize,e.poolSize],null==e.strides)this.strides=this.poolSize;else if(Array.isArray(e.strides)){if(2!==e.strides.length)throw new Rw(`If the strides property of a 2D pooling layer is an Array, it is expected to have a length of 2, but received length ${e.strides.length}.`);this.strides=e.strides}else this.strides=[e.strides,e.strides];Yw(this.poolSize,"poolSize"),Yw(this.strides,"strides"),this.padding=null==e.padding?"valid":e.padding,this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),hA(this.padding),this.inputSpec=[new vx({ndim:4})]}computeOutputShape(e){e=px(e);let t="channelsFirst"===this.dataFormat?e[2]:e[1],n="channelsFirst"===this.dataFormat?e[3]:e[2];return t=FS(t,this.poolSize[0],this.padding,this.strides[0]),n=FS(n,this.poolSize[1],this.padding,this.strides[1]),"channelsFirst"===this.dataFormat?[e[0],e[1],t,n]:[e[0],t,n,e[3]]}call(e,t){return dh((()=>(this.invokeCallHook(e,t),this.poolingFunction(dx(e),this.poolSize,this.strides,this.padding,this.dataFormat))))}getConfig(){const e={poolSize:this.poolSize,padding:this.padding,strides:this.strides,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}class YE extends XE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"max")}}YE.className="MaxPooling2D",Bd(YE);class QE extends XE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"avg")}}QE.className="AveragePooling2D",Bd(QE);class JE extends Cx{constructor(e){if(null==e.poolSize&&(e.poolSize=[2,2,2]),super(e),this.poolSize=Array.isArray(e.poolSize)?e.poolSize:[e.poolSize,e.poolSize,e.poolSize],null==e.strides)this.strides=this.poolSize;else if(Array.isArray(e.strides)){if(3!==e.strides.length)throw new Rw(`If the strides property of a 3D pooling layer is an Array, it is expected to have a length of 3, but received length ${e.strides.length}.`);this.strides=e.strides}else this.strides=[e.strides,e.strides,e.strides];Yw(this.poolSize,"poolSize"),Yw(this.strides,"strides"),this.padding=null==e.padding?"valid":e.padding,this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),hA(this.padding),this.inputSpec=[new vx({ndim:5})]}computeOutputShape(e){e=px(e);let t="channelsFirst"===this.dataFormat?e[2]:e[1],n="channelsFirst"===this.dataFormat?e[3]:e[2],a="channelsFirst"===this.dataFormat?e[4]:e[3];return t=FS(t,this.poolSize[0],this.padding,this.strides[0]),n=FS(n,this.poolSize[1],this.padding,this.strides[1]),a=FS(a,this.poolSize[2],this.padding,this.strides[2]),"channelsFirst"===this.dataFormat?[e[0],e[1],t,n,a]:[e[0],t,n,a,e[4]]}call(e,t){return dh((()=>(this.invokeCallHook(e,t),this.poolingFunction(dx(e),this.poolSize,this.strides,this.padding,this.dataFormat))))}getConfig(){const e={poolSize:this.poolSize,padding:this.padding,strides:this.strides,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}class e_ extends JE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),HE(e,t,n,a,i,"max")}}e_.className="MaxPooling3D",Bd(e_);class t_ extends JE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),HE(e,t,n,a,i,"avg")}}t_.className="AveragePooling3D",Bd(t_);class n_ extends Cx{constructor(e){super(e),this.inputSpec=[new vx({ndim:3})]}computeOutputShape(e){return[e[0],e[2]]}call(e,t){throw new Dw}}class a_ extends n_{constructor(e){super(e||{})}call(e,t){return dh((()=>{const t=dx(e);return ug(t,1)}))}}a_.className="GlobalAveragePooling1D",Bd(a_);class i_ extends n_{constructor(e){super(e||{})}call(e,t){return dh((()=>{const t=dx(e);return Af(t,1)}))}}i_.className="GlobalMaxPooling1D",Bd(i_);class s_ extends Cx{constructor(e){super(e),this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),this.inputSpec=[new vx({ndim:4})]}computeOutputShape(e){return"channelsLast"===this.dataFormat?[e[0],e[3]]:[e[0],e[1]]}call(e,t){throw new Dw}getConfig(){const e={dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}class r_ extends s_{call(e,t){return dh((()=>{const t=dx(e);return"channelsLast"===this.dataFormat?ug(t,[1,2]):ug(t,[2,3])}))}}r_.className="GlobalAveragePooling2D",Bd(r_);class o_ extends s_{call(e,t){return dh((()=>{const t=dx(e);return"channelsLast"===this.dataFormat?Af(t,[1,2]):Af(t,[2,3])}))}}o_.className="GlobalMaxPooling2D",Bd(o_);class l_ extends Cx{constructor(e){super(e),this.layer=e.layer}build(e){this.built=!0}get trainable(){return null!=this.layer&&this.layer.trainable}set trainable(e){null!=this.layer&&(this.layer.trainable=e)}get trainableWeights(){return this.layer.trainableWeights}get nonTrainableWeights(){return this.layer.nonTrainableWeights}get updates(){return this.layer._updates}get losses(){return this.layer.losses}getWeights(){return this.layer.getWeights()}setWeights(e){this.layer.setWeights(e)}getConfig(){const e={layer:{className:this.layer.getClassName(),config:this.layer.getConfig()}},t=super.getConfig();return Object.assign(e,t),e}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),null!=this.layer&&this.layer.setFastWeightInitDuringBuild(e)}static fromConfig(e,t,n={}){const a=nC(t.layer,n);delete t.layer;const i={layer:a};return Object.assign(i,t),new e(i)}}class u_ extends l_{constructor(e){super(e),this.supportsMasking=!0}build(e){if((e=px(e)).length<3)throw new Rw(`TimeDistributed layer expects an input shape >= 3D, but received input shape ${JSON.stringify(e)}`);this.inputSpec=[{shape:e}];const t=[e[0]].concat(e.slice(2));this.layer.built||(this.layer.build(t),this.layer.built=!0),super.build(e)}computeOutputShape(e){const t=[(e=px(e))[0]].concat(e.slice(2)),n=this.layer.computeOutputShape(t),a=e[1];return[n[0],a].concat(n.slice(1))}call(e,t){return dh((()=>aE(((e,n)=>[dx(this.layer.call(e,t)),[]]),e=dx(e),[],!1,null,null,!1,!0)[1]))}}u_.className="TimeDistributed",Bd(u_);class c_ extends l_{constructor(e){super(e);const t=e.layer.getConfig(),n={};n.className=e.layer.getClassName(),n.config=t,this.forwardLayer=nC(n),t.goBackwards=!0!==t.goBackwards;const a={};var i;if(a.className=e.layer.getClassName(),a.config=t,this.backwardLayer=nC(a),this.forwardLayer.name="forward_"+this.forwardLayer.name,this.backwardLayer.name="backward_"+this.backwardLayer.name,this.mergeMode=void 0===e.mergeMode?"concat":e.mergeMode,i=this.mergeMode,Zw(lA,"BidirectionalMergeMode",i),e.weights)throw new Dw("weights support is not implemented for Bidirectional layer yet.");this._stateful=e.layer.stateful,this.returnSequences=e.layer.returnSequences,this.returnState=e.layer.returnState,this.supportsMasking=!0,this._trainable=!0,this.inputSpec=e.layer.inputSpec,this.numConstants=null}get trainable(){return this._trainable}set trainable(e){this._trainable=e,null!=this.forwardLayer&&(this.forwardLayer.trainable=e),null!=this.backwardLayer&&(this.backwardLayer.trainable=e)}getWeights(){return this.forwardLayer.getWeights().concat(this.backwardLayer.getWeights())}setWeights(e){const t=e.length,n=Math.floor(t/2);this.forwardLayer.setWeights(e.slice(0,n)),this.backwardLayer.setWeights(e.slice(n))}computeOutputShape(e){let t,n,a,i=this.forwardLayer.computeOutputShape(e);return Array.isArray(i)&&Array.isArray(i[0])||(i=[i]),this.returnState?(a=i.slice(1),t=i[0]):t=i[0],"concat"===this.mergeMode?(t[t.length-1]*=2,n=[t]):n=null==this.mergeMode?[t,t.slice()]:[t],this.returnState?null==this.mergeMode?n.concat(a).concat(a.slice()):[t].concat(a).concat(a.slice()):Lw(n)}apply(e,t){let n=null==t?null:t.initialState,a=null==t?null:t.constants;null==t&&(t={});const i=nE(e,n,a,this.numConstants);if(e=i.inputs,n=i.initialState,a=i.constants,Array.isArray(e)&&(n=e.slice(1),e=e[0]),(null==n||0===n.length)&&null==a)return super.apply(e,t);const s=[],r=[];if(null!=n){const e=n.length;if(e%2>0)throw new Rw("When passing `initialState` to a Bidrectional RNN, the state should be an Array containing the states of the underlying RNNs.");t.initialState=n,s.push(...n);const a=n.map((e=>new vx({shape:e.shape})));this.forwardLayer.stateSpec=a.slice(0,e/2),this.backwardLayer.stateSpec=a.slice(e/2),r.push(...a)}if(null!=a)throw new Dw("Support for constants in Bidirectional layers is not implemented yet.");const o=s[0]instanceof kx;for(const e of s)if(e instanceof kx!==o)throw new Rw("The initial state of a Bidirectional layer cannot be specified as a mix of symbolic and non-symbolic tensors");if(o){const n=[e].concat(s),a=this.inputSpec.concat(r),i=this.inputSpec;this.inputSpec=a;const o=super.apply(n,t);return this.inputSpec=i,o}return super.apply(e,t)}call(e,t){return dh((()=>{const n=t.initialState;let a,i,s,r;if(null==n)a=this.forwardLayer.call(e,t),i=this.backwardLayer.call(e,t);else{const s=n.slice(0,n.length/2),r=n.slice(n.length/2);a=this.forwardLayer.call(e,Object.assign(t,{initialState:s})),i=this.backwardLayer.call(e,Object.assign(t,{initialState:r}))}return this.returnState&&(Array.isArray(a)&&(s=a.slice(1).concat(i.slice(1))),a=a[0],i=i[0]),this.returnSequences&&(i=Xg(i,1)),"concat"===this.mergeMode?r=RA([a,i]):"sum"===this.mergeMode?r=xd(a,i):"ave"===this.mergeMode?r=Ed(.5,xd(a,i)):"mul"===this.mergeMode?r=Ed(a,i):null==this.mergeMode&&(r=[a,i]),this.returnState?null==this.mergeMode?r.concat(s):[r].concat(s):r}))}resetStates(e){this.forwardLayer.resetStates(),this.backwardLayer.resetStates()}build(e){fA(this.forwardLayer.name,(()=>{this.forwardLayer.build(e)})),fA(this.backwardLayer.name,(()=>{this.backwardLayer.build(e)})),this.built=!0}computeMask(e,t){let n;if(Array.isArray(t)&&(t=t[0]),n=this.returnSequences?null==this.mergeMode?[t,t]:t:null==this.mergeMode?[null,null]:null,this.returnState){const e=this.forwardLayer.states.map((e=>null));return Array.isArray(n)?n.concat(e).concat(e):[n].concat(e).concat(e)}return n}get trainableWeights(){return this.forwardLayer.trainableWeights.concat(this.backwardLayer.trainableWeights)}get nonTrainableWeights(){return this.forwardLayer.nonTrainableWeights.concat(this.backwardLayer.nonTrainableWeights)}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),null!=this.forwardLayer&&this.forwardLayer.setFastWeightInitDuringBuild(e),null!=this.backwardLayer&&this.backwardLayer.setFastWeightInitDuringBuild(e)}getConfig(){const e={mergeMode:this.mergeMode},t=super.getConfig();return Object.assign(e,t),e}static fromConfig(e,t){const n=nC(t.layer);if(delete t.layer,null!=t.numConstants)throw new Dw("Deserialization of a Bidirectional layer with numConstants present is not supported yet.");const a=t;return a.layer=n,new e(a)}}c_.className="Bidirectional",Bd(c_);class h_ extends Cx{constructor(e){super(e),this.scale=e.scale,e.offset?this.offset=e.offset:this.offset=0}getConfig(){const e={scale:this.scale,offset:this.offset},t=super.getConfig();return Object.assign(e,t),e}call(e,t){return dh((()=>("float32"!==(e=dx(e)).dtype&&(e=EA(e,"float32")),xd(Ed(e,this.scale),this.offset))))}}h_.className="Rescaling",Bd(h_);const{resizeBilinear:d_,cropAndResize:p_}=tv;class m_ extends Cx{constructor(e){super(e),this.height=e.height,this.width=e.width}centerCrop(e,t,n,a,i,s,r,o){return dh((()=>{let l,u=!1;const c=[t/s,n/r,(a+t)/s,(i+n)/r],h=[];3===e.rank?(u=!0,l=wy([e])):l=e;for(let e=0;eEA(d_(e,[t,n]),a)))}call(e,t){return dh((()=>{const t=dx(e),n=t.dtype,a=t.shape,i=a[a.length-3],s=a[a.length-2];let r=0;i!==this.height&&(r=Math.floor((i-this.height)/2));let o=0;return s!==this.width&&(o=Math.floor((s-this.width)/2),0===o&&(o=1)),r>=0&&o>=0?this.centerCrop(t,r,o,this.height,this.width,i,s,n):this.upsize(e,this.height,this.width,n)}))}getConfig(){const e={height:this.height,width:this.width},t=super.getConfig();return Object.assign(e,t),e}computeOutputShape(e){const t=(e=px(e)).length-3,n=e.length-2;return e[t]=this.height,e[n]=this.width,e}}m_.className="CenterCrop",Bd(m_);class f_ extends Cx{constructor(e){super(e),this.numTokens=e.numTokens,e.outputMode?this.outputMode=e.outputMode:this.outputMode="multiHot"}getConfig(){const e={numTokens:this.numTokens,outputMode:this.outputMode},t=super.getConfig();return Object.assign(e,t),e}computeOutputShape(e){return null==(e=px(e))?[this.numTokens]:"oneHot"===this.outputMode&&1!==e[e.length-1]?(e.push(this.numTokens),e):(e[e.length-1]=this.numTokens,e)}call(e,t){return dh((()=>{let n;if("int32"!==(e=dx(e)).dtype&&(e=EA(e,"int32")),void 0!==t.countWeights){if("count"!==this.outputMode)throw new Rw(`countWeights is not used when outputMode !== count.\n Received countWeights=${t.countWeights}`);n=dx(t.countWeights)}const a=Af(e),i=xf(e),s=Mf(this.numTokens,a).bufferSync().get(0),r=Bf(i,0).bufferSync().get(0);if(!s||!r)throw new Rw(`Input values must be between 0 < values <= numTokens with numTokens=${this.numTokens}`);return function(e,t,n,a){let i=dx(e);if("int32"!==i.dtype&&(i=EA(i,"int32")),"int"===t)return i;const s=i.shape;if(0===i.rank&&(i=If(i,-1)),"oneHot"===t&&1!==i.shape[i.shape.length-1]&&(i=If(i,-1)),i.rank>2)throw new Rw(`When outputMode is not int, maximum output rank is 2 Received outputMode ${t} and input shape ${s} which would result in output rank ${i.rank}.`);const r=["multiHot","oneHot"].includes(t);let o;if(o=ef(i,void 0!==a&&"count"===t?a:[],n,r),"tfIdf"!==t)return o;if(a)return Ed(o,a);throw new Rw("When outputMode is 'tfIdf', weights must be provided.")}(e,this.outputMode,this.numTokens,n)}))}}f_.className="CategoryEncoding",Bd(f_);const g_=new Set(["bilinear","nearest"]);class y_ extends Cx{constructor(e){if(super(e),this.height=e.height,this.width=e.width,e.interpolation){if(!g_.has(e.interpolation))throw new Rw(`Invalid interpolation parameter: ${e.interpolation} is not implemented`);this.interpolation=e.interpolation}else this.interpolation="bilinear";this.cropToAspectRatio=Boolean(e.cropToAspectRatio)}computeOutputShape(e){const t=(e=px(e))[2];return[this.height,this.width,t]}getConfig(){const e={height:this.height,width:this.width,interpolation:this.interpolation,cropToAspectRatio:this.cropToAspectRatio},t=super.getConfig();return Object.assign(e,t),e}call(e,t){return dh((()=>{const t=[this.height,this.width];if("bilinear"===this.interpolation)return tv.resizeBilinear(e,t,!this.cropToAspectRatio);if("nearest"===this.interpolation)return tv.resizeNearestNeighbor(e,t,!this.cropToAspectRatio);throw new Error(`Interpolation is ${this.interpolation} but only ${[...g_]} are supported`)}))}}y_.className="Resizing",Bd(y_);class b_{constructor(e){this.seed=e}next(){if(void 0!==this.seed)return this.seed++}}b_.className="RandomSeed";class v_ extends Cx{constructor(e){super(e),this.randomGenerator=new b_(e.seed)}getConfig(){const e={seed:this.randomGenerator.seed},t=super.getConfig();return Object.assign(e,t),e}}v_.className="BaseRandomLayer";const k_=new Set(["bilinear","nearest"]);class w_ extends v_{constructor(e){super(e);const{factor:t,interpolation:n="bilinear"}=e;if(this.factor=t,Array.isArray(this.factor)&&2===this.factor.length)this.widthLower=this.factor[0],this.widthUpper=this.factor[1];else{if(Array.isArray(this.factor)||!(this.factor>0))throw new Rw(`Invalid factor: ${this.factor}. Must be positive number or tuple of 2 numbers`);this.widthLower=-this.factor,this.widthUpper=this.factor}if(this.widthLower<-1||this.widthUpper<-1)throw new Rw(`factor must have values larger than -1. Got: ${this.factor}`);if(this.widthUpper{const t=dx(e);this.imgHeight=t.shape[t.shape.length-3];const n=t.shape[t.shape.length-2];this.widthFactor=Wg([1],1+this.widthLower,1+this.widthUpper,"float32",this.randomGenerator.next());let a=this.widthFactor.dataSync()[0]*n;a=Math.round(a);const i=[this.imgHeight,a];switch(this.interpolation){case"bilinear":return tv.resizeBilinear(e,i);case"nearest":return tv.resizeNearestNeighbor(e,i);default:throw new Error(`Interpolation is ${this.interpolation}\n but only ${[...k_]} are supported`)}}))}}w_.className="RandomWidth",Bd(w_);var A_,x_,C_;cr().registerFlag("KEEP_INTERMEDIATE_TENSORS",(()=>!1),(e=>{})),(x_=A_||(A_={}))[x_.DT_INVALID=0]="DT_INVALID",x_[x_.DT_FLOAT=1]="DT_FLOAT",x_[x_.DT_DOUBLE=2]="DT_DOUBLE",x_[x_.DT_INT32=3]="DT_INT32",x_[x_.DT_UINT8=4]="DT_UINT8",x_[x_.DT_INT16=5]="DT_INT16",x_[x_.DT_INT8=6]="DT_INT8",x_[x_.DT_STRING=7]="DT_STRING",x_[x_.DT_COMPLEX64=8]="DT_COMPLEX64",x_[x_.DT_INT64=9]="DT_INT64",x_[x_.DT_BOOL=10]="DT_BOOL",x_[x_.DT_QINT8=11]="DT_QINT8",x_[x_.DT_QUINT8=12]="DT_QUINT8",x_[x_.DT_QINT32=13]="DT_QINT32",x_[x_.DT_BFLOAT16=14]="DT_BFLOAT16",x_[x_.DT_QINT16=15]="DT_QINT16",x_[x_.DT_QUINT16=16]="DT_QUINT16",x_[x_.DT_UINT16=17]="DT_UINT16",x_[x_.DT_COMPLEX128=18]="DT_COMPLEX128",x_[x_.DT_HALF=19]="DT_HALF",x_[x_.DT_RESOURCE=20]="DT_RESOURCE",x_[x_.DT_VARIANT=21]="DT_VARIANT",x_[x_.DT_UINT32=22]="DT_UINT32",x_[x_.DT_UINT64=23]="DT_UINT64",x_[x_.DT_FLOAT_REF=101]="DT_FLOAT_REF",x_[x_.DT_DOUBLE_REF=102]="DT_DOUBLE_REF",x_[x_.DT_INT32_REF=103]="DT_INT32_REF",x_[x_.DT_UINT8_REF=104]="DT_UINT8_REF",x_[x_.DT_INT16_REF=105]="DT_INT16_REF",x_[x_.DT_INT8_REF=106]="DT_INT8_REF",x_[x_.DT_STRING_REF=107]="DT_STRING_REF",x_[x_.DT_COMPLEX64_REF=108]="DT_COMPLEX64_REF",x_[x_.DT_INT64_REF=109]="DT_INT64_REF",x_[x_.DT_BOOL_REF=110]="DT_BOOL_REF",x_[x_.DT_QINT8_REF=111]="DT_QINT8_REF",x_[x_.DT_QUINT8_REF=112]="DT_QUINT8_REF",x_[x_.DT_QINT32_REF=113]="DT_QINT32_REF",x_[x_.DT_BFLOAT16_REF=114]="DT_BFLOAT16_REF",x_[x_.DT_QINT16_REF=115]="DT_QINT16_REF",x_[x_.DT_QUINT16_REF=116]="DT_QUINT16_REF",x_[x_.DT_UINT16_REF=117]="DT_UINT16_REF",x_[x_.DT_COMPLEX128_REF=118]="DT_COMPLEX128_REF",x_[x_.DT_HALF_REF=119]="DT_HALF_REF",x_[x_.DT_RESOURCE_REF=120]="DT_RESOURCE_REF",x_[x_.DT_VARIANT_REF=121]="DT_VARIANT_REF",x_[x_.DT_UINT32_REF=122]="DT_UINT32_REF",x_[x_.DT_UINT64_REF=123]="DT_UINT64_REF",function(e){let t;!function(e){e[e.LEGACY=0]="LEGACY",e[e.V1=1]="V1",e[e.V2=2]="V2"}(t=e.CheckpointFormatVersion||(e.CheckpointFormatVersion={}))}(C_||(C_={}));const S_={};function E_(e){return S_[e]}function __(e,t,n,a,i){const s=t.inputParams[e];if(s&&void 0!==s.inputIndexStart){const e=s.inputIndexStart,r=0===s.inputIndexEnd?void 0:void 0===s.inputIndexEnd?e+1:s.inputIndexEnd,o=e<0?t.inputNames.length+e:e;if("tensor"===s.type)return T_(t.inputNames[o],n,a,i);if("tensors"===s.type){const s=t.inputs.slice(e,r);return t.inputNames.slice(e,r).filter(((e,t)=>{var n;return"NoOp"!==(null===(n=s[t])||void 0===n?void 0:n.op)})).map((e=>T_(e,n,a,i)))}const l=T_(t.inputNames[o],n,a,i),u=l.dataSync();return"number"===s.type?u[0]:Js(l.shape,u)}const r=t.attrParams[e];return r&&r.value}function T_(e,t,n,a){const[i,s]=D_(e,n);if(null!=a){const e=a.getHashTableHandleByName(i);if(null!=e)return e}const r=n.currentContextIds.find((e=>!!t[R_(i,e)]));return void 0!==r?t[R_(i,r)][s]:void 0}function I_(e,t,n){return t[R_(e,n.currentContextId)]}function N_(e,t){const[n,a,i]=D_(e,t);return[R_(n,t&&t.currentContextId),a,i]}function R_(e,t){return t?`${e}-${t}`:e}function D_(e,t){if(""===e)return["",0,void 0];const n=null!=t&&null!=t.parseNodeNameCache;if(n){const n=t.parseNodeNameCache.get(e);if(null!=n)return n}const a=e.split(":");let i;if(1===a.length)i=[e,0,void 0];else{const e=a[0],t=3===a.length?a[1]:void 0;i=[e,Number(a[a.length-1]),t]}return n&&t.parseNodeNameCache.set(e,i),i}function z_(e,t,n){let a=__("pad",e,t,n);if("explicit"===a){a=__("explicitPaddings",e,t,n);const i=[[0,0],[0,0],[0,0],[0,0]];for(let e=0;e<4;e++)i[e][0]=a[2*e],i[e][1]=a[2*e+1];return i}return a}function O_(e){return e.kept?e:wd(e)}const M_=[{tfOpName:"Add",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddV2",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddN",category:"arithmetic",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"BiasAdd",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"Sub",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"RealDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Div",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"DivNoNan",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mul",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Maximum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Minimum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Pow",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SquaredDifference",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorMod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],B_=[{tfOpName:"Abs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan2",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Ceil",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ClipByValue",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"clipValueMin",type:"number"},{start:2,name:"clipValueMax",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Complex",category:"basic_math",inputs:[{start:0,name:"real",type:"tensor"},{start:1,name:"imag",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ComplexAbs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Elu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Exp",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Floor",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Imag",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Neg",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Real",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Prelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"alpha",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu6",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Selu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sigmoid",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Rsqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Square",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sign",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Round",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Expm1",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log1p",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Reciprocal",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Softplus",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Erf",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LeakyRelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"alpha",name:"alpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsNan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsFinite",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsInf",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],F_=[{tfOpName:"EmptyTensorList",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"maxNumElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"LoopCond",category:"control",inputs:[{start:0,name:"pred",type:"tensor"}]},{tfOpName:"Switch",category:"control",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"pred",type:"tensor"}]},{tfOpName:"Merge",category:"control",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"Enter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"frame_name",name:"frameName",type:"string"},{tfName:"is_constant",name:"isConstant",type:"bool"}]},{tfOpName:"Exit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NextIteration",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayV3",category:"control",inputs:[{start:0,name:"size",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"dynamic_size",name:"dynamicSize",type:"bool"},{tfName:"clear_after_read",name:"clearAfterRead",type:"bool"},{tfName:"identical_element_shapes",name:"identicalElementShapes",type:"bool"},{tfName:"tensor_array_name",name:"name",type:"string"}]},{tfOpName:"TensorArrayWriteV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayReadV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayGatherV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"}]},{tfOpName:"TensorArrayScatterV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArrayConcatV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape_except0",name:"elementShapeExcept0",type:"shape",notSupported:!0}]},{tfOpName:"TensorArraySplitV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"tensor",type:"tensor"},{start:2,name:"lengths",type:"number[]"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArraySizeV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}]},{tfOpName:"TensorArrayCloseV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"}]},{tfOpName:"StatelessIf",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"If",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"StatelessWhile",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"While",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"TensorListScatter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListScatterV2",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"},{start:3,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGather",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListSetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListReserve",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListFromTensor",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListStack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"},{tfName:"num_elements",name:"numElements",type:"dtype"}]},{tfOpName:"TensorListSplit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"},{start:2,name:"lengths",type:"number[]"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcat",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcatV2",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPopBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPushBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListLength",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}]},{tfOpName:"TensorListResize",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"size",type:"number"}]}],L_=[{tfOpName:"AvgPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[],notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPoolWithArgmax",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"include_batch_in_index",name:"includeBatchInIndex",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AvgPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Conv1D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"stride",name:"stride",type:"number"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NWC"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"dilation",name:"dilation",type:"number",defaultValue:1}]},{tfOpName:"Conv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"useCudnnOnGpu",name:"useCudnnOnGpu",type:"bool"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"_FusedConv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"use_cudnn_on_gpu",name:"useCudnnOnGpu",type:"bool",defaultValue:!0},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2}]},{tfOpName:"Conv2DBackpropInput",category:"convolution",inputs:[{start:2,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:0,name:"outputShape",type:"number[]"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]",notSupported:!0}]},{tfOpName:"DepthwiseConv2d",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"DepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"FusedDepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]}]},{tfOpName:"Conv3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"Dilation2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"rates",name:"dilations",type:"number[]"},{tfName:"padding",name:"pad",type:"string"}]}],P_=[{tfOpName:"Fill",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"},{start:1,name:"value",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"LinSpace",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"num",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"OneHot",category:"creation",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"depth",type:"number"},{start:2,name:"onValue",type:"number",defaultValue:1},{start:3,name:"offValue",type:"number",defaultValue:0}],attrs:[{tfName:"axis",name:"axis",type:"number",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Ones",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"OnesLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"RandomStandardNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"RandomUniform",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"minval",name:"minval",type:"number",defaultValue:0},{tfName:"maxval",name:"maxval",type:"number",defaultValue:1},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"RandomUniformInt",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"minval",name:"minval",type:"number"},{tfName:"maxval",name:"maxval",type:"number"},{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0}]},{tfOpName:"Range",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"step",type:"number",defaultValue:0}],attrs:[{tfName:"Tidx",name:"dtype",type:"dtype"}]},{tfOpName:"TruncatedNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"means",name:"mean",type:"number",defaultValue:0},{tfName:"stddev",name:"stdDev",type:"number",defaultValue:1},{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Zeros",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"ZerosLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Multinomial",category:"creation",inputs:[{start:0,name:"logits",type:"tensor"},{start:1,name:"numSamples",type:"number"}],attrs:[{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number"},{tfName:"T",name:"dtype",type:"dtype"},{tfName:"output_dtype",name:"output_dtype",type:"dtype"}]}],j_=[{tfOpName:"NonMaxSuppressionV2",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV3",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV4",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"T_threshold",name:"threshold",type:"dtype",notSupported:!0},{tfName:"pad_to_max_output_size",name:"padToMaxOutputSize",type:"bool"}]},{tfOpName:"NonMaxSuppressionV5",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"},{start:5,name:"softNmsSigma",type:"number"}]},{tfOpName:"Where",category:"dynamic",inputs:[{start:0,name:"condition",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ListDiff",category:"dynamic",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],V_=[{tfOpName:"LowerBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"TopKV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"k",type:"number"}],attrs:[{tfName:"sorted",name:"sorted",type:"bool"}]},{tfOpName:"UpperBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"Unique",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"UniqueV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]}],U_=[{tfOpName:"PlaceholderWithDefault",category:"graph",inputs:[{start:0,name:"default",type:"tensor"}],attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Placeholder",category:"graph",attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Const",category:"graph"},{tfOpName:"Identity",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IdentityN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Snapshot",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Rank",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Size",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Shape",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"ShapeN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Print",category:"graph",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"data",type:"tensors"}],attrs:[{tfName:"message",name:"message",type:"string"},{tfName:"first_n",name:"firstN",type:"number",notSupported:!0},{tfName:"summarize",name:"summarize",type:"number",defaultValue:3}]},{tfOpName:"NoOp",category:"graph",inputs:[]},{tfOpName:"StopGradient",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"FakeQuantWithMinMaxVars",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"min",name:"min",type:"number"},{tfName:"max",name:"max",type:"number"}]}],W_=[{tfOpName:"HashTable",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"HashTableV2",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"LookupTableImport",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableImportV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFind",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFindV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableSize",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]},{tfOpName:"LookupTableSizeV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]},{tfOpName:"InitializeTable",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}]},{tfOpName:"InitializeTableV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}]}],G_=[{tfOpName:"ResizeBilinear",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ResizeNearestNeighbor",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"CropAndResize",category:"image",inputs:[{start:0,name:"image",type:"tensor"},{start:1,name:"boxes",type:"tensor"},{start:2,name:"boxInd",type:"tensor"},{start:3,name:"cropSize",type:"number[]"}],attrs:[{tfName:"method",name:"method",type:"string"},{tfName:"extrapolation_value",name:"extrapolationValue",type:"number"}]},{tfOpName:"ImageProjectiveTransformV3",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"transforms",type:"tensor"},{start:2,name:"outputShape",type:"number[]"},{start:3,name:"fillValue",type:"number"}],attrs:[{tfName:"interpolation",name:"interpolation",type:"string"},{tfName:"fill_mode",name:"fillMode",type:"string"}]}],q_=[{tfOpName:"Equal",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NotEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Greater",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"GreaterEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Less",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LessEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalAnd",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalNot",category:"logical",inputs:[{start:0,name:"a",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalOr",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Select",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SelectV2",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BitwiseAnd",category:"logical",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}]}],H_=[{tfOpName:"_FusedMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMulV2",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Transpose",category:"matrices",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"perm",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Einsum",category:"matrices",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"equation",name:"equation",type:"string"},{tfName:"N",name:"n",type:"number",defaultValue:2},{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"MatrixBandPart",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"numLower",type:"tensor"},{start:1,name:"numUpper",type:"tensor"}]}],K_=[{tfOpName:"EuclideanNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool",defaultValue:!1}]},{tfOpName:"FusedBatchNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV2",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV3",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"LRN",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"depth_radius",name:"radius",type:"number",defaultValue:5},{tfName:"bias",name:"bias",type:"number",defaultValue:1},{tfName:"alpha",name:"alpha",type:"number",defaultValue:1},{tfName:"beta",name:"beta",type:"number",defaultValue:.5}]},{tfOpName:"Softmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"LogSoftmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]}],$_=[{tfOpName:"Bincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}]},{tfOpName:"DenseBincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}],attrs:[{tfName:"binary_output",name:"binaryOutput",type:"bool"}]},{tfOpName:"Max",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Mean",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Min",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Sum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"All",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Any",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"ArgMax",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"ArgMin",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"Prod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cumprod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]},{tfOpName:"Cumsum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]}],Z_=[{tfOpName:"ConcatV2",category:"slice_join",inputs:[{start:0,end:-1,name:"tensors",type:"tensors"},{start:-1,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"Concat",category:"slice_join",inputs:[{start:1,end:0,name:"tensors",type:"tensors"},{start:0,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"GatherV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"axis",type:"number",defaultValue:0}],attrs:[{tfName:"batch_dims",name:"batchDims",type:"number",defaultValue:0}]},{tfOpName:"Gather",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",notSupported:!0}]},{tfOpName:"Reverse",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"dims",type:"bool[]"}]},{tfOpName:"ReverseV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}]},{tfOpName:"Slice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"size",type:"number[]"}]},{tfOpName:"StridedSlice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"end",type:"number[]"},{start:3,name:"strides",type:"number[]"}],attrs:[{tfName:"begin_mask",name:"beginMask",type:"number",defaultValue:0},{tfName:"end_mask",name:"endMask",type:"number",defaultValue:0},{tfName:"new_axis_mask",name:"newAxisMask",type:"number",defaultValue:0},{tfName:"ellipsis_mask",name:"ellipsisMask",type:"number",defaultValue:0},{tfName:"shrink_axis_mask",name:"shrinkAxisMask",type:"number",defaultValue:0}]},{tfOpName:"Pack",category:"slice_join",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0}]},{tfOpName:"Unpack",category:"slice_join",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0},{tfName:"num",name:"num",type:"number",defaultValue:0,notSupported:!0}]},{tfOpName:"Tile",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"reps",type:"number[]"}]},{tfOpName:"Split",category:"slice_join",inputs:[{start:0,name:"axis",type:"number",defaultValue:0},{start:1,name:"x",type:"tensor"}],attrs:[{tfName:"num_split",name:"numOrSizeSplits",type:"number",defaultValue:1}]},{tfOpName:"SplitV",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"numOrSizeSplits",type:"number[]"},{start:2,name:"axis",type:"number",defaultValue:0}]},{tfOpName:"ScatterNd",category:"slice_join",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"shape",type:"number[]"}]},{tfOpName:"GatherNd",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}]},{tfOpName:"SparseToDense",category:"slice_join",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!1,notSupported:!0}]},{tfOpName:"TensorScatterUpdate",category:"slice_join",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"values",type:"tensor"}]}],X_=[{tfOpName:"SparseFillEmptyRows",category:"sparse",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"denseShape",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}]},{tfOpName:"SparseReshape",category:"sparse",inputs:[{start:0,name:"inputIndices",type:"tensor"},{start:1,name:"inputShape",type:"tensor"},{start:2,name:"newShape",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SparseSegmentMean",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]},{tfOpName:"SparseSegmentSum",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]}],Y_=[{tfOpName:"FFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"RFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]},{tfOpName:"IRFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]}],Q_=[{tfOpName:"StaticRegexReplace",category:"string",inputs:[{start:0,name:"input",type:"tensor"}],attrs:[{tfName:"pattern",name:"pattern",type:"string"},{tfName:"rewrite",name:"rewrite",type:"string"},{tfName:"replace_global",name:"replaceGlobal",type:"bool"}]},{tfOpName:"StringNGrams",category:"string",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"dataSplits",type:"tensor"}],attrs:[{tfName:"separator",name:"separator",type:"string"},{tfName:"ngram_widths",name:"nGramWidths",type:"number[]"},{tfName:"left_pad",name:"leftPad",type:"string"},{tfName:"right_pad",name:"rightPad",type:"string"},{tfName:"pad_width",name:"padWidth",type:"number"},{tfName:"preserve_short_sequences",name:"preserveShortSequences",type:"bool"}],outputs:["ngrams","ngrams_splits"]},{tfOpName:"StringSplit",category:"string",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"delimiter",type:"tensor"}],attrs:[{tfName:"skip_empty",name:"skipEmpty",type:"bool"}],outputs:["indices","values","shape"]},{tfOpName:"StringToHashBucketFast",category:"string",inputs:[{start:0,name:"input",type:"tensor"}],attrs:[{tfName:"num_buckets",name:"numBuckets",type:"number"}]}],J_=[{tfOpName:"Cast",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"SrcT",name:"sdtype",type:"dtype",notSupported:!0},{tfName:"DstT",name:"dtype",type:"dtype"}]},{tfOpName:"ExpandDims",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"MirrorPad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"mode",name:"mode",type:"string"}]},{tfOpName:"Pad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"constant_value",name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"PadV2",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"},{start:2,name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"Reshape",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}]},{tfOpName:"EnsureShape",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}]},{tfOpName:"Squeeze",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"axis",tfDeprecatedName:"squeeze_dims",name:"axis",type:"number[]"}]},{tfOpName:"SpaceToBatchND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"paddings",type:"number[]"}]},{tfOpName:"BatchToSpaceND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"crops",type:"number[]"}]},{tfOpName:"DepthToSpace",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"block_size",name:"blockSize",type:"number"},{tfName:"data_format",name:"dataFormat",type:"string"}]},{tfOpName:"BroadcastTo",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}],attrs:[]},{tfOpName:"BroadcastArgs",category:"transformation",inputs:[{start:0,name:"s0",type:"tensor"},{start:1,name:"s1",type:"tensor"}],attrs:[]}];class eT{static get Instance(){return this._instance||(this._instance=new this)}constructor(){const e=[].concat(...[s,r,o,l,u,c,h,d,p,m,f,g,y,b,v,k,w,A,x].map((e=>e.json)));this.opMappers=e.reduce(((e,t)=>(e[t.tfOpName]=t,e)),{})}transformGraph(e,t={}){const n=e.node,a=[],i=[],s=[],r=n.reduce(((e,t)=>(e[t.name]=this.mapNode(t),t.op.startsWith("Placeholder")?a.push(e[t.name]):"Const"===t.op?i.push(e[t.name]):null!=t.input&&0!==t.input.length||s.push(e[t.name]),e)),{});let o=[];const l=[];let u={},c={};null!=t&&(u=this.mapSignatureEntries(t.inputs),c=this.mapSignatureEntries(t.outputs));const h=Object.keys(r);h.forEach((e=>{const t=r[e];t.inputNames.forEach(((e,n)=>{const[a,,i]=N_(e),s=r[a];if(null!=s.outputs){const e=s.outputs.indexOf(i);if(-1!==e){const i=`${a}:${e}`;t.inputNames[n]=i}}t.inputs.push(s),s.children.push(t)}))})),0===Object.keys(c).length?h.forEach((e=>{const t=r[e];0===t.children.length&&l.push(t)})):Object.keys(c).forEach((e=>{const[t]=N_(e),n=r[t];null!=n&&(n.signatureKey=c[e],l.push(n))})),Object.keys(u).length>0?Object.keys(u).forEach((e=>{const[t]=N_(e),n=r[t];n&&(n.signatureKey=u[e],o.push(n))})):o=a;let d={};null!=e.library&&null!=e.library.function&&(d=e.library.function.reduce(((e,t)=>(e[t.signature.name]=this.mapFunction(t),e)),{}));const p={nodes:r,inputs:o,outputs:l,weights:i,placeholders:a,signature:t,functions:d};return s.length>0&&(p.initNodes=s),p}mapSignatureEntries(e){return Object.keys(e||{}).reduce(((t,n)=>(t[e[n].name]=n,t)),{})}mapNode(e){const t=E_(e.op)||this.opMappers[e.op]||{};null==e.attr&&(e.attr={});const n={name:e.name,op:e.op,category:t.category,inputNames:(e.input||[]).map((e=>e.startsWith("^")?e.slice(1):e)),inputs:[],children:[],inputParams:{},attrParams:{},rawAttrs:e.attr,outputs:t.outputs};return null!=t.inputs&&(n.inputParams=t.inputs.reduce(((e,t)=>(e[t.name]={type:t.type,inputIndexStart:t.start,inputIndexEnd:t.end},e)),{})),null!=t.attrs&&(n.attrParams=t.attrs.reduce(((t,n)=>{const a=n.type;let i;switch(n.type){case"string":i=nT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=nT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"string[]":i=dT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=dT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"number":i=iT(e.attr,n.tfName,n.defaultValue||0),void 0===i&&n.tfDeprecatedName&&(i=iT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"number[]":i=hT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=hT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"bool":i=aT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=aT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"bool[]":i=mT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=mT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"shape":i=cT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=cT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"shape[]":i=pT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=pT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"dtype":i=oT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=oT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"dtype[]":i=lT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=lT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"func":i=rT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=rT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"tensor":case"tensors":break;default:throw new Error(`Unsupported param type: ${n.type} for op: ${e.op}`)}return t[n.name]={value:i,type:a},t}),{})),n}mapFunction(e){const t=e.nodeDef,n=[];let a={};null!=t&&(a=t.reduce(((e,t)=>(e[t.name]=this.mapNode(t),"Const"===t.op&&n.push(e[t.name]),e)),{}));const i=[],s=[];e.signature.inputArg.forEach((e=>{const[t]=N_(e.name),n={name:t,op:"Placeholder",inputs:[],inputNames:[],category:"graph",inputParams:{},attrParams:{dtype:{value:sT(e.type),type:"dtype"}},children:[]};n.signatureKey=e.name,i.push(n),a[t]=n}));Object.keys(a).forEach((e=>{const t=a[e];t.inputNames.forEach(((e,n)=>{const[i,,s]=N_(e),r=a[i];if(null!=r.outputs){const e=r.outputs.indexOf(s);if(-1!==e){const a=`${i}:${e}`;t.inputNames[n]=a}}t.inputs.push(r),r.children.push(t)}))}));const r=e.ret;e.signature.outputArg.forEach((e=>{const[t,n]=N_(r[e.name]),i=a[t];null!=i&&(i.defaultOutput=n,s.push(i))}));const o=this.mapArgsToSignature(e);return{nodes:a,inputs:i,outputs:s,weights:n,placeholders:[],signature:o}}mapArgsToSignature(e){return{methodName:e.signature.name,inputs:e.signature.inputArg.reduce(((e,t)=>(e[t.name]=this.mapArgToTensorInfo(t),e)),{}),outputs:e.signature.outputArg.reduce(((t,n)=>(t[n.name]=this.mapArgToTensorInfo(n,e.ret),t)),{})}}mapArgToTensorInfo(e,t){let n=e.name;return null!=t&&(n=t[n]),{name:n,dtype:e.type}}}function tT(e,t){const n=Array.isArray(e)?String.fromCharCode.apply(null,e):function(e){const t=cr().global;if(void 0!==t.atob)return t.atob(e);if("undefined"!=typeof Buffer)return new Buffer(e,"base64").toString();throw new Error("Unable to decode base64 in this environment. Missing built-in atob() or Buffer()")}(e);return t?n:n.toLowerCase()}function nT(e,t,n,a=!1){const i=e[t];return null!=i?tT(i.s,a):n}function aT(e,t,n){const a=e[t];return a?a.b:n}function iT(e,t,n){const a=e[t]||{},i=null!=a.i?a.i:null!=a.f?a.f:n;return"number"==typeof i?i:parseInt(i,10)}function sT(e){switch("string"==typeof e&&(e=A_[e]),e){case A_.DT_FLOAT:case A_.DT_HALF:return"float32";case A_.DT_INT32:case A_.DT_INT64:case A_.DT_INT8:case A_.DT_UINT8:return"int32";case A_.DT_BOOL:return"bool";case A_.DT_DOUBLE:return"float32";case A_.DT_STRING:return"string";case A_.DT_COMPLEX64:case A_.DT_COMPLEX128:return"complex64";default:return null}}function rT(e,t,n){const a=e[t];return a&&a.func?a.func.name:n}function oT(e,t,n){const a=e[t];return a&&a.type?sT(a.type):n}function lT(e,t,n){const a=e[t];return a&&a.list&&a.list.type?a.list.type.map((e=>sT(e))):n}function uT(e){if(!e.unknownRank)return null!=e.dim?e.dim.map((e=>"number"==typeof e.size?e.size:parseInt(e.size,10))):[]}function cT(e,t,n){const a=e[t];return a&&a.shape?uT(a.shape):n}function hT(e,t,n){const a=e[t];return a?((a.list.f&&a.list.f.length?a.list.f:a.list.i)||[]).map((e=>"number"==typeof e?e:parseInt(e,10))):n}function dT(e,t,n,a=!1){const i=e[t];return i&&i.list&&i.list.s?i.list.s.map((e=>tT(e,a))):n}function pT(e,t,n){const a=e[t];return a&&a.list&&a.list.shape?a.list.shape.map((e=>uT(e))):n}function mT(e,t,n){const a=e[t];return a&&a.list&&a.list.b?a.list.b:n}class fT{constructor(e,t,n){this.node=e,this.tensorMap=t,this.context=n,this.inputs=[],this.attrs={},this.inputs=e.inputNames.map((e=>this.getInput(e))),null!=e.rawAttrs&&(this.attrs=Object.keys(e.rawAttrs).reduce(((e,t)=>(e[t]=this.getAttr(t),e)),{}))}getInput(e){return T_(e,this.tensorMap,this.context)}getAttr(e,t){const n=this.node.rawAttrs[e];if(null!=n.tensor)return T_(e,this.tensorMap,this.context);if(null!=n.i||null!=n.f)return iT(this.node.rawAttrs,e,t);if(null!=n.s)return nT(this.node.rawAttrs,e,t);if(null!=n.b)return aT(this.node.rawAttrs,e,t);if(null!=n.shape)return cT(this.node.rawAttrs,e,t);if(null!=n.type)return oT(this.node.rawAttrs,e,t);if(null!=n.list){if(null!=n.list.i||null!=n.list.f)return hT(this.node.rawAttrs,e,t);if(null!=n.list.s)return dT(this.node.rawAttrs,e,t);if(null!=n.list.shape)return pT(this.node.rawAttrs,e,t);if(null!=n.list.b)return mT(this.node.rawAttrs,e,t);if(null!=n.list.type)return lT(this.node.rawAttrs,e,t)}return t}}function gT(e,t,n=""){if("number"!=typeof e&&"number"!=typeof t){Ns(e.length===t.length,(()=>n+` Shapes ${e} and ${t} must match`));for(let a=0;an+` Shapes ${e} and ${t} must match`))}}}function yT(e){return"number"!=typeof e&&!e.some((e=>e<0))}function bT(e,t,n){let a=vT(e,n);const i=!yT(a);if(i&&0===t.length)throw new Error(`Tried to calculate elements of an empty list with non-fully-defined elementShape: ${a}`);if(i&&t.forEach((e=>{a=vT(e.shape,a)})),!yT(a))throw new Error(`Non-fully-defined elementShape: ${a}`);return a}function vT(e,t){if("number"==typeof e)return t;if("number"==typeof t)return e;if(e.length!==t.length)throw new Error(`Incompatible ranks during merge: ${e} vs. ${t}`);const n=[];for(let a=0;a=0&&s>=0&&i!==s)throw new Error(`Incompatible shape during merge: ${e} vs. ${t}`);n[a]=i>=0?i:s}return n}class kT{constructor(e,t,n,a,i,s,r){this.name=e,this.dtype=t,this.maxSize=n,this.elementShape=a,this.identicalElementShapes=i,this.dynamicSize=s,this.clearAfterRead=r,this.tensors=[],this.closed_=!1,this.idTensor=Rd(0),mh(this.idTensor)}get id(){return this.idTensor.id}get closed(){return this.closed_}clearAndClose(e){this.tensors.forEach((t=>{null!=e&&e.has(t.tensor.id)||t.tensor.dispose()})),this.tensors=[],this.closed_=!0,this.idTensor.dispose()}size(){return this.tensors.length}read(e){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||e>=this.size())throw new Error(`Tried to read from index ${e}, but array size is: ${this.size()}`);const t=this.tensors[e];if(t.cleared)throw new Error(`TensorArray ${this.name}: Could not read index ${e} twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).`);return this.clearAfterRead&&(t.cleared=!0),t.read=!0,t.tensor}readMany(e){return e.map((e=>this.read(e)))}write(e,t){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||!this.dynamicSize&&e>=this.maxSize)throw new Error(`Tried to write to index ${e}, but array is not resizeable and size is: ${this.maxSize}`);const n=this.tensors[e]||{};if(t.dtype!==this.dtype)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e},\n because the value dtype is ${t.dtype}, but TensorArray dtype is ${this.dtype}.`);if(0!==this.size()||null!=this.elementShape&&0!==this.elementShape.length||(this.elementShape=t.shape),gT(this.elementShape,t.shape,`TensorArray ${this.name}: Could not write to TensorArray index ${e}.`),n.read)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been read.`);if(n.written)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been written.`);n.tensor=t,mh(t),n.written=!0,this.tensors[e]=n}writeMany(e,t){if(e.length!==t.length)throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${e.length} is not the same as tensors size: ${t.length}.`);e.forEach(((e,n)=>this.write(e,t[n])))}gather(e,t){if(t&&t!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${t}`);if(e)e=e.slice(0,this.size());else{e=[];for(let t=0;t=this.maxSize)throw new Error(`Max index must be < array size (${n} vs. ${this.maxSize})`);this.writeMany(e,Ly(t,0))}split(e,t){if(t.dtype!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t.dtype}`);let n=0;const a=e.map((e=>(n+=e,n)));if(n!==t.shape[0])throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${n}, and tensor's shape is: ${t.shape}`);if(!this.dynamicSize&&e.length!==this.maxSize)throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${e.length}), and the TensorArray is not marked as dynamically resizeable`);const i=0===n?0:t.size/n,s=[];dh((()=>{t=vm(t,[1,n,i]);for(let n=0;n{if(n!==e.dtype)throw new Error(`Invalid data types; op elements ${n}, but list elements ${e.dtype}`);gT(t,e.shape,"TensorList shape mismatch: "),mh(e)})),this.idTensor=Rd(0),this.maxNumElements=a,mh(this.idTensor)}copy(){return new wT([...this.tensors],this.elementShape,this.elementDtype)}clearAndClose(e){this.tensors.forEach((t=>{null!=e&&e.has(t.id)||t.dispose()})),this.tensors.length=0,this.idTensor.dispose()}size(){return this.tensors.length}stack(e,t,n=-1){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(-1!==n&&this.tensors.length!==n)throw new Error(`Operation expected a list with ${n} elements but got a list with ${this.tensors.length} elements.`);gT(e,this.elementShape,"TensorList shape mismatch: ");const a=bT(this.elementShape,this.tensors,e);return dh((()=>{const e=this.tensors.map((e=>vm(e,a)));return wy(e,0)}))}popBack(e,t){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(0===this.size())throw new Error("Trying to pop from an empty list.");const n=bT(this.elementShape,this.tensors,e),a=this.tensors.pop();return a.kept=!1,gT(a.shape,e,"TensorList shape mismatch: "),vm(a,n)}pushBack(e){if(e.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${this.elementDtype}`);if(gT(e.shape,this.elementShape,"TensorList shape mismatch: "),this.maxNumElements===this.size())throw new Error("Trying to push element into a full list.");mh(e),this.tensors.push(e)}resize(e){if(e<0)throw new Error(`TensorListResize expects size to be non-negative. Got: ${e}`);if(-1!==this.maxNumElements&&e>this.maxNumElements)throw new Error(`TensorListResize input size ${e} is greater maxNumElement ${this.maxNumElements}.`);const t=new wT([],this.elementShape,this.elementDtype,this.maxNumElements);t.tensors.length=e;for(let n=0;nthis.tensors.length)throw new Error(`Trying to access element ${e} in a list with ${this.tensors.length} elements.`);if(null==this.tensors[e])throw new Error(`element at index ${e} is null.`);gT(this.tensors[e].shape,t,"TensorList shape mismatch: ");const a=bT(this.elementShape,this.tensors,t);return vm(this.tensors[e],a)}setItem(e,t){if(t.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t.dtype}, but list elements ${this.elementDtype}`);if(e<0||-1!==this.maxNumElements&&e>=this.maxNumElements)throw new Error(`Trying to set element ${e} in a list with max ${this.maxNumElements} elements.`);gT(this.elementShape,t.shape,"TensorList shape mismatch: "),mh(t),null!=this.tensors[e]&&(this.tensors[e].kept=!1),this.tensors[e]=t}gather(e,t,n){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);gT(this.elementShape,n,"TensorList shape mismatch: "),e=e.slice(0,this.size());const a=bT(this.elementShape,this.tensors,n);return 0===e.length?oh([],[0].concat(a)):dh((()=>{const t=e.map((e=>vm(this.tensors[e],a)));return wy(t,0)}))}concat(e,t){if(e&&e!==this.elementDtype)throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${e}`);gT(this.elementShape,t,"TensorList shape mismatch: ");const n=bT(this.elementShape,this.tensors,t);return 0===this.size()?oh([],[0].concat(n)):dh((()=>{const e=this.tensors.map((e=>vm(e,n)));return Am(e,0)}))}}const AT=async(e,t,n)=>{switch(e.op){case"If":case"StatelessIf":{const a=__("thenBranch",e,t,n),i=__("elseBranch",e,t,n),s=__("cond",e,t,n),r=__("args",e,t,n);return(await s.data())[0]?n.functionMap[a].executeFunctionAsync(r,n.tensorArrayMap,n.tensorListMap):n.functionMap[i].executeFunctionAsync(r,n.tensorArrayMap,n.tensorListMap)}case"While":case"StatelessWhile":{const a=__("body",e,t,n),i=__("cond",e,t,n),s=__("args",e,t,n),r=await n.functionMap[i].executeFunctionAsync(s,n.tensorArrayMap,n.tensorListMap),o=s.map((e=>e.id));let l=await r[0].data();r.forEach((e=>{e.kept||-1!==o.indexOf(e.id)||e.dispose()}));let u=s;for(;l[0];){const e=u;u=await n.functionMap[a].executeFunctionAsync(u,n.tensorArrayMap,n.tensorListMap);const t=u.map((e=>e.id));e.forEach((e=>{e.kept||-1!==o.indexOf(e.id)||-1!==t.indexOf(e.id)||e.dispose()}));const s=await n.functionMap[i].executeFunctionAsync(u,n.tensorArrayMap,n.tensorListMap);l=await s[0].data(),s.forEach((e=>{e.kept||-1!==o.indexOf(e.id)||-1!==t.indexOf(e.id)||e.dispose()}))}return u}case"LoopCond":return[O_(__("pred",e,t,n))];case"Switch":{const a=__("pred",e,t,n);let i=__("data",e,t,n);return i.kept||(i=O_(i)),(await a.data())[0]?[void 0,i]:[i,void 0]}case"Merge":{const a=e.inputNames.find((e=>void 0!==T_(e,t,n)));if(a){return[O_(T_(a,t,n))]}return}case"Enter":{const a=__("frameName",e,t,n),i=__("tensor",e,t,n);return n.enterFrame(a),[O_(i)]}case"Exit":{const a=__("tensor",e,t,n);return n.exitFrame(),[O_(a)]}case"NextIteration":{const a=__("tensor",e,t,n);return n.nextIteration(),[O_(a)]}case"TensorArrayV3":{const a=__("size",e,t,n),i=__("dtype",e,t,n),s=__("elementShape",e,t,n),r=__("dynamicSize",e,t,n),o=__("clearAfterRead",e,t,n),l=__("identicalElementShapes",e,t,n),u=__("name",e,t,n),c=new kT(u,i,a,s,l,r,o);return n.addTensorArray(c),[c.idTensor,Rd(1)]}case"TensorArrayWriteV3":{const a=__("tensorArrayId",e,t,n),i=__("index",e,t,n),s=__("tensor",e,t,n),r=n.getTensorArray(a.id);return r.write(i,s),[r.idTensor]}case"TensorArrayReadV3":{const a=__("tensorArrayId",e,t,n),i=__("index",e,t,n);return[n.getTensorArray(a.id).read(i)]}case"TensorArrayGatherV3":{const a=__("tensorArrayId",e,t,n),i=__("indices",e,t,n),s=__("dtype",e,t,n);return[n.getTensorArray(a.id).gather(i,s)]}case"TensorArrayScatterV3":{const a=__("tensorArrayId",e,t,n),i=__("indices",e,t,n),s=__("tensor",e,t,n),r=n.getTensorArray(a.id);return r.scatter(i,s),[r.idTensor]}case"TensorArrayConcatV3":{const a=__("tensorArrayId",e,t,n),i=n.getTensorArray(a.id),s=__("dtype",e,t,n);return[i.concat(s)]}case"TensorArraySplitV3":{const a=__("tensorArrayId",e,t,n),i=__("tensor",e,t,n),s=__("lengths",e,t,n),r=n.getTensorArray(a.id);return r.split(s,i),[r.idTensor]}case"TensorArraySizeV3":{const a=__("tensorArrayId",e,t,n);return[Rd(n.getTensorArray(a.id).size(),"int32")]}case"TensorArrayCloseV3":{const a=__("tensorArrayId",e,t,n),i=n.getTensorArray(a.id);return i.clearAndClose(),[i.idTensor]}case"TensorListSetItem":{const a=__("tensorListId",e,t,n),i=__("index",e,t,n),s=__("tensor",e,t,n),r=n.getTensorList(a.id);return r.setItem(i,s),[r.idTensor]}case"TensorListGetItem":{const a=__("tensorListId",e,t,n),i=__("index",e,t,n),s=__("elementShape",e,t,n),r=__("elementDType",e,t,n);return[n.getTensorList(a.id).getItem(i,s,r)]}case"TensorListScatterV2":case"TensorListScatter":{const a=__("indices",e,t,n),i=function(e,t,n,a){if(t.length!==e.shape[0])throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${t.length} vs. ${e.shape[0]}`);const i=Math.max(...t);if(null!=a&&-1!==a&&i>=a)throw new Error(`Max index must be < array size (${i} vs. ${a})`);const s=new wT([],n,e.dtype,a),r=Ly(e,0);return t.forEach(((e,t)=>{s.setItem(e,r[t])})),s}(__("tensor",e,t,n),a,__("elementShape",e,t,n),__("numElements",e,t,n));return n.addTensorList(i),[i.idTensor]}case"TensorListReserve":case"EmptyTensorList":{const a=__("elementShape",e,t,n),i=__("elementDType",e,t,n);let s;s="TensorListReserve"===e.op?"numElements":"maxNumElements";const r=__(s,e,t,n),o=function(e,t,n,a){return new wT([],e,t,a)}(a,i,0,"TensorListReserve"===e.op?-1:r);return n.addTensorList(o),[o.idTensor]}case"TensorListGather":{const a=__("tensorListId",e,t,n),i=__("indices",e,t,n),s=__("elementShape",e,t,n),r=__("elementDType",e,t,n);return[n.getTensorList(a.id).gather(i,r,s)]}case"TensorListStack":{const a=__("tensorListId",e,t,n),i=__("elementShape",e,t,n),s=__("elementDType",e,t,n),r=__("numElements",e,t,n);return[n.getTensorList(a.id).stack(i,s,r)]}case"TensorListFromTensor":{const a=function(e,t,n){const a=e.dtype;if(e.shape.length<1)throw new Error(`Tensor must be at least a vector, but saw shape: ${e.shape}`);if(e.dtype!==n)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${n}`);gT(e.shape.slice(1),t,"TensorList shape mismatch: ");const i=Ly(e);return new wT(i,t,a)}(__("tensor",e,t,n),__("elementShape",e,t,n),__("elementDType",e,t,n));return n.addTensorList(a),[a.idTensor]}case"TensorListConcat":case"TensorListConcatV2":{const a=__("tensorListId",e,t,n),i=n.getTensorList(a.id),s=__("dtype",e,t,n),r=__("elementShape",e,t,n);return[i.concat(s,r)]}case"TensorListPushBack":{const a=__("tensorListId",e,t,n),i=__("tensor",e,t,n),s=n.getTensorList(a.id);return s.pushBack(i),[s.idTensor]}case"TensorListPopBack":{const a=__("tensorListId",e,t,n),i=__("elementShape",e,t,n),s=__("elementDType",e,t,n);return[n.getTensorList(a.id).popBack(i,s)]}case"TensorListSplit":{const a=__("tensor",e,t,n),i=__("elementShape",e,t,n),s=function(e,t,n){let a=0;const i=t.map((e=>(a+=e,a)));if(a!==e.shape[0])throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${a}, and tensor's shape is: ${e.shape}`);const s=vT(e.shape.slice(1),n),r=0===a?0:e.size/a,o=dh((()=>{const n=[];e=vm(e,[1,a,r]);for(let a=0;ae.dispose())),this.tensorMap.clear(),this.handle.dispose()}size(){return this.tensorMap.size}tensorSize(){return Rd(this.size(),"int32")}async import(e,t){this.checkKeyAndValueTensor(e,t);const n=await e.data();return this.tensorMap.forEach((e=>e.dispose())),this.tensorMap.clear(),dh((()=>{const e=Ly(t),a=n.length,i=e.length;Ns(a===i,(()=>`The number of elements doesn't match, keys has ${a} elements, the values has ${i} elements.`));for(let t=0;t{const e=[];for(let a=0;a{switch(e.category){case"arithmetic":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"BiasAdd":case"AddV2":case"Add":return[a.add(__("a",e,t,n),__("b",e,t,n))];case"AddN":return[a.addN(__("tensors",e,t,n))];case"FloorMod":case"Mod":return[a.mod(__("a",e,t,n),__("b",e,t,n))];case"Mul":return[a.mul(__("a",e,t,n),__("b",e,t,n))];case"RealDiv":case"Div":return[a.div(__("a",e,t,n),__("b",e,t,n))];case"DivNoNan":return[a.divNoNan(__("a",e,t,n),__("b",e,t,n))];case"FloorDiv":return[a.floorDiv(__("a",e,t,n),__("b",e,t,n))];case"Sub":return[a.sub(__("a",e,t,n),__("b",e,t,n))];case"Minimum":return[a.minimum(__("a",e,t,n),__("b",e,t,n))];case"Maximum":return[a.maximum(__("a",e,t,n),__("b",e,t,n))];case"Pow":return[a.pow(__("a",e,t,n),__("b",e,t,n))];case"SquaredDifference":return[a.squaredDifference(__("a",e,t,n),__("b",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"basic_math":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Abs":case"ComplexAbs":return[a.abs(__("x",e,t,n))];case"Acos":return[a.acos(__("x",e,t,n))];case"Acosh":return[a.acosh(__("x",e,t,n))];case"Asin":return[a.asin(__("x",e,t,n))];case"Asinh":return[a.asinh(__("x",e,t,n))];case"Atan":return[a.atan(__("x",e,t,n))];case"Atan2":return[a.atan2(__("x",e,t,n),__("y",e,t,n))];case"Atanh":return[a.atanh(__("x",e,t,n))];case"Ceil":return[a.ceil(__("x",e,t,n))];case"Complex":return[a.complex(__("real",e,t,n),__("imag",e,t,n))];case"Cos":return[a.cos(__("x",e,t,n))];case"Cosh":return[a.cosh(__("x",e,t,n))];case"Elu":return[a.elu(__("x",e,t,n))];case"Erf":return[a.erf(__("x",e,t,n))];case"Exp":return[a.exp(__("x",e,t,n))];case"Expm1":return[a.expm1(__("x",e,t,n))];case"Floor":return[a.floor(__("x",e,t,n))];case"Log":return[a.log(__("x",e,t,n))];case"Log1p":return[a.log1p(__("x",e,t,n))];case"Imag":return[a.imag(__("x",e,t,n))];case"Neg":return[a.neg(__("x",e,t,n))];case"Reciprocal":return[a.reciprocal(__("x",e,t,n))];case"Real":return[a.real(__("x",e,t,n))];case"Relu":return[a.relu(__("x",e,t,n))];case"Round":return[a.round(__("x",e,t,n))];case"Selu":return[a.selu(__("x",e,t,n))];case"Sigmoid":return[a.sigmoid(__("x",e,t,n))];case"Sin":return[a.sin(__("x",e,t,n))];case"Sign":return[a.sign(__("x",e,t,n))];case"Sinh":return[a.sinh(__("x",e,t,n))];case"Softplus":return[a.softplus(__("x",e,t,n))];case"Sqrt":return[a.sqrt(__("x",e,t,n))];case"Square":return[a.square(__("x",e,t,n))];case"Tanh":return[a.tanh(__("x",e,t,n))];case"Tan":return[a.tan(__("x",e,t,n))];case"ClipByValue":return[a.clipByValue(__("x",e,t,n),__("clipValueMin",e,t,n),__("clipValueMax",e,t,n))];case"Relu6":return[a.relu6(__("x",e,t,n))];case"Rsqrt":return[a.rsqrt(T_(e.inputNames[0],t,n))];case"LeakyRelu":return[a.leakyRelu(__("x",e,t,n),__("alpha",e,t,n))];case"Prelu":return[a.prelu(__("x",e,t,n),__("alpha",e,t,n))];case"IsNan":return[a.isNaN(T_(e.inputNames[0],t,n))];case"IsInf":return[a.isInf(T_(e.inputNames[0],t,n))];case"IsFinite":return[a.isFinite(T_(e.inputNames[0],t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"control":return AT(e,t,n);case"convolution":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Conv1D":{const i=__("stride",e,t,n),s=__("pad",e,t,n),r=__("dataFormat",e,t,n).toUpperCase(),o=__("dilation",e,t,n);return[a.conv1d(__("x",e,t,n),__("filter",e,t,n),i,s,r,o)]}case"Conv2D":{const i=__("strides",e,t,n),s=z_(e,t,n),r=__("dataFormat",e,t,n).toUpperCase(),o=__("dilations",e,t,n);return[a.conv2d(__("x",e,t,n),__("filter",e,t,n),[i[1],i[2]],s,r,[o[1],o[2]])]}case"_FusedConv2D":{const{stride:i,pad:s,dataFormat:r,dilations:o,biasArg:l,preluArg:u,activationFunc:c,leakyreluAlpha:h}=xT(e,t,n);return[a.fused.conv2d({x:__("x",e,t,n),filter:__("filter",e,t,n),strides:[i[1],i[2]],pad:s,dataFormat:r,dilations:[o[1],o[2]],bias:l,activation:c,preluActivationWeights:u,leakyreluAlpha:h})]}case"FusedDepthwiseConv2dNative":{const{stride:i,pad:s,dataFormat:r,dilations:o,biasArg:l,preluArg:u,activationFunc:c,leakyreluAlpha:h}=xT(e,t,n);return[a.fused.depthwiseConv2d({x:__("x",e,t,n),filter:__("filter",e,t,n),strides:[i[1],i[2]],pad:s,dataFormat:r,dilations:[o[1],o[2]],bias:l,activation:c,preluActivationWeights:u,leakyreluAlpha:h})]}case"Conv2DBackpropInput":case"Conv2dTranspose":{const i=__("outputShape",e,t,n),s=__("strides",e,t,n),r=z_(e,t,n);return[a.conv2dTranspose(__("x",e,t,n),__("filter",e,t,n),i,[s[1],s[2]],r)]}case"DepthwiseConv2dNative":case"DepthwiseConv2d":{const i=__("strides",e,t,n),s=z_(e,t,n),r=__("dilations",e,t,n),o=__("dataFormat",e,t,n).toUpperCase();return[a.depthwiseConv2d(__("input",e,t,n),__("filter",e,t,n),[i[1],i[2]],s,o,[r[1],r[2]])]}case"Conv3D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("dataFormat",e,t,n).toUpperCase(),o=__("dilations",e,t,n);return[a.conv3d(__("x",e,t,n),__("filter",e,t,n),[i[1],i[2],i[3]],s,r,[o[1],o[2],o[3]])]}case"AvgPool":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.avgPool(__("x",e,t,n),[r[1],r[2]],[i[1],i[2]],s)]}case"MaxPool":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.maxPool(__("x",e,t,n),[r[1],r[2]],[i[1],i[2]],s)]}case"MaxPoolWithArgmax":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n),o=__("includeBatchInIndex",e,t,n),{result:l,indexes:u}=a.maxPoolWithArgmax(__("x",e,t,n),[r[1],r[2]],[i[1],i[2]],s,o);return[l,u]}case"AvgPool3D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.avgPool3d(__("x",e,t,n),[r[1],r[2],r[3]],[i[1],i[2],i[3]],s)]}case"MaxPool3D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.maxPool3d(__("x",e,t,n),[r[1],r[2],r[3]],[i[1],i[2],i[3]],s)]}case"Dilation2D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("dilations",e,t,n),o=i[1],l=i[2],u=r[1],c=r[2];return[a.dilation2d(__("x",e,t,n),__("filter",e,t,n),[o,l],s,[u,c],"NHWC")]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"creation":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Fill":{const i=__("shape",e,t,n),s=__("dtype",e,t,n),r=__("value",e,t,n);return[a.fill(i,r,s)]}case"LinSpace":{const i=__("start",e,t,n),s=__("stop",e,t,n),r=__("num",e,t,n);return[a.linspace(i,s,r)]}case"Multinomial":{const i=__("logits",e,t,n),s=__("numSamples",e,t,n),r=__("seed",e,t,n);return[a.multinomial(i,s,r)]}case"OneHot":{const i=__("indices",e,t,n),s=__("depth",e,t,n),r=__("onValue",e,t,n),o=__("offValue",e,t,n),l=__("dtype",e,t,n);return[a.oneHot(i,s,r,o,l)]}case"Ones":return[a.ones(__("shape",e,t,n),__("dtype",e,t,n))];case"OnesLike":return[a.onesLike(__("x",e,t,n))];case"RandomStandardNormal":return[a.randomStandardNormal(__("shape",e,t,n),__("dtype",e,t,n),__("seed",e,t,n))];case"RandomUniform":return[a.randomUniform(__("shape",e,t,n),__("minval",e,t,n),__("maxval",e,t,n),__("dtype",e,t,n))];case"RandomUniformInt":return[a.randomUniformInt(__("shape",e,t,n),__("minval",e,t,n),__("maxval",e,t,n),__("seed",e,t,n))];case"Range":{const i=__("start",e,t,n),s=__("stop",e,t,n),r=__("step",e,t,n);return[a.range(i,s,r,__("dtype",e,t,n))]}case"TruncatedNormal":{const i=__("shape",e,t,n),s=__("mean",e,t,n),r=__("stdDev",e,t,n),o=__("seed",e,t,n);return[a.truncatedNormal(i,s,r,__("dtype",e,t,n),o)]}case"Zeros":return[a.zeros(__("shape",e,t,n),__("dtype",e,t,n))];case"ZerosLike":return[a.zerosLike(__("x",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"dynamic":return(async(e,t,n,a,i=C)=>{switch(e.op){case"NonMaxSuppressionV5":{const{boxes:a,scores:s,maxOutputSize:r,iouThreshold:o,scoreThreshold:l,softNmsSigma:u}=CT(e,t,n),c=await i.image.nonMaxSuppressionWithScoreAsync(a,s,r,o,l,u);return[c.selectedIndices,c.selectedScores]}case"NonMaxSuppressionV4":{const{boxes:a,scores:s,maxOutputSize:r,iouThreshold:o,scoreThreshold:l}=CT(e,t,n),u=__("padToMaxOutputSize",e,t,n),c=await i.image.nonMaxSuppressionPaddedAsync(a,s,r,o,l,u);return[c.selectedIndices,c.validOutputs]}case"NonMaxSuppressionV3":case"NonMaxSuppressionV2":{const{boxes:a,scores:s,maxOutputSize:r,iouThreshold:o,scoreThreshold:l}=CT(e,t,n);return[await i.image.nonMaxSuppressionAsync(a,s,r,o,l)]}case"Where":{const a=i.cast(__("condition",e,t,n),"bool"),s=[await i.whereAsync(a)];return a.dispose(),s}case"ListDiff":return i.setdiff1dAsync(__("x",e,t,n),__("y",e,t,n));default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n);case"evaluation":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"LowerBound":{const i=__("sortedSequence",e,t,n),s=__("values",e,t,n);return[a.lowerBound(i,s)]}case"TopKV2":{const i=__("x",e,t,n),s=__("k",e,t,n),r=__("sorted",e,t,n),o=a.topk(i,s,r);return[o.values,o.indices]}case"UpperBound":{const i=__("sortedSequence",e,t,n),s=__("values",e,t,n);return[a.upperBound(i,s)]}case"Unique":{const i=__("x",e,t,n),s=a.unique(i);return[s.values,s.indices]}case"UniqueV2":{const i=__("x",e,t,n),s=__("axis",e,t,n),r=a.unique(i,s);return[r.values,r.indices]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"image":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"ResizeBilinear":{const i=__("images",e,t,n),s=__("size",e,t,n),r=__("alignCorners",e,t,n),o=__("halfPixelCenters",e,t,n);return[a.image.resizeBilinear(i,[s[0],s[1]],r,o)]}case"ResizeNearestNeighbor":{const i=__("images",e,t,n),s=__("size",e,t,n),r=__("alignCorners",e,t,n),o=__("halfPixelCenters",e,t,n);return[a.image.resizeNearestNeighbor(i,[s[0],s[1]],r,o)]}case"CropAndResize":{const i=__("image",e,t,n),s=__("boxes",e,t,n),r=__("boxInd",e,t,n),o=__("cropSize",e,t,n),l=__("method",e,t,n),u=__("extrapolationValue",e,t,n);return[a.image.cropAndResize(i,s,r,o,l,u)]}case"ImageProjectiveTransformV3":{const i=__("images",e,t,n),s=__("transforms",e,t,n),r=__("outputShape",e,t,n),o=__("fillValue",e,t,n),l=__("interpolation",e,t,n),u=__("fillMode",e,t,n);return[a.image.transform(i,s,l.toLowerCase(),u.toLowerCase(),o,r)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"graph":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Const":return t[e.name];case"PlaceholderWithDefault":const i=__("default",e,t,n);return[T_(e.name,t,n)||i];case"Placeholder":return[T_(e.name,t,n)];case"Identity":case"StopGradient":case"FakeQuantWithMinMaxVars":case"Snapshot":return[O_(__("x",e,t,n))];case"IdentityN":return __("x",e,t,n).map((e=>O_(e)));case"Shape":return[a.tensor1d(__("x",e,t,n).shape,"int32")];case"ShapeN":return __("x",e,t,n).map((e=>a.tensor1d(e.shape)));case"Size":return[a.scalar(__("x",e,t,n).size,"int32")];case"Rank":return[a.scalar(__("x",e,t,n).rank,"int32")];case"NoOp":return[a.scalar(1)];case"Print":const s=__("x",e,t,n),r=__("data",e,t,n);__("message",e,t,n),__("summarize",e,t,n);for(let e=0;e((e,t,n,a=C)=>{switch(e.op){case"Equal":return[a.equal(__("a",e,t,n),__("b",e,t,n))];case"NotEqual":return[a.notEqual(__("a",e,t,n),__("b",e,t,n))];case"Greater":return[a.greater(__("a",e,t,n),__("b",e,t,n))];case"GreaterEqual":return[a.greaterEqual(__("a",e,t,n),__("b",e,t,n))];case"Less":return[a.less(__("a",e,t,n),__("b",e,t,n))];case"LessEqual":return[a.lessEqual(__("a",e,t,n),__("b",e,t,n))];case"LogicalAnd":return[a.logicalAnd(__("a",e,t,n),__("b",e,t,n))];case"LogicalNot":return[a.logicalNot(__("a",e,t,n))];case"LogicalOr":return[a.logicalOr(__("a",e,t,n),__("b",e,t,n))];case"Select":case"SelectV2":return[a.where(__("condition",e,t,n),__("a",e,t,n),__("b",e,t,n))];case"BitwiseAnd":return[a.bitwiseAnd(__("a",e,t,n),__("b",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"matrices":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"BatchMatMul":case"BatchMatMulV2":case"MatMul":return[a.matMul(__("a",e,t,n),__("b",e,t,n),__("transposeA",e,t,n),__("transposeB",e,t,n))];case"Einsum":return[a.einsum(__("equation",e,t,n),...__("tensors",e,t,n))];case"Transpose":return[a.transpose(__("x",e,t,n),__("perm",e,t,n))];case"_FusedMatMul":const[i,s]=__("fusedOps",e,t,n),r="biasadd"===i,o="prelu"===s,l=__("numArgs",e,t,n),u=__("leakyreluAlpha",e,t,n);if(r){if(o&&2!==l)throw new Error("Fused MatMul with BiasAdd and Prelu must have two extra arguments: bias and alpha.");if(!o&&1!==l)throw new Error("Fused MatMul with BiasAdd must have one extra argument: bias.")}const[c,h]=__("args",e,t,n);return[a.fused.matMul({a:__("a",e,t,n),b:__("b",e,t,n),transposeA:__("transposeA",e,t,n),transposeB:__("transposeB",e,t,n),bias:c,activation:s,preluActivationWeights:h,leakyreluAlpha:u})];case"MatrixBandPart":return[a.linalg.bandPart(__("a",e,t,n),__("numLower",e,t,n),__("numUpper",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"normalization":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"EuclideanNorm":return[a.euclideanNorm(__("x",e,t,n),__("axis",e,t,n),__("keepDims",e,t,n))];case"FusedBatchNorm":case"FusedBatchNormV2":case"FusedBatchNormV3":return[a.batchNorm(__("x",e,t,n),__("mean",e,t,n),__("variance",e,t,n),__("offset",e,t,n),__("scale",e,t,n),__("epsilon",e,t,n))];case"LRN":return[a.localResponseNormalization(__("x",e,t,n),__("radius",e,t,n),__("bias",e,t,n),__("alpha",e,t,n),__("beta",e,t,n))];case"Softmax":return[a.softmax(__("x",e,t,n))];case"LogSoftmax":return[a.logSoftmax(__("x",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"ragged":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"RaggedGather":{const{outputNestedSplits:i,outputDenseValues:s}=a.raggedGather(__("paramsNestedSplits",e,t,n),__("paramsDenseValues",e,t,n),__("indices",e,t,n),__("outputRaggedRank",e,t,n));return i.concat(s)}case"RaggedRange":{const{rtNestedSplits:i,rtDenseValues:s}=a.raggedRange(__("starts",e,t,n),__("limits",e,t,n),__("splits",e,t,n));return[i,s]}case"RaggedTensorToTensor":return[a.raggedTensorToTensor(__("shape",e,t,n),__("values",e,t,n),__("defaultValue",e,t,n),__("rowPartitionTensors",e,t,n),__("rowPartitionTypes",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"reduction":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Max":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.max(__("x",e,t,n),i,s)]}case"Mean":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.mean(__("x",e,t,n),i,s)]}case"Min":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.min(__("x",e,t,n),i,s)]}case"Sum":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.sum(__("x",e,t,n),i,s)]}case"All":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.all(__("x",e,t,n),i,s)]}case"Any":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.any(__("x",e,t,n),i,s)]}case"ArgMax":{const i=__("axis",e,t,n);return[a.argMax(__("x",e,t,n),i)]}case"ArgMin":{const i=__("axis",e,t,n);return[a.argMin(__("x",e,t,n),i)]}case"Prod":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.prod(__("x",e,t,n),i,s)]}case"Cumprod":{const i=__("axis",e,t,n),s=__("exclusive",e,t,n),r=__("reverse",e,t,n);return[a.cumprod(__("x",e,t,n),i,s,r)]}case"Cumsum":{const i=__("axis",e,t,n),s=__("exclusive",e,t,n),r=__("reverse",e,t,n);return[a.cumsum(__("x",e,t,n),i,s,r)]}case"Bincount":const i=__("x",e,t,n),s=__("weights",e,t,n),r=__("size",e,t,n);return[a.bincount(i,s,r)];case"DenseBincount":{const i=__("x",e,t,n),s=__("weights",e,t,n),r=__("size",e,t,n),o=__("binaryOutput",e,t,n);return[a.denseBincount(i,s,r,o)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"slice_join":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"ConcatV2":case"Concat":{const i=__("n",e,t,n),s=__("axis",e,t,n);let r=__("tensors",e,t,n);return r=r.slice(0,i),[a.concat(r,s)]}case"Gather":{const i=__("x",e,t,n),s=__("indices",e,t,n);return[a.gather(i,a.cast(s,"int32"),0)]}case"GatherV2":{const i=__("axis",e,t,n),s=__("batchDims",e,t,n),r=__("x",e,t,n),o=__("indices",e,t,n);return[a.gather(r,a.cast(o,"int32"),i,s)]}case"Reverse":{const i=__("dims",e,t,n),s=[];for(let e=0;e{const i=__("axis",e,t,n),s=__("tensors",e,t,n),r=s[0].shape,o=a.squeeze(s[0]).shape,l=s.map((e=>{const t=Os(e.shape,r);if(!t&&!Os(a.squeeze(e).shape,o))throw new Error("the input tensors shape does not match");return t?e:a.reshape(e,r)}));return[a.stack(l,i)]}));case"Unpack":{const i=__("axis",e,t,n),s=__("tensor",e,t,n);return a.unstack(s,i)}case"Tile":{const i=__("reps",e,t,n);return[a.tile(__("x",e,t,n),i)]}case"Split":case"SplitV":{const i=__("axis",e,t,n),s=__("numOrSizeSplits",e,t,n),r=__("x",e,t,n);return a.split(r,s,i)}case"ScatterNd":{const i=__("indices",e,t,n),s=__("values",e,t,n),r=__("shape",e,t,n);return[a.scatterND(i,s,r)]}case"GatherNd":{const i=__("x",e,t,n),s=__("indices",e,t,n);return[a.gatherND(i,s)]}case"SparseToDense":{const i=__("sparseIndices",e,t,n),s=__("outputShape",e,t,n),r=__("sparseValues",e,t,n),o=__("defaultValue",e,t,n);return[a.sparseToDense(i,r,s,r.dtype===o.dtype?o:a.cast(o,r.dtype))]}case"TensorScatterUpdate":{const i=__("indices",e,t,n),s=__("values",e,t,n),r=__("tensor",e,t,n);return[a.tensorScatterUpdate(r,i,s)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"sparse":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"SparseFillEmptyRows":{const{outputIndices:i,outputValues:s,emptyRowIndicator:r,reverseIndexMap:o}=a.sparse.sparseFillEmptyRows(__("indices",e,t,n),__("values",e,t,n),__("denseShape",e,t,n),__("defaultValue",e,t,n));return[i,s,r,o]}case"SparseReshape":{const{outputIndices:i,outputShape:s}=a.sparse.sparseReshape(__("inputIndices",e,t,n),__("inputShape",e,t,n),__("newShape",e,t,n));return[i,s]}case"SparseSegmentMean":return[a.sparse.sparseSegmentMean(__("data",e,t,n),__("indices",e,t,n),__("segmentIds",e,t,n))];case"SparseSegmentSum":return[a.sparse.sparseSegmentSum(__("data",e,t,n),__("indices",e,t,n),__("segmentIds",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"spectral":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"FFT":return[a.fft(__("x",e,t,n))];case"IFFT":return[a.ifft(__("x",e,t,n))];case"RFFT":return[a.rfft(__("x",e,t,n))];case"IRFFT":return[a.irfft(__("x",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"string":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"StaticRegexReplace":return[a.string.staticRegexReplace(__("input",e,t,n),__("pattern",e,t,n),__("rewrite",e,t,n),__("replaceGlobal",e,t,n))];case"StringNGrams":{const{nGrams:i,nGramsSplits:s}=a.string.stringNGrams(__("data",e,t,n),__("dataSplits",e,t,n),__("separator",e,t,n),__("nGramWidths",e,t,n),__("leftPad",e,t,n),__("rightPad",e,t,n),__("padWidth",e,t,n),__("preserveShortSequences",e,t,n));return[i,s]}case"StringSplit":{const{indices:i,values:s,shape:r}=a.string.stringSplit(__("input",e,t,n),__("delimiter",e,t,n),__("skipEmpty",e,t,n));return[i,s,r]}case"StringToHashBucketFast":return[a.string.stringToHashBucketFast(__("input",e,t,n),__("numBuckets",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"transformation":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Cast":return[a.cast(__("x",e,t,n),__("dtype",e,t,n))];case"ExpandDims":{const i=__("axis",e,t,n);return[a.expandDims(__("x",e,t,n),i)]}case"Squeeze":{const i=__("axis",e,t,n);return[a.squeeze(__("x",e,t,n),i)]}case"Reshape":return[a.reshape(__("x",e,t,n),__("shape",e,t,n))];case"EnsureShape":return[a.ensureShape(__("x",e,t,n),__("shape",e,t,n))];case"MirrorPad":return[a.mirrorPad(__("x",e,t,n),__("padding",e,t,n),__("mode",e,t,n))];case"PadV2":case"Pad":return[a.pad(__("x",e,t,n),__("padding",e,t,n),__("constantValue",e,t,n))];case"SpaceToBatchND":{const i=__("blockShape",e,t,n),s=__("paddings",e,t,n);return[a.spaceToBatchND(__("x",e,t,n),i,s)]}case"BatchToSpaceND":{const i=__("blockShape",e,t,n),s=__("crops",e,t,n);return[a.batchToSpaceND(__("x",e,t,n),i,s)]}case"DepthToSpace":{const i=__("blockSize",e,t,n),s=__("dataFormat",e,t,n).toUpperCase();return[a.depthToSpace(__("x",e,t,n),i,s)]}case"BroadcastTo":return[a.broadcastTo(__("x",e,t,n),__("shape",e,t,n))];case"BroadcastArgs":return[a.broadcastArgs(__("s0",e,t,n),__("s1",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"hash_table":return(async(e,t,n,a)=>{switch(e.op){case"HashTable":case"HashTableV2":{const i=a.getHashTableHandleByName(e.name);if(null!=i)return[i];{const i=__("keyDType",e,t,n),s=__("valueDType",e,t,n),r=new ST(i,s);return a.addHashTable(e.name,r),[r.handle]}}case"InitializeTable":case"InitializeTableV2":case"LookupTableImport":case"LookupTableImportV2":{const i=__("tableHandle",e,t,n,a),s=__("keys",e,t,n),r=__("values",e,t,n),o=a.getHashTableById(i.id);return[await o.import(s,r)]}case"LookupTableFind":case"LookupTableFindV2":{const i=__("tableHandle",e,t,n,a),s=__("keys",e,t,n),r=__("defaultValue",e,t,n),o=a.getHashTableById(i.id);return[await o.find(s,r)]}case"LookupTableSize":case"LookupTableSizeV2":{const i=__("tableHandle",e,t,n,a);return[a.getHashTableById(i.id).tensorSize()]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n,a);case"custom":const s=E_(e.op);if(s&&s.customExecutor)return s.customExecutor(new fT(e,t,n));throw TypeError(`Custom op ${e.op} is not registered.`);default:throw TypeError(`Unknown op '${e.op}'. File an issue at https://github.com/tensorflow/tfjs/issues so we can add it, or register a custom execution with tf.registerOp()`)}})(e,t,n);return rr(s)?s.then((e=>[].concat(e))):[].concat(s)}class _T{constructor(e={},t={},n={},a={},i){this.weightMap=e,this.tensorArrayMap=t,this.tensorListMap=n,this.functionMap=a,this.parseNodeNameCache=i,this.rootContext={id:0,frameName:"",iterationId:0},this.contexts=[this.rootContext],this.lastId=0,this.generateCurrentContextIds()}newFrame(e,t){return{id:e,frameName:t,iterationId:0}}set currentContext(e){this.contexts!==e&&(this.contexts=e,this.generateCurrentContextIds())}get currentContext(){return this.contexts}get currentContextId(){return this._currentContextIds[0]}get currentContextIds(){return this._currentContextIds}generateCurrentContextIds(){const e=[];for(let t=0;t0===e.id&&0===e.iterationId?"":`${e.frameName}-${e.iterationId}`)).join("/"):""}enterFrame(e){this.contexts&&(this.lastId++,this.contexts=this.contexts.slice(),this.contexts.push(this.newFrame(this.lastId,e)),this._currentContextIds.unshift(this.contextIdforContexts(this.contexts)))}exitFrame(){if(!(this.contexts&&this.contexts.length>1))throw new Error("Cannot exit frame, the context is empty");this.contexts=this.contexts.slice(),this.contexts.splice(-1),this.currentContextIds.shift()}nextIteration(){if(!(this.contexts&&this.contexts.length>0))throw new Error("Cannot increase frame iteration, the context is empty");{this.contexts=this.contexts.slice(),this.lastId++;const e=Object.assign({},this.contexts[this.contexts.length-1]);e.iterationId+=1,e.id=this.lastId,this.contexts.splice(-1,1,e),this._currentContextIds.splice(0,1,this.contextIdforContexts(this.contexts))}}getWeight(e){return this.weightMap[e]}addTensorArray(e){this.tensorArrayMap[e.id]=e}getTensorArray(e){return this.tensorArrayMap[e]}addTensorList(e){this.tensorListMap[e.id]=e}getTensorList(e){return this.tensorListMap[e]}dispose(e){for(const t in this.tensorArrayMap)this.tensorArrayMap[t].clearAndClose(e);for(const t in this.tensorListMap)this.tensorListMap[t].clearAndClose(e)}}function TT(e,t,n,a){const i=new Set,s=[];let r=null,o=null;const l=new Set,u=new Set(Object.keys(e).map((e=>D_(e)[0])));a=a||[];const c=new Set(a.map((e=>D_(e.name)[0]))),h=[...t];for(;h.length>0;){const e=h.pop();(OT(e)||MT(e)||BT(e))&&null==r&&(r=e,o=r.children.map((e=>e.name)).filter((e=>i.has(e)))),i.add(e.name),null==n[e.name]&&(u.has(e.name)||c.has(e.name)||(0!==e.inputs.length?e.inputs.forEach((e=>{l.has(e.name)||(l.add(e.name),h.push(e))})):s.push(e.name)))}return{inputs:e,outputs:t,usedNodes:i,missingInputs:s,dynamicNode:r,syncInputs:o}}function IT(e,t){const{usedNodes:n,inputs:a}=t,i=Object.keys(a).map((e=>D_(e)[0])).map((t=>e.nodes[t])),s=e.initNodes||[],r=e=>n.has("string"==typeof e?e:e.name);function o(e){return[...new Map(e.map((e=>[e.name,e]))).values()]}const l=o([...i,...e.weights,...s]).filter(r),u=o([...l,...Object.values(e.nodes)]).filter(r),c=new Map(u.map((e=>[e.name,e]))),h={};for(const e of u){h[e.name]=h[e.name]||0;for(const t of e.children)r(t)||(h[t.name]=Number.POSITIVE_INFINITY),h[t.name]=(h[t.name]||0)+1}const d=Object.entries(h).filter((([,e])=>0===e)).map((([e])=>e)),p=[...d];for(;d.length>0;){const e=d.pop(),t=c.get(e);for(const e of t.children.filter(r))0==--h[e.name]&&(p.push(e.name),d.push(e.name))}const m=function(e,t){const n=new Map(e.map((e=>[e.name,e]))),a=t.map((e=>e.name)),i=new Set(a);for(;a.length>0;){const e=a.pop(),t=n.get(e);for(const e of t.children)n.has(e.name)&&!i.has(e.name)&&(i.add(e.name),a.push(e.name))}const s=e.filter((e=>i.has(e.name)));return s}(p.map((e=>c.get(e))),l);return function(e,t){const n=new Map(e.map(((e,t)=>[e.name,t]))),a=new Set(t.map((e=>e.name))),i=e=>a.has("string"==typeof e?e:e.name),s=new Set(e.map((e=>e.name))),r=e=>s.has("string"==typeof e?e:e.name);for(const t of e){for(const e of t.children.filter(r)){if(!n.has(e.name))throw new NT(`Child ${e.name} of node ${t.name} is unreachable.`);if(n.get(t.name)>n.get(e.name))throw new NT(`Node ${t.name} is scheduled to run after its child ${e.name}.`)}if(!i(t))for(const e of t.inputs){if(!n.has(e.name))throw new NT(`Input ${e.name} of node ${t.name} is unreachable.`);if(n.get(e.name)>n.get(t.name))throw new NT(`Node ${t.name} is scheduled to run before its input ${e.name}.`)}}}(m,l),m}class NT extends Error{constructor(e){super(`NodesExecutionOrderError: ${e}`)}}const RT=new Set(["Switch","Merge","Enter","Exit","NextIteration","StatelessIf","StatelessWhile","if","While"]),DT=new Set(["NonMaxSuppressionV2","NonMaxSuppressionV3","NonMaxSuppressionV5","Where"]),zT=new Set(["HashTable","HashTableV2","LookupTableImport","LookupTableImportV2","LookupTableFind","LookupTableFindV2","LookupTableSize","LookupTableSizeV2"]);function OT(e){return RT.has(e.op)}function MT(e){return DT.has(e.op)}function BT(e){return zT.has(e.op)}class FT{get weightIds(){return this.parent?this.parent.weightIds:this._weightIds}get functionExecutorMap(){return this.parent?this.parent.functionExecutorMap:this._functionExecutorMap}get weightMap(){return this.parent?this.parent.weightMap:this._weightMap}set weightMap(e){const t=Object.keys(e).map((t=>e[t].map((e=>e.id))));this._weightIds=[].concat(...t),this._weightMap=e}set resourceManager(e){this._resourceManager=e}get inputs(){return this._inputs.map((e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0})))}get outputs(){return this._outputs.map((e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0})))}get inputNodes(){return this._inputs.map((e=>e.signatureKey||e.name))}get outputNodes(){return this._outputs.map((e=>{const t=e.signatureKey||e.name;return e.defaultOutput?`${t}:${e.defaultOutput}`:t}))}get functions(){return Object.keys(this._functions).reduce(((e,t)=>(e[t]=this._functions[t].signature,e)),{})}constructor(e,t){this.graph=e,this.parent=t,this.compiledMap=new Map,this.parseNodeNameCache=new Map,this._weightMap={},this.SEPARATOR=",",this._functions={},this._functionExecutorMap={},this.keepIntermediateTensors=!1,this._outputs=e.outputs,this._inputs=e.inputs,this._initNodes=e.initNodes,this._signature=e.signature,this._functions=e.functions,null!=e.functions&&Object.keys(e.functions).forEach((t=>{this._functionExecutorMap[t]=new FT(e.functions[t],this)}))}getCompilationKey(e,t){const n=e.map((e=>e.name)).sort(),a=t.map((e=>e.name)).sort();return n.join(this.SEPARATOR)+"--"+a.join(this.SEPARATOR)}compile(e,t){const n=TT(e,t,this.weightMap,this._initNodes),{missingInputs:a,dynamicNode:i,syncInputs:s}=n;if(null!=i)throw new Error(`This execution contains the node '${i.name}', which has the dynamic op '${i.op}'. Please use model.executeAsync() instead. Alternatively, to avoid the dynamic ops, specify the inputs [${s}]`);if(a.length>0){const n=t.map((e=>e.name)),i=Object.keys(e);throw new Error(`Cannot compute the outputs [${n}] from the provided inputs [${i}]. Missing the following inputs: [${a}]`)}const r=IT(this.graph,n),o=function(e){const t=new Map(e.map(((e,t)=>[e.name,t]))),n=Number.MAX_SAFE_INTEGER,a=e.map(((e,t)=>OT(e)?n:t)),i=e=>{const n=a[t.get(e.name)];return null==n?-1:n},s=e.map(((e,t)=>e.children.map(i).reduce(((e,t)=>Math.max(e,t)),a[t]))),r=new Map;for(let t=0;tthis.cloneAndKeepTensor(e)))}cloneTensorMap(e){return Object.fromEntries(Object.entries(e).map((([e,t])=>[e,this.cloneTensorList(t)])))}execute(e,t){this.disposeIntermediateTensors(),e=this.mapInputs(e);const n=Object.keys(e).sort();this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t);const a=n.map((e=>this.graph.nodes[D_(e)[0]])),i=t.map((e=>D_(e)[0])),s=new Set(i);let r=i.map((e=>this.graph.nodes[e]));0===r.length&&(r=this._outputs);const o=this.getCompilationKey(a,r);let l=this.compiledMap.get(o);null==l&&(l=this.compile(e,r),this.compiledMap.set(o,l));try{this.keepIntermediateTensors=cr().getBool("KEEP_INTERMEDIATE_TENSORS")}catch(e){this.keepIntermediateTensors=!1}const u={},c={};return dh((()=>{const n=new _T(this.weightMap,u,c,this.functionExecutorMap,this.parseNodeNameCache),a=Object.assign({},this.weightMap);this.keepIntermediateTensors&&(this.clonedTensorsMap=this.cloneTensorMap(this.weightMap)),Object.keys(e).forEach((t=>{const[i,s]=D_(t,n),r=[];r[s]=e[t],a[i]=r,this.keepIntermediateTensors&&(this.clonedTensorsMap[i]=this.cloneTensorList(r))}));const i=this.getFrozenTensorIds(a),{orderedNodes:r,nodeLiveUntilMap:o}=l;for(const e of r){if(a[e.name])continue;const t=ET(e,a,n,this._resourceManager);if(rr(t))throw new Error(`The execution of the op '${e.op}' returned a promise. Please use model.executeAsync() instead.`);a[e.name]=t,this.keepIntermediateTensors&&(this.clonedTensorsMap[e.name]=this.cloneTensorList(t)),this.checkTensorForDisposalWithNodeLiveUntilInfo(e,a,n,i,s,o.get(e.name))}return null==this.parent&&n.dispose(i),t.map((e=>T_(e,a,n)))}))}getFrozenTensorIds(e){const t=[].concat.apply([],Object.keys(e).map((t=>e[t])).map((e=>e.map((e=>e.id)))));return new Set(t)}checkTensorForDisposal(e,t,n,a,i,s,r){if(!OT(t)&&!s.has(e)){for(const a of n[e])null!=a&&(r[a.id]=(r[a.id]||0)+t.children.length);for(const e of t.inputs){if(OT(e))continue;const t=I_(e.name,n,a);if(null!=t)for(const e of t){if(!e||e.kept||i.has(e.id))continue;const t=r[e.id];1===t?(e.dispose(),delete r[e.id]):null!=t&&r[e.id]--}}}}checkTensorForDisposalWithNodeLiveUntilInfo(e,t,n,a,i,s){function r(e){return OT(e)||i.has(e.name)}if(!OT(e)&&null!=s)for(const e of s){if(r(e))continue;const i=I_(e.name,t,n);for(const e of i)!e||e.kept||a.has(e.id)||e.dispose()}}async executeAsync(e,t){return this._executeAsync(e,t)}disposeIntermediateTensors(){this.clonedTensorsMap&&(Object.values(this.clonedTensorsMap).forEach((e=>{for(const t of e)t&&!t.isDisposed&&t.dispose()})),this.clonedTensorsMap=null)}getIntermediateTensors(){return this.clonedTensorsMap}async _executeAsync(e,t,n=!1,a={},i={}){this.disposeIntermediateTensors(),n||(e=this.mapInputs(e),this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t));try{this.keepIntermediateTensors=cr().getBool("KEEP_INTERMEDIATE_TENSORS")}catch(e){this.keepIntermediateTensors=!1}const s=new _T(this.weightMap,a,i,this.functionExecutorMap,this.parseNodeNameCache);this.keepIntermediateTensors&&(this.clonedTensorsMap=this.cloneTensorMap(this.weightMap));const r=await this.executeWithControlFlow(e,s,t,n),o=t.map((e=>T_(e,r,s))),l=o.map((e=>e.id)),u=Object.keys(e).map((t=>e[t].id)),c=new Set([...l,...u,...this.weightIds]);return Object.values(r).forEach((e=>{e.forEach((e=>{!e||e.isDisposed||c.has(e.id)||e.dispose()}))})),null==this.parent&&s.dispose(c),o}async executeFunctionAsync(e,t,n){const a=e.reduce(((e,t,n)=>(e[this.inputs[n].name]=t,e)),{});return this._executeAsync(a,this.outputNodes,!0,t,n)}async executeWithControlFlow(e,t,n,a){const i=Object.keys(e),s=i.map((e=>this.graph.nodes[D_(e)[0]])),r=n.map((e=>D_(e)[0])),o=new Set(r);let l=r.map((e=>this.graph.nodes[e]));0===l.length&&(l=this._outputs);const{usedNodes:u,missingInputs:c,dynamicNode:h,syncInputs:d}=TT(e,l,this.weightMap,this._initNodes),p=[...s,...this.graph.weights,...this._initNodes||[]].map((e=>({node:e,contexts:t.currentContext}))),m=Object.assign({},this.weightMap);Object.keys(e).forEach((t=>{const[n,a]=D_(t),i=[];i[a]=e[t],m[n]=i}));const f={},g=this.getFrozenTensorIds(m),y={};for(;p.length>0;){const e=this.processStack(s,p,t,m,y,g,o,f,u);await Promise.all(e)}const b=l.filter((e=>!OT(e)&&!T_(e.name,m,t))).map((e=>e.name));if(b.length>0){let e="";throw null!=h&&(e=`Alternatively, to avoid the dynamic ops, use model.execute() and specify the inputs [${d}]`),new Error(`Cannot compute the outputs [${b}] from the provided inputs [${i}]. Consider providing the following inputs: [${c}]. ${e}`)}return m}processStack(e,t,n,a,i,s,r,o,l){const u=[];for(;t.length>0;){const e=t.pop();n.currentContext=e.contexts;let c="";if("Enter"===e.node.op&&__("isConstant",e.node,a,n)&&([c]=N_(e.node.name,n)),null==a[e.node.name]){const h=ET(e.node,a,n,this._resourceManager);c||([c]=N_(e.node.name,n));const d=n.currentContext;rr(h)?u.push(h.then((u=>(a[c]=u,this.keepIntermediateTensors&&(this.clonedTensorsMap[c]=this.cloneTensorList(u)),n.currentContext=d,this.checkTensorForDisposal(c,e.node,a,n,s,r,o),this.processChildNodes(e.node,t,n,a,i,l),u)))):(a[c]=h,this.keepIntermediateTensors&&(this.clonedTensorsMap[c]=this.cloneTensorList(h)),this.checkTensorForDisposal(c,e.node,a,n,s,r,o),this.processChildNodes(e.node,t,n,a,i,l))}else this.processChildNodes(e.node,t,n,a,i,l)}return u}processChildNodes(e,t,n,a,i,s){e.children.forEach((e=>{const[r]=N_(e.name,n);!i[r]&&s.has(e.name)&&("Merge"===e.op?e.inputNames.some((e=>!!T_(e,a,n)))&&(i[r]=!0,t.push({contexts:n.currentContext,node:e})):e.inputNames.every((e=>!!T_(e,a,n)))&&(i[r]=!0,t.push({contexts:n.currentContext,node:e})))}))}dispose(){Object.keys(this.weightMap).forEach((e=>this.weightMap[e].forEach((e=>e.dispose()))))}checkInputShapeAndType(e){Object.keys(e).forEach((t=>{const n=e[t],[a]=D_(t),i=this.graph.nodes[a];if(i.attrParams.shape&&i.attrParams.shape.value){const e=i.attrParams.shape.value;Ns(e.length===n.shape.length&&n.shape.every(((t,n)=>-1===e[n]||e[n]===t)),(()=>`The shape of dict['${i.name}'] provided in model.execute(dict) must be [${e}], but was [${n.shape}]`))}i.attrParams.dtype&&i.attrParams.dtype.value&&Ns(n.dtype===i.attrParams.dtype.value,(()=>`The dtype of dict['${i.name}'] provided in model.execute(dict) must be ${i.attrParams.dtype.value}, but was ${n.dtype}`))}))}mapInputs(e){var t,n;const a={};for(const i in e){const s=null===(n=null===(t=this._signature)||void 0===t?void 0:t.inputs)||void 0===n?void 0:n[i];null!=s?a[s.name]=e[i]:a[i]=e[i]}return a}checkInputs(e){const t=Object.keys(e).filter((e=>{const[t]=D_(e);return null==this.graph.nodes[t]}));if(t.length>0)throw new Error(`The dict provided in model.execute(dict) has keys: [${t}] that are not part of graph`)}mapOutputs(e){return e.map((e=>{var t,n;const a=null===(n=null===(t=this._signature)||void 0===t?void 0:t.outputs)||void 0===n?void 0:n[e];return null!=a?a.name:e}),{})}checkOutputs(e){e.forEach((e=>{const[t]=D_(e);if(!this.graph.nodes[t])throw new Error(`The output '${e}' is not found in the graph`)}))}}class LT{constructor(e={},t={}){this.hashTableNameToHandle=e,this.hashTableMap=t}addHashTable(e,t){this.hashTableNameToHandle[e]=t.handle,this.hashTableMap[t.id]=t}getHashTableHandleByName(e){return this.hashTableNameToHandle[e]}getHashTableById(e){return this.hashTableMap[e]}dispose(){for(const e in this.hashTableMap)this.hashTableMap[e].clearAndClose(),delete this.hashTableMap[e];for(const e in this.hashTableNameToHandle)this.hashTableNameToHandle[e].dispose(),delete this.hashTableNameToHandle[e]}}const PT="?tfjs-format=file",jT="model.json";class VT{get modelVersion(){return this.version}get inputNodes(){return this.executor.inputNodes}get outputNodes(){return this.executor.outputNodes}get inputs(){return this.executor.inputs}get outputs(){return this.executor.outputs}get weights(){return this.executor.weightMap}get metadata(){return this.artifacts.userDefinedMetadata}get modelSignature(){return this.signature}get modelStructuredOutputKeys(){return this.structuredOutputKeys}constructor(t,n={},a=e){this.modelUrl=t,this.loadOptions=n,this.version="n/a",this.io=a,null==n&&(this.loadOptions={}),this.resourceManager=new LT}findIOHandler(){const e=this.modelUrl;if(null!=e.load)this.handler=e;else if(null!=this.loadOptions.requestInit)this.handler=this.io.browserHTTPRequest(e,this.loadOptions);else{const t=this.io.getLoadHandlers(e,this.loadOptions);if(0===t.length)t.push(this.io.browserHTTPRequest(e,this.loadOptions));else if(t.length>1)throw new Error(`Found more than one (${t.length}) load handlers for URL '${[e]}'`);this.handler=t[0]}}load(){if(this.findIOHandler(),null==this.handler.load)throw new Error("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.");const e=this.handler.load();return rr(e)?e.then((e=>null==e.getWeightStream?this.loadSync(e):this.loadStreaming(e))):this.loadSync(e)}loadSync(e){const t=this.io.decodeWeights(e.weightData,e.weightSpecs);return this.loadWithWeightMap(e,t)}async loadStreaming(e){if(null==e.getWeightStream)throw new Error("Model artifacts missing streamWeights function");const t=await Ch(e.getWeightStream(),e.weightSpecs);return this.loadWithWeightMap(e,t)}loadWithWeightMap(e,t){this.artifacts=e;const n=this.artifacts.modelTopology;let a=this.artifacts.signature;if(null!=this.artifacts.userDefinedMetadata){const e=this.artifacts.userDefinedMetadata;null!=e.signature&&(a=e.signature),null!=e.structuredOutputKeys&&(this.structuredOutputKeys=e.structuredOutputKeys)}if(this.signature=a,this.version=`${n.versions.producer}.${n.versions.minConsumer}`,this.executor=new FT(eT.Instance.transformGraph(n,this.signature)),this.executor.weightMap=this.convertTensorMapToTensorsMap(t),this.executor.resourceManager=this.resourceManager,null!=e.modelInitializer&&null!=e.modelInitializer.node){const t=eT.Instance.transformGraph(e.modelInitializer);this.initializer=new FT(t),this.initializer.weightMap=this.executor.weightMap,this.initializer.resourceManager=this.resourceManager,this.initializerSignature=e.initializerSignature}return!0}async save(e,t){if("string"==typeof e){const t=this.io.getSaveHandlers(e);if(0===t.length)throw new Error(`Cannot find any save handlers for URL '${e}'`);if(t.length>1)throw new Error(`Found more than one (${t.length}) save handlers for URL '${e}'`);e=t[0]}if(null==e.save)throw new Error("GraphModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");return e.save(this.artifacts)}addStructuredOutputNames(e){if(this.structuredOutputKeys){const t={};return(e instanceof kc?[e]:e).forEach(((e,n)=>t[this.structuredOutputKeys[n]]=e)),t}return e}predict(e,t){const n=this.execute(e,this.outputNodes);return this.addStructuredOutputNames(n)}async predictAsync(e,t){const n=await this.executeAsync(e,this.outputNodes);return this.addStructuredOutputNames(n)}normalizeInputs(e){var t;if(!(e instanceof kc||Array.isArray(e))){const n=null===(t=this.signature)||void 0===t?void 0:t.inputs;if(null!=n)for(const t in n){const a=n[t];null!=a.resourceId&&(e[t]=this.resourceIdToCapturedInput[a.resourceId])}return e}e=Array.isArray(e)?e:[e];const n=Object.keys(this.resourceIdToCapturedInput).length;if(e.length+n!==this.inputNodes.length)throw new Error(`Input tensor count mismatch, the graph model has ${this.inputNodes.length-n} non-resource placeholders, while there are ${e.length} input tensors provided.`);let a=0;return this.inputNodes.reduce(((t,n)=>{var i,s,r;const o=null===(r=null===(s=null===(i=this.signature)||void 0===i?void 0:i.inputs)||void 0===s?void 0:s[n])||void 0===r?void 0:r.resourceId;return t[n]=null!=o?this.resourceIdToCapturedInput[o]:e[a++],t}),{})}normalizeOutputs(e){return e=e||this.outputNodes,Array.isArray(e)?e:[e]}executeInitializerGraph(){return null==this.initializer?[]:null==this.initializerSignature?this.initializer.execute({},[]):this.initializer.execute({},Object.keys(this.initializerSignature.outputs))}async executeInitializerGraphAsync(){return null==this.initializer?[]:null==this.initializerSignature?this.initializer.executeAsync({},[]):this.initializer.executeAsync({},Object.keys(this.initializerSignature.outputs))}setResourceIdToCapturedInput(e){if(this.resourceIdToCapturedInput={},this.initializerSignature){const t=this.initializerSignature.outputs,n=Object.keys(t);for(let a=0;a1?n:n[0]}async executeAsync(e,t){null==this.resourceIdToCapturedInput&&this.setResourceIdToCapturedInput(await this.executeInitializerGraphAsync()),e=this.normalizeInputs(e),t=this.normalizeOutputs(t);const n=await this.executor.executeAsync(e,t);return n.length>1?n:n[0]}getIntermediateTensors(){return this.executor.getIntermediateTensors()}disposeIntermediateTensors(){this.executor.disposeIntermediateTensors()}convertTensorMapToTensorsMap(e){return Object.keys(e).reduce(((t,n)=>(t[n]=[e[n]],t)),{})}dispose(){this.executor.dispose(),this.initializer&&(this.initializer.dispose(),this.resourceIdToCapturedInput&&ph(this.resourceIdToCapturedInput)),this.resourceManager.dispose()}}async function UT(t,n={},a=e){if(null==t)throw new Error("modelUrl in loadGraphModel() cannot be null. Please provide a url or an IOHandler that loads the model");null==n&&(n={}),n.fromTFHub&&"string"==typeof t&&(t=function(e){e.endsWith("/")||(e+="/");return`${e}${jT}${PT}`}(t));const i=new VT(t,n,a);return await i.load(),i}function WT(e,t,n=new Map,a=new Set){if(null==e)return null;if("function"==typeof Blob&&e instanceof Blob)return e.slice();if(a.has(e))throw new Error("Circular references are not supported.");if(n.has(e))return n.get(e);const i=t(e);if(i.recurse&&null!==i.value)throw new Error("A deep map function may not return both a value and recurse=true.");if(i.recurse){if(KT(e)){const i=Array.isArray(e)?[]:{};a.add(e);for(const s in e){const r=WT(e[s],t,n,a);i[s]=r}return a.delete(e),e.__proto__&&(i.__proto__=e.__proto__),i}throw new Error(`Can't recurse into non-iterable type: ${e}`)}return n.set(e,i.value),i.value}function GT(e,t=HT){return qT(e,t)}function qT(e,t,n=new Set){const a=e[0];if(n.has(a))throw new Error("Circular references are not supported.");const i=t(e);if(i.recurse&&null!==i.value)throw new Error("A deep zip function may not return both a value and recurse=true.");if(i.recurse){if(KT(a)){const i=Array.isArray(a)?[]:{};n.add(a);for(const s in a){const a=qT(e.map((e=>e[s])),t,n);i[s]=a}return n.delete(a),i}throw new Error(`Can't recurse into non-iterable type: ${a}`)}return i.value}function HT(e){return null===e?null:KT(e[0])?{value:null,recurse:!0}:{value:e,recurse:!1}}function KT(e){let t=!1;if(cr().get("IS_BROWSER"))t=e instanceof TextDecoder;else{const{StringDecoder:n}=__webpack_require__(7695);t=e instanceof n}return null!=e&&!ArrayBuffer.isView(e)&&(Array.isArray(e)||"object"==typeof e&&!(e instanceof kc)&&!(e instanceof Promise)&&!t)}function $T(e){return WT(e,ZT)}function ZT(e){return e instanceof kc?{value:e.clone(),recurse:!1}:KT(e)?{value:null,recurse:!0}:{value:e,recurse:!1}}class XT{constructor(e){if(this.capacity=e,this.begin=0,this.end=0,null==e)throw new RangeError("Can't create a ring buffer of unknown capacity.");if(e<1)throw new RangeError("Can't create ring buffer of capacity < 1.");this.data=new Array(e),this.doubledCapacity=2*e}wrap(e){for(;e<0;)e+=this.doubledCapacity;return e%this.doubledCapacity}get(e){if(e<0)throw new RangeError("Can't get item at a negative index.");return this.data[e%this.capacity]}set(e,t){if(e<0)throw new RangeError("Can't set item at a negative index.");this.data[e%this.capacity]=t}length(){let e=this.end-this.begin;return e<0&&(e=this.doubledCapacity+e),e}isFull(){return this.length()===this.capacity}isEmpty(){return 0===this.length()}push(e){if(this.isFull())throw new RangeError("Ring buffer is full.");this.set(this.end,e),this.end=this.wrap(this.end+1)}pushAll(e){for(const t of e)this.push(t)}pop(){if(this.isEmpty())throw new RangeError("Ring buffer is empty.");this.end=this.wrap(this.end-1);const e=this.get(this.end);return this.set(this.end,void 0),e}unshift(e){if(this.isFull())throw new RangeError("Ring buffer is full.");this.begin=this.wrap(this.begin-1),this.set(this.begin,e)}shift(){if(this.isEmpty())throw new RangeError("Ring buffer is empty.");const e=this.get(this.begin);return this.set(this.begin,void 0),this.begin=this.wrap(this.begin+1),e}shuffleExcise(e){if(this.isEmpty())throw new RangeError("Ring buffer is empty.");const t=this.wrap(this.begin+e),n=this.get(t);return this.set(t,this.pop()),n}}class YT extends XT{constructor(){super(YT.INITIAL_CAPACITY)}isFull(){return!1}push(e){super.isFull()&&this.expand(),super.push(e)}unshift(e){super.isFull()&&this.expand(),super.unshift(e)}expand(){const e=2*this.capacity,t=new Array(e),n=this.length();for(let e=0;e!0===e))}rowMajorBatch(e,t=!0){return new rI(this,e,t)}columnMajorBatch(e,t=!0,n=HT){return this.rowMajorBatch(e,t).map((e=>GT(e,n)))}concatenate(e,t){return new pI(new tI([this,e]),t)}take(e){return e<0||null==e?this:new sI(this,e)}skip(e){return e<0||null==e?this:new iI(this,e)}prefetch(e){return new fI(this,e)}shuffle(e,t){return new gI(this,e,t)}serial(){return new aI(this)}}class tI extends eI{constructor(e){super(),this.items=e,this.trav=0}summary(){return`Array of ${this.items.length} items`}async next(){if(this.trav>=this.items.length)return{value:null,done:!0};const e=this.items[this.trav];return this.trav++,{value:$T(e),done:!1}}}class nI extends eI{constructor(e){super(),this.nextFn=e}summary(){return"Function call"}async next(){try{return this.nextFn()}catch(e){throw e.message=`Error thrown while iterating through a dataset: ${e.message}`,e}}}class aI extends eI{constructor(e){super(),this.upstream=e,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> Serial`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){return this.upstream.next()}}class iI extends eI{constructor(e,t){super(),this.upstream=e,this.maxCount=t,this.count=0,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> Skip`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;this.count++ Take`}async next(){return this.count++>=this.maxCount?{value:null,done:!0}:this.upstream.next()}}class rI extends eI{constructor(e,t,n=!0){super(),this.upstream=e,this.batchSize=t,this.enableSmallLastBatch=n,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> RowMajorBatch`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){const e=[];for(;e.length0?{value:e,done:!1}:{value:null,done:!0};e.push(t.value)}return{value:e,done:!1}}}class oI extends eI{constructor(e,t){super(),this.upstream=e,this.predicate=t,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> Filter`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;;){const e=await this.upstream.next();if(e.done||this.predicate(e.value))return e;ph(e.value)}}}class lI extends eI{constructor(e,t){super(),this.upstream=e,this.transform=t}summary(){return`${this.upstream.summary()} -> Map`}async next(){const e=await this.upstream.next();if(e.done)return{value:null,done:!0};const t=jc(e.value),n=this.transform(e.value),a=jc(n);for(const e of t)Pc(e,a)||e.dispose();return{value:n,done:!1}}}class uI extends eI{constructor(e,t){super(),this.upstream=e,this.handler=t,this.count=0,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> handleErrors`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;;)try{return await this.upstream.next()}catch(e){if(!this.handler(e))return{value:null,done:!0}}}}class cI extends eI{constructor(e,t){super(),this.upstream=e,this.transform=t}summary(){return`${this.upstream.summary()} -> AsyncMap`}async next(){const e=await this.upstream.next();if(e.done)return{value:null,done:!0};const t=jc(e.value),n=await this.transform(e.value),a=jc(n);for(const e of t)Pc(e,a)||e.dispose();return{value:n,done:!1}}}class hI extends eI{constructor(){super(),this.outputQueue=new YT,this.lastRead=Promise.resolve({value:null,done:!1})}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;0===this.outputQueue.length();)if(!await this.pump())return{value:null,done:!0};return{value:this.outputQueue.shift(),done:!1}}}class dI extends hI{constructor(e,t){super(),this.upstream=e,this.transform=t}summary(){return`${this.upstream.summary()} -> Flatmap`}async pump(){const e=await this.upstream.next();if(e.done)return!1;const t=jc(e.value),n=this.transform(e.value),a=jc(n);this.outputQueue.pushAll(n);for(const e of t)Pc(e,a)||e.dispose();return!0}}class pI extends eI{constructor(e,t){super(),this.baseErrorHandler=t,this.lastRead=null,this.iterator=null,this.moreIterators=e}summary(){return"TODO: fill in upstream of chained summaries -> Chained"}async next(){return this.lastRead=this.readFromChain(this.lastRead),this.lastRead}async readFromChain(e){if(await e,null==this.iterator){const e=await this.moreIterators.next();if(e.done)return{value:null,done:!0};this.iterator=e.value,null!=this.baseErrorHandler&&(this.iterator=this.iterator.handleErrors(this.baseErrorHandler))}const t=await this.iterator.next();return t.done?(this.iterator=null,this.readFromChain(e)):t}}var mI;!function(e){e[e.FAIL=0]="FAIL",e[e.SHORTEST=1]="SHORTEST",e[e.LONGEST=2]="LONGEST"}(mI||(mI={}));class fI extends eI{constructor(e,t){super(),this.upstream=e,this.bufferSize=t,this.buffer=new XT(t)}summary(){return`${this.upstream.summary()} -> Prefetch`}refill(){for(;!this.buffer.isFull();){const e=this.upstream.next();this.buffer.push(e)}}next(){return this.refill(),this.buffer.shift()}}class gI extends fI{constructor(e,t,n){super(e,t),this.upstream=e,this.windowSize=t,this.upstreamExhausted=!1,this.random=Bg.alea(n||ec().toString()),this.lastRead=Promise.resolve({value:null,done:!1})}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}randomInt(e){return Math.floor(this.random()*e)}chooseIndex(){return this.randomInt(this.buffer.length())}async serialNext(){for(this.upstreamExhausted||this.refill();!this.buffer.isEmpty();){const e=this.chooseIndex(),t=await this.buffer.shuffleExcise(e);if(!t.done)return this.refill(),t;this.upstreamExhausted=!0}return{value:null,done:!0}}}class yI{constructor(){this.size=null}batch(e,t=!0){const n=this;let a;return Ns(e>0,(()=>`batchSize needs to be positive, but it is\n ${e}`)),a=this.size===1/0||null==this.size?this.size:t?Math.ceil(this.size/e):Math.floor(this.size/e),bI((async()=>(await n.iterator()).columnMajorBatch(e,t,vI)),a)}concatenate(e){const t=this;let n;return n=this.size===1/0||e.size===1/0?1/0:null!=this.size&&null!=e.size?this.size+e.size:null,bI((async()=>(await t.iterator()).concatenate(await e.iterator())),n)}filter(e){const t=this;let n;return n=this.size===1/0?1/0:null,bI((async()=>(await t.iterator()).filter((t=>dh((()=>e(t)))))),n)}async forEachAsync(e){return(await this.iterator()).forEachAsync(e)}map(e){const t=this;return bI((async()=>(await t.iterator()).map((t=>dh((()=>e(t)))))),this.size)}mapAsync(e){const t=this;return bI((async()=>(await t.iterator()).mapAsync(e)),this.size)}prefetch(e){if(null==e)throw new RangeError("`Dataset.prefetch()` requires bufferSize to be specified.");const t=this;return bI((async()=>(await t.iterator()).prefetch(e)),this.size)}repeat(e){const t=this;let n;return n=null!=this.size&&e>0?this.size*e:0===e?0:null!=this.size&&(void 0===e||e<0)?1/0:null,bI((async()=>JT(QT((async()=>({value:await t.iterator(),done:!1}))).take(e))),n)}skip(e){const t=this;let n;return n=null!=this.size&&e>=0&&this.size>=e?this.size-e:null!=this.size&&(this.size(await t.iterator()).skip(e)),n)}shuffle(e,t,n=!0){if(null==e||e<0)throw null==this.size?new RangeError("`Dataset.shuffle()` requires bufferSize to be specified."):new RangeError(`\`Dataset.shuffle()\` requires bufferSize to be specified. If your data fits in main memory (for regular JS objects), and/or GPU memory (for \`tf.Tensor\`s), consider setting bufferSize to the dataset size (${this.size} elements)`);const a=this,i=Bg.alea(t||ec().toString());return bI((async()=>{let t=i.int32();return n&&(t+=i.int32()),(await a.iterator()).shuffle(e,t.toString())}),this.size)}take(e){const t=this;let n;return n=null!=this.size&&this.size>e?e:null!=this.size&&this.size<=e?this.size:null,bI((async()=>(await t.iterator()).take(e)),n)}async toArray(){if(this.size===1/0)throw new Error("Can not convert infinite data stream to array.");return(await this.iterator()).toArray()}async toArrayForTest(){if(this.size===1/0)throw new Error("Can not convert infinite data stream to array.");return(await this.iterator()).toArrayForTest()}}function bI(e,t=null){return new class extends yI{constructor(){super(...arguments),this.size=t}async iterator(){return e()}}}function vI(e){if(null===e)return null;const t=e[0];if(null==(n=t)||null===(a=n)||"object"!=typeof a&&"function"!=typeof a||Array.isArray(n)||"object"==typeof n&&n instanceof kc||ac(n)){return{value:function(e){if(0===e.length)throw new Error("Can't make a batch of zero elements.");return e[0]instanceof kc?wy(e):oh(e)}(e),recurse:!1}}var n,a;return{value:null,recurse:!0}}yI.MAX_BUFFER_SIZE=1e4;Symbol("out"),Symbol("field"),Symbol("quote"),Symbol("quoteafterquote"),Symbol("quoteinquote");function kI(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&Ns("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the CPU backend.`))}))}const wI=Vy;class AI extends Cs{nextDataId(){return AI.nextDataId++}constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new xs(this,ch())}write(e,t,n){this.firstUse&&(this.firstUse=!1,cr().get("IS_NODE")&&_u());const a={id:this.nextDataId()};return this.data.set(a,{values:e,dtype:n,refCount:1}),a}makeTensorInfo(e,t,n){let a;if("string"===t&&null!=n&&n.length>0&&Hs(n[0])){const i=n.map((e=>tc(e)));a=this.write(i,e,t)}else a=this.write(n,e,t);return{dataId:a,shape:e,dtype:t}}refCount(e){if(this.data.has(e)){return this.data.get(e).refCount}return 0}incRef(e){this.data.get(e).refCount++}decRef(e){if(this.data.has(e)){this.data.get(e).refCount--}}move(e,t,n,a,i){this.data.set(e,{values:t,dtype:a,refCount:i})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){const{dtype:t,complexTensorInfos:n}=this.data.get(e);if("complex64"===t){return Ov(this.readSync(n.real.dataId),this.readSync(n.imag.dataId))}return function(e,t){if(Array.isArray(e))return e;if("float32"===t)return e instanceof Float32Array?e:new Float32Array(e);if("int32"===t)return e instanceof Int32Array?e:new Int32Array(e);if("bool"===t||"string"===t)return Uint8Array.from(new Int32Array(e));throw new Error(`Unknown dtype ${t}`)}(this.data.get(e).values,t)}bufferSync(e){const t=this.readSync(e.dataId);if("string"===e.dtype)try{const n=t.map((e=>nc(e)));return vd(e.shape,e.dtype,n)}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return vd(e.shape,e.dtype,t)}makeOutput(e,t,n){return ch().makeTensorFromTensorInfo(this.makeTensorInfo(t,n,e),this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;const{complexTensorInfos:n}=this.data.get(e);null!=n&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){const t=ec();e();return{kernelMs:ec()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){kI([e],"where");const t=this.readSync(e.dataId);return wI(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}}AI.nextDataId=0;function xI(e){return(t,n,a)=>{const i=Ws(n,t.length);for(let n=0;n{const{x:r}=a;kI(r,e);const o=s,l=o.data.get(r.dataId).values;let u;if("string"===r.dtype){if(!Array.isArray(l))throw new Error("String tensor's value was not an instance of Array");u=mk(l)}else u=l;const c=n||r.dtype,h=t(u,c,i);return o.makeTensorInfo(r.shape,c,h)}}fh("cpu",(()=>new AI),1);const EI=CI(mo,(e=>e>=0?e:Math.exp(e)-1)),_I={kernelName:mo,backendName:"cpu",kernelFunc:EI};function TI(e){const{inputs:t,backend:n}=e,{x:a}=t;return n.incRef(a.dataId),{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}const II={kernelName:Ro,backendName:"cpu",kernelFunc:TI};function NI(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{alpha:s}=a;kI([i],"leakyRelu");const r=zs(i.shape),o=n.data.get(i.dataId).values,l=Us("float32",r);for(let e=0;e{const r=Kd(t,n),o=r.length,l=Ys(r),u=Us(s,zs(r)),c=t.length,h=n.length,d=Ys(t),p=Ys(n),m=qd(t,r),f=qd(n,r);if(m.length+f.length===0)for(let t=0;ts[e]=0));const r=ir(s,c,d),g=n.slice(-h);f.forEach((e=>g[e]=0));const y=ir(g,h,p);u[t]=e(a[r],i[y])}return[u,r]}}const zI=DI(((e,t)=>e<0?t*e:e));function OI(e){const{inputs:t,backend:n}=e,{x:a,alpha:i}=t;kI([a,i],"prelu");const s=n.data.get(a.dataId).values,r=n.data.get(i.dataId).values,[o,l]=zI(a.shape,i.shape,s,r,"float32");return n.makeTensorInfo(l,"float32",o)}const MI={kernelName:bl,backendName:"cpu",kernelFunc:OI},BI=CI(El,(e=>Math.max(0,e))),FI={kernelName:El,backendName:"cpu",kernelFunc:BI},LI=CI(Dl,(e=>Math.min(Math.max(0,e),6))),PI={kernelName:Dl,backendName:"cpu",kernelFunc:LI},jI=xI((e=>1/(1+Math.exp(-e)))),VI=CI(ql,(e=>1/(1+Math.exp(-e)))),UI={kernelName:ql,backendName:"cpu",kernelFunc:VI};function WI(e,t,n,a,i){if("linear"===n)return TI({inputs:{x:t},backend:e});if("relu"===n)return BI({inputs:{x:t},backend:e});if("elu"===n)return EI({inputs:{x:t},backend:e});if("relu6"===n)return LI({inputs:{x:t},backend:e});if("prelu"===n)return OI({inputs:{x:t,alpha:a},backend:e});if("leakyrelu"===n)return NI({inputs:{x:t},backend:e,attrs:{alpha:i}});if("sigmoid"===n)return VI({inputs:{x:t},backend:e});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function GI(e){const{inputs:t,backend:n}=e,{real:a,imag:i}=t,s=n.data.get(a.dataId).values,r=n.data.get(i.dataId).values,o=n.makeTensorInfo(a.shape,"complex64");return n.data.get(o.dataId).complexTensorInfos={real:n.makeTensorInfo(a.shape,"float32",s),imag:n.makeTensorInfo(i.shape,"float32",r)},o}const qI={kernelName:Vr,backendName:"cpu",kernelFunc:GI};function HI(e,t,n="float32"){if("complex64"===n){return GI({inputs:{real:HI(e,t,"float32"),imag:HI(e,t,"float32")},backend:e})}const a=tr(zs(t),n);return e.makeTensorInfo(t,n,a)}function KI(e){const{inputs:t,backend:n}=e,{input:a}=t,i=n.data.get(a.dataId).complexTensorInfos.real,s=n.data.get(i.dataId).values;return n.makeTensorInfo(i.shape,i.dtype,s)}const $I={kernelName:Cl,backendName:"cpu",kernelFunc:KI};function ZI(e,t,n,a){if("int32"===a){return[t,"int32",Int32Array.from(e)]}if("bool"===a){const a=Ju([0],n),[i,s]=DI(((e,t)=>e!==t?1:0))(t,[],e,a,"bool");return[s,"bool",i]}throw new Error(`Error in Cast: failed to cast ${n} to ${a}`)}function XI(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{dtype:s}=a;if("complex64"===s){if("complex64"===i.dtype)return TI({inputs:{x:i},backend:n});const e=HI(n,i.shape,i.dtype),t=XI({inputs:{x:i},backend:n,attrs:{dtype:"float32"}}),a=GI({inputs:{real:t,imag:e},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),a}if("complex64"===i.dtype){const e=KI({inputs:{input:i},backend:n}),t=XI({inputs:{x:e},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(e),t}if(!Gs(i.dtype,s)){const e=TI({inputs:{x:i},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:s}}const r=n.data.get(i.dataId).values,[o,l,u]=ZI(r,i.shape,i.dtype,s);return n.makeTensorInfo(o,l,u)}const YI={kernelName:Lr,backendName:"cpu",kernelFunc:XI};function QI(e,t,n,a){return null==n?({inputs:n,backend:i})=>{const{a:s,b:r}=n,o=i;kI([s,r],e);const l=o.data.get(s.dataId).values,u=o.data.get(r.dataId).values,c="string"===s.dtype?mk(l):l,h="string"===s.dtype?mk(u):u,d=a||s.dtype,[p,m]=t(s.shape,r.shape,c,h,d);return o.makeTensorInfo(m,d,p)}:({inputs:e,backend:i})=>{const{a:s,b:r}=e,o=i;if("complex64"===s.dtype||"complex64"===r.dtype){const e=XI({inputs:{x:s},backend:o,attrs:{dtype:"complex64"}}),t=o.data.get(e.dataId),a=t.complexTensorInfos.real,i=t.complexTensorInfos.imag,l=o.data.get(a.dataId).values,u=o.data.get(i.dataId).values,c=XI({inputs:{x:r},backend:o,attrs:{dtype:"complex64"}}),h=o.data.get(c.dataId),d=h.complexTensorInfos.real,p=h.complexTensorInfos.imag,m=o.data.get(d.dataId).values,f=o.data.get(p.dataId).values,[g,y,b]=n(s.shape,r.shape,l,u,m,f),v=o.makeTensorInfo(b,"float32",g),k=o.makeTensorInfo(b,"float32",y),w=GI({inputs:{real:v,imag:k},backend:o});return o.disposeIntermediateTensorInfo(e),o.disposeIntermediateTensorInfo(c),o.disposeIntermediateTensorInfo(v),o.disposeIntermediateTensorInfo(k),w}{const e=o.data.get(s.dataId).values,n=o.data.get(r.dataId).values,i=a||s.dtype,[l,u]=t(s.shape,r.shape,e,n,i);return o.makeTensorInfo(u,i,l)}}}function JI(e){return(t,n,a,i,s,r)=>{const o=Kd(t,n),l=zs(o),u=o.length,c=Ys(o),h=Us("float32",l),d=Us("float32",l),p=qd(t,o),m=qd(n,o),f=Ov(a,i),g=Ov(s,r),y=t.length,b=Ys(t),v=n.length,k=Ys(n);if(p.length+m.length===0)for(let t=0;ta[e]=0));const i=ir(a,y,b),s=n.slice(-v);m.forEach((e=>s[e]=0));const r=ir(s,v,k),o=e(f[2*i],f[2*i+1],g[2*r],g[2*r+1]);h[t]=o.real,d[t]=o.imag}return[h,d,o]}}const eN=DI(((e,t)=>e+t)),tN=JI(((e,t,n,a)=>({real:e+n,imag:t+a}))),nN=QI(br,eN,tN),aN={kernelName:br,backendName:"cpu",kernelFunc:nN};function iN(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{shape:s}=a,r=zs(i.shape),o=Ps(s,r),l=zs(o);Ns(r===l,(()=>`The new shape (${o}) has ${l} elements and the old shape (${i.shape}) has ${r} elements. The new shape and old shape must have the same number of elements.`)),n.incRef(i.dataId);const u=n.data.get(i.dataId);if(null!=u.complexTensorInfos){const e=u.complexTensorInfos.real,t=u.complexTensorInfos.imag;e.shape=o,t.shape=o}return{dataId:i.dataId,shape:o,dtype:i.dtype}}const sN={kernelName:_l,backendName:"cpu",kernelFunc:iN};function rN(e){const{inputs:t,backend:n,attrs:a}=e,{a:i,b:s}=t,{transposeA:r,transposeB:o}=a;kI([i,s],"matMul");const l=i.shape.length,u=s.shape.length,c=r?i.shape[l-2]:i.shape[l-1],h=o?s.shape[u-1]:s.shape[u-2],d=r?i.shape[l-1]:i.shape[l-2],p=o?s.shape[u-2]:s.shape[u-1],m=i.shape.slice(0,-2),f=s.shape.slice(0,-2),g=zs(m),y=zs(f),b=Kd(i.shape.slice(0,-2),s.shape.slice(0,-2)).concat([d,p]);Ns(c===h,(()=>`Error in matMul: inner shapes (${c}) and (${h}) of Tensors with shapes ${i.shape} and ${s.shape} and transposeA=${r} and transposeB=${o} must match.`));const v=o?[y,p,h]:[y,h,p],k=iN({inputs:{x:i},backend:n,attrs:{shape:r?[g,c,d]:[g,d,c]}}),w=iN({inputs:{x:s},backend:n,attrs:{shape:v}}),A=r?k.shape[1]:k.shape[2],x=r?k.shape[2]:k.shape[1],C=o?w.shape[1]:w.shape[2],S=Math.max(g,y),E=n.data.get(k.dataId).values,_=n.data.get(w.dataId).values,T=Ys(k.shape),I=Ys(w.shape),[N,R,D]=r?[T[0],1,T[1]]:[T[0],T[1],1],[z,O,M]=o?[1,I[1],I[0]]:[I[1],1,I[0]],B=x*C,F=vd([S,x,C],k.dtype),L=F.values,P=n.blockSize;for(let e=0;e{const{x:t}=e.inputs,n=e.backend;kI(t,"abs");let a=new Float32Array(zs(t.shape));return a=uN(n.data.get(t.dataId).values),n.makeOutput(a,t.shape,t.dtype)}},hN=CI(gr,(e=>Math.acos(e))),dN={kernelName:gr,backendName:"cpu",kernelFunc:hN},pN=CI(yr,(e=>Math.acosh(e))),mN={kernelName:yr,backendName:"cpu",kernelFunc:pN};const fN={kernelName:vr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,a=t;kI(t,"addN");const i=a.map((e=>n.data.get(e.dataId).values)),s=vd(a[0].shape,a[0].dtype),r=s.values;for(let e=0;en&&(n=i,a=e)}d[e]=a}return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(c,"int32",d)}};const AN={kernelName:xr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s}=a;kI(i,"argMin");let r=js(s,i.shape);const o=vf(r,i.shape.length);let l=i;const u=[];null!=o&&(l=yN({inputs:{x:i},backend:n,attrs:{perm:o}}),u.push(l),r=wf(r.length,l.shape.length)),r=[r[0]],bf("argMin",r,l.shape.length);const[c,h]=gf(l.shape,r),d=tr(zs(c),"int32"),p=zs(h),m=n.data.get(l.dataId).values;for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(c,"int32",d)}},xN=CI(Cr,(e=>Math.asin(e))),CN={kernelName:Cr,backendName:"cpu",kernelFunc:xN},SN=CI(Sr,(e=>Math.asinh(e))),EN={kernelName:Sr,backendName:"cpu",kernelFunc:SN},_N=CI(Er,(e=>Math.atan(e))),TN={kernelName:Er,backendName:"cpu",kernelFunc:_N},IN=DI(((e,t)=>Math.atan2(e,t))),NN=QI(Tr,IN),RN={kernelName:Tr,backendName:"cpu",kernelFunc:NN},DN=CI(_r,(e=>Math.atanh(e))),zN={kernelName:_r,backendName:"cpu",kernelFunc:DN};function ON(e,t,n,a,i,s){const r=i.strideHeight,o=i.strideWidth,l=i.dilationHeight,u=i.dilationWidth,c=i.effectiveFilterHeight,h=i.effectiveFilterWidth,d=i.padInfo.top,p=i.padInfo.left,m="max"===s?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,f=vd(i.outShape,n),g=f.values,y=i.outShape[1]*i.outShape[2]*i.outShape[3],b=i.outShape[2]*i.outShape[3],v=i.outShape[3];for(let t=0;ty?y=r:"avg"===s&&(b+=r,k++)}if(isNaN(y))break}g[x+n*v+t]="avg"===s?b/k:y}}}return f}function MN(e,t,n,a,i=!1,s=!1){const r=vd(a.outShape,"int32"),o=a.strideHeight,l=a.strideWidth,u=a.dilationHeight,c=a.dilationWidth,h=a.effectiveFilterHeight,d=a.effectiveFilterWidth,p=a.padInfo.top,m=a.padInfo.left,f=vd(t,n,e);for(let e=0;ek&&(k=u,w=i?s?((e*a.inHeight+n)*a.inWidth+o)*a.inChannels+t:(n*a.inWidth+o)*a.inChannels+t:r*d+l)}}r.set(w,e,n,o,t)}}return r}function BN(e,t,n,a,i,s){const r=i.strideDepth,o=i.strideHeight,l=i.strideWidth,u=i.dilationDepth,c=i.dilationHeight,h=i.dilationWidth,d=i.effectiveFilterDepth,p=i.effectiveFilterHeight,m=i.effectiveFilterWidth,f=i.padInfo.front,g=i.padInfo.top,y=i.padInfo.left,b="max"===s?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,v=vd(i.outShape,n),k=v.values,w=i.outShape[1]*i.outShape[2]*i.outShape[3]*i.outShape[4],A=i.outShape[2]*i.outShape[3]*i.outShape[4],x=i.outShape[3]*i.outShape[4],C=i.outShape[4];for(let t=0;tA?A=i:"avg"===s&&(x+=i,S++),isNaN(A))break}if(isNaN(A))break}if(isNaN(A))break}k[g+t]="avg"===s?x/Math.max(S,1):A}}}}return v}const FN={kernelName:Ir,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;kI(i,"avgPool");const{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=a;Ns(fm(r,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);let c;if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))c=TI({inputs:{x:i},backend:n});else{const e=n.data.get(i.dataId).values,t=Ys(i.shape),a=ON(e,i.shape,i.dtype,t,u,"avg");c=n.makeTensorInfo(u.outShape,i.dtype,a.values)}return c}};const LN={kernelName:Rr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l,dataFormat:u}=a;kI(i,"avgPool3d");const c=rm(i.shape,s,r,1,o,l,u),h=BN(n.data.get(i.dataId).values,i.shape,i.dtype,Ys(i.shape),c,"avg");return n.makeTensorInfo(h.shape,"float32",h.values)}};const PN={kernelName:Dr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,{filterSize:r,strides:o,pad:l,dimRoundingMode:u}=a;kI([i,s],"avgPool3DGrad");const c=rm(s.shape,r,o,1,l,u),h=c.strideDepth,d=c.strideHeight,p=c.strideWidth,m=c.filterDepth,f=c.filterHeight,g=c.filterWidth,y=c.dilationDepth,b=c.dilationHeight,v=c.dilationWidth,k=c.effectiveFilterDepth,w=c.effectiveFilterHeight,A=c.effectiveFilterWidth,x=k-1-c.padInfo.front,C=A-1-c.padInfo.left,S=w-1-c.padInfo.top,E=vd(s.shape,"float32"),_=1/(m*f*g),T=n.bufferSync(i);for(let e=0;e=c.outDepth||Math.floor(a)!==a))for(let n=0;n=c.outHeight||Math.floor(i)!==i))for(let n=0;n=c.outWidth||Math.floor(s)!==s)continue;l+=T.get(e,a,i,s,t)}}}E.set(l*_,e,n,a,i,t)}return n.makeTensorInfo(E.shape,E.dtype,E.values)}};const jN={kernelName:Nr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s;kI([i,s],"avgPoolGrad");const{filterSize:o,strides:l,pad:u}=a,c=sm(r.shape,o,l,1,u),h=c.strideHeight,d=c.strideWidth,p=c.filterHeight,m=c.filterWidth,f=c.dilationHeight,g=c.dilationWidth,y=c.effectiveFilterHeight,b=c.effectiveFilterWidth,v=b-1-c.padInfo.left,k=y-1-c.padInfo.top,w=vd(r.shape,"float32"),A=1/(p*m),x=n.data.get(i.dataId).values,C=vd(i.shape,"float32",x);for(let e=0;e=c.outHeight||Math.floor(a)!==a))for(let n=0;n=c.outWidth||Math.floor(i)!==i)continue;r+=C.get(e,a,i,t)}}w.set(r*A,e,n,a,t)}return n.makeTensorInfo(w.shape,w.dtype,w.values)}};const VN={kernelName:Eo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,scale:s,offset:r,mean:o,variance:l}=t;Ns(o.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),Ns(null==r||o.shape.length===r.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),Ns(null==s||o.shape.length===s.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks.")),kI([i,o,l,s,r],"batchNorm");let{varianceEpsilon:u}=a;null==u&&(u=.001);const c=n.data.get(i.dataId).values,h=n.data.get(o.dataId).values,d=n.data.get(l.dataId).values,p=s?n.data.get(s.dataId).values:new Float32Array([1]),m=r?n.data.get(r.dataId).values:new Float32Array([0]),f=new Float32Array(c.length),g=m.length,y=p.length,b=d.length,v=h.length;let k=0,w=0,A=0,x=0;for(let e=0;e=g&&(k=0),w>=v&&(w=0),A>=y&&(A=0),x>=b&&(x=0);return n.makeTensorInfo(i.shape,i.dtype,f)}};function UN(e,t,n,a,i){const s=Vp(a,t,n),r=zs(n),o=Ys(a);if(s){const n=Up(t,o);return"string"===i?e.slice(n,n+r):e.subarray(n,n+r)}const l=vd(a,i,"string"===i?mk(e):e),u=vd(n,i);for(let e=0;ee+t[n]));u.set(l.get(...a),...n)}return"string"===i?fk(u.values):u.values}function WN(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{begin:s,size:r}=a;kI(i,"slice");const[o,l]=Wp(i,s,r);Ip(i,o,l);const u=UN(n.data.get(i.dataId).values,o,l,i.shape,i.dtype);return n.makeTensorInfo(l,i.dtype,u)}const GN={kernelName:Vl,backendName:"cpu",kernelFunc:WN};const qN={kernelName:Or,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockShape:s,crops:r}=a;kI([i],"batchToSpaceND");const o=s.reduce(((e,t)=>e*t)),l=kv(i.shape,s,o),u=wv(l.length,s.length),c=Av(i.shape,s,o),h=xv(r,s.length),d=Cv(c,r,s.length),p=iN({inputs:{x:i},backend:n,attrs:{shape:l}}),m=yN({inputs:{x:p},backend:n,attrs:{perm:u}}),f=iN({inputs:{x:m},backend:n,attrs:{shape:c}}),g=WN({inputs:{x:f},backend:n,attrs:{begin:h,size:d}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),g}};function HN(e,t,n,a,i){const s=zs(a),r=tr(i,n);for(let n=0;n=i||(r[a]+=s>0?t[n]:1)}return r}function KN(e,t,n,a=!1){const i=e.shape[0],s=e.shape[1],r=vd([i,n],t.dtype);for(let o=0;o=n||(a?r.set(1,o,s):t.size>0?r.set(r.get(o,s)+t.get(o,i),o,s):r.set(r.get(o,s)+1,o,s))}return r}const $N={kernelName:Mr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,weights:s}=t,{size:r}=a,o=HN(n.data.get(i.dataId).values,n.data.get(s.dataId).values,s.dtype,s.shape,r);return n.makeTensorInfo([r],s.dtype,o)}},ZN=DI(((e,t)=>e&t)),XN=QI(Br,ZN),YN={kernelName:Br,backendName:"cpu",kernelFunc:XN};const QN={kernelName:Fr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{s0:a,s1:i}=t,s=n.data.get(a.dataId).values,r=n.data.get(i.dataId).values,o=Kd(Array.from(s),Array.from(r));return n.makeTensorInfo([o.length],"int32",Int32Array.from(o))}},JN=xI((e=>Math.ceil(e))),eR=SI(Pr,JN),tR={kernelName:Pr,backendName:"cpu",kernelFunc:eR},nR=CI(jr,((e,t)=>{const n=t;return e>n.clipValueMax?n.clipValueMax:e{const{x:t}=e.inputs,n=e.backend,a=new Float32Array(zs(t.shape)),i=n.data.get(t.dataId),s=i.complexTensorInfos.real,r=i.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(r.dataId).values;for(let e=0;e{const n=zs(e.shape);i.set(e.vals,t),t+=n}))}else{let a=0;e.forEach((e=>{const s="string"===n?mk(e.vals):e.vals;let r=0;for(let n=0;ne.shape)),s);let r=cv(t.map((e=>e.shape)),s);if(0===zs(r))return n.makeTensorInfo(r,t[0].dtype,[]);const o=t.filter((e=>zs(e.shape)>0));if(1===o.length)return TI({inputs:{x:o[0]},backend:n});if("complex64"===o[0].dtype){const e=o.map((e=>KI({inputs:{input:e},backend:n}))),t=o.map((e=>rR({inputs:{input:e},backend:n}))),a=lR({inputs:e,backend:n,attrs:{axis:s}}),i=lR({inputs:t,backend:n,attrs:{axis:s}}),r=GI({inputs:{real:a,imag:i},backend:n});return e.forEach((e=>n.disposeIntermediateTensorInfo(e))),t.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(a),n.disposeIntermediateTensorInfo(i),r}const l=o.map((e=>{const t=zs(e.shape.slice(s));return iN({inputs:{x:e},backend:n,attrs:{shape:[-1,t]}})})),u=l.map((e=>({vals:n.data.get(e.dataId).values,shape:e.shape})));r=cv(l.map((e=>e.shape)),1);const c=1===l[0].shape[0],h=sR(u,r,t[0].dtype,c),d=cv(o.map((e=>e.shape)),s),p=n.makeTensorInfo(d,t[0].dtype,h);return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const uR={kernelName:Wr,backendName:"cpu",kernelFunc:lR};function cR(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dataFormat:l,dilations:u,dimRoundingMode:c}=a;kI([i,s],"conv2d");const h=ym(l),d=om(i.shape,s.shape,r,u,o,c,!1,h),p=d.filterHeight,m=d.filterWidth,f=d.dilationHeight,g=d.dilationWidth,y=d.padInfo.left,b=d.padInfo.top,v="channelsLast"===d.dataFormat,k=new gc(d.outShape,i.dtype),w=Ys(i.shape),A=Ys(s.shape),x=w[0],C=v?w[1]:w[2],S=v?w[2]:1,E=v?1:w[1],_=k.strides[0],T=v?k.strides[1]:k.strides[2],I=v?k.strides[2]:1,N=v?1:k.strides[1],R=n.data.get(i.dataId).values,D=n.data.get(s.dataId).values,z=k.values;for(let e=0;e=d.inHeight)continue;const s=e*A[0],r=t+n*C;for(let e=0;e=d.inWidth)continue;const i=r+a*S;let o=s+e*A[1];for(let e=0;e=u.inDepth)continue;const s=e*S[0],r=t+n*C[1];for(let e=0;e=u.inHeight)continue;const i=s+e*S[1],o=r+a*C[2];for(let e=0;e=u.inWidth)continue;const s=i+e*S[2],r=o+t*u.inChannels;let l=s;for(let e=0;eMath.cos(e))),bR={kernelName:Xr,backendName:"cpu",kernelFunc:yR},vR=CI(Yr,(e=>Math.cosh(e))),kR={kernelName:Yr,backendName:"cpu",kernelFunc:vR};const wR={kernelName:eo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{image:i,boxes:s,boxInd:r}=t,{cropSize:o,method:l,extrapolationValue:u}=a,[c,h,d,p]=i.shape,m=s.shape[0],[f,g]=o,y=vd([m,f,g,p],"float32"),b=n.data.get(s.dataId).values,v=n.data.get(r.dataId).values,k=n.data.get(i.dataId).values,w=Ys(i.shape),A=Ys(y.shape);for(let e=0;e=c)continue;const o=f>1?(i-n)*(h-1)/(f-1):0,m=g>1?(s-a)*(d-1)/(g-1):0;for(let t=0;t1?n*(h-1)+t*o:.5*(n+i)*(h-1);if(c<0||c>h-1)for(let n=0;n1?a*(d-1)+l*m:.5*(a+s)*(d-1);if(c<0||c>d-1){for(let n=0;n1?a*(d-1)+n*m:.5*(a+s)*(d-1);if(i<0||i>d-1){for(let a=0;ae+m-t-1:(e,t)=>e+t;for(let e=0;ee+m-t-1:(e,t)=>e+t;for(let e=0;e`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${r}`));const o=i.shape[0],l=i.shape[1],u=i.shape[2],c=i.shape[3],h=l*s,d=u*s,p=c/(s*s),m=n.data.get(i.dataId).values,f=new Float32Array(o*h*d*p);let g=0;for(let e=0;e`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${r} and dilations '${d}'`));const p=om(i.shape,s.shape,r,d,o,u,!0),{filterHeight:m,filterWidth:f,dilationHeight:g,dilationWidth:y,padInfo:b}=p,v=b.left,k=b.top,w=p.outChannels/p.inChannels,A=new gc(p.outShape,i.dtype),x=n.data.get(i.dataId).values,C=n.data.get(s.dataId).values,S=A.values;for(let e=0;e=p.inHeight)continue;const s=e*h[0],r=t+n*c[1];for(let e=0;e=p.inWidth)continue;const i=s+e*h[1],o=r+a*p.inChannels;let l=t,u=i;for(let e=0;e{const{x:a,filter:i}=e,{strides:s,pad:r,dilations:o}=n,l=t,u=l.data.get(a.dataId).values,c=a.shape.length,h=l.data.get(i.dataId).values,d=i.shape.length,{batchSize:p,inHeight:m,inWidth:f,inChannels:g,outHeight:y,outWidth:b,padInfo:v,strideHeight:k,strideWidth:w,filterHeight:A,filterWidth:x,dilationHeight:C,dilationWidth:S,outShape:E}=im(a.shape,i.shape,s,r,"NHWC",o),_=zs(E),T=E.length,I=Ws(a.dtype,_);for(let e=0;e=0&&s=0&&pl&&(l=f)}}}I[ir([e,t,s,o],T,Ys(E))]=l}}}return{dataId:l.write(Ju(I,a.dtype),E,a.dtype),shape:E,dtype:a.dtype}}},DR={kernelName:uo,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a,filter:i,dy:s}=e,{strides:r,pad:o,dilations:l}=n,u=t,c=Js(a.shape,u.data.get(a.dataId).values),h=Js(i.shape,u.data.get(i.dataId).values),{batchSize:d,inHeight:p,inWidth:m,inChannels:f,outHeight:g,outWidth:y,padInfo:b,strideHeight:v,strideWidth:k,filterHeight:w,filterWidth:A,dilationHeight:x,dilationWidth:C,outShape:S}=im(a.shape,i.shape,r,o,"NHWC",l);Ns(s.rank===S.length,(()=>`Error in ${uo}, dy must have the same rank as output ${S.length}, but got ${s.rank}`));const E=Js(S,u.data.get(s.dataId).values),_=nr(i.shape,i.dtype);for(let e=0;e=0&&a=0&&ur&&(r=i,o=t,l=n)}}}_[o][l][s]+=E[e][t][a][s]}}}return{dataId:u.write(Ju(_,a.dtype),i.shape,i.dtype),shape:i.shape,dtype:i.dtype}}},zR={kernelName:lo,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a,filter:i,dy:s}=e,{strides:r,pad:o,dilations:l}=n,u=t,c=Js(a.shape,u.data.get(a.dataId).values),h=Js(i.shape,u.data.get(i.dataId).values),{batchSize:d,inHeight:p,inWidth:m,inChannels:f,outHeight:g,outWidth:y,padInfo:b,strideHeight:v,strideWidth:k,filterHeight:w,filterWidth:A,dilationHeight:x,dilationWidth:C,outShape:S}=im(a.shape,i.shape,r,o,"NHWC",l);Ns(s.rank===S.length,(()=>`Error in ${lo}, dy must have the same rank as output ${S.length}, but got ${s.rank}`));const E=Js(S,u.data.get(s.dataId).values),_=nr(a.shape,a.dtype);for(let e=0;e=0&&a=0&&ur&&(r=i,o=a,l=u)}}}_[e][o][l][s]+=E[e][t][a][s]}}}return{dataId:u.write(Ju(_,a.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}};const OR={kernelName:co,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{image:i}=t,{canvas:s,options:r}=a,{contextOptions:o,imageOptions:l}=r||{},u=(null==l?void 0:l.alpha)||1,c=(null==o?void 0:o.contextType)||"2d";if("2d"!==c)throw new Error(`Context type ${o.contextType} is not supported by the CPU backend.`);const h=s.getContext(c,(null==o?void 0:o.contextAttributes)||{});if(null==h)throw new Error(`Could not get the context with ${c} type.`);const[d,p]=i.shape.slice(0,2),m=2===i.shape.length?1:i.shape[2],f=n.data.get(i.dataId).values,g="float32"===i.dtype?255:1,y=new Uint8ClampedArray(p*d*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${a}.`)}else if("int32"===i.dtype&&(a<0||a>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${a}.`);1===m?(t[0]=a*g,t[1]=a*g,t[2]=a*g):t[n]=a*g}const n=4*e;y[n+0]=Math.round(t[0]),y[n+1]=Math.round(t[1]),y[n+2]=Math.round(t[2]),y[n+3]=Math.round(t[3])}s.width=p,s.height=d;const b=new ImageData(y,p,d);return h.putImageData(b,0,0),i}},MR=DI(((e,t)=>e*t)),BR=JI(((e,t,n,a)=>({real:e*n-t*a,imag:e*a+t*n}))),FR=QI(ol,MR,BR),LR={kernelName:ol,backendName:"cpu",kernelFunc:FR};function PR(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a;let o;kI(i,"sum"),o="bool"===i.dtype?XI({inputs:{x:i},backend:n,attrs:{dtype:"int32"}}):TI({inputs:{x:i},backend:n});const l=o.shape.length,u=js(s,o.shape),c=vf(u,l);let h=u,d=o;null!=c&&(d=yN({inputs:{x:o},backend:n,attrs:{perm:c}}),h=wf(h.length,l)),bf("sum",h,d.shape.length);const[p,m]=gf(d.shape,h);let f=HI(n,p,Oc(d.dtype,"int32"));const g=zs(m),y=n.data.get(f.dataId).values,b=n.data.get(d.dataId).values;for(let e=0;e=0&&(d=PR({inputs:{x:d},backend:n,attrs:{axis:u[e]-(r.length-p),keepDims:!1}}),m.push(d)),p--)}for(const e of m)e!==d&&n.disposeIntermediateTensorInfo(e);return d}};const UR={kernelName:fo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{dy:a,y:i}=t;kI([a,i],"eluGrad");const s=new Float32Array(zs(i.shape)),r=n.data.get(i.dataId).values,o=n.data.get(a.dataId).values;for(let e=0;e=0?o[e]:o[e]*(t+1)}return n.makeTensorInfo(i.shape,"float32",s)}},WR=DI(((e,t)=>e===t?1:0)),GR=QI(yo,WR,null,"bool"),qR={kernelName:yo,backendName:"cpu",kernelFunc:GR},HR=Tv,KR=Iv,$R=Nv,ZR=Rv,XR=Dv,YR=zv,QR=CI(go,(e=>{const t=Math.sign(e),n=Math.abs(e),a=1/(1+HR*n);return t*(1-((((YR*a+XR)*a+ZR)*a+$R)*a+KR)*a*Math.exp(-n*n))})),JR={kernelName:go,backendName:"cpu",kernelFunc:QR},eD=xI((e=>Math.exp(e))),tD=SI(bo,eD,"float32"),nD={kernelName:bo,backendName:"cpu",kernelFunc:tD};function aD(e){const{inputs:t,backend:n,attrs:a}=e,{input:i}=t,{dim:s}=a,r=i.shape.length,o=i.shape.slice();let l=s;return s<0&&(Ns(-(r+1)<=s,(()=>`Axis must be in the interval [${-(r+1)}, ${r}]`)),l=r+s+1),o.splice(l,0,1),iN({inputs:{x:i},backend:n,attrs:{shape:o}})}const iD={kernelName:vo,backendName:"cpu",kernelFunc:aD},sD=xI((e=>Math.expm1(e))),rD=SI(ko,sD),oD={kernelName:ko,backendName:"cpu",kernelFunc:rD},lD=DI(((e,t)=>e/t)),uD=QI(ho,lD),cD={kernelName:ho,backendName:"cpu",kernelFunc:uD},hD=DI(((e,t)=>e-t)),dD=JI(((e,t,n,a)=>({real:e-n,imag:t-a}))),pD=QI(cu,hD,dD),mD={kernelName:cu,backendName:"cpu",kernelFunc:pD};function fD(e,t,n){const a=e.shape,i=a[0],s=a[1],r=n.data.get(e.dataId),o=r.complexTensorInfos.real,l=r.complexTensorInfos.imag,u=[i,s],c=zs(u),h=Us("float32",c),d=Us("float32",c);for(let e=0;e{const{image:a}=e,i=n,s=Us(a.dtype,zs(a.shape)),[r,o,l,u]=a.shape,c=i.data.get(a.dataId).values;for(let e=0;e=0&&rMath.floor(e))),xD=SI(Co,AD),CD={kernelName:Co,backendName:"cpu",kernelFunc:xD},SD=DI(((e,t)=>Math.floor(e/t))),ED=QI(So,SD,null,"int32"),_D={kernelName:So,backendName:"cpu",kernelFunc:ED};const TD={kernelName:Su,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:m}=a;let f=cR({inputs:{x:i,filter:s},backend:n,attrs:{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d}});if(r){const e=f;if("NCHW"===c&&1===r.shape.length&&1!==r.shape[0]){const e=iN({inputs:{x:r},backend:n,attrs:{shape:[r.shape[0],1,1]}});f=nN({inputs:{a:f,b:e},backend:n}),n.disposeIntermediateTensorInfo(e)}else f=nN({inputs:{a:f,b:r},backend:n});n.disposeIntermediateTensorInfo(e)}if(p){const e=f;if("NCHW"===c&&"prelu"===p&&1===o.shape.length&&1!==o.shape[0]){const e=iN({inputs:{x:o},backend:n,attrs:{shape:[o.shape[0],1,1]}});f=WI(n,f,p,e,m),n.disposeIntermediateTensorInfo(e)}else f=WI(n,f,p,o,m);n.disposeIntermediateTensorInfo(e)}return f}};const ID={kernelName:Eu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:m}=a;let f=ER({inputs:{x:i,filter:s},backend:n,attrs:{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d}});if(r){const e=f;f=nN({inputs:{a:f,b:r},backend:n}),n.disposeIntermediateTensorInfo(e)}if(p){const e=f;f=WI(n,f,p,o,m),n.disposeIntermediateTensorInfo(e)}return f}};function ND(e,t,n,a,i,s,r,o,l){const u=vd([a,s],n);for(let n=0;n=l/s)throw new Error(`Invalid indices: ${a} does not index into ${o}`);for(let e=0;e=0,(()=>`GatherV2: the index value ${t} is not in [0, ${c-1}]`))}let h=o;null==o&&(h=0);const d=zs(s.shape),p=pk(i,s,l,h),m=iN({inputs:{x:i},backend:n,attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]}}),f=iN({inputs:{x:s},backend:n,attrs:{shape:[p.batchSize,d/p.batchSize]}}),g=[p.batchSize,p.outerSize,d/p.batchSize,p.sliceSize],y=n.bufferSync(f),b=DD(n.bufferSync(m),y,g);return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),n.makeTensorInfo(p.outputShape,b.dtype,b.values)}},OD=DI(((e,t)=>e>t?1:0)),MD=QI(Io,OD,null,"bool"),BD={kernelName:Io,backendName:"cpu",kernelFunc:MD},FD=DI(((e,t)=>e>=t?1:0)),LD=QI(No,FD,null,"bool"),PD={kernelName:No,backendName:"cpu",kernelFunc:LD};const jD={kernelName:Do,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{input:a}=t,i=zs(a.shape),s=a.shape[a.shape.length-1],r=iN({inputs:{x:a},backend:n,attrs:{shape:[i/s,s]}}),o=fD(r,!0,n),l=iN({inputs:{x:o},backend:n,attrs:{shape:a.shape}});return n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(o),l}},VD=CI(Oo,(e=>Number.isFinite(e)?1:0),"bool"),UD={kernelName:Oo,backendName:"cpu",kernelFunc:VD},WD=CI(Mo,(e=>Math.abs(e)===1/0?1:0),"bool"),GD={kernelName:Mo,backendName:"cpu",kernelFunc:WD},qD=CI(Bo,(e=>Number.isNaN(e)?1:0),"bool"),HD={kernelName:Bo,backendName:"cpu",kernelFunc:qD},KD=DI(((e,t)=>ee<=t?1:0)),YD=QI(Po,XD,null,"bool"),QD={kernelName:Po,backendName:"cpu",kernelFunc:YD};function JD(e,t,n){const a=(t-e)/(n-1),i=tr(n,"float32");i[0]=e;for(let e=1;eMath.log(e))),nz=SI(Vo,tz),az={kernelName:Vo,backendName:"cpu",kernelFunc:nz},iz=CI(Uo,(e=>Math.log1p(e))),sz={kernelName:Uo,backendName:"cpu",kernelFunc:iz},rz=DI(((e,t)=>e&&t)),oz=QI(Wo,rz,null,"bool"),lz={kernelName:Wo,backendName:"cpu",kernelFunc:oz},uz=CI(Go,(e=>e?0:1),"bool"),cz={kernelName:Go,backendName:"cpu",kernelFunc:uz},hz=DI(((e,t)=>e||t)),dz=QI(qo,hz,null,"bool"),pz={kernelName:qo,backendName:"cpu",kernelFunc:dz};const mz={kernelName:Ho,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{depthRadius:s,bias:r,alpha:o,beta:l}=a;kI(i,"LRN");const u=i.shape[3],c=u-1,h=n.data.get(i.dataId).values,d=zs(i.shape),p=new Float32Array(d);function m(e){const t=e%u;let n=e-t+Math.max(0,t-s);const a=e-t+Math.min(t+s,c);let i=0;for(;n<=a;n++){const e=h[n];i+=e*e}return i}for(let e=0;es)&&(s=t)}i[n]=s}return i}function yz(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{reductionIndices:s,keepDims:r}=a,o=n;let l=i.shape;const u=l.length,c=js(s,l);let h=c;const d=vf(h,u);let p=o.data.get(i.dataId).values;if(null!=d){const e=new Array(u);for(let t=0;tMath.max(e,t))),kz=QI(Zo,vz),wz={kernelName:Zo,backendName:"cpu",kernelFunc:kz};const Az={kernelName:Xo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;kI(i,"maxPool");const{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=a;Ns(fm(r,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);let c;if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))c=TI({inputs:{x:i},backend:n});else{const e=n.data.get(i.dataId).values,t=Ys(i.shape),a=ON(e,i.shape,i.dtype,t,u,"max");c=n.makeTensorInfo(u.outShape,i.dtype,a.values)}return c}};const xz={kernelName:Qo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l,dataFormat:u}=a;kI(i,"maxPool3d");const c=rm(i.shape,s,r,1,o,l,u),h=BN(n.data.get(i.dataId).values,i.shape,i.dtype,Ys(i.shape),c,"max");return n.makeTensorInfo(h.shape,"float32",h.values)}};const Cz={kernelName:Jo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,{filterSize:r,strides:o,pad:l,dimRoundingMode:u}=a;kI([i,s],"maxPool3DGrad");const c=rm(s.shape,r,o,1,l,u),h=function(e,t){const n=vd(t.outShape,"int32"),a=t.strideDepth,i=t.strideHeight,s=t.strideWidth,r=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,u=t.effectiveFilterDepth,c=t.effectiveFilterHeight,h=t.effectiveFilterWidth,d=t.padInfo.front,p=t.padInfo.top,m=t.padInfo.left;for(let f=0;f=C&&(C=o,S=n*c*h+i*c+r)}}}n.set(S,f,y,a,i,g)}}}return n}(n.bufferSync(s),c),d=c.strideDepth,p=c.strideHeight,m=c.strideWidth,f=c.dilationDepth,g=c.dilationHeight,y=c.dilationWidth,b=c.effectiveFilterDepth,v=c.effectiveFilterHeight,k=c.effectiveFilterWidth,w=b-1-c.padInfo.front,A=k-1-c.padInfo.left,x=v-1-c.padInfo.top,C=vd(s.shape,"float32"),S=n.bufferSync(i);for(let e=0;e=c.outDepth||Math.floor(a)!==a))for(let i=0;i=c.outHeight||Math.floor(s)!==s))for(let r=0;r=c.outWidth||Math.floor(u)!==u)continue;const d=b*v*k-1-h.get(e,a,s,u,t)===n*v*k+i*k+r?1:0;if(0===d)continue;l+=S.get(e,a,s,u,t)*d}}}C.set(l,e,n,a,i,t)}return n.makeTensorInfo(C.shape,C.dtype,C.values)}};const Sz={kernelName:Yo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s,output:r}=t,o=s;kI([s,r],"maxPoolGrad");const{filterSize:l,strides:u,pad:c,dimRoundingMode:h}=a,d=sm(o.shape,l,u,1,c,h),p=n.data.get(o.dataId).values,m=vd(d.outShape,o.dtype,MN(p,o.shape,o.dtype,d).values),f=d.strideHeight,g=d.strideWidth,y=d.dilationHeight,b=d.dilationWidth,v=d.effectiveFilterHeight,k=d.effectiveFilterWidth,w=k-1-d.padInfo.left,A=v-1-d.padInfo.top,x=vd(o.shape,"float32"),C=n.data.get(i.dataId).values,S=vd(i.shape,"float32",C);for(let e=0;e=d.outHeight||Math.floor(a)!==a))for(let i=0;i=d.outWidth||Math.floor(o)!==o)continue;const l=v*k-1-m.get(e,a,o,t)===n*k+i?1:0;if(0===l)continue;r+=S.get(e,a,o,t)*l}}x.set(r,e,n,a,t)}return n.makeTensorInfo(x.shape,x.dtype,x.values)}};const Ez={kernelName:el,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:a}=e,{filterSize:i,strides:s,pad:r,includeBatchInIndex:o}=t,l=n;kI(a,"MaxPoolWithArgmax");const u=l.data.get(a.dataId).values,c=sm(a.shape,i,s,[1,1],r),[h,d]=function(e,t,n,a,i){const s=ON(e,0,n,Ys(t),i,"max"),r=MN(e,t,n,i,!0,a);return[s.values,r.values]}(u,a.shape,a.dtype,o,c),p=l.write(h,c.outShape,a.dtype),m=l.write(d,c.outShape,a.dtype);return[{dataId:p,shape:c.outShape,dtype:a.dtype},{dataId:m,shape:c.outShape,dtype:"int32"}]}};const _z={kernelName:tl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=js(s,i.shape),l=zs(gf(i.shape,o)[1]),u=[],c=n.makeTensorInfo([],"float32",new Float32Array([l]));u.push(c);const h=XI({inputs:{x:i},backend:n,attrs:{dtype:"float32"}});u.push(h);const d=uD({inputs:{a:h,b:c},backend:n});u.push(d);const p=PR({inputs:{x:d},backend:n,attrs:{axis:s,keepDims:r}});return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}};const Tz={kernelName:nl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a;kI(i,"min");const o=js(s,i.shape);let l=o;const u=vf(l,i.shape.length);let c=i;null!=u&&(c=yN({inputs:{x:i},backend:n,attrs:{perm:u}}),l=wf(l.length,i.shape.length)),bf("min",l,c.shape.length);const[h,d]=gf(c.shape,l),p=zs(d),m=tr(zs(h),c.dtype),f=n.data.get(c.dataId).values;for(let e=0;eMath.min(e,t))),Nz=QI(al,Iz),Rz={kernelName:al,backendName:"cpu",kernelFunc:Nz};const Dz={kernelName:il,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{paddings:s,mode:r}=a;kI(i,"mirrorPad");const o=s.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=s.map((e=>e[0])),u=s.map(((e,t)=>e[0]+i.shape[t])),c="reflect"===r?0:1,h=n.data.get(i.dataId).values,d=i.shape.length,p=Ys(i.shape),m=zs(o),f=o.length,g=Ys(o),y=Us(i.dtype,m);for(let e=0;e=u[e]&&(t[e]=2*(u[e]-1)-t[e]+c);t=t.map(((e,t)=>e-l[t]));const n=ir(t,d,p);y[e]=h[n]}return{dataId:n.write(y,o,i.dtype),shape:o,dtype:i.dtype}}},zz=DI(((e,t)=>{const n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t})),Oz=QI(sl,zz),Mz={kernelName:sl,backendName:"cpu",kernelFunc:Oz};function Bz(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{dim:s}=a,r=i.shape.length;let o=s;if(-1===o&&(o=r-1),o!==r-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${r} and dim was ${o}`);const l=js([o],i.shape),u=yz({inputs:{x:i},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),c=yf(u.shape,l),h=iN({inputs:{x:u},backend:n,attrs:{shape:c}}),d=pD({inputs:{a:i,b:h},backend:n}),p=tD({inputs:{x:d},backend:n}),m=PR({inputs:{x:p},backend:n,attrs:{axis:l,keepDims:!1}}),f=iN({inputs:{x:m},backend:n,attrs:{shape:c}}),g=uD({inputs:{a:p,b:f},backend:n});return n.disposeIntermediateTensorInfo(u),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),g}const Fz={kernelName:Yl,backendName:"cpu",kernelFunc:Bz};const Lz={kernelName:rl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{numSamples:s,seed:r,normalized:o}=a;kI(i,"multinomial");const l=o?i:Bz({inputs:{logits:i},backend:n,attrs:{dim:-1}}),u=l.shape[0],c=l.shape[1],h=n.data.get(l.dataId).values,d=[u,s],p=tr(zs(d),"int32");for(let e=0;ee!==t?1:0)),$z=QI(ul,Kz,null,"bool"),Zz={kernelName:ul,backendName:"cpu",kernelFunc:$z};const Xz={kernelName:ml,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{indices:i}=t,{dtype:s,depth:r,onValue:o,offValue:l}=a;kI(i,"oneHot");const u=zs(i.shape),c=new Float32Array(u*r);c.fill(l);const h=n.data.get(i.dataId).values;for(let e=0;e=0&&h[e]{Rs(s,e.shape,"All tensors passed to stack must have matching shapes"),Ns(r===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const o=[],l=lR({inputs:t.map((e=>{const t=aD({inputs:{input:e},backend:n,attrs:{dim:i}});return o.push(t),t})),backend:n,attrs:{axis:i}});return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),l}const tO={kernelName:fl,backendName:"cpu",kernelFunc:eO};const nO={kernelName:gl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{paddings:s,constantValue:r}=a;kI(i,"pad");const o=s.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=s.map((e=>e[0])),u=n.data.get(i.dataId).values,c=zs(i.shape),h=i.shape.length,d=Ys(i.shape),p=zs(o),m=o.length,f=Ys(o),g=Us(i.dtype,p);0!==r&&g.fill(r);for(let e=0;ee+l[t])),m,f)]=u[e]}return{dataId:n.write(g,o,i.dtype),shape:o,dtype:i.dtype}}},aO=DI(((e,t)=>Math.pow(e,t))),iO=QI(yl,aO),sO={kernelName:yl,backendName:"cpu",kernelFunc:iO};function rO(e,t,n,a){const[i,s]=gf(e,a),r=Oc(t,"int32"),o=tr(zs(i),r),l=zs(s);for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(y,g,m)}};function lO(e,t,n,a){const i=[];let s=0;const r=t.length-1+n.length,o=new Array(r).fill(null).map((()=>[0]));!function(e,t){for(let n=0;ni)throw new Error("Ragged splits must not point past values");for(let e=1;ea[e])throw new Error("Ragged splits must be sorted in ascending order")}}(n,a);let l=1;for(let e=0;e=0){const e=o[i],t=e[e.length-1]-a[r];for(let e=r;e{if(e<0||e>=n){const i=sr(a,t.length,Ys(t)).join(",");throw new Error(`indices[${i}] = ${e} is not in [0, ${n})`)}}))}(s,r,t[0][0]-1),0===a.length)throw new Error("params.rank must be nonzero");const l=a[0],{outSplits:u,valueSlices:c,numValues:h}=lO(s,r,e,l),d=function(e){const t=[];for(let n=0;na[t]=e))}return t}(u),p=cO(n,a,i,c,h);return[d,p[0],p[1]]}const dO={kernelName:kl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{paramsNestedSplits:i,paramsDenseValues:s,indices:r}=t,{outputRaggedRank:o}=a,l=i.map((e=>n.data.get(e.dataId).values)),u=i.map((e=>e.shape)),c=n.data.get(s.dataId).values,h=n.data.get(r.dataId).values,[d,p,m]=hO(l,u,c,s.shape,s.dtype,h,r.shape),f=d.map((e=>n.makeTensorInfo([e.length],"int32",e))),g=n.makeTensorInfo(m,s.dtype,p);return f.concat([g])}},pO=2147483647;function mO(e,t,n,a,i,s,r){if(t.length>1)throw new Error("starts must be a scalar or vector");if(i.length>1)throw new Error("limits must be a scalar or vector");if(r.length>1)throw new Error("deltas must be a scalar or vector");const o=0===t.length,l=0===i.length,u=0===r.length,c=[];o||c.push(t[0]),l||c.push(i[0]),u||c.push(r[0]);for(let e=1;e0&&in)c=0;else if(c=Math.ceil(Math.abs((i-n)/r)),c>pO)throw new Error(`Requires ((limit - start) / delta) <= ${pO}`);d[t+1]=d[t]+c}const p=Ws(n,d[h]);let m=0;for(let t=0;tn&&(n=t)}return n}static getMaxWidthValueRowID(e){const t=e.length;if(0===t)return 0;let n=0,a=e[0],i=0;for(let s=1;s"Final length of result must be equal to firstDimension.")),i}calculateOutputIndexRowSplit(e,t,n,a){const i=e.length,s=[];for(let r=0;r0&&s.length!==e[i-1])throw new Error("Invalid row split size.");return s}calculateOutputIndexValueRowID(e,t,n,a){const i=e.length,s=[];if(0===i)return[];let r=0,o=e[0];if(o>=t.length)throw new Error(`Got currentValueRowId=${o}, which is not less than ${t.length}`);let l=t[o];s.push(l);for(let u=1;u=0&&(++r,r=t.length)throw new Error(`Got nextValueRowId=${i} which is not less than ${t.length}`);l=t[i]}s.push(l)}if(s.length!==e.length)throw new Error("Invalid row ids.");return s}calculateOutputIndex(e,t,n,a){const i=this.getRowPartitionTensor(e),s=this.getRowPartitionTypeByDimension(e);switch(s){case gO.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(i,t,n,a);case gO.ROW_SPLITS:if(i.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${i.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(i,t,n,a);default:throw new Error(`Unsupported partition type: ${gO[s]}`)}}getFirstDimensionSize(){const e=this.rowPartitionValues[0];if(0===this.rowPartitionTypes.length)throw new Error("No row_partition_types given.");const t=this.rowPartitionTypes[0];switch(t){case gO.FIRST_DIM_SIZE:return e[0];case gO.VALUE_ROWIDS:throw new Error("Cannot handle VALUE_ROWIDS in first dimension.");case gO.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${gO[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error("Invalid first partition input. Tensor requires at least one element.");const e=this.getFirstDimensionSize(),t=this.calculateOutputSize(e),n=new Array(this.raggedRank+1);n[n.length-1]=1;for(let e=n.length-2;e>=0;--e)n[e]=n[e+1]*t[e+1];const a=vO(t,!1),i=Ws(this.valuesDType,zs(a));if(n[0]*t[0]>0){let s=this.calculateFirstParentOutputIndex(e,n[0],t[0]);for(let e=1;e<=this.raggedRank;++e){s=this.calculateOutputIndex(e-1,s,n[e],t[e])}this.setOutput(this.raggedRank,s,i,a)}return[a,i]}setOutput(e,t,n,a){if(0===n.length)return;const i=this.values,s=n;let r=a.slice();r=r.slice(e+1);const o=zs(r),l=t.length;let u=this.defaultValue;if(u.length!==o&&1!==u.length){const e=this.defaultValueShape;dh((()=>{const t=vm(u,e),n=Bm(t,r);u=n.dataSync()}))}let c=0,h=0,d=0;for(let e=0;e<=l;++e){let a=e=l){const e=n.length;a=Math.floor(e/o)}if(a>d)if(1===this.defaultValue.length)s.subarray(d*o,a*o).fill(this.defaultValue[0]),d=a;else for(;a>d;){bO(s.slice(d*o),u,o),++d}a<0?(c=e+1,h=d):(c=e,h=d,d=h+1)}else++d}}}function bO(e,t,n){for(let a=0;a= 0`);if(a<-1)throw new Error(`Dimension ${a} must be >= -1`);a=-1}n.push(a)}return n}function kO(e,t,n,a,i,s,r,o,l,u){return new yO(e,t,n,a,i,s,r,o,l,u).compute()}const wO={kernelName:Al,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{shape:i,values:s,defaultValue:r,rowPartitionTensors:o}=t,{rowPartitionTypes:l}=a,u=n.data.get(i.dataId).values,c=n.data.get(s.dataId).values,h=n.data.get(r.dataId).values,d=o.map((e=>n.data.get(e.dataId).values)),p=o.map((e=>e.shape)),[m,f]=kO(u,i.shape,c,s.shape,s.dtype,h,r.shape,d,p,l);return n.makeTensorInfo(m,s.dtype,f)}};function AO(e,t,n,a){if(e===t||e1)return tr(0,a);const i=tr(Math.abs(Math.ceil((t-e)/n)),a);t1/e)),SO={kernelName:Sl,backendName:"cpu",kernelFunc:CO};const EO={kernelName:Nl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i}=t,{alignCorners:s,halfPixelCenters:r,size:o}=a;kI(i,"resizeBilinear");const l=Ys(i.shape),[u,c]=o,[h,d,p,m]=i.shape,f=n.data.get(i.dataId).values,g=new Float32Array(zs([h,u,c,m])),y=[s&&u>1?d-1:d,s&&c>1?p-1:p],b=[s&&u>1?u-1:u,s&&c>1?c-1:c];let v=0;const k=y[0]/b[0],w=y[1]/b[1];for(let e=0;e1?u-1:u,r&&p>1?c-1:c],g=[r&&d>1?d-1:d,r&&p>1?p-1:p],y=f[0]/g[0],b=f[1]/g[1],v=n.data.get(s.dataId).values;let k=0;for(let e=0;e1?d-1:d,s&&c>1?p-1:p],b=[s&&u>1?u-1:u,s&&c>1?c-1:c],v=y[0]/b[0],k=y[1]/b[1];let w=0;for(let e=0;e1?c-1:c,r&&m>1?h-1:h],b=[r&&p>1?p-1:p,r&&m>1?m-1:m],v=y[0]/b[0],k=y[1]/b[1],w=1/v,A=1/k,x=2*Math.ceil(w)+2,C=2*Math.ceil(A)+2;for(let e=0;e=p)continue;const d=t+u*l[1],f=u*v;if(e===Math.min(c-1,r?Math.round(f):Math.floor(f)))for(let e=0;e=m)continue;const i=d+t*l[2],s=t*k;a===Math.min(h-1,r?Math.round(s):Math.floor(s))&&(o+=g[i+n])}}f[s+n]=o}}}}return n.makeTensorInfo(i.shape,i.dtype,f)}};const NO={kernelName:zl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{dims:s}=a;kI(i,"reverse");const r=i.shape.length,o=js(s,i.shape);if(0===r)return TI({inputs:{x:i},backend:n});const l=new gc(i.shape,i.dtype),u=n.bufferSync(i);for(let e=0;en[e]=i.shape[e]-1-n[e])),l.set(u.get(...n),...t)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}},RO={kernelName:xu,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:a}=e,{radians:i,fillValue:s,center:r}=t,o=n,l=Us(a.dtype,zs(a.shape)),[u,c,h,d]=a.shape,[p,m]=vv(r,c,h),f=Math.sin(i),g=Math.cos(i),y=o.data.get(a.dataId).values;for(let e=0;e=0&&k=0&&w{const t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1})),zO={kernelName:Ol,backendName:"cpu",kernelFunc:DO},OO=xI((e=>1/Math.sqrt(e))),MO=SI(Ml,OO),BO={kernelName:Ml,backendName:"cpu",kernelFunc:MO};function FO(e,t,n,a,i,s,r,o,l,u){const c=[a/i,i],h=e.values,d=t.values;if(0===a)return vd(n,t.dtype);const p=l instanceof gc?l:vd(c,t.dtype);"string"==typeof l||"number"==typeof l?p.values.fill(l):"boolean"==typeof l&&p.values.fill(+l);for(let e=0;e=a/i)throw new Error(`Invalid indices: ${s} does not index into ${n}`);for(let n=0;n1||1===i.shape.length?1:zs(i.shape.slice(1));for(let e=0;ee>=0?GO*e:WO*(Math.exp(e)-1))),HO={kernelName:jl,backendName:"cpu",kernelFunc:qO},KO=CI(Gl,(e=>e<0?-1:e>0?1:0)),$O={kernelName:Gl,backendName:"cpu",kernelFunc:KO},ZO=CI(Ul,(e=>Math.sin(e))),XO={kernelName:Ul,backendName:"cpu",kernelFunc:ZO},YO=CI(Wl,(e=>Math.sinh(e))),QO={kernelName:Wl,backendName:"cpu",kernelFunc:YO},JO=Math.log(1.1920928955078125e-7)+2,eM=CI(Hl,(e=>{const t=e>-JO,n=e=l)throw new Error(tk(t,n,l));++m[n],d=d&&n>=p,p=n}let f=!0;for(let e=0;e0&&(m[e]+=m[e-1])}if(f&&d){const t=e,n=a;for(let e=0;eNumber(e))))),n.makeTensorInfo([f.length],a.dtype,new Int32Array(f))]}};function sM(e,t,n,a,i){const s=zs(a),r=t[0],o=i.length,l=[];let u=1,c=-1;for(let e=0;e0){d[h-1]=1;for(let e=h-2;e>=0;--e)d[e]=d[e+1]*a[e+1]}const p=[];if(o>0){p[o-1]=1;for(let e=o-2;e>=0;--e)p[e]=p[e+1]*l[e+1]}const m=Ws(n,r*o);for(let t=0;t0?i[o-1]+1:0;if(c<0)throw new Error("segment ids must be >= 0");const h=t.slice();h[0]=c;const d=Ws(n,h.reduce(((e,t)=>e*t),1));if(0===o)return c>0&&d.fill(r),[d,h];if(c<=0)throw new Error("segment ids must be >= 0");let p=0,m=1,f=0,g=i[p];for(;;){let t=0;if(m=t)throw new Error("segment ids are not increasing")}if(g<0||g>=c)throw new Error(uk(g,c));g>f&&d.fill(r,f*u,g*u);for(let t=p;t=l[0])throw new Error(ck(t,a[t],l[0]));for(let t=0;to)break}return f{const t=[...c];t[o]=e;const a=WN({inputs:{x:i},backend:n,attrs:{begin:u,size:t}});return u[o]+=e,a}))}},dM=xI((e=>Math.sqrt(e))),pM=CI(Kl,(e=>Math.sqrt(e))),mM={kernelName:Kl,backendName:"cpu",kernelFunc:pM},fM={kernelName:iu,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{const{x:n}=e,a=t;kI(n,"square");const i=a.data.get(n.dataId).values,s=new Float32Array(i.length);for(let e=0;e{const n=e-t;return n*n})),yM=QI(au,gM),bM={kernelName:au,backendName:"cpu",kernelFunc:yM},vM=xI(((e,t)=>{const{pattern:n,replaceGlobal:a,rewrite:i}=t;return e.replace(new RegExp(n,a?"g":""),i)})),kM=SI(su,vM),wM={kernelName:su,backendName:"cpu",kernelFunc:kM},AM=CI(wu,((e,t)=>{const n=t;return isNaN(e)?NaN:e>0?1:n.alpha})),xM={kernelName:wu,backendName:"cpu",kernelFunc:AM};function CM(e,t,n,a){const i=vd(e,t.dtype);for(let e=0;e=1,(()=>`Input must have rank at least 1, got: ${i.shape.length}`));const e=Rp(b,v,k),t=WN({inputs:{x:i},backend:n,attrs:{begin:b,size:e}});w=iN({inputs:{x:t},backend:n,attrs:{shape:m}}),n.disposeIntermediateTensorInfo(t)}else{const e=CM(p,n.bufferSync(i),k,b);w=n.makeTensorInfo(m,e.dtype,e.values)}return w}};class EM{constructor(e,t,n,a,i,s){this.separator=tc(e),this.nGramWidths=t,this.leftPad=tc(n),this.rightPad=tc(a),this.padWidth=i,this.preserveShort=s}getPadWidth(e){return Math.min(this.padWidth<0?e-1:this.padWidth,e-1)}getNumNGrams(e,t){const n=this.getPadWidth(t);return Math.max(0,e+2*n-t+1)}createNGrams(e,t,n,a,i,s){for(let r=0;r0?0:r-o);let d=0;d+=l*this.leftPad.length;for(let t=0;te.forEach((e=>p[m++]=e));for(let e=0;e0){f(e[h+c-1]);for(let e=0;e0){let e=t[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let i=1;i=e;if(a=a&&t[i]<=n,!a)throw new Error(`Invalid split value ${t[i]}, must be in [${e}, ${n}]`);e=t[i]}if(e!==n)throw new Error(`Last split value must be data size. Expected ${n}, got ${e}`)}const i=a-1,s=Ws("int32",a);if(0===n||0===a){const e=new Array(n);for(let e=0;e<=i;++e)s[e]=0;return[e,s]}s[0]=0;for(let e=1;e<=i;++e){const n=t[e]-t[e-1];let a=0;this.nGramWidths.forEach((e=>{a+=this.getNumNGrams(n,e)})),this.preserveShort&&n>0&&0===a&&(a=1),s[e]=s[e-1]+a}const r=new Array(s[i]);for(let n=0;n{const o=t[n+1]-t[n],l=this.getNumNGrams(o,s);this.createNGrams(e,a,r,i,l,s),i+=l})),this.preserveShort&&i===s[n]){const s=t[n+1]-t[n];if(0===s)continue;const o=s+2*this.padWidth,l=1;this.createNGrams(e,a,r,i,l,o)}}return[r,s]}}function _M(e,t,n,a,i,s,r,o){return new EM(n,a,i,s,r,o).compute(e,t)}const TM={kernelName:ou,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{separator:i,nGramWidths:s,leftPad:r,rightPad:o,padWidth:l,preserveShortSequences:u}=a,{data:c,dataSplits:h}=t,d=n.data.get(c.dataId).values,p=n.data.get(h.dataId).values,[m,f]=_M(d,p,i,s,r,o,l,u);return[n.makeTensorInfo([m.length],"string",m),n.makeTensorInfo(h.shape,"int32",f)]}};function IM(e,t,n,a){if(!e.length)return;if(0===t.length){for(let t=0;tMath.tan(e))),MM={kernelName:hu,backendName:"cpu",kernelFunc:OM},BM=CI(du,(e=>Math.tanh(e)));function FM(e,t){const n=new Array(e.rank);for(let a=0;a{const n=t.value-e.value;return 0===n?e.index-t.index:n};function PM(e,t,n=0,a=e.length-1){for(;a>n;){if(a-n>600){const i=a-n+1,s=t-n+1,r=Math.log(i),o=.5*Math.exp(2*r/3),l=.5*Math.sqrt(r*o*(i-o)/i)*Math.sign(s-i/2);PM(e,t,Math.max(n,Math.floor(t-s*o/i+l)),Math.min(a,Math.floor(t+(i-s)*o/i+l)))}const i=e[t];let s=n,r=a;for(Is(e,n,t),LM(e[a],i)>0&&Is(e,n,a);s0;)r-=1}0===LM(e[n],i)?Is(e,n,r):(r+=1,Is(e,r,a)),r<=t&&(n=r+1),t<=r&&(a=r-1)}}function jM(e,t,n,a,i){const s=t[t.length-1],[r,o]=[e.length/s,s],l=Us(n,r*a),u=Us("int32",r*a);for(let t=0;tr[t]={value:e,index:t})),at-1)if(t<=1)n=0;else{const e=2*t;n-=e*Math.trunc(n/e),n>=t&&(n=e-n-1)}return _s(0,n,t-1)}(e,t);case"wrap":return function(e,t){let n=e;if(n<0)if(t<=1)n=0;else{const e=t-1;n+=t*(Math.trunc(-n/e)+1)}else if(n>t-1)if(t<=1)n=0;else{const e=t-1;n-=t*Math.trunc(n/e)}return _s(0,n,t-1)}(e,t);case"nearest":return function(e,t){return _s(0,e,t-1)}(e,t);default:return function(e,t){return e}(e)}}function UM(e,t,n,a,i,s,r,o,l,u,c){return 0<=o&&o{for(let n=0;nn.disposeIntermediateTensorInfo(e))),h}},KM=[lN,cN,dN,mN,aN,fN,vN,kN,wN,AN,CN,EN,TN,RN,zN,FN,LN,PN,jN,oN,VN,qN,$N,YN,QN,YI,tR,aR,qI,iR,uR,hR,dR,pR,mR,fR,gR,bR,kR,wR,AR,xR,CR,SR,_R,TR,IR,NR,RR,DR,zR,OR,VR,_I,UR,qR,JR,nD,iD,oD,bD,kD,wD,CD,_D,TD,ID,RD,zD,BD,PD,II,jD,oR,UD,GD,HD,RI,ZD,QD,ez,az,sz,lz,cz,pz,mz,fz,bz,wz,Az,xz,Cz,Sz,Ez,_z,Tz,Rz,Dz,Mz,Lz,LR,jz,Uz,Gz,Hz,Zz,Xz,Jz,tO,nO,sO,MI,oO,dO,fO,wO,xO,$I,cD,SO,FI,PI,sN,EO,_O,TO,IO,NO,RO,zO,BO,LO,VO,UO,HO,UI,$O,XO,QO,GN,Fz,tM,nM,iM,rM,lM,uM,cM,hM,mM,fM,bM,wM,xM,SM,TM,RM,zM,mD,jR,MM,{kernelName:du,backendName:"cpu",kernelFunc:BM},{kernelName:Fl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{tensor:a,indices:i,updates:s}=t,{sliceRank:r,numUpdates:o,sliceSize:l,strides:u,outputSize:c}=Dy(0,i,a.shape),h=n.bufferSync(i),d=n.bufferSync(s),p=n.bufferSync(a),m=FO(h,d,a.shape,c,l,o,r,u,p,!1);return n.makeTensorInfo(a.shape,m.dtype,m.values)}},{kernelName:pu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{reps:s}=a;kI(i,"tile");const r=FM(n.bufferSync(i),s);return n.makeTensorInfo(r.shape,r.dtype,r.values)}},{kernelName:mu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{k:s,sorted:r}=a;kI(i,"topk");const o=n.data.get(i.dataId).values,[l,u]=jM(o,i.shape,i.dtype,s,r);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(u.shape,u.dtype,u.values)]}},{kernelName:fu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,attrs:n,backend:a}=e,{image:i,transforms:s}=t,{interpolation:r,fillMode:o,fillValue:l,outputShape:u}=n,[c,h,d,p]=i.shape,[m,f]=null!=u?u:[h,d],g=[c,m,f,p],y=Ys(i.shape),b=y[0],v=y[1],k=y[2],w=Ys(g),A=w[0],x=w[1],C=w[2],S=Us(i.dtype,zs(g));S.fill(l);const E=a.data.get(i.dataId).values,_=a.data.get(s.dataId).values;for(let e=0;e{t.preventDefault(),delete $M[e]}),!1),cr().getBool("SOFTWARE_WEBGL_ENABLED")&&(ZM.failIfMajorPerformanceCaveat=!1);if(1===e)return n.getContext("webgl",ZM)||n.getContext("experimental-webgl",ZM);return n.getContext("webgl2",ZM)}(e,t);if(null===n)return null;$M[e]=n}const n=$M[e];return null==n||n.isContextLost()?(delete $M[e],XM(e)):(n.disable(n.DEPTH_TEST),n.disable(n.STENCIL_TEST),n.disable(n.BLEND),n.disable(n.DITHER),n.disable(n.POLYGON_OFFSET_FILL),n.disable(n.SAMPLE_COVERAGE),n.enable(n.SCISSOR_TEST),n.enable(n.CULL_FACE),n.cullFace(n.BACK),$M[e])}var YM,QM,JM,eB,tB,nB;function aB(e,t){return[t,e]}function iB(e){const t=zs(e);return Bs(Math.ceil(t/4))}function sB(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function rB(e,t){const n=e;let a,i,s,r,o,l,u,c,h,d;return 2===cr().getNumber("WEBGL_VERSION")?(a=n.R32F,i=n.R16F,s=n.RGBA16F,r=n.RGBA32F,o=n.RED,u=4,c=1,h=n.HALF_FLOAT,d=n.FLOAT,l=n.RGBA8):(a=e.RGBA,i=e.RGBA,s=e.RGBA,r=n.RGBA,o=e.RGBA,u=4,c=4,h=null!=t?t.HALF_FLOAT_OES:null,d=e.FLOAT,l=e.RGBA),{internalFormatFloat:a,internalFormatHalfFloat:i,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:r,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:u,defaultNumChannels:c,textureTypeHalfFloat:h,textureTypeFloat:d}}function oB(e,t){const n=t();return cr().getBool("DEBUG")&&function(e){const t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+function(e,t){switch(t){case e.NO_ERROR:return"NO_ERROR";case e.INVALID_ENUM:return"INVALID_ENUM";case e.INVALID_VALUE:return"INVALID_VALUE";case e.INVALID_OPERATION:return"INVALID_OPERATION";case e.INVALID_FRAMEBUFFER_OPERATION:return"INVALID_FRAMEBUFFER_OPERATION";case e.OUT_OF_MEMORY:return"OUT_OF_MEMORY";case e.CONTEXT_LOST_WEBGL:return"CONTEXT_LOST_WEBGL";default:return`Unknown error code ${t}`}}(e,t))}(e),n}(QM=YM||(YM={}))[QM.DENSE=0]="DENSE",QM[QM.SHARED_BATCH=1]="SHARED_BATCH",(eB=JM||(JM={}))[eB.RENDER=0]="RENDER",eB[eB.UPLOAD=1]="UPLOAD",eB[eB.PIXELS=2]="PIXELS",eB[eB.DOWNLOAD=3]="DOWNLOAD",(nB=tB||(tB={}))[nB.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",nB[nB.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",nB[nB.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",nB[nB.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",nB[nB.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16";function lB(e){return!!(cr().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||0===e||5.96e-8e.getExtension(t)),'Extension "'+t+'" not supported on this browser.')}const cB=/ERROR: [0-9]+:([0-9]+):/g;function hB(e,t){const n=cB.exec(t);if(null==n)return;const a=+n[1],i=e.split("\n"),s=i.length.toString().length+2,r=i.map(((e,t)=>Fs((t+1).toString(),s)+e));let o=0;for(let e=0;ee.validateProgram(t))),!1===e.getProgramParameter(t,e.VALIDATE_STATUS))throw new Error("Shader program validation failed.")}function pB(e,t,n,a,i,s,r){const o=e.getAttribLocation(t,n);return-1!==o&&(oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,a))),oB(e,(()=>e.vertexAttribPointer(o,i,e.FLOAT,!1,s,r))),oB(e,(()=>e.enableVertexAttribArray(o))),!0)}function mB(e,t,n,a){oB(e,(()=>function(e,t,n){vB(e,n),oB(e,(()=>e.activeTexture(e.TEXTURE0+n))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,t)))}(e,t,a))),oB(e,(()=>e.uniform1i(n,a)))}function fB(e,t,n){oB(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,n))),oB(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)))}function gB(e,t){oB(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,t))),oB(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)))}function yB(e){const t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+function(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}(e,t))}function bB(e,t,n){const a=oB(e,(()=>t()));if(null==a)throw new Error(n);return a}function vB(e,t){const n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,a=t+e.TEXTURE0;if(an){throw new Error(`textureUnit must be in ${`[gl.TEXTURE0, gl.TEXTURE${n}]`}.`)}}function kB(e,t=2){return zs(e.slice(0,e.length-t))}function wB(e){if(0===e.length)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function AB(e){let t=[1,1,1];return 0===e.length||1===e.length&&1===e[0]||(t=[kB(e),...wB(e)]),t}function xB(e){return e%2==0}function CB(e,t){if(Os(e=e.slice(-2),t=t.slice(-2)))return!0;if(!e.length||!t.length)return!0;if(0===e[0]||0===e[1]||0===t[0]||0===t[1])return!0;if(e.length!==t.length){const n=e[e.length-1],a=t[t.length-1];if(n===a)return!0;if(xB(n)&&xB(a)&&(1===e[0]||1===t[0]))return!0}return e[1]===t[1]&&xB(e[0])&&xB(t[0])}let SB,EB;function _B(e,t){return null!=e.getExtension(t)}function TB(e){try{if(null!=XM(e))return!0}catch(e){return!1}return!1}function IB(e){if(0===e)return!1;const t=XM(e);if(1!==e){if(_B(t,"EXT_color_buffer_float"))return NB(t);const e="EXT_color_buffer_half_float";if(_B(t,e)){const n=t.getExtension(e);return function(e,t){const n=rB(e,t),a=e.createTexture();e.bindTexture(e.TEXTURE_2D,a);const i=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,i,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);const r=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,r),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,a,0);const o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(a),e.deleteFramebuffer(r),o}(t,n)}return!1}if(!_B(t,"OES_texture_float"))return!1;if(!_B(t,"WEBGL_color_buffer_float"))return!1;return NB(t)}function NB(e){const t=rB(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,1,1,0,t.textureFormatFloat,t.textureTypeFloat,null);const a=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,a),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(a),i}function RB(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&Ns("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the WebGL backend.`))}))}const DB=cr();function zB(){let e,t,n,a,i,s,r,o,l,u;return 2===cr().getNumber("WEBGL_VERSION")?(e="#version 300 es",t="in",n="out",a="in",i="texture",s="outputColor",r="out vec4 outputColor;",o=cr().getBool("WEBGL2_ISNAN_CUSTOM")?"\n bool isnan_custom(float val) {\n uint floatToUint = floatBitsToUint(val);\n return (floatToUint & 0x7fffffffu) > 0x7f800000u;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ":"",l="",u="\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "):(e="",t="attribute",n="varying",a="varying",i="texture2D",s="gl_FragColor",r="",o="\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n ",l="\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n ",u="\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "),{version:e,attribute:t,varyingVs:n,varyingFs:a,texture2D:i,output:s,defineOutput:r,defineSpecialNaN:o,defineSpecialInf:l,defineRound:u}}function OB(e,t,n="index"){const a=Ys(t);return a.map(((t,i)=>`${`int ${e[i]} = ${n} / ${t}`}; ${i===a.length-1?`int ${e[i+1]} = ${n} - ${e[i]} * ${t}`:`index -= ${e[i]} * ${t}`};`)).join("")}function MB(e,t,n="index"){const a=Ys(t);return a.map(((t,i)=>`${`int ${e[i]} = ${n} / outShapeStrides[${i}]`}; ${i===a.length-1?`int ${e[i+1]} = ${n} - ${e[i]} * outShapeStrides[${i}]`:`index -= ${e[i]} * outShapeStrides[${i}]`};`)).join("")}function BB(e,t,n="index"){const a=function(e,t){const n=e.length,a=e.map((e=>`${t}[${e}]`)),i=new Array(n-1);i[n-2]=a[n-1];for(let e=n-3;e>=0;--e)i[e]=`(${i[e+1]} * ${a[e+1]})`;return i}(e.map(((e,t)=>t)),t);return a.map(((t,i)=>`${`int ${e[i]} = ${n} / ${a[i]}`}; ${i===a.length-1?`int ${e[i+1]} = ${n} - ${e[i]} * ${a[i]}`:`index -= ${e[i]} * ${a[i]}`};`)).join("")}function FB(e){const t=Ys(e).map((e=>e.toString()));return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${t[0]} + coords.y * ${t[1]} + coords.z;\n }\n`}DB.registerFlag("HAS_WEBGL",(()=>DB.getNumber("WEBGL_VERSION")>0)),DB.registerFlag("WEBGL_VERSION",(()=>TB(2)?2:TB(1)?1:0)),DB.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",(()=>!1)),DB.registerFlag("WEBGL_BUFFER_SUPPORTED",(()=>2===DB.get("WEBGL_VERSION"))),DB.registerFlag("WEBGL_CPU_FORWARD",(()=>!0)),DB.registerFlag("WEBGL_FORCE_F16_TEXTURES",(()=>!1)),DB.registerFlag("WEBGL_PACK",(()=>DB.getBool("HAS_WEBGL"))),DB.registerFlag("WEBGL_PACK_NORMALIZATION",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_CLIP",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_DEPTHWISECONV",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_REDUCE",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_LAZILY_UNPACK",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_CONV_IM2COL",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_CONV2DTRANSPOSE",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_MAX_TEXTURE_SIZE",(()=>function(e){if(null==SB){const t=XM(e);SB=t.getParameter(t.MAX_TEXTURE_SIZE)}return SB}(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",(()=>function(e){if(null==EB){const t=XM(e);EB=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,EB)}(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",(()=>{const e=DB.getNumber("WEBGL_VERSION");return 0===e?0:function(e){if(0===e)return 0;let t;const n=XM(e);return t=_B(n,"EXT_disjoint_timer_query_webgl2")&&2===e?2:_B(n,"EXT_disjoint_timer_query")?1:0,t}(e)})),DB.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",(()=>DB.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!Zc())),DB.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",(()=>function(e){if(0===e)return!1;const t=XM(e);if(1===e){if(!_B(t,"OES_texture_float"))return!1}else if(!_B(t,"EXT_color_buffer_float"))return!1;return NB(t)}(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",(()=>!DB.getBool("WEBGL_FORCE_F16_TEXTURES")&&DB.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"))),DB.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",(()=>IB(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_FENCE_API_ENABLED",(()=>{return 2===(e=DB.getNumber("WEBGL_VERSION"))&&null!=XM(e).fenceSync;var e})),DB.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",(()=>DB.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0)),DB.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",(()=>-1),(e=>{if("number"!=typeof e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be a number but got ${e}.`);if(e<0&&-1!==e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)})),DB.registerFlag("WEBGL_FLUSH_THRESHOLD",(()=>Zc()?1:-1),(e=>{if("number"!=typeof e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be a number but got ${e}.`);if(e<0&&-1!==e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)})),DB.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",(()=>128)),DB.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",(()=>!1)),DB.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",(()=>1e5)),DB.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",(()=>128)),DB.registerFlag("WEBGL_EXP_CONV",(()=>!1)),DB.registerFlag("SOFTWARE_WEBGL_ENABLED",(()=>DB.getBool("IS_TEST"))),DB.registerFlag("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE",(()=>1/0)),DB.registerFlag("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE",(()=>!1)),DB.registerFlag("WEBGL2_ISNAN_CUSTOM",(()=>!1)),DB.registerFlag("ENGINE_COMPILE_ONLY",(()=>!1));const LB="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n",{getBroadcastDims:PB}=i;function jB(e,t,n){const a=[];if(e.forEach((e=>{const t=zs(e.shapeInfo.logicalShape);if(e.shapeInfo.isUniform?a.push(`uniform float ${e.name}${t>1?`[${t}]`:""};`):(a.push(`uniform sampler2D ${e.name};`),a.push(`uniform int offset${e.name};`)),n.enableShapeUniforms){const{uniformShape:t}=YB(n.packedInputs,e.shapeInfo.logicalShape,e.shapeInfo.texShape);switch(t.length){case 1:a.push(`uniform int ${e.name}Shape;`);break;case 2:a.push(`uniform ivec2 ${e.name}Shape;`);break;case 3:a.push(`uniform ivec3 ${e.name}Shape;`);break;case 4:a.push(`uniform ivec4 ${e.name}Shape;`)}a.push(`uniform ivec2 ${e.name}TexShape;`)}})),n.enableShapeUniforms){switch(t.logicalShape.length){case 1:a.push("uniform int outShape;");break;case 2:a.push("uniform ivec2 outShape;"),a.push("uniform int outShapeStrides;");break;case 3:a.push("uniform ivec3 outShape;"),a.push("uniform ivec2 outShapeStrides;");break;case 4:a.push("uniform ivec4 outShape;"),a.push("uniform ivec3 outShapeStrides;")}a.push("uniform ivec2 outTexShape;")}n.customUniforms&&n.customUniforms.forEach((e=>{a.push(`uniform ${e.type} ${e.name}${e.arrayIndex?`[${e.arrayIndex}]`:""};`)}));const i=a.join("\n"),s=e.map((e=>function(e,t,n=!1,a){let i="";i+=n?UB(e,a):VB(e,a);const s=e.shapeInfo.logicalShape,r=t.logicalShape;s.length<=r.length&&(i+=n?function(e,t){const n=e.name,a=n.charAt(0).toUpperCase()+n.slice(1),i="get"+a+"AtOutCoords",s=e.shapeInfo.logicalShape.length,r=t.logicalShape.length,o=PB(e.shapeInfo.logicalShape,t.logicalShape),l=XB(r),u=r-s;let c;const h=["x","y","z","w","u","v"];c=0===s?"":r<2&&o.length>=1?"coords = 0;":o.map((e=>`coords.${h[e+u]} = 0;`)).join("\n");let d="";d=r<2&&s>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${h[t+u]}`)).join(", ");let p="return outputValue;";const m=1===zs(e.shapeInfo.logicalShape),f=zs(t.logicalShape),g=1===f;if(1!==s||m||g){if(m&&!g)p=1===r?"\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n ":"\n return vec4(outputValue.x);\n ";else if(o.length){const e=s-2,t=s-1;o.indexOf(e)>-1&&o.indexOf(t)>-1?p="return vec4(outputValue.x);":o.indexOf(e)>-1?p="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":o.indexOf(t)>-1&&(p="return vec4(outputValue.xx, outputValue.zz);")}}else p="\n return vec4(outputValue.xy, outputValue.xy);\n ";return`\n vec4 ${i}() {\n ${l} coords = getOutputCoords();\n ${c}\n vec4 outputValue = get${a}(${d});\n ${p}\n }\n `}(e,t):function(e,t){const n=e.name,a=n.charAt(0).toUpperCase()+n.slice(1),i="get"+a+"AtOutCoords",s=t.texShape,r=e.shapeInfo.texShape,o=e.shapeInfo.logicalShape.length,l=t.logicalShape.length;if(!e.shapeInfo.isUniform&&o===l&&null==e.shapeInfo.flatOffset&&Os(r,s))return`\n float ${i}() {\n return sampleTexture(${n}, resultUV);\n }\n `;const u=XB(l),c=PB(e.shapeInfo.logicalShape,t.logicalShape),h=l-o;let d;const p=["x","y","z","w","u","v"];d=0===o?"":l<2&&c.length>=1?"coords = 0;":c.map((e=>`coords.${p[e+h]} = 0;`)).join("\n");let m="";m=l<2&&o>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${p[t+h]}`)).join(", ");return`\n float ${i}() {\n ${u} coords = getOutputCoords();\n ${d}\n return get${a}(${m});\n }\n `}(e,t));return i}(e,t,n.packedInputs,n.enableShapeUniforms))).join("\n"),r=t.texShape,o=zB(),l=function(e){return`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${e.texture2D}(textureSampler, uv).r;\n }\n `}(o);let u,c,h=function(e){const t=`${e.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${e.varyingFs} vec2 resultUV;\n ${e.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${e.defineSpecialNaN}\n ${e.defineSpecialInf}\n ${e.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${WB}\n ${GB}\n ${qB}\n `;return t}(o);t.isPacked?(u=function(e,t,n){switch(e.length){case 0:return KB();case 1:return function(e,t,n){const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(1===a[0])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${a[1]}.0);\n }\n `;if(1===a[1])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${a[0]}.0);\n }\n `;if(n)return"\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n ";return`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${a[0]}, ${a[1]}));\n return 2 * (resTexRC.x * ${a[1]} + resTexRC.y);\n }\n `}(0,t,n);case 2:return function(e,t,n){const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(Os(e,t))return n?"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n }\n ":`\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2(${a[0]}, ${a[1]}));\n }\n `;const i=Math.ceil(e[1]/2);if(n)return"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec2(r, c);\n }\n ";return`\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${a[0]}, ${a[1]}));\n\n int index = resTexRC.x * ${a[1]} + resTexRC.y;\n int r = 2 * (index / ${i});\n int c = imod(index, ${i}) * 2;\n\n return ivec2(r, c);\n }\n `}(e,t,n);case 3:return function(e,t,n){if(n)return"\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n ";const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],i=Math.ceil(e[2]/2),s=i*Math.ceil(e[1]/2);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${a[0]}, ${a[1]}));\n int index = resTexRC.x * ${a[1]} + resTexRC.y;\n\n int b = index / ${s};\n index -= b * ${s};\n\n int r = 2 * (index / ${i});\n int c = imod(index, ${i}) * 2;\n\n return ivec3(b, r, c);\n }\n `}(e,t,n);default:return function(e,t,n){if(n)return"\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n ";const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],i=Math.ceil(e[e.length-1]/2),s=i*Math.ceil(e[e.length-2]/2);let r=s,o="",l="b, r, c";for(let t=2;t1&&!Os(t,n)&&a.lengthe[t])).join(", ")}function eF(e,t,n,a){const i=n.map(((e,n)=>{const a={logicalShape:e.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform,isPacked:!e.isUniform&&e.texData.isPacked,flatOffset:null};return null!=e.texData&&null!=e.texData.slice&&e.texData.slice.flatOffset>0&&(a.flatOffset=e.texData.slice.flatOffset),{name:t.variableNames[n],shapeInfo:a}})),s=i.map((e=>e.shapeInfo)),r={logicalShape:a.shape,texShape:a.texData.texShape,isUniform:!1,isPacked:a.texData.isPacked,flatOffset:null},o=jB(i,r,t),l=function(e,t){const n=bB(e,(()=>e.createShader(e.FRAGMENT_SHADER)),"Unable to create fragment WebGLShader.");if(oB(e,(()=>e.shaderSource(n,t))),oB(e,(()=>e.compileShader(n))),cr().get("ENGINE_COMPILE_ONLY"))return n;if(!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw hB(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}(e.gl,o),u=e.createProgram(l);return cr().get("ENGINE_COMPILE_ONLY")?{program:t,fragmentShader:l,source:o,webGLProgram:u,inShapeInfos:s,outShapeInfo:r,variablesLocations:null,customUniformLocations:null,infLoc:null,nanLoc:null,outShapeLocation:null,outShapeStridesLocation:null,outTexShapeLocation:null}:(e.buildVao(u),Object.assign({program:t,fragmentShader:l,source:o,webGLProgram:u,inShapeInfos:s,outShapeInfo:r},tF(e,t,u)))}function tF(e,t,n){const a=[],i=[];let s,r,o,l=null,u=null;u=e.getUniformLocation(n,"NAN",!1),1===cr().getNumber("WEBGL_VERSION")&&(l=e.getUniformLocation(n,"INFINITY",!1));const c=!1;for(const i of t.variableNames){const s={name:i,uniform:e.getUniformLocation(n,i,c),offset:e.getUniformLocation(n,`offset${i}`,c)};t.enableShapeUniforms&&(s.shape=e.getUniformLocation(n,`${i}Shape`,c),s.texShape=e.getUniformLocation(n,`${i}TexShape`,c)),a.push(s)}if(t.enableShapeUniforms&&(s=e.getUniformLocation(n,"outShape",c),o=e.getUniformLocation(n,"outShapeStrides",c),r=e.getUniformLocation(n,"outTexShape",c)),t.customUniforms)for(const a of t.customUniforms)i.push(e.getUniformLocation(n,a.name,c));return{variablesLocations:a,customUniformLocations:i,infLoc:l,nanLoc:u,outShapeLocation:s,outShapeStridesLocation:o,outTexShapeLocation:r}}function nF(e,t){if(e.length!==t.length)throw Error(`Binary was compiled with ${e.length} inputs, but was executed with ${t.length} inputs`);e.forEach(((e,n)=>{const a=e.logicalShape,i=t[n],s=i.shape;if(!Os(a,s))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${a} and ${s} must match`);if(e.isUniform&&i.isUniform)return;const r=e.texShape,o=i.isUniform?null:i.texData.texShape;if(!Os(r,o))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${r} and ${o} must match`)}))}function aF(e){return cr().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&e<=4}class iF{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=YM.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=zB();this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?MB(["r","c","d"],e):OB(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${t.output} = result;\n }\n `}}class sF{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=YM.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=zB();this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?MB(["r","c","d"],e):OB(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${t.output} = result;\n }\n `}}class rF{constructor(e){this.variableNames=["A"],this.outTexUsage=JM.DOWNLOAD;const t=zB();this.outputShape=e,this.userCode=`\n ${LB}\n\n void main() {\n float x = getAAtOutCoords();\n ${t.output} = encode_float(x);\n }\n `}}class oF{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=JM.DOWNLOAD;const t=zB();this.outputShape=e,this.userCode=`\n ${LB}\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n ${t.output} = encode_float(x);\n }\n `}}const lF={R:0,G:1,B:2,A:3};class uF{constructor(e,t=!1,n="RGBA"){this.variableNames=["A"],this.customUniforms=[{name:"texShape",type:"ivec2"}];const a=zB();this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length);let i="result";t&&(i="floor(result * 255. + 0.5)");let s="";for(let e=0;ee.createShader(e.VERTEX_SHADER)),"Unable to create vertex WebGLShader.");if(oB(e,(()=>e.shaderSource(n,t))),oB(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw new Error("Failed to compile vertex shader.");return n}(e,`${t.version}\n precision highp float;\n ${t.attribute} vec3 clipSpacePos;\n ${t.attribute} vec2 uv;\n ${t.varyingVs} vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }`)}function dF(e){return function(e,t){const n=bB(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),oB(e,(()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW))),n}(e,new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]))}function pF(e){return function(e,t){const n=bB(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return oB(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n))),oB(e,(()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW))),n}(e,new Uint16Array([0,1,2,2,1,3]))}function mF(e,t,n,a,i,s){!function(e,t){const n=cr().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0)throw new Error(`Requested texture size [${e}x${t}] is invalid.`);if(e>n||t>n)throw new Error(`Requested texture size [${e}x${t}] greater than WebGL maximum on this browser / GPU [${n}x${n}].`)}(t,n);const r=function(e){return bB(e,(()=>e.createTexture()),"Unable to create WebGLTexture.")}(e),o=e.TEXTURE_2D;return oB(e,(()=>e.bindTexture(o,r))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_MIN_FILTER,e.NEAREST))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_MAG_FILTER,e.NEAREST))),1===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texImage2D(o,0,a,t,n,0,i,s,null))):oB(e,(()=>e.texStorage2D(o,1,a,t,n))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,null))),{texture:r,texShape:[n,t]}}function fF(e){return e.internalFormatFloat}function gF(e){return e.internalFormatHalfFloat}function yF(e){return e.downloadTextureFormat}function bF(e){return e.internalFormatPackedFloat}function vF(e){return e.internalFormatPackedHalfFloat}function kF(e,t,n,a,i,s,r,o){const l=e,u=new Float32Array(function(e,t){const[n,a]=sB(e,t);return n*a*4}(s,r));return l.bindBuffer(l.PIXEL_PACK_BUFFER,t),l.getBufferSubData(l.PIXEL_PACK_BUFFER,0,u),l.bindBuffer(l.PIXEL_PACK_BUFFER,null),u}class wF{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.itemsToPoll=[];const t=cr().getNumber("WEBGL_VERSION");if(null!=e?(this.gl=e,function(e,t){$M[e]=t}(t,e)):this.gl=XM(t),e=this.gl,2===cr().getNumber("WEBGL_VERSION")){const t=e;this.createVertexArray=()=>oB(t,(()=>t.createVertexArray())),this.bindVertexArray=e=>oB(t,(()=>t.bindVertexArray(e))),this.deleteVertexArray=e=>oB(t,(()=>t.deleteVertexArray(e))),this.getVertexArray=()=>oB(t,(()=>t.getParameter(t.VERTEX_ARRAY_BINDING)))}else if(null!=e){const t=e.getExtension("OES_vertex_array_object");if(null==t)throw new Error("All WebGL1 implementations are expected to offer OES_vertex_array_object.");this.createVertexArray=()=>oB(e,(()=>t.createVertexArrayOES())),this.bindVertexArray=n=>oB(e,(()=>t.bindVertexArrayOES(n))),this.deleteVertexArray=n=>oB(e,(()=>t.deleteVertexArrayOES(n))),this.getVertexArray=()=>oB(e,(()=>e.getParameter(t.VERTEX_ARRAY_BINDING_OES)))}let n="WEBGL_color_buffer_float";const a="EXT_color_buffer_half_float";if(this.parallelCompilationExtension=this.gl.getExtension("KHR_parallel_shader_compile"),1===cr().getNumber("WEBGL_VERSION")){const e="OES_texture_float",t="OES_texture_half_float";if(this.textureFloatExtension=uB(this.gl,e),_B(this.gl,t))this.textureHalfFloatExtension=uB(this.gl,t);else if(cr().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(n),_B(this.gl,a))this.colorBufferHalfFloatExtension=uB(this.gl,a);else if(cr().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(n="EXT_color_buffer_float",_B(this.gl,n))this.colorBufferFloatExtension=this.gl.getExtension(n);else{if(!_B(this.gl,a))throw new Error("GL context does not support color renderable floats");this.colorBufferHalfFloatExtension=this.gl.getExtension(a)}this.vertexBuffer=dF(this.gl),this.indexBuffer=pF(this.gl),this.framebuffer=function(e){return bB(e,(()=>e.createFramebuffer()),"Unable to create WebGLFramebuffer.")}(this.gl),this.textureConfig=rB(this.gl,this.textureHalfFloatExtension)}get debug(){return cr().getBool("DEBUG")}dispose(){if(this.disposed)return;this.program,this.outputTexture;const e=this.gl;oB(e,(()=>e.finish())),oB(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),oB(e,(()=>e.deleteFramebuffer(this.framebuffer))),oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,null))),oB(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null))),oB(e,(()=>e.deleteBuffer(this.indexBuffer))),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=aB(t,n);return mF(e,i,s,fF(a),a.textureFormatFloat,e.FLOAT)}(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=aB(t,n);return mF(e,i,s,gF(a),a.textureFormatFloat,a.textureTypeHalfFloat)}(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=aB(t,n);return mF(e,i,s,yF(a),e.RGBA,e.UNSIGNED_BYTE)}(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),function(e,t,n){oB(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),n.data instanceof Uint8Array?2===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,n.width,n.height,e.RGBA,e.UNSIGNED_BYTE,n.data))):oB(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,n.width,n.height,0,e.RGBA,e.UNSIGNED_BYTE,n.data))):2===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,n))):oB(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,n,a){this.throwIfDisposed(),function(e,t,n,a,i,s){let r,o,l;oB(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),i instanceof Uint8Array?(r=new Uint8Array(n*a*4),o=e.UNSIGNED_BYTE,l=e.RGBA):(r=new Float32Array(n*a*4),o=e.FLOAT,l=s.internalFormatPackedFloat),r.set(i),2===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,n,a,e.RGBA,o,r))):oB(e,(()=>e.texImage2D(e.TEXTURE_2D,0,l,n,a,0,e.RGBA,o,r))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}(this.gl,e,t,n,a,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=sB(t,n);return mF(e,i,s,vF(a),e.RGBA,a.textureTypeHalfFloat)}(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=sB(t,n);return mF(e,i,s,bF(a),e.RGBA,e.FLOAT)}(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(gB(this.gl,this.framebuffer),this.outputTexture=null),oB(this.gl,(()=>this.gl.deleteTexture(e)))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>function(e,t,n,a){const[i,s]=aB(t,n),r=new Uint8Array(t*n*4);return oB(e,(()=>e.readPixels(0,0,i,s,a.downloadTextureFormat,e.UNSIGNED_BYTE,r))),new Float32Array(r.buffer)}(this.gl,t,n,this.textureConfig)))}downloadPackedMatrixFromBuffer(e,t,n,a,i,s){return kF(this.gl,e,0,0,0,i,s,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return function(e,t,n){const a=e,i=new Float32Array(n);return a.bindBuffer(a.PIXEL_PACK_BUFFER,t),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,i),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),i}(this.gl,e,t)}createBufferFromTexture(e,t,n){this.bindTextureToFrameBuffer(e);const a=function(e,t,n,a){const i=e.createBuffer();oB(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,i)));const s=16*t*n;return oB(e,(()=>e.bufferData(e.PIXEL_PACK_BUFFER,s,e.STREAM_READ))),oB(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,0))),oB(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,null))),i}(this.gl,t,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),a}createAndWaitForFence(){const e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,n;if(cr().getBool("WEBGL_FENCE_API_ENABLED")){const a=e,i=a.fenceSync(a.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),n=()=>{const e=a.clientWaitSync(i,0,0);return e===a.ALREADY_SIGNALED||e===a.CONDITION_SATISFIED},t=i}else cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),n=()=>this.isQueryAvailable(t,cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):n=()=>!0;return{query:t,isFencePassed:n}}downloadMatrixFromPackedTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>function(e,t,n){const a=new Float32Array(t*n*4);return oB(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,a))),a}(this.gl,t,n)))}createProgram(e){this.throwIfDisposed();const t=this.gl;null==this.vertexShader&&(this.vertexShader=hF(t));const n=function(e){return bB(e,(()=>e.createProgram()),"Unable to create WebGLProgram.")}(t);oB(t,(()=>t.attachShader(n,this.vertexShader))),oB(t,(()=>t.attachShader(n,e))),function(e,t){if(oB(e,(()=>e.linkProgram(t))),!cr().get("ENGINE_COMPILE_ONLY")&&!1===e.getProgramParameter(t,e.LINK_STATUS))throw new Error("Failed to link vertex and fragment shaders.")}(t,n);const a=Object.assign(n,{vao:this.createVertexArray()});return this.debug&&dB(t,a),a}buildVao(e){this.setProgram(e),this.bindVertexArray(e.vao);const t=this.gl;oB(t,(()=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer))),function(e,t,n){oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),pB(e,t,"clipSpacePos",n,3,20,0)&&pB(e,t,"uv",n,2,20,12)}(t,e,this.vertexBuffer)}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&(oB(this.gl,(()=>this.gl.deleteProgram(e))),this.deleteVertexArray(e.vao))}setProgram(e){this.throwIfDisposed(),this.program=e,null!=this.program&&this.debug&&dB(this.gl,this.program),oB(this.gl,(()=>this.gl.useProgram(e)))}getUniformLocation(e,t,n=!0){return this.throwIfDisposed(),n?function(e,t,n){return bB(e,(()=>e.getUniformLocation(t,n)),'uniform "'+n+'" not present in program.')}(this.gl,e,t):function(e,t,n){return e.getUniformLocation(t,n)}(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),oB(this.gl,(()=>this.gl.getAttribLocation(e,t)))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),mB(this.gl,e,t,n)}setOutputMatrixTexture(e,t,n){this.setOutputMatrixTextureDriver(e,n,t)}setOutputPackedMatrixTexture(e,t,n){this.throwIfDisposed();const[a,i]=sB(t,n);this.setOutputMatrixTextureDriver(e,a,i)}setOutputMatrixWriteRegion(e,t,n,a){this.setOutputMatrixWriteRegionDriver(n,e,a,t)}setOutputPackedMatrixWriteRegion(e,t,n,a){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){null!=this.program&&dB(this.gl,this.program),yB(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();const e=this.gl;if(this.debug){this.getVertexArray();this.debugValidate()}oB(e,(()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),oB(this.gl,(()=>this.gl.finish()))}getQueryTimerExtension(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=uB(this.gl,2===cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(2===cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}const e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(2===cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2();return void e.endQuery(t.TIME_ELAPSED_EXT)}const e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await Ls((()=>this.disposed||this.isQueryAvailable(e,cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")))),this.getQueryTime(e,cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(0===t)return null;if(2===t){const t=this.gl;return t.getQueryParameter(e,t.QUERY_RESULT)/1e6}{const t=this.getQueryTimerExtensionWebGL1();return t.getQueryObjectEXT(e,t.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(0===t)return!0;if(2===t){const t=this.gl,n=this.getQueryTimerExtensionWebGL2(),a=t.getQueryParameter(e,t.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),a&&!this.disjoint}{const t=this.getQueryTimerExtensionWebGL1(),n=t.getQueryObjectEXT(e,t.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(t.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise((t=>{this.addItemToPoll((()=>e.isFencePassed()),(()=>t()))}))}pollItems(){const e=function(e){let t=0;for(;te.isDoneFn)));for(let t=0;t<=e;++t){const{resolveFn:e}=this.itemsToPoll[t];e()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){if(this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1)return;let n;"setTimeoutCustom"in cr().platform&&(n=cr().platform.setTimeoutCustom.bind(cr().platform)),Ls((()=>(this.pollItems(),0===this.itemsToPoll.length)),(()=>0),null,n)}bindTextureToFrameBuffer(e){this.throwIfDisposed(),fB(this.gl,e,this.framebuffer),this.debug&&yB(this.gl)}unbindTextureToFrameBuffer(){null!=this.outputTexture?(fB(this.gl,this.outputTexture,this.framebuffer),this.debug&&yB(this.gl)):gB(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);const n=t();return this.unbindTextureToFrameBuffer(),n}setOutputMatrixTextureDriver(e,t,n){this.throwIfDisposed();const a=this.gl;fB(a,e,this.framebuffer),this.debug&&yB(a),this.outputTexture=e,oB(a,(()=>a.viewport(0,0,t,n))),oB(a,(()=>a.scissor(0,0,t,n)))}setOutputMatrixWriteRegionDriver(e,t,n,a){this.throwIfDisposed(),oB(this.gl,(()=>this.gl.scissor(e,t,n,a)))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(null==this.program)throw new Error("No GPU program is currently set.")}}const{mx:AF,XI:xF,Nk:CF,f6:SF,ct:EF,YG:_F,hH:TF,z3:IF,sG:NF,uM:RF,vS:DF,qB:zF,GG:OF,rq:MF,lg:BF,WR:FF,cu:LF,GE:PF,px:jF,jC:VF,He:UF,hE:WF,BF:GF,Dk:qF,cl:HF,_B:KF,ub:$F,_f:ZF,Ku:XF,qy:YF,Zy:QF,bu:JF,zv:eL,dH:tL,HS:nL,yH:aL,l3:iL,z9:sL,x6:rL,_m:oL,eW:lL,GK:uL,SP:cL,yr:hL,dl:dL,Dw:pL,xT:mL,_X:fL,wz:gL}=S;function yL(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`))}function bL(e,t){return 1===t?[e]:yL(e,t)}class vL{constructor(e){if(this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.enableShapeUniforms=aF(this.outputShape.length),0===this.rank)this.userCode="\n void main() {\n setOutput(vec4(getA(), 0., 0., 0.));\n }\n ";else{const e=bL("rc",this.rank),t=XB(this.rank),n=this.getOutOfBoundsCondition(e),a=this.getSetup(e),i=this.getOutput(e);this.userCode=`\n void main() {\n ${t} rc = getOutputCoords();\n\n if(${n}) {\n setOutput(vec4(0));\n } else {\n ${a}\n\n setOutput(vec4(${i}));\n }\n }\n `}}getSourceCoordsArr(e){const t=[];for(let n=0;n<=1;n++)for(let a=0;a<=1;a++){let i=`${0===n?"r":"rp1"}, ${0===a?"c":"cp1"}`;for(let t=2;t ${this.enableShapeUniforms?"outShape":this.outputShape[0]}`;let t="";for(let n=this.rank-2;n= ${this.enableShapeUniforms?`outShape[${n}]`:this.outputShape[n]}`,n= ${n};\n bool rEdge = rp1 >= ${a};\n `}getOutput(e){const t=this.getSourceCoordsArr(e);if(1===this.rank){return`getA(rc), (rc + 1 >= ${this.enableShapeUniforms?"outShape":this.outputShape[0]} ? 0. : getA(rc + 1)), 0, 0`}return`getA(${t[0]}),\n cEdge ? 0. : getA(${t[1]}),\n rEdge ? 0. : getA(${t[2]}),\n rEdge || cEdge ? 0. : getA(${t[3]})`}}class kL{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"inputShape",type:"ivec3"}],this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length);let n="";for(let e=0;e<4;e++){let t="thisRC = rc;";e%2==1&&(t+="thisRC.z += 1;"),e>1&&(t+="thisRC.y += 1;"),n+=`\n ${t}\n ${e>0?"if(thisRC.y < rows && thisRC.z < cols){":""}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${e}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${e>0?"}":""}\n `}var a,i;this.userCode=`\n ${a=t,i=this.enableShapeUniforms,`\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${i?BB(["r","c","d"],"inputShape"):OB(["r","c","d"],a)}\n return ivec3(r, c, d);\n }\n `}\n ${this.enableShapeUniforms?"\n int getFlatIndex(ivec3 coords) {\n return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z;\n }\n":FB(e)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${this.enableShapeUniforms?"outShape[1]":e[1]};\n int cols = ${this.enableShapeUniforms?"outShape[2]":e[2]};\n\n ${n}\n\n setOutput(result);\n }\n `}}class wL{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0,this.freeTextures={},this.usedTextures={},this.logEnabled=!1}acquireTexture(e,t,n){const a=xL(t,n),i=CL(e,a,n);i in this.freeTextures||(this.freeTextures[i]=[]),i in this.usedTextures||(this.usedTextures[i]=[]);const s=AL(e,a,this.gpgpu.gl,this.gpgpu.textureConfig,n);if(this.freeTextures[i].length>0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=s,this.log();const e=this.freeTextures[i].pop();return this.usedTextures[i].push(e),e}let r;return a===tB.PACKED_2X2_FLOAT32?r=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):a===tB.PACKED_2X2_FLOAT16?r=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):a===tB.UNPACKED_FLOAT32?r=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):a===tB.UNPACKED_FLOAT16?r=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):a===tB.PACKED_4X1_UNSIGNED_BYTE&&(r=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[i].push(r),this.numUsedTextures++,this._numBytesAllocated+=s,this.log(),r}releaseTexture(e,t,n,a){if(null==this.freeTextures)return;const i=xL(n,a),s=CL(t,i,a);s in this.freeTextures||(this.freeTextures[s]=[]);const r=AL(t,i,this.gpgpu.gl,this.gpgpu.textureConfig,a),o=cr().getNumber("WEBGL_DELETE_TEXTURE_THRESHOLD");-1!==o&&this._numBytesAllocated>o?(this.gpgpu.deleteMatrixTexture(e.texture),this._numBytesAllocated-=r):(this.freeTextures[s].push(e),this.numFreeTextures++,this._numBytesFree+=r),this.numUsedTextures--;const l=this.usedTextures[s],u=l&&l.indexOf(e);if(null==u||u<0)throw new Error("Cannot release a texture that was never provided by this texture manager");l[u]=l[l.length-1],l.pop(),this.log()}log(){if(!this.logEnabled)return;this.numFreeTextures,this.numUsedTextures,this._numBytesFree,this._numBytesAllocated}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(null!=this.freeTextures){for(const e in this.freeTextures)this.freeTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e.texture)}));for(const e in this.usedTextures)this.usedTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e.texture)}));this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}}function AL(e,t,n,a,i){const s=function(e,t){switch(e){case tB.PACKED_2X2_FLOAT32:return bF(t);case tB.PACKED_2X2_FLOAT16:return vF(t);case tB.UNPACKED_FLOAT32:return fF(t);case tB.UNPACKED_FLOAT16:return gF(t);case tB.PACKED_4X1_UNSIGNED_BYTE:return yF(t);default:throw new Error(`Unknown physical texture type ${e}`)}}(t,a);let r;if(i){const[t,n]=sB(e[0],e[1]);r=t*n}else{const[t,n]=aB(e[0],e[1]);r=t*n}const o=function(e,t){const n=e;if(t===n.R32F)return 4;if(t===n.R16F)return 2;if(t===n.RGBA32F)return 16;if(t===e.RGBA)return 16;if(t===n.RGBA16F)return 8;if(t===n.RGBA8)return 4;throw new Error(`Unknown internal format ${t}`)}(n,s);return r*o}function xL(e,t){if(e===JM.UPLOAD)return tB.PACKED_2X2_FLOAT32;if(e===JM.RENDER||null==e)return function(e){return cr().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?e?tB.PACKED_2X2_FLOAT32:tB.UNPACKED_FLOAT32:e?tB.PACKED_2X2_FLOAT16:tB.UNPACKED_FLOAT16}(t);if(e===JM.DOWNLOAD||e===JM.PIXELS)return tB.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${e}`)}function CL(e,t,n){return`${e[0]}_${e[1]}_${t}_${n}`}class SL{constructor(e,t){this.variableNames=["A"],this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n float unaryOperation(float x) {\n ${t}\n }\n\n void main() {\n float x = getAAtOutCoords();\n float y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}const EL="if (isnan(x)) return x;",_L="return x;",TL="return abs(x);";const IL="return (x >= 0.0) ? x : (exp(x) - 1.0);",NL=EL+"\n return (x < 0.0) ? 0.0 : x;\n",RL=EL+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",DL="return x;",zL="return 1.0 / (1.0 + exp(-1.0 * x));",OL="return x;",ML="\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n",BL="\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",FL="\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",LL="return 1.0 / (1.0 + exp(-1.0 * x));";class PL{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n vec4 unaryOperation(vec4 x) {\n ${t}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}class jL{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length);const t=e.length,n=bL("rc",t),a=XB(t),i=function(e,t){if(1===e)return"rc";let n="";for(let a=0;at.push(e)))}const t=this.texData.get(e),{values:n,shape:a,slice:i,dtype:s,complexTensorInfos:r,isPacked:o}=t;if(null!=i){let t;t=o?new PL(a,DL):new SL(a,DL);const n=this.runWebGLProgram(t,[{dataId:e,shape:a,dtype:s}],s),i=this.read(n.dataId);return this.disposeIntermediateTensorInfo(n),i}if(null!=n)return this.convertAndCacheOnCPU(e);if(cr().getBool("DEBUG")&&!cr().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&2===cr().getNumber("WEBGL_VERSION"))throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let l,u,c=null;if("complex64"!==s&&cr().get("WEBGL_BUFFER_SUPPORTED")){l=this.decode(e);const t=this.texData.get(l.dataId);c=this.gpgpu.createBufferFromTexture(t.texture.texture,...iB(a))}if(this.pendingRead.set(e,[]),"complex64"!==s&&await this.gpgpu.createAndWaitForFence(),"complex64"===s){const e=await Promise.all([this.read(r.real.dataId),this.read(r.imag.dataId)]);u=Ov(e[0],e[1])}else if(null==c)u=this.getValuesFromTexture(e);else{const e=zs(a);u=this.gpgpu.downloadFloat32MatrixFromBuffer(c,e)}if(null!=l&&this.disposeIntermediateTensorInfo(l),null!=c){const e=this.gpgpu.gl;oB(e,(()=>e.deleteBuffer(c)))}const h=this.convertAndCacheOnCPU(e,u),d=this.pendingRead.get(e);return this.pendingRead.delete(e),d.forEach((e=>e(h))),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&ch().removeDataId(e,this),this.pendingDeletes--),h}readToGPU(e,t={}){const n=this.texData.get(e),{values:a,shape:i,slice:s,dtype:r,isPacked:o,texture:l}=n;if("complex64"===r)throw new Error("Does not support reading texture for complex64 dtype.");if(null!=s){let n;n=o?new PL(i,DL):new SL(i,DL);const a=this.runWebGLProgram(n,[{dataId:e,shape:i,dtype:r}],r),s=this.readToGPU(a,t);return this.disposeIntermediateTensorInfo(a),s}if(null==l)throw null!=a?new Error("Data is not on GPU but on CPU."):new Error("There is no data on GPU or CPU.");const u=this.decode(e,t.customTexShape),c=ch().makeTensorFromTensorInfo(u),h=this.texData.get(u.dataId);return Object.assign({tensorRef:c},h.texture)}bufferSync(e){const t=this.readSync(e.dataId);if("string"===e.dtype)try{const n=t.map((e=>nc(e)));return vd(e.shape,e.dtype,n)}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return vd(e.shape,e.dtype,t)}checkNumericalProblems(e){if(null!=e)for(let t=0;t0}time(e){const t=this.activeTimers,n=[];let a=!1;null==this.programTimersStack?(this.programTimersStack=n,a=!0):this.activeTimers.push(n),this.activeTimers=n,e();const i=ic(this.activeTimers.map((e=>e.query))).filter((e=>null!=e)),s=ic(this.activeTimers.map((e=>e.name))).filter((e=>null!=e));this.activeTimers=t,a&&(this.programTimersStack=null);const r={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};return(async()=>{if(cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){const e=await Promise.all(i);r.kernelMs=function(e){let t=0;for(let n=0;ne.map(((e,t)=>({name:s[t],ms:e}))).map((e=>`${e.name}: ${e.ms}`)).join(", ")}else r.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,r})()}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:ec(),endMs:null}}endTimer(e){return cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=ec(),e)}async getQueryTime(e){if(cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);const t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);const{complexTensorInfos:n}=this.texData.get(e);return null!=n&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){const{texture:t,dtype:n,texShape:a,usage:i,isPacked:s,slice:r}=this.texData.get(e),o=r&&r.origDataId||e,l=this.dataRefCount.get(o);l>1?this.dataRefCount.set(o,l-1):(this.dataRefCount.delete(o),null!=t&&(this.numBytesInGPU-=this.computeBytes(a,n),this.textureManager.releaseTexture(t,a,i,s)));const u=this.texData.get(e);u.texture=null,u.texShape=null,u.isPacked=!1,u.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture.texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=WL){return cr().getBool("WEBGL_CPU_FORWARD")&&e.every((e=>null==this.texData.get(e.dataId).texture&&zs(e.shape)0&&Hs(n[0])){const i=n.map((e=>tc(e)));a=this.write(i,e,t)}else a=this.write(n,e,t);return this.texData.get(a).usage=null,{dataId:a,shape:e,dtype:t}}makeOutput(e,t,n){return ch().makeTensorFromTensorInfo(this.makeTensorInfo(e,t,n),this)}unpackTensor(e){const t=new jL(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){const t=new vL(e.shape);return this.runWebGLProgram(t,[e],e.dtype,null,!0)}packedReshape(e,t){const n=[kB(e.shape),...wB(e.shape)],a={dtype:e.dtype,shape:n,dataId:e.dataId},i=[kB(t),...wB(t)],s=new kL(i,n),r=[n],o=this.runWebGLProgram(s,[a],e.dtype,r,!0);return{dataId:o.dataId,shape:t,dtype:o.dtype}}decode(e,t){const n=this.texData.get(e),{isPacked:a,shape:i,dtype:s}=n;if(null!=t){Ns(zs(i)<=t[0]*t[1]*4,(()=>"customTexShape is too small. Row * Column * 4 should be equal or larger than the size of the tensor data."))}const r=AB(i);let o;o=a?new sF(r):new iF(r);const l=[null!=t?t:iB(r)];return{dtype:s,shape:i,dataId:this.runWebGLProgram(o,[{shape:r,dtype:s,dataId:e}],s,l,!0,t).dataId}}runWebGLProgram(e,t,n,a,i=!1,s){const r=this.makeTensorInfo(e.outputShape,n),o=this.texData.get(r.dataId);if(e.packedOutput&&(o.isPacked=!0),e.outPackingScheme===YM.DENSE){const t=null!=s?s:iB(e.outputShape);o.texShape=t.map((e=>2*e))}if(null!=e.outTexUsage&&(o.usage=e.outTexUsage),0===zs(r.shape))return o.values=Us(r.dtype,0),r;const l=[],u=t.map((t=>{if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let n=this.texData.get(t.dataId);if(null==n.texture){if(!e.packedInputs&&zs(t.shape)<=cr().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:n.values};e.packedInputs&&(n.isPacked=!0,n.shape=t.shape)}if(this.uploadToGPU(t.dataId),!!n.isPacked!=!!e.packedInputs)t=n.isPacked?this.unpackTensor(t):this.packTensor(t),l.push(t),n=this.texData.get(t.dataId);else if(n.isPacked&&!CB(n.shape,t.shape)){const e=t,a=t.shape;t.shape=n.shape,t=this.packedReshape(t,a),l.push(t),n=this.texData.get(t.dataId),e.shape=a}return{shape:t.shape,texData:n,isUniform:!1}}));this.uploadToGPU(r.dataId);const c={shape:r.shape,texData:o,isUniform:!1},h=function(e,t,n){let a="";t.concat(n).forEach((t=>{const i=null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0;if(e.enableShapeUniforms&&!t.isUniform){const s=t.texData.texShape,{useSqueezeShape:r,uniformShape:o,keptDims:l}=YB(e.packedInputs,t.shape,s);let u="",c="",h="";if(1===o.length&&e.packedInputs){const e=[Math.ceil(s[0]/2),Math.ceil(s[1]/2)];u=`${e[0]>1}_${e[1]>1}`}else if(2!==o.length||e.packedInputs){if(o.length>2&&!e.packedInputs){const e=Ys(o);h=`${e[0]===s[1]}_${e[e.length-1]===s[1]}`}}else c=`${o[0]>1}_${o[1]>1}`;const d=t.shape.length,p=2===o.length&&Os(t.shape,s),m=1===zs(t.shape),f=qd(t.shape,n.shape),g=!e.packedInputs&&d===n.shape.length&&Os(s,n.texData.texShape),y=e.packedInputs||o.length>2?"":`${s[0]>1}_${s[1]>1}`;a+=`${d}_${g}_${r?l:""}_${o.length}_${m}_${f}_${p}_${u}_${c}_${h}_${y}_${i}`}else{const e=t.isUniform?"uniform":t.texData.texShape;a+=`${t.shape}_${e}_${i}`}}));const i=e.userCode;let s=e.constructor.name;return s+="_"+a+"_"+i+`${cr().getNumber("WEBGL_VERSION")}`,s}(e,u,c),d=this.getAndSaveBinary(h,(()=>eF(this.gpgpu,e,u,c))),p=null!=this.activeTimers;let m;p&&(m=this.startTimer()),cr().get("ENGINE_COMPILE_ONLY")||function(e,t,n,a,i){t.program.enableShapeUniforms||(nF(t.inShapeInfos,n),nF([t.outShapeInfo],[a]));const s=a.texData.texture,r=a.texData.texShape;a.texData.isPacked?e.setOutputPackedMatrixTexture(s.texture,r[0],r[1]):e.setOutputMatrixTexture(s.texture,r[0],r[1]),e.setProgram(t.webGLProgram),e.bindVertexArray(t.webGLProgram.vao),1===cr().getNumber("WEBGL_VERSION")&&null!==t.infLoc&&e.gl.uniform1f(t.infLoc,1/0),null!==t.nanLoc&&e.gl.uniform1f(t.nanLoc,NaN);for(let a=0;athis.disposeIntermediateTensorInfo(e))),p&&(m=this.endTimer(m),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(m)}));const f=cr().getNumber("WEBGL_FLUSH_THRESHOLD");if(f>0){const e=ec();e-this.lastGlFlushTime>f&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=e)}if(!cr().getBool("WEBGL_LAZILY_UNPACK")&&o.isPacked&&!1===i){const e=this.unpackTensor(r);return this.disposeIntermediateTensorInfo(r),e}return r}compileAndRun(e,t,n,a,i=!1){n=n||t[0].dtype;return this.runWebGLProgram(e,t,n,a,i)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){if(!this.disposed){if(!cr().getBool("IS_TEST")){Object.keys(this.binaryCache).forEach((e=>{this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram),delete this.binaryCache[e]}))}this.textureManager.dispose(),null!=this.canvas&&"undefined"!=typeof HTMLCanvasElement&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0}}floatPrecision(){return null==this.floatPrecisionValue&&(this.floatPrecisionValue=dh((()=>{if(!cr().get("WEBGL_RENDER_FLOAT32_ENABLED")){const e=cr().getBool("DEBUG");cr().set("DEBUG",!1);const t=this.abs(Rd(1e-8)).dataSync()[0];if(cr().set("DEBUG",e),t>0)return 32}return 16}))),this.floatPrecisionValue}epsilon(){return 32===this.floatPrecision()?1e-7:1e-4}uploadToGPU(e){const t=this.texData.get(e),{shape:n,dtype:a,values:i,texture:s,usage:r,isPacked:o}=t;if(null!=s)return;const l=null!=this.activeTimers;let u;l&&(u=ec());let c=t.texShape;if(null==c&&(c=function(e,t=!1){let n=cr().getNumber("WEBGL_MAX_TEXTURE_SIZE"),a=cr().getNumber("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE");if(a===1/0&&cr().getBool("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE")&&(a=n/2),t&&(n*=2,a*=2,1===(e=e.map(((t,n)=>n>=e.length-2?Ts(e[n]):e[n]))).length&&(e=[2,e[0]])),2!==e.length){const t=Vs(e);e=t.newShape}let i=zs(e),s=null;e.length<=1&&i<=n?s=[1,i]:2===e.length&&e[0]<=n&&e[1]<=n?s=e:3===e.length&&e[0]*e[1]<=n&&e[2]<=n?s=[e[0]*e[1],e[2]]:3===e.length&&e[0]<=n&&e[1]*e[2]<=n?s=[e[0],e[1]*e[2]]:4===e.length&&e[0]*e[1]*e[2]<=n&&e[3]<=n?s=[e[0]*e[1]*e[2],e[3]]:4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n&&(s=[e[0],e[1]*e[2]*e[3]]);const r=null!=s&&Math.max(...s)>a&&Math.min(...s)<=(t?2:1)&&Math.min(...s)>0;if(null==s||r)if(t){const t=kB(e);let n=2,a=2;e.length&&([n,a]=wB(e)),i=t*(n/2)*(a/2),s=Bs(i).map((e=>2*e))}else s=Bs(i);return s}(n,o),t.texShape=c),null!=i){const e=AB(n);let s,r=c[1],h=c[0];const d=i instanceof Uint8Array||i instanceof Uint8ClampedArray;!o&&d||([r,h]=sB(c[0],c[1])),s=o?new cF(e,d):new uF(e,d);const p=d?[h,r]:c,m=this.makeTensorInfo(p,a),f=this.texData.get(m.dataId);f.usage=d?JM.PIXELS:JM.UPLOAD,f.texShape=p,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(m.dataId),r,h,i);const g=[[h,r]],y=!0,b=this.runWebGLProgram(s,[m],a,g,y),v=this.texData.get(b.dataId);t.texShape=v.texShape,t.isPacked=v.isPacked,t.usage=v.usage,cr().get("ENGINE_COMPILE_ONLY")?this.disposeData(b.dataId):(t.texture=v.texture,t.values=null,this.texData.delete(b.dataId)),this.disposeIntermediateTensorInfo(m),l&&(this.uploadWaitMs+=ec()-u)}else{const e=this.acquireTexture(c,r,a,o);t.texture=e}}convertAndCacheOnCPU(e,t){const n=this.texData.get(e),{dtype:a}=n;return null!=t&&(n.values=function(e,t){if("float32"===t||"complex64"===t)return e;if("int32"===t||"bool"===t){const n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length);for(let t=0;t1024*this.numMBBeforeWarning*1024){(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0}return this.textureManager.acquireTexture(e,t,a)}computeBytes(e,t){return e[0]*e[1]*qs(t)}checkCompileCompletion(){for(const[,e]of Object.entries(this.binaryCache))this.checkCompletion_(e)}async checkCompileCompletionAsync(){const e=[];if(this.gpgpu.parallelCompilationExtension){for(const[,t]of Object.entries(this.binaryCache))e.push(this.checkCompletionAsync_(t));return Promise.all(e)}for(const[,t]of Object.entries(this.binaryCache)){const n=new Promise((e=>{try{this.checkCompletion_(t),e(!0)}catch(e){throw e}}));e.push(n)}return Promise.all(e)}async checkCompletionAsync_(e){return this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR)?this.checkCompletion_(e):(await lv(),this.checkCompletionAsync_(e))}checkCompletion_(e){if(!1===this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.gl.LINK_STATUS)){if(!1===this.gpgpu.gl.getShaderParameter(e.fragmentShader,this.gpgpu.gl.COMPILE_STATUS))throw hB(e.source,this.gpgpu.gl.getShaderInfoLog(e.fragmentShader)),new Error("Failed to compile fragment shader.");throw new Error("Failed to link vertex and fragment shaders.")}return!0}getUniformLocations(){for(const e of Object.values(this.binaryCache)){this.gpgpu.buildVao(e.webGLProgram);const{variablesLocations:t,customUniformLocations:n,infLoc:a,nanLoc:i,outShapeLocation:s,outShapeStridesLocation:r,outTexShapeLocation:o}=tF(this.gpgpu,e.program,e.webGLProgram);e.variablesLocations=t,e.customUniformLocations=n,e.infLoc=a,e.nanLoc=i,e.outShapeLocation=s,e.outShapeStridesLocation=r,e.outTexShapeLocation=o}}createTensorFromGPUData(e,t,n){e.channels=e.channels||"RGBA";const{texture:a,height:i,width:s,channels:r}=e,o=ch().backend;if(!o.gpgpu.gl.isTexture(a))throw new Error("The texture is invalid. Also, please make sure the texture and the TFJS WebGL backend are using the same canvas. If you want to use your own custom canvas, you have to create and use the custom TFJS WebGL backend created from the canvas through 'new tf.MathBackendWebGL(customCanvas)'.");const l=o.writeTexture(a,t,n,i,s,r);return ch().makeTensorFromDataId(l,t,n,o)}}GL.nextDataId=0;Xc()&&fh("webgl",(()=>new GL),2);const qL="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n";class HL{constructor(e,t,n){this.variableNames=["A","B"],this.outputShape=Kd(t,n),this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n float binaryOperation(float a, float b) {\n ${e}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `}}const KL="\n result.r = isNaN.r ? NAN : result.r;\n result.g = isNaN.g ? NAN : result.g;\n result.b = isNaN.b ? NAN : result.b;\n result.a = isNaN.a ? NAN : result.a;\n";class $L{constructor(e,t,n,a=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=Kd(t,n);const i=this.outputShape.length;this.enableShapeUniforms=aF(i);let s="";if(a)if(0===i||1===zs(this.outputShape))s="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else{if(s=`\n ${XB(i)} coords = getOutputCoords();\n `,1===i)this.enableShapeUniforms?s+="\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ":s+=`\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;else{const e=bL("coords",i);this.enableShapeUniforms?s+=`\n bool nextRowOutOfBounds =\n (${e[i-2]} + 1) >= outShape[${i} - 2];\n bool nextColOutOfBounds =\n (${e[i-1]} + 1) >= outShape[${i} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `:s+=`\n bool nextRowOutOfBounds =\n (${e[i-2]} + 1) >= ${this.outputShape[i-2]};\n bool nextColOutOfBounds =\n (${e[i-1]} + 1) >= ${this.outputShape[i-1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `}}this.userCode=`\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${e}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${s}\n\n setOutput(result);\n }\n `}}function ZL(e){const{inputs:t,backend:n}=e,{x:a}=t;return n.incRef(a.dataId),{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}const XL={kernelName:Ro,backendName:"webgl",kernelFunc:ZL};function YL(e){const{inputs:t,backend:n}=e,{real:a,imag:i}=t,s=n.makeTensorInfo(a.shape,"complex64"),r=n.texData.get(s.dataId),o=ZL({inputs:{x:a},backend:n}),l=ZL({inputs:{x:i},backend:n});return r.complexTensorInfos={real:o,imag:l},s}const QL={kernelName:Vr,backendName:"webgl",kernelFunc:YL},JL="return (a < 0.) ? b * a : a;",eP="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";const tP={kernelName:Fo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{alpha:s}=a,r=n.makeTensorInfo([],"float32",Qu(s,"float32")),o=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new $L(eP,i.shape,r.shape):new HL(JL,i.shape,r.shape),l=n.runWebGLProgram(o,[i,r],"float32");return n.disposeIntermediateTensorInfo(r),l}},nP="return (a < 0.) ? b * a : a;",aP="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";const iP={kernelName:bl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a,alpha:i}=t,s=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new $L(aP,a.shape,i.shape):new HL(nP,a.shape,i.shape);return n.runWebGLProgram(s,[a,i],"float32")}},sP="if (isnan(x)) return x;";function rP({opSnippet:e,packedOpSnippet:t,cpuKernelImpl:n,dtype:a}){return({inputs:i,backend:s})=>{const{x:r}=i,o=s,l=a||r.dtype;if(o.shouldExecuteOnCPU([r])&&null!=n){const e=o.texData.get(r.dataId),t=n(e.values,l);return o.makeTensorInfo(r.shape,l,t)}let u;return u=cr().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&null!=t?new PL(r.shape,t):new SL(r.shape,e),o.runWebGLProgram(u,[r],l)}}function oP({opSnippet:e,packedOpSnippet:t,checkOutOfBounds:n=!1,supportsComplex:a=!1,cpuKernelImpl:i,dtype:s}){return({inputs:r,backend:o})=>{const{a:l,b:u}=r,c=o;if(a&&"complex64"===l.dtype){const t=c.texData.get(l.dataId),n=c.texData.get(u.dataId),[a,i]=[[t.complexTensorInfos.real,n.complexTensorInfos.real],[t.complexTensorInfos.imag,n.complexTensorInfos.imag]].map((t=>{const[n,a]=t,i={dataId:n.dataId,dtype:n.dtype,shape:l.shape},s={dataId:a.dataId,dtype:a.dtype,shape:u.shape},r=new HL(e,l.shape,u.shape);return c.runWebGLProgram(r,[i,s],Oc(n.dtype,a.dtype))})),s=YL({inputs:{real:a,imag:i},backend:c});return c.disposeIntermediateTensorInfo(a),c.disposeIntermediateTensorInfo(i),s}const h=s||Oc(l.dtype,u.dtype);if(("string"===l.dtype||"string"===u.dtype||c.shouldExecuteOnCPU([l,u]))&&null!=i){const e=c.texData.get(l.dataId).values,t=c.texData.get(u.dataId).values,n="string"===l.dtype?mk(e):e,a="string"===l.dtype?mk(t):t,[s,r]=i(l.shape,u.shape,n,a,h),o=c.makeTensorInfo(r,h);return c.texData.get(o.dataId).values=s,o}let d;return d=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&null!=t?new $L(t,l.shape,u.shape,n):new HL(e,l.shape,u.shape),c.runWebGLProgram(d,[l,u],h)}}function lP(e,t=!1){if("linear"===e)return t?OL:_L;if("relu"===e)return t?BL:NL;if("elu"===e)return t?ML:IL;if("relu6"===e)return t?FL:RL;if("prelu"===e)return t?aP:nP;if("leakyrelu"===e)return t?eP:JL;if("sigmoid"===e)return t?LL:zL;throw new Error(`Activation ${e} has not been implemented for the WebGL backend.`)}class uP{constructor(e,t,n,a=!1,i=!1,s=!1,r=null,o=!1,l=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=n,this.enableShapeUniforms=aF(this.outputShape.length);const u=a?e[1]:e[2],c=Math.ceil(u/2),h=a?"i * 2, rc.y":"rc.y, i * 2",d=i?"rc.z, i * 2":"i * 2, rc.z",p=a?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],m=i?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"];let f="",g="";r&&(f=o?`vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${r}\n }`:l?`vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${r}\n }`:`vec4 activation(vec4 x) {\n ${r}\n }`,g="result = activation(result);");const y=s?"result += getBiasAtOutCoords();":"";s&&this.variableNames.push("bias"),o&&this.variableNames.push("preluActivationWeights"),l&&this.variableNames.push("leakyreluAlpha");let b="rc.x",v="rc.x";e[0]`The new shape (${l}) has ${u} elements and the old shape (${i.shape}) has ${o} elements. The new shape and old shape must have the same number of elements.`));const c=r.texData.get(i.dataId);return!c.isPacked||CB(i.shape,l)||null!==c.texture&&CB(c.shape,l)?(r.incRef(i.dataId),{dataId:i.dataId,shape:l,dtype:i.dtype}):function(e,t,n){const a=[kB(e.shape),...wB(e.shape)],i={dtype:e.dtype,shape:a,dataId:e.dataId},s=[kB(t),...wB(t)],r=new kL(s,a),o=[a],l=n.runWebGLProgram(r,[i],e.dtype,o,!0);return{dataId:l.dataId,shape:t,dtype:l.dtype}}(i,l,r)}const gP={kernelName:_l,backendName:"webgl",kernelFunc:fP};class yP{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:a,inSize:i,outSize:s}=e;this.outputShape=[a,s];const r=4*Math.floor(n/4),o=n%4;let l="sumValue += dot(values, ones);";if(null!=t){const e=1/t;l=`sumValue += dot(values * ${Ms(e)?e.toPrecision(2):e}, ones);`}let u="";i%n>0&&(u=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return 0.0;\n }\n `),this.userCode=`\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${u}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${r}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${l}\n }\n\n int inIdx = inOffset + ${r};\n if (${1===o}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${l}\n } else if (${2===o}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${l}\n } else if (${3===o}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${l}\n }\n setOutput(sumValue);\n }\n `}}class bP{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:a,inSize:i,outSize:s}=e;this.outputShape=[a,s];let r="0.0",o="";"prod"===t?r="1.0":"min"===t?(r="1.0 / 1e-20",o="min"):"max"===t&&(r="-1.0 / 1e-20",o="max");let l=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"sum"===t?l="sumValue":"prod"===t?l="prodValue":"all"===t?l="allValue":"any"===t&&(l="anyValue");const u=4*Math.floor(n/4),c=n%4;let h=`\n if (${"sum"===t}) {\n sumValue += dot(values, ones);\n } else if (${"prod"===t}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${o}(values, minMaxValue);\n if (${"min"===t} || ${"max"===t}) {\n minMaxValue = ${o}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `,d="vec4";"all"===t?(r="1.0",h="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",d="bvec4"):"any"===t&&(r="0.0",h="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",d="bvec4");let p="";i%n>0&&(p=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return initializationValue;\n }\n `),this.userCode=`\n const float initializationValue = ${r};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${p}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n vec4 minMaxValue = vec4(${r});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${u}; i += 4) {\n int inIdx = inOffset + i;\n ${d} values = ${d}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${h}\n }\n\n int inIdx = inOffset + ${u};\n if (${1===c}) {\n ${d} values = ${d}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${h}\n } else if (${2===c}) {\n ${d} values = ${d}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${h}\n } else if (${3===c}) {\n ${d} values = ${d}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${h}\n }\n setOutput(${l});\n }\n `}}function vP(e,t,n,a){const i=function(e){const t=[];for(;0===t.length||1!==t[t.length-1].outSize;){const n=t.length?t[t.length-1].outSize:e[1],a=bv(n);t.push({inSize:n,windowSize:a,outSize:Math.ceil(n/a)})}return t}(e.shape);let s=e;for(let r=0;r6)throw Error(`Transpose for rank ${t} is not yet supported`);const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],a=new Array(t);for(let t=0;t6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);const a=XB(this.rank),i=yL("rc",this.rank),s=new Array(this.rank);for(let e=0;e`Error in matMul: inner shapes (${h}) and (${d}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${n} and transposeB=${a} must match.`));const k=n?[y,h,p]:[y,p,h],w=a?[b,m,d]:[b,d,m],A=fP({inputs:{x:e},backend:i,attrs:{shape:k}}),x=fP({inputs:{x:t},backend:i,attrs:{shape:w}}),C=[A,x],S=Math.max(y,b),E=n?A.shape[1]:A.shape[2],_=null!=s,T=null!=r,I="leakyrelu"===l,N=null!=l?lP(l,!0):null;let R;if((1===p||1===m)&&E>_P&&!1===(_||T||I||null!=N)){let e=A,t=x;n&&(e=SP({inputs:{x:A},backend:i,attrs:{perm:[0,2,1]}}),C.push(e)),a&&(t=SP({inputs:{x},backend:i,attrs:{perm:[0,2,1]}}),C.push(t));const s=1===m;let r=e;1!==m&&(r=fP({inputs:{x:e},backend:i,attrs:{shape:[S,E,1]}}),C.push(r));const o=1===m?2:1;let l=t;s&&(l=fP({inputs:{x:t},backend:i,attrs:{shape:[S,1,E]}}),C.push(l));const u=pP({inputs:{a:r,b:l},backend:i});R=xP({inputs:{x:u},backend:i,attrs:{axis:o,keepDims:!0}}),C.push(u)}else{const l=Oc(e.dtype,t.dtype),u=new uP(k,w,[S,p,m],n,a,_,N,T,I),c=[A,x];if(null!=s&&c.push(s),T&&c.push(r),I){const e=i.makeTensorInfo([],"float32",Qu(o,"float32"));c.push(e),C.push(e)}R=i.runWebGLProgram(u,c,l)}const D=fP({inputs:{x:R},backend:i,attrs:{shape:v}});C.push(R);for(const e of C)i.disposeIntermediateTensorInfo(e);return D}const IP={kernelName:Cu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{a:i,b:s,bias:r,preluActivationWeights:o}=t,{transposeA:l,transposeB:u,activation:c,leakyreluAlpha:h}=a;return TP({a:i,b:s,transposeA:l,transposeB:u,backend:n,bias:r,preluActivationWeights:o,leakyreluAlpha:h,activation:c})}},NP="return abs(x);";const RP={kernelName:fr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t;if(n.shouldExecuteOnCPU([a])&&"complex64"!==a.dtype){const e=n.texData.get(a.dataId),t=tL(e.values);return n.makeTensorInfo(a.shape,a.dtype,t)}let i;return i=cr().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new PL(a.shape,NP):new SL(a.shape,NP),n.runWebGLProgram(i,[a],a.dtype)}},DP=rP({opSnippet:EL+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n"}),zP={kernelName:gr,backendName:"webgl",kernelFunc:DP},OP=rP({opSnippet:EL+"\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));"}),MP={kernelName:yr,backendName:"webgl",kernelFunc:OP},BP="return a + b;",FP=oP({opSnippet:BP,packedOpSnippet:BP,supportsComplex:!0,cpuKernelImpl:AF}),LP={kernelName:br,backendName:"webgl",kernelFunc:FP};class PP{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`float v${e} = get${e}AtOutCoords();`)}));const a=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n float result = ${a};\n setOutput(result);\n }\n `}}class jP{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`vec4 v${e} = get${e}AtOutCoords();`)}));const a=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n vec4 result = ${a};\n setOutput(result);\n }\n `}}const VP={kernelName:vr,backendName:"webgl",kernelFunc:function e(t){const{inputs:n,backend:a}=t,i=n;if(1===i.length)return ZL({inputs:{x:i[0]},backend:a});if(i.length>cr().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){const t=Math.floor(i.length/2),n=e({inputs:i.slice(0,t),backend:a}),s=e({inputs:i.slice(t),backend:a});return e({inputs:[n,s],backend:a})}const s=i.map((e=>e.dtype)).reduce(((e,t)=>Oc(e,t))),r=i.map((e=>e.shape)),o=cr().getBool("WEBGL_PACK")?new jP(i[0].shape,r):new PP(i[0].shape,r);return a.runWebGLProgram(o,i,s)}};const UP={kernelName:kr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=i.shape.length,l=js(s,i.shape);let u=l;const c=vf(u,o);let h=i;null!=c&&(h=SP({inputs:{x:i},backend:n,attrs:{perm:c}}),u=wf(u.length,o)),bf("all",u,o);const[d,p]=gf(h.shape,u),m=fP({inputs:{x:h},backend:n,attrs:{shape:[-1,zs(p)]}}),f=vP(m,m.dtype,"all",n);let g;if(r){g=fP({inputs:{x:f},backend:n,attrs:{shape:yf(d,l)}})}else g=fP({inputs:{x:f},backend:n,attrs:{shape:d}});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),null!=c&&n.disposeIntermediateTensorInfo(h),g}};const WP={kernelName:wr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=i.shape.length,l=js(s,i.shape);let u=l;const c=vf(u,o);let h=i;null!=c&&(h=SP({inputs:{x:i},backend:n,attrs:{perm:c}}),u=wf(u.length,o)),bf("any",u,o);const[d,p]=gf(h.shape,u),m=fP({inputs:{x:h},backend:n,attrs:{shape:[-1,zs(p)]}}),f=vP(m,m.dtype,"any",n);let g;if(r){g=fP({inputs:{x:f},backend:n,attrs:{shape:yf(d,l)}})}else g=fP({inputs:{x:f},backend:n,attrs:{shape:d}});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),null!=c&&n.disposeIntermediateTensorInfo(h),g}};class GP{constructor(e,t,n){this.variableNames=["A"];const{windowSize:a,batchSize:i,outSize:s}=e;n||this.variableNames.push("bestIndicesA"),this.outputShape=[i,s];const r="max"===t?">":"<",o=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${a};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${a}; i++) {\n int inIdx = ${o};\n float candidate = getA(batch, inIdx);\n if (candidate ${r} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `}}class qP{constructor(e,t,n,a){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,Ns(e.length>2,(()=>`Packed arg${n.charAt(0).toUpperCase()+n.slice(1)} supports only inputs with rank above 2.`));const i=e[e.length-1],s=Math.ceil(i/t);this.outputShape=e.slice(0,-1),s>1&&this.outputShape.push(s),a||this.variableNames.push("bestIndicesA");const r=this.outputShape,o=r.length,l=XB(o),u=bL("coords",o);let c,h;if(1===s){h=o+1;const e=XB(h);c=`\n ${e} sourceLocR = ${e}(${u.join()}, 0);\n ++${u[o-1]};\n ${e} sourceLocG = ${e}(${u.join()}, 0);\n ++${u[o-2]};\n ${e} sourceLocA = ${e}(${u.join()}, 0);\n --${u[o-1]};\n ${e} sourceLocB = ${e}(${u.join()}, 0);\n --${u[o-2]};`}else h=o,c=`\n ${l} sourceLocR = coords;\n ++${u[o-1]};\n ${l} sourceLocG = coords;\n ++${u[o-2]};\n ${l} sourceLocA = coords;\n --${u[o-1]};\n ${l} sourceLocB = coords;\n --${u[o-2]};`;const d=["x","y","z","w","u","v"].slice(0,h),p="."+d[h-1],m=d.map((e=>"int "+e)),f=bL("sourceLocR",h-1).concat("inIdx.r"),g=bL("sourceLocG",h-1).concat("inIdx.g"),y=bL("sourceLocB",h-1).concat("inIdx.b"),b=bL("sourceLocA",h-1).concat("inIdx.a"),v="max"===n?"greaterThan":"lessThan",k=a?"":`\n inIdx = round(vec4(getBestIndicesAChannel(${f.join()}),\n getBestIndicesAChannel(${g.join()}),\n getBestIndicesAChannel(${y.join()}),\n getBestIndicesAChannel(${b.join()})));`,w=`vec4(\n getAChannel(${f.join()}),\n hasNextCol ? getAChannel(${g.join()}) : 0.,\n hasNextRow ? getAChannel(${y.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${b.join()}) : 0.)`,A=a?"":`\n float getBestIndicesAChannel(${m.join()}) {\n return getChannel(getBestIndicesA(${d.join()}),\n vec2(${d.slice(-2).join()}));\n }`;this.userCode=`\n float getAChannel(${m.join()}) {\n return getChannel(getA(${d.join()}),\n vec2(${d.slice(-2).join()}));\n }\n ${A}\n void main() {\n ${l} coords = getOutputCoords();\n bool hasNextCol = ${u[o-1]} < ${r[o-1]-1};\n bool hasNextRow = ${u[o-2]} < ${r[o-2]-1};\n ${c}\n ivec4 srcIdx = ivec4(sourceLocR${p}, sourceLocG${p},\n sourceLocB${p}, sourceLocA${p}) * ${t};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${w};\n\n for (int i = 0; i < ${t}; i++) {\n inIdx = srcIdx;\n ${k}\n vec4 candidate = ${w};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${v}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `}}function HP(e,t,n,a=null){let i=t.shape[0],s=t.shape[1];null!=a&&(i=a.shape[0],s=a.shape[1]);const r=bv(s),o={windowSize:r,inSize:s,batchSize:i,outSize:Math.ceil(s/r)},l=new GP(o,n,null==a),u=[t];null!=a&&u.push(a);const c=e.runWebGLProgram(l,u,"int32");if(1===c.shape[1])return c;const h=HP(e,t,n,c);return e.disposeIntermediateTensorInfo(c),h}function KP(e,t,n,a=null){const i=null!=a?a.shape:t.shape,s=bv(i[i.length-1]),r=new qP(i,s,n,null==a),o=null==a?[t]:[t,a],l=e.runWebGLProgram(r,o,"int32");if(l.shape.length===t.shape.length){const a=KP(e,t,n,l);return e.disposeIntermediateTensorInfo(l),a}return l}function $P(e,t,n,a){const i=[n];if(bf("arg"+a.charAt(0).toUpperCase()+a.slice(1),i,t.shape.length),!cr().getBool("WEBGL_PACK_REDUCE")||t.shape.length<=2){const n=[],s=e.texData.get(t.dataId);let r=t;null!==s&&s.isPacked&&(r=e.unpackTensor(t),n.push(r));const[o,l]=gf(r.shape,i),u=zs(l),c=fP({inputs:{x:r},backend:e,attrs:{shape:[-1,u]}});n.push(c);const h=HP(e,c,a);n.push(h);const d=fP({inputs:{x:h},backend:e,attrs:{shape:o}});return n.forEach((t=>e.disposeIntermediateTensorInfo(t))),d}return KP(e,t,a)}const ZP={kernelName:Ar,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s}=a;let r=js(s,i.shape);const o=vf(r,i.shape.length);let l=i;const u=[];null!=o&&(l=SP({inputs:{x:i},backend:n,attrs:{perm:o}}),u.push(l),r=wf(r.length,l.shape.length)),bf("argMax",[r[0]],l.shape.length);const c=$P(n,l,r[0],"max");return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),c}};const XP={kernelName:xr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s}=a;let r=js(s,i.shape);const o=vf(r,i.shape.length);let l=i;const u=[];null!=o&&(l=SP({inputs:{x:i},backend:n,attrs:{perm:o}}),u.push(l),r=wf(r.length,l.shape.length)),bf("argMin",[r[0]],l.shape.length);const c=$P(n,l,r[0],"min");return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),c}},YP=rP({opSnippet:EL+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n"}),QP={kernelName:Cr,backendName:"webgl",kernelFunc:YP},JP=rP({opSnippet:EL+"return log(x + sqrt(x * x + 1.0));"}),ej={kernelName:Sr,backendName:"webgl",kernelFunc:JP},tj=rP({opSnippet:EL+"\n return atan(x);\n"}),nj={kernelName:Er,backendName:"webgl",kernelFunc:tj},aj=oP({opSnippet:qL+"\n return atan(a, b);\n",packedOpSnippet:"\n vec4 result = atan(a, b);\n bvec4 isNaNA = isnan(a);\n bvec4 isNaNB = isnan(b);\n bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n "+KL+"\n return result;\n"}),ij={kernelName:Tr,backendName:"webgl",kernelFunc:aj},sj=rP({opSnippet:EL+"\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;"}),rj={kernelName:_r,backendName:"webgl",kernelFunc:sj};class oj{constructor(e,t,n,a=!1,i=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const s=e.filterWidth,r=e.strideHeight,o=e.strideWidth,l=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterHeight,h=e.effectiveFilterWidth,d=e.padInfo.top,p=e.padInfo.left;this.outputShape=e.outShape;const m="avg"===t,f=`((batch * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + d`,g=`(xR * ${e.inWidth} + xC) * ${e.inChannels} + d`;let y="0.0";if(m||(y="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec2 strides = ivec2(${r}, ${o});\n const ivec2 pads = ivec2(${d}, ${p});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < ${c};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${h};\n wC += ${u}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${a?i?f:g:`wR * ${h} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let b=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(b="avgValue / max(count, 1.0)");const v=4*Math.floor(s/4),k=s%4,w=`\n if (${m}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec2 strides = ivec2(${r}, ${o});\n const ivec2 pads = ivec2(${d}, ${p});\n const float initializationValue = ${y};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${y});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${c};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${v}; wC += 4) {\n int xC = xCCorner + wC * ${u};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n getValue(batch, xR, xC + 3 * ${u}, d)\n );\n\n ${w}\n }\n\n int xC = xCCorner + ${v};\n if (${1===k}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${w}\n } else if (${2===k}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n initializationValue,\n initializationValue\n );\n\n ${w}\n } else if (${3===k}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n initializationValue\n );\n\n ${w}\n }\n }\n setOutput(${b});\n }\n `}}class lj{constructor(e,t,n,a=!1,i=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const s=e.filterWidth,r=e.strideDepth,o=e.strideHeight,l=e.strideWidth,u=e.dilationDepth,c=e.dilationHeight,h=e.dilationWidth,d=e.effectiveFilterDepth,p=e.effectiveFilterHeight,m=e.effectiveFilterWidth,f=e.padInfo.front,g=e.padInfo.top,y=e.padInfo.left;this.outputShape=e.outShape;const b="avg"===t;let v="0.0";if(b||(v="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec3 strides =\n ivec3(${r}, ${o}, ${l});\n const ivec3 pads = ivec3(${f}, ${g}, ${y});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${d};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${c}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m};\n wC += ${h}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${a?i?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${p} * ${m} +\n wR * ${m} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let k=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(k="avgValue / max(count, 1.0)");const w=4*Math.floor(s/4),A=s%4,x=`\n if (${b}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec3 strides =\n ivec3(${r}, ${o}, ${l});\n const ivec3 pads = ivec3(${f}, ${g}, ${y});\n const float initializationValue = ${v};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${v});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${d};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${c}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${w}; wC += 4) {\n int xC = xCCorner + wC * ${h};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${h}, ch),\n getValue(batch, xD, xR, xC + 2 * ${h}, ch),\n getValue(batch, xD, xR, xC + 3 * ${h}, ch)\n );\n\n ${x}\n }\n\n int xC = xCCorner + ${w};\n if (${1===A}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${2===A}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${h}, ch),\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${3===A}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${h}, ch),\n getValue(batch, xD, xR, xC + 2 * ${h}, ch),\n initializationValue\n );\n\n ${x}\n }\n }\n }\n setOutput(${k});\n }\n `}}const uj={kernelName:Ir,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;RB(i,"avgPool");const{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=a;Ns(fm(r,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))return ZL({inputs:{x:i},backend:n});const c=new oj(u,"avg",!1);return n.runWebGLProgram(c,[i],"float32")}};const cj={kernelName:Rr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l,dataFormat:u}=a,c=rm(i.shape,s,r,[1,1,1],o,l,u),h=new lj(c,"avg",!1);return n.runWebGLProgram(h,[i],"float32")}};class hj{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,a=e.strideHeight,i=e.strideWidth,s=e.dilationHeight,r=e.dilationWidth,o=e.effectiveFilterHeight,l=e.effectiveFilterWidth,u=o-1-e.padInfo.top,c=l-1-e.padInfo.left,h=1/(t*n);this.userCode=`\n const ivec2 pads = ivec2(${u}, ${c});\n const float avgMultiplier = float(${h});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${o};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${l};\n wC+= ${r}) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `}}class dj{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,a=e.filterWidth,i=e.strideDepth,s=e.strideHeight,r=e.strideWidth,o=e.dilationDepth,l=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterDepth,h=e.effectiveFilterHeight,d=e.effectiveFilterWidth,p=c-1-e.padInfo.front,m=h-1-e.padInfo.top,f=d-1-e.padInfo.left,g=1/(t*n*a);this.userCode=`\n const ivec3 pads = ivec3(${p}, ${m}, ${f});\n const float avgMultiplier = float(${g});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${c};\n wD += ${o}) {\n float dyD = float(dyDCorner + wD) / ${i}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${h};\n wR += ${l}) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${d};\n wC += ${u}) {\n float dyC = float(dyCCorner + wC) / ${r}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const pj={kernelName:Dr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s,{filterSize:o,strides:l,pad:u,dimRoundingMode:c}=a,h=rm(r.shape,o,l,[1,1,1],u,c),d=new dj(h);return n.runWebGLProgram(d,[i],r.dtype)}};const mj={kernelName:Nr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s;RB([i,s],"avgPoolGrad");const{filterSize:o,strides:l,pad:u}=a,c=sm(r.shape,o,l,1,u),h=new hj(c);return n.runWebGLProgram(h,[i],r.dtype)}};const fj={kernelName:zr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{a:i,b:s}=t,{transposeA:r,transposeB:o}=a;return TP({a:i,b:s,transposeA:r,transposeB:o,backend:n})}};class gj{constructor(e,t,n,a,i,s){this.outputShape=[],this.variableNames=["x","mean","variance"],Kd(e,t),Kd(e,n);let r="0.0";null!=a&&(Kd(e,a),this.variableNames.push("offset"),r="getOffsetAtOutCoords()");let o="1.0";null!=i&&(Kd(e,i),this.variableNames.push("scale"),o="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = ${r};\n float scale = ${o};\n float inv = scale * inversesqrt(variance + float(${s}));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n `}}class yj{constructor(e,t,n,a,i,s){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],Kd(e,t),Kd(e,n);let r="vec4(0.0)";null!=a&&(Kd(e,a),this.variableNames.push("offset"),r="getOffsetAtOutCoords()");let o="vec4(1.0)";null!=i&&(Kd(e,i),this.variableNames.push("scale"),o="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n vec4 offset = ${r};\n vec4 scale = ${o};\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4(${s}));\n\n setOutput((x - mean) * inv + offset);\n }\n `}}const bj={kernelName:Eo,backendName:"webgl",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a,mean:i,variance:s,offset:r,scale:o}=e;Ns(i.shape.length===s.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),Ns(null==r||i.shape.length===r.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),Ns(null==o||i.shape.length===o.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));let{varianceEpsilon:l}=n;null==l&&(l=.001);const u=[a,i,s];let c=null;null!=r&&(c=r.shape,u.push(r));let h=null;null!=o&&(h=o.shape,u.push(o));const d=cr().getBool("WEBGL_PACK_NORMALIZATION")?new yj(a.shape,i.shape,s.shape,c,h,l):new gj(a.shape,i.shape,s.shape,c,h,l);return t.runWebGLProgram(d,u,u[0].dtype)}};class vj{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;const t=XB(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const n=function(e){if(1===e)return"sourceLoc";if(e<=6)return kj.slice(0,e).map((e=>"sourceLoc."+e)).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}(this.rank);let a;a=`\n ${t} sourceLoc;\n ${t} coords = getOutputCoords();\n ${e.map(((e,t)=>`sourceLoc.${kj[t]} = start[${t}] + coords.${kj[t]};`)).join("\n")}\n `,this.userCode=`\n void main() {\n ${a}\n setOutput(getSource(${n}));\n }\n `}}const kj=["x","y","z","w","u","v"];class wj{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const t=XB(this.rank),n=bL("coords",this.rank),a=bL("sourceLoc",this.rank),i=1===this.rank?"sourceLoc":`vec2(${a.slice(-2).join()})`,s=`getChannel(getSource(${a.join()}), ${i})`,r=`\n result.x = ${s};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${a[this.rank-1]};\n result.y = ${s};\n --${a[this.rank-1]};\n }\n `,o=1===this.rank?"":`\n --${n[this.rank-1]};\n if (++${n[this.rank-2]} < ${e[this.rank-2]}) {\n ++${a[this.rank-2]};\n result.z = ${s};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${a[this.rank-1]};\n result.w = ${s};\n }\n }\n `,l=this.rank<=4?`sourceLoc = coords +\n ${t}(${e.map(((e,t)=>`start[${t}]`)).join()});`:e.map(((e,t)=>`${a[t]} = ${n[t]} + start[${t}];`)).join("\n");this.userCode=`\n void main() {\n ${t} coords = getOutputCoords();\n ${t} sourceLoc;\n ${l}\n vec4 result = vec4(0.);\n ${r}\n ${o}\n setOutput(result);\n }\n `}}function Aj(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{begin:s,size:r}=a,[o,l]=Wp(i,s,r);if(Ip(i,o,l),0===zs(l))return n.makeTensorInfo(l,i.dtype,[]);if(n.shouldExecuteOnCPU([i])||"string"===i.dtype){const e=n.texData.get(i.dataId),t=nL(e.values,o,l,i.shape,i.dtype);return n.makeTensorInfo(l,i.dtype,t)}const{isPacked:u}=n.texData.get(i.dataId),c=Vp(i.shape,o,l);if(u||!c){const e=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new wj(l):new vj(l),t=[o];return n.runWebGLProgram(e,[i],i.dtype,t)}return n.uploadToGPU(i.dataId),function(e,t,n,a){const i=a.texData.get(e.dataId),s=a.makeTensorInfo(n,e.dtype),r=a.texData.get(s.dataId);Object.assign(r,i),r.refCount=1,r.shape=n,r.dtype=e.dtype;let o=Up(t,Ys(e.shape));i.slice&&(o+=i.slice.flatOffset),r.slice={flatOffset:o,origDataId:i.slice&&i.slice.origDataId||e.dataId};const l=a.dataRefCount.get(r.slice.origDataId)||1;return a.dataRefCount.set(r.slice.origDataId,l+1),s}(i,o,l,n)}const xj={kernelName:Vl,backendName:"webgl",kernelFunc:Aj},Cj={kernelName:Or,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockShape:s,crops:r}=a;Ns(i.shape.length<=4,(()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"));const o=s.reduce(((e,t)=>e*t)),l=kv(i.shape,s,o),u=wv(l.length,s.length),c=Av(i.shape,s,o),h=xv(r,s.length),d=Cv(c,r,s.length),p=[],m=fP({inputs:{x:i},backend:n,attrs:{shape:l}}),f=SP({inputs:{x:m},backend:n,attrs:{perm:u}}),g=fP({inputs:{x:f},backend:n,attrs:{shape:c}}),y=Aj({inputs:{x:g},backend:n,attrs:{begin:h,size:d}});return p.push(m),p.push(f),p.push(g),p.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}};const Sj={kernelName:Mr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,weights:s}=t,{size:r}=a,o=n.readSync(i.dataId),l=n.readSync(s.dataId),u=xF(o,l,s.dtype,s.shape,r);return n.makeTensorInfo([r],s.dtype,u)}};const Ej={kernelName:Br,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{a,b:i}=t,s=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS"),r=cr().getNumber("WEBGL_VERSION");if(n.shouldExecuteOnCPU([a,i])||1===r){const e=n.texData.get(a.dataId).values,t=n.texData.get(i.dataId).values,[s,r]=SF(a.shape,i.shape,e,t,a.dtype),o=n.makeTensorInfo(r,a.dtype);return n.texData.get(o.dataId).values=s,o}let o;return o=s?new $L("\n int r = int(a.r) & int(b.r);\n int g = int(a.g) & int(b.g);\n int rb = int(a.b) & int(b.b);\n int ra = int(a.a) & int(b.a);\n return vec4(r, g, rb, ra);\n",a.shape,i.shape,!1):new HL("\n return float(int(a.r) & int(b.r));\n",a.shape,i.shape),n.runWebGLProgram(o,[a,i],a.dtype)}};const _j={kernelName:Fr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{s0:a,s1:i}=t,s=n.readSync(a.dataId),r=n.readSync(i.dataId),o=Kd(Array.from(s),Array.from(r));return n.makeTensorInfo([o.length],"int32",Int32Array.from(o))}},Tj=oP({opSnippet:"return float(a != b);",cpuKernelImpl:HF,dtype:"bool"}),Ij={kernelName:ul,backendName:"webgl",kernelFunc:Tj};function Nj(e){const{inputs:t,backend:n}=e,{input:a}=t;return ZL({inputs:{x:n.texData.get(a.dataId).complexTensorInfos.real},backend:n})}const Rj={kernelName:Cl,backendName:"webgl",kernelFunc:Nj},Dj="return float(int(x));";const zj={kernelName:Lr,backendName:"webgl",kernelFunc:function e(t){const{inputs:n,backend:a,attrs:i}=t,{x:s}=n,{dtype:r}=i;if("complex64"===r){if("complex64"===s.dtype)return ZL({inputs:{x:s},backend:a});const t=cg(s.shape),n=e({inputs:{x:s},backend:a,attrs:{dtype:"float32"}}),i=YL({inputs:{real:n,imag:t},backend:a});return t.dispose(),a.disposeIntermediateTensorInfo(n),i}if("complex64"===s.dtype){const t=Nj({inputs:{input:s},backend:a}),n=e({inputs:{x:t},backend:a,attrs:{dtype:r}});return a.disposeIntermediateTensorInfo(t),n}if(!Gs(s.dtype,r)){const e=ZL({inputs:{x:s},backend:a});return{dataId:e.dataId,shape:e.shape,dtype:r}}if(a.shouldExecuteOnCPU([s])){const e=a.texData.get(s.dataId).values,[t,n,i]=EF(e,s.shape,s.dtype,r);return a.makeTensorInfo(t,n,i)}if("int32"===r)return function(e,t){const n=new SL(e.shape,Dj),a=t.runWebGLProgram(n,[e],"int32");return{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}(s,a);if("bool"===r){const e=a.makeTensorInfo([],"bool",Us("bool",1)),t=Tj({inputs:{a:s,b:e},backend:a});return a.disposeIntermediateTensorInfo(e),t}throw new Error(`Error in Cast: failed to cast ${s.dtype} to ${r}`)}},Oj="return ceil(x);",Mj=rP({opSnippet:Oj,packedOpSnippet:Oj,cpuKernelImpl:_F}),Bj={kernelName:Pr,backendName:"webgl",kernelFunc:Mj};class Fj{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}}class Lj{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}}const Pj={kernelName:jr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{clipValueMin:s,clipValueMax:r}=a;let o;o=cr().getBool("WEBGL_PACK_CLIP")?new Lj(i.shape):new Fj(i.shape);const l=[[s],[r]];return n.runWebGLProgram(o,[i],i.dtype,l)}};class jj{constructor(e){this.variableNames=["real","imag"],this.outputShape=e,this.userCode="\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n "}}function Vj(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}const Uj={kernelName:Ur,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t,i=n.texData.get(a.dataId),s=new jj(a.shape),r=[Vj(a,i.complexTensorInfos.real),Vj(a,i.complexTensorInfos.imag)];return n.runWebGLProgram(s,r,r[0].dtype)}};class Wj{constructor(e){this.outputShape=[],this.outputShape=cv(e,1),this.variableNames=e.map(((e,t)=>`T${t}`));const t=new Array(e.length-1);t[0]=e[0][1];for(let n=1;n`T${t}`));const o=new Array(e.length-1);o[0]=e[0][t];for(let n=1;n= ${o[e-1]}) {\n return getChannel(\n getT${e}(${qj(r,l,t)}),\n vec2(${qj(u,l,t)}));\n }`}const d=o.length,p=o[o.length-1];h+=`\n return getChannel(\n getT${d}(${qj(r,l,p)}),\n vec2(${qj(u,l,p)}));`,this.userCode=`\n float getValue(${r.map((e=>"int "+e))}) {\n ${h}\n }\n\n void main() {\n ${i} coords = getOutputCoords();\n vec4 result = vec4(getValue(${s}), 0., 0., 0.);\n\n ${s[a-1]} = ${s[a-1]} + 1;\n if (${s[a-1]} < ${n[a-1]}) {\n result.g = getValue(${s});\n }\n\n ${s[a-2]} = ${s[a-2]} + 1;\n if (${s[a-2]} < ${n[a-2]}) {\n result.a = getValue(${s});\n }\n\n ${s[a-1]} = ${s[a-1]} - 1;\n if (${s[a-2]} < ${n[a-2]} &&\n ${s[a-1]} < ${n[a-1]}) {\n result.b = getValue(${s});\n }\n setOutput(result);\n }\n `}}function qj(e,t,n){const a=e.indexOf(t);return e.map(((e,t)=>t===a?`${e} - ${n}`:e)).join()}function Hj(e){const{inputs:t,backend:n}=e,{input:a}=t;return ZL({inputs:{x:n.texData.get(a.dataId).complexTensorInfos.imag},backend:n})}const Kj={kernelName:zo,backendName:"webgl",kernelFunc:Hj};function $j(e,t,n){const a=e[0].dtype;if("complex64"===a){const a=e.map((e=>Nj({inputs:{input:e},backend:n}))),i=e.map((e=>Hj({inputs:{input:e},backend:n}))),s=$j(a,t,n),r=$j(i,t,n),o=YL({inputs:{real:s,imag:r},backend:n});return a.forEach((e=>n.disposeIntermediateTensorInfo(e))),i.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(s),n.disposeIntermediateTensorInfo(r),o}let i=n.shouldExecuteOnCPU(e);if("string"===a&&(i=!0),i){const i=e.map((e=>{const a=zs(e.shape.slice(t));return fP({inputs:{x:e},backend:n,attrs:{shape:[-1,a]}})})),s=i.map((e=>({vals:n.readSync(e.dataId),shape:e.shape}))),r=cv(i.map((e=>e.shape)),1),o=1===i[0].shape[0],l=TF(s,r,a,o),u=cv(e.map((e=>e.shape)),t),c=n.makeTensorInfo(u,a,l);return i.forEach((e=>n.disposeIntermediateTensorInfo(e))),c}const s=e.filter((e=>zs(e.shape)>0)),r=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&s[0].shape.length>1;if(1===s.length){const t=r?new SL(e[0].shape,DL):new PL(e[0].shape,DL);return n.runWebGLProgram(t,e,a)}const o=cr().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER");if(s.length>o){const e=[];for(let a=0;ae.shape)),t);return n.runWebGLProgram(e,s,a)}const{tensors2D:l,outShape:u}=function(e,t,n){const a=cv(e.map((e=>e.shape)),t),i=e.map((e=>fP({inputs:{x:e},attrs:{shape:[-1,zs(e.shape.slice(t))]},backend:n})));return{tensors2D:i,outShape:a}}(s,t,n),c=new Wj(l.map((e=>e.shape))),h=n.runWebGLProgram(c,l,a);l.forEach((e=>n.disposeIntermediateTensorInfo(e)));const d=fP({inputs:{x:h},attrs:{shape:u},backend:n});return n.disposeIntermediateTensorInfo(h),d}function Zj(e){const{inputs:t,backend:n,attrs:a}=e,{axis:i}=a,s=js(i,t[0].shape)[0];uv(t.map((e=>e.shape)),s);const r=cv(t.map((e=>e.shape)),s);if(0===zs(r))return n.makeTensorInfo(r,t[0].dtype,[]);const o=t.filter((e=>zs(e.shape)>0));return 1===o.length?ZL({inputs:{x:o[0]},backend:n}):$j(o,s,n)}const Xj={kernelName:Wr,backendName:"webgl",kernelFunc:Zj};class Yj{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;const s=e.padInfo.top,r=e.padInfo.left,o=e.strideHeight,l=e.strideWidth,u=e.dilationHeight,c=e.dilationWidth,h=e.filterHeight,d=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4,f="channelsLast"===e.dataFormat,g=f?1:2,y=f?2:3,b=f?3:1;let v="",k="";n&&(v=a?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:i?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,k="result = activation(result);");const w=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),i&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${v}\n\n const ivec2 strides = ivec2(${o}, ${l});\n const ivec2 pads = ivec2(${s}, ${r});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[${b}];\n\n ivec2 xRCCorner =\n ivec2(coords[${g}], coords[${y}]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${h}; wR++) {\n int xR = xRCorner + wR * ${u};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${d}; wC++) {\n int xC = xCCorner + wC * ${c};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${f}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${1===m}) {\n\n if (${f}) {\n dotProd +=\n getX(batch, xR, xC, ${p}) *\n getW(wR, wC, ${p}, d2);\n } else {\n dotProd +=\n getX(batch, ${p}, xR, xC) *\n getW(wR, wC, ${p}, d2);\n }\n\n } else if (${2===m}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2)\n );\n\n if (${f}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${3===m}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2),\n getW(wR, wC, ${p} + 2, d2)\n );\n\n if (${f}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1),\n getX(batch, xR, xC, ${p} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC),\n getX(batch, ${p} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${w}\n ${k}\n setOutput(result);\n }\n `}}class Qj{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const t=e.padInfo.front,n=e.padInfo.top,a=e.padInfo.left,i=e.strideDepth,s=e.strideHeight,r=e.strideWidth,o=e.dilationDepth,l=e.dilationHeight,u=e.dilationWidth,c=e.filterDepth,h=e.filterHeight,d=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4;this.userCode=`\n const ivec3 strides = ivec3(${i}, ${s}, ${r});\n const ivec3 pads = ivec3(${t}, ${n}, ${a});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${c}; wF++) {\n int xF = xFCorner + wF * ${o};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${h}; wR++) {\n int xR = xRCorner + wR * ${l};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${d}; wC++) {\n int xC = xCCorner + wC * ${u};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${1===m}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${p}) *\n getW(wF, wR, wC, ${p}, d2);\n } else if (${2===m}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${3===m}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1),\n getX(batch, xF, xR, xC, ${p} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2),\n getW(wF, wR, wC, ${p} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class Jj{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=aF(this.outputShape.length);const s=e.padInfo.left,r=e.strideWidth,o=e.dilationWidth,l=e.filterHeight,u=e.filterWidth,c=u;let h="\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;";for(let e=0;e=0 && xR < inDims[0]) {\n ";for(let t=0;t<(c+1)/2;t++){const n=2*t;if(h+=`\n xC = xCCorner + ${n*o};\n `,1===r){if(n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n `,h+=1===o&&n>0?`\n xC${n} = vec4(xTexelC${n-2}.zw, xTexelC${n}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${n} = vec4(previous.zw, xTexelC${n}.xy);\n } else {\n xC${n} = vec4(0.0, 0.0, xTexelC${n}.xy);\n }\n `):h+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xC${n} = xTexelC${n};\n `,n+1= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n `,h+=o>1?`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${n+1} = vec4(previous.zw, xTexelC${n+1}.xy);\n } else {\n xC${n+1} = vec4(0.0, 0.0, xTexelC${n+1}.xy);\n }\n `:`\n xC${n+1} = vec4(xTexelC${n}.zw, xTexelC${n+1}.xy);\n `):h+=1===e?`\n xC${n+1} = xTexelC${n};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n+1} = xTexelC${n+1};\n `}}else n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(xTexelC${n}.zw, xTexelC${n+1}.zw);\n `,n+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${n+1} = vec4(xTexelC${n+1}.xy, final.xy);\n `)):(h+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(\n xTexelC${n}.xy, xTexelC${n+1}.xy);\n `,n+1= 0) {\n // Use custom imod instead mod. On Intel GPU, mod may generate\n // unexpected value.\n // https://github.com/tensorflow/tfjs/issues/5447\n offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1];\n d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) /\n inChannels);\n\n if(d1 < inputShape[${r}] && d1 >= 0) {\n\n ch = imod(pos, inChannels);\n\n if (${i}) {\n innerDims = vec2(d1, ch);\n result[${2*e+t}] = getChannel(\n getA(rc.x, d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${2*e+t}] = getChannel(\n getA(rc.x, ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;this.userCode=`\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${l}\n\n ${a.output} = result;\n }\n `}}function tV(e,t){const n=e.length;return n>=3?t?[...e.slice(0,-3),e[n-3]*e[n-2],e[n-1]]:[...e.slice(0,-3),e[n-3],e[n-2]*e[n-1]]:!t&&1===n&&e[0]>1?[e[0],1]:null}function nV({x:e,filter:t,convInfo:n,backend:a,bias:i=null,preluActivationWeights:s=null,leakyreluAlpha:r=0,activation:o=null}){const l=e.shape,u=a.texData.get(e.dataId),c=n.inChannels,h=l[0]*l[1]*l[2],d=n.outChannels,p="channelsLast"===n.dataFormat,m=!1;let f;const g=[];if(null!=s){const e=tV(s.shape,p);null!=e&&(s=fP({inputs:{x:s},backend:a,attrs:{shape:e}}),g.push(s))}if(null!=i){const e=tV(i.shape,p);null!=e&&(i=fP({inputs:{x:i},backend:a,attrs:{shape:e}}),g.push(i))}if(!((1===h||1===d)&&c>_P)&&u.isPacked&&p&&null!=u.texture&&l[2]%2!=0&&Os(u.shape.slice(-3),l.slice(-3))){const c=l[0]*l[1]*(l[2]+1),h={dataId:e.dataId,shape:[1,c,n.inChannels],dtype:e.dtype},d=u.shape;u.shape=u.shape.slice(),u.shape[u.shape.length-2]++,Ns(CB(u.shape,h.shape),(()=>`packed reshape ${u.shape} to ${h.shape} isn't free`));const p=fP({inputs:{x:t},backend:a,attrs:{shape:[1,n.inChannels,n.outChannels]}});g.push(p);const y=TP({a:h,b:p,backend:a,transposeA:false,transposeB:m,bias:i,activation:o,preluActivationWeights:s,leakyreluAlpha:r}),b=a.texData.get(y.dataId);Ns(b.isPacked,(()=>"batchMatMul result is expected to be packed")),u.shape=d,b.shape=n.outShape,f=ZL({inputs:{x:y},backend:a}),f.shape=n.outShape,g.push(y)}else{const l=n.outHeight*n.outWidth,u=fP({inputs:{x:e},backend:a,attrs:{shape:p?[n.batchSize,l,n.inChannels]:[n.batchSize,n.inChannels,l]}}),c=fP({inputs:{x:t},backend:a,attrs:{shape:[1,n.inChannels,n.outChannels]}}),h=TP({a:p?u:c,b:p?c:u,transposeA:!p,transposeB:m,backend:a,bias:i,activation:o,preluActivationWeights:s,leakyreluAlpha:r});f=fP({inputs:{x:h},backend:a,attrs:{shape:n.outShape}}),g.push(u),g.push(c),g.push(h)}for(const e of g)a.disposeIntermediateTensorInfo(e);return f}function aV({x:e,filter:t,convInfo:n,backend:a,bias:i=null,preluActivationWeights:s=null,leakyreluAlpha:r=0,activation:o=null}){const{filterWidth:l,filterHeight:u,inChannels:c,outWidth:h,outHeight:d,dataFormat:p}=n,m="channelsLast"===p,f=l*u*c,g=d*h,y=[n.batchSize,f,g],b=[];if(null!=s){const e=tV(s.shape,m);null!=e&&(s=fP({inputs:{x:s},backend:a,attrs:{shape:e}}),b.push(s))}if(null!=i){const e=tV(i.shape,m);null!=e&&(i=fP({inputs:{x:i},backend:a,attrs:{shape:e}}),b.push(i))}const v=fP({inputs:{x:t},backend:a,attrs:{shape:[1,f,zs(t.shape)/f]}});b.push(v);const k=new eV(y,n),w=[e.shape,[n.padInfo.top,n.padInfo.left],[n.strideHeight,n.strideWidth],[n.dilationHeight,n.dilationWidth],[n.inChannels],[n.filterWidth*n.inChannels],[n.outWidth]],A=a.runWebGLProgram(k,[e],"float32",w),x=fP({inputs:{x:A},backend:a,attrs:{shape:y}});b.push(A),b.push(x);const C=null!=i,S=null!=s,E="leakyrelu"===o,_=o?lP(o,!0):null,T=new uP(m?x.shape:v.shape,m?v.shape:x.shape,m?[n.batchSize,g,n.outChannels]:[n.batchSize,n.outChannels,g],!0,!1,C,_,S,E),I=m?[x,v]:[v,x];if(i&&I.push(i),S&&I.push(s),E){const e=a.makeTensorInfo([],"float32",Qu(r,"float32"));I.push(e),b.push(e)}const N=a.runWebGLProgram(T,I,"float32"),R=fP({inputs:{x:N},backend:a,attrs:{shape:n.outShape}});b.push(N);for(const e of b)a.disposeIntermediateTensorInfo(e);return R}const iV={kernelName:Gr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dataFormat:l,dilations:u,dimRoundingMode:c}=a,h=ym(l),d=om(i.shape,s.shape,r,u,o,c,!1,h);let p;if(1!==d.filterHeight||1!==d.filterWidth||1!==d.dilationHeight||1!==d.dilationWidth||1!==d.strideHeight||1!==d.strideWidth||"SAME"!==d.padInfo.type&&"VALID"!==d.padInfo.type)if(d.strideWidth<=2&&"channelsLast"===h&&cr().getBool("WEBGL_EXP_CONV")){const e=new Jj(d),t=[[d.padInfo.top,d.padInfo.left],[d.strideHeight,d.strideWidth],[d.dilationHeight,d.dilationWidth],[d.inHeight,d.inWidth]];p=n.runWebGLProgram(e,[i,s],"float32",t)}else if(cr().getBool("WEBGL_CONV_IM2COL"))p=aV({x:i,filter:s,convInfo:d,backend:n});else{const e=new Yj(d);p=n.runWebGLProgram(e,[i,s],"float32")}else p=nV({x:i,filter:s,convInfo:d,backend:n});const m=fP({inputs:{x:p},backend:n,attrs:{shape:d.outShape}});return n.disposeIntermediateTensorInfo(p),m}};class sV{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,a=e.padInfo.top,i=e.padInfo.left,s="channelsLast"===e.dataFormat;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${a};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n ${s?"float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);":"float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);"}\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class rV{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,a=e.strideHeight,i=e.strideWidth,s="channelsLast"===e.dataFormat,r=t-1-e.padInfo.top,o=n-1-e.padInfo.left,l=s?1:2,u=s?2:3,c=s?3:1;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${o});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${c}];\n\n ivec2 dyCorner = ivec2(coords[${l}], coords[${u}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n\n if (${s}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class oV{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideDepth,n=e.strideHeight,a=e.strideWidth,i=e.padInfo.front,s=e.padInfo.top,r=e.padInfo.left;this.userCode=`\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yF = 0; yF < ${e.outDepth}; yF++) {\n int xF = wF + yF * ${t} - ${i};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${n} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${a} - ${r};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class lV{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,a=e.filterWidth,i=e.strideDepth,s=e.strideHeight,r=e.strideWidth,o=t-1-e.padInfo.front,l=n-1-e.padInfo.top,u=a-1-e.padInfo.left;this.userCode=`\n const ivec3 pads = ivec3(${o}, ${l}, ${u});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${t}; wF++) {\n float dyF = float(dyFCorner + wF) / ${i}.0;\n\n if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${t} - 1 - wF;\n\n for (int wR = 0; wR < ${n}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${n} - 1 - wR;\n\n for (int wC = 0; wC < ${a}; wC++) {\n float dyC = float(dyCCorner + wC) / ${r}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${a} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const uV={kernelName:qr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,dy:s}=t,{strides:r,pad:o,dataFormat:l,dimRoundingMode:u,filterShape:c}=a,h=ym(l),d=om(i.shape,c,r,1,o,u,!1,h),p=new sV(d);return n.runWebGLProgram(p,[i,s],"float32")}};class cV{constructor(e){this.variableNames=["dy","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"strides",type:"vec2"}],this.outputShape=e.inShape,this.enableShapeUniforms=aF(this.outputShape.length);const t=e.filterHeight,n=e.filterWidth,a=t-1-e.padInfo.top,i=n-1-e.padInfo.left;this.userCode=`\n const ivec2 pads = ivec2(${a}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n\n ivec2 dyCorner = ivec2(coords[1], coords[2]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n vec4 result = vec4(0.);\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / strides[0];\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n int wCPerm = ${n} - 1 - wC;\n\n float dyC = float(dyCCorner + wC) / strides[1];\n bool idyCVal = (dyC >= 0.0) && (dyC < ${e.outWidth}.0)\n && (fract(dyC) == 0.0);\n int idyC = int(dyC);\n\n float dyC2 = float(dyCCorner + wC + 1) / strides[1];\n bool idyCVal2 = (dyC2 >= 0.0) && (dyC2 < ${e.outWidth}.0)\n && (fract(dyC2) == 0.0);\n int idyC2 = int(dyC2);\n\n if (idyCVal && idyCVal2) {\n for (int d2 = 0; d2 < ${e.outChannels}; d2 += 2) {\n vec4 wValue = getW(wRPerm, wCPerm, d1, d2);\n vec4 dySample = getDy(batch, idyR, idyC, d2);\n vec4 dySample2 = (idyC / 2 == idyC2 / 2) ?\n dySample : getDy(batch, idyR, idyC2, d2);\n\n vec2 dyValue = mod(float(idyC), 2.) == 0. ?\n dySample.xy : dySample.zw;\n result.xy += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n\n dyValue = mod(float(idyC2), 2.) == 0. ?\n dySample2.xy : dySample2.zw;\n result.zw += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n }\n } else if (idyCVal) {\n for (int d2 = 0; d2 < ${e.outChannels}; d2 += 2) {\n vec4 wValue = getW(wRPerm, wCPerm, d1, d2);\n vec4 dySample = getDy(batch, idyR, idyC, d2);\n vec2 dyValue = mod(float(idyC), 2.) == 0. ?\n dySample.xy : dySample.zw;\n result.xy += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n }\n } else if (idyCVal2) {\n for (int d2 = 0; d2 < ${e.outChannels}; d2 += 2) {\n vec4 wValue = getW(wRPerm, wCPerm, d1, d2);\n vec4 dySample = getDy(batch, idyR, idyC2, d2);\n vec2 dyValue = mod(float(idyC2), 2.) == 0. ?\n dySample.xy : dySample.zw;\n result.zw += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n }\n }\n }\n }\n setOutput(result);\n }\n `}}const hV={kernelName:Hr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,filter:s}=t,{inputShape:r,strides:o,pad:l,dataFormat:u,dimRoundingMode:c}=a,h=ym(u),d=om(r,s.shape,o,1,l,c,!1,h);if(cr().getBool("WEBGL_PACK_CONV2DTRANSPOSE")&&"channelsLast"===h){const e=[[d.strideHeight,d.strideWidth]],t=new cV(d);return n.runWebGLProgram(t,[i,s],"float32",e)}{const e=new rV(d);return n.runWebGLProgram(e,[i,s],"float32")}}};const dV={kernelName:Kr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dilations:l}=a,u=lm(i.shape,s.shape,r,l,o),c=new Qj(u);return n.runWebGLProgram(c,[i,s],"float32")}};const pV={kernelName:$r,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,dy:s}=t,{strides:r,pad:o,filterShape:l}=a,u=lm(i.shape,l,r,1,o),c=new oV(u);return n.runWebGLProgram(c,[i,s],"float32")}};const mV={kernelName:Zr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,filter:s}=t,{pad:r,strides:o,inputShape:l}=a,u=lm(l,s.shape,o,1,r),c=new lV(u);return n.runWebGLProgram(c,[i,s],"float32")}},fV=rP({opSnippet:sP+"\n return cos(x);\n",packedOpSnippet:`\n vec4 result = cos(x);\n bvec4 isNaN = isnan(x);\n ${KL}\n return result;\n`}),gV={kernelName:Xr,backendName:"webgl",kernelFunc:fV},yV=rP({opSnippet:"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n"}),bV={kernelName:Yr,backendName:"webgl",kernelFunc:yV};class vV{constructor(e,t,n,a,i){this.variableNames=["Image","Boxes","BoxInd"],this.outputShape=[];const[s,r,o,l]=e,[u]=t,[c,h]=n;this.outputShape=[u,c,h,l];const d="bilinear"===a?1:0,[p,m]=[r-1+".0",o-1+".0"],[f,g,y]=c>1?[""+(r-1)/(c-1),"(y2-y1) * height_ratio",`y1*${p} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${p}`],[b,v,k]=h>1?[""+(o-1)/(h-1),"(x2-x1) * width_ratio",`x1*${m} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${m}`];this.userCode=`\n const float height_ratio = float(${f});\n const float width_ratio = float(${b});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${s}) {\n return;\n }\n\n float height_scale = ${g};\n float width_scale = ${v};\n\n float in_y = ${y};\n if( in_y < 0.0 || in_y > ${p} ) {\n setOutput(float(${i}));\n return;\n }\n float in_x = ${k};\n if( in_x < 0.0 || in_x > ${m} ) {\n setOutput(float(${i}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${d} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `}}const kV={kernelName:eo,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{image:i,boxes:s,boxInd:r}=t,{cropSize:o,method:l,extrapolationValue:u}=a,c=new vV(i.shape,s.shape,o,l,u);return n.runWebGLProgram(c,[i,s,r],"float32")}};var wV,AV;(AV=wV||(wV={})).Prod="*",AV.Sum="+";class xV{constructor(e,t,n,a){this.op=e,this.outputShape=t,this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}];const i=this.outputShape.length,s=this.op===wV.Prod?"1.0":"0.0",r=n?s:`getX(${CV(i,"coords",this.op)})`,o=this.outputShape[this.outputShape.length-1];let l="",u="";n?(l=a?"end != "+(o-1):"end != 0",u=a?"end + 1":"end - 1"):(l=a?`end + pow2 < ${o}`:"end >= pow2",u=a?"end + pow2":"end - pow2"),this.userCode=`\n void main() {\n ${XB(i)} coords = getOutputCoords();\n int end = ${SV(i,"coords",this.op)};\n float val = ${r};\n int pow2 = int(pow(2.0, index));\n if (${l}) {\n int idx = ${u};\n ${SV(i,"coords",this.op)} = idx;\n val ${this.op}= getX(${CV(i,"coords",this.op)});\n }\n setOutput(val);\n }\n `}}function CV(e,t,n){if(1===e)return`${t}`;if(2===e)return`${t}.x, ${t}.y`;if(3===e)return`${t}.x, ${t}.y, ${t}.z`;if(4===e)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw new Error(`Cumulative ${n} for rank ${e} is not yet supported`)}function SV(e,t,n){if(1===e)return`${t}`;if(2===e)return`${t}.y`;if(3===e)return`${t}.z`;if(4===e)return`${t}.w`;throw new Error(`Cumulative ${n} for rank ${e} is not yet supported`)}function EV(e,t,n,a,i,s){const r=t.shape.length,o=vf([a],r);let l=t;null!=o&&(l=SP({inputs:{x:t},backend:n,attrs:{perm:o}}));const u=wf(1,r)[0];if(u!==r-1)throw new Error(`WebGL cumprod shader expects an inner-most axis=${t.shape.length-1} but got axis=${a}`);const c=l.shape[u];let h=ZL({inputs:{x:l},backend:n});for(let t=0;t<=Math.ceil(Math.log2(c))-1;t++){const a=new xV(e,l.shape,!1,s),i=[[t]],r=h;h=n.runWebGLProgram(a,[h],h.dtype,i),n.disposeIntermediateTensorInfo(r)}if(i){const t=new xV(e,l.shape,i,s),a=h;h=n.runWebGLProgram(t,[h],h.dtype),n.disposeIntermediateTensorInfo(a)}if(null!=o){const e=SP({inputs:{x:h},backend:n,attrs:{perm:kf(o)}});return n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(l),e}return h}const _V={kernelName:Qr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,exclusive:r,reverse:o}=a;return EV(wV.Prod,i,n,s,r,o)}};const TV={kernelName:Jr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,exclusive:r,reverse:o}=a;return EV(wV.Sum,i,n,s,r,o)}};const IV={kernelName:to,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,weights:s}=t,{size:r,binaryOutput:o}=a;if(1===i.shape.length){const e=n.readSync(i.dataId),t=n.readSync(s.dataId),a=xF(e,t,s.dtype,s.shape,r);return n.makeTensorInfo([r],s.dtype,a)}if(2===i.shape.length){const e=n.bufferSync(i),t=n.bufferSync(s),a=CF(e,t,r,o);return n.makeTensorInfo(a.shape,s.dtype,a.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${i.shape.length}.`)}};class NV{constructor(e,t,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=n,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${t};\n int offset_h = imod(h, ${t});\n int in_w = w / ${t};\n int offset_w = imod(w, ${t});\n int offset_d = (offset_h * ${t} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `}getHeightCoordString(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"}getWidthCoordString(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"}getDepthCoordString(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"}getOutputDepthSize(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}}const RV={kernelName:no,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockSize:s,dataFormat:r}=a,o=i.shape[0],l=("NHWC"===r?i.shape[1]:i.shape[2])*s,u=("NHWC"===r?i.shape[2]:i.shape[3])*s,c=("NHWC"===r?i.shape[3]:i.shape[1])/(s*s),h=new NV("NHWC"===r?[o,l,u,c]:[o,c,l,u],s,r);return n.runWebGLProgram(h,[i],i.dtype)}};class DV{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=aF(this.outputShape.length);const s=e.filterHeight,r=e.filterWidth,o=e.outChannels/e.inChannels;let l="",u="";n&&(l=a?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:i?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,u="result = activation(result);");const c=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),i&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${l}\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / ${o};\n int q = d2 - d1 * ${o};\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < ${s}; wR++) {\n int xR = xRCorner + wR * dilations[0];\n\n if (xR < 0 || xR >= inDims[0]) {\n continue;\n }\n\n for (int wC = 0; wC < ${r}; wC++) {\n int xC = xCCorner + wC * dilations[1];\n\n if (xC < 0 || xC >= inDims[1]) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${c}\n ${u}\n setOutput(result);\n }\n `}}class zV{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=aF(this.outputShape.length);const s=e.outChannels/e.inChannels,r=e.padInfo.left,o=e.strideWidth,l=e.dilationWidth,u=e.filterHeight,c=e.filterWidth,h=c;let d="\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;";for(let e=0;e=0 && xR < inDims[0]) {\n ";for(let e=0;e<(h+1)/2;e++){const t=2*e;if(d+=`\n xC = xCCorner + ${t*l};\n `,1===o){if(t= 0 && xCOffset < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n `,d+=1===l&&t>0?`\n xC${t} = vec4(xTexelC${t-2}.zw, xTexelC${t}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${t} = vec4(previous.zw, xTexelC${t}.xy);\n } else {\n xC${t} = vec4(0.0, 0.0, xTexelC${t}.xy);\n }\n `):d+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n\n xC${t} = xTexelC${t};\n `,t+1= 0 && xCOffset < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.0);\n }\n xTexelC${t+1}Ready = 1;\n }\n `,d+=l>1?`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${t+1} = vec4(previous.zw, xTexelC${t+1}.xy);\n } else {\n xC${t+1} = vec4(0.0, 0.0, xTexelC${t+1}.xy);\n }\n `:`\n xC${t+1} = vec4(xTexelC${t}.zw, xTexelC${t+1}.xy);\n `):d+=1===e?`\n xC${t+1} = xTexelC${t};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.0);\n }\n xTexelC${t+1}Ready = 1;\n }\n\n xC${t+1} = xTexelC${t+1};\n `}}else t= 0 && xCOffset < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.0);\n }\n xTexelC${t+1}Ready = 1;\n }\n\n xC${t} = vec4(xTexelC${t}.zw, xTexelC${t+1}.zw);\n `,t+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${t+1} = vec4(xTexelC${t+1}.xy, final.xy);\n `)):(d+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.);\n }\n xTexelC${t+1}Ready = 1;\n }\n\n xC${t} = vec4(\n xTexelC${t}.xy, xTexelC${t+1}.xy);\n `,t+1`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${r} and dilations '${c}'`));const h=om(i.shape,s.shape,r,c,o,u,!0);let d;d=cr().getBool("WEBGL_PACK_DEPTHWISECONV")&&h.strideWidth<=2&&h.outChannels/h.inChannels==1?new zV(h):new DV(h);const p=[[h.padInfo.top,h.padInfo.left],[h.strideHeight,h.strideWidth],[h.dilationHeight,h.dilationWidth],[h.inHeight,h.inWidth]];return n.runWebGLProgram(d,[i,s],"float32",p)}};class MV{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,a=e.padInfo.top,i=e.padInfo.left,s=e.outChannels/e.inChannels;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * ${s} + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${a};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class BV{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,a=e.strideHeight,i=e.strideWidth,s=t-1-e.padInfo.top,r=n-1-e.padInfo.left,o=e.outChannels/e.inChannels;this.userCode=`\n const ivec2 pads = ivec2(${s}, ${r});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${o}; dm++) {\n int d2 = d1 * ${o} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const FV={kernelName:io,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,dy:s}=t,{strides:r,dilations:o,pad:l,dimRoundingMode:u,filterShape:c}=a,h=om(i.shape,c,r,o,l,u,!0),d=new MV(h);return n.runWebGLProgram(d,[i,s],"float32")}};const LV={kernelName:so,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,filter:s}=t,{strides:r,dilations:o,pad:l,dimRoundingMode:u,inputShape:c}=a,h=om(c,s.shape,r,o,l,u,!0),d=new BV(h);return n.runWebGLProgram(d,[i,s],"float32")}};class PV{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}}const jV={kernelName:ro,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t,i=[...a.shape,...a.shape],s=zs(a.shape),r=fP({inputs:{x:a},backend:n,attrs:{shape:[s]}}),o=new PV(s),l=n.runWebGLProgram(o,[r],r.dtype),u=fP({inputs:{x:l},backend:n,attrs:{shape:i}});return n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(l),u}};class VV{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const{inHeight:t,inWidth:n,padInfo:a,strideHeight:i,strideWidth:s,filterHeight:r,filterWidth:o,dilationHeight:l,dilationWidth:u}=e,{top:c,left:h}=a;this.userCode=`\n const ivec2 strides = ivec2(${i}, ${s});\n const ivec2 pads = ivec2(${c}, ${h});\n const float neg_infinity = -3.4e38;\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.w;\n ivec2 outTopLeftCorner =\n coords.yz * strides - pads;\n int hBeg = outTopLeftCorner.x;\n int wBeg = outTopLeftCorner.y;\n\n float curVal = neg_infinity;\n for (int h = 0; h < ${r}; h++) {\n int hIn = hBeg + h * ${l};\n\n if (hIn >= 0 && hIn < ${t}) {\n for (int w = 0; w < ${o}; w++) {\n int wIn = wBeg + w * ${u};\n\n if (wIn >= 0 && wIn < ${n}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `}}const UV={kernelName:oo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dilations:l}=a,u=im(i.shape,s.shape,r,o,"NHWC",l);let c;const h=new VV(u);c=n.runWebGLProgram(h,[i,s],"float32");const d=fP({inputs:{x:c},backend:n,attrs:{shape:u.outShape}});return n.disposeIntermediateTensorInfo(c),d}};const WV={kernelName:po,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{equation:i}=a,s=t,{allDims:r,summedDims:o,idDims:l}=Hv(i,s.length);$v(r.length,l,s);const{path:u,steps:c}=Zv(o,l),h=c.length;let d=null,p=r.length;const m=[];for(let e=0;e=0&&(d=xP({inputs:{x:d},backend:n,attrs:{axis:u[e]-(r.length-p),keepDims:!1}}),m.push(d)),p--)}for(const e of m)e!==d&&n.disposeIntermediateTensorInfo(e);return d}},GV=rP({opSnippet:"return (x >= 0.0) ? x : (exp(x) - 1.0);",packedOpSnippet:"\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n"}),qV={kernelName:mo,backendName:"webgl",kernelFunc:GV},HV={kernelName:fo,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n}=e,{dy:a,y:i}=t,s=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new $L("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",a.shape,i.shape):new HL("return (b >= 0.0) ? a : a * (b + 1.0);",a.shape,i.shape);return n.runWebGLProgram(s,[a,i],a.dtype)}},KV=oP({opSnippet:"return float(a == b);",packedOpSnippet:"\n return vec4(equal(a, b));\n",dtype:"bool",cpuKernelImpl:IF}),$V={kernelName:yo,backendName:"webgl",kernelFunc:KV},ZV=rP({opSnippet:`\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = ${Tv};\n float a1 = ${Iv};\n float a2 = ${Nv};\n float a3 = ${Rv};\n float a4 = ${Dv};\n float a5 = ${zv};\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`}),XV={kernelName:go,backendName:"webgl",kernelFunc:ZV},YV=rP({opSnippet:sP+"\n return exp(x);\n",packedOpSnippet:"\n vec4 result = exp(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",cpuKernelImpl:NF,dtype:"float32"}),QV={kernelName:bo,backendName:"webgl",kernelFunc:YV};function JV(e){const{inputs:t,attrs:n,backend:a}=e,{dim:i}=n,{input:s}=t,r=s.shape.length,o=s.shape.slice();let l=i;return i<0&&(Ns(-(r+1)<=i,(()=>`Axis must be in the interval [${-(r+1)}, ${r}]`)),l=r+i+1),o.splice(l,0,1),fP({inputs:{x:s},backend:a,attrs:{shape:o}})}const eU={kernelName:vo,backendName:"webgl",kernelFunc:JV},tU="return exp(x) - 1.0;",nU=rP({opSnippet:tU,packedOpSnippet:tU,cpuKernelImpl:RF}),aU={kernelName:ko,backendName:"webgl",kernelFunc:nU};class iU{constructor(e,t,n){this.variableNames=["real","imag"];const a=t[1];this.outputShape=t;const i=n?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,s=n?`${a}.0`:"1.0";let r;if("real"===e)r="return real * expR - imag * expI;";else{if("imag"!==e)throw new Error(`FFT component must be either "real" or "imag", got ${e}.`);r="return real * expI + imag * expR;"}this.userCode=`\n const float exponentMultiplier = ${i};\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n ${r}\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float(${a});\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < ${a}; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / ${s};\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n `}}function sU(e,t,n){const a=n.texData.get(e.dataId),i=zs(e.shape),s=e.shape[e.shape.length-1],r=fP({inputs:{x:e},backend:n,attrs:{shape:[i/s,s]}}),o=r.shape,l=new iU("real",o,t),u=new iU("imag",o,t),c=[{dataId:a.complexTensorInfos.real.dataId,dtype:a.complexTensorInfos.real.dtype,shape:o},{dataId:a.complexTensorInfos.imag.dataId,dtype:a.complexTensorInfos.imag.dtype,shape:o}],h=n.runWebGLProgram(l,c,"float32"),d=n.runWebGLProgram(u,c,"float32"),p=YL({inputs:{real:h,imag:d},backend:n});n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d);const m=fP({inputs:{x:p},backend:n,attrs:{shape:e.shape}});return n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(p),m}const rU={kernelName:wo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{input:a}=t;return sU(a,!1,n)}};class oU{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value",type:"float"}],this.variableNames=["x"],this.outputShape=e,this.userCode="\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n "}}function lU(e){const{backend:t,attrs:n}=e,{shape:a,value:i}=n;let{dtype:s}=n;if(s=s||$s(i),"string"===s){const e=Ws(s,zs(a));return e.fill(i),t.makeTensorInfo(a,s,e)}{const e=new oU(a,i),n=[[i]];return t.runWebGLProgram(e,[],s,n)}}const uU={kernelName:Ao,backendName:"webgl",kernelFunc:lU};class cU{constructor(e){this.variableNames=["Image"],this.outputShape=[];const t=e[2];this.outputShape=e,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n\n int coordX = ${t} - x - 1;\n float outputValue;\n if(coordX >= 0 && coordX < ${t}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `}}const hU={kernelName:xo,backendName:"webgl",kernelFunc:({inputs:e,backend:t})=>{const{image:n}=e,a=t,i=new cU(n.shape);return a.runWebGLProgram(i,[n],n.dtype)}},dU="return floor(x);",pU=rP({opSnippet:dU,packedOpSnippet:dU,cpuKernelImpl:DF}),mU={kernelName:Co,backendName:"webgl",kernelFunc:pU},fU=oP({opSnippet:"\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",packedOpSnippet:"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n",dtype:"int32"}),gU={kernelName:So,backendName:"webgl",kernelFunc:fU};class yU{constructor(e){this.variableNames=["A"];const t=zB(),[n,a]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${a}.0, ${n}.0);\n\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n `}}class bU{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const t=zB(),[n,a]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${a}.0, ${n}.0);\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${t.output} = result;\n }\n `}}const vU={kernelName:Au,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e;let{pixels:i}=t;const{numChannels:s}=a,r="undefined"!=typeof HTMLVideoElement&&i instanceof HTMLVideoElement,o="undefined"!=typeof HTMLImageElement&&i instanceof HTMLImageElement,[l,u]=r?[i.videoWidth,i.videoHeight]:[i.width,i.height],c=[u,l],h=[u,l,s];if(o||r){const e=cr().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");null!=kU&&e===wU||(wU=e,kU=document.createElement("canvas").getContext("2d",{willReadFrequently:wU})),kU.canvas.width=l,kU.canvas.height=u,kU.drawImage(i,0,0,l,u),i=kU.canvas}const d=n.makeTensorInfo(c,"int32");n.texData.get(d.dataId).usage=JM.PIXELS,n.gpgpu.uploadPixelDataToTexture(n.getTexture(d.dataId),i);const p=cr().getBool("WEBGL_PACK")?new bU(h):new yU(h),m=n.runWebGLProgram(p,[d],"int32");return n.disposeData(d.dataId),m}};let kU,wU=cr().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");const AU={kernelName:Su,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:m}=a,f=ym(c),g=om(i.shape,s.shape,l,h,u,d,!1,f);let y;const b=[],v=null!=r,k=null!=o,w="leakyrelu"===p,A=()=>{const e=[i,s],t=(e,t)=>{if("NCHW"===t&&1===e.shape.length&&1!==e.shape[0]){const t=fP({inputs:{x:e},backend:n,attrs:{shape:[e.shape[0],1,1]}});return b.push(t),t}return e};if(v&&e.push(t(r,c)),k&&e.push(t(o,c)),w){const t=n.makeTensorInfo([],"float32",Qu(m,"float32"));e.push(t),b.push(t)}return e};if(1!==g.filterHeight||1!==g.filterWidth||1!==g.dilationHeight||1!==g.dilationWidth||1!==g.strideHeight||1!==g.strideWidth||"SAME"!==g.padInfo.type&&"VALID"!==g.padInfo.type)if(g.strideWidth<=2&&"channelsLast"===f&&cr().getBool("WEBGL_EXP_CONV")){const e=p?lP(p,!0):null,t=new Jj(g,v,e,k,w),a=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],i=A();y=n.runWebGLProgram(t,i,"float32",a)}else if(cr().getBool("WEBGL_CONV_IM2COL"))y=aV({x:i,filter:s,convInfo:g,backend:n,bias:r,activation:p,preluActivationWeights:o,leakyreluAlpha:m});else{const e=p?lP(p,!1):null,t=new Yj(g,v,e,k,w),a=A();y=n.runWebGLProgram(t,a,"float32")}else y=nV({x:i,filter:s,convInfo:g,backend:n,bias:r,activation:p,preluActivationWeights:o,leakyreluAlpha:m});const x=fP({inputs:{x:y},backend:n,attrs:{shape:g.outShape}});return b.push(y),b.forEach((e=>n.disposeIntermediateTensorInfo(e))),x}};const xU={kernelName:Eu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dimRoundingMode:h,activation:d,leakyreluAlpha:p}=a,m=[];let f=c;null==f&&(f=[1,1]),Ns(fm(l,f),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${l} and dilations '${f}'`));const g=om(i.shape,s.shape,l,f,u,h,!0),y=cr().getBool("WEBGL_PACK_DEPTHWISECONV")&&g.strideWidth<=2&&g.outChannels/g.inChannels==1,b=d?lP(d,y):null,v=[i,s],k=null!=r,w=null!=o,A="leakyrelu"===d;if(k&&v.push(r),w&&v.push(o),A){const e=n.makeTensorInfo([],"float32",Qu(p,"float32"));v.push(e),m.push(e)}let x;x=y?new zV(g,k,b,w,A):new DV(g,k,b,w,A);const C=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],S=n.runWebGLProgram(x,v,"float32",C);return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),S}};class CU{constructor(e,t,n,a){this.sliceDim=e,this.strides=t,this.paramsShape=a,this.variableNames=["x","indices"],this.outputShape=n;const i=XB(n.length);let s="\n int index;";for(let e=0;e= ${this.paramsShape[e]};\n flattenIndex += index * ${this.strides[e]};`;this.userCode=`\n void main() {\n ${i} coords = getOutputCoords();\n int flattenIndex = 0;\n bool out_of_bounds = false;\n\n ${s}\n\n setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1]));\n }\n `}}const SU={kernelName:To,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{params:a,indices:i}=t,s=i.shape,r=s[s.length-1],o=zs(a.shape),[l,u,c,h]=Sv(a,i),d=fP({inputs:{x:i},backend:n,attrs:{shape:[u,r]}}),p=fP({inputs:{x:a},backend:n,attrs:{shape:[zs(a.shape)/c,c]}});if(n.shouldExecuteOnCPU([a,i])||"string"===a.dtype){const e=n.readSync(i.dataId),t=n.bufferSync(a),s=zF(e,t,a.dtype,u,r,c,h,a.shape,o);return n.makeTensorInfo(l,a.dtype,s.values)}const m=new CU(r,h,[u,c],a.shape),f=n.runWebGLProgram(m,[p,d],p.dtype),g=fP({inputs:{x:f},backend:n,attrs:{shape:l}});return n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),g}};class EU{constructor(e,t){this.variableNames=["A","indices"],this.outputShape=t,this.rank=t.length;const n=XB(this.rank),a=function(e,t){const n=["resRC.x","resRC.y","resRC.z","resRC.w"],a=[];for(let t=0;t= 0) && (index < ${e[2]}) ? 1.0 : 0.0;\n setOutput(inBounds * getA(${a}));\n }\n `}}function _U(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,indices:s}=t,{axis:r,batchDims:o}=a,l=js(r,i.shape)[0];if(cr().get("DEBUG")){const e=n.readSync(s.dataId),t=i.shape[l];for(let n=0;n=0,(()=>`GatherV2: the index value ${a} is not in [0, ${t-1}]`))}}const u=pk(i,s,l,o),c=zs(s.shape),h=[],d=fP({inputs:{x:i},backend:n,attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]}}),p=fP({inputs:{x:s},backend:n,attrs:{shape:[u.batchSize,c/u.batchSize]}});h.push(d),h.push(p);const m=[u.batchSize,u.outerSize,c/u.batchSize,u.sliceSize];if(n.shouldExecuteOnCPU([i,s])||"string"===i.dtype){const e=n.bufferSync(p),t=n.bufferSync(d),a=OF(t,e,m);return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(u.outputShape,a.dtype,a.values)}const f=new EU(d.shape,m),g=n.runWebGLProgram(f,[d,p],d.dtype);h.push(g);const y=fP({inputs:{x:g},backend:n,attrs:{shape:u.outputShape}});return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}const TU={kernelName:_o,backendName:"webgl",kernelFunc:_U},IU=oP({opSnippet:"return float(a > b);",packedOpSnippet:"\n return vec4(greaterThan(a, b));\n",cpuKernelImpl:MF,dtype:"bool"}),NU={kernelName:Io,backendName:"webgl",kernelFunc:IU},RU=oP({opSnippet:"return float(a >= b);",packedOpSnippet:"\n return vec4(greaterThanEqual(a, b));\n",dtype:"bool",cpuKernelImpl:BF}),DU={kernelName:No,backendName:"webgl",kernelFunc:RU};const zU={kernelName:Do,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{input:a}=t;return sU(a,!0,n)}},OU=rP({opSnippet:"return float(!isnan(x) && !isinf(x));",dtype:"bool"}),MU={kernelName:Oo,backendName:"webgl",kernelFunc:OU},BU=rP({opSnippet:"return float(isinf(x));",dtype:"bool"}),FU={kernelName:Mo,backendName:"webgl",kernelFunc:BU},LU=rP({opSnippet:"return float(isnan(x));",dtype:"bool"}),PU={kernelName:Bo,backendName:"webgl",kernelFunc:LU},jU=oP({opSnippet:"return float(a < b);",packedOpSnippet:"\n return vec4(lessThan(a, b));\n",cpuKernelImpl:FF,dtype:"bool"}),VU={kernelName:Lo,backendName:"webgl",kernelFunc:jU},UU=oP({opSnippet:"return float(a <= b);",packedOpSnippet:"\n return vec4(lessThanEqual(a, b));\n",cpuKernelImpl:LF,dtype:"bool"}),WU={kernelName:Po,backendName:"webgl",kernelFunc:UU};const GU={kernelName:jo,backendName:"webgl",kernelFunc:function(e){const{backend:t,attrs:n}=e,{start:a,stop:i,num:s}=n,r=PF(a,i,s);return t.makeTensorInfo([r.length],"float32",r)}},qU=rP({opSnippet:sP+"\n return x < 0.0 ? 0./0. : log(x);\n",packedOpSnippet:"\n vec4 result = log(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r);\n result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g);\n result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b);\n result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a);\n return result;\n",cpuKernelImpl:jF}),HU={kernelName:Vo,backendName:"webgl",kernelFunc:qU},KU=rP({opSnippet:sP+"\n return log(1.0 + x);\n"}),$U={kernelName:Uo,backendName:"webgl",kernelFunc:KU},ZU=oP({opSnippet:"return float(a >= 1.0 && b >= 1.0);",packedOpSnippet:"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n",dtype:"bool"}),XU={kernelName:Wo,backendName:"webgl",kernelFunc:ZU},YU=rP({opSnippet:"return float(!(x >= 1.0));"}),QU={kernelName:Go,backendName:"webgl",kernelFunc:YU},JU=oP({opSnippet:"return float(a >= 1.0 || b >= 1.0);",packedOpSnippet:"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n",dtype:"bool"}),eW={kernelName:qo,backendName:"webgl",kernelFunc:JU};class tW{constructor(e,t,n,a,i){this.variableNames=["x"],this.outputShape=[];const s=t,r=e[3]-1;let o;this.outputShape=e;const l=`float(${n}) + float(${a}) * sum`;o=.5===i?`inversesqrt(${l})`:1===i?`1.0/(${l})`:`exp(log(${l}) * float(-${i}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${s}; j <= ${s}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${r}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${o};\n setOutput(val);\n }\n `}}class nW{constructor(e,t,n,a,i){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;const s=t,r=e[3]-1;let o;this.outputShape=e;const l=`float(${n}) + float(${a}) * sum`;o=.5===i?`inversesqrt(${l})`:1===i?`1.0/(${l})`:`exp(log(${l}) * float(-${i}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${s};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${s}; j <= ${s}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${r}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${o};\n setOutput(result);\n }\n `}}const aW={kernelName:Ho,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{depthRadius:s,bias:r,alpha:o,beta:l}=a,u=cr().getBool("WEBGL_PACK_NORMALIZATION")?new nW(i.shape,s,r,o,l):new tW(i.shape,s,r,o,l);return n.runWebGLProgram(u,[i],i.dtype)}};class iW{constructor(e,t,n,a,i){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=n,this.alpha=a,this.beta=i,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${t})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${t} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${a}) * norm + float(${n});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${a})\n * float(${i})\n * getInputImage(b, r, c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${i});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `}}const sW={kernelName:Ko,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i,y:s,dy:r}=t,{depthRadius:o,bias:l,alpha:u,beta:c}=a,h=new iW(i.shape,o,l,u,c);return n.runWebGLProgram(h,[i,s,r],i.dtype)}};function rW(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{reductionIndices:s,keepDims:r}=a,o=i.shape.length,l=js(s,i.shape);let u=l;const c=vf(u,o),h=null!=c,d=n.shouldExecuteOnCPU([i]);let p=i;if(h){if(d){const e=n.texData.get(p.dataId).values,t=new Array(o);for(let e=0;e`Error in maxPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))return ZL({inputs:{x:i},backend:n});const c=new oj(u,"max",!1);return n.runWebGLProgram(c,[i],i.dtype)}};const hW={kernelName:Qo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dataFormat:l,dimRoundingMode:u}=a,c=rm(i.shape,s,r,[1,1,1],o,u,l),h=new lj(c,"max",!1);return n.runWebGLProgram(h,[i],i.dtype)}};class dW{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideHeight,n=e.strideWidth,a=e.dilationHeight,i=e.effectiveFilterHeight,s=e.effectiveFilterWidth,r=i-1-e.padInfo.top,o=s-1-e.padInfo.left,l=i*s-1;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${o});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${i};\n wR += ${a}) {\n float dyR = float(dyRCorner + wR) / ${t}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${s}; wC++) {\n float dyC = float(dyCCorner + wC) / ${n}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${l} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${s} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `}}class pW{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideDepth,n=e.strideHeight,a=e.strideWidth,i=e.dilationDepth,s=e.dilationHeight,r=e.dilationWidth,o=e.effectiveFilterDepth,l=e.effectiveFilterHeight,u=e.effectiveFilterWidth,c=o-1-e.padInfo.front,h=l-1-e.padInfo.top,d=u-1-e.padInfo.left,p=o*l*u-1;this.userCode=`\n const ivec3 pads = ivec3(${c}, ${h}, ${d});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${o};\n wD += ${i}) {\n float dyD = float(dyDCorner + wD) / ${t}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${l};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${u};\n wC += ${r}) {\n float dyC = float(dyCCorner + wC) / ${a}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${p} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${l} * ${u} +\n wR * ${u} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const mW={kernelName:Jo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s,{filterSize:o,strides:l,pad:u,dimRoundingMode:c}=a,h=rm(r.shape,o,l,[1,1,1],u,c),d=new lj(h,"max",!0),p=n.runWebGLProgram(d,[r],r.dtype),m=new pW(h),f=n.runWebGLProgram(m,[i,p],r.dtype);return n.disposeIntermediateTensorInfo(p),f}};const fW={kernelName:Yo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s,output:r}=t,o=s;RB([s,r],"maxPoolGrad");const{filterSize:l,strides:u,pad:c,dimRoundingMode:h}=a,d=sm(o.shape,l,u,1,c,h),p=new oj(d,"max",!0),m=n.runWebGLProgram(p,[o],o.dtype),f=new dW(d),g=n.runWebGLProgram(f,[i,m],o.dtype);return n.disposeIntermediateTensorInfo(m),g}};const gW={kernelName:el,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:a}=e,{filterSize:i,strides:s,pad:r,includeBatchInIndex:o}=t,l=n;Ns(4===a.shape.length,(()=>`Error in maxPool: input must be rank 4 but got rank ${a.shape.length}.`));const u=[1,1];Ns(fm(s,u),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${s} and dilations '${u}'`));const c=sm(a.shape,i,s,u,r),[h,d]=function(e,t,n,a){let i=new oj(n,"max",!1);const s=a.runWebGLProgram(i,[e],"float32");return i=new oj(n,"max",!0,!0,t),[s,a.runWebGLProgram(i,[e],"float32")]}(a,o,c,l);return[h,d]}};const yW={kernelName:tl,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:a}=e,{keepDims:i,axis:s}=t,r=n,o=a.shape.length,l=js(s,a.shape);let u=l;const c=vf(u,o),h=null!=c,d=r.shouldExecuteOnCPU([a]),p=[];let m=a;if(h){if(d){const e=r.texData.get(m.dataId).values,t=new Array(o);for(let e=0;et[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,a),l="reflect"===n?0:1;this.userCode=1!==a?`\n ${i} start = ${i}(${s});\n ${i} end = ${i}(${r});\n\n void main() {\n ${i} outC = getOutputCoords();\n for (int i = 0; i < ${a}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${l};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${l};\n }\n }\n ${i} coords = outC - start;\n setOutput(getX(${o}));\n }\n `:`\n int start = ${s};\n int end = ${r};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${l};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${l};\n }\n setOutput(getX(outC - start));\n }\n `}}class AW{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=bL("rc",a),l=bL("source",a),u=`${o[a-1]} < ${this.outputShape[a-1]}`,c=1===a?"source":`vec2(${l.slice(-2).join()})`,h="reflect"===n?0:1;let d="";if(1===a){const e=`\n ${i} source = rc;\n if (source < start) {\n source = start * 2 - source - ${h};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${h};\n }\n source -= start;\n `;d=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${c});\n ${o[a-1]} += 1;\n if(${u}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${c});\n }\n `}else{const e=`\n ${i} source = rc;\n ${i} lt = ${i}(lessThan(source, start));\n ${i} gte = ${i}(greaterThanEqual(source, end));\n ${i} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${h}) +\n gte * ((end - 1) * 2 - source + ${h});\n source -= start;\n `;d=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${c});\n ${o[a-1]} += 1;\n if(${u}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${c});\n }\n rc = outputLoc;\n ${o[a-2]} += 1;\n if(${o[a-2]} < ${this.outputShape[a-2]}) {\n ${e}\n result[2] = getChannel(getX(${l.join()}), ${c});\n ${o[a-1]} += 1;\n if(${u}) {\n ${e}\n result[3] = getChannel(getX(${l.join()}), ${c});\n }\n }\n `}this.userCode=`\n const ${i} start = ${i}(${s});\n const ${i} end = ${i}(${r});\n\n void main() {\n ${i} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${d}\n setOutput(result);\n }\n `}}const xW={kernelName:il,backendName:"webgl",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a}=e,{paddings:i,mode:s}=n,r=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new AW(a.shape,i,s):new wW(a.shape,i,s);return t.runWebGLProgram(r,[a],a.dtype)}},CW=oP({opSnippet:"if (b == 0.0) return NAN;\n return mod(a, b);",packedOpSnippet:"\n vec4 result = mod(a, b);\n bvec4 isNaN = equal(b, vec4(0.0));\n "+KL+"\n return result;\n"}),SW={kernelName:sl,backendName:"webgl",kernelFunc:CW};class EW{constructor(e,t,n){this.variableNames=["probs"],this.customUniforms=[{name:"seed",type:"float"}],this.outputShape=[e,n],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < ${t-1}; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float(${t-1}));\n }\n `}}const _W=oP({opSnippet:"\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",packedOpSnippet:"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n",checkOutOfBounds:!0}),TW={kernelName:ho,backendName:"webgl",kernelFunc:_W},IW="return a - b;",NW=oP({opSnippet:IW,packedOpSnippet:IW,supportsComplex:!0,cpuKernelImpl:dL}),RW={kernelName:cu,backendName:"webgl",kernelFunc:NW};function DW(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{dim:s}=a,r=js([s],i.shape),o=rW({inputs:{x:i},backend:n,attrs:{reductionIndices:r,keepDims:!1}}),l=yf(o.shape,r),u=fP({inputs:{x:o},backend:n,attrs:{shape:l}}),c=NW({inputs:{a:i,b:u},backend:n}),h=YV({inputs:{x:c},backend:n}),d=xP({inputs:{x:h},backend:n,attrs:{axis:r,keepDims:!1}}),p=fP({inputs:{x:d},backend:n,attrs:{shape:l}}),m=_W({inputs:{a:h,b:p},backend:n});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(u),n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),m}const zW={kernelName:Yl,backendName:"webgl",kernelFunc:DW};const OW={kernelName:rl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{numSamples:s,seed:r,normalized:o}=a,l=o?i:DW({inputs:{logits:i},backend:n,attrs:{dim:i.shape.length-1}}),u=l.shape[0],c=l.shape[1],h=new EW(u,c,s),d=[[r]],p=n.runWebGLProgram(h,[l],"int32",d);return o||n.disposeIntermediateTensorInfo(l),p}},MW=EL+"\n return -x;\n";const BW={kernelName:ll,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t;if(n.shouldExecuteOnCPU([a])){const e=n.texData.get(a.dataId),[t,i]=qF(e.values,a.shape,a.dtype);return n.makeTensorInfo(i,a.dtype,t)}let i;return i=cr().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new PL(a.shape,"\n vec4 result = -x;\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"):new SL(a.shape,MW),n.runWebGLProgram(i,[a],a.dtype)}},FW=Ab;const LW={kernelName:cl,backendName:"webgl",kernelFunc:function(e){_u();const{inputs:t,backend:n,attrs:a}=e,{boxes:i,scores:s}=t,{maxOutputSize:r,iouThreshold:o,scoreThreshold:l}=a,u=n.readSync(i.dataId),c=n.readSync(s.dataId),{selectedIndices:h}=FW(u,c,r,o,l);return n.makeTensorInfo([h.length],"int32",new Int32Array(h))}},PW=xb;const jW={kernelName:hl,backendName:"webgl",kernelFunc:function(e){_u();const{inputs:t,backend:n,attrs:a}=e,{boxes:i,scores:s}=t,{maxOutputSize:r,iouThreshold:o,scoreThreshold:l,padToMaxOutputSize:u}=a,c=n.readSync(i.dataId),h=n.readSync(s.dataId),{selectedIndices:d,validOutputs:p}=PW(c,h,r,o,l,u);return[n.makeTensorInfo([d.length],"int32",new Int32Array(d)),n.makeTensorInfo([],"int32",new Int32Array([p]))]}},VW=Cb;const UW={kernelName:dl,backendName:"webgl",kernelFunc:function(e){_u();const{inputs:t,backend:n,attrs:a}=e,{boxes:i,scores:s}=t,{maxOutputSize:r,iouThreshold:o,scoreThreshold:l,softNmsSigma:u}=a,c=n.readSync(i.dataId),h=n.readSync(s.dataId),d=r,p=o,m=l,f=u,{selectedIndices:g,selectedScores:y}=VW(c,h,d,p,m,f);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([y.length],"float32",new Float32Array(y))]}};class WW{constructor(e,t,n,a){this.variableNames=["indices"],this.outputShape=[e,t],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float(${a}), float(${n}),\n float(index == coords.y)));\n }\n `}}const GW={kernelName:ml,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{indices:i}=t,{dtype:s,depth:r,onValue:o,offValue:l}=a,u=zs(i.shape),c=new WW(u,r,o,l),h=fP({inputs:{x:i},backend:n,attrs:{shape:[u]}}),d=n.runWebGLProgram(c,[h],s);n.disposeIntermediateTensorInfo(h);const p=fP({inputs:{x:d},backend:n,attrs:{shape:[...i.shape,r]}});return n.disposeIntermediateTensorInfo(d),p}};function qW(e){const{inputs:t,backend:n}=e,{x:a}=t;if("complex64"===a.dtype){const e=Nj({inputs:{input:a},backend:n}),t=qW({inputs:{x:e},backend:n}),i=Hj({inputs:{input:a},backend:n}),s=qW({inputs:{x:i},backend:n}),r=YL({inputs:{real:t,imag:s},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(s),r}return lU({attrs:{shape:a.shape,dtype:a.dtype,value:"string"===a.dtype?"":0},backend:n})}const HW={kernelName:ku,backendName:"webgl",kernelFunc:qW};const KW={kernelName:pl,backendName:"webgl",kernelFunc:function e(t){const{inputs:n,backend:a}=t,{x:i}=n;if("string"===i.dtype)throw new Error("onesLike is not supported under string dtype");if("complex64"===i.dtype){const t=Nj({inputs:{input:i},backend:a}),n=e({inputs:{x:t},backend:a}),s=Hj({inputs:{input:i},backend:a}),r=qW({inputs:{x:s},backend:a}),o=YL({inputs:{real:n,imag:r},backend:a});return a.disposeIntermediateTensorInfo(t),a.disposeIntermediateTensorInfo(n),a.disposeIntermediateTensorInfo(s),a.disposeIntermediateTensorInfo(r),o}return lU({attrs:{shape:i.shape,dtype:i.dtype,value:1},backend:a})}};const $W={kernelName:fl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{axis:i}=a;if(1===t.length)return JV({inputs:{input:t[0]},backend:n,attrs:{dim:i}});const s=t[0].shape,r=t[0].dtype;t.forEach((e=>{Rs(s,e.shape,"All tensors passed to stack must have matching shapes"),Ns(r===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const o=[],l=Zj({inputs:t.map((e=>{const t=JV({inputs:{input:e},backend:n,attrs:{dim:i}});return o.push(t),t})),backend:n,attrs:{axis:i}});return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),l}};class ZW{constructor(e,t,n){this.variableNames=["x"],this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,a);this.userCode=1!==a?`\n ${i} start = ${i}(${s});\n ${i} end = ${i}(${r});\n\n void main() {\n ${i} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${i} coords = outC - start;\n setOutput(getX(${o}));\n }\n }\n `:`\n int start = ${s};\n int end = ${r};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `}}class XW{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=bL("rc",a),l=bL("source",a),u=`${o[a-1]} < ${this.outputShape[a-1]}`,c=1===a?"source":`vec2(${l.slice(-2).join()})`,h=[`${i} rc = outputLoc;`,`${o[a-1]} += 1;\n if(${u}) {\n `,1===a?"":`}\n rc = outputLoc;\n ${o[a-2]} += 1;\n if(${o[a-2]} < ${this.outputShape[a-2]}) {`,1===a?"":` ${o[a-1]} += 1;\n if(${u}) {`],d=1===a?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))";let p="";for(let e=0,t=1===a?2:4;e{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{paddings:s,constantValue:r}=a;if(0===zs(i.shape)){return lU({backend:n,attrs:{shape:s.map(((e,t)=>e[0]+i.shape[t]+e[1])),value:r,dtype:i.dtype}})}const o=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new XW(i.shape,s,r):new ZW(i.shape,s,r),l=[[r]];return n.runWebGLProgram(o,[i],i.dtype,l)},QW={kernelName:gl,backendName:"webgl",kernelFunc:YW},JW=oP({opSnippet:"\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",packedOpSnippet:"\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n bvec4 isNaN1 = lessThan(a, vec4(0.0));\n bvec4 isNaN2 = lessThan(floor(b), b);\n bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w);\n "+KL+"\n return result;\n"}),eG={kernelName:yl,backendName:"webgl",kernelFunc:JW};const tG={kernelName:vl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=i.shape.length,l=[],u=js(s,i.shape);let c=u;const h=vf(c,o);let d,p=i;if(null!=h&&(p=SP({inputs:{x:i},backend:n,attrs:{perm:h}}),c=wf(c.length,o),l.push(p)),bf("prod",c,o),n.shouldExecuteOnCPU([p])){const e=n.texData.get(p.dataId).values,{outVals:t,outShape:a,outDtype:i}=KF(p.shape,p.dtype,e,c);d=n.makeTensorInfo(a,i,t)}else{const[e,t]=gf(p.shape,c),a=zs(t),s=fP({inputs:{x:p},backend:n,attrs:{shape:[-1,a]}}),r=vP(s,Mc(i.dtype),"prod",n);d=fP({inputs:{x:r},backend:n,attrs:{shape:e}}),l.push(s),l.push(r)}if(r){l.push(d);const e=yf(d.shape,u);d=fP({inputs:{x:d},backend:n,attrs:{shape:e}})}return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),d}};const nG={kernelName:kl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{paramsNestedSplits:i,paramsDenseValues:s,indices:r}=t,{outputRaggedRank:o}=a,l=i.map((e=>n.readSync(e.dataId))),u=i.map((e=>e.shape)),c=n.readSync(s.dataId),h=n.readSync(r.dataId),[d,p,m]=$F(l,u,c,s.shape,s.dtype,h,r.shape,o),f=d.map((e=>n.makeTensorInfo([e.length],"int32",e))),g=n.makeTensorInfo(m,s.dtype,p);return f.concat([g])}};const aG={kernelName:wl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{starts:a,limits:i,deltas:s}=t,r=n.readSync(a.dataId),o=n.readSync(i.dataId),l=n.readSync(s.dataId),[u,c]=ZF(r,a.shape,a.dtype,o,i.shape,l,s.shape);return[n.makeTensorInfo([u.length],"int32",u),n.makeTensorInfo([c.length],a.dtype,c)]}};const iG={kernelName:Al,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{shape:i,values:s,defaultValue:r,rowPartitionTensors:o}=t,{rowPartitionTypes:l}=a,u=n.readSync(i.dataId),c=n.readSync(s.dataId),h=n.readSync(r.dataId),d=o.map((e=>n.readSync(e.dataId))),p=o.map((e=>e.shape)),[m,f]=XF(u,i.shape,c,s.shape,s.dtype,h,r.shape,d,p,l);return n.makeTensorInfo(m,s.dtype,f)}},sG=e=>{const{backend:t,attrs:n}=e,{start:a,stop:i,step:s,dtype:r}=n,o=YF(a,i,s,r);return t.makeTensorInfo([o.length],r,o)},rG={kernelName:xl,backendName:"webgl",kernelFunc:sG},oG=rP({opSnippet:"return 1.0 / x;"}),lG={kernelName:Sl,backendName:"webgl",kernelFunc:oG},uG=rP({opSnippet:EL+"\n return (x < 0.0) ? 0.0 : x;\n",packedOpSnippet:"\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),cG={kernelName:El,backendName:"webgl",kernelFunc:uG},hG=rP({opSnippet:EL+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",packedOpSnippet:"\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),dG={kernelName:Dl,backendName:"webgl",kernelFunc:hG};class pG{constructor(e,t,n,a,i){this.variableNames=["A"],this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n];let h;h=i?"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/c[0]},\n ${u[1]/c[1]});\n const vec2 inputShapeRC = vec2(${r}.0, ${o}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${h};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `}}class mG{constructor(e,t,n,a,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n];let h;h=i?"(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/c[0]},\n ${u[1]/c[1]},\n ${u[1]/c[1]});\n const vec3 inputShapeRC = vec3(${r}.0, ${o}.0,\n ${o}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${h};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${l-1};\n bool hasNextRow = coords.z < ${n-1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `}}const fG={kernelName:Nl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i}=t,{alignCorners:s,halfPixelCenters:r,size:o}=a,[l,u]=o,c=cr().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new mG(i.shape,l,u,s,r):new pG(i.shape,l,u,s,r);return n.runWebGLProgram(c,[i],"float32")}};class gG{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,a,i]=t,[,s,r]=e,o=[n&&s>1?a-1:a,n&&r>1?i-1:i],l=[n&&s>1?s-1:s,n&&r>1?r-1:r],u=o[0]/l[0],c=o[1]/l[1],h=1/u,d=1/c,p=2*Math.ceil(h)+2,m=2*Math.ceil(d)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${c});\n\n const float invHeightScale = float(${h});\n const float invWidthScale = float(${d});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${s}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${r}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${a-1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${i-1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}const yG={kernelName:Rl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i,dy:s}=t,{alignCorners:r}=a,o=new gG(s.shape,i.shape,r);return n.runWebGLProgram(o,[s],s.dtype)}};class bG{constructor(e,t,n,a,i){this.variableNames=["A"],this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n],h=a?"0.5":"0.0";let d;d=i?"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/c[0]},\n ${u[1]/c[1]});\n const vec2 inputShapeRC = vec2(${r}.0, ${o}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${d};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${h})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `}}class vG{constructor(e,t,n,a,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n],h=a?"0.5":"0.0";let d;d=i?"max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/c[0]},\n ${u[1]/c[1]},\n ${u[1]/c[1]});\n const vec3 inputShapeRC = vec3(${r}.0, ${o}.0,\n ${o}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${d};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${h})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${l-1};\n bool hasNextRow = coords.z < ${n-1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `}}const kG={kernelName:Tl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i}=t,{alignCorners:s,halfPixelCenters:r,size:o}=a,[l,u]=o,c=cr().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new vG(i.shape,l,u,s,r):new bG(i.shape,l,u,s,r);return n.runWebGLProgram(c,[i],i.dtype)}};class wG{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,a,i]=t,[,s,r]=e,o=[n&&s>1?a-1:a,n&&r>1?i-1:i],l=[n&&s>1?s-1:s,n&&r>1?r-1:r],u=o[0]/l[0],c=o[1]/l[1],h=1/u,d=1/c,p=2*Math.ceil(h)+2,m=2*Math.ceil(d)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${c});\n\n const float invHeightScale = float(${h});\n const float invWidthScale = float(${d});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${s}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${r}) {\n continue;\n }\n\n float sourceFracRow =\n float(${o[0]}) *\n (float(dyR) / float(${l[0]}));\n\n float sourceFracCol =\n float(${o[1]}) *\n (float(dyC) / float(${l[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${a}) - 1),\n ${n} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${i}) - 1),\n ${n} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}const AG={kernelName:Il,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i,dy:s}=t,{alignCorners:r}=a,o=new wG(s.shape,i.shape,r);return n.runWebGLProgram(o,[s],s.dtype)}};class xG{constructor(e,t){this.variableNames=["x"];const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);if(this.outputShape=e,1===n)return void(this.userCode=`\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${e[0]} - coord - 1));\n }\n `);const a=e.map(((n,a)=>(n=>-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - coords[${n}] - 1`:`coords[${n}]`)(a))).join(","),i=XB(n);this.userCode=`\n void main() {\n ${i} coords = getOutputCoords();\n setOutput(getX(${a}));\n }\n `}}class CG{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);this.outputShape=e;const a=bL("rc",n),i=`${a[n-1]} + 1 < ${this.outputShape[n-1]}`,s=`${a[n-2]} + 1 < ${this.outputShape[n-2]}`,r=XB(n);function o(n){const a=e.map(((a,i)=>function(n,a){return-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - ${a[n]} - 1`:`${a[n]}`}(i,n)));return`getChannel(getX(${a.join(",")}), vec2(${a.slice(-2).join(",")}))`}this.userCode=1===n?`\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${e[0]} - rc - 1),\n ${e[0]} - rc - 1);\n if(${i}){\n result.g = getChannel(getX(${e[0]} - (rc + 1) - 1),\n ${e[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `:`\n void main() {\n ${r} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${function(e){return o(e)}(a.slice())};\n if(${i}){\n result.g = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",o(e)}(a.slice())};\n }\n if(${s}) {\n result.b = ${function(e){return e[n-2]="("+e[n-2]+" + 1)",o(e)}(a.slice())};\n if(${i}) {\n result.a = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",e[n-2]="("+e[n-2]+" + 1)",o(e)}(a.slice())};\n }\n }\n setOutput(result);\n }\n `}}const SG={kernelName:zl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{dims:s}=a,r=i.shape.length,o=js(s,i.shape);if(0===r)return ZL({inputs:{x:i},backend:n});const l=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new CG(i.shape,o):new xG(i.shape,o);return n.runWebGLProgram(l,[i],i.dtype)}};class EG{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];const n=e[1],a=e[2];this.outputShape=e;let i="";i="number"==typeof t?`float outputValue = ${t.toFixed(2)};`:`\n vec3 fill = vec3(${t.join(",")});\n float outputValue = fill[coords[3]];`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${i}\n if(coordX >= 0 && coordX < ${a} && coordY >= 0 && coordY < ${n}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `}}const _G={kernelName:xu,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:a}=e,{radians:i,fillValue:s,center:r}=t,o=n,l=new EG(a.shape,s),[u,c]=vv(r,a.shape[1],a.shape[2]),h=[[u,c,Math.sin(i),Math.cos(i)]];return o.runWebGLProgram(l,[a],a.dtype,h)}},TG=rP({opSnippet:"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n"}),IG={kernelName:Ol,backendName:"webgl",kernelFunc:TG},NG=rP({opSnippet:"return inversesqrt(x);",cpuKernelImpl:QF}),RG={kernelName:Ml,backendName:"webgl",kernelFunc:NG};class DG{constructor(e,t,n,a,i,s,r=!0,o=!1){this.variableNames=["updates","indices","defaultValue"],this.outputShape=s;const l=XB(i.length),u=XB(s.length);let c="";1===n?c="i":2===n&&(c="i, j");const h=`getIndices(${c})`;let d="";1===a?d="i":2===a&&(d="i, coords[1]");const p=`getUpdates(${d})`;let m="";o&&(m="coords[0], coords[1]");const f=`getDefaultValue(${m})`,g=t>1?"strides[j]":"strides";this.userCode=`\n ${l} strides = ${l}(${i});\n\n void main() {\n ${u} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${e}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${t}; j++) {\n int index = round(${h});\n flattenedIndex += index * ${g};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${p};\n found = true;\n }\n }\n setOutput(mix(${f}, sum, float(found)));\n }\n `}}class zG{constructor(e,t,n,a,i,s,r=!0,o=!1){this.variableNames=["updates","indices","defaultValue"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=s;const l=XB(i.length),u=XB(s.length);let c="";1===n?c="i":2===n&&(c="i, j");const h=`getIndices(${c})`;let d="";1===a?d="i":2===a&&(d="i, coords[1]");const p=`getUpdates(${d})`;let m="";o&&(m="coords[0], coords[1]");const f=`getDefaultValue(${m})`,g=t>1?"strides[j]":"strides",y=t>1?"strides[j + 1]":"strides";this.userCode=`\n ${l} strides = ${l}(${i});\n\n void main() {\n ${u} coords = getOutputCoords();\n vec4 sum = vec4(0.);\n vec4 found = vec4(0.);\n for (int i = 0; i < ${e}; i+=2) {\n ivec2 flattenedIndex = ivec2(0);\n for (int j = 0; j < ${t}; j+=2) {\n ivec4 index = round(${h});\n flattenedIndex += index.xz * ${g};\n if (j + 1 < ${t}) {\n flattenedIndex += index.yw * ${y};\n }\n }\n if (flattenedIndex[0] == coords[0] || flattenedIndex[1] == coords[0] ||\n flattenedIndex[0] == coords[0] + 1 || flattenedIndex[1] == coords[0] + 1) {\n vec4 updVals = ${p};\n if (flattenedIndex[0] == coords[0]) {\n sum.xy += updVals.xy;\n found.xy = vec2(1.);\n } else if (flattenedIndex[0] == coords[0] + 1) {\n sum.zw += updVals.xy;\n found.zw = vec2(1.);\n }\n if (flattenedIndex[1] == coords[0]) {\n sum.xy += updVals.zw;\n found.xy = vec2(1.);\n } else if (flattenedIndex[1] == coords[0] + 1) {\n sum.zw += updVals.zw;\n found.zw = vec2(1.);\n }\n }\n }\n setOutput(mix(${f}, sum, found));\n }\n `}}const OG={kernelName:Bl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{indices:i,updates:s}=t,{shape:r}=a,{sliceRank:o,numUpdates:l,sliceSize:u,strides:c,outputSize:h}=Dy(0,i,r),d=[h/u,u];if(0===h)return n.makeTensorInfo(r,i.dtype);const p=fP({inputs:{x:i},backend:n,attrs:{shape:[l,o]}}),m=fP({inputs:{x:s},backend:n,attrs:{shape:[l,u]}}),f=n.makeTensorInfo([],"float32",new Float32Array([0]));let g;g=cr().getBool("WEBGL_PACK")?new zG(l,o,p.shape.length,m.shape.length,c,d):new DG(l,o,p.shape.length,m.shape.length,c,d);const y=n.runWebGLProgram(g,[m,p,f],m.dtype),b=fP({inputs:{x:y},backend:n,attrs:{shape:r}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(f),b}};class MG{constructor(e,t,n,a){this.variableNames=["sortedSequence","values"],this.customUniforms=[{name:"numInputs",type:"int"}],this.outputShape=[e,n];const i=`for (int i = 0; i < ${Math.ceil(Math.log2(t+1))}; ++i) { if (left >= right) break;`,s=2===cr().getNumber("WEBGL_VERSION")?"while (left < right) {":i,r="left"===a?"<":"<=";this.userCode=`\n int findBound(int batch, float value) {\n int left = 0;\n int right = numInputs;\n int mid;\n ${s}\n mid = (left + right) / 2;\n if (getSortedSequence(batch, mid) ${r} value) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n return right;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int valueIndex = coords[1];\n\n float value = getValues(batch, valueIndex);\n\n setOutput(float(findBound(batch, value)));\n }\n `}}const BG={kernelName:Ll,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{sortedSequence:i,values:s}=t,{side:r}=a,o=new MG(i.shape[0],i.shape[1],s.shape[1],r),l=[[i.shape[1]]];return n.runWebGLProgram(o,[i,s],"int32",l)}};class FG{constructor(e,t,n){let a,i;if(this.variableNames=["c","a","b"],this.outputShape=t,n>4)throw Error(`Where for rank ${n} is not yet supported`);if(1===n)i="resRC",a="resRC";else{const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[],r=[];for(let a=0;a= 1.0) {\n setOutput(getA(${i}));\n } else {\n setOutput(getB(${i}));\n }\n }\n `}}const LG={kernelName:Pl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{condition:a,t:i,e:s}=t,r=new FG(a.shape.length,i.shape,i.shape.length);return n.runWebGLProgram(r,[a,i,s],Oc(i.dtype,s.dtype))}},PG=rP({opSnippet:`\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = ${Ev};\n float scale = ${_v};\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`}),jG={kernelName:jl,backendName:"webgl",kernelFunc:PG},VG=rP({opSnippet:sP+"\n return 1.0 / (1.0 + exp(-1.0 * x));\n",packedOpSnippet:"\n vec4 result = 1.0 / (1.0 + exp(-1.0 * x));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",cpuKernelImpl:eL}),UG={kernelName:ql,backendName:"webgl",kernelFunc:VG},WG=rP({opSnippet:"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n"}),GG={kernelName:Gl,backendName:"webgl",kernelFunc:WG},qG=rP({opSnippet:sP+"\n return sin(x);\n",packedOpSnippet:`\n vec4 result = sin(x);\n bvec4 isNaN = isnan(x);\n ${KL}\n return result;\n`}),HG={kernelName:Ul,backendName:"webgl",kernelFunc:qG},KG=rP({opSnippet:"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n"}),$G={kernelName:Wl,backendName:"webgl",kernelFunc:KG},ZG=rP({opSnippet:"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n"}),XG={kernelName:Hl,backendName:"webgl",kernelFunc:ZG},YG={kernelName:Zl,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockShape:s,paddings:r}=a;Ns(i.shape.length<=4,(()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"));const o=s.reduce(((e,t)=>e*t)),l=[[0,0]];l.push(...r);for(let e=1+s.length;en.disposeIntermediateTensorInfo(e))),g}};const QG={kernelName:Ql,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{indices:a,values:i,denseShape:s,defaultValue:r}=t;if(1!==s.shape.length)throw new Error(`Dense shape must be a vector, saw:\n ${s.shape}`);if(2!==a.shape.length)throw new Error(`Indices must be a matrix, saw:\n ${a.shape}`);if(1!==i.shape.length)throw new Error(`Values must be a vector, saw:\n ${i.shape}`);if(0!==r.shape.length)throw new Error(`Default value must be a scalar, saw:\n ${r.shape}`);const o=n.readSync(a.dataId),l=n.readSync(i.dataId),u=n.readSync(s.dataId),c=n.readSync(r.dataId)[0],[h,d,p,m,f]=aL(o,a.shape,a.dtype,l,i.dtype,u,c);return[n.makeTensorInfo(d,a.dtype,h),n.makeTensorInfo([d[0]],i.dtype,p),n.makeTensorInfo([m.length],"bool",new Uint8Array(m.map((e=>Number(e))))),n.makeTensorInfo([f.length],a.dtype,new Int32Array(f))]}};const JG={kernelName:Jl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{inputIndices:a,inputShape:i,newShape:s}=t;if(2!==a.shape.length)throw new Error(`Input indices should be a matrix but received shape ${a.shape}`);if(1!==i.shape.length)throw new Error(`Input shape should be a vector but received shape ${i.shape}`);if(1!==s.shape.length)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);const r=Array.from(n.readSync(i.dataId)),o=n.readSync(a.dataId),l=Array.from(n.readSync(s.dataId)),[u,c,h]=iL(o,a.shape,a.dtype,r,l);return[n.makeTensorInfo(c,a.dtype,u),n.makeTensorInfo([h.length],s.dtype,new Int32Array(h))]}};const eq={kernelName:eu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{data:a,indices:i,segmentIds:s}=t;if(a.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.shape.length)throw new Error(`Indices should be a vector but received shape\n ${i.shape}`);if(1!==s.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);const r=n.readSync(a.dataId),o=n.readSync(i.dataId),l=n.readSync(s.dataId),[u,c]=sL(r,a.shape,a.dtype,o,l,!0);return n.makeTensorInfo(c,a.dtype,u)}};const tq={kernelName:tu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{data:a,indices:i,segmentIds:s}=t;if(a.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.shape.length)throw new Error(`Indices should be a vector but received shape\n ${i.shape}`);if(1!==s.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);const r=n.readSync(a.dataId),o=n.readSync(i.dataId),l=n.readSync(s.dataId),[u,c]=sL(r,a.shape,a.dtype,o,l);return n.makeTensorInfo(c,a.dtype,u)}};const nq={kernelName:nu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{sparseIndices:i,sparseValues:s,defaultValue:r}=t,{outputShape:o}=a,{sliceRank:l,numUpdates:u,sliceSize:c,strides:h,outputSize:d}=Dy(0,i,o),p=!1;if("string"===s.dtype){const e=n.bufferSync(i),t=n.bufferSync(s),a=nc(n.readSync(r.dataId)[0]),m=JF(e,t,o,d,c,u,l,h,a,p);return n.makeTensorInfo(o,m.dtype,m.values)}const m=new DG(u,l,i.shape.length,s.shape.length,h,[d,1],p),f=n.runWebGLProgram(m,[s,i,r],s.dtype),g=fP({inputs:{x:f},backend:n,attrs:{shape:o}});return n.disposeIntermediateTensorInfo(f),g}};const aq={kernelName:Xl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{numOrSizeSplits:s,axis:r}=a,o=js(r,i.shape)[0],l=Qv(i,s,o),u=i.shape.length,c=new Array(u).fill(0),h=i.shape.slice();return l.map((e=>{const t=[...h];t[o]=e;const a=Aj({inputs:{x:i},backend:n,attrs:{begin:c,size:t}});return c[o]+=e,a}))}},iq="return sqrt(x);",sq=rP({opSnippet:iq,packedOpSnippet:iq,cpuKernelImpl:rL}),rq={kernelName:Kl,backendName:"webgl",kernelFunc:sq},oq={kernelName:iu,backendName:"webgl",kernelFunc:rP({opSnippet:"return x * x;"})},lq="return (a - b) * (a - b);",uq=oP({opSnippet:lq,packedOpSnippet:lq}),cq={kernelName:au,backendName:"webgl",kernelFunc:uq};const hq={kernelName:su,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");const s=mk(n.readSync(i.dataId)),r=oL(s,"string",a);return n.makeTensorInfo(i.shape,"string",r)}};const dq={kernelName:wu,backendName:"webgl",kernelFunc:function({inputs:e,attrs:t,backend:n}){const{x:a}=e,i=EL+`\n return x > 0.0 ? 1.0 : float(${t.alpha});\n `,s=new SL(a.shape,i);return n.runWebGLProgram(s,[a],a.dtype)}};class pq{constructor(e,t,n){this.variableNames=["x"],this.outputShape=n;const a=n.length,i=XB(n.length),s=XB(n.length);let r="";if(1===a)r="coords * strides + begin";else{let e=0;r=n.map(((t,a)=>(e++,1===n.length?`coords * strides[${a}] + begin[${a}]`:`coords[${e-1}] * strides[${a}] + begin[${a}]`))).join(",")}this.userCode=`\n ${i} begin = ${i}(${e});\n ${i} strides = ${i}(${t});\n\n void main() {\n ${s} coords = getOutputCoords();\n setOutput(getX(${r}));\n }\n `}}const mq={kernelName:ru,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{begin:s,end:r,strides:o,beginMask:l,endMask:u,ellipsisMask:c,newAxisMask:h,shrinkAxisMask:d}=a,{finalShapeSparse:p,finalShape:m,isIdentity:f,sliceDim0:g,isSimpleSlice:y,begin:b,end:v,strides:k}=Gp(i.shape,s,r,o,l,u,c,h,d);let w;if(f)w=fP({inputs:{x:i},backend:n,attrs:{shape:m}});else if(g||y){Ns(i.shape.length>=1,(()=>`Input must have rank at least 1, got: ${i.shape.length}`));const e=Rp(b,v,k),t=Aj({inputs:{x:i},backend:n,attrs:{begin:b,size:e}});w=fP({inputs:{x:t},backend:n,attrs:{shape:m}}),n.disposeIntermediateTensorInfo(t)}else{if(n.shouldExecuteOnCPU([i])){const e=n.readSync(i.dataId),t=vd(i.shape,i.dtype,e),a=lL(p,t,k,b);w=n.makeTensorInfo(m,i.dtype,a.values)}else{const e=new pq(b,k,p);w=n.runWebGLProgram(e,[i],i.dtype)}}const A=fP({inputs:{x:w},backend:n,attrs:{shape:m}});return n.disposeIntermediateTensorInfo(w),A}};const fq={kernelName:ou,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{separator:i,nGramWidths:s,leftPad:r,rightPad:o,padWidth:l,preserveShortSequences:u}=a,{data:c,dataSplits:h}=t,d=n.readSync(c.dataId),p=n.readSync(h.dataId),[m,f]=uL(d,p,i,s,r,o,l,u);return[n.makeTensorInfo([m.length],"string",m),n.makeTensorInfo(h.shape,"int32",f)]}};const gq={kernelName:lu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{skipEmpty:i}=a,{input:s,delimiter:r}=t;if("string"!==s.dtype)throw new Error("Input must be of datatype string");if(1!==s.shape.length)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(0!==r.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${r.shape}`);const o=n.readSync(s.dataId),l=n.readSync(r.dataId)[0],[u,c,h]=cL(o,l,i),d=c.length;return[n.makeTensorInfo([d,2],"int32",u),n.makeTensorInfo([d],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(h))]}};const yq={kernelName:uu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{numBuckets:i}=a,{input:s}=t;if("string"!==s.dtype)throw new Error("Input must be of datatype string");if(i<=0)throw new Error("Number of buckets must be at least 1");const r=n.readSync(s.dataId),o=hL(r,i);return n.makeTensorInfo(s.shape,"int32",o)}},bq=rP({opSnippet:"return tan(x);"}),vq={kernelName:hu,backendName:"webgl",kernelFunc:bq},kq=rP({opSnippet:"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n"}),wq={kernelName:du,backendName:"webgl",kernelFunc:kq};const Aq={kernelName:Fl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{tensor:i,indices:s,updates:r}=t,{}=a,{sliceRank:o,numUpdates:l,sliceSize:u,strides:c,outputSize:h}=Dy(0,s,i.shape),d=[h/u,u];if(0===h)return n.makeTensorInfo(i.shape,s.dtype);const p=fP({inputs:{x:s},backend:n,attrs:{shape:[l,o]}}),m=fP({inputs:{x:r},backend:n,attrs:{shape:[l,u]}}),f=fP({inputs:{x:i},backend:n,attrs:{shape:d}}),g=new DG(l,o,p.shape.length,m.shape.length,c,d,!1,!0),y=n.runWebGLProgram(g,[m,p,f],f.dtype),b=fP({inputs:{x:y},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(y),b}};class xq{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let a=0;a5)throw Error(`Tile for rank ${t} is not yet supported`);if(1===t)return`imod(resRC, ${e[0]})`;const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],a=[];for(let t=0;t5){const e=n.readSync(i.dataId),t="string"===i.dtype?e.map((e=>nc(e))):e,a=vd(i.shape,i.dtype,t),r=pL(a,s);return n.makeTensorInfo(r.shape,r.dtype,r.values)}const r=new xq(i.shape,s);return n.runWebGLProgram(r,[i],i.dtype)}const Sq={kernelName:pu,backendName:"webgl",kernelFunc:Cq};class Eq{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"negativeInf",type:"float"},{name:"dir",type:"int"},{name:"inc",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // We compare elements pair-wise within a group of size 2 * inc.\n // The comparing rule for each group alternates between ascending\n // and descending. Within each group, we compare each pair at\n // positions i and i+inc. To decide whether an element at position i\n // is x0 or x1, we mod it by 2 * inc, if the result is smaller than\n // inc, it is in the first half of the group, we denote it as x0,\n // otherwise we denote it as x1.\n // For example, as shown in the Bitonic top K paper referenced above,\n // Figure5(a) shows that element[1] is in the\n // second half of the group when group size is 2, but it is in the\n // first half of the group when group size is 4.\n\n bool isFirstInPair = imod(elemIdx, 2 * inc) < inc;\n int i = isFirstInPair ? elemIdx : elemIdx - inc;\n\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc));\n float x0 = i0 < n ? getX(batch, i0) : negativeInf;\n float x1 = i1 < n ? getX(batch, i1) : negativeInf;\n\n // Denotes which direction indices are in (ascending or descending).\n bool reverse = imod(elemIdx, 2 * dir) >= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n "}}class _q{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n "}}function Tq(e,t){null!==t&&e.disposeIntermediateTensorInfo(t)}function Iq(e){let t=1;for(;tl){const e=n.readSync(i.dataId),[t,a]=mL(e,u,i.dtype,s,r);return[n.makeTensorInfo(t.shape,t.dtype,t.values),n.makeTensorInfo(a.shape,a.dtype,a.values)]}if(0===s)return u[u.length-1]=0,[n.makeTensorInfo(u,i.dtype,[]),n.makeTensorInfo(u,"int32",[])];if(1===c)return[i,lU({attrs:{shape:u,dtype:"int32",value:0},backend:n})];const h=n.texData.get(i.dataId),d=null!==h&&h.isPacked,p=d?n.unpackTensor(i):i,m=zs(u)/c,f=fP({inputs:{x:p},attrs:{shape:[m,c]},backend:n});d&&Tq(n,p);const g=Iq(s),y=Iq(c);let b=null;const v=()=>null===b?[f,f]:[f,b],k=(e,t,a)=>{const i=v(),s=new Eq(a),r=[[c],[null===b?1:0],[Number.NEGATIVE_INFINITY],[e],[t]],o=b;b=n.runWebGLProgram(s,i,"int32",r),Tq(n,o)};for(let e=1;e=1;n/=2)k(t,n,[m,y])}for(let e=y;e>g;e/=2){const t=v(),a=new _q([m,e/2]),i=[[c],[null===b?1:0],[g]],s=b;b=n.runWebGLProgram(a,t,"int32",i),Tq(n,s);const r=g/2,o=2*r;for(let e=r;e>=1;e/=2)k(o,e,b.shape)}let w=b;b=Aj({inputs:{x:b},backend:n,attrs:{begin:0,size:[m,s]}}),Tq(n,w);let A=_U({inputs:{x:f,indices:b},backend:n,attrs:{axis:1,batchDims:1}});Tq(n,f);const x=u.slice(0,-1);x.push(s),w=b,b=fP({inputs:{x:b},attrs:{shape:x},backend:n}),Tq(n,w);const C=A;return A=fP({inputs:{x:A},attrs:{shape:x},backend:n}),Tq(n,C),[A,b]}};class Rq{constructor(e,t,n,a,i,s){this.variableNames=["Image","Transforms"],this.outputShape=s;const r="nearest"===n?1:2;let o;switch(a){case"constant":default:o=1;break;case"reflect":o=2;break;case"wrap":o=3;break;case"nearest":o=4}this.userCode=`\n float mapCoord(float outCoord, float len) {\n float inCoord = outCoord;\n if(${o} == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${o} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${o} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${i});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${i});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${t}));\n float mapY = mapCoord(inY, float(${e}));\n\n if (${r} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `}}const Dq={kernelName:fu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{image:i,transforms:s}=t,{interpolation:r,fillMode:o,fillValue:l,outputShape:u}=a,[c,h,d,p]=i.shape,[m,f]=null!=u?u:[h,d],g=new Rq(h,d,r,o,l,[c,m,f,p]);return n.runWebGLProgram(g,[i,s],"float32")}};const zq={kernelName:yu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,attrs:n,backend:a}=e,{axis:i}=n,{x:s}=t;RB(s,"unique");const r=a.readSync(s.dataId),{outputValues:o,outputShape:l,indices:u}=gL(r,i,s.shape,s.dtype);return[a.makeTensorInfo(l,s.dtype,o),a.makeTensorInfo([u.length],"int32",u)]}};const Oq={kernelName:bu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{value:i}=t;let{axis:s}=a;s<0&&(s+=i.shape.length);const r=i,o=r.shape.length,l=i.shape[s],u=new Array(o-1);let c=0;for(let e=0;en.disposeIntermediateTensorInfo(e))),m}};class Mq{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowSize,a=e.batchSize,i=e.inSize,s=e.numSegments,r=s*Math.ceil(i/n);this.outputShape=[a,r];const o=4*Math.floor(n/4),l=n%4,u="\n sumValue += dot(values, segFilter);\n ";let c="";i%n>0&&(c=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return initializationValue;\n }\n `);let h="";i%n>0&&(h=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return -1.0;\n }\n `),this.userCode=`\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n ${c}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${h}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${s})) * float(${n}));\n int currentSeg = int(mod(float(outIdx), float(${s})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${o}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${u}\n }\n\n int inIdx = inOffset + ${o};\n if (${1===l}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${2===l}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${3===l}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${u}\n }\n setOutput(sumValue);\n }\n `}}const Bq={kernelName:vu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,segmentIds:s}=t,{numSegments:r}=a,o=i.shape.length,l=[];let u=0;const c=vf([u],o);let h=i;null!=c&&(h=SP({inputs:{x:i},backend:n,attrs:{perm:c}}),l.push(h),u=wf(1,o)[0]);const d=dk(h.shape,u,r),p=zs([h.shape[u]]),m=fP({inputs:{x:h},backend:n,attrs:{shape:[-1,p]}});l.push(m);const f=Mc(i.dtype),g=(e,t,a,i,s)=>{const r=e.shape[0],o=e.shape[1],u=hk(o,s),c=new Mq({windowSize:u,inSize:o,batchSize:r,numSegments:s},t),h=n.compileAndRun(c,[e,a],i);if(l.push(h),h.shape[1]===s)return h;const d=sG({backend:n,attrs:{start:0,stop:s,step:1,dtype:"float32"}}),p=Cq({inputs:{x:d},backend:n,attrs:{reps:[o/u]}});l.push(d),l.push(p);return g(h,t,p,i,s)},y=fP({inputs:{x:g(m,"unsortedSegmentSum",s,f,r)},backend:n,attrs:{shape:d}});let b=y;if(null!=c){l.push(y);const e=kf(c);b=SP({inputs:{x:b},backend:n,attrs:{perm:e}})}return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),b}},Fq=[IP,RP,zP,MP,LP,VP,UP,WP,ZP,XP,QP,ej,nj,ij,rj,uj,cj,pj,mj,fj,bj,Cj,Sj,Ej,_j,zj,Bj,Pj,QL,Uj,Xj,iV,uV,hV,dV,pV,mV,gV,bV,kV,_V,TV,IV,RV,OV,FV,LV,jV,UV,WV,qV,HV,$V,XV,QV,eU,aU,rU,uU,hU,mU,gU,vU,AU,xU,SU,TU,NU,DU,XL,zU,Kj,MU,FU,PU,tP,VU,WU,GU,HU,$U,XU,QU,eW,aW,sW,oW,uW,cW,hW,mW,fW,gW,yW,bW,kW,xW,SW,OW,mP,BW,LW,jW,UW,Ij,GW,KW,$W,QW,eG,iP,tG,nG,aG,iG,rG,Rj,TW,lG,cG,dG,gP,fG,yG,kG,AG,SG,_G,IG,RG,OG,BG,LG,jG,UG,GG,HG,$G,xj,zW,XG,YG,QG,JG,eq,tq,nq,aq,rq,oq,cq,hq,dq,mq,fq,gq,yq,RW,CP,vq,wq,Aq,Sq,Nq,Dq,EP,zq,Oq,Bq,HW];for(const e of Fq)Ou(e);__webpack_require__(9464);const Lq={moveTickSize:50,videoContainerId:"webgazerVideoContainer",videoElementId:"webgazerVideoFeed",videoElementCanvasId:"webgazerVideoCanvas",faceOverlayId:"webgazerFaceOverlay",faceFeedbackBoxId:"webgazerFaceFeedbackBox",gazeDotId:"webgazerGazeDot",videoViewerWidth:320,videoViewerHeight:240,faceFeedbackBoxRatio:.66,showVideo:!0,mirrorVideo:!0,showFaceOverlay:!0,showFaceFeedbackBox:!0,showGazeDot:!0,camConstraints:{video:{width:{min:320,ideal:640,max:1920},height:{min:240,ideal:480,max:1080},facingMode:"user"}},dataTimestep:50,showVideoPreview:!0,applyKalmanFilter:!0,saveDataAcrossSessions:!0,storingPoints:!1,videoIsOn:!1,trackEye:"both"};__webpack_require__(6003);var Pq=__webpack_require__(7350),jq=__webpack_require__.n(Pq),Vq=__webpack_require__(8990),Uq=function(){return Uq=Object.assign||function(e){for(var t,n=1,a=arguments.length;n0&&i[i.length-1])||6!==s[0]&&2!==s[0])){r=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]>>0)+"_",i=0;return function e(n){if(this instanceof e)throw new TypeError("Symbol is not a constructor");return new t(a+(n||"")+"_"+i++,n)}})),i("Symbol.iterator",(function(e){if(e)return e;e=Symbol("Symbol.iterator");for(var i="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),r=0;r(t=t||0)&&(t=Math.max(t+a,0));t>2];r=t[(3&r)<<4|o>>4],o=t[(15&o)<<2|l>>6],l=t[63&l],n[s++]=u+r+o+l}switch(u=0,l=a,e.length-i){case 2:l=t[(15&(u=e[i+1]))<<2]||a;case 1:e=e[i],n[s]=t[e>>2]+t[(3&e)<<4|u>>4]+l+a}return n.join("")}function M(e){var t=e.length,n=3*t/4;n%3?n=Math.floor(n):-1!="=.".indexOf(e[t-1])&&(n=-1!="=.".indexOf(e[t-2])?n-2:n-1);var a=new Uint8Array(n),i=0;return function(e,t){function n(t){for(;a>4),64!=r&&(t(s<<4&240|r>>2),64!=o&&t(r<<6&192|o))}}(e,(function(e){a[i++]=e})),i!==n?a.subarray(0,i):a}function B(){if(!z){z={};for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),t=["+/=","+/","-_=","-_.","-_"],n=0;5>n;n++){var a=e.concat(t[n].split(""));D[n]=a;for(var i=0;ie.i)throw Error("Tried to read past the end of the data "+e.g+" > "+e.i)}function $(e){var t=e.h,n=t[e.g],a=127&n;if(128>n)return e.g+=1,K(e),a;if(a|=(127&(n=t[e.g+1]))<<7,128>n)return e.g+=2,K(e),a;if(a|=(127&(n=t[e.g+2]))<<14,128>n)return e.g+=3,K(e),a;if(a|=(127&(n=t[e.g+3]))<<21,128>n)return e.g+=4,K(e),a;if(n=t[e.g+4],e.g+=5,a|=(15&n)<<28,128>n)return K(e),a;if(128<=t[e.g++]&&128<=t[e.g++]&&128<=t[e.g++]&&128<=t[e.g++]&&128<=t[e.g++])throw G();return K(e),a}q.prototype.reset=function(){this.g=this.j};var Z=[];function X(){this.g=[]}function Y(e,t){for(;127>>=7;e.g.push(t)}function Q(e){var t={},n=void 0!==t.W&&t.W;this.l={v:void 0!==t.v&&t.v},this.W=n,t=this.l,Z.length?(n=Z.pop(),t&&(n.v=t.v),e&&H(n,e),e=n):e=new q(e,t),this.g=e,this.j=this.g.g,this.h=this.i=-1}function J(e){var t=e.g;if(t.g==t.i)return!1;e.j=e.g.g;var n=$(e.g)>>>0;if(t=n>>>3,!(0<=(n&=7)&&5>=n))throw W(n,e.j);if(1>t)throw Error("Invalid field number: "+t+" (at position "+e.j+")");return e.i=t,e.h=n,!0}function ee(e){switch(e.h){case 0:if(0!=e.h)ee(e);else e:{for(var t=(e=e.g).g,n=t+10;t>>0,(e=e.g).g+=t,K(e));break;case 5:(e=e.g).g+=4,K(e);break;case 3:for(t=e.i;;){if(!J(e))throw Error("Unmatched start-group tag: stream EOF");if(4==e.h){if(e.i!=t)throw Error("Unmatched end-group tag");break}ee(e)}break;default:throw W(e.h,e.j)}}X.prototype.length=function(){return this.g.length},X.prototype.end=function(){var e=this.g;return this.g=[],e},Q.prototype.reset=function(){this.g.reset(),this.j=this.g.g,this.h=this.i=-1};var te=[];function ne(){this.i=[],this.h=0,this.g=new X}function ae(e,t){0!==t.length&&(e.i.push(t),e.h+=t.length)}var ie="function"==typeof Symbol&&"symbol"==typeof Symbol()?Symbol(void 0):void 0;function se(e,t){Object.isFrozen(e)||(ie?e[ie]|=t:void 0!==e.N?e.N|=t:Object.defineProperties(e,{N:{value:t,configurable:!0,writable:!0,enumerable:!1}}))}function re(e){var t;return null==(t=ie?e[ie]:e.N)?0:t}function oe(e){return se(e,1),e}function le(e){return!!Array.isArray(e)&&!!(2&re(e))}function ue(e){if(!Array.isArray(e))throw Error("cannot mark non-array as immutable");se(e,2)}function ce(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)&&e.constructor===Object}var he=Object.freeze(oe([]));function de(e){if(le(e.m))throw Error("Cannot mutate an immutable Message")}var pe,me="undefined"!=typeof Symbol&&void 0!==Symbol.hasInstance;function fe(e){return{value:e,configurable:!1,writable:!1,enumerable:!1}}function ge(e,t,n){return-1===t?null:t>=e.i?e.g?e.g[t]:void 0:void 0!==n&&n&&e.g&&null!=(n=e.g[t])?n:e.m[t+e.h]}function ye(e,t,n,a){a=void 0!==a&&a,de(e),tte.length&&te.push(e)}}function tt(e,t,n){for(var a=n.length,i=1==a%2,s=i?1:0;s>>0)>>31)+1,a=i>>>23&255,i&=8388607,ye(t,n,255==a?i?NaN:1/0*e:0==a?e*Math.pow(2,-149)*i:e*Math.pow(2,a-150)*(i+Math.pow(2,23))),!0}),(function(e,t,n){if(null!=(t=ge(t,n))){Y(e.g,8*n+5),e=e.g;var a=t;0===(a=(n=0>a?1:0)?-a:a)?U=0<1/a?0:2147483648:isNaN(a)?U=2147483647:34028234663852886e22>>0:11754943508222875e-54>a?(a=Math.round(a/Math.pow(2,-149)),U=(n<<31|a)>>>0):(t=Math.floor(Math.log(a)/Math.LN2),a*=Math.pow(2,-t),16777216<=(a=Math.round(8388608*a))&&++t,U=(n<<31|t+127<<23|8388607&a)>>>0),n=U,e.g.push(n>>>0&255),e.g.push(n>>>8&255),e.g.push(n>>>16&255),e.g.push(n>>>24&255)}})),st=at((function(e,t,n){if(0!==e.h)return!1;for(var a=e.g,i=128,s=0,r=e=0;4>r&&128<=i;r++)i=a.h[a.g++],K(a),s|=(127&i)<<7*r;if(128<=i&&(i=a.h[a.g++],K(a),s|=(127&i)<<28,e|=(127&i)>>4),128<=i)for(r=0;5>r&&128<=i;r++)i=a.h[a.g++],K(a),e|=(127&i)<<7*r+3;if(!(128>i))throw G();return a=s>>>0,(e=2147483648&(i=e>>>0))&&(i=~i>>>0,0==(a=1+~a>>>0)&&(i=i+1>>>0)),a=4294967296*i+(a>>>0),ye(t,n,e?-a:a),!0}),(function(e,t,n){if(null!=(t=ge(t,n))&&null!=t){Y(e.g,8*n),e=e.g;var a=t;for(n=0>a,t=(a=Math.abs(a))>>>0,a=Math.floor((a-t)/4294967296),a>>>=0,n&&(a=~a>>>0,4294967295<(t=1+(~t>>>0))&&(t=0,4294967295<++a&&(a=0))),n=U=t,t=a;0>>7|t<<25)>>>0,t>>>=7;e.g.push(n)}})),rt=at((function(e,t,n){return 0===e.h&&(ye(t,n,$(e.g)),!0)}),(function(e,t,n){if(null!=(t=ge(t,n))&&null!=t)if(Y(e.g,8*n),e=e.g,0<=(n=t))Y(e,n);else{for(t=0;9>t;t++)e.g.push(127&n|128),n>>=7;e.g.push(1)}})),ot=at((function(e,t,n){if(2!==e.h)return!1;var a,i=$(e.g)>>>0,s=(e=e.g).g;if(e.g+=i,K(e),e=e.h,N)(a=T)||(a=T=new TextDecoder("utf-8",{fatal:!0})),a=a.decode(e.subarray(s,s+i));else{i=s+i;for(var r,o,l,u=[],c=null;s(r=e[s++])?u.push(r):224>r?s>=i?E():(o=e[s++],194>r||128!=(192&o)?(s--,E()):u.push((31&r)<<6|63&o)):240>r?s>=i-1?E():128!=(192&(o=e[s++]))||224===r&&160>o||237===r&&160<=o||128!=(192&(a=e[s++]))?(s--,E()):u.push((15&r)<<12|(63&o)<<6|63&a):244>=r?s>=i-2?E():128!=(192&(o=e[s++]))||o-144+(r<<28)>>30||128!=(192&(a=e[s++]))||128!=(192&(l=e[s++]))?(s--,E()):(r=(7&r)<<18|(63&o)<<12|(63&a)<<6|63&l,r-=65536,u.push(55296+(r>>10&1023),56320+(1023&r))):E(),8192<=u.length&&(c=_(c,u),u.length=0);a=_(c,u)}return ye(t,n,a),!0}),(function(e,t,n){if(null!=(t=ge(t,n))){var a=!1;if(a=void 0!==a&&a,R){if(a&&/(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])/.test(t))throw Error("Found an unpaired surrogate");t=(I||(I=new TextEncoder)).encode(t)}else{for(var i=0,s=new Uint8Array(3*t.length),r=0;ro)s[i++]=o;else{if(2048>o)s[i++]=o>>6|192;else{if(55296<=o&&57343>=o){if(56319>=o&&r=l){o=1024*(o-55296)+l-56320+65536,s[i++]=o>>18|240,s[i++]=o>>12&63|128,s[i++]=o>>6&63|128,s[i++]=63&o|128;continue}r--}if(a)throw Error("Found an unpaired surrogate");o=65533}s[i++]=o>>12|224,s[i++]=o>>6&63|128}s[i++]=63&o|128}}t=s.subarray(0,i)}Y(e.g,8*n+2),Y(e.g,t.length),ae(e,e.g.end()),ae(e,t)}})),lt=at((function(e,t,n,a,i){if(2!==e.h)return!1;t=we(t,n,a),n=e.g.i,a=$(e.g)>>>0;var s=e.g.g+a,r=s-n;if(0>=r&&(e.g.i=s,i(t,e),r=s-e.g.g),r)throw Error("Message parsing ended unexpectedly. Expected to read "+a+" bytes, instead read "+(a-r)+" bytes, either the data ended unexpectedly or the message misreported its own length");return e.g.g=s,e.g.i=n,!0}),(function(e,t,n,a,i){if(null!=(t=ke(t,a,n)))for(a=0;a>>=7,r.h++;s.push(o),r.h++}}));function ut(){Ne.apply(this,arguments)}if(p(ut,Ne),me){var ct={};Object.defineProperties(ut,(ct[Symbol.hasInstance]=fe(Object[Symbol.hasInstance]),ct))}function ht(e){ut.call(this,e)}function dt(){return[1,rt,2,it,3,ot,4,ot]}function pt(e){ut.call(this,e,-1,ft)}function mt(){return[1,lt,ht,dt]}p(ht,ut),p(pt,ut),pt.prototype.addClassification=function(e,t){return we(this,1,ht,e,t),this};var ft=[1];function gt(e){ut.call(this,e)}function yt(){return[1,it,2,it,3,it,4,it,5,it]}function bt(e){ut.call(this,e,-1,kt)}function vt(){return[1,lt,gt,yt]}p(gt,ut),p(bt,ut);var kt=[1];function wt(e){ut.call(this,e)}function At(){return[1,it,2,it,3,it,4,it,5,it,6,st]}p(wt,ut);var xt=[[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]],Ct=[[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]],St=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Et=[[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]],_t=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Tt=[[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]],It=[].concat(o(xt),o(Ct),o(St),o(Et),o(_t),o(Tt));function Nt(e,t,n){if(n=e.createShader(0===n?e.VERTEX_SHADER:e.FRAGMENT_SHADER),e.shaderSource(n,t),e.compileShader(n),!e.getShaderParameter(n,e.COMPILE_STATUS))throw Error("Could not compile WebGL shader.\n\n"+e.getShaderInfoLog(n));return n}function Rt(e){return ke(e,ht,1).map((function(e){return{index:Ae(e,1),ga:ve(e,2),label:null!=ge(e,3)?xe(e,3):void 0,displayName:null!=ge(e,4)?xe(e,4):void 0}}))}function Dt(e){return{x:ve(e,1),y:ve(e,2),z:ve(e,3),visibility:null!=ge(e,4)?ve(e,4):void 0}}function zt(e,t){this.h=e,this.g=t,this.l=0}function Ot(e,t,n){return function(e,t){var n=e.g;if(void 0===e.o){var a=Nt(n,"\n attribute vec2 aVertex;\n attribute vec2 aTex;\n varying vec2 vTex;\n void main(void) {\n gl_Position = vec4(aVertex, 0.0, 1.0);\n vTex = aTex;\n }",0),i=Nt(n,"\n precision mediump float;\n varying vec2 vTex;\n uniform sampler2D sampler0;\n void main(){\n gl_FragColor = texture2D(sampler0, vTex);\n }",1),s=n.createProgram();if(n.attachShader(s,a),n.attachShader(s,i),n.linkProgram(s),!n.getProgramParameter(s,n.LINK_STATUS))throw Error("Could not compile WebGL program.\n\n"+n.getProgramInfoLog(s));a=e.o=s,n.useProgram(a),i=n.getUniformLocation(a,"sampler0"),e.j={K:n.getAttribLocation(a,"aVertex"),J:n.getAttribLocation(a,"aTex"),ma:i},e.u=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,e.u),n.enableVertexAttribArray(e.j.K),n.vertexAttribPointer(e.j.K,2,n.FLOAT,!1,0,0),n.bufferData(n.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,1,1,-1]),n.STATIC_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null),e.s=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,e.s),n.enableVertexAttribArray(e.j.J),n.vertexAttribPointer(e.j.J,2,n.FLOAT,!1,0,0),n.bufferData(n.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,0,1,1]),n.STATIC_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null),n.uniform1i(i,0)}a=e.j,n.useProgram(e.o),n.canvas.width=t.width,n.canvas.height=t.height,n.viewport(0,0,t.width,t.height),n.activeTexture(n.TEXTURE0),e.h.bindTexture2d(t.glName),n.enableVertexAttribArray(a.K),n.bindBuffer(n.ARRAY_BUFFER,e.u),n.vertexAttribPointer(a.K,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(a.J),n.bindBuffer(n.ARRAY_BUFFER,e.s),n.vertexAttribPointer(a.J,2,n.FLOAT,!1,0,0),n.bindFramebuffer(n.DRAW_FRAMEBUFFER?n.DRAW_FRAMEBUFFER:n.FRAMEBUFFER,null),n.clearColor(0,0,0,0),n.clear(n.COLOR_BUFFER_BIT),n.colorMask(!0,!0,!0,!0),n.drawArrays(n.TRIANGLE_FAN,0,4),n.disableVertexAttribArray(a.K),n.disableVertexAttribArray(a.J),n.bindBuffer(n.ARRAY_BUFFER,null),e.h.bindTexture2d(0)}(e,t),"function"==typeof e.g.canvas.transferToImageBitmap?Promise.resolve(e.g.canvas.transferToImageBitmap()):n?Promise.resolve(e.g.canvas):"function"==typeof createImageBitmap?createImageBitmap(e.g.canvas):(void 0===e.i&&(e.i=document.createElement("canvas")),new Promise((function(t){e.i.height=e.g.canvas.height,e.i.width=e.g.canvas.width,e.i.getContext("2d",{}).drawImage(e.g.canvas,0,0,e.g.canvas.width,e.g.canvas.height),t(e.i)})))}function Mt(e){this.g=e}var Bt=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11]);function Ft(e,t){return t+e}function Lt(e,t){window[e]=t}function Pt(e){if(this.g=e,this.listeners={},this.j={},this.H={},this.o={},this.u={},this.I=this.s=this.Z=!0,this.D=Promise.resolve(),this.Y="",this.C={},this.locateFile=e&&e.locateFile||Ft,"object"==typeof window)var t=window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/";else{if("undefined"==typeof location)throw Error("solutions can only be loaded on a web page or in a web worker");t=location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/"}if(this.$=t,e.options)for(var n=(t=r(Object.keys(e.options))).next();!n.done;n=t.next()){n=n.value;var a=e.options[n].default;void 0!==a&&(this.j[n]="function"==typeof a?a():a)}}function jt(e,t){var n,a;return A((function(i){return t in e.H?i.return(e.H[t]):(n=e.locateFile(t,""),a=fetch(n).then((function(e){return e.arrayBuffer()})),e.H[t]=a,i.return(a))}))}function Vt(e,t,n){var a,i,s,o,l,u,c,h,d,p,m,f,g,b;return A((function(v){switch(v.g){case 1:if(!n)return v.return(t);for(a={},i=0,s=r(Object.keys(n)),o=s.next();!o.done;o=s.next())l=o.value,"string"!=typeof(u=n[l])&&"texture"===u.type&&void 0!==t[u.stream]&&++i;10&&i[i.length-1])||6!==s[0]&&2!==s[0])){r=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]0){var c=o===e.strides.length-1?1:pH(e.minScale,e.maxScale,o+1,e.strides.length);r.push(Math.sqrt(l*c)),s.push(e.interpolatedScaleAspectRatio)}}o++}for(var h=0;h0)p=e.featureMapHeight[n],m=e.featureMapWidth[n];else{var f=e.strides[n];p=Math.ceil(e.inputSizeHeight/f),m=Math.ceil(e.inputSizeWidth/f)}for(var g=0;g-1})),ph([a,i,s]),[2,o]}}))}))}function gH(e,t,n){return aH(this,void 0,void 0,(function(){var a,i,s,r,o;return iH(this,(function(l){switch(l.label){case 0:return a=e[0],i=e[1],s=function(e,t,n){return dh((function(){var a,i,s,r;n.reverseOutputOrder?(i=ky(Sm(e,[0,n.boxCoordOffset+0],[-1,1])),a=ky(Sm(e,[0,n.boxCoordOffset+1],[-1,1])),r=ky(Sm(e,[0,n.boxCoordOffset+2],[-1,1])),s=ky(Sm(e,[0,n.boxCoordOffset+3],[-1,1]))):(a=ky(Sm(e,[0,n.boxCoordOffset+0],[-1,1])),i=ky(Sm(e,[0,n.boxCoordOffset+1],[-1,1])),s=ky(Sm(e,[0,n.boxCoordOffset+2],[-1,1])),r=ky(Sm(e,[0,n.boxCoordOffset+3],[-1,1]))),i=xd(Ed(Sd(i,n.xScale),t.w),t.x),a=xd(Ed(Sd(a,n.yScale),t.h),t.y),n.applyExponentialOnBoxSize?(s=Ed(Tf(Sd(s,n.hScale)),t.h),r=Ed(Tf(Sd(r,n.wScale)),t.w)):(s=Ed(Sd(s,n.hScale),t.h),r=Ed(Sd(r,n.wScale),t.h));var o=Ud(a,Sd(s,2)),l=Ud(i,Sd(r,2)),u=xd(a,Sd(s,2)),c=xd(i,Sd(r,2)),h=Am([vm(o,[n.numBoxes,1]),vm(l,[n.numBoxes,1]),vm(u,[n.numBoxes,1]),vm(c,[n.numBoxes,1])],1);if(n.numKeypoints)for(var d=0;d0)for((c=l.locationData).relativeKeypoints=[],h=n.numKeypoints*n.numValuesPerKeypoint,d=0;dl?(s=e.width,r=e.width*o,c=(1-l/o)/2):(s=e.height/o,r=e.height,u=(1-o/l)/2),e.width=s,e.height=r,{top:c,left:u,right:u,bottom:c}}(l,a,i),c=function(e,t,n,a){var i=e.width,s=e.height,r=Math.cos(e.rotation),o=Math.sin(e.rotation),l=e.xCenter,u=e.yCenter,c=1/t,h=1/n,d=new Array(16);return d[0]=i*r*1*c,d[1]=-s*o*c,d[2]=0,d[3]=(-.5*i*r*1+.5*s*o+l)*c,d[4]=i*o*1*h,d[5]=s*r*h,d[6]=0,d[7]=(-.5*s*r-.5*i*o*1+u)*h,d[8]=0,d[9]=0,d[10]=i*c,d[11]=0,d[12]=0,d[13]=0,d[14]=0,d[15]=1,function(e){if(16!==e.length)throw new Error("Array length must be 16 but got "+e.length);return[[e[0],e[1],e[2],e[3]],[e[4],e[5],e[6],e[7]],[e[8],e[9],e[10],e[11]],[e[12],e[13],e[14],e[15]]]}(d)}(l,o.width,o.height),h=dh((function(){var t=cH(e),n=Ey(function(e,t,n){return hH(n,"inputResolution"),[1/n.width*e[0][0]*t.width,1/n.height*e[0][1]*t.width,e[0][3]*t.width,1/n.width*e[1][0]*t.height,1/n.height*e[1][1]*t.height,e[1][3]*t.height,0,0]}(c,o,a),[1,8]),i="zero"===s?"constant":"nearest",l=tv.transform(If(kd(t,"float32")),n,"bilinear",i,0,[a.height,a.width]);return null!=r?function(e,t){var n=function(e,t,n,a){var i=(a-n)/255;return{scale:i,offset:n-0*i}}(0,0,t[0],t[1]);return dh((function(){return xd(Ed(e,n.scale),n.offset)}))}(l,r):l}));return{imageTensor:h,padding:u,transformationMatrix:c}}(n,this.imageToTensorConfig),i=a.imageTensor,s=a.transformationMatrix,r=this.detectorModel.execute(i,"Identity:0"),o=function(e){return dh((function(){var t=function(e){return dh((function(){return[Sm(e,[0,0,0],[1,-1,1]),Sm(e,[0,0,1],[1,-1,-1])]}))}(e),n=t[0],a=t[1];return{boxes:ky(a),logits:ky(n)}}))}(r),l=o.boxes,[4,gH([u=o.logits,l],this.anchorTensor,this.tensorsToDetectionConfig)]);case 1:return 0===(c=p.sent()).length?(ph([n,i,r,u,l]),[2,c]):[4,fH(c,this.maxFaces,.3)];case 2:return h=p.sent(),d=function(e,t){void 0===e&&(e=[]);var n,a=(n=t,[].concat.apply([],n));return e.forEach((function(e){var t=e.locationData;t.relativeKeypoints.forEach((function(e){var t=mH(a,[e.x,e.y]),n=t[0],i=t[1];e.x=n,e.y=i}));var n=t.relativeBoundingBox,i=Number.MAX_VALUE,s=Number.MAX_VALUE,r=Number.MIN_VALUE,o=Number.MIN_VALUE;[[n.xMin,n.yMin],[n.xMin+n.width,n.yMin],[n.xMin+n.width,n.yMin+n.height],[n.xMin,n.yMin+n.height]].forEach((function(e){var t=mH(a,e),n=t[0],l=t[1];i=Math.min(i,n),r=Math.max(r,n),s=Math.min(s,l),o=Math.max(o,l)})),t.relativeBoundingBox={xMin:i,xMax:r,yMin:s,yMax:o,width:r-i,height:o-s}})),e}(h,s),ph([n,i,r,u,l]),[2,d]}}))}))},e.prototype.estimateFaces=function(e,t){return aH(this,void 0,void 0,(function(){var n,a;return iH(this,(function(i){return n=uH(e),a=!!t&&t.flipHorizontal,[2,this.detectFaces(e,a).then((function(e){return e.map((function(e){for(var t=e.locationData.relativeKeypoints.map((function(e,t){return nH(nH({},e),{x:e.x*n.width,y:e.y*n.height,name:sH[t]})})),a=e.locationData.relativeBoundingBox,i=0,s=["width","xMax","xMin"];i-1,[4,UT(t.detectorModelUrl,{fromTFHub:n})];case 1:return a=i.sent(),[2,new _H(t.modelType,a,t.maxFaces)]}}))}))}function IH(e,t){return aH(this,void 0,void 0,(function(){var n,a;return iH(this,(function(i){if(e===vH.MediaPipeFaceDetector){if(a=void 0,null!=(n=t)){if("tfjs"===n.runtime)return[2,TH(n)];if("mediapipe"===n.runtime)return[2,lH(n)];a=n.runtime}throw new Error("Expect modelConfig.runtime to be either 'tfjs' or 'mediapipe', but got "+a)}throw new Error(e+" is not a supported model name.")}))}))}function NH(e){return e.width*e.height}function RH(e){var t=e.xCenter-e.width/2,n=t+e.width,a=e.yCenter-e.height/2;return{xMin:t,xMax:n,yMin:a,yMax:a+e.height,width:e.width,height:e.height}}function DH(e){return e instanceof kc?{height:e.shape[0],width:e.shape[1]}:{height:e.height,width:e.width}}function zH(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function OH(e){return e instanceof kc?e:Ep(e)}function MH(e,t){Ns(0!==e.width,(function(){return t+" width cannot be 0."})),Ns(0!==e.height,(function(){return t+" height cannot be 0."}))}function BH(e,t,n){var a=t.outputTensorSize,i=t.keepAspectRatio,s=t.borderMode,r=t.outputTensorFloatRange,o=DH(e),l=function(e,t){return t?{xCenter:t.xCenter*e.width,yCenter:t.yCenter*e.height,width:t.width*e.width,height:t.height*e.height,rotation:t.rotation}:{xCenter:.5*e.width,yCenter:.5*e.height,width:e.width,height:e.height,rotation:0}}(o,n),u=function(e,t,n){if(void 0===n&&(n=!1),!n)return{top:0,left:0,right:0,bottom:0};var a=t.height,i=t.width;MH(t,"targetSize"),MH(e,"roi");var s,r,o=a/i,l=e.height/e.width,u=0,c=0;return o>l?(s=e.width,r=e.width*o,c=(1-l/o)/2):(s=e.height/o,r=e.height,u=(1-o/l)/2),e.width=s,e.height=r,{top:c,left:u,right:u,bottom:c}}(l,a,i),c=function(e,t,n,a){var i=e.width,s=e.height,r=a?-1:1,o=Math.cos(e.rotation),l=Math.sin(e.rotation),u=e.xCenter,c=e.yCenter,h=1/t,d=1/n,p=new Array(16);return p[0]=i*o*r*h,p[1]=-s*l*h,p[2]=0,p[3]=(-.5*i*o*r+.5*s*l+u)*h,p[4]=i*l*r*d,p[5]=s*o*d,p[6]=0,p[7]=(-.5*s*o-.5*i*l*r+c)*d,p[8]=0,p[9]=0,p[10]=i*h,p[11]=0,p[12]=0,p[13]=0,p[14]=0,p[15]=1,function(e){if(16!==e.length)throw new Error("Array length must be 16 but got "+e.length);return[[e[0],e[1],e[2],e[3]],[e[4],e[5],e[6],e[7]],[e[8],e[9],e[10],e[11]],[e[12],e[13],e[14],e[15]]]}(p)}(l,o.width,o.height,!1),h=dh((function(){var t=OH(e),n=Ey(function(e,t,n){return MH(n,"inputResolution"),[1/n.width*e[0][0]*t.width,1/n.height*e[0][1]*t.width,e[0][3]*t.width,1/n.width*e[1][0]*t.height,1/n.height*e[1][1]*t.height,e[1][3]*t.height,0,0]}(c,o,a),[1,8]),i="zero"===s?"constant":"nearest",l=tv.transform(If(kd(t,"float32")),n,"bilinear",i,0,[a.height,a.width]);return null!=r?function(e,t){var n=function(e,t,n,a){var i=(a-n)/255;return{scale:i,offset:n-0*i}}(0,0,t[0],t[1]);return dh((function(){return xd(Ed(e,n.scale),n.offset)}))}(l,r):l}));return{imageTensor:h,padding:u,transformationMatrix:c}}function FH(e){return{xCenter:e.xMin+e.width/2,yCenter:e.yMin+e.height/2,width:e.width,height:e.height}}function LH(e){var t=e.relativeKeypoints;if(t.length<=1)throw new Error("2 or more keypoints required to calculate a rect.");var n=Number.MAX_VALUE,a=Number.MAX_VALUE,i=Number.MIN_VALUE,s=Number.MIN_VALUE;return t.forEach((function(e){n=Math.min(n,e.x),i=Math.max(i,e.x),a=Math.min(a,e.y),s=Math.max(s,e.y)})),{xCenter:(n+i)/2,yCenter:(a+s)/2,width:i-n,height:s-a}}function PH(e,t,n,a,i){var s="rect"===n?function(e,t,n){var a,i=e.locationData;if("boundingbox"===t)a=FH(i.boundingBox);else{a=LH(i);var s=n.width,r=n.height;a.xCenter=Math.round(a.xCenter*s),a.yCenter=Math.round(a.yCenter*r),a.width=Math.round(a.width*s),a.height=Math.round(a.height*r)}return a}(e,t,a):function(e,t){var n=e.locationData;return"boundingbox"===t?FH(n.relativeBoundingBox):LH(n)}(e,t);return i&&(s.rotation=function(e,t,n){var a,i=e.locationData,s=n.rotationVectorStartKeypointIndex,r=n.rotationVectorEndKeypointIndex;a=n.rotationVectorTargetAngle?n.rotationVectorTargetAngle:Math.PI*n.rotationVectorTargetAngleDegree/180;var o=i.relativeKeypoints[s].x*t.width,l=i.relativeKeypoints[s].y*t.height,u=i.relativeKeypoints[r].x*t.width,c=i.relativeKeypoints[r].y*t.height;return zH(a-Math.atan2(-(c-l),u-o))}(e,a,i)),s}function jH(e,t,n){for(var a=0;a1&&(h.y=a?t.inputImageHeight-r[u+1]:r[u+1]),s>2&&(h.z=r[u+2]),s>3&&(h.score=GH(t.visibilityActivation,r[u+3])),o.push(h);for(c=0;c0?i/s:0}(e,t)<=.5}))).push(e)}))})),l=y,[4,Promise.all(l.map((function(e){return f.faceLandmark(e,i)})))];case 4:for(u=g.sent(),c=[],this.prevFaceRectsFromLandmarks=[],h=0;h-1,[4,UT(t.landmarkModelUrl,{fromTFHub:n})];case 1:return a=s.sent(),[4,IH(vH.MediaPipeFaceDetector,{modelType:"short",maxFaces:t.maxFaces,detectorModelUrl:t.detectorModelUrl,runtime:t.runtime})];case 2:return i=s.sent(),[2,new lK(i,a,t.maxFaces,t.refineLandmarks)]}}))}))}(KH||(KH={})).MediaPipeFaceMesh="MediaPipeFaceMesh";Object.freeze({__proto__:null,getKeypointIndexByContour:function(e){if(e===KH.MediaPipeFaceMesh)return Hq;throw new Error("Model "+e+" is not supported.")},getAdjacentPairs:function(e){if(e===KH.MediaPipeFaceMesh)return Kq;throw new Error("Model "+e+" is not supported.")}});const cK=(e,t,n,a)=>1===a?.5*(e+t):e+(t-e)*n/(a-1),hK={applyExponentialOnBoxSize:!1,flipVertically:!1,ignoreClasses:[],numClasses:1,numBoxes:2304,numCoords:16,boxCoordOffset:0,keypointCoordOffset:4,numKeypoints:6,numValuesPerKeypoint:2,sigmoidScore:!0,scoreClippingThresh:100,reverseOutputOrder:!0,xScale:192,yScale:192,hScale:192,wScale:192,minScoreThresh:.6},dK={reduceBoxesInLowestLayer:!1,interpolatedScaleAspectRatio:0,featureMapHeight:[],featureMapWidth:[],numLayers:1,minScale:.1484375,maxScale:.75,inputSizeHeight:192,inputSizeWidth:192,anchorOffsetX:.5,anchorOffsetY:.5,strides:[4],aspectRatios:[1],fixedAnchorSize:!0},pK={outputTensorSize:{width:192,height:192},keepAspectRatio:!0,outputTensorFloatRange:[-1,1],borderMode:"zero"},mK=e=>{e.detector.imageToTensorConfig=pK,e.detector.tensorsToDetectionConfig=hK,e.detector.anchors=(e=>{null===e.reduceBoxesInLowestLayer&&(e.reduceBoxesInLowestLayer=!1),null===e.interpolatedScaleAspectRatio&&(e.interpolatedScaleAspectRatio=1),null===e.fixedAnchorSize&&(e.fixedAnchorSize=!1);const t=[];let n=0;for(;n0){const n=o===e.strides.length-1?1:cK(e.minScale,e.maxScale,o+1,e.strides.length);r.push(Math.sqrt(t*n)),s.push(e.interpolatedScaleAspectRatio)}}o++}for(let e=0;e0)l=e.featureMapHeight[n],u=e.featureMapWidth[n];else{const t=e.strides[n];l=Math.ceil(e.inputSizeHeight/t),u=Math.ceil(e.inputSizeWidth/t)}for(let n=0;ne.width))),n=Sy(e.detector.anchors.map((e=>e.height))),a=Sy(e.detector.anchors.map((e=>e.xCenter))),i=Sy(e.detector.anchors.map((e=>e.yCenter)));e.detector.anchorTensor={x:a,y:i,w:t,h:n}},fK=()=>navigator.onLine,gK=function(){this.model=function(e,t){return Wq(this,void 0,void 0,(function(){var n,a;return Gq(this,(function(i){if(e===KH.MediaPipeFaceMesh){if(a=void 0,null!=(n=t)){if("tfjs"===n.runtime)return[2,uK(n)];if("mediapipe"===n.runtime)return[2,Jq(n)];a=n.runtime}throw new Error("Expect modelConfig.runtime to be either 'tfjs' or 'mediapipe', but got "+a)}throw new Error(e+" is not a supported model name.")}))}))}(KH.MediaPipeFaceMesh,{runtime:"tfjs",detectorModelUrl:fK()?"https://tfhub.dev/mediapipe/tfjs-model/face_detection/full/1":"./models/detector/model.json",landmarkModelUrl:fK()?void 0:"./models/landmark/model.json"}),this.predictionReady=!1,this.modelLoaded=!1},yK={current:!1,resolves:[]};gK.prototype.loadModel=async function(){if(!this.modelLoaded){if(yK.current){const e=new Promise((e=>{yK.resolves.push(e)}));return await e}yK.current=!0;try{this.model=await this.model,mK(this.model),this.modelLoaded=!0,yK.resolves.forEach((e=>e()))}finally{yK.current=!1,yK.resolves=[]}}},gK.prototype.positionsArray=null,gK.prototype.getEyePatches=async function(e,t,n,a){if(0===t.width)return null;const i=this.model,s=await i.estimateFaces(t,{flipHorizontal:!1});if(0===s.length)return!1;this.positionsArray=s[0].keypoints;const r=s[0],[o,l]=[{eyeTopArc:[466,388,387,386,385,384,398].map((e=>r.keypoints[e])),eyeBottomArc:[263,249,390,373,374,380,381,382,362].map((e=>r.keypoints[e]))},{eyeTopArc:[246,161,160,159,158,157,173].map((e=>r.keypoints[e])),eyeBottomArc:[33,7,163,144,145,153,154,155,133].map((e=>r.keypoints[e]))}].map((({eyeTopArc:e,eyeBottomArc:t})=>{const n={x:Math.round(Math.min(...e.map((e=>e.x)))),y:Math.round(Math.min(...e.map((e=>e.y))))},a=Math.round(Math.max(...t.map((e=>e.x)))),i=Math.round(Math.max(...t.map((e=>e.y))));return{origin:n,width:a-n.x,height:i-n.y}}));var u=o.origin.x,c=o.origin.y,h=o.width,d=o.height,p=l.origin.x,m=l.origin.y,f=l.width,g=l.height;if(0===h||0===f)return null;if(0===d||0===g)return null;var y={},b=t.getContext("2d").getImageData(u,c,h,d);y.left={patch:b,imagex:u,imagey:c,width:h,height:d};var v=t.getContext("2d").getImageData(p,m,f,g);return y.right={patch:v,imagex:p,imagey:m,width:f,height:g},this.predictionReady=!0,y},gK.prototype.getPositions=function(){return this.positionsArray},gK.prototype.reset=function(){},gK.prototype.drawFaceOverlay=function(e,t){if(t){e.fillStyle="#32EEDB",e.strokeStyle="#32EEDB",e.lineWidth=.5;for(let n=0;nn?n:e}vK.Eye=function(e,t,n,a,i){this.patch=e,this.imagex=t,this.imagey=n,this.width=a,this.height=i},vK.getEyeFeats=function(e){var t=this.resizeEye(e.left,10,6),n=this.resizeEye(e.right,10,6),a=this.grayscale(t.data,t.width,t.height),i=this.grayscale(n.data,n.width,n.height),s=[];this.equalizeHistogram(a,5,s);var r=[];return this.equalizeHistogram(i,5,r),s.concat(r)},vK.DataWindow=function(e,t){this.data=[],this.windowSize=e,this.index=0,this.length=0,t&&(this.data=t.slice(t.length-e,t.length),this.length=this.data.length)},vK.DataWindow.prototype.push=function(e){return this.data.length>2),i=0,s=0,r=0;rt?255:0;return e},vK.correlation=function(e,t){const n=Math.min(e.length,t.length);let a=0;for(let i=0;iAK(e,t,((e,t)=>e+t)),sub:(e,t)=>AK(e,t,((e,t)=>e-t)),inv:e=>xK.solve(e,xK.identity(e.length,e[0].length)),identity(e,t=e){const n=new Array(e);for(let a=0;ae.length===e[0].length?xK.LUDecomposition(e,t):xK.QRDecomposition(e,t),LUDecomposition(e,t){for(var n=new Array(e.length),a=0;aMath.abs(c[m])&&(m=a);if(m!=i){for(p=0;p=0;p--){for(i=0;i=0;u--){for(i=0;i=0;n--){var a=this.screenXTrailArray.get(n),i=this.screenYTrailArray.get(n);if(Math.sqrt(Math.pow(a-e,2)+Math.pow(i-t,2))>72)return n+1}return n},SK.addData=function(e,t,n){e&&("click"===n?(this.screenXClicksArray.push([t[0]]),this.screenYClicksArray.push([t[1]]),this.eyeFeaturesClicks.push(wK.getEyeFeats(e)),this.dataClicks.push({eyes:e,screenPos:t,type:n})):"move"===n&&(this.screenXTrailArray.push([t[0]]),this.screenYTrailArray.push([t[1]]),this.eyeFeaturesTrail.push(wK.getEyeFeats(e)),this.trailTimes.push(performance.now()),this.dataTrail.push({eyes:e,screenPos:t,type:n})))};const EK=SK,_K={RidgeReg:function(){this.init()}};_K.RidgeReg.prototype.init=EK.InitRegression,_K.RidgeReg.prototype.addData=EK.addData,_K.RidgeReg.prototype.predict=function(e){if(!e||0===this.eyeFeaturesClicks.length)return null;for(var t=performance.now()-this.trailTime,n=[],a=[],i=[],s=0;st&&(n.push(this.screenXTrailArray.get(s)),a.push(this.screenYTrailArray.get(s)),i.push(this.eyeFeaturesTrail.get(s)));var r=this.screenXClicksArray.data.concat(n),o=this.screenYClicksArray.data.concat(a),l=this.eyeFeaturesClicks.data.concat(i),u=EK.ridge(r,l,this.ridgeParameter),c=EK.ridge(o,l,this.ridgeParameter),h=wK.getEyeFeats(e),d=0;for(s=0;st&&(n.push(this.screenXTrailArray.get(s)),a.push(this.screenYTrailArray.get(s)),i.push(this.eyeFeaturesTrail.get(s)));var r=this.eyeFeaturesClicks.data.length,o=Array(r),l=Array(r),u=Array(r);for(s=0;ssetTimeout(t,e)))}function BK(e,t){let n=Math.pow(10,t);return Math.round(e*n)/n}const FK={tracker:{}};FK.tracker.TFFaceMesh=bK,FK.reg=TK,FK.reg.RidgeWeightedReg=NK.RidgeWeightedReg,FK.reg.RidgeRegThreaded=OK.RidgeRegThreaded,FK.util=wK,FK.params=Lq;var LK=null,PK=null,jK=null,VK=null,UK=null,WK=null,GK=null,qK=!1,HK=new Array(50),KK=new Array(50),$K=(performance.now(),null),ZK=null;FK.params.paused=!1,FK.params.greedyLearner=!1,FK.params.framerate=60,FK.params.showGazeDot=!1,FK.params.getLatestVideoFrameTimestamp=()=>{},FK.params.activeCamera={label:"",id:""};let XK=[];var YK=function(e){},QK=YK,JK=["click","move"],e$=performance.now(),t$=new FK.tracker.TFFaceMesh,n$=[new FK.reg.RidgeReg],a$={TFFacemesh:function(){return new FK.tracker.TFFaceMesh}},i$={ridge:function(){return new FK.reg.RidgeReg},weightedRidge:function(){return new FK.reg.RidgeWeightedReg},threadedRidge:function(){return new FK.reg.RidgeRegThreaded}},s$="webgazerGlobalData",r$="webgazerGlobalSettings",o$={},l$=[];let u$,c$,h$,d$,p$,m$,f$,g$,y$,b$,v$,k$;FK.computeValidationBoxSize=function(){var e=jK.videoWidth,t=jK.videoHeight,n=parseInt(jK.style.width),a=parseInt(jK.style.height),i=Math.min(e,t),s=e==Math.max(e,t)?n/e:a/t,r=i*FK.params.faceFeedbackBoxRatio*s;return[(a-r)/2,(n-r)/2,r,r]};let w$=!1,A$=!1;function x$(){null!==WK&&$K?(w$||A$||(A$=!0,setTimeout((()=>{u$=jK.videoWidth,c$=jK.videoHeight,h$=Math.min(u$,c$),d$=h$*FK.params.faceFeedbackBoxRatio,p$=(c$-d$)/2,m$=(u$-d$)/2,f$=m$+d$,g$=p$+d$,w$=!0,A$=!1}),500)),y$=u$-$K.left.imagex,v$=u$-$K.right.imagex,b$=$K.left.imagey,k$=$K.right.imagey,WK.style.border=w$&&y$>m$&&y$m$&&v$p$&&b$p$&&k$=1e3/FK.params.framerate&&(N$=I$,ZK=E$(),ZK=await ZK,QK(ZK),R$=!0,ZK)){_$.push(ZK);var e=0,t=0,n=_$.length;for(var a in _$.data)e+=_$.get(a).x,t+=_$.get(a).y;var i=wK.bound({x:e/n,y:t/n});FK.params.storingPoints&&(FK.storePoints(i.x,i.y,T$),50==++T$&&(T$=0)),GK.style.opacity="",GK.style.left=`${i.x}px`,GK.style.top=`${i.y}px`}requestAnimationFrame(z$)}var O$=function(e,t,n){if(!FK.params.paused){if(0===n$.length)return null;for(var a in n$)$K&&n$[a].addData($K,[e,t],n)}},M$=async function(e){O$(e.clientX,e.clientY,JK[0]),FK.params.saveDataAcrossSessions&&await async function(){var e=n$[0].getData()||l$;jq().setItem(r$,o$),jq().setItem(s$,e)}()},B$=function(e){if(!FK.params.paused){var t=performance.now();tFK.params.activeCamera.id?{video:{...e.video,deviceId:FK.params.activeCamera.id}}:e;function V$(e){navigator.vendor&&navigator.vendor.indexOf("Apple")>-1?(e.style.opacity=FK.params.showVideo?"1":"0",e.style.display="block"):e.style.display=FK.params.showVideo?"block":"none"}FK._begin=function(e,t){if(!FK.params.videoIsOn)return void 0===navigator.mediaDevices&&(navigator.mediaDevices={}),void 0===navigator.mediaDevices.getUserMedia&&(navigator.mediaDevices.getUserMedia=function(e){var t=navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return t?new Promise((function(n,a){t.call(navigator,e,n,a)})):Promise.reject(new Error("Unfortunately, your browser does not support access to the webcam through the getUserMedia API. Try to use the latest version of Google Chrome, Mozilla Firefox, Opera, or Microsoft Edge instead."))}),new Promise((async(n,a)=>{let i;try{if(void 0!==navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.enumerateDevices){const a=await navigator.mediaDevices.enumerateDevices();if((e=>{let t,n;XK=[],e.forEach((e=>{"videoinput"===e.kind&&XK.push(e),e.label.includes("FaceTime")&&(t=e.label,n=e.deviceId)})),XK.length&&(FK.params.activeCamera.label=t||XK[0].label,FK.params.activeCamera.id=n||XK[0].deviceId)})(a),0===XK.length)throw t(XK),JSON.stringify({message:"We can't find any video input devices.",devices:a});try{i=await navigator.mediaDevices.getUserMedia(j$(FK.params.camConstraints))}catch(e){throw t(XK),e}P$(e?"video":"all",i).then((()=>{XK.length>1&&(e=>{const t=PK,n=document.createElement("select");n.className=n.id="webgazer-videoinput-select",n.name="videoinput",e.forEach(((e,t)=>{var a;n.innerHTML+=``})),n.onchange=e=>{const[t,a]=n.value.split("%");FK.params.activeCamera.label=a,FK.params.activeCamera.id=t,FK.setCameraConstraints(j$(FK.params.camConstraints))},t.appendChild(n)})(XK)})),FK.params.videoIsOn=!0,e||n(FK)}else t([])}catch(e){throw jK=null,i=null,t([]),a(e),JSON.stringify({error:e,devices:await navigator.mediaDevices.enumerateDevices()})}}));P$("gaze")},FK.isReady=function(){return null!==VK&&VK.width>0},FK.pause=function(){return FK.params.paused=!0,FK},FK.stopLearning=function(e){return L$(e),FK},FK.startLearning=function(e){return F$(e),FK},FK.resume=async function(){return FK.params.paused?(FK.params.paused=!1,R$=!0,U$.current&&(clearInterval(U$.current),U$.current=void 0,qK=!1,GK.style.backgroundColor="",GK.style.opacity=""),await z$(),FK):FK},FK.end=function(e=!1){return e&&(_$=new wK.DataWindow(4),T$=0,I$=null,N$=-1,w$=!1,FK.params.videoIsOn=!1,setTimeout((()=>{FK.stopVideo(),PK.remove()}),500)),FK},FK.stopVideo=function(){return LK.getTracks()[0].stop(),FK},FK.detectCompatibility=function(){return void 0!==(navigator.mediaDevices.getUserMedia||navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia)},FK.showVideoPreview=function(e){return FK.params.showVideoPreview=e,FK.showVideo(e&&FK.params.showVideo),FK.showFaceOverlay(e&&FK.params.showFaceOverlay),FK.showFaceFeedbackBox(e&&FK.params.showFaceFeedbackBox),FK},FK.showVideo=function(e,t=.8){return FK.params.showVideo=e,jK&&V$(jK),PK&&V$(PK),FK},FK.showFaceOverlay=function(e){return FK.params.showFaceOverlay=e,UK&&(UK.style.display=e?"block":"none"),FK},FK.showFaceFeedbackBox=function(e){return FK.params.showFaceFeedbackBox=e,WK&&(WK.style.display=e?"block":"none"),FK},FK.showPredictionPoints=function(e){return FK.params.showGazeDot=e,GK&&(GK.style.display=e?"block":"none"),FK};const U$={current:void 0};function W$(e,t){VK&&(VK.width=e,VK.height=t),UK&&(UK.width=e,UK.height=t)}FK.popPredictionPoints=function(){return U$.current&&(clearInterval(U$.current),U$.current=void 0,qK=!1),GK&&FK.params.showGazeDot&&(qK=!0,GK.style.backgroundColor="red",GK.style.opacity=1,U$.current=setInterval((()=>{GK.style.opacity-=.02,GK.style.opacity<=.02&&(clearInterval(U$.current),U$.current=void 0,qK=!1,GK.style.backgroundColor="",GK.style.opacity="")}),50)),FK},FK.saveDataAcrossSessions=function(e){return FK.params.saveDataAcrossSessions=e,FK},FK.applyKalmanFilter=function(e){return FK.params.applyKalmanFilter=e,FK},FK.setCameraConstraints=async function(e){if(FK.params.camConstraints=e,LK){FK.pause();try{LK.getVideoTracks().forEach((e=>{e.stop()}));const e=await navigator.mediaDevices.getUserMedia(FK.params.camConstraints);setTimeout((()=>{const t=e.getVideoTracks()[0].getSettings();LK=e,jK.srcObject=e,W$(t.width,t.height)}),1500)}catch(e){return}await FK.resume()}},FK.setStaticVideo=function(e){return e,FK},FK.setVideoViewerSize=function(e,t){FK.params.videoViewerWidth=e,FK.params.videoViewerHeight=t,jK.style.width=e+"px",jK.style.height=t+"px",PK.style.width=e+"px",PK.style.height=t+"px",UK.style.width=e+"px",UK.style.height=t+"px";var n=FK.computeValidationBoxSize();WK.style.top=n[0]+"px",WK.style.left=n[1]+"px",WK.style.width=n[2]+"px",WK.style.height=n[3]+"px"},FK.addMouseEventListeners=function(){return F$(),FK},FK.removeMouseEventListeners=function(){return L$(),FK},FK.recordScreenPosition=function(e,t,n){return O$(e,t,n||JK[0]),FK},FK.storePoints=function(e,t,n){HK[n]=e,KK[n]=t},FK.setTracker=function(e){if(void 0===a$[e]){for(var t in a$);return FK}return t$=a$[e](),FK},FK.setRegression=function(e){if(void 0===i$[e]){for(var t in i$);return FK}return l$=n$[0].getData(),(n$=[i$[e]()])[0].setData(l$),FK},FK.addTrackerModule=function(e,t){a$[e]=function(){return new t}},FK.addRegressionModule=function(e,t){i$[e]=function(){return new t}},FK.addRegression=function(e){var t=i$[e]();return l$=n$[0].getData(),t.setData(l$),n$.push(t),FK},FK.setGazeListener=function(e){return QK=e,FK},FK.clearGazeListener=function(){return QK=YK,FK},FK.setVideoElementCanvas=function(e){return VK=e},FK.clearData=async function(){!function(){for(var e in jq().clear(),n$)n$[e].init()}()},FK.getTracker=function(){return t$},FK.getRegression=function(){return n$},FK.getCurrentPrediction=async function(e=0,t=150,n=5){let a=0;const i=[],s=[];for(let e=0;et.x>=0&&t.x<=window.innerWidth?e+t.x:e),0)/s.length),l=Math.round(s.reduce(((e,t)=>t.y>=0&&t.y<=window.innerHeight?e+t.y:e),0)/s.length);return GK&&(GK.style.left=`${o}px`,GK.style.top=`${l}px`),{x:o,y:l,raw:s.map((e=>({x:BK(e.x,0),y:BK(e.y,0)})))}},FK.params.getEventTypes=function(){return JK.slice()},FK.getVideoElementCanvas=function(){return VK},FK.getVideoPreviewToCameraResolutionRatio=function(){return[FK.params.videoViewerWidth/jK.videoWidth,FK.params.videoViewerHeight/jK.videoHeight]},FK.getStoredPoints=function(){return[HK,KK]};const G$=FK;class q${constructor(e){this.calibrator=e,this.webgazer=G$,this.defaultGazeCallback=null,this.defaultDistanceTrackCallback=null,this._initialized={distance:!1,gaze:!1},this._learning=!0,this._running={distance:!1,gaze:!1},this._runningVideo=!1,this._toFixedN=1}begin({pipWidthPx:e},t){this.checkInitialized("gaze",!0)&&(this._running.gaze||(this.webgazer.begin(this.videoFailed.bind(this)),this._running.gaze=!0,this._runningVideo=!0),bi(this.calibrator,e,this.calibrator.params.videoOpacity,this.webgazer,t))}beginVideo({pipWidthPx:e},t){this.checkInitialized("distance",!0)&&(this._runningVideo||(this.webgazer.beginVideo(this.videoFailed.bind(this)),this._runningVideo=!0),bi(this.calibrator,e,this.calibrator.params.videoOpacity,this.webgazer,t))}videoFailed(e){const t=Ga(this.calibrator,{showIcon:!0});Ba.fire({...t,icon:"error",iconColor:this.calibrator._CONST.COLOR.DARK_RED,showConfirmButton:!1,html:e.length?U.H.RC_errorCameraUseDenied[this.calibrator.L]:U.H.RC_errorNoCamera[this.calibrator.L]})}attachNewCallback(e){this.checkInitialized("gaze",!0)&&this.webgazer.setGazeListener((t=>{if(t){const n=this.getData(t);this.calibrator.newGazePositionData=n,(0,_.nB)(e,n)}}))}async getGazeNow(e={},t=void 0){const n=Object.assign({wait:0,frames:5},e),a=this.getData(await this.webgazer.getCurrentPrediction(0,n.wait,n.frames));return this.calibrator.newGazePositionData=a,this.webgazer.popPredictionPoints(),(0,_.nB)(t,a),a}end(){this.webgazer.end()}}q$.prototype._init=function({greedyLearner:e,framerate:t,toFixedN:n,showVideo:a,showFaceOverlay:i,showGazer:s},r){this.checkInitialized(r)||("gaze"===r&&(this.webgazer.params.greedyLearner=e,this.webgazer.params.framerate=t,this.webgazer.params.getLatestVideoFrameTimestamp=this._getLatestVideoTimestamp.bind(this),this.showGazer(s)),this._toFixedN=n,this.showVideo(a),this.showFaceOverlay(i),this._initialized[r]=!0)},q$.prototype.checkInitialized=function(e,t=!1){return!!(""===e?this._initialized.gaze||this._initialized.distance:this._initialized[e])},q$.prototype.getData=function(e){const t=performance.now();return{value:{x:(0,_.Nh)(e.x,this._toFixedN),y:(0,_.Nh)(e.y,this._toFixedN),latencyMs:t-this.calibrator._trackingVideoFrameTimestamps.gaze},timestamp:t,raw:e.raw?e.raw:void 0}},q$.prototype.pause=function(){this.webgazer.pause()},q$.prototype.resume=function(){this.webgazer.resume()},q$.prototype.end=function(e,t=!1){if(!this.checkInitialized(e,!0))return;const n=t||!this._initialized.gaze||!this._initialized.distance;"gaze"===e?(this._endGaze(),n&&this.checkInitialized("distance")&&this.calibrator.endDistance(!1,!1),this.calibrator._trackingVideoFrameTimestamps.gaze=0):(this.defaultDistanceTrackCallback=null,n&&this.checkInitialized("gaze")&&this._endGaze()),n?(this._initialized={distance:!1,gaze:!1},this._running={distance:!1,gaze:!1},this.webgazer.end(!0),this._runningVideo=!1):(this._initialized[e]=!1,this._running[e]=!1)},q$.prototype._endGaze=function(){this.webgazer.params.paused=!0,this._learning=!0,this.defaultGazeCallback=null,this.webgazer.clearData(),this.webgazer.params.greedyLearner=!1,this.webgazer.params.framerate=60,this.webgazer.params.getLatestVideoFrameTimestamp=()=>{}},q$.prototype._getLatestVideoTimestamp=function(e){this.calibrator._trackingVideoFrameTimestamps.gaze=e},q$.prototype.startStoringPoints=function(){this.webgazer.params.storingPoints=!0},q$.prototype.stopStoringPoints=function(){this.webgazer.params.storingPoints=!1},q$.prototype.startLearning=function(e){this._learning||(this.webgazer.startLearning(e),this._learning=!0)},q$.prototype.stopLearning=function(e){this._learning&&(this.webgazer.stopLearning(e),this._learning=!1)},q$.prototype.showGazer=function(e){this.webgazer.showPredictionPoints(e)},q$.prototype.showVideo=function(e){this.webgazer.showVideo(e,this.calibrator._params.videoOpacity)},q$.prototype.showFaceOverlay=function(e){this.webgazer.showFaceOverlay(e)},E.A.prototype.performanceCompute=async function(e,t=!1){if(!this.checkInitialized())return;const n=performance.now(),a={_useless:void 0,time:0,randomTime:0};for(;performance.now()-n<500;)a._useless=Array(5e3).fill(Math.floor(10*Math.random())),a.time++;const i=performance.now();for(a._useless=0;performance.now()-i<500;)a._useless+=Math.random(),a.randomTime++;const s={value:{computeArrayFillMHz:(0,_.Nh)(2*a.time/1e6,3),computeRandomMHz:(0,_.Nh)(2*a.randomTime/1e6,3),idealFps:void 0,stressFps:void 0},timestamp:performance.now()};return t||(this.newPerformanceData=s),(0,_.nB)(e,s),s},E.A.prototype.performance=async function(e={},t=void 0){if(!this.checkInitialized())return;const n=Object.assign({testComputation:!0,testFrameCount:180,testObjectCount:1e4,headline:`🚀 ${U.H.RC_performanceTitle[this.L]}`,description:U.H.RC_performanceIntro[this.L]},e);this._addBackground(),this._addBackgroundText(n.headline,n.description),await(0,_.yy)(200);const a=n.testComputation?await this.performanceCompute(null,!0):{value:{computeArrayFillMHz:void 0,computeRandomMHz:void 0}},i=document.createElement("canvas"),s=i.getContext("2d");i.width=window.innerWidth,i.height=window.innerHeight,this.background.appendChild(i);const r=await H$(s),o=await K$(s,n.testFrameCount,n.testObjectCount),l={value:{computeArrayFillMHz:a.value.computeArrayFillMHz,computeRandomMHz:a.value.computeRandomMHz,idealFps:Math.round(6e4/(r.end-r.start)),stressFps:Math.round(1e3*n.testFrameCount/(o.end-o.start))},timestamp:performance.now()};return this.newPerformanceData=l,this._removeBackground(),(0,_.nB)(t,l),l};const H$=()=>{let e=60;const t=performance.now();return new Promise((n=>{const a=()=>{e--,e>0?requestAnimationFrame(a):n({start:t,end:performance.now()})};requestAnimationFrame(a)}))},K$=async(e,t,n)=>{let a=t;const i=[],s=["#000000","#333333","#999999"];for(let e=0;e{const n=()=>{e.clearRect(0,0,window.innerWidth,window.innerHeight),e.beginPath();for(const t of i)t.move(),t.draw(e);a--,a>0?requestAnimationFrame(n):t({start:r,end:performance.now()})};requestAnimationFrame(n)}))};class $${constructor(e){this.w=(0,_.Av)(20,70),this.h=(0,_.Av)(30,70),this.x=-this.w+Math.random()*window.innerWidth,this.y=-this.h/2+Math.random()*(window.innerHeight+this.h/2),this.speed=(0,_.Av)(1,5),this.stroke=e[Math.floor(Math.random()*e.length)]}move(){this.x+=this.speed+.5*Math.random(),this.x>window.innerWidth&&(this.x=-this.w)}draw(e){e.strokeStyle=this.stroke,e.fillRect(this.x,this.y,this.w,this.h),e.strokeRect(this.x,this.y,this.w,this.h)}}E.A.prototype.getEquipment=async function(e,t=!1,n="original"){if(this.equipment&&!t)return(0,_.nB)(e);let a,i,s,r,o,l;if(this._replaceBackground(),"original"===n){const{CM:e,IN_D:t,IN_F:n}=this._CONST.UNITS;a="Do you have a ruler or tape measure?",i="Ideally, it should be long enough to measure your viewing distance, but even a 6 inch (15 cm) ruler can be useful. Please select the units you'll use, or indicate that no ruler or tape measure is available.",s="select",r={[e]:"centimeter",[t]:"inch (decimal, e.g. 11.5 in)",[n]:"inch (fractional, e.g. 12 3/8 in)",none:"No ruler or tape measure is available"},o="Select an option",l=void 0}else a=Wa.RC_TestDistances[this.language.value].replace(/(?:\r\n|\r|\n)/g,"
      "),i=Wa.RC_rulerUnit[this.language.value].replace(/(?:\r\n|\r|\n)/g,"
      "),s="radio",r={inches:"inches",cm:"cm",none:"None"},o=void 0,l="none";const{value:u}=await Ba.fire({...Ga(this,{showIcon:!1}),title:a,html:i,input:s,inputOptions:r,inputPlaceholder:o,inputValue:l,inputValidator:e=>new Promise((t=>{e?.length||t("Please select an option."),this.rulerUnits=e,t()}))});if(!u)return;const c="none"!==u,h={value:{has:c,unit:c?u:null,equipment:c?"":null,length:c?"":null},timestamp:performance.now()};return"original"!==n&&c?await Z$(this,h):this.newEquipmentData=h,(0,_.nB)(e)};const Z$=async(e,t)=>{const{value:n}=await Ba.fire({...Ga(e,{showIcon:!1}),title:Wa.RC_howLong[e.language.value].replace("AAA",t.value.unit),input:"number",inputAttributes:{min:0,step:1},inputPlaceholder:"",inputValidator:n=>new Promise((a=>{(!n?.length||isNaN(n)||parseInt(n)<=0)&&a("Please provide a number for the length of your ruler or tape measure."),e.rulerLength=n,t.value.length=n,e.newEquipmentData=t,a()}))});return n};var X$=__webpack_require__(2016),Y$=__webpack_require__(980),Q$=__webpack_require__.n(Y$),J$=__webpack_require__(3890),eZ=__webpack_require__.n(J$);E.A.prototype._checkScreenSize=async function(e,t,n){await this.getEquipment((()=>{tZ(this,e,t,n)}))};const tZ=async(e,t,n,a)=>{if(e.equipment?.value?.has){e._replaceBackground((0,_.$O)("📏 Measure the Length of the Arrow",'Use your ruler (or tape measure) to measure the length of the arrow. Type your numerical answer into the box. Just digits, period, decimal comma, and / (forward slash) for fractional inches. Then click OK or hit RETURN.'));const t=t=>[()=>{const n=document.createElement("div");e.background.appendChild(n),n.outerHTML=t},()=>{for(const t of e.background.getElementsByClassName("arrow-two-sided-svg"))t.remove()},{callback:()=>{},content:"Ruler is too short"}],n=await(0,X$.K)(e,...t(Q$())),i=await(0,X$.K)(e,...t(eZ())),s={};if(n){const t=n.value,a=e.windowWidthPx.value,i=(0,_.Nh)(2.54*a/e.screenPpi.value,1);s.horizontal={...t,calibratorArrowWidthCm:i,arrowWidthPx:a}}if(i){const t=i.value,n=e.windowHeightPx.value,a=(0,_.Nh)(2.54*n/e.screenPpi.value,1);s.vertical={...t,calibratorArrowHeightCm:a,arrowHeightPx:n}}if(s.vertical||s.horizontal){const t={value:s,timestamp:n?n.timestamp:i.timestamp,measure:"screenSize"};e.newCheckData=t,(0,_.nB)(a,t)}}e._removeBackground(),(0,_.nB)(t,n)};E.A.prototype._checkDistance=async function(e,t,n,a,i=[],s=(()=>{})){await this.getEquipment((()=>{}),!1,"new"),await nZ(this,e,t,n,a,i,s)};const nZ=async(e,t,n,a,i,s,r)=>{const o="trackDistance"===a,l=()=>{e._removeBackground(),o||(0,_.nB)(t,n,!1),r()};if(o&&(0,_.nB)(t,n,!1),e.equipment?.value?.has){if("inches"===e.equipment?.value?.unit&&(s=s.map((e=>Math.round(e/2.54)))),0===(s=s.filter((t=>t>0&&t<=e.equipment?.value?.length))).length)return void l();e._removeBackground(),e.pauseNudger(),rZ(),aZ(),e.calibrateTrackDistanceRequestedCm=s.map((t=>"inches"===e.equipment?.value?.unit?Math.round(2.54*t):t)),e.calibrateTrackDistanceMeasuredCm=[];for(let t of s){const n=s.indexOf(t)+1;oZ(n/s.length*100,n,s.length),sZ(t,e.equipment?.value?.unit);const a=(0,_.$O)(Wa.RC_produceDistanceTitle[e.language.value].replace("222",n).replace("333",s.length),Wa.RC_produceDistance[e.language.value].replace("111",t).replace("AAA",e.equipment?.value?.unit).replace(/(?:\r\n|\r|\n)/g,"

      "),!1,"","left");e._replaceBackground(a),await new Promise((t=>{document.addEventListener("keydown",(function n(a){if("Enter"===a.key){const a=e.viewingDistanceAllowedPreciseBool?e.viewingDistanceCm.value.toFixed(1):Math.round(e.viewingDistanceCm.value);e.calibrateTrackDistanceMeasuredCm.push(a),document.removeEventListener("keydown",n),t()}}));const n=W(null,e.keypadHandler,(()=>{const a=e.viewingDistanceAllowedPreciseBool?e.viewingDistanceCm.value.toFixed(1):Math.round(e.viewingDistanceCm.value);e.calibrateTrackDistanceMeasuredCm.push(a),n(),t()}),!1,["return"])}))}e.resumeNudger(),lZ(),iZ()}l()},aZ=()=>{if(document.getElementById("viewing-distance-div"))return;const e=document.createElement("viewing-distance-div");e.id="calibration-trackDistance-check-viewingDistance-container",e.className="calibration-trackDistance-check-viewingDistance-container";const t=document.createElement("p");t.id="viewing-distance-p",t.className="calibration-trackDistance-check-viewingDistance";const n=document.createElement("p");n.id="calibration-trackDistance-check-viewingDistance-units",n.className="calibration-trackDistance-check-viewingDistance-units",e.appendChild(t),e.appendChild(n),document.body.appendChild(e)},iZ=()=>{const e=document.getElementById("viewing-distance-p");e&&document.body.removeChild(e);const t=document.getElementById("calibration-trackDistance-check-viewingDistance-units");t&&document.body.removeChild(t);const n=document.getElementById("calibration-trackDistance-check-viewingDistance-container");n&&document.body.removeChild(n)},sZ=(e,t)=>{const n=document.getElementById("viewing-distance-p");if(!n)return;n.innerText=e;const a=document.getElementById("calibration-trackDistance-check-viewingDistance-units");a&&(a.innerText=t)},rZ=()=>{if(document.getElementById("custom-progress-bar"))return;const e=document.createElement("div");e.id="custom-progress-bar",e.className="calibration-trackDistance-check-progessBar-container";const t=document.createElement("div");t.id="calibration-trackDistance-check-progessBar",t.className="calibration-trackDistance-check-progessBar";const n=document.createElement("p");n.id="calibration-trackDistance-check-progessBar-text",n.className="calibration-trackDistance-check-progessBar-text",e.appendChild(t),e.appendChild(n),document.body.appendChild(e)},oZ=(e,t,n)=>{const a=document.getElementById("calibration-trackDistance-check-progessBar"),i=document.getElementById("calibration-trackDistance-check-progessBar-text");if(!a||!i)return;const s=Math.min(100,Math.max(0,e));a.style.width=`${s}%`,i.innerText=`${t} of ${n}`},lZ=()=>{const e=document.getElementById("custom-progress-bar");e&&document.body.removeChild(e)};var uZ=__webpack_require__(7790),cZ=__webpack_require__(627),hZ=__webpack_require__.n(cZ),dZ=__webpack_require__(8110),pZ=__webpack_require__.n(dZ),mZ=__webpack_require__(5072),fZ=__webpack_require__.n(mZ),gZ=__webpack_require__(7825),yZ=__webpack_require__.n(gZ),bZ=__webpack_require__(7659),vZ=__webpack_require__.n(bZ),kZ=__webpack_require__(5056),wZ=__webpack_require__.n(kZ),AZ=__webpack_require__(540),xZ=__webpack_require__.n(AZ),CZ=__webpack_require__(1113),SZ=__webpack_require__.n(CZ),EZ=__webpack_require__(4636),_Z={};_Z.styleTagTransform=SZ(),_Z.setAttributes=wZ(),_Z.insert=vZ().bind(null,"head"),_Z.domAPI=yZ(),_Z.insertStyleElement=xZ();fZ()(EZ.A,_Z);EZ.A&&EZ.A.locals&&EZ.A.locals;E.A.prototype.removePanel=function(){return!!this._panelStatus.hasPanel&&(this._panel.panelObserver.unobserve(this._panel.panel),this._panel.panel.remove(),this._panel.panel=null,this._panel.panelObserver=null,this._panel.panelTasks=[],this._panel.panelParent=null,this._panel.panelOptions={},this._panel.panelCallback=null,this._panel.panelResolve=null,this._panelStatus.hasPanel=!1,this._panelStatus.panelFinished=!1,LZ(this),!0)},E.A.prototype.resetPanel=function(e=null,t=null,n=null,a=null,i=null){if(!this._panelStatus.hasPanel)return!1;const s=e||[...this._panel.panelTasks],r=n||{...this._panel.panelOptions},o=a&&"function"==typeof a?a:this._panel.panelCallback,l=i||this._panel.panelResolve;return null!==t&&t!==this._panel.panelParent?(this.removePanel(),this.panel(s,t,r,o,l)):(LZ(this),this.panel(s,this._panel.panelParent,r,o,l,!0))},E.A.prototype.panel=async function(e,t,n={},a=null,i=null,s=!1){if(this._panelStatus.hasPanel^s)return!1;if(!NZ(e))return!1;const r=document.querySelector(t);if(!r)return!1;const o=Object.assign({headline:U.H.RC_panelTitle[this.L],description:U.H.RC_panelIntro[this.L],showNextButton:!1,nextHeadline:U.H.RC_panelTitleNext[this.L],nextDescription:U.H.RC_panelIntroNext[this.L],nextButton:U.H.RC_panelButton[this.L],color:"#3490de",debug:!1,i18n:!0,_demoActivateAll:!1},n),l=Ii(o.color).darken(20).toString();document.documentElement.style.setProperty("--rc-panel-theme-color",o.color),document.documentElement.style.setProperty("--rc-panel-darken-color",l),document.documentElement.style.setProperty("--rc-panel-theme-color-semi",`${o.color}66`),document.documentElement.style.setProperty("--rc-panel-darken-color-semi",`${l}88`);const u=document.createElement("div");u.className=u.id="rc-panel",this.LD===this._CONST.RTL?u.className+=" rc-lang-rtl":u.className+=" rc-lang-ltr",o.i18n&&(u.innerHTML+='
      '),u.innerHTML+=`

      ${o.headline}

      `,u.innerHTML+=`

      ${o.description}

      `,u.innerHTML+='
      ',s?r.replaceChild(u,this._panel.panel):r.appendChild(u);const c=u.querySelector("#rc-panel-steps"),h=new ResizeObserver((()=>{zZ(c,u.offsetWidth,this.LD)}));if(h.observe(u),zZ(c,u.offsetWidth,this.LD),0===e.length)c.className+=" rc-panel-no-steps";else for(const t in e){const n=RZ(this,t,e[t],o);c.appendChild(n)}(o.showNextButton||o._demoActivateAll)&&c.appendChild(DZ(e.length,o));OZ(this,{index:0,finished:[]},e,o,a),this._panel.panel=u,this._panel.panelObserver=h,this._panel.panelTasks=e,this._panel.panelParent=t;const d={...o};return o.headline===U.H.RC_panelTitle[this.L]&&(d.headline=void 0),o.description===U.H.RC_panelIntro[this.L]&&(d.description=void 0),o.nextHeadline===U.H.RC_panelTitleNext[this.L]&&(d.nextHeadline=void 0),o.nextDescription===U.H.RC_panelIntroNext[this.L]&&(d.nextDescription=void 0),o.nextButton===U.H.RC_panelButton[this.L]&&(d.nextButton=void 0),this._panel.panelOptions=d,this._panel.panelCallback=a,this._panel.panelResolve=i,this._panelStatus.hasPanel=!0,this._panelStatus.panelFinished=!1,o.i18n&&PZ(this,document.querySelector("#rc-panel-language-parent"),l),o.debug&&(0,uZ.K)(this,u,e,a),null===i&&(i=!0),new Promise((e=>{const t=setInterval((()=>{this._panelStatus.panelFinished&&(clearInterval(t),e(i))}),100);this._panelStatus.panelResolveIntervals.push(t)}))};const TZ={screenSize:{use:1,name:U.H.RC_screenSize["en-US"],phraseHandle:"RC_screenSize"},measureDistance:{use:1,name:U.H.RC_viewingDistance["en-US"],phraseHandle:"RC_viewingDistance"},trackDistance:{use:2,name:U.H.RC_distanceTracking["en-US"],phraseHandle:"RC_distanceTracking"},trackGaze:{use:2,name:U.H.RC_gazeTracking["en-US"],phraseHandle:"RC_gazeTracking"},performance:{use:1,name:U.H.RC_performance["en-US"],phraseHandle:"RC_performance"}},IZ=Object.keys(TZ),NZ=e=>{if(!Array.isArray(e))return!1;for(const t of e){if("object"==typeof t&&(null===t||!IZ.includes(t.name)))return!1;if("string"==typeof t&&!IZ.includes(t))return!1}return!0},RZ=(e,t,n,a)=>{let i,s;switch(TZ[BZ(n)].use){case 0:case 1:default:i="",s="";break;case 2:i=hZ(),s=U.H.RC_panelUsesWebcam[e.L];break;case 3:i=hZ()+pZ(),s=U.H.RC_panelUsesWebcamPhone[e.L]}const r=document.createElement("button");return r.className="rc-panel-step rc-panel-step-todo"+(a._demoActivateAll?" rc-panel-step-active":" rc-panel-step-inactive"),r.dataset.index=t,r.innerHTML=`${i.length?`

      ${i}

      `:""}

      ${Number(t)+1}  ${U.H[TZ[BZ(n)].phraseHandle][e.L]}

      ${i.length?`

      ${i} ${s}

      `:""}`,r},DZ=(e,t)=>{const n=document.createElement("button");return n.className="rc-panel-step rc-panel-next-button rc-panel-step-inactive",n.dataset.index=e,n.innerHTML=`

      ${t.nextButton}

      `,n},zZ=(e,t,n)=>{if(t<640){e.classList.add("rc-panel-steps-s"),e.classList.remove("rc-panel-steps-l");for(const t of e.childNodes)t.classList.add(`rc-lang-${n.toLowerCase()}`)}else{e.classList.add("rc-panel-steps-l"),e.classList.remove("rc-panel-steps-s");for(const t of e.childNodes)t.classList.remove("rc-lang-ltr"),t.classList.remove("rc-lang-rtl")}},OZ=(e,t,n,a,i)=>{document.querySelectorAll(".rc-panel-step").forEach(((s,r)=>{const o=Number(s.dataset.index);if(a._demoActivateAll)s.onclick=()=>{e[BZ(n[r])](...FZ(n[r])),MZ(r),t.finished.push(BZ(n[r]));for(const e of n)if(!t.finished.includes(BZ(e)))return;const a=document.querySelector(".rc-panel-next-button");a.classList.replace("rc-panel-step-inactive","rc-panel-step-active"),a.onclick=()=>{e._panelStatus.panelFinished=!0,(0,_.nB)(i,{timestamp:performance.now()})}},W(s,e.keypadHandler);else if(o===t.index)if(s.classList.replace("rc-panel-step-inactive","rc-panel-step-active"),s.focus(),o!==n.length)o!==n.length-1||a.showNextButton?s.onclick=()=>{e[BZ(n[t.index])](...FZ(n[t.index],(()=>{MZ(t.index),t.index++,OZ(e,t,n,a,i)})))}:s.onclick=()=>{e[BZ(n[t.index])](...FZ(n[t.index],(()=>{MZ(t.index)}),i,(()=>{e._panelStatus.panelFinished=!0})))},W(s,e.keypadHandler);else if(o===n.length&&a.showNextButton){const{headline:t,nextHeadline:n,description:r,nextDescription:o}=a;t!==n&&(document.querySelector("#rc-panel-title").innerHTML=n),r!==o&&(document.querySelector("#rc-panel-description").innerHTML=o),s.onclick=()=>{e._panelStatus.panelFinished=!0,(0,_.nB)(i,{timestamp:performance.now()})},W(s,e.keypadHandler)}}))},MZ=e=>{const t=document.querySelectorAll(".rc-panel-step");for(const n of t)Number(n.dataset.index)===e&&(n.classList.replace("rc-panel-step-todo","rc-panel-step-finished"),n.classList.replace("rc-panel-step-active","rc-panel-step-inactive"))},BZ=e=>"string"==typeof e?e:e.name,FZ=(e,t,n=null,a=null)=>{"string"==typeof e&&(e={name:e});const i=()=>{(0,_.nB)(t),(0,_.nB)(n,{timestamp:performance.now()}),(0,_.nB)(a)};return["screenSize","measureDistance","performance"].includes(e.name)?[e.options||{},t=>{(0,_.nB)(e.callback,t),i()}]:"trackGaze"===e.name?[e.options||{},t=>{(0,_.nB)(e.callbackOnCalibrationEnd,t),i()},e.callbackTrack||null]:"trackDistance"===e.name?[e.options||{},t=>{(0,_.nB)(e.callbackStatic,t),i()},e.callbackTrack||null]:void 0},LZ=e=>{e._panelStatus.panelResolveIntervals.map((e=>clearInterval(e))),e._panelStatus.panelResolveIntervals=[]},PZ=(e,t,n)=>{let a=`",t.innerHTML=a,document.querySelector("#rc-panel-lang-picker").onchange=()=>{e.newLanguage(document.querySelector("#rc-panel-lang-picker").value),e.resetPanel()}};E.A.prototype.backgroundColor=function(e=null){if(!this.checkInitialized())return null;null!==e&&/^#([0-9A-F]{3}){1,2}$/i.test(e)?this._params.backgroundColor=e:this._params.backgroundColor="#eee";const t=document.querySelector("#calibration-background");return t&&(t.style.background=this.params.backgroundColor),this.params.backgroundColor},E.A.prototype.videoOpacity=function(e=null){if(!this.checkInitialized())return null;null===e||Number(e)!==e||Number(e)>1||Number(e)<0?this._params.videoOpacity=.8:this._params.videoOpacity=e;const t=document.querySelector("#webgazerVideoContainer");return t&&(t.style.opacity=this.params.videoOpacity),this.params.videoOpacity},E.A.prototype.showCancelButton=function(e=!0){return this.checkInitialized()?(this._params.showCancelButton=!!e,this.params.showCancelButton):null};var jZ=__webpack_require__(9725),VZ={};VZ.styleTagTransform=SZ(),VZ.setAttributes=wZ(),VZ.insert=vZ().bind(null,"head"),VZ.domAPI=yZ(),VZ.insertStyleElement=xZ();fZ()(jZ.A,VZ);jZ.A&&jZ.A.locals&&jZ.A.locals;var UZ=__webpack_require__(5151),WZ={};WZ.styleTagTransform=SZ(),WZ.setAttributes=wZ(),WZ.insert=vZ().bind(null,"head"),WZ.domAPI=yZ(),WZ.insertStyleElement=xZ();fZ()(UZ.A,WZ);UZ.A&&UZ.A.locals&&UZ.A.locals;var GZ=__webpack_require__(2945),qZ={};qZ.styleTagTransform=SZ(),qZ.setAttributes=wZ(),qZ.insert=vZ().bind(null,"head"),qZ.domAPI=yZ(),qZ.insertStyleElement=xZ();fZ()(GZ.A,qZ);GZ.A&&GZ.A.locals&&GZ.A.locals;var HZ=__webpack_require__(9057),KZ={};KZ.styleTagTransform=SZ(),KZ.setAttributes=wZ(),KZ.insert=vZ().bind(null,"head"),KZ.domAPI=yZ(),KZ.insertStyleElement=xZ();fZ()(HZ.A,KZ);HZ.A&&HZ.A.locals&&HZ.A.locals;var $Z=__webpack_require__(4889),ZZ={};ZZ.styleTagTransform=SZ(),ZZ.setAttributes=wZ(),ZZ.insert=vZ().bind(null,"head"),ZZ.domAPI=yZ(),ZZ.insertStyleElement=xZ();fZ()($Z.A,ZZ);$Z.A&&$Z.A.locals&&$Z.A.locals;var XZ=__webpack_require__(2636),YZ={};YZ.styleTagTransform=SZ(),YZ.setAttributes=wZ(),YZ.insert=vZ().bind(null,"head"),YZ.domAPI=yZ(),YZ.insertStyleElement=xZ();fZ()(XZ.A,YZ);XZ.A&&XZ.A.locals&&XZ.A.locals;var QZ=__webpack_require__(2921),JZ={};JZ.styleTagTransform=SZ(),JZ.setAttributes=wZ(),JZ.insert=vZ().bind(null,"head"),JZ.domAPI=yZ(),JZ.insertStyleElement=xZ();fZ()(QZ.A,JZ);QZ.A&&QZ.A.locals&&QZ.A.locals;var eX=__webpack_require__(7271),tX={};tX.styleTagTransform=SZ(),tX.setAttributes=wZ(),tX.insert=vZ().bind(null,"head"),tX.domAPI=yZ(),tX.insertStyleElement=xZ();fZ()(eX.A,tX);eX.A&&eX.A.locals&&eX.A.locals;var nX=__webpack_require__(2551),aX={};aX.styleTagTransform=SZ(),aX.setAttributes=wZ(),aX.insert=vZ().bind(null,"head"),aX.domAPI=yZ(),aX.insertStyleElement=xZ();fZ()(nX.A,aX);nX.A&&nX.A.locals&&nX.A.locals;var iX=__webpack_require__(8470),sX={};sX.styleTagTransform=SZ(),sX.setAttributes=wZ(),sX.insert=vZ().bind(null,"head"),sX.domAPI=yZ(),sX.insertStyleElement=xZ();fZ()(iX.A,sX);iX.A&&iX.A.locals&&iX.A.locals;var rX=__webpack_require__(2535),oX={};oX.styleTagTransform=SZ(),oX.setAttributes=wZ(),oX.insert=vZ().bind(null,"head"),oX.domAPI=yZ(),oX.insertStyleElement=xZ();fZ()(rX.A,oX);rX.A&&rX.A.locals&&rX.A.locals;var lX=__webpack_require__(663),uX={};uX.styleTagTransform=SZ(),uX.setAttributes=wZ(),uX.insert=vZ().bind(null,"head"),uX.domAPI=yZ(),uX.insertStyleElement=xZ();fZ()(lX.A,uX);lX.A&&lX.A.locals&&lX.A.locals;var cX=__webpack_require__(5319),hX={};hX.styleTagTransform=SZ(),hX.setAttributes=wZ(),hX.insert=vZ().bind(null,"head"),hX.domAPI=yZ(),hX.insertStyleElement=xZ();fZ()(cX.A,hX);cX.A&&cX.A.locals&&cX.A.locals;var dX=__webpack_require__(290),pX={};pX.styleTagTransform=SZ(),pX.setAttributes=wZ(),pX.insert=vZ().bind(null,"head"),pX.domAPI=yZ(),pX.insertStyleElement=xZ();fZ()(dX.A,pX);dX.A&&dX.A.locals&&dX.A.locals;const mX=new E.A;mX.gazeTracker=new q$(mX);const fX=mX})(),__webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.RemoteCalibrator=t():e.RemoteCalibrator=t()}(self,(()=>(()=>{var __webpack_modules__={6003:()=>{window.requestAnimFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e,t){return window.setTimeout(e,1e3/60)},window.cancelRequestAnimFrame=window.cancelCancelRequestAnimationFrame||window.webkitCancelRequestAnimationFrame||window.mozCancelRequestAnimationFrame||window.oCancelRequestAnimationFrame||window.msCancelRequestAnimationFrame||window.clearTimeout},359:(e,t,n)=>{"use strict";n.d(t,{F:()=>i,a:()=>s});var a=n(9199);const i=(e,t,{go:n,cancel:i,custom:s},r,o=!0)=>{const l=document.createElement("div");let u,c,h;if(l.className="rc-buttons"+(o?" rc-absolute-buttons":""),l.id="rc-buttons",n&&(u=document.createElement("button"),u.className="rc-button rc-go-button",u.onclick=n,u.innerHTML=a.H.RC_ok[e],l.appendChild(u)),i&&r&&(c=document.createElement("button"),c.className="rc-button rc-cancel-button",c.onclick=i,c.innerHTML=a.H.RC_cancel[e],l.appendChild(c)),s){const{callback:e,content:t}=s;h=document.createElement("button"),h.className="rc-button rc-custom-button",h.onclick=e,h.innerHTML=t,l.appendChild(h)}return t.appendChild(l),[l,u,c,h]},s=e=>{e.querySelector("#rc-buttons").remove()}},2016:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{K:()=>takeInput});var _buttons__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(359),_keyBinder__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(9853),_utils__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(9043);const takeInput=async(RC,extraFunction=null,extraFunctionOut=null,customButtonConfig=null)=>{const unit=RC.equipment.value.unit,unitDisplay=unit===RC._CONST.UNITS.CM?"cm":"in",unitIsFraction=unit===RC._CONST.UNITS.IN_F,formItem=`
      \n
      \n ${unitIsFraction?`${unitDisplay}`:`${unitDisplay}`}\n
      \n
      `,instruction=RC.background.querySelector(".calibration-instruction");instruction.innerHTML+=formItem;const formElement=instruction.querySelector(".rc-form"),formInputElement=instruction.querySelector(".rc-form-input"),formInputElementFInteger=instruction.querySelector(".rc-form-input-f-integer"),formInputElementFFraction=instruction.querySelector(".rc-form-input-f-fraction");unitIsFraction?formInputElementFInteger.focus():formInputElement.focus();const addedButtons=(0,_buttons__WEBPACK_IMPORTED_MODULE_0__.F)(RC.L,formElement,{go:()=>{},custom:customButtonConfig||void 0},!0,!1),goButton=addedButtons[1],customButton=addedButtons[3];goButton.disabled=!0;const eleOkay=e=>{e.classList.remove("rc-input-error"),goButton.disabled=!1},eleError=e=>{isAcceptedSingleInput(e.value.slice(-1))?(e.classList.add("rc-input-error"),goButton.disabled=!0):e.value=e.value.substring(0,e.value.length-1)},setupEleOninput=(e,t)=>{e.oninput=()=>{t(e.value)?eleOkay(e):eleError(e)}},_validationForFraction=()=>{let e=!0;return validInputInteger(formInputElementFInteger.value)?eleOkay(formInputElementFInteger):(eleError(formInputElementFInteger),e=!1),validInputFraction(formInputElementFFraction.value)?eleOkay(formInputElementFFraction):(eleError(formInputElementFFraction),e=!1),e};return unitIsFraction?(formInputElementFInteger.oninput=_validationForFraction,formInputElementFFraction.oninput=_validationForFraction):setupEleOninput(formInputElement,validInput),(0,_utils__WEBPACK_IMPORTED_MODULE_2__.nB)(extraFunction),new Promise((resolve=>{const bFunction=()=>{removeInputElements(formElement,extraFunctionOut),(0,_keyBinder__WEBPACK_IMPORTED_MODULE_1__.l)(bindKeysFunction),resolve(null)},fFunction=()=>{let valid=!1,numericalValue,inputValue;unitIsFraction&&validInputInteger(formInputElementFInteger.value)&&validInputFraction(formInputElementFFraction.value)?(valid=!0,numericalValue=Number.parseInt(formInputElementFInteger.value)+eval(formInputElementFFraction.value),inputValue=`${formInputElementFInteger.value} ${formInputElementFFraction.value}`):!unitIsFraction&&validInput(formInputElement.value)&&(valid=!0,numericalValue=Number(formInputElement.value)||Number(formInputElement.value.replace(",",".")),inputValue=formInputElement.value),valid&&(removeInputElements(formElement,extraFunctionOut),(0,_keyBinder__WEBPACK_IMPORTED_MODULE_1__.l)(bindKeysFunction),resolve({value:{numerical:numericalValue,input:inputValue,unit},timestamp:performance.now()}))};goButton.onclick=fFunction,customButton.onclick=bFunction;const bindKeysFunction=(0,_keyBinder__WEBPACK_IMPORTED_MODULE_1__.m)({Enter:fFunction,Escape:bFunction})}))},removeInputElements=(e,t)=>{(0,_buttons__WEBPACK_IMPORTED_MODULE_0__.a)(e);for(const t of e.children)t.remove();e.remove(),(0,_utils__WEBPACK_IMPORTED_MODULE_2__.nB)(t)},validInput=e=>e.length>0&&!e.includes(" ")&&(!Number.isNaN(e)||!Number.isNaN(e.replace(",","."))),validInputInteger=e=>!!validInput(e)&&(Number.parseInt(e)===Number(e)&&Number(e)>0),validInputFraction=text=>{if("0"===text)return!0;if(!text.includes("/")||text.match(/\//g).length>1)return!1;const numbers=text.split("/");return validInputInteger(numbers[0])&&validInputInteger(numbers[1])&&(0,_utils__WEBPACK_IMPORTED_MODULE_2__.DW)(numbers[1])&&eval(text)<1},isAcceptedSingleInput=e=>/[0-9]/.test(e)||[".","/",","].includes(e)},9853:(e,t,n)=>{"use strict";n.d(t,{l:()=>s,m:()=>i});var a=n(9043);function i(e,t="keydown"){const n=t=>{t.key in e&&(t.preventDefault(),(0,a.nB)(e[t.key],t))};return document.body.addEventListener(t,n),n}function s(e,t="keydown"){document.body.removeEventListener(t,e)}},2646:(e,t,n)=>{"use strict";n.d(t,{G:()=>r,t:()=>i});var a=n(9199);function i(e){const t=Object.keys(a.H.EE_languageNameNative);if(t.includes(e))return s(e);const n=[];t.map((e=>{n.push(e.split("-")[0])}));const i=e.split("-")[0].toLowerCase();return n.includes(i)?s(t[n.indexOf(i)]):s("en-US")}function s(e){return{value:{language:e,languageNameEnglish:a.H.EE_languageNameEnglish[e],languageNameNative:a.H.EE_languageNameNative[e],languageDirection:a.H.EE_languageDirection[e],languagePhraseSource:a.H.EE_phraseSource[e]},timestamp:performance.now()}}function r(e){return"1"===a.H.EE_languageUseSpace[e]?" ":""}},477:(e,t,n)=>{"use strict";n.d(t,{l:()=>u});const a="mocha"===n(7786)._;let i,s;if(!a){const e=n(9171);i=e.Synth,s=e.Volume}class r{triggerAttackRelease(){}}const o=a?new r:new i({oscillator:{type:"sine"},envelope:{attack:.001,decay:.001,sustain:1,release:.001}}).connect(new s(-17).toDestination()),l=a?new r:new i({oscillator:{type:"sine"}}).connect(new s(-5).toDestination()),u=(e=0)=>{switch(e){case 0:default:return void o.triggerAttackRelease(2e3,.05);case 1:return void o.triggerAttackRelease(500,.5);case 2:return void o.triggerAttackRelease(200,.6);case 3:return void l.triggerAttackRelease(200,.2)}}},9043:(e,t,n)=>{"use strict";function a(e,...t){if(e&&"function"==typeof e)return t.length?e(...t):e()}n.d(t,{$O:()=>l,$k:()=>v,AU:()=>u,Av:()=>y,DW:()=>d,Ew:()=>c,G8:()=>g,JZ:()=>f,KY:()=>k,Md:()=>i,Nh:()=>m,Sf:()=>r,aS:()=>o,k4:()=>p,ll:()=>h,ln:()=>b,nB:()=>a,yy:()=>s}),function(){let e=0;const t=["ms","moz","webkit","o"];for(let e=0;e{};function s(e){return new Promise((t=>setTimeout(t,e)))}function r(){if(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled){const e=document.documentElement;return e.requestFullscreen?(e.requestFullscreen(),!0):e.mozRequestFullScreen?(e.mozRequestFullScreen(),!0):e.webkitRequestFullscreen?(e.webkitRequestFullscreen(),!0):!!e.msRequestFullscreen&&(e.msRequestFullscreen(),!0)}return!1}function o(){return Math.abs(window.innerHeight-screen.height)<5&&Math.abs(window.innerWidth-screen.width)<5&&window.screenX<5&&window.screenY<5}function l(e,t=null,n=!1,a="",i=null){return`

      ${e}

      ${t?`

      ${t}

      `:""}`}function u(e,t,n){return en?n:e}function c(e,t,n,a,i){return a+1*(e-t)/(n-t)*(i-a)}function h(e,t,n,a){return Math.sqrt((e-n)**2+(t-a)**2)}function d(e){return e&&!(e&e-1)}function p(e){for(let t=e.length-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return e}function m(e,t){const n=10**t;return Math.round(e*n)/n}const f=e=>{const t=Math.floor(e.length/2),n=[...e].sort(((e,t)=>e-t));return e.length%2!=0?n[t]:(n[t-1]+n[t])/2},g=e=>e.reduce(((e,t)=>e+t))/e.length;function y(e,t,n=1){let a=0,i=0;for(;0===a;)a=Math.random();for(;0===i;)i=Math.random();let s=Math.sqrt(-2*Math.log(a))*Math.cos(2*Math.PI*i);return s=s/10+.5,s>1||s<0?s=y(e,t,n):(s=s**n,s*=t-e,s+=e),s}const b=e=>JSON.parse(JSON.stringify(e));function v(){"activeElement"in document&&document.activeElement.blur()}const k=e=>{if("touchstart"===e.type||"touchmove"===e.type){const t=e.touches[0];return{x:t.clientX,y:t.clientY}}return{x:e.clientX,y:e.clientY}}},7786:(e,t,n)=>{"use strict";n.d(t,{A:()=>v,_:()=>y});var a=n(7503),i=n.n(a),s=n(115),r=n.n(s);const o=["tall","short","up","down","fancy","busy","loud","crazy","kind","nice","real","speedy","handy","active","alert","bold","brave","bright","calm","clever","cool","free","grand","great","happy","jolly","lucky","spicy","sunny","super","wise"],l=["bat","bear","bird","cat","cow","deer","dog","dove","dragon","duck","eagle","fish","fox","frog","goose","lion","mouse","owl","pig","rat","seal","shark","sheep","snake","spider","tiger","turkey","viper","whale","wolf","onion","carrot","pear","bean","corn","bread","apple","banana","fig","grape","lemon","lime","orange","peach","plum","dumpling","cake","pasta","pot","sushi"],u=["blue","bronze","fire","forest","gold","gray","green","navy","purple","red","silver","sky","yellow","neon","black","white","brown","aqua"];function c(e){return e[Math.floor(Math.random()*e.length)]}function h(e){return e.charAt(0).toUpperCase()+e.slice(1)}function d(){const e=`000${(new Date).getMilliseconds().toString()}`;return h(c(o))+h(c(u))+h(c(l))+e.substring(e.length-3)}var p=n(782),m=n(9043),f=n(2646),g=n(9199);const y="production";class b{constructor(){window.console.log(`%c\nEasyEyes Remote Calibrator ${this.version.value}\n`,`color: ${this._CONST.COLOR.ORANGE}`),this._initialized=!1,this._initializing=!1,this._id=null,this._lang=null,this._langData=[],this._panelStatus={hasPanel:!1,panelFinished:!1,panelResolveIntervals:[]},this._panel={panel:null,panelObserver:null,panelTasks:[],panelParent:null,panelOptions:{},panelCallback:null,panelResolve:null},this._participantCheckEquipment={has:null,equipment:null,unit:null},this._trackingSetupFinishedStatus={gaze:!0,distance:!0},this._trackingPaused={gaze:!1,distance:!1},this._trackingVideoFrameTimestamps={gaze:0,distance:0},this._distanceTrackNudging={distanceCorrecting:null,distanceCorrectEnabled:!1,distanceDesired:null,distanceAllowedRatio:null,needEasyEyesKeypadBeyondCm:null},this._gazeTrackNudging={isCorrectingGaze:!1},this._environmentData=[],this._displayData=[],this._screenData=[],this._viewingDistanceData=[],this._nearPointData=[],this._PDData=[],this._gazePositionData=[],this._gazeAccuracyData=[],this._performanceData=[],this._fullscreenData=[],this._equipmentData=[],this._checkData=[],this._background={element:null,instructionElement:null},this._nudger={element:null,gazeElement:null},this._params={backgroundColor:"#eee",videoOpacity:.8,showCancelButton:!0},this.viewingDistanceAllowedPreciseBool=!0,this.keypadHandler=null}get background(){return this._background.element}get instructionElement(){return this._background.instructionElement}get nudger(){return this._nudger.element}get params(){return this._params}get id(){return this._id?{value:this._id.value,timestamp:this._id.timestamp,date:this._id.date}:null}_helper_get(e,t){if(!e.length)return null;const n=e[e.length-1];return t?{value:n.value[t],timestamp:n.timestamp}:n}get version(){return{value:"0.7.26"}}get supportedLanguages(){const e=[];for(const t in g.H.EE_languageNameEnglish)e.push({language:t,languageNameEnglish:g.H.EE_languageNameEnglish[t],languageNameNative:g.H.EE_languageNameNative[t]});return e}get L(){return this._lang}get LD(){return this.languageDirection.value}get language(){return this._helper_get(this._langData,"language")}get languageNameEnglish(){return this._helper_get(this._langData,"languageNameEnglish")}get languageNameNative(){return this._helper_get(this._langData,"languageNameNative")}get languageDirection(){return this._helper_get(this._langData,"languageDirection")}get languagePhraseSource(){return this._helper_get(this._langData,"languagePhraseSource")}get computeArrayFillMHz(){return this._helper_get(this._performanceData,"computeArrayFillMHz")}get computeRandomMHz(){return this._helper_get(this._performanceData,"computeRandomMHz")}get idealFps(){return this._helper_get(this._performanceData,"idealFps")}get stressFps(){return this._helper_get(this._performanceData,"stressFps")}get isFullscreen(){return this.fullscreenData.length&&r()((0,m.aS)(),this._helper_get(this._fullscreenData).value)||(this.newFullscreenData={value:(0,m.aS)(),timestamp:performance.now()}),this._helper_get(this._fullscreenData)}get concurrency(){return this._helper_get(this._environmentData,"concurrency")}get browser(){return this._helper_get(this._environmentData,"browser")}get browserVersion(){return this._helper_get(this._environmentData,"browserVersion")}get deviceType(){return this._helper_get(this._environmentData,"deviceType")}get isMobile(){const e=this._helper_get(this._environmentData,"deviceType");return{value:"desktop"!==e.value,timestamp:e.timestamp}}get model(){return this._helper_get(this._environmentData,"model")}get manufacturer(){return this._helper_get(this._environmentData,"manufacturer")}get engine(){return this._helper_get(this._environmentData,"engine")}get system(){return this._helper_get(this._environmentData,"system")}get systemFamily(){return this._helper_get(this._environmentData,"systemFamily")}get description(){return this._helper_get(this._environmentData,"description")}get fullDescription(){return this._helper_get(this._environmentData,"fullDescription")}get userLanguage(){return this._helper_get(this._environmentData,"userLanguage")}get equipment(){return this._helper_get(this._equipmentData)}get displayWidthPx(){return this._displaySize(),this._helper_get(this._displayData,"displayWidthPx")}get displayHeightPx(){return this._displaySize(),this._helper_get(this._displayData,"displayHeightPx")}get windowWidthPx(){return this._displaySize(),this._helper_get(this._displayData,"windowWidthPx")}get windowHeightPx(){return this._displaySize(),this._helper_get(this._displayData,"windowHeightPx")}get screenWidthCm(){return this._helper_get(this._screenData,"screenWidthCm")}get screenHeightCm(){return this._helper_get(this._screenData,"screenHeightCm")}get screenDiagonalCm(){return this._helper_get(this._screenData,"screenDiagonalCm")}get screenDiagonalIn(){return this._helper_get(this._screenData,"screenDiagonalIn")}get screenPpi(){return this._helper_get(this._screenData,"screenPpi")}get screenPhysicalPpi(){return this._helper_get(this._screenData,"screenPhysicalPpi")}get viewingDistanceCm(){return this._helper_get(this._viewingDistanceData)}get nearPointCm(){return this._helper_get(this._nearPointData)}get PDCm(){return this._helper_get(this._PDData)}get gazePositionPx(){return this._helper_get(this._gazePositionData)}get gazeAccuracyDeg(){return this._helper_get(this._gazeAccuracyData)}get displayData(){return this._displayData}get screenData(){return this._screenData}get viewingDistanceData(){return this._viewingDistanceData}get nearPointData(){return this._nearPointData}get PDData(){return this._PDData}get gazeData(){return this._gazePositionData}get performanceData(){return this._performanceData}get fullscreenData(){return this._fullscreenData}get environmentData(){return this._environmentData}get languageData(){return this._langData}get equipmentData(){return this._equipmentData}get checkData(){return this._checkData}set newDisplayData(e){this._displayData.push(e)}set newScreenData(e){this._screenData.push(e)}set newViewingDistanceData(e){this._viewingDistanceData.push(e)}set newNearPointData(e){this._nearPointData.push(e)}set newPDData(e){this._PDData.push(e)}set newGazePositionData(e){this._gazePositionData.push(e)}set newGazeAccuracyData(e){this._gazeAccuracyData.push(e)}set newEnvironmentData(e){this._environmentData.push(e)}set newPerformanceData(e){this._performanceData.push(e)}set newFullscreenData(e){this._fullscreenData.push(e)}set newLanguageData(e){this._langData.push(e)}set newEquipmentData(e){this._equipmentData.push(e)}set newCheckData(e){this._checkData.push(e)}}b.prototype.init=async function(e={},t=void 0,n={easyEyesKeypadHandler:null}){if(!this._initialized&&!this._initializing){this._initializing=!0;const a=Object.assign({id:d(),language:"AUTO",languagePhrasesJSON:null,fullscreen:!1},e);await(async(e=null)=>{const{remoteCalibratorPhrases:t}=await import("https://cdn.jsdelivr.net/gh/EasyEyes/remote-calibrator@latest/src/i18n/phrases.js");Object.assign(g.H,t),e&&Object.assign(g.H,e)})(a.languagePhrasesJSON),a.fullscreen&&!p.Y&&(0,m.Sf)(),this._id={value:a.id,timestamp:performance.now(),date:new Date},this._environment(!0),this._displaySize(!0),this._CONST.S.AUTO===a.language?this.newLanguageData=(0,f.t)(this.userLanguage.value):this.newLanguageData=(0,f.t)(a.language),this._lang=this.language.value,this._initializing=!1,this._initialized=!0,n?.easyEyesKeypadHandler&&(this.keypadHandler=n.easyEyesKeypadHandler),(0,m.nB)(t,this._id)}},b.prototype._environment=function(e=!1){if(e||this.checkInitialized()){(0,m.$k)();const e=e=>e.match(/Mobi/i)?"mobile":"desktop",t={value:{concurrency:window.navigator.hardwareConcurrency||-1,browser:i().name,browserVersion:i().version,deviceType:e(navigator.userAgent),model:i().product||"unknown",manufacturer:i().manufacturer||"unknown",engine:i().layout,system:`${i().os.family} ${i().os.version}`,systemFamily:i().os.family,description:i().description,fullDescription:i().ua,userLanguage:window.navigator.userLanguage||window.navigator.language},timestamp:this.id.timestamp};this.newEnvironmentData=t}},b.prototype.checkInitialized=function(){return!!this._initialized},b.prototype.getFullscreen=function(e=!0){return!!(0,m.aS)()||(this.newFullscreenData={value:!(!e||p.Y)&&(0,m.Sf)(),timestamp:performance.now()},this.isMobile.value&&window.scrollBy(0,1),this.isFullscreen)},b.prototype.newLanguage=function(e){if(this.checkInitialized()){let t;return this.newLanguageData=t=(0,f.t)(e),this._lang=this.language.value,t}},b.prototype._addBackground=function(e){if(null!==this.background)return;let t=document.getElementById("calibration-background");return t||(t=document.createElement("div"),t.id="calibration-background",t.className=`calibration-background rc-lang-${this.LD.toLowerCase()}`,document.body.classList.add("lock-view"),document.body.appendChild(t),t.style.background=this.params.backgroundColor),e&&(t.innerHTML=e),this._background.element=t,this.background},b.prototype._replaceBackground=function(e){return null!==this.background&&this._removeBackground(),this._addBackground(e)},b.prototype._removeBackground=function(){const e=document.getElementById("calibration-background");return!!e&&(document.body.classList.remove("lock-view"),document.body.removeChild(e),this._background={element:null,instructionElement:null},!0)},b.prototype._addBackgroundText=function(e,t){const n=this.background.getElementsByClassName("calibration-instruction");for(let e=0;e{"use strict";n.d(t,{Y:()=>a});const a=!1},9199:(e,t,n)=>{"use strict";n.d(t,{H:()=>i});const a=["en-US","ar","hy","bg","zh-CN","zh-HK","hr","cs","da","nl","en-UK","fi","fr","de","el","he","hi","hu","is","id","it","ja","kn","ko","lt","ms","ml","no","fa","pl","pt","ro","ru","sr","es","sw","sv","tl","tr","ur"],i={};["EE_languageNameEnglish","EE_languageNameNative","EE_languageDirection","EE_languageUseSpace","EE_phraseSource","RC_cancel","RC_distanceTracking","RC_distanceTrackingCloseL","RC_distanceTrackingCloseR","RC_distanceTrackingGuide","RC_distanceTrackingIntroEnd","RC_distanceTrackingIntroStart","RC_distanceTrackingMoveCloser","RC_distanceTrackingMoveFurther","RC_rulerUnit","RC_howLong","RC_produceDistanceTitle","RC_produceDistance","RC_TestDistances","RC_canUsePhoneKeypad","RC_distanceTrackingRedo","RC_distanceTrackingTitle","RC_errorCameraUseDenied","RC_errorNoCamera","RC_gazeTracking","RC_gazeTrackingIntro","RC_gazeTrackingNudge","RC_gazeTrackingTitle","RC_nearPointIntro","RC_nearPointTitle","RC_ok","RC_panelButton","RC_panelIntro","RC_panelTitle","RC_panelTitleNext","RC_panelIntroNext","RC_panelUsesWebcam","RC_panelUsesWebcamPhone","RC_performance","RC_performanceIntro","RC_performanceTitle","RC_privacyCamera","RC_requestCamera","RC_screenSize","RC_screenSizeCredit","RC_screenSizeCreditCard","RC_screenSizeHave","RC_screenSizeIntro","RC_screenSizeTitle","RC_screenSizeUSBA","RC_screenSizeUSBC","RC_starting","RC_viewingBlindSpotCredit","RC_viewingBlindSpotRejected","RC_viewingDistance","RC_viewingDistanceIntroTitle","RC_viewingDistanceIntroLiMethod","RC_viewingDistanceTitle","T_proceed"].map((e=>{i[e]={},a.map((t=>{i[e][t]=""}))}))},7790:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";__webpack_require__.d(__webpack_exports__,{K:()=>_setDebugControl});var _components_utils__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(9043);const _setDebugControl=(e,t,n,a)=>{const i=document.createElement("div");i.className="rc-panel-debug-control",i.innerHTML='

      DEBUG CONTROL

      REMEMBER TO SET debug TO false FOR PRODUCTION MODE!

      ',t.appendChild(i);const s=[];for(const t of n){const n=t.name?t.name:t,a=document.createElement("div");a.className="rc-panel-debug-control-task-row",a.id=`rc-debugger-row-${n}`;const r=e._debuggerDefault[n];if(r){i.innerHTML+=`

      ${n}

      `;const e={n:"number",s:"string"};switch(n){case"screenSize":for(const t in r.value)a.innerHTML+=_createValueElement(n,t,r.value[t],`.value.${t}`,e.n);break;case"measureDistance":a.innerHTML+=_createValueElement(n,"value",r.value,".value",e.n),a.innerHTML+=_createValueElement(n,"method",r.method,".method",e.s,!0);break;case"trackDistance":a.innerHTML+=_createValueElement(n,"viewingDistanceCm",r.value.viewingDistanceCm,".value",e.n),a.innerHTML+=_createValueElement(n,"PDCm",r.value.PDCm,".value",e.n),a.innerHTML+=_createValueElement(n,"nearPointCm.x",r.value.nearPointCm.x,".value.x",e.n),a.innerHTML+=_createValueElement(n,"nearPointCm.y",r.value.nearPointCm.y,".value.y",e.n),a.innerHTML+=_createValueElement(n,"latencyMs",r.value.latencyMs,".latencyMs",e.n),a.innerHTML+=_createValueElement(n,"method",r.method,".method",e.s,!0);break;case"trackGaze":a.innerHTML+=_createValueElement(n,"x",r.value.x,".value.x",e.n),a.innerHTML+=_createValueElement(n,"y",r.value.y,".value.y",e.n),a.innerHTML+=_createValueElement(n,"latencyMs",r.value.latencyMs,".value.latencyMs",e.n);break;case"performance":a.innerHTML+=_createValueElement(n,"computeArrayFillMHz",r.value.computeArrayFillMHz,".value.computeArrayFillMHz",e.n),a.innerHTML+=_createValueElement(n,"computeRandomMHz",r.value.computeRandomMHz,".value.computeRandomMHz",e.n),a.innerHTML+=_createValueElement(n,"idealFps",r.value.idealFps,".value.idealFps",e.n),a.innerHTML+=_createValueElement(n,"stressFps",r.value.stressFps,".value.stressFps",e.n)}i.appendChild(a),s.push(n)}}const r=document.createElement("button");r.className="rc-panel-debug-control-next",r.innerHTML="Simulate calibration and continue",r.onclick=()=>{_wrapValues(e,s),(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.nB)(a,{timestamp:performance.now()}),e._panelStatus.panelFinished=!0},i.appendChild(r)},_createValueElement=(e,t,n,a,i,s=!1)=>`
      \n \n

      ${t}

      \n
      `,_wrapValues=(e,t)=>{for(const n of t){const t=document.querySelector(`#rc-debugger-row-${n}`),a={};switch(n){case"screenSize":a.value={},_putData(e,a,t),e.newScreenData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a);break;case"measureDistance":_putData(e,a,t),e.newViewingDistanceData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a);break;case"trackDistance":e.newViewingDistanceData={value:_get(t,"#trackDistance-viewingDistanceCm"),latencyMs:_get(t,"#trackDistance-latencyMs"),method:_get(t,"#trackDistance-method","string"),timestamp:e._debuggerDefault.timestamp},e.newNearPointData={value:{x:_get(t,"#trackDistance-nearPointCm-x"),y:_get(t,"#trackDistance-nearPointCm-y")},timestamp:e._debuggerDefault.timestamp},e.newPDData={value:_get(t,"#trackDistance-PDCm"),timestamp:e._debuggerDefault.timestamp};break;case"trackGaze":a.value={},_putData(e,a,t),e.newGazePositionData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a);break;case"performance":a.value={},_putData(e,a,t),e.newPerformanceData=(0,_components_utils__WEBPACK_IMPORTED_MODULE_0__.ln)(a)}}},_get=(e,t)=>{const n=e.querySelector(t);return"number"===n.dataset.type?Number(n.value):n.value},_putData=(RC,newData,taskRow)=>{for(const ele of taskRow.childNodes){const eleInput=ele.querySelector("input");try{eval(`newData${eleInput.dataset.source} = eleInput.dataset.type === 'number' ? Number(eleInput.value) : eleInput.value`)}catch(e){}newData.timestamp=RC._debuggerDefault.timestamp}return newData}},2921:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".animated{-webkit-animation-duration:var(--animate-duration);animation-duration:var(--animate-duration);-webkit-animation-fill-mode:both;animation-fill-mode:both}.animated.infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.animated.repeat-1{-webkit-animation-iteration-count:var(--animate-repeat);animation-iteration-count:var(--animate-repeat)}.animated.repeat-2{-webkit-animation-iteration-count:calc(var(--animate-repeat)*2);animation-iteration-count:calc(var(--animate-repeat)*2)}.animated.repeat-3{-webkit-animation-iteration-count:calc(var(--animate-repeat)*3);animation-iteration-count:calc(var(--animate-repeat)*3)}.animated.delay-1s{-webkit-animation-delay:var(--animate-delay);animation-delay:var(--animate-delay)}.animated.delay-2s{-webkit-animation-delay:calc(var(--animate-delay)*2);animation-delay:calc(var(--animate-delay)*2)}.animated.delay-3s{-webkit-animation-delay:calc(var(--animate-delay)*3);animation-delay:calc(var(--animate-delay)*3)}.animated.delay-4s{-webkit-animation-delay:calc(var(--animate-delay)*4);animation-delay:calc(var(--animate-delay)*4)}.animated.delay-5s{-webkit-animation-delay:calc(var(--animate-delay)*5);animation-delay:calc(var(--animate-delay)*5)}.animated.faster{-webkit-animation-duration:calc(var(--animate-duration)/2);animation-duration:calc(var(--animate-duration)/2)}.animated.fast{-webkit-animation-duration:calc(var(--animate-duration)*.8);animation-duration:calc(var(--animate-duration)*.8)}.animated.slow{-webkit-animation-duration:calc(var(--animate-duration)*2);animation-duration:calc(var(--animate-duration)*2)}.animated.slower{-webkit-animation-duration:calc(var(--animate-duration)*3);animation-duration:calc(var(--animate-duration)*3)}@media (prefers-reduced-motion:reduce),print{.animated{-webkit-animation-duration:1ms!important;animation-duration:1ms!important;-webkit-animation-iteration-count:1!important;animation-iteration-count:1!important;-webkit-transition-duration:1ms!important;transition-duration:1ms!important}.animated[class*=Out]{opacity:0}}","",{version:3,sources:["webpack://./node_modules/animate.css/source/_base.css"],names:[],mappings:"AAAA,UACE,kDAA2C,CAA3C,0CAA2C,CAC3C,gCAAyB,CAAzB,wBACF,CAEA,mBACE,0CAAmC,CAAnC,kCACF,CAEA,mBACE,uDAAgD,CAAhD,+CACF,CAEA,mBACE,+DAA0D,CAA1D,uDACF,CAEA,mBACE,+DAA0D,CAA1D,uDACF,CAEA,mBACE,4CAAqC,CAArC,oCACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,mBACE,oDAA+C,CAA/C,4CACF,CAEA,iBACE,0DAAqD,CAArD,kDACF,CAEA,eACE,2DAAuD,CAAvD,mDACF,CAEA,eACE,0DAAqD,CAArD,kDACF,CAEA,iBACE,0DAAqD,CAArD,kDACF,CAEA,6CACE,UACE,wCAAkC,CAAlC,gCAAkC,CAElC,6CAAuC,CAAvC,qCAAuC,CADvC,yCAAmC,CAAnC,iCAEF,CAEA,sBACE,SACF,CACF",sourcesContent:[".animated {\n animation-duration: var(--animate-duration);\n animation-fill-mode: both;\n}\n\n.animated.infinite {\n animation-iteration-count: infinite;\n}\n\n.animated.repeat-1 {\n animation-iteration-count: var(--animate-repeat);\n}\n\n.animated.repeat-2 {\n animation-iteration-count: calc(var(--animate-repeat) * 2);\n}\n\n.animated.repeat-3 {\n animation-iteration-count: calc(var(--animate-repeat) * 3);\n}\n\n.animated.delay-1s {\n animation-delay: var(--animate-delay);\n}\n\n.animated.delay-2s {\n animation-delay: calc(var(--animate-delay) * 2);\n}\n\n.animated.delay-3s {\n animation-delay: calc(var(--animate-delay) * 3);\n}\n\n.animated.delay-4s {\n animation-delay: calc(var(--animate-delay) * 4);\n}\n\n.animated.delay-5s {\n animation-delay: calc(var(--animate-delay) * 5);\n}\n\n.animated.faster {\n animation-duration: calc(var(--animate-duration) / 2);\n}\n\n.animated.fast {\n animation-duration: calc(var(--animate-duration) * 0.8);\n}\n\n.animated.slow {\n animation-duration: calc(var(--animate-duration) * 2);\n}\n\n.animated.slower {\n animation-duration: calc(var(--animate-duration) * 3);\n}\n\n@media print, (prefers-reduced-motion: reduce) {\n .animated {\n animation-duration: 1ms !important;\n transition-duration: 1ms !important;\n animation-iteration-count: 1 !important;\n }\n\n .animated[class*='Out'] {\n opacity: 0;\n }\n}\n"],sourceRoot:""}]);const o=r},2636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,":root{--animate-duration:1s;--animate-delay:1s;--animate-repeat:1}","",{version:3,sources:["webpack://./node_modules/animate.css/source/_vars.css"],names:[],mappings:"AAAA,MACE,qBAAsB,CACtB,kBAAmB,CACnB,kBACF",sourcesContent:[":root {\n --animate-duration: 1s;\n --animate-delay: 1s;\n --animate-repeat: 1;\n}\n"],sourceRoot:""}]);const o=r},7271:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}","",{version:3,sources:["webpack://./node_modules/animate.css/source/fading_entrances/fadeInUp.css"],names:[],mappings:"AAAA,4BACE,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CAEA,GACE,SAAU,CACV,+BAA+B,CAA/B,uBACF,CACF,CAVA,oBACE,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CAEA,GACE,SAAU,CACV,+BAA+B,CAA/B,uBACF,CACF,CAEA,UACE,+BAAwB,CAAxB,uBACF",sourcesContent:["@keyframes fadeInUp {\n from {\n opacity: 0;\n transform: translate3d(0, 100%, 0);\n }\n\n to {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n }\n}\n\n.fadeInUp {\n animation-name: fadeInUp;\n}\n"],sourceRoot:""}]);const o=r},2551:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"@-webkit-keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}.fadeOutDown{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}","",{version:3,sources:["webpack://./node_modules/animate.css/source/fading_exits/fadeOutDown.css"],names:[],mappings:"AAAA,+BACE,GACE,SACF,CAEA,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CACF,CATA,uBACE,GACE,SACF,CAEA,GACE,SAAU,CACV,uCAAkC,CAAlC,+BACF,CACF,CAEA,aACE,kCAA2B,CAA3B,0BACF",sourcesContent:["@keyframes fadeOutDown {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n transform: translate3d(0, 100%, 0);\n }\n}\n\n.fadeOutDown {\n animation-name: fadeOutDown;\n}\n"],sourceRoot:""}]);const o=r},8470:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,'.swal2-popup.swal2-toast{background:#fff;box-shadow:0 0 1px rgba(0,0,0,.075),0 1px 2px rgba(0,0,0,.075),1px 2px 4px rgba(0,0,0,.075),1px 3px 8px rgba(0,0,0,.075),2px 4px 16px rgba(0,0,0,.075);box-sizing:border-box;grid-column:1/4!important;grid-row:1/4!important;grid-template-columns:min-content auto min-content;overflow-y:hidden;padding:1em;pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{font-size:1em;margin:.5em 1em;padding:0;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{font-size:1em;height:2em;margin:.5em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{font-size:.8em;margin:.5em 0 0;padding:.5em 0 0}.swal2-popup.swal2-toast .swal2-close{align-self:center;font-size:2em;grid-column:3/3;grid-row:1/99;height:.8em;margin:0;width:.8em}.swal2-popup.swal2-toast .swal2-html-container{font-size:1em;margin:.5em 1em;overflow:initial;padding:0;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{align-self:center;grid-column:1;grid-row:1/99;height:2em;margin:.25em;width:2em}.swal2-popup.swal2-toast .swal2-icon{align-self:center;grid-column:1;grid-row:1/99;height:2em;margin:0 .5em 0 0;min-width:2em;width:2em}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{align-items:center;display:flex;font-size:1.8em;font-weight:700}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{height:2em;width:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{height:auto;justify-content:flex-start;margin:.5em 0 0;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{font-size:1em;margin:.25em .5em;padding:.4em .6em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{border-radius:50%;height:3em;position:absolute;width:1.6em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{border-radius:4em 0 0 4em;left:-.5em;top:-.8em;transform:rotate(-45deg);transform-origin:2em 2em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{border-radius:0 4em 4em 0;left:.9375em;top:-.25em;transform-origin:0 1.5em}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{height:2em;width:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{height:2.6875em;left:.4375em;top:0;width:.4375em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{left:.1875em;top:1.125em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{right:.1875em;top:.9375em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}div:where(.swal2-container){box-sizing:border-box;display:grid;grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";grid-template-rows:minmax(min-content,auto) minmax(min-content,auto) minmax(min-content,auto);height:100%;inset:0;overflow-x:hidden;padding:.625em;position:fixed;transition:background-color .1s;z-index:1060;-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:rgba(0,0,0,.4)}div:where(.swal2-container).swal2-backdrop-hide{background:transparent!important}div:where(.swal2-container).swal2-bottom-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-top-start{grid-template-columns:minmax(0,1fr) auto auto}div:where(.swal2-container).swal2-bottom,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-top{grid-template-columns:auto minmax(0,1fr) auto}div:where(.swal2-container).swal2-bottom-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-top-end{grid-template-columns:auto auto minmax(0,1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-left>.swal2-popup,div:where(.swal2-container).swal2-center-start>.swal2-popup{align-self:center;grid-row:2}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-left>.swal2-popup,div:where(.swal2-container).swal2-bottom-start>.swal2-popup{align-self:end;grid-column:1;grid-row:3}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup,div:where(.swal2-container).swal2-grow-row>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{align-self:stretch;grid-row:1/4}div:where(.swal2-container).swal2-no-transition{transition:none!important}div:where(.swal2-container) div:where(.swal2-popup){background:#fff;border:none;border-radius:5px;box-sizing:border-box;color:#545454;display:none;font-family:inherit;font-size:1rem;grid-template-columns:minmax(0,100%);max-width:100%;padding:0 0 1.25em;position:relative;width:32em}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) h2:where(.swal2-title){color:inherit;font-size:1.875em;font-weight:600;margin:0;max-width:100%;padding:.8em 1em 0;position:relative;text-align:center;text-transform:none;word-wrap:break-word}div:where(.swal2-container) div:where(.swal2-actions){align-items:center;box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;margin:1.25em auto 0;padding:0;width:auto;z-index:1}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}div:where(.swal2-container) div:where(.swal2-loader){align-items:center;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-color:#2778c4 transparent;border-radius:100%;border-style:solid;border-width:.25em;display:none;height:2.2em;justify-content:center;margin:0 1.875em;width:2.2em}div:where(.swal2-container) button:where(.swal2-styled){box-shadow:0 0 0 3px transparent;font-weight:500;margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){background:initial;background-color:#7066e0;border:0;border-radius:.25em;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):focus-visible{box-shadow:0 0 0 3px rgba(112,102,224,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){background:initial;background-color:#dc3741;border:0;border-radius:.25em;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):focus-visible{box-shadow:0 0 0 3px rgba(220,55,65,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){background:initial;background-color:#6e7881;border:0;border-radius:.25em;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):focus-visible{box-shadow:0 0 0 3px hsla(208,8%,47%,.5)}div:where(.swal2-container) button:where(.swal2-styled).swal2-default-outline:focus-visible{box-shadow:0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){border-top:1px solid #eee;color:inherit;font-size:1em;margin:1em 0 0;padding:1em 1em 0;text-align:center}div:where(.swal2-container) .swal2-timer-progress-bar-container{border-bottom-left-radius:5px;border-bottom-right-radius:5px;bottom:0;grid-column:auto!important;left:0;overflow:hidden;position:absolute;right:0}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){background:rgba(0,0,0,.2);height:.25em;width:100%}div:where(.swal2-container) img:where(.swal2-image){margin:2em auto 1em;max-width:100%}div:where(.swal2-container) button:where(.swal2-close){align-items:center;background:transparent;border:none;border-radius:5px;color:#ccc;cursor:pointer;font-family:monospace;font-size:2.5em;height:1.2em;justify-content:center;justify-self:end;margin-bottom:-1.2em;margin-right:0;margin-top:0;overflow:hidden;padding:0;transition:color .1s,box-shadow .1s;width:1.2em;z-index:2}div:where(.swal2-container) button:where(.swal2-close):hover{background:transparent;color:#f27474;transform:none}div:where(.swal2-container) button:where(.swal2-close):focus-visible{box-shadow:inset 0 0 0 3px rgba(100,150,200,.5);outline:none}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) .swal2-html-container{color:inherit;font-size:1.125em;font-weight:400;justify-content:center;line-height:normal;margin:0;overflow:auto;padding:1em 1.6em .3em;text-align:center;z-index:1;word-wrap:break-word;word-break:break-word}div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) label:where(.swal2-checkbox),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) textarea:where(.swal2-textarea){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) textarea:where(.swal2-textarea){background:transparent;border:1px solid #d9d9d9;border-radius:.1875em;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px transparent;box-sizing:border-box;color:inherit;font-size:1.125em;transition:border-color .1s,box-shadow .1s;width:auto}div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:1px solid #b4dbed;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5);outline:none}div:where(.swal2-container) input:where(.swal2-file)::-moz-placeholder,div:where(.swal2-container) input:where(.swal2-input)::-moz-placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::-moz-placeholder{color:#ccc}div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{background:#fff;margin:1em 2em 3px}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{color:inherit;font-weight:600;text-align:center;width:20%}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{font-size:1.125em;height:2.625em;line-height:2.625em;padding:0}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{background:transparent;font-size:1.125em;margin-left:auto;margin-right:auto;width:75%}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{background:transparent;color:inherit;font-size:1.125em;max-width:100%;min-width:50%;padding:.375em .625em}div:where(.swal2-container) .swal2-checkbox,div:where(.swal2-container) .swal2-radio{align-items:center;background:#fff;color:inherit;justify-content:center}div:where(.swal2-container) .swal2-checkbox label,div:where(.swal2-container) .swal2-radio label{font-size:1.125em;margin:0 .6em}div:where(.swal2-container) .swal2-checkbox input,div:where(.swal2-container) .swal2-radio input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;background:#f0f0f0;color:#666;font-size:1em;font-weight:300;justify-content:center;margin:1em 0 0;overflow:hidden;padding:.625em}div:where(.swal2-container) div:where(.swal2-validation-message):before{background-color:#f27474;border-radius:50%;color:#fff;content:"!";display:inline-block;font-weight:600;height:1.5em;line-height:1.5em;margin:0 .625em;min-width:1.5em;text-align:center;width:1.5em}div:where(.swal2-container) .swal2-progress-steps{align-items:center;background:transparent;flex-wrap:wrap;font-weight:600;margin:1.25em auto;max-width:100%;padding:0}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{background:#2778c4;border-radius:2em;color:#fff;flex-shrink:0;height:2em;line-height:2em;text-align:center;width:2em;z-index:20}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{background:#2778c4;flex-shrink:0;height:.4em;margin:0 -1px;width:2.5em;z-index:10}div:where(.swal2-icon){border:.25em solid #000;border-radius:50%;box-sizing:content-box;cursor:default;font-family:inherit;height:5em;justify-content:center;line-height:5em;margin:2.5em auto .6em;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:5em}div:where(.swal2-icon) .swal2-icon-content{align-items:center;display:flex;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{flex-grow:1;position:relative}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{background-color:#f27474;border-radius:.125em;display:block;height:.3125em;position:absolute;top:2.3125em;width:2.9375em}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:#facea8;color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:#9de0f6;color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:#c9dae1;color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{border-radius:50%;height:7.5em;position:absolute;width:3.75em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{border-radius:7.5em 0 0 7.5em;left:-2.0635em;top:-.4375em;transform:rotate(-45deg);transform-origin:3.75em 3.75em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{border-radius:0 7.5em 7.5em 0;left:1.875em;top:-.6875em;transform:rotate(-45deg);transform-origin:0 3.75em}div:where(.swal2-icon).swal2-success .swal2-success-ring{border:.25em solid hsla(98,55%,69%,.3);border-radius:50%;box-sizing:content-box;height:100%;left:-.25em;position:absolute;top:-.25em;width:100%;z-index:2}div:where(.swal2-icon).swal2-success .swal2-success-fix{height:5.625em;left:1.625em;position:absolute;top:.5em;transform:rotate(-45deg);width:.4375em;z-index:1}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{background-color:#a5dc86;border-radius:.125em;display:block;height:.3125em;position:absolute;z-index:2}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{left:.8125em;top:2.875em;transform:rotate(45deg);width:1.5625em}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{right:.5em;top:2.375em;transform:rotate(-45deg);width:2.9375em}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:swal2-show .3s}.swal2-hide{animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}.swal2-rtl .swal2-close{margin-left:0;margin-right:0}.swal2-rtl .swal2-timer-progress-bar{left:auto;right:0}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotate(2deg)}33%{transform:translateY(0) rotate(-2deg)}66%{transform:translateY(.3125em) rotate(2deg)}to{transform:translateY(0) rotate(0deg)}}@keyframes swal2-toast-hide{to{opacity:0;transform:rotate(1deg)}}@keyframes swal2-toast-animate-success-line-tip{0%{left:.0625em;top:.5625em;width:0}54%{left:.125em;top:.125em;width:0}70%{left:-.25em;top:.625em;width:1.625em}84%{left:.75em;top:1.0625em;width:.5em}to{left:.1875em;top:1.125em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{right:1.375em;top:1.625em;width:0}65%{right:.9375em;top:1.25em;width:0}84%{right:0;top:.9375em;width:1.125em}to{right:.1875em;top:.9375em;width:1.375em}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}to{transform:scale(1)}}@keyframes swal2-hide{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.5)}}@keyframes swal2-animate-success-line-tip{0%{left:.0625em;top:1.1875em;width:0}54%{left:.125em;top:1.0625em;width:0}70%{left:-.375em;top:2.1875em;width:3.125em}84%{left:1.3125em;top:3em;width:1.0625em}to{left:.8125em;top:2.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{right:2.875em;top:3.375em;width:0}65%{right:2.875em;top:3.375em;width:0}84%{right:0;top:2.1875em;width:3.4375em}to{right:.5em;top:2.375em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}to{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;opacity:0;transform:scale(.4)}50%{margin-top:1.625em;opacity:0;transform:scale(.4)}80%{margin-top:-.375em;transform:scale(1.15)}to{margin-top:0;opacity:1;transform:scale(1)}}@keyframes swal2-animate-error-icon{0%{opacity:0;transform:rotateX(100deg)}to{opacity:1;transform:rotateX(0deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-1turn)}to{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{opacity:0;transform:rotate(45deg)}25%{opacity:.4;transform:rotate(-25deg)}50%{opacity:.8;transform:rotate(15deg)}75%{opacity:1;transform:rotate(-5deg)}to{opacity:1;transform:rotateX(0)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-container{background-color:transparent!important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static!important}}body.swal2-toast-shown .swal2-container{background-color:transparent;box-sizing:border-box;max-width:100%;pointer-events:none;width:360px}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}',"",{version:3,sources:["webpack://./node_modules/sweetalert2/src/scss/_toasts.scss","webpack://./node_modules/sweetalert2/src/variables.scss","webpack://./node_modules/sweetalert2/src/scss/_core.scss","webpack://./node_modules/sweetalert2/src/scss/_icons.scss","webpack://./node_modules/sweetalert2/src/scss/_toasts-animations.scss","webpack://./node_modules/sweetalert2/src/scss/_animations.scss","webpack://./node_modules/sweetalert2/src/scss/_body.scss","webpack://./node_modules/sweetalert2/src/scss/_toasts-body.scss"],names:[],mappings:"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B,CCnCrB,gCDuCwB,CCxCxB,kBDuCyB,CCtCzB,kBDuCwB,CCvCxB,kBDuCwB,CCjDxB,YAAA,CAIA,YDuCkB,CCzClB,sBDuC2B,CCpC3B,gBDuCkB,CCzClB,WD8CwB,CCpC1B,wDAIE,gCDZsB,CCatB,eDZuB,CCQvB,cDZkB,CCalB,oBDZmB,CCanB,yBDVuB,CCcvB,wEACE,cAAA,CAGF,8EAIE,kBAAA,CACA,wBDbkC,CCUlC,QDZwB,CCaxB,mBDZ+B,CCe/B,UDpNQ,CCqNR,aDb2B,CCe3B,4FACE,yCDfgC,CCmBpC,2EAIE,kBAAA,CACA,wBDlB+B,CCe/B,QDjBqB,CCkBrB,mBDjB4B,CCoB5B,UDlOQ,CCmOR,aDlBwB,CCoBxB,yFACE,uCDpB6B,CCwBjC,6EAIE,kBAAA,CACA,wBDvBiC,CCoBjC,QDtBuB,CCuBvB,mBDtB8B,CCyB9B,UDhPQ,CCiPR,aDvB0B,CCyB1B,2FACE,wCDzB+B,CC8BjC,4FACE,yCD1DwB,CC8D5B,sEACE,YDhEuB,CCmEzB,0EACE,QAAA,CAIJ,qDAGE,yBAAA,CACA,aDlIiB,CCmIjB,aDlIqB,CC8HrB,cDlIkB,CCmIlB,iBDlImB,CCsInB,iBDlIsB,CCqIxB,gEAQE,6BD5QkB,CC2QlB,8BD3QkB,CCuQlB,QAAA,CAEA,0BAAA,CADA,MAAA,CAEA,eAAA,CALA,iBAAA,CACA,ODtQkB,CC+QpB,iEAGE,yBD/IkC,CC8IlC,YD/I8B,CC8I9B,UD7IkC,CCkJpC,oDAEE,mBDrPiB,CCoPjB,cDpPiB,CCwPnB,uDAGE,kBDtJ6B,CCmK7B,sBDtJ4B,CCmJ5B,WDtJwB,CCuJxB,iBDxSkB,CC2SlB,UDtJuB,CCyJvB,cAAA,CAFA,qBDtJ6B,CCuJ7B,eDtJ2B,CCyI3B,YDtJwB,CCoJxB,sBDtJiC,CCuKjC,gBDzK8B,CC6J9B,oBAAA,CADA,cDtJqB,CCqJrB,YDrJqB,CCyJrB,eAAA,CADA,SDvJyB,CCyJzB,mCDvJF,CCgJE,WDtJuB,CCmJvB,SDtJ8B,CC2K9B,6DAEE,sBDtJgC,CCuJhC,aDxRQ,CCsRR,cDtRQ,CC2RV,qEAEE,+CDxJgC,CCuJhC,YDvJgC,CC2JlC,yEACE,QAAA,CAIJ,kDAME,aDpRyB,CCqRzB,iBDpR6B,CCqR7B,eDpR+B,CC8Q/B,sBDpRmC,CC2RnC,kBDpR+B,CC8Q/B,QDpR0B,CCsR1B,aDpR4B,CCmR5B,sBDpR2B,CC0R3B,iBDpR8B,CC2Q9B,SAAA,CAUA,oBDpR6B,CCqR7B,qBDpR8B,CCuRhC,4UAME,kBD1RiB,CC6RnB,uKAQE,sBD3RqB,CCyRrB,wBD/RiB,CCgSjB,qBD/RwB,CCiSxB,gED/RF,CCyRE,qBAAA,CAOA,aD5RgB,CC6RhB,iBD/RoB,CCyRpB,0CDrRF,CCoRE,UDxRoB,CCiSpB,0NACE,8BAAA,CACA,oCAAA,CAGF,yLACE,wBD/RqB,CCiSrB,yED9RJ,CC6RI,YD7RJ,CCiSE,6NACE,UAAA,CADF,8MACE,UAAA,CAIJ,yCAEE,eDpYU,CCmYV,kBDnYU,CCsYV,+CACE,SAAA,CAGF,gDAEE,aDzTc,CC0Td,eAAA,CACA,iBAAA,CAHA,SAGA,CAGF,+FAIE,iBDpUkB,CCkUlB,cDzUe,CC4Uf,mBD5Ue,CC0Uf,SD1Ue,CCgVnB,yCACE,cDjViB,CCkVjB,eDjVkB,CCoVpB,wCAIE,sBDjVqB,CCkVrB,iBDnVoB,CCiVpB,gBAAA,CADA,iBAAA,CADA,SD/UoB,CCsVtB,4CACE,aDxUoB,CCyUpB,aDxUqB,CC2UvB,0CAIE,sBD9VqB,CC+VrB,aD9VgB,CC+VhB,iBDjWoB,CC6VpB,cAAA,CADA,aAAA,CAEA,qBD9VoB,CCoWtB,qFAEE,kBAAA,CAEA,eDzbU,CC0bV,aDvWgB,CCqWhB,sBDrWgB,CCyWhB,iGAEE,iBD7WkB,CC4WlB,aD5WkB,CCgXpB,iGACE,aAAA,CACA,aAAA,CAIJ,4DACE,YAAA,CACA,sBDpWgC,CCqWhC,iBDtWuB,CCyWzB,iEACE,kBDtWmC,CC2WnC,kBDvWkC,CCwWlC,UDvW6B,CCwW7B,aDvWiC,CCwWjC,eDvWmC,CCgWnC,sBDtWuC,CCuWvC,cDtW8B,CCwW9B,eAAA,CADA,cDlWmC,CCyWnC,wEASE,wBDzbQ,CCwbR,iBAAA,CAEA,UDleQ,CCydR,WAAA,CACA,oBAAA,C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",sourceRoot:""}]);const o=r},663:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".rc-buttons{z-index:10}.rc-absolute-buttons{bottom:1.25rem;position:fixed;right:1.25rem;text-align:right}.rc-button{border:none!important;border-radius:7px!important;cursor:pointer;font-size:1rem!important;font-weight:700!important;line-height:150%!important;margin:.25rem!important;padding:1rem 1.5rem!important;text-align:center!important}.rc-go-button{background:rgba(255,154,0,.667)!important;color:#fff!important}.rc-go-button:hover{background:#ff9a00!important}.rc-go-button:active{background:#d68200!important}.rc-cancel-button,.rc-custom-button{background:hsla(0,0%,100%,.933)!important;color:#333!important}.rc-cancel-button:hover,.rc-custom-button:hover{background:#ddd!important}.rc-cancel-button:active,.rc-custom-button:active{background:#aaa!important;color:#000!important}.rc-button:disabled{background:#ddd!important;color:#999!important;cursor:default!important}","",{version:3,sources:["webpack://./src/css/buttons.scss"],names:[],mappings:"AAAA,YACE,UAAA,CAGF,qBAGE,cAAA,CAFA,cAAA,CAGA,aAAA,CAFA,gBAEA,CAGF,WAEE,qBAAA,CAMA,2BAAA,CACA,cAAA,CALA,wBAAA,CACA,yBAAA,CAFA,0BAAA,CAIA,uBAAA,CADA,6BAAA,CALA,2BAQA,CAGF,cACE,yCAAA,CACA,oBAAA,CAEA,oBACE,4BAAA,CAGF,qBACE,4BAAA,CAIJ,oCAEE,yCAAA,CACA,oBAAA,CAEA,gDACE,yBAAA,CAGF,kDACE,yBAAA,CACA,oBAAA,CAIJ,oBACE,yBAAA,CACA,oBAAA,CACA,wBAAA",sourceRoot:""}]);const o=r},290:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".my__swal2__container .swal2-select{border:2px solid #aaa!important;border-radius:5px!important;font-family:inherit!important;font-size:1.2rem!important;margin:auto 1.6rem!important;outline:none!important;padding-top:.5rem!important}.rc-form{font-family:inherit;font-size:2rem;pointer-events:auto!important}.rc-form .rc-form-inputs{display:flex;justify-content:space-between!important;margin:1rem 0}.rc-form .rc-form-inputs .rc-form-input,.rc-form .rc-form-inputs span{flex-grow:1;font-family:inherit;font-size:inherit;padding:.5rem}.rc-form .rc-form-inputs span{font-weight:700}.rc-form .rc-form-input{border:2px solid #aaa;border-radius:5px;outline:none;width:min(100%,10rem)}.rc-form .rc-form-input.rc-input-error{border-color:#ac0d0d!important;color:#ac0d0d!important}.rc-form .rc-form-input+.rc-form-input{margin-left:.5rem}.arrow-two-sided-svg{position:fixed}.arrow-two-sided-svg .arrow-two-sided{fill:#ff9a00}.arrow-two-sided-horizontal{bottom:10%;left:0;right:0;width:100%}.arrow-two-sided-vertical{bottom:0;height:100%;right:5%;top:0}","",{version:3,sources:["webpack://./src/css/check.scss"],names:[],mappings:"AAAA,oCAME,+BAAA,CADA,2BAAA,CADA,6BAAA,CAHA,0BAAA,CACA,4BAAA,CAKA,sBAAA,CAJA,2BAIA,CAOF,SAEE,mBAAA,CADA,cAAA,CAEA,6BAAA,CAEA,yBACE,YAAA,CACA,uCAAA,CACA,aAAA,CAEA,sEAEE,WAAA,CAEA,mBAAA,CACA,iBAAA,CAFA,aAEA,CAGF,8BACE,eAAA,CAIJ,wBACE,qBAAA,CAEA,iBAAA,CADA,YAAA,CAEA,qBAAA,CAEA,uCACE,8BAAA,CACA,uBAAA,CAIJ,uCACE,iBAAA,CAIJ,qBACE,cAAA,CAEA,sCACE,YAAA,CAIJ,4BAEE,UAAA,CACA,MAAA,CACA,OAAA,CAHA,UAGA,CAGF,0BAIE,QAAA,CAHA,WAAA,CACA,QAAA,CACA,KACA",sourceRoot:""}]);const o=r},2945:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#eye-side{font-weight:700}#blind-spot-canvas{bottom:0;display:block;left:0;margin:0;padding:0;position:fixed;right:0;top:0;z-index:-1}#blind-spot-instruction{max-width:unset!important}@media(min-width:641px){#blind-spot-instruction{font-size:1.1rem!important;width:65%!important}}@media(max-width:640px){#blind-spot-instruction{font-size:.9rem!important;width:90%!important}}#pip-video{display:none}#video-canvas{border-radius:6px;bottom:1rem;display:block;left:1rem;position:absolute;z-index:1000}#rc-ruler{cursor:pointer;max-height:120px;overflow:hidden;position:fixed;-webkit-user-select:none;-moz-user-select:none;user-select:none}#rc-ruler-scales{left:30px;pointer-events:none;position:absolute;top:0;z-index:1}#rc-ruler-scales #size-arrow{opacity:.5;transform:rotate(90deg) translateY(calc(50% + 3px))}#rc-ruler-scales .rc-ruler-scale-text{color:rgba(44,46,67,.667);font-weight:700;margin:0!important;padding:0;position:absolute;top:32px!important;transform:translate(-50%)!important}#rc-ruler-scales .rc-ruler-scale{display:block;position:absolute;top:0;transform:translate(-1px);width:2px;z-index:2}#rc-ruler-scales .rc-ruler-major{background-color:rgba(44,46,67,.933);height:30px}#rc-ruler-scales .rc-ruler-secondary{background-color:rgba(89,82,96,.867);height:24px}#rc-ruler-scales .rc-ruler-minor{background-color:rgba(89,82,96,.4);height:16px}.hide-nudger .calibration-nudger{display:none!important;opacity:0!important}.calibration-nudger,.gaze-nudger{bottom:0;box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:fixed;right:0;scrollbar-width:none;text-align:left;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:999999999}.calibration-nudger *,.gaze-nudger *{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}#rc-distance-correct{margin:0 auto auto;overflow-wrap:break-word;padding:2rem;text-align:left;width:100%}#rc-distance-correct #rc-distance-correct-instruction{font-size:7rem;font-weight:700;line-height:100%;margin:0 auto 2rem}#rc-distance-correct #rc-distance-correct-guide{font-size:3rem;font-weight:500;line-height:300%}#rc-distance-correct #rc-distance-correct-guide .rc-distance-num{border-radius:7px!important;font-family:monospace!important;font-size:9rem;font-weight:700;padding:.5rem;vertical-align:middle}","",{version:3,sources:["webpack://./src/css/distance.scss"],names:[],mappings:"AAAA,UACE,eAAA,CAGF,mBAME,QAAA,CAJA,aAAA,CAGA,MAAA,CAIA,QAAA,CADA,SAAA,CAPA,cAAA,CAMA,OAAA,CAHA,KAAA,CADA,UAMA,CAGF,wBAEE,yBAAA,CAGF,wBACE,wBAEE,0BAAA,CADA,mBACA,CAAA,CAIJ,wBACE,wBAEE,yBAAA,CADA,mBACA,CAAA,CAIJ,WACE,YAAA,CAGF,cAME,iBAAA,CAFA,WAAA,CADA,aAAA,CAEA,SAAA,CAHA,iBAAA,CADA,YAKA,CAKF,UAKE,cAAA,CAHA,gBAAA,CACA,eAAA,CAFA,cAAA,CAKA,wBAAA,CAAA,qBAAA,CAAA,gBAAA,CAGF,iBAGE,SAAA,CAEA,mBAAA,CAJA,iBAAA,CACA,KAAA,CAEA,SACA,CAEA,6BAEE,UAAA,CADA,mDACA,CAGF,sCAKE,yBAAA,CACA,eAAA,CAHA,kBAAA,CACA,SAAA,CAHA,iBAAA,CACA,kBAAA,CAKA,mCAAA,CAGF,iCAEE,aAAA,CADA,iBAAA,CAEA,KAAA,CAEA,yBAAA,CADA,SAAA,CAEA,SAAA,CAGF,iCACE,oCAAA,CACA,WAAA,CAGF,qCACE,oCAAA,CACA,WAAA,CAGF,iCACE,kCAAA,CACA,WAAA,CAOF,iCACE,sBAAA,CACA,mBAAA,CAIJ,iCASE,QAAA,CAIA,qBAAA,CARA,WAAA,CAEA,MAAA,CAGA,QAAA,CACA,eAAA,CARA,cAAA,CAKA,OAAA,CAOA,oBAAA,CADA,eAAA,CARA,KAAA,CAMA,wBAAA,CAAA,qBAAA,CAAA,gBAAA,CARA,UAAA,CAFA,iBAaA,CAEA,qCACE,wHAAA,CAKJ,qBAGE,kBAAA,CAEA,wBAAA,CADA,YAAA,CAHA,eAAA,CACA,UAGA,CAEA,sDAEE,cAAA,CADA,eAAA,CAGA,gBAAA,CADA,kBACA,CAGF,gDAEE,cAAA,CADA,eAAA,CAEA,gBAAA,CAEA,iEAEE,2BAAA,CAEA,+BAAA,CAEA,cAAA,CAHA,eAAA,CAFA,aAAA,CAIA,qBACA",sourceRoot:""}]);const o=r},4636:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,":root{--rc-panel-theme-color:#3490de;--rc-panel-darken-color:#185b94;--rc-panel-theme-color-semi:#3490de66;--rc-panel-darken-color-semi:#185b9488}.rc-panel{background-color:var(--rc-panel-theme-color);border-radius:10px!important;box-shadow:var(--rc-panel-darken-color-semi) 0 50px 100px -20px,var(--rc-panel-theme-color-semi) 0 30px 60px -30px!important;display:block;margin-left:auto!important;margin-right:auto!important;max-width:720px!important;overflow:hidden;padding:.75rem!important;position:relative;width:100%}.rc-panel *{box-sizing:border-box;outline:none;text-rendering:optimizeLegibility;vertical-align:baseline;-webkit-font-smoothing:auto;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-kerning:normal;scrollbar-width:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.rc-panel .rc-panel-title{color:#fff!important;font-size:2rem!important;font-weight:600!important;margin:1rem 1rem 0!important}.rc-panel .rc-panel-description{color:hsla(0,0%,100%,.8)!important;font-size:1rem!important;font-weight:500!important;margin:.5rem 1rem 0!important}.rc-panel #rc-panel-language-parent{display:flex;flex-direction:row-reverse;margin:0;padding:0}.rc-panel #rc-panel-language-parent #rc-panel-lang-picker{background-color:hsla(0,0%,100%,.8)!important;border:none!important;border-radius:5px!important;display:block;font-size:1rem!important;font-weight:500!important;margin:.25rem .25rem 0!important;outline:none!important;padding:.25rem!important}.rc-panel .rc-panel-steps{margin:-3rem 0 0!important;padding-top:4rem!important}.rc-panel .rc-panel-steps.rc-panel-steps-l,.rc-panel .rc-panel-steps.rc-panel-steps-s{display:flex!important;justify-content:space-between!important}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step{background:hsla(0,0%,100%,.8);flex-grow:1!important;margin:.25rem!important;padding:0!important;position:relative;text-align:center;transition:background-color .2s}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step .rc-panel-step-use,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step .rc-panel-step-use{font-size:1rem!important;line-height:170%!important;margin:0!important;padding:0 .3rem!important;position:absolute;right:0;top:0}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step .rc-panel-step-use svg,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step .rc-panel-step-use svg{height:1rem;width:1rem;fill:var(--rc-panel-darken-color)}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step .rc-panel-step-name,.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step .rc-panel-step-name{color:var(--rc-panel-darken-color);font-size:1rem!important;font-weight:700!important;line-height:150%!important;white-space:nowrap}.rc-panel .rc-panel-steps.rc-panel-steps-l{flex-flow:row nowrap;max-width:100%;overflow-x:scroll}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step-name{margin:1.5rem .5rem!important}.rc-panel .rc-panel-steps.rc-panel-steps-l .rc-panel-step-use-tip{bottom:110%!important;display:flex!important;left:50%!important;position:absolute!important;transform:translate(-50%)!important}.rc-panel .rc-panel-steps.rc-panel-steps-s{flex-flow:column nowrap;overflow-x:hidden}.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step{overflow-x:hidden;text-align:left;white-space:nowrap}.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step-name{margin:1.2rem .75rem 1.2rem 1.5rem!important}.rc-panel .rc-panel-steps.rc-panel-steps-s .rc-panel-step-use-tip{display:inline-flex!important;position:relative!important}.rc-panel .rc-panel-steps .rc-panel-step{border:none!important;border-radius:7px!important}.rc-panel .rc-panel-steps .rc-panel-step .rc-panel-step-name{display:inline-block!important;position:relative!important}.rc-panel .rc-panel-steps .rc-panel-step-use-tip{align-items:center!important;background-color:rgba(255,154,0,.933)!important;border:none!important;border-radius:7px!important;color:#fff!important;font-size:.75rem!important;font-weight:500!important;justify-content:center!important;line-height:100%!important;margin:0!important;opacity:0;padding:.7rem .5rem!important;pointer-events:none;text-align:center!important;transition:opacity .2s;width:-moz-max-content!important;width:max-content!important;z-index:10!important}.rc-panel .rc-panel-steps .rc-panel-step-use-tip svg{height:.75rem;width:.75rem;fill:#fff}.rc-panel .rc-panel-steps .rc-panel-step-use-tip svg:last-of-type{margin-right:5px}.rc-panel .rc-panel-steps .rc-panel-step-todo:focus,.rc-panel .rc-panel-steps .rc-panel-step-todo:hover{background-color:#fff}.rc-panel .rc-panel-steps .rc-panel-step-todo:focus .rc-panel-step-use-tip,.rc-panel .rc-panel-steps .rc-panel-step-todo:hover .rc-panel-step-use-tip{opacity:1!important}.rc-panel .rc-panel-steps .rc-panel-step-todo:active{background-color:hsla(0,0%,93%,.8)}.rc-panel .rc-panel-steps .rc-panel-step-finished{background-color:hsla(0,0%,73%,.8)!important}.rc-panel .rc-panel-steps .rc-panel-step-inactive{opacity:.6;pointer-events:none}.rc-panel .rc-panel-steps .rc-panel-step-active{cursor:pointer;opacity:1}.rc-panel ::-webkit-scrollbar{display:none;width:0}.rc-panel .rc-panel-debug-control{background-color:hsla(0,0%,100%,.8);border:3px solid #e00;border-radius:7px;margin:1rem 0 0;overflow:hidden;padding:.5rem}.rc-panel .rc-panel-debug-control *{color:#ac0d0d}.rc-panel .rc-panel-debug-control h2,.rc-panel .rc-panel-debug-control h3,.rc-panel .rc-panel-debug-control p{margin:0!important}.rc-panel .rc-panel-debug-control h2{font-size:1.2rem!important;font-weight:700!important}.rc-panel .rc-panel-debug-control h3{font-size:.9rem;font-variant:small-caps;font-weight:500;padding-bottom:.3rem;padding-top:.5rem}.rc-panel .rc-panel-debug-control .rc-panel-debug-bold-text{font-size:1rem!important;font-weight:700}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-next{background-color:#e00;border:none;border-radius:5px;color:#fff;cursor:pointer;font-size:.9rem!important;margin:1rem 0 0;padding:.5rem 1.2rem!important}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-next:hover{background-color:#ac0d0d}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row{display:inline-flex;justify-content:flex-start!important;width:100%}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element{flex-grow:1;overflow-x:hidden;padding:0 .1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element:first-of-type{padding-left:0}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element:last-of-type{padding-right:0}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element p{color:#ac0d0d;font-size:.65rem!important;line-height:150%!important;padding-left:1px!important}.rc-panel .rc-panel-debug-control .rc-panel-debug-control-task-row .value-element input{background-color:hsla(0,0%,100%,.8);border:1px solid #e99!important;border-radius:3px!important;font-size:.8rem;margin:0!important;padding:.3rem!important;pointer-events:auto;-webkit-user-select:auto;-moz-user-select:auto;user-select:auto;width:100%}","",{version:3,sources:["webpack://./src/css/panel.scss"],names:[],mappings:"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",sourceRoot:""}]);const o=r},5151:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#size-card,#size-usba,#size-usbc{display:block;height:auto;left:2rem;position:absolute;z-index:2}#size-arrow{display:block;height:auto;position:absolute;width:70px;z-index:1}#size-arrow-fill{transition:fill .3s}.minor{transition:opacity .25s}.rc-slider:active~.size-obj .minor{opacity:0}#matching-obj{background-color:#fff;border:none;border-radius:7px;font-size:1.1rem;font-weight:600;margin-bottom:unset;margin-left:.3rem;margin-right:.3rem;margin-top:unset;padding-bottom:unset;padding-left:.3rem;padding-right:.3rem;padding-top:unset;pointer-events:auto!important;vertical-align:middle}@media(min-width:481px){.rc-size-obj-selection{display:inline-flex}}@media(max-width:480px){.rc-size-obj-selection{display:inline-block}}","",{version:3,sources:["webpack://./src/css/screenSize.scss"],names:[],mappings:"AAAA,iCAIE,aAAA,CAGA,WAAA,CADA,SAAA,CAHA,iBAAA,CAKA,SAAA,CAGF,YAEE,aAAA,CAGA,WAAA,CAJA,iBAAA,CAGA,UAAA,CAEA,SAAA,CAGF,iBACE,mBAAA,CAGF,OACE,uBAAA,CAIF,mCACE,SAAA,CAKF,cAGE,qBAAA,CADA,WAAA,CADA,iBAAA,CAMA,gBAAA,CADA,eAAA,CADA,mBAAA,CAAA,iBAAA,CAAA,kBAAA,CAAA,gBAAA,CADA,oBAAA,CAAA,kBAAA,CAAA,mBAAA,CAAA,iBAAA,CAKA,6BAAA,CADA,qBACA,CAGF,wBACE,uBACE,mBAAA,CAAA,CAIJ,wBACE,uBACE,oBAAA,CAAA",sourceRoot:""}]);const o=r},5319:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".rc-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:linear-gradient(90deg,#ffc772,#ffc772 60%,#fff 0);border-radius:5px;cursor:grab;direction:ltr!important;display:block;height:10px;left:2rem;opacity:1;position:absolute;transition:opacity .3s;width:calc(100% - 4rem);z-index:10}.rc-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:#ff9a00;border:1px solid #cc7a00;border-radius:15px;box-shadow:0 0 12px 0 rgba(136,82,0,.2);cursor:inherit;height:30px;width:30px}.rc-slider::-moz-range-thumb{-moz-appearance:none;appearance:none;background:#ff9a00;border:1px solid #cc7a00;border-radius:15px;box-shadow:0 0 12px 0 rgba(136,82,0,.2);cursor:inherit;height:30px;width:30px}.rc-slider::-ms-thumb{appearance:none;background:#ff9a00;border:1px solid #cc7a00;border-radius:15px;box-shadow:0 0 12px 0 rgba(136,82,0,.2);cursor:inherit;height:30px;width:30px}","",{version:3,sources:["webpack://./src/css/slider.scss"],names:[],mappings:"AAAA,WAGE,uBAAA,CAAA,oBAAA,CAAA,eAAA,CAGA,4DAAA,CAIA,iBAAA,CAEA,WAAA,CAEA,uBAAA,CAZA,aAAA,CAGA,WAAA,CAIA,SAAA,CAFA,SAAA,CANA,iBAAA,CAYA,sBAAA,CATA,uBAAA,CAOA,UAGA,CAkBF,iCAVE,uBAAA,CAAA,eAAA,CAKA,kBAAA,CADA,wBAAA,CADA,kBAAA,CAGA,uCAAA,CACA,cAAA,CALA,WAAA,CADA,UAMA,CAOF,6BAdE,oBAAA,CAAA,eAAA,CAKA,kBAAA,CADA,wBAAA,CADA,kBAAA,CAGA,uCAAA,CACA,cAAA,CALA,WAAA,CADA,UAMA,CAWF,sBAlBE,eAAA,CAKA,kBAAA,CADA,wBAAA,CADA,kBAAA,CAGA,uCAAA,CACA,cAAA,CALA,WAAA,CADA,UAMA",sourceRoot:""}]);const o=r},4889:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#webgazerVideoContainer .webgazer-videoinput-select{background:hsla(0,0%,100%,.8)!important;border:none!important;border-radius:.6rem!important;color:#666;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:.6rem;left:0;line-height:100%;margin:.3rem;outline:none!important;padding:.2rem .3rem;position:absolute;top:0;z-index:9}","",{version:3,sources:["webpack://./src/css/video.scss"],names:[],mappings:"AACE,oDAcE,uCAAA,CAHA,qBAAA,CAEA,6BAAA,CAEA,UAAA,CARA,wHAAA,CAEA,eAAA,CALA,MAAA,CAMA,gBAAA,CALA,YAAA,CAOA,sBAAA,CANA,mBAAA,CAJA,iBAAA,CACA,KAAA,CAFA,SAcA",sourceRoot:""}]);const o=r},9057:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#gaze-system-instruction{top:65%;white-space:pre}.gaze-nudge-instruction{top:65%}.gaze-calibration-dot{background:#ff005c80;cursor:auto;display:block;position:fixed!important;transition-timing-function:ease-in-out;transition:left .5s,right .5s,top .5s,bottom .5s;z-index:999999998}.gaze-calibration-dot-click{background:#ff005c;cursor:pointer;margin:auto;position:absolute;text-align:center;vertical-align:middle}.gaze-calibration-dot-click:active{opacity:.3}.gaze-calibration-dot-text{color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif;font-size:.9rem;font-weight:500;vertical-align:text-bottom}#webgazerGazeDot,#webgazerGazeDot-tempClone,.gaze-calibration-dot-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}#webgazerGazeDot,#webgazerGazeDot-tempClone{background-color:#111d5e;border-radius:5px;opacity:.5;position:fixed;z-index:9999999999}#webgazerVideoContainer{border-radius:5px;display:block;overflow:hidden;position:fixed!important;transform-origin:bottom left;z-index:999999997}#webgazerFaceFeedbackBox,#webgazerVideoContainer,#webgazerVideoContainer *{-webkit-user-select:none;-moz-user-select:none;user-select:none}#webgazerFaceFeedbackBox{border-radius:10px;box-sizing:border-box;opacity:.6;pointer-events:none}.rc-crosshair,.rc-gaze-nudger-arrows{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.rc-crosshair{border-radius:50%;cursor:pointer;display:block;height:40px;position:fixed!important;transition-timing-function:ease-in-out;transition:left .5s,right .5s,top .5s,bottom .5s;width:40px;z-index:999999999}.rc-crosshair-component{background-color:#000;left:50%;margin:auto;pointer-events:none;position:absolute;top:50%;transform:translate(-50%,-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}","",{version:3,sources:["webpack://./src/css/gaze.css"],names:[],mappings:"AAAA,yBACE,OAAQ,CACR,eACF,CAEA,wBACE,OACF,CAEA,sBACE,oBAAqB,CAGrB,WAAe,CADf,aAAc,CADd,wBAA0B,CAI1B,sCAAuC,CACvC,gDAIa,CANb,iBAOF,CAEA,4BAEE,kBAAmB,CAEnB,cAAe,CADf,WAAY,CAFZ,iBAAkB,CAIlB,iBAAkB,CAClB,qBACF,CAEA,mCACE,UACF,CAEA,2BAIE,UAAW,CAHX,wHAC8D,CAG9D,eAAiB,CAFjB,eAAgB,CAGhB,0BAGF,CAIA,uEALE,mBAAoB,CADpB,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAeF,CATA,4CAKE,wBAAyB,CACzB,iBAAkB,CAFlB,UAAY,CAFZ,cAAe,CACf,kBAMF,CAEA,wBAKE,iBAAkB,CAHlB,aAAc,CAKd,eAAgB,CAJhB,wBAA0B,CAC1B,4BAA6B,CAH7B,iBASF,CAMA,2EAPE,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAcF,CAPA,yBAGE,kBAAmB,CADnB,qBAAsB,CAEtB,UAAY,CACZ,mBAEF,CAIA,qCAEE,iBAAkB,CAIlB,wBAAiB,CAAjB,qBAAiB,CAAjB,gBACF,CAEA,cAcE,iBAAkB,CARlB,cAAe,CAJf,aAAc,CAEd,WAAY,CAHZ,wBAA0B,CAM1B,sCAAuC,CACvC,gDAIa,CATb,UAAW,CAEX,iBAUF,CAEA,wBAQE,qBAAsB,CALtB,QAAS,CAET,WAAY,CACZ,mBAAoB,CALpB,iBAAkB,CAClB,OAAQ,CAER,8BAAgC,CAGhC,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAEF",sourcesContent:["#gaze-system-instruction {\n top: 65%;\n white-space: pre;\n}\n\n.gaze-nudge-instruction {\n top: 65%;\n}\n\n.gaze-calibration-dot {\n background: #ff005c80;\n position: fixed !important;\n display: block;\n cursor: initial;\n z-index: 999999998;\n transition-timing-function: ease-in-out;\n transition:\n left 0.5s,\n right 0.5s,\n top 0.5s,\n bottom 0.5s;\n}\n\n.gaze-calibration-dot-click {\n position: absolute;\n background: #ff005c;\n margin: auto;\n cursor: pointer;\n text-align: center;\n vertical-align: middle;\n}\n\n.gaze-calibration-dot-click:active {\n opacity: 0.3;\n}\n\n.gaze-calibration-dot-text {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n font-weight: 500;\n color: #fff;\n font-size: 0.9rem;\n vertical-align: text-bottom;\n user-select: none;\n pointer-events: none;\n}\n\n/* ----------------------------- WebGazer Native ---------------------------- */\n\n#webgazerGazeDot,\n#webgazerGazeDot-tempClone {\n position: fixed;\n z-index: 9999999999;\n opacity: 0.5;\n background-color: #111d5e;\n border-radius: 5px;\n pointer-events: none;\n user-select: none;\n}\n\n#webgazerVideoContainer {\n z-index: 999999997;\n display: block;\n position: fixed !important;\n transform-origin: bottom left;\n border-radius: 5px;\n /* opacity: 0.8; */\n overflow: hidden;\n /* pointer-events: none; */\n user-select: none;\n}\n\n#webgazerVideoContainer * {\n user-select: none;\n}\n\n#webgazerFaceFeedbackBox {\n /* TODO Set style in sub-module */\n box-sizing: border-box;\n border-radius: 10px;\n opacity: 0.6;\n pointer-events: none;\n user-select: none;\n}\n\n/* ------------------------------- Gaze Nudger ------------------------------ */\n\n.rc-crosshair,\n.rc-gaze-nudger-arrows {\n position: absolute;\n /* top: 50%;\n left: 50%;\n transform: translate(-50%, -50%); */\n user-select: none;\n}\n\n.rc-crosshair {\n position: fixed !important;\n display: block;\n width: 40px;\n height: 40px;\n z-index: 999999999;\n cursor: pointer;\n transition-timing-function: ease-in-out;\n transition:\n left 0.5s,\n right 0.5s,\n top 0.5s,\n bottom 0.5s;\n /* filter: drop-shadow(0 0 3px #fff); */\n border-radius: 50%;\n}\n\n.rc-crosshair-component {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n margin: auto;\n pointer-events: none;\n user-select: none;\n background-color: #000;\n}\n"],sourceRoot:""}]);const o=r},9725:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,"#calibration-background{bottom:0;box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;overflow-y:scroll;position:fixed;right:0;scrollbar-width:none;text-align:center;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:999999990}#calibration-background::-webkit-scrollbar{display:none;width:0}#calibration-background *{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif}#calibration-background p{line-height:150%}.calibration-instruction{pointer-events:none;position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none}.calibration-instruction-scrollable{height:200%}.calibration-trackDistance-check-progessBar-container{background-color:#f3f3f3;bottom:0;height:40px;left:0;position:fixed;width:100%;z-index:999999999999}.calibration-trackDistance-check-progessBar{background-color:#4caf50;height:100%;transition:width .3s ease;width:0}.calibration-trackDistance-check-progessBar-text{color:#000;font-size:30px;left:50%;margin:0;position:absolute;top:10%}.calibration-trackDistance-check-viewingDistance-container{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;line-height:1;position:fixed;right:0;top:0;width:50%;z-index:999999999999}.calibration-trackDistance-check-viewingDistance{font-size:60vh;margin:0}.calibration-trackDistance-check-viewingDistance-units{font-size:30vh;margin:0}.calibration-instruction-left{bottom:0;left:0;margin:auto;right:50%;top:0}.calibration-instruction h1{font-weight:700;min-width:360px}.calibration-instruction *{font-size:1.2rem;line-height:170%;margin:0;padding:0}.calibration-instruction p{margin-top:1rem;white-space:pre-line}.calibration-description{line-height:170%}.rc-hang-description{font-size:1rem!important;margin-top:50vh!important}@media (min-width:481px){.calibration-instruction{margin:2rem}.calibration-instruction h1{font-size:2.5rem!important;line-height:100%}.calibration-description{width:calc(100% - 4rem);width:max(min(100% - 4rem,960px),300px)}.calibration-description,.calibration-description *{font-size:1.2rem}.calibration-credit-text{font-size:.9rem!important}}@media (max-width:480px){.calibration-instruction{margin:1rem}.calibration-instruction h1{font-size:1.8rem!important;line-height:120%}.calibration-description{width:calc(100% - 1rem)}.calibration-description,.calibration-description *{font-size:1rem}.calibration-credit-text{font-size:.7rem!important}}.float-instruction{background:hsla(0,0%,100%,.9);border-radius:10px;font-size:1rem;font-weight:500;left:50%;margin:0;max-width:25rem;padding:10px 17px;position:fixed;text-align:center;transform:translate(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:999999991}.swal2-container{z-index:999999999!important}.calibration-credit-text{bottom:3px!important;color:#999!important;line-height:100%!important;margin:0!important;padding:0!important;position:fixed!important;text-align:center!important;width:100%!important}.lock-view{overflow:hidden!important}.rc-lang-ltr{direction:ltr!important;text-align:left!important}.rc-lang-rtl{direction:rtl!important;text-align:right!important}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}","",{version:3,sources:["webpack://./src/css/main.css"],names:[],mappings:"AACA,wBAQE,QAAS,CAMT,qBAAsB,CAVtB,WAAY,CAEZ,MAAO,CAGP,QAAS,CAET,eAAgB,CAChB,iBAAkB,CAVlB,cAAe,CAKf,OAAQ,CASR,oBAAqB,CADrB,iBAAkB,CAVlB,KAAM,CAQN,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAAiB,CAVjB,UAAW,CAFX,iBAgBF,CAEA,2CAEE,YAAa,CADb,OAEF,CAEA,0BACE,wHAEF,CAEA,0BACE,gBACF,CAEA,yBAGE,mBAAoB,CAFpB,iBAAkB,CAClB,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAEF,CAEA,oCACE,WACF,CAEA,sDAME,wBAAyB,CAJzB,QAAS,CAGT,WAAY,CAFZ,MAAO,CAFP,cAAe,CAGf,UAAW,CAGX,oBACF,CAEA,4CAGE,wBAAyB,CAFzB,WAAY,CAGZ,yBAA2B,CAF3B,OAGF,CAEA,iDAKE,UAAW,CACX,cAAe,CAHf,QAAS,CAIT,QAAS,CANT,iBAAkB,CAClB,OAMF,CACA,2DAQE,kBAAmB,CAFnB,YAAa,CACb,qBAAsB,CAFtB,WAAY,CAIZ,sBAAuB,CAEvB,aAAc,CAVd,cAAe,CAEf,OAAQ,CADR,KAAM,CAEN,SAAU,CAMV,oBAEF,CACA,iDACE,cAAe,CACf,QACF,CACA,uDACE,cAAe,CACf,QACF,CAEA,8BAKE,QAAS,CAHT,MAAO,CAIP,WAAY,CAHZ,SAAU,CACV,KAGF,CAEA,4BAEE,eAAgB,CADhB,eAEF,CAEA,2BACE,gBAAiB,CACjB,gBAAiB,CACjB,QAAS,CACT,SACF,CAEA,2BAEE,eAAgB,CADhB,oBAEF,CAEA,yBACE,gBACF,CAEA,qBAEE,wBAA0B,CAD1B,yBAEF,CAKA,yBACE,yBACE,WACF,CAEA,4BAEE,0BAA4B,CAD5B,gBAEF,CAEA,yBACE,uBAAwB,CACxB,uCACF,CAEA,oDAEE,gBACF,CAEA,yBACE,yBACF,CACF,CAEA,yBACE,yBACE,WACF,CAEA,4BAEE,0BAA4B,CAD5B,gBAEF,CAEA,yBACE,uBACF,CAEA,oDAEE,cACF,CAEA,yBACE,yBACF,CACF,CAEA,mBAIE,6BAAoC,CAMpC,kBAAmB,CACnB,cAAe,CACf,eAAgB,CALhB,QAAS,CADT,QAAS,CAET,eAAgB,CAHhB,iBAAkB,CAJlB,cAAe,CACf,iBAAkB,CAOlB,yBAA6B,CAN7B,wBAAiB,CAAjB,qBAAiB,CAAjB,gBAAiB,CAUjB,iBACF,CAIA,iBACE,2BACF,CAIA,yBAGE,oBAAsB,CACtB,oBAAsB,CAGtB,0BAA4B,CAF5B,kBAAoB,CACpB,mBAAqB,CALrB,wBAA0B,CAO1B,2BAA6B,CAN7B,oBAOF,CAIA,WACE,yBACF,CAIA,aACE,uBAAyB,CACzB,yBACF,CAEA,aACE,uBAAyB,CACzB,0BACF,CAMA,aACE,WACF,CAEA,iBACE,eACF",sourcesContent:["/* background div */\n#calibration-background {\n z-index: 999999990;\n position: fixed;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n margin: 0;\n /* background: #eee; */\n overflow: hidden;\n overflow-y: scroll;\n user-select: none;\n box-sizing: border-box;\n text-align: center;\n scrollbar-width: none;\n}\n\n#calibration-background::-webkit-scrollbar {\n width: 0;\n display: none;\n}\n\n#calibration-background * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\n}\n\n#calibration-background p {\n line-height: 150%;\n}\n\n.calibration-instruction {\n position: absolute;\n user-select: none;\n pointer-events: none;\n}\n\n.calibration-instruction-scrollable {\n height: 200%;\n}\n\n.calibration-trackDistance-check-progessBar-container {\n position: fixed;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 40px;\n background-color: #f3f3f3;\n z-index: 999999999999;\n}\n\n.calibration-trackDistance-check-progessBar {\n height: 100%;\n width: 0%;\n background-color: #4caf50;\n transition: width 0.3s ease;\n}\n\n.calibration-trackDistance-check-progessBar-text {\n position: absolute;\n top: 10%;\n left: 50%;\n /* transform: translate(-50%, -80%); */\n color: #000;\n font-size: 30px;\n margin: 0;\n}\n.calibration-trackDistance-check-viewingDistance-container {\n position: fixed;\n top: 0;\n right: 0;\n width: 50%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n z-index: 999999999999;\n line-height: 1;\n}\n.calibration-trackDistance-check-viewingDistance {\n font-size: 60vh;\n margin: 0;\n}\n.calibration-trackDistance-check-viewingDistance-units {\n font-size: 30vh;\n margin: 0;\n}\n\n.calibration-instruction-left {\n /* use only the left half of the screen */\n left: 0;\n right: 50%;\n top: 0;\n bottom: 0;\n margin: auto;\n}\n\n.calibration-instruction h1 {\n min-width: 360px;\n font-weight: 700;\n}\n\n.calibration-instruction * {\n font-size: 1.2rem;\n line-height: 170%;\n margin: 0;\n padding: 0;\n}\n\n.calibration-instruction p {\n white-space: pre-line;\n margin-top: 1rem;\n}\n\n.calibration-description {\n line-height: 170%;\n}\n\n.rc-hang-description {\n margin-top: 50vh !important;\n font-size: 1rem !important;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Screen size specific */\n\n@media (min-width: 481px) {\n .calibration-instruction {\n margin: 2rem;\n }\n\n .calibration-instruction h1 {\n line-height: 100%;\n font-size: 2.5rem !important;\n }\n\n .calibration-description {\n width: calc(100% - 4rem);\n width: max(min(100% - 4rem, 960px), 300px);\n }\n\n .calibration-description,\n .calibration-description * {\n font-size: 1.2rem;\n }\n\n .calibration-credit-text {\n font-size: 0.9rem !important;\n }\n}\n\n@media (max-width: 480px) {\n .calibration-instruction {\n margin: 1rem;\n }\n\n .calibration-instruction h1 {\n line-height: 120%;\n font-size: 1.8rem !important;\n }\n\n .calibration-description {\n width: calc(100% - 1rem);\n }\n\n .calibration-description,\n .calibration-description * {\n font-size: 1rem;\n }\n\n .calibration-credit-text {\n font-size: 0.7rem !important;\n }\n}\n\n.float-instruction {\n position: fixed;\n text-align: center;\n user-select: none;\n background: rgba(255, 255, 255, 0.9);\n padding: 10px 17px;\n margin: 0;\n left: 50%;\n max-width: 25rem;\n transform: translate(-50%, 0);\n border-radius: 10px;\n font-size: 1rem;\n font-weight: 500;\n z-index: 999999991;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.swal2-container {\n z-index: 999999999 !important;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.calibration-credit-text {\n position: fixed !important;\n width: 100% !important;\n bottom: 3px !important;\n color: #999 !important;\n margin: 0 !important;\n padding: 0 !important;\n line-height: 100% !important;\n text-align: center !important;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.lock-view {\n overflow: hidden !important;\n}\n\n/* -------------------------------------------------------------------------- */\n\n.rc-lang-ltr {\n direction: ltr !important;\n text-align: left !important;\n}\n\n.rc-lang-rtl {\n direction: rtl !important;\n text-align: right !important;\n}\n\n/* -------------------------------------------------------------------------- */\n/* --------------------------------- CURSOR --------------------------------- */\n/* -------------------------------------------------------------------------- */\n\n.cursor-grab {\n cursor: grab;\n}\n\n.cursor-grabbing {\n cursor: grabbing;\n}\n"],sourceRoot:""}]);const o=r},2535:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var a=n(1354),i=n.n(a),s=n(6314),r=n.n(s)()(i());r.push([e.id,".swal2-container{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Open Sans,Helvetica Neue,sans-serif!important}.my__swal2__icon{font-weight:700!important;-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.my__swal2__icon *{color:#ff9a00!important}.my__swal2__title{color:#000!important;font-size:2rem!important;font-weight:700!important}.my__swal2__html,.my__swal2__title{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.my__swal2__html{color:#444!important;font-size:1.2rem!important;font-weight:400!important;line-height:150%!important;margin:1.6rem}.my__swal2__html__center{text-align:center!important}.animate__animated.animate__fadeInUp,.animate__animated.animate__fadeOutDown{--animate-duration:400ms!important;--animate-delay:0!important}.fadeInUp,.fadeOutDown{animation-delay:0!important;animation-duration:.4s!important}","",{version:3,sources:["webpack://./src/css/swal.css"],names:[],mappings:"AAAA,iBACE,kIAEF,CAEA,iBACE,yBAA4B,CAC5B,kCAA4B,CAA5B,+BAA4B,CAA5B,0BACF,CAEA,mBACE,uBACF,CAEA,kBACE,oBAAsB,CACtB,wBAA0B,CAC1B,yBAEF,CAEA,mCAHE,kCAA4B,CAA5B,+BAA4B,CAA5B,0BAUF,CAPA,iBAEE,oBAAsB,CACtB,0BAA4B,CAE5B,yBAA8B,CAD9B,0BAA4B,CAH5B,aAMF,CAEA,yBACE,2BACF,CAEA,6EAEE,kCAAoC,CACpC,2BACF,CAEA,uBAGE,2BAA6B,CAD7B,gCAEF",sourcesContent:[".swal2-container {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen,\n Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif !important;\n}\n\n.my__swal2__icon {\n font-weight: bold !important;\n user-select: none !important;\n}\n\n.my__swal2__icon * {\n color: #ff9a00 !important;\n}\n\n.my__swal2__title {\n color: #000 !important;\n font-size: 2rem !important;\n font-weight: bold !important;\n user-select: none !important;\n}\n\n.my__swal2__html {\n margin: 1.6rem;\n color: #444 !important;\n font-size: 1.2rem !important;\n line-height: 150% !important;\n font-weight: normal !important;\n user-select: none !important;\n}\n\n.my__swal2__html__center {\n text-align: center !important;\n}\n\n.animate__animated.animate__fadeInUp,\n.animate__animated.animate__fadeOutDown {\n --animate-duration: 400ms !important;\n --animate-delay: 0 !important;\n}\n\n.fadeInUp,\n.fadeOutDown {\n animation-duration: 400ms !important;\n animation-delay: 0 !important;\n}\n"],sourceRoot:""}]);const o=r},6314:e=>{"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n="",a=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),a&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),a&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n})).join("")},t.i=function(e,n,a,i,s){"string"==typeof e&&(e=[[null,e,void 0]]);var r={};if(a)for(var o=0;o0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=s),n&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=n):c[2]=n),i&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=i):c[4]="".concat(i)),t.push(c))}},t}},1354:e=>{"use strict";e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var a=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(a),s="/*# ".concat(i," */");return[t].concat([s]).join("\n")}return[t].join("\n")}},7158:function(e){var t=function(){"use strict";var e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f,g,y,b,v,k,w,A,x="leader-line",C=1,S=2,E=3,_=4,T={top:C,right:S,bottom:E,left:_},I=1,N=2,R=3,D=4,z=5,O={straight:I,arc:N,fluid:R,magnet:D,grid:z},M="behind",B=x+"-defs",F='',L={disc:{elmId:"leader-line-disc",noRotate:!0,bBox:{left:-5,top:-5,width:10,height:10,right:5,bottom:5},widthR:2.5,heightR:2.5,bCircle:5,sideLen:5,backLen:5,overhead:0,outlineBase:1,outlineMax:4},square:{elmId:"leader-line-square",noRotate:!0,bBox:{left:-5,top:-5,width:10,height:10,right:5,bottom:5},widthR:2.5,heightR:2.5,bCircle:5,sideLen:5,backLen:5,overhead:0,outlineBase:1,outlineMax:4},arrow1:{elmId:"leader-line-arrow1",bBox:{left:-8,top:-8,width:16,height:16,right:8,bottom:8},widthR:4,heightR:4,bCircle:8,sideLen:8,backLen:8,overhead:8,outlineBase:2,outlineMax:1.5},arrow2:{elmId:"leader-line-arrow2",bBox:{left:-7,top:-8,width:11,height:16,right:4,bottom:8},widthR:2.75,heightR:4,bCircle:8,sideLen:8,backLen:7,overhead:4,outlineBase:1,outlineMax:1.75},arrow3:{elmId:"leader-line-arrow3",bBox:{left:-4,top:-5,width:12,height:10,right:8,bottom:5},widthR:3,heightR:2.5,bCircle:8,sideLen:5,backLen:4,overhead:8,outlineBase:1,outlineMax:2.5},hand:{elmId:"leader-line-hand",bBox:{left:-3,top:-12,width:40,height:24,right:37,bottom:12},widthR:10,heightR:6,bCircle:37,sideLen:12,backLen:3,overhead:37},crosshair:{elmId:"leader-line-crosshair",noRotate:!0,bBox:{left:-96,top:-96,width:192,height:192,right:96,bottom:96},widthR:48,heightR:48,bCircle:96,sideLen:96,backLen:96,overhead:0}},P={behind:M,disc:"disc",square:"square",arrow1:"arrow1",arrow2:"arrow2",arrow3:"arrow3",hand:"hand",crosshair:"crosshair"},j={disc:"disc",square:"square",arrow1:"arrow1",arrow2:"arrow2",arrow3:"arrow3",hand:"hand",crosshair:"crosshair"},V=[C,S,E,_],U="auto",W={x:"left",y:"top",width:"width",height:"height"},G=80,q=4,H=5,K=120,$=8,Z=3.75,X=10,Y=30,Q=.5522847,J=.25*Math.PI,ee=/^\s*(\-?[\d\.]+)\s*(\%)?\s*$/,te="http://www.w3.org/2000/svg",ne="-ms-scroll-limit"in document.documentElement.style&&"-ms-ime-align"in document.documentElement.style&&!window.navigator.msPointerEnabled,ae=!ne&&!!document.uniqueID,ie="MozAppearance"in document.documentElement.style,se=!(ne||ie||!window.chrome||!window.CSS),re=!(ne||ae||ie||se||window.chrome||!("WebkitAppearance"in document.documentElement.style)),oe=ae||ne?.2:.1,le={path:R,lineColor:"coral",lineSize:4,plugSE:[M,"arrow1"],plugSizeSE:[1,1],lineOutlineEnabled:!1,lineOutlineColor:"indianred",lineOutlineSize:.25,plugOutlineEnabledSE:[!1,!1],plugOutlineSizeSE:[1,1]},ue=(k={}.toString,w={}.hasOwnProperty.toString,A=w.call(Object),function(e){var t,n;return e&&"[object Object]"===k.call(e)&&(!(t=Object.getPrototypeOf(e))||(n=t.hasOwnProperty("constructor")&&t.constructor)&&"function"==typeof n&&w.call(n)===A)}),ce=Number.isFinite||function(e){return"number"==typeof e&&window.isFinite(e)},he=(p={ease:[.25,.1,.25,1],linear:[0,0,1,1],"ease-in":[.42,0,1,1],"ease-out":[0,0,.58,1],"ease-in-out":[.42,0,.58,1]},m=1e3/60/2,f=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,m)},g=window.cancelAnimationFrame||window.mozCancelAnimationFrame||window.webkitCancelAnimationFrame||window.msCancelAnimationFrame||function(e){clearTimeout(e)},y=Number.isFinite||function(e){return"number"==typeof e&&window.isFinite(e)},b=[],v=0,{add:function(e,t,n,a,i,s,r){var o,l,u,c,h,d,f,g,y,k,w,A,x,C=++v;function S(t,n){return{value:e(n),timeRatio:t,outputRatio:n}}if("string"==typeof i&&(i=p[i]),e=e||function(){},n=this._endIndex||this._string[this._currentIndex]<"0"||"9"=this._endIndex||this._string[this._currentIndex]<"0"||"9"=this._endIndex)return null;var e=null,t=this._string[this._currentIndex];if(this._currentIndex+=1,"0"===t)e=0;else{if("1"!==t)return null;e=1}return this._skipOptionalSpacesOrDelimiter(),e}};var o=e.SVGPathElement.prototype.setAttribute,l=e.SVGPathElement.prototype.removeAttribute,u=e.Symbol?e.Symbol():"__cachedPathData",c=e.Symbol?e.Symbol():"__cachedNormalizedPathData",h=function(e,t,n,a,i,s,r,o,l,u){function c(e,t,n){return{x:e*Math.cos(n)-t*Math.sin(n),y:e*Math.sin(n)+t*Math.cos(n)}}var d,p,m,f,g,y,b,v,k,w,A,x,C,S,E,_=(d=r,Math.PI*d/180),T=[];u?(S=u[0],E=u[1],x=u[2],C=u[3]):(e=(p=c(e,t,-_)).x,t=p.y,1<(y=(f=(e-(n=(m=c(n,a,-_)).x))/2)*f/(i*i)+(g=(t-(a=m.y))/2)*g/(s*s))&&(i*=y=Math.sqrt(y),s*=y),k=(b=i*i)*(v=s*s)-b*g*g-v*f*f,w=b*g*g+v*f*f,x=(A=(o===l?-1:1)*Math.sqrt(Math.abs(k/w)))*i*g/s+(e+n)/2,C=A*-s*f/i+(t+a)/2,S=Math.asin(parseFloat(((t-C)/s).toFixed(9))),E=Math.asin(parseFloat(((a-C)/s).toFixed(9))),e120*Math.PI/180&&(I=E,N=n,R=a,E=l&&S=n.duration&&n.count&&n.loopsLeft<=1)return s=n.frames[n.lastFrame=n.reverse?0:n.frames.length-1],n.frameCallback(s.value,!0,s.timeRatio,s.outputRatio),void(n.framesStart=null);if(a>n.duration){if(i=Math.floor(a/n.duration),n.count){if(i>=n.loopsLeft)return s=n.frames[n.lastFrame=n.reverse?0:n.frames.length-1],n.frameCallback(s.value,!0,s.timeRatio,s.outputRatio),void(n.framesStart=null);n.loopsLeft-=i}n.framesStart+=n.duration*i,a=e-n.framesStart}n.reverse&&(a=n.duration-a),s=n.frames[n.lastFrame=Math.round(a/m)],!1!==n.frameCallback(s.value,!1,s.timeRatio,s.outputRatio)?t=!0:n.framesStart=null}})),t&&(d=f.call(window,xe))}function Ce(e,t){e.framesStart=Date.now(),null!=t&&(e.framesStart-=e.duration*(e.reverse?1-t:t)),e.loopsLeft=e.count,e.lastFrame=null,xe()}function Se(e,t){var n,a;return typeof e!=typeof t||(n=ue(e)?"obj":Array.isArray(e)?"array":"")!=(ue(t)?"obj":Array.isArray(t)?"array":"")||("obj"===n?Se(a=Object.keys(e).sort(),Object.keys(t).sort())||a.some((function(n){return Se(e[n],t[n])})):"array"===n?e.length!==t.length||e.some((function(e,n){return Se(e,t[n])})):e!==t)}function Ee(e){return e?ue(e)?Object.keys(e).reduce((function(t,n){return t[n]=Ee(e[n]),t}),{}):Array.isArray(e)?e.map(Ee):e:e}function _e(e){var t,n,a,i=1,s=e=(e+"").trim();function r(e){var t=1,n=ee.exec(e);return n&&(t=parseFloat(n[1]),n[2]?t=0<=t&&t<=100?t/100:1:(t<0||1=Math.abs(a)?0<=t?S:_:0<=a?E:C))}))),w.position_path!==A.position_path||w.position_lineStrokeWidth!==A.position_lineStrokeWidth||[0,1].some((function(e){return w.position_plugOverheadSE[e]!==A.position_plugOverheadSE[e]||(s=x[e],r=A.position_socketXYSE[e],s.x!==r.x||s.y!==r.y||s.socketId!==r.socketId)||(n=t[e],a=A.position_socketGravitySE[e],(i=null==n?"auto":Array.isArray(n)?"array":"number")!=(null==a?"auto":Array.isArray(a)?"array":"number")||("array"==i?n[0]!==a[0]||n[1]!==a[1]:n!==a));var n,a,i,s,r}))){switch(e.pathList.baseVal=a=[],e.pathList.animVal=null,w.position_path){case I:a.push([M(x[0]),M(x[1])]);break;case N:d="number"==typeof t[0]&&0q?(w.position_lineStrokeWidth-q)*H:0),e.socketId===C?((s=(e.y-n.y)/2)=t.x:t.dirId===s?e.y>=t.y:e.x<=t.x}function p(e,t){return t.dirId===n||t.dirId===s?e.x===t.x:e.y===t.y}function m(e){return e[0]?{contain:0,notContain:1}:{contain:1,notContain:0}}function f(e,t,n){return Math.abs(t[n]-e[n])}function g(e,t,a){return"x"===a?e.x=Y?g(l[t.notContain],l[t.contain],u[t.contain]):l[t.contain].dirId)):(a=[{x:l[0].x,y:l[0].y},{x:l[1].x,y:l[1].y}],o.forEach((function(e,t){var n=0===t?1:0,i=f(a[t],a[n],u[t]);iX&&(l[s]-eX&&(l[s]-ea.outlineMax&&(t=a.outlineMax),t*=2*a.outlineBase,w=Ze(b,k.plugOutline_strokeWidthSE,e,t)||w,w=Ze(b,k.plugOutline_inStrokeWidthSE,e,k.plugOutline_colorTraSE[e]?t-oe/(k.line_strokeWidth/le.lineSize)/v.plugSizeSE[e]*2:t/2)||w)})),w)),(n.faces||he.line||he.plug||he.lineOutline||he.plugOutline)&&(he.faces=(C=(A=t).curStats,S=A.aplStats,E=A.events,_=!1,!C.line_altColor&&Ze(A,S,"line_color",x=C.line_color,E.apl_line_color)&&(A.lineFace.style.stroke=x,_=!0),Ze(A,S,"line_strokeWidth",x=C.line_strokeWidth,E.apl_line_strokeWidth)&&(A.lineShape.style.strokeWidth=x+"px",_=!0,(ie||ae)&&(Ge(A,A.lineShape),ae&&(Ge(A,A.lineFace),Ge(A,A.lineMaskCaps)))),Ze(A,S,"lineOutline_enabled",x=C.lineOutline_enabled,E.apl_lineOutline_enabled)&&(A.lineOutlineFace.style.display=x?"inline":"none",_=!0),C.lineOutline_enabled&&(Ze(A,S,"lineOutline_color",x=C.lineOutline_color,E.apl_lineOutline_color)&&(A.lineOutlineFace.style.stroke=x,_=!0),Ze(A,S,"lineOutline_strokeWidth",x=C.lineOutline_strokeWidth,E.apl_lineOutline_strokeWidth)&&(A.lineOutlineMaskShape.style.strokeWidth=x+"px",_=!0,ae&&(Ge(A,A.lineOutlineMaskCaps),Ge(A,A.lineOutlineFace))),Ze(A,S,"lineOutline_inStrokeWidth",x=C.lineOutline_inStrokeWidth,E.apl_lineOutline_inStrokeWidth)&&(A.lineMaskShape.style.strokeWidth=x+"px",_=!0,ae&&(Ge(A,A.lineOutlineMaskCaps),Ge(A,A.lineOutlineFace)))),Ze(A,S,"plug_enabled",x=C.plug_enabled,E.apl_plug_enabled)&&(A.plugsFace.style.display=x?"inline":"none",_=!0),C.plug_enabled&&[0,1].forEach((function(e){var t=C.plug_plugSE[e],n=t!==M?L[j[t]]:null,a=Ke(e,n);Ze(A,S.plug_enabledSE,e,x=C.plug_enabledSE[e],E.apl_plug_enabledSE)&&(A.plugsFace.style[a.prop]=x?"url(#"+A.plugMarkerIdSE[e]+")":"none",_=!0),C.plug_enabledSE[e]&&(Ze(A,S.plug_plugSE,e,t,E.apl_plug_plugSE)&&(A.plugFaceSE[e].href.baseVal="#"+n.elmId,He(A,A.plugMarkerSE[e],a.orient,n.bBox,A.svg,A.plugMarkerShapeSE[e],A.plugsFace),_=!0,ie&&Ge(A,A.plugsFace)),Ze(A,S.plug_colorSE,e,x=C.plug_colorSE[e],E.apl_plug_colorSE)&&(A.plugFaceSE[e].style.fill=x,_=!0,(se||re||ae)&&!C.line_colorTra&&Ge(A,ae?A.lineMaskCaps:A.capsMaskLine)),["markerWidth","markerHeight"].forEach((function(t){var n="plug_"+t+"SE";Ze(A,S[n],e,x=C[n][e],E["apl_"+n])&&(A.plugMarkerSE[e][t].baseVal.value=x,_=!0)})),Ze(A,S.plugOutline_enabledSE,e,x=C.plugOutline_enabledSE[e],E.apl_plugOutline_enabledSE)&&(x?(A.plugFaceSE[e].style.mask="url(#"+A.plugMaskIdSE[e]+")",A.plugOutlineFaceSE[e].style.display="inline"):(A.plugFaceSE[e].style.mask="none",A.plugOutlineFaceSE[e].style.display="none"),_=!0),C.plugOutline_enabledSE[e]&&(Ze(A,S.plugOutline_plugSE,e,t,E.apl_plugOutline_plugSE)&&(A.plugOutlineFaceSE[e].href.baseVal=A.plugMaskShapeSE[e].href.baseVal=A.plugOutlineMaskShapeSE[e].href.baseVal="#"+n.elmId,[A.plugMaskSE[e],A.plugOutlineMaskSE[e]].forEach((function(e){e.x.baseVal.value=n.bBox.left,e.y.baseVal.value=n.bBox.top,e.width.baseVal.value=n.bBox.width,e.height.baseVal.value=n.bBox.height})),_=!0),Ze(A,S.plugOutline_colorSE,e,x=C.plugOutline_colorSE[e],E.apl_plugOutline_colorSE)&&(A.plugOutlineFaceSE[e].style.fill=x,_=!0,ae&&(Ge(A,A.lineMaskCaps),Ge(A,A.lineOutlineMaskCaps))),Ze(A,S.plugOutline_strokeWidthSE,e,x=C.plugOutline_strokeWidthSE[e],E.apl_plugOutline_strokeWidthSE)&&(A.plugOutlineMaskShapeSE[e].style.strokeWidth=x+"px",_=!0),Ze(A,S.plugOutline_inStrokeWidthSE,e,x=C.plugOutline_inStrokeWidthSE[e],E.apl_plugOutline_inStrokeWidthSE)&&(A.plugMaskShapeSE[e].style.strokeWidth=x+"px",_=!0)))})),_)),(n.position||he.line||he.plug)&&(he.position=Qe(t)),(n.path||he.position)&&(he.path=(N=(T=t).curStats,R=T.aplStats,D=T.pathList.animVal||T.pathList.baseVal,z=N.path_edge,O=!1,D&&(z.x1=z.x2=D[0][0].x,z.y1=z.y2=D[0][0].y,N.path_pathData=I=Le(D,(function(e){e.xz.x2&&(z.x2=e.x),e.y>z.y2&&(z.y2=e.y)})),je(I,R.path_pathData)&&(T.linePath.setPathData(I),R.path_pathData=I,O=!0,ae?(Ge(T,T.plugsFace),Ge(T,T.lineMaskCaps)):ie&&Ge(T,T.linePath),T.events.apl_path&&T.events.apl_path.forEach((function(e){e(T,I)})))),O)),he.viewBox=(F=(B=t).curStats,P=B.aplStats,V=F.path_edge,U=F.viewBox_bBox,G=P.viewBox_bBox,q=B.svg.viewBox.baseVal,H=B.svg.style,K=!1,$=Math.max(F.line_strokeWidth/2,F.viewBox_plugBCircleSE[0]||0,F.viewBox_plugBCircleSE[1]||0),Z={x1:V.x1-$,y1:V.y1-$,x2:V.x2+$,y2:V.y2+$},B.events.new_edge4viewBox&&B.events.new_edge4viewBox.forEach((function(e){e(B,Z)})),U.x=F.lineMask_x=F.lineOutlineMask_x=F.maskBGRect_x=Z.x1,U.y=F.lineMask_y=F.lineOutlineMask_y=F.maskBGRect_y=Z.y1,U.width=Z.x2-Z.x1,U.height=Z.y2-Z.y1,["x","y","width","height"].forEach((function(e){var t;(t=U[e])!==G[e]&&(q[e]=G[e]=t,H[W[e]]=t+("x"===e||"y"===e?B.bodyOffset[e]:0)+"px",K=!0)})),K),he.mask=(Q=(X=t).curStats,J=X.aplStats,ee=!1,Q.plug_enabled?[0,1].forEach((function(e){Q.capsMaskMarker_enabledSE[e]=Q.plug_enabledSE[e]&&Q.plug_colorTraSE[e]||Q.plugOutline_enabledSE[e]&&Q.plugOutline_colorTraSE[e]})):Q.capsMaskMarker_enabledSE[0]=Q.capsMaskMarker_enabledSE[1]=!1,Q.capsMaskMarker_enabled=Q.capsMaskMarker_enabledSE[0]||Q.capsMaskMarker_enabledSE[1],Q.lineMask_outlineMode=Q.lineOutline_enabled,Q.caps_enabled=Q.capsMaskMarker_enabled||Q.capsMaskAnchor_enabledSE[0]||Q.capsMaskAnchor_enabledSE[1],Q.lineMask_enabled=Q.caps_enabled||Q.lineMask_outlineMode,(Q.lineMask_enabled&&!Q.lineMask_outlineMode||Q.lineOutline_enabled)&&["x","y"].forEach((function(e){var t="maskBGRect_"+e;Ze(X,J,t,Y=Q[t])&&(X.maskBGRect[e].baseVal.value=Y,ee=!0)})),Ze(X,J,"lineMask_enabled",Y=Q.lineMask_enabled)&&(X.lineFace.style.mask=Y?"url(#"+X.lineMaskId+")":"none",ee=!0,re&&Ge(X,X.lineMask)),Q.lineMask_enabled&&(Ze(X,J,"lineMask_outlineMode",Y=Q.lineMask_outlineMode)&&(Y?(X.lineMaskBG.style.display="none",X.lineMaskShape.style.display="inline"):(X.lineMaskBG.style.display="inline",X.lineMaskShape.style.display="none"),ee=!0),["x","y"].forEach((function(e){var t="lineMask_"+e;Ze(X,J,t,Y=Q[t])&&(X.lineMask[e].baseVal.value=Y,ee=!0)})),Ze(X,J,"caps_enabled",Y=Q.caps_enabled)&&(X.lineMaskCaps.style.display=X.lineOutlineMaskCaps.style.display=Y?"inline":"none",ee=!0,re&&Ge(X,X.capsMaskLine)),Q.caps_enabled&&([0,1].forEach((function(e){var t;Ze(X,J.capsMaskAnchor_enabledSE,e,Y=Q.capsMaskAnchor_enabledSE[e])&&(X.capsMaskAnchorSE[e].style.display=Y?"inline":"none",ee=!0,re&&Ge(X,X.lineMask)),Q.capsMaskAnchor_enabledSE[e]&&(je(t=Q.capsMaskAnchor_pathDataSE[e],J.capsMaskAnchor_pathDataSE[e])&&(X.capsMaskAnchorSE[e].setPathData(t),J.capsMaskAnchor_pathDataSE[e]=t,ee=!0),Ze(X,J.capsMaskAnchor_strokeWidthSE,e,Y=Q.capsMaskAnchor_strokeWidthSE[e])&&(X.capsMaskAnchorSE[e].style.strokeWidth=Y+"px",ee=!0))})),Ze(X,J,"capsMaskMarker_enabled",Y=Q.capsMaskMarker_enabled)&&(X.capsMaskLine.style.display=Y?"inline":"none",ee=!0),Q.capsMaskMarker_enabled&&[0,1].forEach((function(e){var t=Q.capsMaskMarker_plugSE[e],n=t!==M?L[j[t]]:null,a=Ke(e,n);Ze(X,J.capsMaskMarker_enabledSE,e,Y=Q.capsMaskMarker_enabledSE[e])&&(X.capsMaskLine.style[a.prop]=Y?"url(#"+X.lineMaskMarkerIdSE[e]+")":"none",ee=!0),Q.capsMaskMarker_enabledSE[e]&&(Ze(X,J.capsMaskMarker_plugSE,e,t)&&(X.capsMaskMarkerShapeSE[e].href.baseVal="#"+n.elmId,He(X,X.capsMaskMarkerSE[e],a.orient,n.bBox,X.svg,X.capsMaskMarkerShapeSE[e],X.capsMaskLine),ee=!0,ie&&(Ge(X,X.capsMaskLine),Ge(X,X.lineFace))),["markerWidth","markerHeight"].forEach((function(t){var n="capsMaskMarker_"+t+"SE";Ze(X,J[n],e,Y=Q[n][e])&&(X.capsMaskMarkerSE[e][t].baseVal.value=Y,ee=!0)})))})))),Q.lineOutline_enabled&&["x","y"].forEach((function(e){var t="lineOutlineMask_"+e;Ze(X,J,t,Y=Q[t])&&(X.lineOutlineMask[e].baseVal.value=Y,ee=!0)})),ee),n.effect&&(ue=(te=t).curStats,ce=te.aplStats,Object.keys(e).forEach((function(t){var n=e[t],a=t+"_enabled",i=t+"_options",s=ue[i];Ze(te,ce,a,ne=ue[a])?(ne&&(ce[i]=Ee(s)),n[ne?"init":"remove"](te)):ne&&Se(s,ce[i])&&(n.remove(te),ce[a]=!0,ce[i]=Ee(s),n.init(te))}))),(se||re)&&he.line&&!he.path&&Ge(t,t.lineShape),se&&he.plug&&!he.line&&Ge(t,t.plugsFace),qe(t)}function tt(e,t){return{duration:ce(e.duration)&&0t.x2&&(t.x2=a.x2),a.y2>t.y2&&(t.y2=a.y2),["x","y"].forEach((function(n){var a,r="dropShadow_"+n;i[r]=a=t[n+"1"],Ze(e,s,r,a)&&(e.efc_dropShadow_elmFilter[n].baseVal.value=a)})))}}},Object.keys(e).forEach((function(t){var n=e[t],a=n.stats;a[t+"_enabled"]={iniValue:!1},a[t+"_options"]={hasProps:!0},n.anim&&(a[t+"_animOptions"]={},a[t+"_animId"]={})})),t={none:{defaultAnimOptions:{},init:function(e,n){var a=e.curStats;a.show_animId&&(he.remove(a.show_animId),a.show_animId=null),t.none.start(e,n)},start:function(e,n){t.none.stop(e,!0)},stop:function(e,t,n){var a=e.curStats;return n=null!=n?n:e.aplStats.show_on,a.show_inAnim=!1,t&&Je(e,n),n?1:0}},fade:{defaultAnimOptions:{duration:300,timing:"linear"},init:function(e,n){var a=e.curStats,i=e.aplStats;a.show_animId&&he.remove(a.show_animId),a.show_animId=he.add((function(e){return e}),(function(n,a){a?t.fade.stop(e,!0):(e.svg.style.opacity=n+"",ae&&(Ge(e,e.svg),qe(e)))}),i.show_animOptions.duration,1,i.show_animOptions.timing,null,!1),t.fade.start(e,n)},start:function(e,t){var n,a=e.curStats;a.show_inAnim&&(n=he.stop(a.show_animId)),Je(e,1),a.show_inAnim=!0,he.start(a.show_animId,!e.aplStats.show_on,null!=t?t:n)},stop:function(e,t,n){var a,i=e.curStats;return n=null!=n?n:e.aplStats.show_on,a=i.show_inAnim?he.stop(i.show_animId):n?1:0,i.show_inAnim=!1,t&&(e.svg.style.opacity=n?"":"0",Je(e,n)),a}},draw:{defaultAnimOptions:{duration:500,timing:[.58,0,.42,1]},init:function(e,n){var a=e.curStats,i=e.aplStats,s=e.pathList.baseVal,r=Pe(s),o=r.segsLen,l=r.lenAll;a.show_animId&&he.remove(a.show_animId),a.show_animId=he.add((function(e){var t,n,a,i,r=-1;if(0===e)n=[[s[0][0],s[0][0]]];else if(1===e)n=s;else{for(t=l*e,n=[];t>=o[++r];)n.push(s[r]),t-=o[r];t&&(2===(a=s[r]).length?n.push([a[0],ze(a[0],a[1],t/o[r])]):(i=Me(a[0],a[1],a[2],a[3],Fe(a[0],a[1],a[2],a[3],t)),n.push([a[0],i.fromP1,i.fromP2,i])))}return n}),(function(n,a){a?t.draw.stop(e,!0):(e.pathList.animVal=n,et(e,{path:!0}))}),i.show_animOptions.duration,1,i.show_animOptions.timing,null,!1),t.draw.start(e,n)},start:function(e,n){var a,i=e.curStats;i.show_inAnim&&(a=he.stop(i.show_animId)),Je(e,1),i.show_inAnim=!0,Ve(e,"apl_position",t.draw.update),he.start(i.show_animId,!e.aplStats.show_on,null!=n?n:a)},stop:function(e,t,n){var a,i=e.curStats;return n=null!=n?n:e.aplStats.show_on,a=i.show_inAnim?he.stop(i.show_animId):n?1:0,i.show_inAnim=!1,t&&(e.pathList.animVal=n?null:[[e.pathList.baseVal[0][0],e.pathList.baseVal[0][0]]],et(e,{path:!0}),Je(e,n)),a},update:function(e){Ue(e,"apl_position",t.draw.update),e.curStats.show_inAnim?t.draw.init(e,t.draw.stop(e)):e.aplStats.show_animOptions={}}}},[["start","anchorSE",0],["end","anchorSE",1],["color","lineColor"],["size","lineSize"],["startSocketGravity","socketGravitySE",0],["endSocketGravity","socketGravitySE",1],["startPlugColor","plugColorSE",0],["endPlugColor","plugColorSE",1],["startPlugSize","plugSizeSE",0],["endPlugSize","plugSizeSE",1],["outline","lineOutlineEnabled"],["outlineColor","lineOutlineColor"],["outlineSize","lineOutlineSize"],["startPlugOutline","plugOutlineEnabledSE",0],["endPlugOutline","plugOutlineEnabledSE",1],["startPlugOutlineColor","plugOutlineColorSE",0],["endPlugOutlineColor","plugOutlineColorSE",1],["startPlugOutlineSize","plugOutlineSizeSE",0],["endPlugOutlineSize","plugOutlineSizeSE",1]].forEach((function(e){var t=e[0],n=e[1],a=e[2];Object.defineProperty(rt.prototype,t,{get:function(){var e=null!=a?be[this._id].options[n][a]:n?be[this._id].options[n]:be[this._id].options[t];return null==e?U:Ee(e)},set:ot(t),enumerable:!0})})),[["path",O],["startSocket",T,"socketSE",0],["endSocket",T,"socketSE",1],["startPlug",P,"plugSE",0],["endPlug",P,"plugSE",1]].forEach((function(e){var t=e[0],n=e[1],a=e[2],i=e[3];Object.defineProperty(rt.prototype,t,{get:function(){var e,s=null!=i?be[this._id].options[a][i]:a?be[this._id].options[a]:be[this._id].options[t];return s?Object.keys(n).some((function(t){return n[t]===s&&(e=t,!0)}))?e:new Error("It's broken"):U},set:ot(t),enumerable:!0})})),Object.keys(e).forEach((function(t){var n=e[t];Object.defineProperty(rt.prototype,t,{get:function(){var e,a,i=be[this._id].options[t];return ue(i)?(e=i,a=n.optionsConf.reduce((function(t,n){var a,i=n[0],s=n[1],r=n[2],o=n[3],l=n[4],u=null!=l?e[o][l]:o?e[o]:e[s];return t[s]="id"===i?u?Object.keys(r).some((function(e){return r[e]===u&&(a=e,!0)}))?a:new Error("It's broken"):U:null==u?U:Ee(u),t}),{}),n.anim&&(a.animation=Ee(e.animation)),a):i},set:ot(t),enumerable:!0})})),["startLabel","endLabel","middleLabel"].forEach((function(e,t){Object.defineProperty(rt.prototype,e,{get:function(){var e=be[this._id],n=e.options;return n.labelSEM[t]&&!e.optionIsAttach.labelSEM[t]?ke[n.labelSEM[t]._id].text:n.labelSEM[t]||""},set:ot(e),enumerable:!0})})),rt.prototype.setOptions=function(e){return st(be[this._id],e),this},rt.prototype.position=function(){return et(be[this._id],{position:!0}),this},rt.prototype.remove=function(){var t=be[this._id],n=t.curStats;Object.keys(e).forEach((function(e){var t=e+"_animId";n[t]&&he.remove(n[t])})),n.show_animId&&he.remove(n.show_animId),t.attachments.slice().forEach((function(e){it(t,e)})),t.baseWindow&&t.svg&&t.baseWindow.document.body.removeChild(t.svg),delete be[this._id]},rt.prototype.show=function(e,t){return nt(be[this._id],!0,e,t),this},rt.prototype.hide=function(e,t){return nt(be[this._id],!1,e,t),this},s=function(e){e&&ke[e._id]&&(e.boundTargets.slice().forEach((function(t){it(t.props,e,!0)})),e.conf.remove&&e.conf.remove(e),delete ke[e._id])},lt.prototype.remove=function(){var e=this,t=ke[e._id];t&&(t.boundTargets.slice().forEach((function(e){t.conf.removeOption(t,e)})),We((function(){var t=ke[e._id];t&&s(t)})))},a=lt,window.LeaderLineAttachment=a,i=function(e,t){return e instanceof a&&(!(e.isRemoved||t&&ke[e._id].conf.type!==t)||null)},n={pointAnchor:{type:"anchor",argOptions:[{optionName:"element",type:Te}],init:function(e,t){return e.element=n.pointAnchor.checkElement(t.element),e.x=n.pointAnchor.parsePercent(t.x,!0)||[.5,!0],e.y=n.pointAnchor.parsePercent(t.y,!0)||[.5,!0],!0},removeOption:function(e,t){var i=t.props,s={},r=e.element,o=i.options.anchorSE["start"===t.optionName?1:0];r===o&&(r=o===document.body?new a(n.pointAnchor,[r]):document.body),s[t.optionName]=r,st(i,s)},getBBoxNest:function(e,t){var n=Re(e.element,t.baseWindow),a=n.width,i=n.height;return n.width=n.height=0,n.left=n.right=n.left+e.x[0]*(e.x[1]?a:1),n.top=n.bottom=n.top+e.y[0]*(e.y[1]?i:1),n},parsePercent:function(e,t){var n,a,i=!1;return ce(e)?a=e:"string"==typeof e&&(n=ee.exec(e))&&n[2]&&(i=0!=(a=parseFloat(n[1])/100)),null!=a&&(t||0<=a)?[a,i]:null},checkElement:function(e){if(null==e)e=document.body;else if(!Te(e))throw new Error("`element` must be Element");return e}},areaAnchor:{type:"anchor",argOptions:[{optionName:"element",type:Te},{optionName:"shape",type:"string"}],stats:{color:{},strokeWidth:{},elementWidth:{},elementHeight:{},elementLeft:{},elementTop:{},pathListRel:{},bBoxRel:{},pathData:{},viewBoxBBox:{hasProps:!0},dashLen:{},dashGap:{}},init:function(e,t){var a,i,s,r=[];return e.element=n.pointAnchor.checkElement(t.element),"string"==typeof t.color&&(e.color=t.color.trim()),"string"==typeof t.fillColor&&(e.fill=t.fillColor.trim()),ce(t.size)&&0<=t.size&&(e.size=t.size),t.dash&&(e.dash=!0,ce(t.dash.len)&&0a.right&&(a.right=n),sa.bottom&&(a.bottom=s)):a={left:n,right:n,top:s,bottom:s},i?z.pathListRel.push([i,{x:n,y:s}]):z.pathListRel=[],i={x:n,y:s}})),z.pathListRel.push([]),s=z.strokeWidth/2,r=[{x:a.left-s,y:a.top-s},{x:a.right+s,y:a.bottom+s}],z.bBoxRel={left:r[0].x,top:r[0].y,right:r[1].x,bottom:r[1].y,width:r[1].x-r[0].x,height:r[1].y-r[0].y}}B.pathListRel=B.bBoxRel=!0}return(B.pathListRel||B.elementLeft||B.elementTop)&&(z.pathData=Le(z.pathListRel,(function(e){e.x+=t.left,e.y+=t.top}))),Ze(e,O,"strokeWidth",n=z.strokeWidth)&&(e.path.style.strokeWidth=n+"px"),je(n=z.pathData,O.pathData)&&(e.path.setPathData(n),O.pathData=n,B.pathData=!0),e.dash&&(!B.pathData&&(!B.strokeWidth||e.dashLen&&e.dashGap)||(z.dashLen=e.dashLen||2*z.strokeWidth,z.dashGap=e.dashGap||z.strokeWidth),B.dash=Ze(e,O,"dashLen",z.dashLen)||B.dash,B.dash=Ze(e,O,"dashGap",z.dashGap)||B.dash,B.dash&&(e.path.style.strokeDasharray=O.dashLen+","+O.dashGap)),I=z.viewBoxBBox,N=O.viewBoxBBox,R=e.svg.viewBox.baseVal,D=e.svg.style,I.x=z.bBoxRel.left+t.left,I.y=z.bBoxRel.top+t.top,I.width=z.bBoxRel.width,I.height=z.bBoxRel.height,["x","y","width","height"].forEach((function(t){(n=I[t])!==N[t]&&(R[t]=N[t]=n,D[W[t]]=n+("x"===t||"y"===t?e.bodyOffset[t]:0)+"px")})),B.strokeWidth||B.pathListRel||B.bBoxRel}},mouseHoverAnchor:{type:"anchor",argOptions:[{optionName:"element",type:Te},{optionName:"showEffectName",type:"string"}],style:{backgroundImage:"url('data:image/svg+xml;charset=utf-8;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cG9seWdvbiBwb2ludHM9IjI0LDAgMCw4IDgsMTEgMCwxOSA1LDI0IDEzLDE2IDE2LDI0IiBmaWxsPSJjb3JhbCIvPjwvc3ZnPg==')",backgroundSize:"",backgroundRepeat:"no-repeat",backgroundColor:"#f8f881",cursor:"default"},hoverStyle:{backgroundImage:"none",backgroundColor:"#fadf8f"},padding:{top:1,right:15,bottom:1,left:2},minHeight:15,backgroundPosition:{right:2,top:2},backgroundSize:{width:12,height:12},dirKeys:[["top","Top"],["right","Right"],["bottom","Bottom"],["left","Left"]],init:function(e,a){var i,s,r,o,l,u,c,h,d,p,m,f=n.mouseHoverAnchor,g={};if(e.element=n.pointAnchor.checkElement(a.element),!((p=(h=e.element).ownerDocument)&&(d=p.defaultView)&&d.HTMLElement&&h instanceof d.HTMLElement))throw new Error("`element` must be HTML element");return f.style.backgroundSize=f.backgroundSize.width+"px "+f.backgroundSize.height+"px",["style","hoverStyle"].forEach((function(t){var n=f[t];e[t]=Object.keys(n).reduce((function(e,t){return e[t]=n[t],e}),{})})),"inline"===(i=e.element.ownerDocument.defaultView.getComputedStyle(e.element,"")).display?e.style.display="inline-block":"none"===i.display&&(e.style.display="block"),n.mouseHoverAnchor.dirKeys.forEach((function(t){var n=t[0],a="padding"+t[1];parseFloat(i[a])e.x2&&(e.x2=a.x2),a.y2>e.y2&&(e.y2=a.y2)},newText:function(e,t,n,a,i){var s,r,o,u,c,h=t.createElementNS(te,"text");return h.textContent=e,[h.x,h.y].forEach((function(e){var t=n.createSVGLength();t.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX,0),e.baseVal.initialize(t)})),"boolean"!=typeof l&&(l="paintOrder"in h.style),i&&!l?(r=t.createElementNS(te,"defs"),h.id=a,r.appendChild(h),(u=(s=t.createElementNS(te,"g")).appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+a,(o=s.appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+a,(c=u.style).strokeLinejoin="round",{elmPosition:h,styleText:h.style,styleFill:o.style,styleStroke:c,styleShow:s.style,elmsAppend:[r,s]}):(c=h.style,i&&(c.strokeLinejoin="round",c.paintOrder="stroke"),{elmPosition:h,styleText:c,styleFill:c,styleStroke:i?c:null,styleShow:c,elmsAppend:[h]})},getMidPoint:function(e,t){var n,a,i=Pe(e),s=i.segsLen,r=i.lenAll,o=-1,l=r/2+(t||0);if(l<=0)return 2===(n=e[0]).length?ze(n[0],n[1],0):Me(n[0],n[1],n[2],n[3],0);if(r<=l)return 2===(n=e[e.length-1]).length?ze(n[0],n[1],1):Me(n[0],n[1],n[2],n[3],1);for(a=[];l>s[++o];)a.push(e[o]),l-=s[o];return 2===(n=e[o]).length?ze(n[0],n[1],l/s[o]):Me(n[0],n[1],n[2],n[3],Fe(n[0],n[1],n[2],n[3],l))},initSvg:function(e,t){var a,i,s=n.captionLabel.newText(e.text,t.baseWindow.document,t.svg,x+"-captionLabel-"+e._id,e.outlineColor);["elmPosition","styleFill","styleShow","elmsAppend"].forEach((function(t){e[t]=s[t]})),e.isShown=!1,e.styleShow.visibility="hidden",n.captionLabel.textStyleProps.forEach((function(t){null!=e[t]&&(s.styleText[t]=e[t])})),s.elmsAppend.forEach((function(e){t.svg.appendChild(e)})),a=s.elmPosition.getBBox(),e.width=a.width,e.height=a.height,e.outlineColor&&(i=10<(i=a.height/9)?10:i<2?2:i,s.styleStroke.strokeWidth=i+"px",s.styleStroke.stroke=e.outlineColor),e.strokeWidth=i||0,$e(e.aplStats,n.captionLabel.stats),e.updateColor(t),e.refSocketXY?e.updateSocketXY(t):e.updatePath(t),re&&et(t,{}),e.updateShow(t)},bind:function(e,t){var a=t.props;return e.color||Ve(a,"cur_line_color",e.updateColor),(e.refSocketXY="startLabel"===t.optionName||"endLabel"===t.optionName)?(e.socketIndex="startLabel"===t.optionName?0:1,Ve(a,"apl_position",e.updateSocketXY),e.offset||(Ve(a,"cur_attach_plugSideLenSE",e.updateSocketXY),Ve(a,"cur_line_strokeWidth",e.updateSocketXY))):Ve(a,"apl_path",e.updatePath),Ve(a,"svgShow",e.updateShow),re&&Ve(a,"new_edge4viewBox",e.adjustEdge),n.captionLabel.initSvg(e,a),!0},unbind:function(e,t){var a=t.props;e.elmsAppend&&(e.elmsAppend.forEach((function(e){a.svg.removeChild(e)})),e.elmPosition=e.styleFill=e.styleShow=e.elmsAppend=null),$e(e.curStats,n.captionLabel.stats),$e(e.aplStats,n.captionLabel.stats),e.color||Ue(a,"cur_line_color",e.updateColor),e.refSocketXY?(Ue(a,"apl_position",e.updateSocketXY),e.offset||(Ue(a,"cur_attach_plugSideLenSE",e.updateSocketXY),Ue(a,"cur_line_strokeWidth",e.updateSocketXY))):Ue(a,"apl_path",e.updatePath),Ue(a,"svgShow",e.updateShow),re&&(Ue(a,"new_edge4viewBox",e.adjustEdge),et(a,{}))},removeOption:function(e,t){var n=t.props,a={};a[t.optionName]="",st(n,a)},remove:function(e){e.boundTargets.length&&e.boundTargets.forEach((function(t){n.captionLabel.unbind(e,t)}))}},pathLabel:{type:"label",argOptions:[{optionName:"text",type:"string"}],stats:{color:{},startOffset:{},pathData:{}},init:function(e,t){return"string"==typeof t.text&&(e.text=t.text.trim()),!!e.text&&("string"==typeof t.color&&(e.color=t.color.trim()),e.outlineColor="string"==typeof t.outlineColor?t.outlineColor.trim():"#fff",ce(t.lineOffset)&&(e.lineOffset=t.lineOffset),n.captionLabel.textStyleProps.forEach((function(n){null!=t[n]&&(e[n]=t[n])})),e.updateColor=function(t){n.captionLabel.updateColor(e,t)},e.updatePath=function(t){var a,i=e.curStats,s=e.aplStats,r=t.curStats,o=t.pathList.animVal||t.pathList.baseVal;o&&(i.pathData=a=n.pathLabel.getOffsetPathData(o,r.line_strokeWidth/2+e.strokeWidth/2+e.height/4,1.25*e.height),je(a,s.pathData)&&(e.elmPath.setPathData(a),s.pathData=a,e.bBox=e.elmPosition.getBBox(),e.updateStartOffset(t)))},e.updateStartOffset=function(t){var n,a,i,s,r=e.curStats,o=e.aplStats,l=t.curStats;r.pathData&&(2===e.semIndex&&!e.lineOffset||(i=r.pathData.reduce((function(e,t){var n,i=t.values;switch(t.type){case"M":a={x:i[0],y:i[1]};break;case"L":n={x:i[0],y:i[1]},a&&(e+=De(a,n)),a=n;break;case"C":n={x:i[4],y:i[5]},a&&(e+=Be(a,{x:i[0],y:i[1]},{x:i[2],y:i[3]},n)),a=n}return e}),0),s=0===e.semIndex?0:1===e.semIndex?i:i/2,2!==e.semIndex&&(n=Math.max(l.attach_plugBackLenSE[e.semIndex]||0,l.line_strokeWidth/2)+e.strokeWidth/2+e.height/4,s=(s+=0===e.semIndex?n:-n)<0?0:it?((i=a.points)[1]=Oe(i[0],i[1],-t),a.len=De(i[0],i[1])):(a.points=null,a.len=0),e.len>t+n?((i=e.points)[0]=Oe(i[1],i[0],-(t+n)),e.len=De(i[0],i[1])):(e.points=null,e.len=0)),e):null})),s.reduce((function(e,t){var n=t.points;return n&&(i&&r(n[0],i)||e.push({type:"M",values:[n[0].x,n[0].y]}),"line"===t.type?e.push({type:"L",values:[n[1].x,n[1].y]}):(n.shift(),n.forEach((function(t){e.push({type:"L",values:[t.x,t.y]})}))),i=n[n.length-1]),e}),[])},newText:function(e,t,n,a){var i,s,r,o,u,c,h,d,p=t.createElementNS(te,"defs"),m=p.appendChild(t.createElementNS(te,"path"));return m.id=i=n+"-path",(o=(r=t.createElementNS(te,"text")).appendChild(t.createElementNS(te,"textPath"))).href.baseVal="#"+i,o.startOffset.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX,0),o.textContent=e,"boolean"!=typeof l&&(l="paintOrder"in r.style),a&&!l?(r.id=s=n+"-text",p.appendChild(r),(h=(u=t.createElementNS(te,"g")).appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+s,(c=u.appendChild(t.createElementNS(te,"use"))).href.baseVal="#"+s,(d=h.style).strokeLinejoin="round",{elmPosition:r,elmPath:m,elmOffset:o,styleText:r.style,styleFill:c.style,styleStroke:d,styleShow:u.style,elmsAppend:[p,u]}):(d=r.style,a&&(d.strokeLinejoin="round",d.paintOrder="stroke"),{elmPosition:r,elmPath:m,elmOffset:o,styleText:d,styleFill:d,styleStroke:a?d:null,styleShow:d,elmsAppend:[p,r]})},initSvg:function(e,t){var a,i,s=n.pathLabel.newText(e.text,t.baseWindow.document,x+"-pathLabel-"+e._id,e.outlineColor);["elmPosition","elmPath","elmOffset","styleFill","styleShow","elmsAppend"].forEach((function(t){e[t]=s[t]})),e.isShown=!1,e.styleShow.visibility="hidden",n.captionLabel.textStyleProps.forEach((function(t){null!=e[t]&&(s.styleText[t]=e[t])})),s.elmsAppend.forEach((function(e){t.svg.appendChild(e)})),s.elmPath.setPathData([{type:"M",values:[0,100]},{type:"h",values:[100]}]),a=s.elmPosition.getBBox(),s.styleText.textAnchor=["start","end","middle"][e.semIndex],2!==e.semIndex||e.lineOffset||s.elmOffset.startOffset.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PERCENTAGE,50),e.height=a.height,e.outlineColor&&(i=10<(i=a.height/9)?10:i<2?2:i,s.styleStroke.strokeWidth=i+"px",s.styleStroke.stroke=e.outlineColor),e.strokeWidth=i||0,$e(e.aplStats,n.pathLabel.stats),e.updateColor(t),e.updatePath(t),e.updateStartOffset(t),re&&et(t,{}),e.updateShow(t)},bind:function(e,t){var a=t.props;return e.color||Ve(a,"cur_line_color",e.updateColor),Ve(a,"cur_line_strokeWidth",e.updatePath),Ve(a,"apl_path",e.updatePath),e.semIndex="startLabel"===t.optionName?0:"endLabel"===t.optionName?1:2,2===e.semIndex&&!e.lineOffset||Ve(a,"cur_attach_plugBackLenSE",e.updateStartOffset),Ve(a,"svgShow",e.updateShow),re&&Ve(a,"new_edge4viewBox",e.adjustEdge),n.pathLabel.initSvg(e,a),!0},unbind:function(e,t){var a=t.props;e.elmsAppend&&(e.elmsAppend.forEach((function(e){a.svg.removeChild(e)})),e.elmPosition=e.elmPath=e.elmOffset=e.styleFill=e.styleShow=e.elmsAppend=null),$e(e.curStats,n.pathLabel.stats),$e(e.aplStats,n.pathLabel.stats),e.color||Ue(a,"cur_line_color",e.updateColor),Ue(a,"cur_line_strokeWidth",e.updatePath),Ue(a,"apl_path",e.updatePath),2===e.semIndex&&!e.lineOffset||Ue(a,"cur_attach_plugBackLenSE",e.updateStartOffset),Ue(a,"svgShow",e.updateShow),re&&(Ue(a,"new_edge4viewBox",e.adjustEdge),et(a,{}))},removeOption:function(e,t){var n=t.props,a={};a[t.optionName]="",st(n,a)},remove:function(e){e.boundTargets.length&&e.boundTargets.forEach((function(t){n.pathLabel.unbind(e,t)}))}}},Object.keys(n).forEach((function(e){rt[e]=function(){return new a(n[e],Array.prototype.slice.call(arguments))}})),rt.positionByWindowResize=!0,window.addEventListener("resize",pe.add((function(){rt.positionByWindowResize&&Object.keys(be).forEach((function(e){et(be[e],{position:!0})}))})),!1),rt}();e.exports=t},7503:function(e,t,n){var a;e=n.nmd(e),function(){"use strict";var i={function:!0,object:!0},s=i[typeof window]&&window||this,r=i[typeof t]&&t,o=i.object&&e&&!e.nodeType&&e,l=r&&o&&"object"==typeof n.g&&n.g;!l||l.global!==l&&l.window!==l&&l.self!==l||(s=l);var u=Math.pow(2,53)-1,c=/\bOpera/,h=Object.prototype,d=h.hasOwnProperty,p=h.toString;function m(e){return(e=String(e)).charAt(0).toUpperCase()+e.slice(1)}function f(e){return e=k(e),/^(?:webOS|i(?:OS|P))/.test(e)?e:m(e)}function g(e,t){for(var n in e)d.call(e,n)&&t(e[n],n,e)}function y(e){return null==e?m(e):p.call(e).slice(8,-1)}function b(e){return String(e).replace(/([ -])(?!$)/g,"$1?")}function v(e,t){var n=null;return function(e,t){var n=-1,a=e?e.length:0;if("number"==typeof a&&a>-1&&a<=u)for(;++n3?"WebKit":/\bOpera\b/.test(P)&&(/\bOPR\b/.test(t)?"Blink":"Presto"))||/\b(?:Midori|Nook|Safari)\b/i.test(t)&&!/^(?:Trident|EdgeHTML)$/.test(L)&&"WebKit"||!L&&/\bMSIE\b/i.test(t)&&("Mac OS"==U?"Tasman":"Trident")||"WebKit"==L&&/\bPlayStation\b(?! Vita\b)/i.test(P)&&"NetFront")&&(L=[o]),"IE"==P&&(o=(/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(t)||0)[1])?(P+=" Mobile",U="Windows Phone "+(/\+$/.test(o)?o:o+".x"),O.unshift("desktop mode")):/\bWPDesktop\b/i.test(t)?(P="IE Mobile",U="Windows Phone 8.x",O.unshift("desktop mode"),F||(F=(/\brv:([\d.]+)/.exec(t)||0)[1])):"IE"!=P&&"Trident"==L&&(o=/\brv:([\d.]+)/.exec(t))&&(P&&O.push("identifying as "+P+(F?" "+F:"")),P="IE",F=o[1]),B){if(h="global",d=null!=(u=n)?typeof u[h]:"number",/^(?:boolean|number|string|undefined)$/.test(d)||"object"==d&&!u[h])y(o=n.runtime)==A?(P="Adobe AIR",U=o.flash.system.Capabilities.os):y(o=n.phantom)==S?(P="PhantomJS",F=(o=o.version||null)&&o.major+"."+o.minor+"."+o.patch):"number"==typeof N.documentMode&&(o=/\bTrident\/(\d+)/i.exec(t))?(F=[F,N.documentMode],(o=+o[1]+4)!=F[1]&&(O.push("IE "+F[1]+" mode"),L&&(L[1]=""),F[1]=o),F="IE"==P?String(F[1].toFixed(1)):F[0]):"number"==typeof N.documentMode&&/^(?:Chrome|Firefox)\b/.test(P)&&(O.push("masking as "+P+" "+F),P="IE",F="11.0",L=["Trident"],U="Windows");else if(E&&(z=(o=E.lang.System).getProperty("os.arch"),U=U||o.getProperty("os.name")+" "+o.getProperty("os.version")),_){try{F=n.require("ringo/engine").version.join("."),P="RingoJS"}catch(e){(o=n.system)&&o.global.system==n.system&&(P="Narwhal",U||(U=o[0].os||null))}P||(P="Rhino")}else"object"==typeof n.process&&!n.process.browser&&(o=n.process)&&("object"==typeof o.versions&&("string"==typeof o.versions.electron?(O.push("Node "+o.versions.node),P="Electron",F=o.versions.electron):"string"==typeof o.versions.nw&&(O.push("Chromium "+F,"Node "+o.versions.node),P="NW.js",F=o.versions.nw)),P||(P="Node.js",z=o.arch,U=o.platform,F=(F=/[\d.]+/.exec(o.version))?F[0]:null));U=U&&f(U)}if(F&&(o=/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(F)||/(?:alpha|beta)(?: ?\d)?/i.exec(t+";"+(B&&i.appMinorVersion))||/\bMinefield\b/i.test(t)&&"a")&&(M=/b/i.test(o)?"beta":"alpha",F=F.replace(RegExp(o+"\\+?$"),"")+("beta"==M?I:T)+(/\d+\+?/.exec(o)||"")),"Fennec"==P||"Firefox"==P&&/\b(?:Android|Firefox OS|KaiOS)\b/.test(U))P="Firefox Mobile";else if("Maxthon"==P&&F)F=F.replace(/\.[\d.]+/,".x");else if(/\bXbox\b/i.test(j))"Xbox 360"==j&&(U=null),"Xbox 360"==j&&/\bIEMobile\b/.test(t)&&O.unshift("mobile mode");else if(!/^(?:Chrome|IE|Opera)$/.test(P)&&(!P||j||/Browser|Mobi/.test(P))||"Windows CE"!=U&&!/Mobi/i.test(t))if("IE"==P&&B)try{null===n.external&&O.unshift("platform preview")}catch(e){O.unshift("embedded")}else(/\bBlackBerry\b/.test(j)||/\bBB10\b/.test(t))&&(o=(RegExp(j.replace(/ +/g," *")+"/([.\\d]+)","i").exec(t)||0)[1]||F)?(U=((o=[o,/BB10/.test(t)])[1]?(j=null,V="BlackBerry"):"Device Software")+" "+o[0],F=null):this!=g&&"Wii"!=j&&(B&&R||/Opera/.test(P)&&/\b(?:MSIE|Firefox)\b/i.test(t)||"Firefox"==P&&/\bOS X (?:\d+\.){2,}/.test(U)||"IE"==P&&(U&&!/^Win/.test(U)&&F>5.5||/\bWindows XP\b/.test(U)&&F>8||8==F&&!/\bTrident\b/.test(t)))&&!c.test(o=e.call(g,t.replace(c,"")+";"))&&o.name&&(o="ing as "+o.name+((o=o.version)?" "+o:""),c.test(P)?(/\bIE\b/.test(o)&&"Mac OS"==U&&(U=null),o="identify"+o):(o="mask"+o,P=D?f(D.replace(/([a-z])([A-Z])/g,"$1 $2")):"Opera",/\bIE\b/.test(o)&&(U=null),B||(F=null)),L=["Presto"],O.push(o));else P+=" Mobile";(o=(/\bAppleWebKit\/([\d.]+\+?)/i.exec(t)||0)[1])&&(o=[parseFloat(o.replace(/\.(\d)$/,".0$1")),o],"Safari"==P&&"+"==o[1].slice(-1)?(P="WebKit Nightly",M="alpha",F=o[1].slice(0,-1)):F!=o[1]&&F!=(o[2]=(/\bSafari\/([\d.]+\+?)/i.exec(t)||0)[1])||(F=null),o[1]=(/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(t)||0)[1],537.36==o[0]&&537.36==o[2]&&parseFloat(o[1])>=28&&"WebKit"==L&&(L=["Blink"]),B&&(m||o[1])?(L&&(L[1]="like Chrome"),o=o[1]||((o=o[0])<530?1:o<532?2:o<532.05?3:o<533?4:o<534.03?5:o<534.07?6:o<534.1?7:o<534.13?8:o<534.16?9:o<534.24?10:o<534.3?11:o<535.01?12:o<535.02?"13+":o<535.07?15:o<535.11?16:o<535.19?17:o<536.05?18:o<536.1?19:o<537.01?20:o<537.11?"21+":o<537.13?23:o<537.18?24:o<537.24?25:o<537.36?26:"Blink"!=L?"27":"28")):(L&&(L[1]="like Safari"),o=(o=o[0])<400?1:o<500?2:o<526?3:o<533?4:o<534?"4+":o<535?5:o<537?6:o<538?7:o<601?8:o<602?9:o<604?10:o<606?11:o<608?12:"12"),L&&(L[1]+=" "+(o+="number"==typeof o?".x":/[.+]/.test(o)?"":"+")),"Safari"==P&&(!F||parseInt(F)>45)?F=o:"Chrome"==P&&/\bHeadlessChrome/i.test(t)&&O.unshift("headless")),"Opera"==P&&(o=/\bzbov|zvav$/.exec(U))?(P+=" ",O.unshift("desktop mode"),"zvav"==o?(P+="Mini",F=null):P+="Mobile",U=U.replace(RegExp(" *"+o+"$"),"")):"Safari"==P&&/\bChrome\b/.exec(L&&L[1])?(O.unshift("desktop mode"),P="Chrome Mobile",F=null,/\bOS X\b/.test(U)?(V="Apple",U="iOS 4.3+"):U=null):/\bSRWare Iron\b/.test(P)&&!F&&(F=G("Chrome")),F&&0==F.indexOf(o=/[\d.]+$/.exec(U))&&t.indexOf("/"+o+"-")>-1&&(U=k(U.replace(o,""))),U&&-1!=U.indexOf(P)&&!RegExp(P+" OS").test(U)&&(U=U.replace(RegExp(" *"+b(P)+" *"),"")),L&&!/\b(?:Avant|Nook)\b/.test(P)&&(/Browser|Lunascape|Maxthon/.test(P)||"Safari"!=P&&/^iOS/.test(U)&&/\bSafari\b/.test(L[1])||/^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(P)&&L[1])&&(o=L[L.length-1])&&O.push(o),O.length&&(O=["("+O.join("; ")+")"]),V&&j&&j.indexOf(V)<0&&O.push("on "+V),j&&O.push((/^on /.test(O[O.length-1])?"":"on ")+j),U&&(o=/ ([\d.+]+)$/.exec(U),l=o&&"/"==U.charAt(U.length-o[0].length-1),U={architecture:32,family:o&&!l?U.replace(o[0],""):U,version:o?o[1]:null,toString:function(){var e=this.version;return this.family+(e&&!l?" "+e:"")+(64==this.architecture?" 64-bit":"")}}),(o=/\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(z))&&!/\bi686\b/i.test(z)?(U&&(U.architecture=64,U.family=U.family.replace(RegExp(" *"+o),"")),P&&(/\bWOW64\b/i.test(t)||B&&/\w(?:86|32)$/.test(i.cpuClass||i.platform)&&!/\bWin64; x64\b/i.test(t))&&O.unshift("32-bit")):U&&/^OS X/.test(U.family)&&"Chrome"==P&&parseFloat(F)>=39&&(U.architecture=64),t||(t=null);var q={};return q.description=t,q.layout=L&&L[0],q.manufacturer=V,q.name=P,q.prerelease=M,q.product=j,q.ua=t,q.version=P&&F,q.os=U||{architecture:null,family:null,version:null,toString:function(){return"null"}},q.parse=e,q.toString=function(){return this.description||""},q.version&&O.unshift(F),q.name&&O.unshift(P),U&&P&&(U!=String(U).split(" ")[0]||U!=P.split(" ")[0]&&!j)&&O.push(j?"("+U+")":"on "+U),O.length&&(q.description=O.join(" ")),q}();s.platform=w,void 0===(a=function(){return w}.call(t,n,t,e))||(e.exports=a)}.call(this)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,a="function"==typeof Set,i="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function s(e,r){if(e===r)return!0;if(e&&r&&"object"==typeof e&&"object"==typeof r){if(e.constructor!==r.constructor)return!1;var o,l,u,c;if(Array.isArray(e)){if((o=e.length)!=r.length)return!1;for(l=o;0!=l--;)if(!s(e[l],r[l]))return!1;return!0}if(n&&e instanceof Map&&r instanceof Map){if(e.size!==r.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!r.has(l.value[0]))return!1;for(c=e.entries();!(l=c.next()).done;)if(!s(l.value[1],r.get(l.value[0])))return!1;return!0}if(a&&e instanceof Set&&r instanceof Set){if(e.size!==r.size)return!1;for(c=e.entries();!(l=c.next()).done;)if(!r.has(l.value[0]))return!1;return!0}if(i&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(r)){if((o=e.length)!=r.length)return!1;for(l=o;0!=l--;)if(e[l]!==r[l])return!1;return!0}if(e.constructor===RegExp)return e.source===r.source&&e.flags===r.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof r.valueOf)return e.valueOf()===r.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof r.toString)return e.toString()===r.toString();if((o=(u=Object.keys(e)).length)!==Object.keys(r).length)return!1;for(l=o;0!=l--;)if(!Object.prototype.hasOwnProperty.call(r,u[l]))return!1;if(t&&e instanceof Element)return!1;for(l=o;0!=l--;)if(("_owner"!==u[l]&&"__v"!==u[l]&&"__o"!==u[l]||!e.$$typeof)&&!s(e[u[l]],r[u[l]]))return!1;return!0}return e!=e&&r!=r}e.exports=function(e,t){try{return s(e,t)}catch(e){if((e.message||"").match(/stack|recursion/i))return!1;throw e}}},5072:e=>{"use strict";var t=[];function n(e){for(var n=-1,a=0;a{"use strict";var t={};e.exports=function(e,n){var a=function(e){if(void 0===t[e]){var n=document.querySelector(e);if(window.HTMLIFrameElement&&n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}(e);if(!a)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");a.appendChild(n)}},540:e=>{"use strict";e.exports=function(e){var t=document.createElement("style");return e.setAttributes(t,e.attributes),e.insert(t,e.options),t}},5056:(e,t,n)=>{"use strict";e.exports=function(e){var t=n.nc;t&&e.setAttribute("nonce",t)}},7825:e=>{"use strict";e.exports=function(e){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var t=e.insertStyleElement(e);return{update:function(n){!function(e,t,n){var a="";n.supports&&(a+="@supports (".concat(n.supports,") {")),n.media&&(a+="@media ".concat(n.media," {"));var i=void 0!==n.layer;i&&(a+="@layer".concat(n.layer.length>0?" ".concat(n.layer):""," {")),a+=n.css,i&&(a+="}"),n.media&&(a+="}"),n.supports&&(a+="}");var s=n.sourceMap;s&&"undefined"!=typeof btoa&&(a+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(s))))," */")),t.styleTagTransform(a,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},1113:e=>{"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},402:e=>{e.exports=''},3389:e=>{e.exports=''},627:e=>{e.exports=''},8110:e=>{e.exports=''},980:e=>{e.exports=''},3890:e=>{e.exports=''},880:e=>{e.exports=''},3282:e=>{e.exports=''},4948:function(e){e.exports=function(){"use strict";function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")}function n(t,n){return t.get(e(t,n))}function a(e,n,a){t(e,n),n.set(e,a)}function i(t,n,a){return t.set(e(t,n),a),a}const s=100,r={},o=()=>{r.previousActiveElement instanceof HTMLElement?(r.previousActiveElement.focus(),r.previousActiveElement=null):document.body&&document.body.focus()},l=e=>new Promise((t=>{if(!e)return t();const n=window.scrollX,a=window.scrollY;r.restoreFocusTimeout=setTimeout((()=>{o(),t()}),s),window.scrollTo(n,a)})),u="swal2-",c=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","default-outline","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error"].reduce(((e,t)=>(e[t]=u+t,e)),{}),h=["success","warning","info","question","error"].reduce(((e,t)=>(e[t]=u+t,e)),{}),d=e=>e.charAt(0).toUpperCase()+e.slice(1),p=e=>{},m=e=>{},f=[],g=e=>{f.includes(e)||(f.push(e),p(e))},y=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;g(`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`)},b=e=>"function"==typeof e?e():e,v=e=>e&&"function"==typeof e.toPromise,k=e=>v(e)?e.toPromise():Promise.resolve(e),w=e=>e&&Promise.resolve(e)===e,A=()=>document.body.querySelector(`.${c.container}`),x=e=>{const t=A();return t?t.querySelector(e):null},C=e=>x(`.${e}`),S=()=>C(c.popup),E=()=>C(c.icon),_=()=>C(c["icon-content"]),T=()=>C(c.title),I=()=>C(c["html-container"]),N=()=>C(c.image),R=()=>C(c["progress-steps"]),D=()=>C(c["validation-message"]),z=()=>x(`.${c.actions} .${c.confirm}`),O=()=>x(`.${c.actions} .${c.cancel}`),M=()=>x(`.${c.actions} .${c.deny}`),B=()=>C(c["input-label"]),F=()=>x(`.${c.loader}`),L=()=>C(c.actions),P=()=>C(c.footer),j=()=>C(c["timer-progress-bar"]),V=()=>C(c.close),U='\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex="0"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n',W=()=>{const e=S();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort(((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),a=parseInt(t.getAttribute("tabindex")||"0");return n>a?1:n"-1"!==e.getAttribute("tabindex")));return[...new Set(n.concat(i))].filter((e=>ue(e)))},G=()=>$(document.body,c.shown)&&!$(document.body,c["toast-shown"])&&!$(document.body,c["no-backdrop"]),q=()=>{const e=S();return!!e&&$(e,c.toast)},H=()=>{const e=S();return!!e&&e.hasAttribute("data-loading")},K=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),a=n.querySelector("head");a&&Array.from(a.childNodes).forEach((t=>{e.appendChild(t)}));const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach((t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)}))}},$=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{Array.from(e.classList).forEach((n=>{Object.values(c).includes(n)||Object.values(h).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)}))},X=(e,t,n)=>{if(Z(e,t),!t.customClass)return;const a=t.customClass[n];a&&("string"==typeof a||a.forEach?ee(e,a):p(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof a}"`))},Y=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${c.popup} > .${c[t]}`);case"checkbox":return e.querySelector(`.${c.popup} > .${c.checkbox} input`);case"radio":return e.querySelector(`.${c.popup} > .${c.radio} input:checked`)||e.querySelector(`.${c.popup} > .${c.radio} input:first-child`);case"range":return e.querySelector(`.${c.popup} > .${c.range} input`);default:return e.querySelector(`.${c.popup} > .${c.input}`)}},Q=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},J=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach((t=>{Array.isArray(e)?e.forEach((e=>{n?e.classList.add(t):e.classList.remove(t)})):n?e.classList.add(t):e.classList.remove(t)})))},ee=(e,t)=>{J(e,t,!0)},te=(e,t)=>{J(e,t,!1)},ne=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(n)}`&&(n=parseInt(n)),n||0===parseInt(n)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},ie=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"flex";e&&(e.style.display=t)},se=e=>{e&&(e.style.display="none")},re=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"block";e&&new MutationObserver((()=>{le(e,e.innerHTML,t)})).observe(e,{childList:!0,subtree:!0})},oe=(e,t,n,a)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,a)},le=function(e,t){t?ie(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:"flex"):se(e)},ue=e=>!(!e||!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),ce=()=>!ue(z())&&!ue(M())&&!ue(O()),he=e=>!!(e.scrollHeight>e.clientHeight),de=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),a=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||a>0},pe=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=j();n&&ue(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout((()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"}),10))},me=()=>{const e=j();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`},fe=()=>"undefined"==typeof window||"undefined"==typeof document,ge=`\n
      \n \n
        \n
        \n \n

        \n
        \n \n \n
        \n \n \n
        \n \n
        \n \n \n
        \n
        \n
        \n \n \n \n
        \n
        \n
        \n
        \n
        \n
        \n`.replace(/(^|\n)\s*/g,""),ye=()=>{const e=A();return!!e&&(e.remove(),te([document.documentElement,document.body],[c["no-backdrop"],c["toast-shown"],c["has-column"]]),!0)},be=()=>{r.currentInstance.resetValidationMessage()},ve=()=>{const e=S(),t=ne(e,c.input),n=ne(e,c.file),a=e.querySelector(`.${c.range} input`),i=e.querySelector(`.${c.range} output`),s=ne(e,c.select),r=e.querySelector(`.${c.checkbox} input`),o=ne(e,c.textarea);t.oninput=be,n.onchange=be,s.onchange=be,r.onchange=be,o.oninput=be,a.oninput=()=>{be(),i.value=a.value},a.onchange=()=>{be(),i.value=a.value}},ke=e=>"string"==typeof e?document.querySelector(e):e,we=e=>{const t=S();t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true")},Ae=e=>{"rtl"===window.getComputedStyle(e).direction&&ee(A(),c.rtl)},xe=e=>{const t=ye();if(fe())return void m("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=c.container,t&&ee(n,c["no-transition"]),K(n,ge);const a=ke(e.target);a.appendChild(n),we(e),Ae(a),ve()},Ce=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?Se(e,t):e&&K(t,e)},Se=(e,t)=>{e.jquery?Ee(t,e):K(t,e.toString())},Ee=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},_e=(e,t)=>{const n=L(),a=F();n&&a&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?ie(n):se(n),X(n,t,"actions"),Te(n,a,t),K(a,t.loaderHtml||""),X(a,t,"loader"))};function Te(e,t,n){const a=z(),i=M(),s=O();a&&i&&s&&(Ne(a,"confirm",n),Ne(i,"deny",n),Ne(s,"cancel",n),Ie(a,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,a),e.insertBefore(i,a)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(a,t))))}function Ie(e,t,n,a){a.buttonsStyling?(ee([e,t,n],c.styled),a.confirmButtonColor&&(e.style.backgroundColor=a.confirmButtonColor,ee(e,c["default-outline"])),a.denyButtonColor&&(t.style.backgroundColor=a.denyButtonColor,ee(t,c["default-outline"])),a.cancelButtonColor&&(n.style.backgroundColor=a.cancelButtonColor,ee(n,c["default-outline"]))):te([e,t,n],c.styled)}function Ne(e,t,n){const a=d(t);le(e,n[`show${a}Button`],"inline-block"),K(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=c[t],X(e,n,`${t}Button`)}const Re=(e,t)=>{const n=V();n&&(K(n,t.closeButtonHtml||""),X(n,t,"closeButton"),le(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))},De=(e,t)=>{const n=A();n&&(ze(n,t.backdrop),Oe(n,t.position),Me(n,t.grow),X(n,t,"container"))};function ze(e,t){"string"==typeof t?e.style.background=t:t||ee([document.documentElement,document.body],c["no-backdrop"])}function Oe(e,t){t&&(t in c?ee(e,c[t]):(p('The "position" parameter is not valid, defaulting to "center"'),ee(e,c.center)))}function Me(e,t){t&&ee(e,c[`grow-${t}`])}var Be={innerParams:new WeakMap,domCache:new WeakMap};const Fe=["input","file","range","select","radio","checkbox","textarea"],Le=(e,t)=>{const n=S();if(!n)return;const a=Be.innerParams.get(e),i=!a||t.input!==a.input;Fe.forEach((e=>{const a=ne(n,c[e]);a&&(Ve(e,t.inputAttributes),a.className=c[e],i&&se(a))})),t.input&&(i&&Pe(t),Ue(t))},Pe=e=>{if(!e.input)return;if(!Ke[e.input])return void m(`Unexpected type of input! Expected ${Object.keys(Ke).join(" | ")}, got "${e.input}"`);const t=qe(e.input);if(!t)return;const n=Ke[e.input](t,e);ie(t),e.inputAutoFocus&&setTimeout((()=>{Q(n)}))},je=e=>{for(let t=0;t{const n=S();if(!n)return;const a=Y(n,e);if(a){je(a);for(const e in t)a.setAttribute(e,t[e])}},Ue=e=>{if(!e.input)return;const t=qe(e.input);t&&X(t,e,"input")},We=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},Ge=(e,t,n)=>{if(n.inputLabel){const a=document.createElement("label"),i=c["input-label"];a.setAttribute("for",e.id),a.className=i,"object"==typeof n.customClass&&ee(a,n.customClass.inputLabel),a.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",a)}},qe=e=>{const t=S();if(t)return ne(t,c[e]||c.input)},He=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:w(t)||p(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ke={};Ke.text=Ke.email=Ke.password=Ke.number=Ke.tel=Ke.url=Ke.search=Ke.date=Ke["datetime-local"]=Ke.time=Ke.week=Ke.month=(e,t)=>(He(e,t.inputValue),Ge(e,e,t),We(e,t),e.type=t.input,e),Ke.file=(e,t)=>(Ge(e,e,t),We(e,t),e),Ke.range=(e,t)=>{const n=e.querySelector("input"),a=e.querySelector("output");return He(n,t.inputValue),n.type=t.input,He(a,t.inputValue),Ge(n,e,t),e},Ke.select=(e,t)=>{if(e.textContent="",t.inputPlaceholder){const n=document.createElement("option");K(n,t.inputPlaceholder),n.value="",n.disabled=!0,n.selected=!0,e.appendChild(n)}return Ge(e,e,t),e},Ke.radio=e=>(e.textContent="",e),Ke.checkbox=(e,t)=>{const n=Y(S(),"checkbox");n.value="1",n.checked=Boolean(t.inputValue);const a=e.querySelector("span");return K(a,t.inputPlaceholder||t.inputLabel),n},Ke.textarea=(e,t)=>{He(e,t.inputValue),We(e,t),Ge(e,e,t);const n=e=>parseInt(window.getComputedStyle(e).marginLeft)+parseInt(window.getComputedStyle(e).marginRight);return setTimeout((()=>{if("MutationObserver"in window){const a=parseInt(window.getComputedStyle(S()).width);new MutationObserver((()=>{if(!document.body.contains(e))return;const i=e.offsetWidth+n(e);i>a?S().style.width=`${i}px`:ae(S(),"width",t.width)})).observe(e,{attributes:!0,attributeFilter:["style"]})}})),e};const $e=(e,t)=>{const n=I();n&&(re(n),X(n,t,"htmlContainer"),t.html?(Ce(t.html,n),ie(n,"block")):t.text?(n.textContent=t.text,ie(n,"block")):se(n),Le(e,t))},Ze=(e,t)=>{const n=P();n&&(re(n),le(n,t.footer,"block"),t.footer&&Ce(t.footer,n),X(n,t,"footer"))},Xe=(e,t)=>{const n=Be.innerParams.get(e),a=E();if(a){if(n&&t.icon===n.icon)return tt(a,t),void Ye(a,t);if(t.icon||t.iconHtml){if(t.icon&&-1===Object.keys(h).indexOf(t.icon))return m(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void se(a);ie(a),tt(a,t),Ye(a,t),ee(a,t.showClass&&t.showClass.icon)}else se(a)}},Ye=(e,t)=>{for(const[n,a]of Object.entries(h))t.icon!==n&&te(e,a);ee(e,t.icon&&h[t.icon]),nt(e,t),Qe(),X(e,t,"icon")},Qe=()=>{const e=S();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e\n \n
        \n
        \n',et='\n \n \n \n \n',tt=(e,t)=>{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,a="";t.iconHtml?a=at(t.iconHtml):"success"===t.icon?(a=Je,n=n.replace(/ style=".*?"/g,"")):"error"===t.icon?a=et:t.icon&&(a=at({question:"?",warning:"!",info:"i"}[t.icon])),n.trim()!==a.trim()&&K(e,a)},nt=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])oe(e,n,"background-color",t.iconColor);oe(e,".swal2-success-ring","border-color",t.iconColor)}},at=e=>`
        ${e}
        `,it=(e,t)=>{const n=N();n&&(t.imageUrl?(ie(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),ae(n,"width",t.imageWidth),ae(n,"height",t.imageHeight),n.className=c.image,X(n,t,"image")):se(n))},st=(e,t)=>{const n=A(),a=S();if(n&&a){if(t.toast){ae(n,"width",t.width),a.style.width="100%";const e=F();e&&a.insertBefore(e,E())}else ae(a,"width",t.width);ae(a,"padding",t.padding),t.color&&(a.style.color=t.color),t.background&&(a.style.background=t.background),se(D()),rt(a,t)}},rt=(e,t)=>{const n=t.showClass||{};e.className=`${c.popup} ${ue(e)?n.popup:""}`,t.toast?(ee([document.documentElement,document.body],c["toast-shown"]),ee(e,c.toast)):ee(e,c.modal),X(e,t,"popup"),"string"==typeof t.customClass&&ee(e,t.customClass),t.icon&&ee(e,c[`icon-${t.icon}`])},ot=(e,t)=>{const n=R();if(!n)return;const{progressSteps:a,currentProgressStep:i}=t;a&&0!==a.length&&void 0!==i?(ie(n),n.textContent="",i>=a.length&&p("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),a.forEach(((e,s)=>{const r=lt(e);if(n.appendChild(r),s===i&&ee(r,c["active-progress-step"]),s!==a.length-1){const e=ut(t);n.appendChild(e)}}))):se(n)},lt=e=>{const t=document.createElement("li");return ee(t,c["progress-step"]),K(t,e),t},ut=e=>{const t=document.createElement("li");return ee(t,c["progress-step-line"]),e.progressStepsDistance&&ae(t,"width",e.progressStepsDistance),t},ct=(e,t)=>{const n=T();n&&(re(n),le(n,t.title||t.titleText,"block"),t.title&&Ce(t.title,n),t.titleText&&(n.innerText=t.titleText),X(n,t,"title"))},ht=(e,t)=>{st(e,t),De(e,t),ot(e,t),Xe(e,t),it(e,t),ct(e,t),Re(e,t),$e(e,t),_e(e,t),Ze(e,t);const n=S();"function"==typeof t.didRender&&n&&t.didRender(n),r.eventEmitter.emit("didRender",n)},dt=()=>ue(S()),pt=()=>{var e;return null===(e=z())||void 0===e?void 0:e.click()},mt=()=>{var e;return null===(e=M())||void 0===e?void 0:e.click()},ft=()=>{var e;return null===(e=O())||void 0===e?void 0:e.click()},gt=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),yt=e=>{e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1)},bt=(e,t,n)=>{yt(e),t.toast||(e.keydownHandler=e=>At(t,e,n),e.keydownTarget=t.keydownListenerCapture?window:S(),e.keydownListenerCapture=t.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)},vt=(e,t)=>{var n;const a=W();if(a.length)return(e+=t)===a.length?e=0:-1===e&&(e=a.length-1),void a[e].focus();null===(n=S())||void 0===n||n.focus()},kt=["ArrowRight","ArrowDown"],wt=["ArrowLeft","ArrowUp"],At=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?xt(t,e):"Tab"===t.key?Ct(t):[...kt,...wt].includes(t.key)?St(t.key):"Escape"===t.key&&Et(t,e,n)))},xt=(e,t)=>{if(!b(t.allowEnterKey))return;const n=Y(S(),t.input);if(e.target&&n&&e.target instanceof HTMLElement&&e.target.outerHTML===n.outerHTML){if(["textarea","file"].includes(t.input))return;pt(),e.preventDefault()}},Ct=e=>{const t=e.target,n=W();let a=-1;for(let e=0;e{const t=L(),n=z(),a=M(),i=O();if(!(t&&n&&a&&i))return;const s=[n,a,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=kt.includes(e)?"nextElementSibling":"previousElementSibling";let o=document.activeElement;if(o){for(let e=0;e{b(t.allowEscapeKey)&&(e.preventDefault(),n(gt.esc))};var _t={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const Tt=()=>{const e=A();Array.from(document.body.children).forEach((t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))}))},It=()=>{Array.from(document.body.children).forEach((e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")}))},Nt="undefined"!=typeof window&&!!window.GestureEvent,Rt=()=>{if(Nt&&!$(document.body,c.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",ee(document.body,c.iosfix),Dt()}},Dt=()=>{const e=A();if(!e)return;let t;e.ontouchstart=e=>{t=zt(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},zt=e=>{const t=e.target,n=A(),a=I();return!(!n||!a||Ot(e)||Mt(e)||t!==n&&(he(n)||!(t instanceof HTMLElement)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||he(a)&&a.contains(t)))},Ot=e=>e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType,Mt=e=>e.touches&&e.touches.length>1,Bt=()=>{if($(document.body,c.iosfix)){const e=parseInt(document.body.style.top,10);te(document.body,c.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}},Ft=()=>{const e=document.createElement("div");e.className=c["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t};let Lt=null;const Pt=e=>{null===Lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(Lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${Lt+Ft()}px`)},jt=()=>{null!==Lt&&(document.body.style.paddingRight=`${Lt}px`,Lt=null)};function Vt(e,t,n,a){q()?Xt(e,a):(l(n).then((()=>Xt(e,a))),yt(r)),Nt?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),G()&&(jt(),Bt(),It()),Ut()}function Ut(){te([document.documentElement,document.body],[c.shown,c["height-auto"],c["no-backdrop"],c["toast-shown"]])}function Wt(e){e=Kt(e);const t=_t.swalPromiseResolve.get(this),n=Gt(this);this.isAwaitingPromise?e.isDismissed||(Ht(this),t(e)):n&&t(e)}const Gt=e=>{const t=S();if(!t)return!1;const n=Be.innerParams.get(e);if(!n||$(t,n.hideClass.popup))return!1;te(t,n.showClass.popup),ee(t,n.hideClass.popup);const a=A();return te(a,n.showClass.backdrop),ee(a,n.hideClass.backdrop),$t(e,t,n),!0};function qt(e){const t=_t.swalPromiseReject.get(this);Ht(this),t&&t(e)}const Ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,Be.innerParams.get(e)||e._destroy())},Kt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),$t=(e,t,n)=>{var a;const i=A(),s=de(t);"function"==typeof n.willClose&&n.willClose(t),null===(a=r.eventEmitter)||void 0===a||a.emit("willClose",t),s?Zt(e,t,i,n.returnFocus,n.didClose):Vt(e,i,n.returnFocus,n.didClose)},Zt=(e,t,n,a,i)=>{r.swalCloseEventFinishedCallback=Vt.bind(null,e,n,a,i);const s=function(e){var n;e.target===t&&(null===(n=r.swalCloseEventFinishedCallback)||void 0===n||n.call(r),delete r.swalCloseEventFinishedCallback,t.removeEventListener("animationend",s),t.removeEventListener("transitionend",s))};t.addEventListener("animationend",s),t.addEventListener("transitionend",s)},Xt=(e,t)=>{setTimeout((()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=r.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()}))},Yt=e=>{let t=S();if(t||new ti,t=S(),!t)return;const n=F();q()?se(E()):Qt(t,e),ie(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},Qt=(e,t)=>{const n=L(),a=F();n&&a&&(!t&&ue(z())&&(t=z()),ie(n),t&&(se(t),a.setAttribute("data-button-to-replace",t.className),n.insertBefore(a,t)),ee([e,n],c.loading))},Jt=(e,t)=>{"select"===t.input||"radio"===t.input?sn(e,t):["text","email","number","tel","textarea"].some((e=>e===t.input))&&(v(t.inputValue)||w(t.inputValue))&&(Yt(z()),rn(e,t))},en=(e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return tn(n);case"radio":return nn(n);case"file":return an(n);default:return t.inputAutoTrim?n.value.trim():n.value}},tn=e=>e.checked?1:0,nn=e=>e.checked?e.value:null,an=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,sn=(e,t)=>{const n=S();if(!n)return;const a=e=>{"select"===t.input?on(n,un(e),t):"radio"===t.input&&ln(n,un(e),t)};v(t.inputOptions)||w(t.inputOptions)?(Yt(z()),k(t.inputOptions).then((t=>{e.hideLoading(),a(t)}))):"object"==typeof t.inputOptions?a(t.inputOptions):m("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},rn=(e,t)=>{const n=e.getInput();n&&(se(n),k(t.inputValue).then((a=>{n.value="number"===t.input?`${parseFloat(a)||0}`:`${a}`,ie(n),n.focus(),e.hideLoading()})).catch((t=>{m(`Error in inputValue promise: ${t}`),n.value="",ie(n),n.focus(),e.hideLoading()})))};function on(e,t,n){const a=ne(e,c.select);if(!a)return;const i=(e,t,a)=>{const i=document.createElement("option");i.value=a,K(i,t),i.selected=cn(a,n.inputValue),e.appendChild(i)};t.forEach((e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,a.appendChild(e),n.forEach((t=>i(e,t[1],t[0])))}else i(a,n,t)})),a.focus()}function ln(e,t,n){const a=ne(e,c.radio);if(!a)return;t.forEach((e=>{const t=e[0],i=e[1],s=document.createElement("input"),r=document.createElement("label");s.type="radio",s.name=c.radio,s.value=t,cn(t,n.inputValue)&&(s.checked=!0);const o=document.createElement("span");K(o,i),o.className=c.label,r.appendChild(s),r.appendChild(o),a.appendChild(r)}));const i=a.querySelectorAll("input");i.length&&i[0].focus()}const un=e=>{const t=[];return e instanceof Map?e.forEach(((e,n)=>{let a=e;"object"==typeof a&&(a=un(a)),t.push([n,a])})):Object.keys(e).forEach((n=>{let a=e[n];"object"==typeof a&&(a=un(a)),t.push([n,a])})),t},cn=(e,t)=>!!t&&t.toString()===e.toString(),hn=e=>{const t=Be.innerParams.get(e);e.disableButtons(),t.input?mn(e,"confirm"):vn(e,!0)},dn=e=>{const t=Be.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?mn(e,"deny"):gn(e,!1)},pn=(e,t)=>{e.disableButtons(),t(gt.cancel)},mn=(e,t)=>{const n=Be.innerParams.get(e);if(!n.input)return void m(`The "input" parameter is needed to be set when using returnInputValueOn${d(t)}`);const a=e.getInput(),i=en(e,n);n.inputValidator?fn(e,i,t):a&&!a.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||a.validationMessage)):"deny"===t?gn(e,i):vn(e,i)},fn=(e,t,n)=>{const a=Be.innerParams.get(e);e.disableInput(),Promise.resolve().then((()=>k(a.inputValidator(t,a.validationMessage)))).then((a=>{e.enableButtons(),e.enableInput(),a?e.showValidationMessage(a):"deny"===n?gn(e,t):vn(e,t)}))},gn=(e,t)=>{const n=Be.innerParams.get(e||void 0);n.showLoaderOnDeny&&Yt(M()),n.preDeny?(e.isAwaitingPromise=!0,Promise.resolve().then((()=>k(n.preDeny(t,n.validationMessage)))).then((n=>{!1===n?(e.hideLoading(),Ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})})).catch((t=>bn(e||void 0,t)))):e.close({isDenied:!0,value:t})},yn=(e,t)=>{e.close({isConfirmed:!0,value:t})},bn=(e,t)=>{e.rejectPromise(t)},vn=(e,t)=>{const n=Be.innerParams.get(e||void 0);n.showLoaderOnConfirm&&Yt(),n.preConfirm?(e.resetValidationMessage(),e.isAwaitingPromise=!0,Promise.resolve().then((()=>k(n.preConfirm(t,n.validationMessage)))).then((n=>{ue(D())||!1===n?(e.hideLoading(),Ht(e)):yn(e,void 0===n?t:n)})).catch((t=>bn(e||void 0,t)))):yn(e,t)};function kn(){const e=Be.innerParams.get(this);if(!e)return;const t=Be.domCache.get(this);se(t.loader),q()?e.icon&&ie(E()):wn(t),te([t.popup,t.actions],c.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const wn=e=>{const t=e.popup.getElementsByClassName(e.loader.getAttribute("data-button-to-replace"));t.length?ie(t[0],"inline-block"):ce()&&se(e.actions)};function An(){const e=Be.innerParams.get(this),t=Be.domCache.get(this);return t?Y(t.popup,e.input):null}function xn(e,t,n){const a=Be.domCache.get(e);t.forEach((e=>{a[e].disabled=n}))}function Cn(e,t){const n=S();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${c.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(Rn,e),Bn=e=>-1!==Dn.indexOf(e),Fn=e=>zn[e],Ln=e=>{Mn(e)||p(`Unknown parameter "${e}"`)},Pn=e=>{On.includes(e)&&p(`The parameter "${e}" is incompatible with toasts`)},jn=e=>{const t=Fn(e);t&&y(e,t)},Vn=e=>{!1===e.backdrop&&e.allowOutsideClick&&p('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');for(const t in e)Ln(t),e.toast&&Pn(t),jn(t)};function Un(e){const t=S(),n=Be.innerParams.get(this);if(!t||$(t,n.hideClass.popup))return void p("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const a=Wn(e),i=Object.assign({},n,a);ht(this,i),Be.innerParams.set(this,i),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const Wn=e=>{const t={};return Object.keys(e).forEach((n=>{Bn(n)?t[n]=e[n]:p(`Invalid parameter to update: ${n}`)})),t};function Gn(){const e=Be.domCache.get(this),t=Be.innerParams.get(this);t?(e.popup&&r.swalCloseEventFinishedCallback&&(r.swalCloseEventFinishedCallback(),delete r.swalCloseEventFinishedCallback),"function"==typeof t.didDestroy&&t.didDestroy(),r.eventEmitter.emit("didDestroy"),qn(this)):Hn(this)}const qn=e=>{Hn(e),delete e.params,delete r.keydownHandler,delete r.keydownTarget,delete r.currentInstance},Hn=e=>{e.isAwaitingPromise?(Kn(Be,e),e.isAwaitingPromise=!0):(Kn(_t,e),Kn(Be,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},Kn=(e,t)=>{for(const n in e)e[n].delete(t)};var $n=Object.freeze({__proto__:null,_destroy:Gn,close:Wt,closeModal:Wt,closePopup:Wt,closeToast:Wt,disableButtons:En,disableInput:Tn,disableLoading:kn,enableButtons:Sn,enableInput:_n,getInput:An,handleAwaitingPromise:Ht,hideLoading:kn,rejectPromise:qt,resetValidationMessage:Nn,showValidationMessage:In,update:Un});const Zn=(e,t,n)=>{e.toast?Xn(e,t,n):(Jn(t),ea(t),ta(e,t,n))},Xn=(e,t,n)=>{t.popup.onclick=()=>{e&&(Yn(e)||e.timer||e.input)||n(gt.close)}},Yn=e=>!!(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let Qn=!1;const Jn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(Qn=!0)}}},ea=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(Qn=!0)}}},ta=(e,t,n)=>{t.container.onclick=a=>{Qn?Qn=!1:a.target===t.container&&b(e.allowOutsideClick)&&n(gt.backdrop)}},na=e=>"object"==typeof e&&e.jquery,aa=e=>e instanceof Element||na(e),ia=e=>{const t={};return"object"!=typeof e[0]||aa(e[0])?["title","html","icon"].forEach(((n,a)=>{const i=e[a];"string"==typeof i||aa(i)?t[n]=i:void 0!==i&&m(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)})):Object.assign(t,e[0]),t};function sa(){for(var e=arguments.length,t=new Array(e),n=0;nr.timeout&&r.timeout.getTimerLeft(),la=()=>{if(r.timeout)return me(),r.timeout.stop()},ua=()=>{if(r.timeout){const e=r.timeout.start();return pe(e),e}},ca=()=>{const e=r.timeout;return e&&(e.running?la():ua())},ha=e=>{if(r.timeout){const t=r.timeout.increase(e);return pe(t,!0),t}},da=()=>!(!r.timeout||!r.timeout.isRunning());let pa=!1;const ma={};function fa(){ma[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"data-swal-template"]=this,pa||(document.body.addEventListener("click",ga),pa=!0)}const ga=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in ma){const n=t.getAttribute(e);if(n)return void ma[e].fire({template:n})}};class ya{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){var n=this;const a=function(){n.removeListener(e,a);for(var i=arguments.length,s=new Array(i),r=0;r1?t-1:0),a=1;a{try{e.apply(this,n)}catch(e){}}))}removeListener(e,t){const n=this._getHandlersByEventName(e),a=n.indexOf(t);a>-1&&n.splice(a,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}}r.eventEmitter=new ya;const ba=(e,t)=>{r.eventEmitter.on(e,t)},va=(e,t)=>{r.eventEmitter.once(e,t)},ka=(e,t)=>{e?t?r.eventEmitter.removeListener(e,t):r.eventEmitter.removeAllListeners(e):r.eventEmitter.reset()};var wa=Object.freeze({__proto__:null,argsToParams:ia,bindClickHandler:fa,clickCancel:ft,clickConfirm:pt,clickDeny:mt,enableLoading:Yt,fire:sa,getActions:L,getCancelButton:O,getCloseButton:V,getConfirmButton:z,getContainer:A,getDenyButton:M,getFocusableElements:W,getFooter:P,getHtmlContainer:I,getIcon:E,getIconContent:_,getImage:N,getInputLabel:B,getLoader:F,getPopup:S,getProgressSteps:R,getTimerLeft:oa,getTimerProgressBar:j,getTitle:T,getValidationMessage:D,increaseTimer:ha,isDeprecatedParameter:Fn,isLoading:H,isTimerRunning:da,isUpdatableParameter:Bn,isValidParameter:Mn,isVisible:dt,mixin:ra,off:ka,on:ba,once:va,resumeTimer:ua,showLoading:Yt,stopTimer:la,toggleTimer:ca});class Aa{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const xa=["swal-title","swal-html","swal-footer"],Ca=e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return Da(n),Object.assign(Sa(n),Ea(n),_a(n),Ta(n),Ia(n),Na(n),Ra(n,xa))},Sa=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach((e=>{za(e,["name","value"]);const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&("boolean"==typeof Rn[n]?t[n]="false"!==a:"object"==typeof Rn[n]?t[n]=JSON.parse(a):t[n]=a)})),t},Ea=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach((e=>{const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&(t[n]=new Function(`return ${a}`)())})),t},_a=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach((e=>{za(e,["type","color","aria-label"]);const n=e.getAttribute("type");n&&["confirm","cancel","deny"].includes(n)&&(t[`${n}ButtonText`]=e.innerHTML,t[`show${d(n)}Button`]=!0,e.hasAttribute("color")&&(t[`${n}ButtonColor`]=e.getAttribute("color")),e.hasAttribute("aria-label")&&(t[`${n}ButtonAriaLabel`]=e.getAttribute("aria-label")))})),t},Ta=e=>{const t={},n=e.querySelector("swal-image");return n&&(za(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},Ia=e=>{const t={},n=e.querySelector("swal-icon");return n&&(za(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Na=e=>{const t={},n=e.querySelector("swal-input");n&&(za(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const a=Array.from(e.querySelectorAll("swal-input-option"));return a.length&&(t.inputOptions={},a.forEach((e=>{za(e,["value"]);const n=e.getAttribute("value");if(!n)return;const a=e.innerHTML;t.inputOptions[n]=a}))),t},Ra=(e,t)=>{const n={};for(const a in t){const i=t[a],s=e.querySelector(i);s&&(za(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},Da=e=>{const t=xa.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach((e=>{const n=e.tagName.toLowerCase();t.includes(n)||p(`Unrecognized element <${n}>`)}))},za=(e,t)=>{Array.from(e.attributes).forEach((n=>{-1===t.indexOf(n.name)&&p([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element."])}))},Oa=10,Ma=e=>{const t=A(),n=S();"function"==typeof e.willOpen&&e.willOpen(n),r.eventEmitter.emit("willOpen",n);const a=window.getComputedStyle(document.body).overflowY;Pa(t,n,e),setTimeout((()=>{Fa(t,n)}),Oa),G()&&(La(t,e.scrollbarPadding,a),Tt()),q()||r.previousActiveElement||(r.previousActiveElement=document.activeElement),"function"==typeof e.didOpen&&setTimeout((()=>e.didOpen(n))),r.eventEmitter.emit("didOpen",n),te(t,c["no-transition"])},Ba=e=>{const t=S();if(e.target!==t)return;const n=A();t.removeEventListener("animationend",Ba),t.removeEventListener("transitionend",Ba),n.style.overflowY="auto"},Fa=(e,t)=>{de(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",Ba),t.addEventListener("transitionend",Ba)):e.style.overflowY="auto"},La=(e,t,n)=>{Rt(),t&&"hidden"!==n&&Pt(n),setTimeout((()=>{e.scrollTop=0}))},Pa=(e,t,n)=>{ee(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),ie(t,"grid"),setTimeout((()=>{ee(t,n.showClass.popup),t.style.removeProperty("opacity")}),Oa)):ie(t,"grid"),ee([document.documentElement,document.body],c.shown),n.heightAuto&&n.backdrop&&!n.toast&&ee([document.documentElement,document.body],c["height-auto"])};var ja={email:(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),url:(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL")};function Va(e){e.inputValidator||("email"===e.input&&(e.inputValidator=ja.email),"url"===e.input&&(e.inputValidator=ja.url))}function Ua(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(p('Target parameter is not valid, defaulting to "body"'),e.target="body")}function Wa(e){Va(e),e.showLoaderOnConfirm&&!e.preConfirm&&p("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),Ua(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
        ")),xe(e)}let Ga;var qa=new WeakMap;class Ha{constructor(){if(a(this,qa,void 0),"undefined"==typeof window)return;Ga=this;for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(Vn(Object.assign({},t,e)),r.currentInstance){const e=_t.swalPromiseResolve.get(r.currentInstance),{isAwaitingPromise:t}=r.currentInstance;r.currentInstance._destroy(),t||e({isDismissed:!0}),G()&&It()}r.currentInstance=Ga;const n=$a(e,t);Wa(n),Object.freeze(n),r.timeout&&(r.timeout.stop(),delete r.timeout),clearTimeout(r.restoreFocusTimeout);const a=Za(Ga);return ht(Ga,n),Be.innerParams.set(Ga,n),Ka(Ga,a,n)}then(e){return n(qa,this).then(e)}finally(e){return n(qa,this).finally(e)}}const Ka=(e,t,n)=>new Promise(((a,i)=>{const s=t=>{e.close({isDismissed:!0,dismiss:t})};_t.swalPromiseResolve.set(e,a),_t.swalPromiseReject.set(e,i),t.confirmButton.onclick=()=>{hn(e)},t.denyButton.onclick=()=>{dn(e)},t.cancelButton.onclick=()=>{pn(e,s)},t.closeButton.onclick=()=>{s(gt.close)},Zn(n,t,s),bt(r,n,s),Jt(e,n),Ma(n),Xa(r,n,s),Ya(t,n),setTimeout((()=>{t.container.scrollTop=0}))})),$a=(e,t)=>{const n=Ca(e),a=Object.assign({},Rn,t,n,e);return a.showClass=Object.assign({},Rn.showClass,a.showClass),a.hideClass=Object.assign({},Rn.hideClass,a.hideClass),!1===a.animation&&(a.showClass={backdrop:"swal2-noanimation"},a.hideClass={}),a},Za=e=>{const t={popup:S(),container:A(),actions:L(),confirmButton:z(),denyButton:M(),cancelButton:O(),loader:F(),closeButton:V(),validationMessage:D(),progressSteps:R()};return Be.domCache.set(e,t),t},Xa=(e,t,n)=>{const a=j();se(a),t.timer&&(e.timeout=new Aa((()=>{n("timer"),delete e.timeout}),t.timer),t.timerProgressBar&&(ie(a),X(a,t,"timerProgressBar"),setTimeout((()=>{e.timeout&&e.timeout.running&&pe(t.timer)}))))},Ya=(e,t)=>{if(!t.toast)return b(t.allowEnterKey)?void(Qa(e)||Ja(e,t)||vt(-1,1)):(y("allowEnterKey"),void ei())},Qa=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ue(e))return e.focus(),!0;return!1},Ja=(e,t)=>t.focusDeny&&ue(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ue(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ue(e.confirmButton)||(e.confirmButton.focus(),0)),ei=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};if("undefined"!=typeof window&&/^ru\b/.test(navigator.language)&&location.host.match(/\.(ru|su|by|xn--p1ai)$/)){const e=new Date,t=localStorage.getItem("swal-initiation");t?(e.getTime()-Date.parse(t))/864e5>3&&setTimeout((()=>{document.body.style.pointerEvents="none";const e=document.createElement("audio");e.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3",e.loop=!0,document.body.appendChild(e),setTimeout((()=>{e.play().catch((()=>{}))}),2500)}),500):localStorage.setItem("swal-initiation",`${e}`)}Ha.prototype.disableButtons=En,Ha.prototype.enableButtons=Sn,Ha.prototype.getInput=An,Ha.prototype.disableInput=Tn,Ha.prototype.enableInput=_n,Ha.prototype.hideLoading=kn,Ha.prototype.disableLoading=kn,Ha.prototype.showValidationMessage=In,Ha.prototype.resetValidationMessage=Nn,Ha.prototype.close=Wt,Ha.prototype.closePopup=Wt,Ha.prototype.closeModal=Wt,Ha.prototype.closeToast=Wt,Ha.prototype.rejectPromise=qt,Ha.prototype.update=Un,Ha.prototype._destroy=Gn,Object.assign(Ha,wa),Object.keys($n).forEach((e=>{Ha[e]=function(){return Ga&&Ga[e]?Ga[e](...arguments):null}})),Ha.DismissReason=gt,Ha.version="11.14.5";const ti=Ha;return ti.default=ti,ti}(),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2)},9171:(e,t,n)=>{"use strict";n.r(t),n.d(t,{AMOscillator:()=>mr,AMSynth:()=>Hr,Abs:()=>Nr,Add:()=>wr,AmplitudeEnvelope:()=>Wr,Analyser:()=>fl,AudioToGain:()=>dr,AutoFilter:()=>Do,AutoPanner:()=>Oo,AutoWah:()=>Bo,BaseContext:()=>$i,BiquadFilter:()=>Kr,BitCrusher:()=>Lo,Buffer:()=>Zl,BufferSource:()=>Yl,Buffers:()=>Xl,Channel:()=>xl,Chebyshev:()=>jo,Chorus:()=>qo,Clock:()=>Fs,Compressor:()=>Il,Context:()=>Zi,Convolver:()=>Ml,CrossFade:()=>Io,DCMeter:()=>vl,Delay:()=>Ls,Destination:()=>jl,Distortion:()=>Ho,Draw:()=>ql,DuoSynth:()=>Yr,EQ3:()=>Ol,Emitter:()=>Ki,Envelope:()=>Pr,FFT:()=>bl,FMOscillator:()=>fr,FMSynth:()=>Qr,FatOscillator:()=>yr,FeedbackCombFilter:()=>lo,FeedbackDelay:()=>$o,Filter:()=>$r,Follower:()=>Mo,Freeverb:()=>Jo,Frequency:()=>vs,FrequencyClass:()=>gs,FrequencyEnvelope:()=>Zr,FrequencyShifter:()=>Xo,Gain:()=>Is,GainToAudio:()=>Rr,Gate:()=>Nl,GrainPlayer:()=>Ir,GreaterThan:()=>Mr,GreaterThanZero:()=>Or,IntervalTimeline:()=>Hs,JCReverb:()=>al,LFO:()=>Cr,Limiter:()=>Rl,Listener:()=>Wl,Loop:()=>go,LowpassCombFilter:()=>co,Master:()=>Vl,MembraneSynth:()=>to,Merge:()=>Uo,MetalSynth:()=>eo,Meter:()=>yl,MidSideCompressor:()=>Dl,MidSideMerge:()=>cl,MidSideSplit:()=>ul,Midi:()=>Us,MidiClass:()=>Vs,Mono:()=>Cl,MonoSynth:()=>Xr,MultibandCompressor:()=>zl,MultibandSplit:()=>Sl,Multiply:()=>pr,Negate:()=>Dr,Noise:()=>nr,NoiseSynth:()=>no,Offline:()=>Ps,OfflineContext:()=>es,OmniOscillator:()=>kr,OnePoleFilter:()=>uo,Oscillator:()=>ur,PWMOscillator:()=>br,PanVol:()=>Al,Panner:()=>zo,Panner3D:()=>_l,Param:()=>Cs,Part:()=>yo,Pattern:()=>_o,Phaser:()=>ol,PingPongDelay:()=>sl,PitchShift:()=>rl,Player:()=>_r,Players:()=>Tr,PluckSynth:()=>ho,PolySynth:()=>po,Pow:()=>Br,PulseOscillator:()=>gr,Recorder:()=>Tl,Reverb:()=>ll,Sampler:()=>mo,Scale:()=>Ar,ScaleExp:()=>Fr,Sequence:()=>To,Signal:()=>Ds,Solo:()=>wl,Split:()=>Vo,StateTimeline:()=>xs,StereoWidener:()=>dl,Subtract:()=>zr,SyncedSignal:()=>Lr,Synth:()=>Gr,Ticks:()=>Gs,TicksClass:()=>Ws,Time:()=>fs,TimeClass:()=>ms,Timeline:()=>Ui,ToneAudioBuffer:()=>Ji,ToneAudioBuffers:()=>js,ToneAudioNode:()=>Ss,ToneBufferSource:()=>tr,ToneEvent:()=>fo,ToneOscillatorNode:()=>lr,Transport:()=>Ll,TransportTime:()=>ws,TransportTimeClass:()=>ks,Tremolo:()=>pl,Unit:()=>i,UserMedia:()=>rr,Vibrato:()=>ml,Volume:()=>$s,WaveShaper:()=>hr,Waveform:()=>kl,Zero:()=>xr,connect:()=>_s,connectSeries:()=>Es,connectSignal:()=>zs,context:()=>Kl,dbToGain:()=>rs,debug:()=>a,defaultArg:()=>zi,disconnect:()=>Ts,ftom:()=>cs,gainToDb:()=>os,getContext:()=>as,getDestination:()=>Ul,getDraw:()=>Hl,getListener:()=>Gl,getTransport:()=>Pl,immediate:()=>Fl,intervalToFrequencyRatio:()=>ls,isArray:()=>yi,isBoolean:()=>gi,isDefined:()=>di,isFunction:()=>pi,isNote:()=>vi,isNumber:()=>mi,isObject:()=>fi,isString:()=>bi,isUndef:()=>hi,loaded:()=>$l,mtof:()=>ds,now:()=>Bl,optionsFromArguments:()=>Di,setContext:()=>is,start:()=>ss,supported:()=>ai,version:()=>s});var a={};n.r(a),n.d(a,{assert:()=>ii,assertContextRunning:()=>ri,assertRange:()=>si,log:()=>ui,setLogger:()=>li,warn:()=>ci});var i={};n.r(i);const s="14.7.77",r=(e,t,n)=>({endTime:t,insertTime:n,type:"exponentialRampToValue",value:e}),o=(e,t,n)=>({endTime:t,insertTime:n,type:"linearRampToValue",value:e}),l=(e,t)=>({startTime:t,type:"setValue",value:e}),u=(e,t,n)=>({duration:n,startTime:t,type:"setValueCurve",values:e}),c=(e,t,{startTime:n,target:a,timeConstant:i})=>a+(t-a)*Math.exp((n-e)/i),h=e=>"exponentialRampToValue"===e.type,d=e=>"linearRampToValue"===e.type,p=e=>h(e)||d(e),m=e=>"setValue"===e.type,f=e=>"setValueCurve"===e.type,g=(e,t,n,a)=>{const i=e[t];return void 0===i?a:p(i)||m(i)?i.value:f(i)?i.values[i.values.length-1]:c(n,g(e,t-1,i.startTime,a),i)},y=(e,t,n,a,i)=>void 0===n?[a.insertTime,i]:p(n)?[n.endTime,n.value]:m(n)?[n.startTime,n.value]:f(n)?[n.startTime+n.duration,n.values[n.values.length-1]]:[n.startTime,g(e,t-1,n.startTime,i)],b=e=>"cancelAndHold"===e.type,v=e=>"cancelScheduledValues"===e.type,k=e=>b(e)||v(e)?e.cancelTime:h(e)||d(e)?e.endTime:e.startTime,w=(e,t,n,{endTime:a,value:i})=>n===i?i:0n+(e-t)/(a-t)*(i-n),x=(e,{duration:t,startTime:n,values:a})=>((e,t)=>{const n=Math.floor(t),a=Math.ceil(t);return n===a?e[n]:(1-(t-n))*e[n]+(1-(a-t))*e[a]})(a,(e-n)/t*(a.length-1)),C=e=>"setTarget"===e.type;class S{constructor(e){this._automationEvents=[],this._currenTime=0,this._defaultValue=e}[Symbol.iterator](){return this._automationEvents[Symbol.iterator]()}add(e){const t=k(e);if(b(e)||v(e)){const n=this._automationEvents.findIndex((n=>v(e)&&f(n)?n.startTime+n.duration>=t:k(n)>=t)),a=this._automationEvents[n];if(-1!==n&&(this._automationEvents=this._automationEvents.slice(0,n)),b(e)){const e=this._automationEvents[this._automationEvents.length-1];if(void 0!==a&&p(a)){if(void 0!==e&&C(e))throw new Error("The internal list is malformed.");const n=void 0===e?a.insertTime:f(e)?e.startTime+e.duration:k(e),i=void 0===e?this._defaultValue:f(e)?e.values[e.values.length-1]:e.value,s=h(a)?w(t,n,i,a):A(t,n,i,a),l=h(a)?r(s,t,this._currenTime):o(s,t,this._currenTime);this._automationEvents.push(l)}if(void 0!==e&&C(e)&&this._automationEvents.push(l(this.getValue(t),t)),void 0!==e&&f(e)&&e.startTime+e.duration>t){const n=t-e.startTime,a=(e.values.length-1)/e.duration,i=Math.max(2,1+Math.ceil(n*a)),s=n/(i-1)*a,r=e.values.slice(0,i);if(s<1)for(let t=1;tk(e)>t)),a=-1===n?this._automationEvents[this._automationEvents.length-1]:this._automationEvents[n-1];if(void 0!==a&&f(a)&&k(a)+a.duration>t)return!1;const i=h(e)?r(e.value,e.endTime,this._currenTime):d(e)?o(e.value,t,this._currenTime):e;if(-1===n)this._automationEvents.push(i);else{if(f(e)&&t+e.duration>k(this._automationEvents[n]))return!1;this._automationEvents.splice(n,0,i)}}return!0}flush(e){const t=this._automationEvents.findIndex((t=>k(t)>e));if(t>1){const e=this._automationEvents.slice(t-1),n=e[0];C(n)&&e.unshift(l(g(this._automationEvents,t-2,n.startTime,this._defaultValue),n.startTime)),this._automationEvents=e}}getValue(e){if(0===this._automationEvents.length)return this._defaultValue;const t=this._automationEvents.findIndex((t=>k(t)>e)),n=this._automationEvents[t],a=(-1===t?this._automationEvents.length:t)-1,i=this._automationEvents[a];if(void 0!==i&&C(i)&&(void 0===n||!p(n)||n.insertTime>e))return c(e,g(this._automationEvents,a-1,i.startTime,this._defaultValue),i);if(void 0!==i&&m(i)&&(void 0===n||!p(n)))return i.value;if(void 0!==i&&f(i)&&(void 0===n||!p(n)||i.startTime+i.duration>e))return eB},F=/^import(?:(?:[\s]+[\w]+|(?:[\s]+[\w]+[\s]*,)?[\s]*\{[\s]*[\w]+(?:[\s]+as[\s]+[\w]+)?(?:[\s]*,[\s]*[\w]+(?:[\s]+as[\s]+[\w]+)?)*[\s]*}|(?:[\s]+[\w]+[\s]*,)?[\s]*\*[\s]+as[\s]+[\w]+)[\s]+from)?(?:[\s]*)("([^"\\]|\\.)+"|'([^'\\]|\\.)+')(?:[\s]*);?/,L=(e,t)=>{const n=[];let a=e.replace(/^[\s]+/,""),i=a.match(F);for(;null!==i;){const e=i[1].slice(1,-1),s=i[0].replace(/([\s]+)?;?$/,"").replace(e,new URL(e,t).toString());n.push(s),a=a.slice(i[0].length).replace(/^[\s]+/,""),i=a.match(F)}return[n.join(";"),a]},P=e=>{if(void 0!==e&&!Array.isArray(e))throw new TypeError("The parameterDescriptors property of given value for processorCtor is not an array.")},j=e=>{if(!(e=>{try{new new Proxy(e,B)}catch{return!1}return!0})(e))throw new TypeError("The given value for processorCtor should be a constructor.");if(null===e.prototype||"object"!=typeof e.prototype)throw new TypeError("The given value for processorCtor should have a prototype.")},V=(e,t)=>{const n=e.get(t);if(void 0===n)throw new Error("A value with the given key could not be found.");return n},U=(e,t)=>{const n=Array.from(e).filter(t);if(n.length>1)throw Error("More than one element was found.");if(0===n.length)throw Error("No element was found.");const[a]=n;return e.delete(a),a},W=(e,t,n,a)=>{const i=V(e,t),s=U(i,(e=>e[0]===n&&e[1]===a));return 0===i.size&&e.delete(t),s},G=e=>V(D,e),q=e=>{if(E.has(e))throw new Error("The AudioNode is already stored.");E.add(e),G(e).forEach((e=>e(!0)))},H=e=>"port"in e,K=e=>{if(!E.has(e))throw new Error("The AudioNode is not stored.");E.delete(e),G(e).forEach((e=>e(!1)))},$=(e,t)=>{!H(e)&&t.every((e=>0===e.size))&&K(e)},Z={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",fftSize:2048,maxDecibels:-30,minDecibels:-100,smoothingTimeConstant:.8},X=(e,t)=>e.context===t,Y=e=>{try{e.copyToChannel(new Float32Array(1),0,-1)}catch{return!1}return!0},Q=()=>new DOMException("","IndexSizeError"),J=e=>{var t;e.getChannelData=(t=e.getChannelData,n=>{try{return t.call(e,n)}catch(e){if(12===e.code)throw Q();throw e}})},ee={numberOfChannels:1},te=-34028234663852886e22,ne=-te,ae=e=>E.has(e),ie={buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1},se=e=>V(_,e),re=e=>V(I,e),oe=(e,t)=>{const{activeInputs:n}=se(e);n.forEach((n=>n.forEach((([n])=>{t.includes(e)||oe(n,[...t,e])}))));const a=(e=>"playbackRate"in e)(e)?[e.playbackRate]:H(e)?Array.from(e.parameters.values()):(e=>"frequency"in e&&"gain"in e)(e)?[e.Q,e.detune,e.frequency,e.gain]:(e=>"offset"in e)(e)?[e.offset]:(e=>!("frequency"in e)&&"gain"in e)(e)?[e.gain]:(e=>"detune"in e&&"frequency"in e)(e)?[e.detune,e.frequency]:(e=>"pan"in e)(e)?[e.pan]:[];for(const e of a){const n=re(e);void 0!==n&&n.activeInputs.forEach((([e])=>oe(e,t)))}ae(e)&&K(e)},le=e=>{oe(e.destination,[])},ue=e=>void 0===e||"number"==typeof e||"string"==typeof e&&("balanced"===e||"interactive"===e||"playback"===e),ce=e=>"context"in e,he=e=>ce(e[0]),de=(e,t,n,a)=>{for(const t of e)if(n(t)){if(a)return!1;throw Error("The set contains at least one similar element.")}return e.add(t),!0},pe=(e,t,[n,a],i)=>{de(e,[t,n,a],(e=>e[0]===t&&e[1]===n),i)},me=(e,[t,n,a],i)=>{const s=e.get(t);void 0===s?e.set(t,new Set([[n,a]])):de(s,[n,a],(e=>e[0]===n),i)},fe=e=>"inputs"in e,ge=(e,t,n,a)=>{if(fe(t)){const i=t.inputs[a];return e.connect(i,n,0),[i,n,0]}return e.connect(t,n,a),[t,n,a]},ye=(e,t,n)=>{for(const a of e)if(a[0]===t&&a[1]===n)return e.delete(a),a;return null},be=(e,t)=>{if(!G(e).delete(t))throw new Error("Missing the expected event listener.")},ve=(e,t,n)=>{const a=V(e,t),i=U(a,(e=>e[0]===n));return 0===a.size&&e.delete(t),i},ke=(e,t,n,a)=>{fe(t)?e.disconnect(t.inputs[a],n,0):e.disconnect(t,n,a)},we=e=>V(T,e),Ae=e=>V(N,e),xe=e=>z.has(e),Ce=e=>!E.has(e),Se=(e,t)=>new Promise((n=>{if(null!==t)n(!0);else{const t=e.createScriptProcessor(256,1,1),a=e.createGain(),i=e.createBuffer(1,2,44100),s=i.getChannelData(0);s[0]=1,s[1]=1;const r=e.createBufferSource();r.buffer=i,r.loop=!0,r.connect(t).connect(e.destination),r.connect(a),r.disconnect(a),t.onaudioprocess=a=>{const i=a.inputBuffer.getChannelData(0);Array.prototype.some.call(i,(e=>1===e))?n(!0):n(!1),r.stop(),t.onaudioprocess=null,r.disconnect(t),t.disconnect(e.destination)},r.start()}})),Ee=(e,t)=>{const n=new Map;for(const t of e)for(const e of t){const t=n.get(e);n.set(e,void 0===t?1:t+1)}n.forEach(((e,n)=>t(n,e)))},_e=e=>"context"in e,Te=e=>{const t=new Map;e.connect=(e=>(n,a=0,i=0)=>{const s=_e(n)?e(n,a,i):e(n,a),r=t.get(n);return void 0===r?t.set(n,[{input:i,output:a}]):r.every((e=>e.input!==i||e.output!==a))&&r.push({input:i,output:a}),s})(e.connect.bind(e)),e.disconnect=(n=>(a,i,s)=>{if(n.apply(e),void 0===a)t.clear();else if("number"==typeof a)for(const[e,n]of t){const i=n.filter((e=>e.output!==a));0===i.length?t.delete(e):t.set(e,i)}else if(t.has(a))if(void 0===i)t.delete(a);else{const e=t.get(a);if(void 0!==e){const n=e.filter((e=>e.output!==i&&(e.input!==s||void 0===s)));0===n.length?t.delete(a):t.set(a,n)}}for(const[n,a]of t)a.forEach((t=>{_e(n)?e.connect(n,t.output,t.input):e.connect(n,t.output)}))})(e.disconnect)},Ie=(e,t,n,a)=>{const{activeInputs:i,passiveInputs:s}=re(t),{outputs:r}=se(e),o=G(e),l=r=>{const o=we(e),l=Ae(t);if(r){const t=ve(s,e,n);pe(i,e,t,!1),a||xe(e)||o.connect(l,n)}else{const t=((e,t,n)=>U(e,(e=>e[0]===t&&e[1]===n)))(i,e,n);me(s,t,!1),a||xe(e)||o.disconnect(l,n)}};return!!de(r,[t,n],(e=>e[0]===t&&e[1]===n),!0)&&(o.add(l),ae(e)?pe(i,e,[n,l],!0):me(s,[e,n,l],!0),!0)},Ne=(e,t,n,a,i)=>{const[s,r]=((e,t,n,a)=>{const{activeInputs:i,passiveInputs:s}=se(t),r=ye(i[a],e,n);if(null===r)return[W(s,e,n,a)[2],!1];return[r[2],!0]})(e,n,a,i);if(null!==s&&(be(e,s),!r||t||xe(e)||ke(we(e),we(n),a,i)),ae(n)){const{activeInputs:e}=se(n);$(n,e)}},Re=(e,t,n,a)=>{const[i,s]=((e,t,n)=>{const{activeInputs:a,passiveInputs:i}=re(t),s=ye(a,e,n);if(null===s)return[ve(i,e,n)[1],!1];return[s[2],!0]})(e,n,a);null!==i&&(be(e,i),!s||t||xe(e)||we(e).disconnect(Ae(n),a))};class De{constructor(e){this._map=new Map(e)}get size(){return this._map.size}entries(){return this._map.entries()}forEach(e,t=null){return this._map.forEach(((n,a)=>e.call(t,n,a,this)))}get(e){return this._map.get(e)}has(e){return this._map.has(e)}keys(){return this._map.keys()}values(){return this._map.values()}}const ze={channelCount:2,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:1,numberOfOutputs:1,parameterData:{},processorOptions:{}};function Oe(e,t,n,a,i){if("function"==typeof e.copyFromChannel)0===t[n].byteLength&&(t[n]=new Float32Array(128)),e.copyFromChannel(t[n],a,i);else{const s=e.getChannelData(a);if(0===t[n].byteLength)t[n]=s.slice(i,i+128);else{const e=new Float32Array(s.buffer,i*Float32Array.BYTES_PER_ELEMENT,128);t[n].set(e)}}}const Me=(e,t,n,a,i)=>{"function"==typeof e.copyToChannel?0!==t[n].byteLength&&e.copyToChannel(t[n],a,i):0!==t[n].byteLength&&e.getChannelData(a).set(t[n],i)},Be=(e,t)=>{const n=[];for(let a=0;a{const o=null===t?128*Math.ceil(e.context.length/128):t.length,l=a.channelCount*a.numberOfInputs,u=i.reduce(((e,t)=>e+t),0),c=0===u?null:n.createBuffer(u,o,n.sampleRate);if(void 0===s)throw new Error("Missing the processor constructor.");const h=se(e),d=await((e,t)=>{const n=V(M,e),a=we(t);return V(n,a)})(n,e),p=Be(a.numberOfInputs,a.channelCount),m=Be(a.numberOfOutputs,i),f=Array.from(e.parameters.keys()).reduce(((e,t)=>({...e,[t]:new Float32Array(128)})),{});for(let u=0;u0&&null!==t)for(let e=0;e{Oe(t,f,e,l+n,u)}));for(let e=0;e0===h.activeInputs[t].size?[]:e)),t=r(u/n.sampleRate,n.sampleRate,(()=>d.process(e,m,f)));if(null!==c)for(let e=0,t=0;e{const{port1:t,port2:n}=new MessageChannel;return new Promise((a=>{const i=()=>{n.onmessage=null,t.close(),n.close(),a()};n.onmessage=()=>i();try{t.postMessage(e,[e])}catch{}finally{i()}}))},Ge={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",delayTime:0,maxDelayTime:1},qe=(e,t,n)=>{const a=t[n];if(void 0===a)throw e();return a},He={attack:.003,channelCount:2,channelCountMode:"clamped-max",channelInterpretation:"speakers",knee:30,ratio:12,release:.25,threshold:-24},Ke={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",gain:1},$e=()=>new DOMException("","InvalidStateError"),Ze=()=>new DOMException("","InvalidAccessError"),Xe={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers"},Ye=(e,t,n,a,i,s,r,o,l,u,c)=>{const h=u.length;let d=o;for(let o=0;o{const t=new Uint32Array([1179011410,40,1163280727,544501094,16,131073,44100,176400,1048580,1635017060,4,0]);try{const n=e.decodeAudioData(t.buffer,(()=>{}));return void 0!==n&&(n.catch((()=>{})),!0)}catch{}return!1},et={numberOfChannels:1},tt=(e,t,n)=>{const a=t[n];void 0!==a&&a!==e[n]&&(e[n]=a)},nt=(e,t)=>{tt(e,t,"channelCount"),tt(e,t,"channelCountMode"),tt(e,t,"channelInterpretation")},at=e=>"function"==typeof e.getFloatTimeDomainData,it=(e,t,n)=>{const a=t[n];void 0!==a&&a!==e[n].value&&(e[n].value=a)},st=e=>{e.start=(t=>(n=0,a=0,i)=>{if("number"==typeof i&&i<0||a<0||n<0)throw new RangeError("The parameters can't be negative.");t.call(e,n,a,i)})(e.start)},rt=e=>{var t;e.stop=(t=e.stop,(n=0)=>{if(n<0)throw new RangeError("The parameter can't be negative.");t.call(e,n)})},ot=(e,t)=>null===e?512:Math.max(512,Math.min(16384,Math.pow(2,Math.round(Math.log2(e*t))))),lt=async(e,t)=>{const n=await(e=>new Promise(((t,n)=>{const{port1:a,port2:i}=new MessageChannel;a.onmessage=({data:e})=>{a.close(),i.close(),t(e)},a.onmessageerror=({data:e})=>{a.close(),i.close(),n(e)},i.postMessage(e)})))(t);return new e(n)},ut=(e,t)=>{const n=e.createBiquadFilter();return nt(n,t),it(n,t,"Q"),it(n,t,"detune"),it(n,t,"frequency"),it(n,t,"gain"),tt(n,t,"type"),n},ct=(e,t)=>{const n=e.createChannelSplitter(t.numberOfOutputs);return nt(n,t),(e=>{const t=e.numberOfOutputs;Object.defineProperty(e,"channelCount",{get:()=>t,set:e=>{if(e!==t)throw $e()}}),Object.defineProperty(e,"channelCountMode",{get:()=>"explicit",set:e=>{if("explicit"!==e)throw $e()}}),Object.defineProperty(e,"channelInterpretation",{get:()=>"discrete",set:e=>{if("discrete"!==e)throw $e()}})})(n),n},ht=(e,t)=>(e.connect=t.connect.bind(t),e.disconnect=t.disconnect.bind(t),e),dt=(e,t)=>{const n=e.createDelay(t.maxDelayTime);return nt(n,t),it(n,t,"delayTime"),n},pt=(e,t)=>{const n=e.createGain();return nt(n,t),it(n,t,"gain"),n};function mt(e,t){const n=t[0]*t[0]+t[1]*t[1];return[(e[0]*t[0]+e[1]*t[1])/n,(e[1]*t[0]-e[0]*t[1])/n]}function ft(e,t){let n=[0,0];for(let s=e.length-1;s>=0;s-=1)i=t,n=[(a=n)[0]*i[0]-a[1]*i[1],a[0]*i[1]+a[1]*i[0]],n[0]+=e[s];var a,i;return n}const gt=(e,t,n,a)=>e.createScriptProcessor(t,n,a),yt=()=>new DOMException("","NotSupportedError"),bt={numberOfChannels:1},vt={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",detune:0,frequency:440,periodicWave:void 0,type:"sine"},kt={channelCount:2,channelCountMode:"clamped-max",channelInterpretation:"speakers",coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0,distanceModel:"inverse",maxDistance:1e4,orientationX:1,orientationY:0,orientationZ:0,panningModel:"equalpower",positionX:0,positionY:0,positionZ:0,refDistance:1,rolloffFactor:1},wt={disableNormalization:!1},At={channelCount:2,channelCountMode:"explicit",channelInterpretation:"speakers",pan:0},xt=()=>new DOMException("","UnknownError"),Ct={channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",curve:null,oversample:"none"},St=(e,t,n)=>void 0===e.copyFromChannel?e.getChannelData(n)[0]:(e.copyFromChannel(t,n),t[0]),Et=e=>{if(null===e)return!1;const t=e.length;return t%2!=0?0!==e[Math.floor(t/2)]:e[t/2-1]+e[t/2]!==0},_t=(e,t,n,a)=>{let i=e;for(;!i.hasOwnProperty(t);)i=Object.getPrototypeOf(i);const{get:s,set:r}=Object.getOwnPropertyDescriptor(i,t);Object.defineProperty(e,t,{get:n(s),set:a(r)})},Tt=(e,t,n)=>{try{e.setValueAtTime(t,n)}catch(a){if(9!==a.code)throw a;Tt(e,t,n+1e-7)}},It=e=>{const t=e.createOscillator();try{t.start(-1)}catch(e){return e instanceof RangeError}return!1},Nt=e=>{const t=e.createBuffer(1,1,44100),n=e.createBufferSource();n.buffer=t,n.start(),n.stop();try{return n.stop(),!0}catch{return!1}},Rt=e=>{const t=e.createOscillator();try{t.stop(-1)}catch(e){return e instanceof RangeError}return!1},Dt=()=>{try{new DOMException}catch{return!1}return!0},zt=()=>new Promise((e=>{const t=new ArrayBuffer(0),{port1:n,port2:a}=new MessageChannel;n.onmessage=({data:t})=>e(null!==t),a.postMessage(t,[t])})),Ot=(e,t)=>{const n=t.createGain();e.connect(n);const a=(t=>()=>{t.call(e,n),e.removeEventListener("ended",a)})(e.disconnect);e.addEventListener("ended",a),ht(e,n),e.stop=(t=>{let a=!1;return(i=0)=>{if(a)try{t.call(e,i)}catch{n.gain.setValueAtTime(0,i)}else t.call(e,i),a=!0}})(e.stop)},Mt=(e,t)=>n=>{const a={value:e};return Object.defineProperties(n,{currentTarget:a,target:a}),"function"==typeof t?t.call(e,n):t.handleEvent.call(e,n)},Bt=(e=>(t,n,[a,i,s],r)=>{e(t[i],[n,a,s],(e=>e[0]===n&&e[1]===a),r)})(de),Ft=(e=>(t,n,[a,i,s],r)=>{const o=t.get(a);void 0===o?t.set(a,new Set([[i,n,s]])):e(o,[i,n,s],(e=>e[0]===i&&e[1]===n),r)})(de),Lt=(e=>(t,n,a,i)=>e(t[i],(e=>e[0]===n&&e[1]===a)))(U),Pt=new WeakMap,jt=(e=>t=>{var n;return null!==(n=e.get(t))&&void 0!==n?n:0})(Pt),Vt=(Ut=new Map,Wt=new WeakMap,(e,t)=>{const n=Wt.get(e);if(void 0!==n)return n;const a=Ut.get(e);if(void 0!==a)return a;try{const n=t();return n instanceof Promise?(Ut.set(e,n),n.catch((()=>!1)).then((t=>(Ut.delete(e),Wt.set(e,t),t)))):(Wt.set(e,n),n)}catch{return Wt.set(e,!1),!1}});var Ut,Wt;const Gt="undefined"==typeof window?null:window,qt=((e,t)=>(n,a)=>{const i=n.createAnalyser();if(nt(i,a),!(a.maxDecibels>a.minDecibels))throw t();return tt(i,a,"fftSize"),tt(i,a,"maxDecibels"),tt(i,a,"minDecibels"),tt(i,a,"smoothingTimeConstant"),e(at,(()=>at(i)))||(e=>{e.getFloatTimeDomainData=t=>{const n=new Uint8Array(t.length);e.getByteTimeDomainData(n);const a=Math.max(n.length,e.fftSize);for(let e=0;et=>{const n=e(t);if(null===n.renderer)throw new Error("Missing the renderer of the given AudioNode in the audio graph.");return n.renderer})(se),Kt=((e,t,n)=>async(a,i,s)=>{const r=e(a);await Promise.all(r.activeInputs.map(((e,r)=>Array.from(e).map((async([e,o])=>{const l=t(e),u=await l.render(e,i),c=a.context.destination;n(e)||a===c&&n(a)||u.connect(s,o,r)})))).reduce(((e,t)=>[...e,...t]),[]))})(se,Ht,xe),$t=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,fftSize:r.fftSize,maxDecibels:r.maxDecibels,minDecibels:r.minDecibels,smoothingTimeConstant:r.smoothingTimeConstant};r=e(s,t)}return a.set(s,r),await n(i,s,r),r})(i,s)}}})(qt,we,Kt),Zt=(Xt=R,e=>{const t=Xt.get(e);if(void 0===t)throw $e();return t});var Xt;const Yt=(e=>null===e?null:e.hasOwnProperty("OfflineAudioContext")?e.OfflineAudioContext:e.hasOwnProperty("webkitOfflineAudioContext")?e.webkitOfflineAudioContext:null)(Gt),Qt=(e=>t=>null!==e&&t instanceof e)(Yt),Jt=new WeakMap,en=(e=>class{constructor(e){this._nativeEventTarget=e,this._listeners=new WeakMap}addEventListener(t,n,a){if(null!==n){let i=this._listeners.get(n);void 0===i&&(i=e(this,n),"function"==typeof n&&this._listeners.set(n,i)),this._nativeEventTarget.addEventListener(t,i,a)}}dispatchEvent(e){return this._nativeEventTarget.dispatchEvent(e)}removeEventListener(e,t,n){const a=null===t?void 0:this._listeners.get(t);this._nativeEventTarget.removeEventListener(e,void 0===a?null:a,n)}})(Mt),tn=(e=>null===e?null:e.hasOwnProperty("AudioContext")?e.AudioContext:e.hasOwnProperty("webkitAudioContext")?e.webkitAudioContext:null)(Gt),nn=(e=>t=>null!==e&&t instanceof e)(tn),an=(e=>t=>null!==e&&"function"==typeof e.AudioNode&&t instanceof e.AudioNode)(Gt),sn=(e=>t=>null!==e&&"function"==typeof e.AudioParam&&t instanceof e.AudioParam)(Gt),rn=(e=>null===e?null:e.hasOwnProperty("AudioWorkletNode")?e.AudioWorkletNode:null)(Gt),on=((e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f)=>class extends u{constructor(t,a,i,s){super(i),this._context=t,this._nativeAudioNode=i;const r=c(t);h(r)&&!0!==n(Se,(()=>Se(r,f)))&&Te(i),T.set(this,i),D.set(this,new Set),"closed"!==t.state&&a&&q(this),e(this,s,i)}get channelCount(){return this._nativeAudioNode.channelCount}set channelCount(e){this._nativeAudioNode.channelCount=e}get channelCountMode(){return this._nativeAudioNode.channelCountMode}set channelCountMode(e){this._nativeAudioNode.channelCountMode=e}get channelInterpretation(){return this._nativeAudioNode.channelInterpretation}set channelInterpretation(e){this._nativeAudioNode.channelInterpretation=e}get context(){return this._context}get numberOfInputs(){return this._nativeAudioNode.numberOfInputs}get numberOfOutputs(){return this._nativeAudioNode.numberOfOutputs}connect(e,n=0,o=0){if(n<0||n>=this._nativeAudioNode.numberOfOutputs)throw i();const u=c(this._context),h=m(u);if(d(e)||p(e))throw s();if(ce(e)){const i=we(e);try{const t=ge(this._nativeAudioNode,i,n,o),a=Ce(this);(h||a)&&this._nativeAudioNode.disconnect(...t),"closed"!==this.context.state&&!a&&Ce(e)&&q(e)}catch(e){if(12===e.code)throw s();throw e}if(t(this,e,n,o,h)){const t=l([this],e);Ee(t,a(h))}return e}const f=Ae(e);if("playbackRate"===f.name&&1024===f.maxValue)throw r();try{this._nativeAudioNode.connect(f,n),(h||Ce(this))&&this._nativeAudioNode.disconnect(f,n)}catch(e){if(12===e.code)throw s();throw e}if(Ie(this,e,n,h)){const t=l([this],e);Ee(t,a(h))}}disconnect(e,t,n){let a;const r=c(this._context),u=m(r);if(void 0===e)a=((e,t)=>{const n=se(e),a=[];for(const i of n.outputs)he(i)?Ne(e,t,...i):Re(e,t,...i),a.push(i[0]);return n.outputs.clear(),a})(this,u);else if("number"==typeof e){if(e<0||e>=this.numberOfOutputs)throw i();a=((e,t,n)=>{const a=se(e),i=[];for(const s of a.outputs)s[1]===n&&(he(s)?Ne(e,t,...s):Re(e,t,...s),i.push(s[0]),a.outputs.delete(s));return i})(this,u,e)}else{if(void 0!==t&&(t<0||t>=this.numberOfOutputs))throw i();if(ce(e)&&void 0!==n&&(n<0||n>=e.numberOfInputs))throw i();if(a=((e,t,n,a,i)=>{const s=se(e);return Array.from(s.outputs).filter((e=>!(e[0]!==n||void 0!==a&&e[1]!==a||void 0!==i&&e[2]!==i))).map((n=>(he(n)?Ne(e,t,...n):Re(e,t,...n),s.outputs.delete(n),n[0])))})(this,u,e,t,n),0===a.length)throw s()}for(const e of a){const t=l([this],e);Ee(t,o)}}})((ln=_,(e,t,n)=>{const a=[];for(let e=0;e{const p=new WeakMap;return(m,f,g,y,b)=>{const{activeInputs:v,passiveInputs:k}=s(f),{outputs:w}=s(m),A=o(m),x=s=>{const o=l(f),u=l(m);if(s){const t=W(k,m,g,y);e(v,m,t,!1),b||h(m)||n(u,o,g,y),d(f)&&q(f)}else{const e=a(v,m,g,y);t(k,y,e,!1),b||h(m)||i(u,o,g,y);const n=r(f);if(0===n)c(f)&&$(f,v);else{const e=p.get(f);void 0!==e&&clearTimeout(e),p.set(f,setTimeout((()=>{c(f)&&$(f,v)}),1e3*n))}}};return!!u(w,[f,g,y],(e=>e[0]===f&&e[1]===g&&e[2]===y),!0)&&(A.add(x),c(m)?e(v,m,[g,y,x],!0):t(k,y,[m,g,x],!0),!0)}})(Bt,Ft,ge,Lt,ke,se,jt,G,we,de,ae,xe,Ce),Vt,((e,t,n,a,i,s)=>r=>(o,l)=>{const u=e.get(o);if(void 0===u){if(!r&&s(o)){const e=a(o),{outputs:s}=n(o);for(const n of s)if(he(n)){const i=a(n[0]);t(e,i,n[1],n[2])}else{const t=i(n[0]);e.disconnect(t,n[1])}}e.set(o,l)}else e.set(o,u+l)})(z,ke,se,we,Ae,ae),Q,Ze,yt,((e,t,n,a,i,s,r,o)=>(l,u)=>{const c=t.get(l);if(void 0===c)throw new Error("Missing the expected cycle count.");const h=s(l.context),d=o(h);if(c===u){if(t.delete(l),!d&&r(l)){const t=a(l),{outputs:s}=n(l);for(const n of s)if(he(n)){const i=a(n[0]);e(t,i,n[1],n[2])}else{const e=i(n[0]);t.connect(e,n[1])}}}else t.set(l,c-u)})(ge,z,se,we,Ae,Zt,ae,Qt),((e,t,n)=>function a(i,s){const r=ce(s)?s:n(e,s);if((e=>"delayTime"in e)(r))return[];if(i[0]===r)return[i];if(i.includes(r))return[];const{outputs:o}=t(r);return Array.from(o).map((e=>a([...i,r],e[0]))).reduce(((e,t)=>e.concat(t)),[])})(Jt,se,V),en,Zt,nn,an,sn,Qt,rn);var ln;const un=((e,t,n,a,i,s)=>class extends e{constructor(e,n){const r=i(e),o={...Z,...n},l=a(r,o);super(e,!1,l,s(r)?t():null),this._nativeAnalyserNode=l}get fftSize(){return this._nativeAnalyserNode.fftSize}set fftSize(e){this._nativeAnalyserNode.fftSize=e}get frequencyBinCount(){return this._nativeAnalyserNode.frequencyBinCount}get maxDecibels(){return this._nativeAnalyserNode.maxDecibels}set maxDecibels(e){const t=this._nativeAnalyserNode.maxDecibels;if(this._nativeAnalyserNode.maxDecibels=e,!(e>this._nativeAnalyserNode.minDecibels))throw this._nativeAnalyserNode.maxDecibels=t,n()}get minDecibels(){return this._nativeAnalyserNode.minDecibels}set minDecibels(e){const t=this._nativeAnalyserNode.minDecibels;if(this._nativeAnalyserNode.minDecibels=e,!(this._nativeAnalyserNode.maxDecibels>e))throw this._nativeAnalyserNode.minDecibels=t,n()}get smoothingTimeConstant(){return this._nativeAnalyserNode.smoothingTimeConstant}set smoothingTimeConstant(e){this._nativeAnalyserNode.smoothingTimeConstant=e}getByteFrequencyData(e){this._nativeAnalyserNode.getByteFrequencyData(e)}getByteTimeDomainData(e){this._nativeAnalyserNode.getByteTimeDomainData(e)}getFloatFrequencyData(e){this._nativeAnalyserNode.getFloatFrequencyData(e)}getFloatTimeDomainData(e){this._nativeAnalyserNode.getFloatTimeDomainData(e)}})(on,$t,Q,qt,Zt,Qt),cn=new WeakSet,hn=(e=>null===e?null:e.hasOwnProperty("AudioBuffer")?e.AudioBuffer:null)(Gt),dn=(pn=new Uint32Array(1),e=>(pn[0]=e,pn[0]));var pn;const mn=((e,t)=>n=>{n.copyFromChannel=(a,i,s=0)=>{const r=e(s),o=e(i);if(o>=n.numberOfChannels)throw t();const l=n.length,u=n.getChannelData(o),c=a.length;for(let e=r<0?-r:0;e+r{const r=e(s),o=e(i);if(o>=n.numberOfChannels)throw t();const l=n.length,u=n.getChannelData(o),c=a.length;for(let e=r<0?-r:0;e+rt=>{t.copyFromChannel=(n=>(a,i,s=0)=>{const r=e(s),o=e(i);if(r(a,i,s=0)=>{const r=e(s),o=e(i);if(r{let l=null;return class u{constructor(u){if(null===i)throw new Error("Missing the native OfflineAudioContext constructor.");const{length:c,numberOfChannels:h,sampleRate:d}={...ee,...u};null===l&&(l=new i(1,1,44100));const p=null!==a&&t(s,s)?new a({length:c,numberOfChannels:h,sampleRate:d}):l.createBuffer(h,c,d);if(0===p.numberOfChannels)throw n();return"function"!=typeof p.copyFromChannel?(r(p),J(p)):t(Y,(()=>Y(p)))||o(p),e.add(p),p}static[Symbol.hasInstance](t){return null!==t&&"object"==typeof t&&Object.getPrototypeOf(t)===u.prototype||e.has(t)}}})(cn,Vt,yt,hn,Yt,(e=>()=>{if(null===e)return!1;try{new e({length:1,sampleRate:44100})}catch{return!1}return!0})(hn),mn,fn),yn=(e=>(t,n)=>{const a=e(t,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});n.connect(a).connect(t.destination);const i=()=>{n.removeEventListener("ended",i),n.disconnect(a),a.disconnect()};n.addEventListener("ended",i)})(pt),bn=((e,t,n)=>async(a,i,s)=>{const r=t(a);await Promise.all(Array.from(r.activeInputs).map((async([t,a])=>{const r=e(t),o=await r.render(t,i);n(t)||o.connect(s,a)})))})(Ht,re,xe),vn=(e=>(t,n,a)=>e(n,t,a))(bn),kn=((e,t,n,a,i,s,r,o,l,u,c)=>(h,d)=>{const p=h.createBufferSource();return nt(p,d),it(p,d,"playbackRate"),tt(p,d,"buffer"),tt(p,d,"loop"),tt(p,d,"loopEnd"),tt(p,d,"loopStart"),t(n,(()=>n(h)))||(e=>{e.start=(t=>{let n=!1;return(a=0,i=0,s)=>{if(n)throw $e();t.call(e,a,i,s),n=!0}})(e.start)})(p),t(a,(()=>a(h)))||l(p),t(i,(()=>i(h)))||u(p,h),t(s,(()=>s(h)))||st(p),t(r,(()=>r(h)))||c(p,h),t(o,(()=>o(h)))||rt(p),e(h,p),p})(yn,Vt,(e=>{const t=e.createBufferSource();t.start();try{t.start()}catch{return!0}return!1}),(e=>{const t=e.createBufferSource(),n=e.createBuffer(1,1,44100);t.buffer=n;try{t.start(0,1)}catch{return!1}return!0}),(e=>{const t=e.createBufferSource();t.start();try{t.stop()}catch{return!1}return!0}),It,Nt,Rt,(e=>{e.start=(t=>(n=0,a=0,i)=>{const s=e.buffer,r=null===s?a:Math.min(s.duration,a);null!==s&&r>s.duration-.5/e.context.sampleRate?t.call(e,n,0,0):t.call(e,n,r,i)})(e.start)}),(e=>(t,n)=>{const a=n.createBuffer(1,1,44100);null===t.buffer&&(t.buffer=a),e(t,"buffer",(e=>()=>{const n=e.call(t);return n===a?null:n}),(e=>n=>e.call(t,null===n?a:n)))})(_t),Ot),wn=((e,t)=>(n,a,i)=>(e(a).replay(i),t(a,n,i)))((e=>t=>{const n=e(t);if(null===n.renderer)throw new Error("Missing the renderer of the given AudioParam in the audio graph.");return n.renderer})(re),bn),An=((e,t,n,a,i)=>()=>{const s=new WeakMap;let r=null,o=null;return{set start(e){r=e},set stop(e){o=e},render(l,u){const c=s.get(u);return void 0!==c?Promise.resolve(c):(async(l,u)=>{let c=n(l);const h=X(c,u);if(!h){const e={buffer:c.buffer,channelCount:c.channelCount,channelCountMode:c.channelCountMode,channelInterpretation:c.channelInterpretation,loop:c.loop,loopEnd:c.loopEnd,loopStart:c.loopStart,playbackRate:c.playbackRate.value};c=t(u,e),null!==r&&c.start(...r),null!==o&&c.stop(o)}return s.set(u,c),h?await e(u,l.playbackRate,c.playbackRate):await a(u,l.playbackRate,c.playbackRate),await i(l,u,c),c})(l,u)}}})(vn,kn,we,wn,Kt),xn=((e,t,n,a,i,s,r,o,l,u,c,h,d)=>(p,m,f,g=null,y=null)=>{const b=f.value,v=new S(b),k=m?a(v):null,w={get defaultValue(){return b},get maxValue(){return null===g?f.maxValue:g},get minValue(){return null===y?f.minValue:y},get value(){return f.value},set value(e){f.value=e,w.setValueAtTime(e,p.context.currentTime)},cancelAndHoldAtTime(e){if("function"==typeof f.cancelAndHoldAtTime)null===k&&v.flush(p.context.currentTime),v.add(i(e)),f.cancelAndHoldAtTime(e);else{const t=Array.from(v).pop();null===k&&v.flush(p.context.currentTime),v.add(i(e));const n=Array.from(v).pop();f.cancelScheduledValues(e),t!==n&&void 0!==n&&("exponentialRampToValue"===n.type?f.exponentialRampToValueAtTime(n.value,n.endTime):"linearRampToValue"===n.type?f.linearRampToValueAtTime(n.value,n.endTime):"setValue"===n.type?f.setValueAtTime(n.value,n.startTime):"setValueCurve"===n.type&&f.setValueCurveAtTime(n.values,n.startTime,n.duration))}return w},cancelScheduledValues:e=>(null===k&&v.flush(p.context.currentTime),v.add(s(e)),f.cancelScheduledValues(e),w),exponentialRampToValueAtTime(e,t){if(0===e)throw new RangeError;if(!Number.isFinite(t)||t<0)throw new RangeError;const n=p.context.currentTime;return null===k&&v.flush(n),0===Array.from(v).length&&(v.add(u(b,n)),f.setValueAtTime(b,n)),v.add(r(e,t)),f.exponentialRampToValueAtTime(e,t),w},linearRampToValueAtTime(e,t){const n=p.context.currentTime;return null===k&&v.flush(n),0===Array.from(v).length&&(v.add(u(b,n)),f.setValueAtTime(b,n)),v.add(o(e,t)),f.linearRampToValueAtTime(e,t),w},setTargetAtTime:(e,t,n)=>(null===k&&v.flush(p.context.currentTime),v.add(l(e,t,n)),f.setTargetAtTime(e,t,n),w),setValueAtTime:(e,t)=>(null===k&&v.flush(p.context.currentTime),v.add(u(e,t)),f.setValueAtTime(e,t),w),setValueCurveAtTime(e,t,n){const a=e instanceof Float32Array?e:new Float32Array(e);if(null!==h&&"webkitAudioContext"===h.name){const e=t+n,i=p.context.sampleRate,s=Math.ceil(t*i),r=Math.floor(e*i),o=r-s,l=new Float32Array(o);for(let e=0;e{Cn.set(e,{activeInputs:new Set,passiveInputs:new WeakMap,renderer:t})}),Jt,N,(e=>({replay(t){for(const n of e)if("exponentialRampToValue"===n.type){const{endTime:e,value:a}=n;t.exponentialRampToValueAtTime(a,e)}else if("linearRampToValue"===n.type){const{endTime:e,value:a}=n;t.linearRampToValueAtTime(a,e)}else if("setTarget"===n.type){const{startTime:e,target:a,timeConstant:i}=n;t.setTargetAtTime(a,e,i)}else if("setValue"===n.type){const{startTime:e,value:a}=n;t.setValueAtTime(a,e)}else{if("setValueCurve"!==n.type)throw new Error("Can't apply an unknown automation.");{const{duration:e,startTime:a,values:i}=n;t.setValueCurveAtTime(i,a,e)}}}})),(e=>({cancelTime:e,type:"cancelAndHold"})),(e=>({cancelTime:e,type:"cancelScheduledValues"})),((e,t)=>({endTime:t,type:"exponentialRampToValue",value:e})),((e,t)=>({endTime:t,type:"linearRampToValue",value:e})),((e,t,n)=>({startTime:t,target:e,timeConstant:n,type:"setTarget"})),l,u,tn,Tt);var Cn;const Sn=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,a){const o=s(e),l={...ie,...a},u=i(o,l),c=r(o),h=c?t():null;super(e,!1,u,h),this._audioBufferSourceNodeRenderer=h,this._isBufferNullified=!1,this._isBufferSet=null!==l.buffer,this._nativeAudioBufferSourceNode=u,this._onended=null,this._playbackRate=n(this,c,u.playbackRate,ne,te)}get buffer(){return this._isBufferNullified?null:this._nativeAudioBufferSourceNode.buffer}set buffer(e){if(this._nativeAudioBufferSourceNode.buffer=e,null!==e){if(this._isBufferSet)throw a();this._isBufferSet=!0}}get loop(){return this._nativeAudioBufferSourceNode.loop}set loop(e){this._nativeAudioBufferSourceNode.loop=e}get loopEnd(){return this._nativeAudioBufferSourceNode.loopEnd}set loopEnd(e){this._nativeAudioBufferSourceNode.loopEnd=e}get loopStart(){return this._nativeAudioBufferSourceNode.loopStart}set loopStart(e){this._nativeAudioBufferSourceNode.loopStart=e}get onended(){return this._onended}set onended(e){const t="function"==typeof e?o(this,e):null;this._nativeAudioBufferSourceNode.onended=t;const n=this._nativeAudioBufferSourceNode.onended;this._onended=null!==n&&n===t?e:n}get playbackRate(){return this._playbackRate}start(e=0,t=0,n){if(this._nativeAudioBufferSourceNode.start(e,t,n),null!==this._audioBufferSourceNodeRenderer&&(this._audioBufferSourceNodeRenderer.start=void 0===n?[e,t]:[e,t,n]),"closed"!==this.context.state){q(this);const e=()=>{this._nativeAudioBufferSourceNode.removeEventListener("ended",e),ae(this)&&K(this)};this._nativeAudioBufferSourceNode.addEventListener("ended",e)}}stop(e=0){this._nativeAudioBufferSourceNode.stop(e),null!==this._audioBufferSourceNodeRenderer&&(this._audioBufferSourceNodeRenderer.stop=e)}})(on,An,xn,$e,kn,Zt,Qt,Mt),En=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,n){const a=s(e),l=r(a),u=i(a,n,l);super(e,!1,u,l?t(o):null),this._isNodeOfNativeOfflineAudioContext=l,this._nativeAudioDestinationNode=u}get channelCount(){return this._nativeAudioDestinationNode.channelCount}set channelCount(e){if(this._isNodeOfNativeOfflineAudioContext)throw a();if(e>this._nativeAudioDestinationNode.maxChannelCount)throw n();this._nativeAudioDestinationNode.channelCount=e}get channelCountMode(){return this._nativeAudioDestinationNode.channelCountMode}set channelCountMode(e){if(this._isNodeOfNativeOfflineAudioContext)throw a();this._nativeAudioDestinationNode.channelCountMode=e}get maxChannelCount(){return this._nativeAudioDestinationNode.maxChannelCount}})(on,(e=>{const t=new WeakMap;return{render(n,a){const i=t.get(a);return void 0!==i?Promise.resolve(i):(async(n,a)=>{const i=a.destination;return t.set(a,i),await e(n,a,i),i})(n,a)}}}),Q,$e,((e,t)=>(n,a,i)=>{const s=n.destination;if(s.channelCount!==a)try{s.channelCount=a}catch{}i&&"explicit"!==s.channelCountMode&&(s.channelCountMode="explicit"),0===s.maxChannelCount&&Object.defineProperty(s,"maxChannelCount",{value:a});const r=e(n,{channelCount:a,channelCountMode:s.channelCountMode,channelInterpretation:s.channelInterpretation,gain:1});return t(r,"channelCount",(e=>()=>e.call(r)),(e=>t=>{e.call(r,t);try{s.channelCount=t}catch(e){if(t>s.maxChannelCount)throw e}})),t(r,"channelCountMode",(e=>()=>e.call(r)),(e=>t=>{e.call(r,t),s.channelCountMode=t})),t(r,"channelInterpretation",(e=>()=>e.call(r)),(e=>t=>{e.call(r,t),s.channelInterpretation=t})),Object.defineProperty(r,"maxChannelCount",{get:()=>s.maxChannelCount}),r.connect(s),r})(pt,_t),Zt,Qt,Kt),_n=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={Q:l.Q.value,channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,detune:l.detune.value,frequency:l.frequency.value,gain:l.gain.value,type:l.type};l=t(o,e)}return s.set(o,l),u?(await e(o,r.Q,l.Q),await e(o,r.detune,l.detune),await e(o,r.frequency,l.frequency),await e(o,r.gain,l.gain)):(await a(o,r.Q,l.Q),await a(o,r.detune,l.detune),await a(o,r.frequency,l.frequency),await a(o,r.gain,l.gain)),await i(r,o,l),l})(r,o)}}})(vn,ut,we,wn,Kt),Tn=(e=>(t,n)=>e.set(t,n))(Pt),In=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,a){const l=s(e),u={...Le,...a},c=i(l,u),h=r(l);super(e,!1,c,h?n():null),this._Q=t(this,h,c.Q,ne,te),this._detune=t(this,h,c.detune,1200*Math.log2(ne),-1200*Math.log2(ne)),this._frequency=t(this,h,c.frequency,e.sampleRate/2,0),this._gain=t(this,h,c.gain,40*Math.log10(ne),te),this._nativeBiquadFilterNode=c,o(this,1)}get detune(){return this._detune}get frequency(){return this._frequency}get gain(){return this._gain}get Q(){return this._Q}get type(){return this._nativeBiquadFilterNode.type}set type(e){this._nativeBiquadFilterNode.type=e}getFrequencyResponse(e,t,n){try{this._nativeBiquadFilterNode.getFrequencyResponse(e,t,n)}catch(e){if(11===e.code)throw a();throw e}if(e.length!==t.length||t.length!==n.length)throw a()}})(on,xn,_n,Ze,ut,Zt,Qt,Tn),Nn=((e,t)=>(n,a,i)=>{const s=new Set;return n.connect=(i=>(r,o=0,l=0)=>{const u=0===s.size;if(t(r))return i.call(n,r,o,l),e(s,[r,o,l],(e=>e[0]===r&&e[1]===o&&e[2]===l),!0),u&&a(),r;i.call(n,r,o),e(s,[r,o],(e=>e[0]===r&&e[1]===o),!0),u&&a()})(n.connect),n.disconnect=(e=>(a,r,o)=>{const l=s.size>0;if(void 0===a)e.apply(n),s.clear();else if("number"==typeof a){e.call(n,a);for(const e of s)e[1]===a&&s.delete(e)}else{t(a)?e.call(n,a,r,o):e.call(n,a,r);for(const e of s)e[0]!==a||void 0!==r&&e[1]!==r||void 0!==o&&e[2]!==o||s.delete(e)}const u=0===s.size;l&&u&&i()})(n.disconnect),n})(de,an),Rn=((e,t)=>(n,a)=>{a.channelCount=1,a.channelCountMode="explicit",Object.defineProperty(a,"channelCount",{get:()=>1,set:()=>{throw e()}}),Object.defineProperty(a,"channelCountMode",{get:()=>"explicit",set:()=>{throw e()}});const i=n.createBufferSource();t(a,(()=>{const e=a.numberOfInputs;for(let t=0;ti.disconnect(a)))})($e,Nn),Dn=((e,t)=>(n,a)=>{const i=n.createChannelMerger(a.numberOfInputs);return null!==e&&"webkitAudioContext"===e.name&&t(n,i),nt(i,a),i})(tn,Rn),zn=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,numberOfInputs:r.numberOfInputs};r=e(s,t)}return a.set(s,r),await n(i,s,r),r})(i,s)}}})(Dn,we,Kt),On=((e,t,n,a,i)=>class extends e{constructor(e,s){const r=a(e),o={...Pe,...s};super(e,!1,n(r,o),i(r)?t():null)}})(on,zn,Dn,Zt,Qt),Mn=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,numberOfOutputs:r.numberOfOutputs};r=e(s,t)}return a.set(s,r),await n(i,s,r),r})(i,s)}}})(ct,we,Kt),Bn=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=a(e),l=s({...je,...r});super(e,!1,n(o,l),i(o)?t():null)}})(on,Mn,ct,Zt,Qt,(e=>({...e,channelCount:e.numberOfOutputs}))),Fn=((e,t,n,a)=>(i,{offset:s,...r})=>{const o=i.createBuffer(1,2,44100),l=t(i,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}),u=n(i,{...r,gain:s}),c=o.getChannelData(0);c[0]=1,c[1]=1,l.buffer=o,l.loop=!0;const h={get bufferSize(){},get channelCount(){return u.channelCount},set channelCount(e){u.channelCount=e},get channelCountMode(){return u.channelCountMode},set channelCountMode(e){u.channelCountMode=e},get channelInterpretation(){return u.channelInterpretation},set channelInterpretation(e){u.channelInterpretation=e},get context(){return u.context},get inputs(){return[]},get numberOfInputs(){return l.numberOfInputs},get numberOfOutputs(){return u.numberOfOutputs},get offset(){return u.gain},get onended(){return l.onended},set onended(e){l.onended=e},addEventListener:(...e)=>l.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>l.dispatchEvent(e[0]),removeEventListener:(...e)=>l.removeEventListener(e[0],e[1],e[2]),start(e=0){l.start.call(l,e)},stop(e=0){l.stop.call(l,e)}};return e(i,l),a(ht(h,u),(()=>l.connect(u)),(()=>l.disconnect(u)))})(yn,kn,pt,Nn),Ln=((e,t,n,a,i)=>(s,r)=>{if(void 0===s.createConstantSource)return n(s,r);const o=s.createConstantSource();return nt(o,r),it(o,r,"offset"),t(a,(()=>a(s)))||st(o),t(i,(()=>i(s)))||rt(o),e(s,o),o})(yn,Vt,Fn,It,Rt),Pn=((e,t,n,a,i)=>()=>{const s=new WeakMap;let r=null,o=null;return{set start(e){r=e},set stop(e){o=e},render(l,u){const c=s.get(u);return void 0!==c?Promise.resolve(c):(async(l,u)=>{let c=n(l);const h=X(c,u);if(!h){const e={channelCount:c.channelCount,channelCountMode:c.channelCountMode,channelInterpretation:c.channelInterpretation,offset:c.offset.value};c=t(u,e),null!==r&&c.start(r),null!==o&&c.stop(o)}return s.set(u,c),h?await e(u,l.offset,c.offset):await a(u,l.offset,c.offset),await i(l,u,c),c})(l,u)}}})(vn,Ln,we,wn,Kt),jn=((e,t,n,a,i,s,r)=>class extends e{constructor(e,r){const o=i(e),l={...Ve,...r},u=a(o,l),c=s(o),h=c?n():null;super(e,!1,u,h),this._constantSourceNodeRenderer=h,this._nativeConstantSourceNode=u,this._offset=t(this,c,u.offset,ne,te),this._onended=null}get offset(){return this._offset}get onended(){return this._onended}set onended(e){const t="function"==typeof e?r(this,e):null;this._nativeConstantSourceNode.onended=t;const n=this._nativeConstantSourceNode.onended;this._onended=null!==n&&n===t?e:n}start(e=0){if(this._nativeConstantSourceNode.start(e),null!==this._constantSourceNodeRenderer&&(this._constantSourceNodeRenderer.start=e),"closed"!==this.context.state){q(this);const e=()=>{this._nativeConstantSourceNode.removeEventListener("ended",e),ae(this)&&K(this)};this._nativeConstantSourceNode.addEventListener("ended",e)}}stop(e=0){this._nativeConstantSourceNode.stop(e),null!==this._constantSourceNodeRenderer&&(this._constantSourceNodeRenderer.stop=e)}})(on,xn,Pn,Ln,Zt,Qt,Mt),Vn=((e,t)=>(n,a)=>{const i=n.createConvolver();if(nt(i,a),a.disableNormalization===i.normalize&&(i.normalize=!a.disableNormalization),tt(i,a,"buffer"),a.channelCount>2)throw e();if(t(i,"channelCount",(e=>()=>e.call(i)),(t=>n=>{if(n>2)throw e();return t.call(i,n)})),"max"===a.channelCountMode)throw e();return t(i,"channelCountMode",(e=>()=>e.call(i)),(t=>n=>{if("max"===n)throw e();return t.call(i,n)})),i})(yt,_t),Un=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={buffer:r.buffer,channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,disableNormalization:!r.normalize};r=e(s,t)}return a.set(s,r),fe(r)?await n(i,s,r.inputs[0]):await n(i,s,r),r})(i,s)}}})(Vn,we,Kt),Wn=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=a(e),l={...Ue,...r},u=n(o,l);super(e,!1,u,i(o)?t():null),this._isBufferNullified=!1,this._nativeConvolverNode=u,null!==l.buffer&&s(this,l.buffer.duration)}get buffer(){return this._isBufferNullified?null:this._nativeConvolverNode.buffer}set buffer(e){if(this._nativeConvolverNode.buffer=e,null===e&&null!==this._nativeConvolverNode.buffer){const e=this._nativeConvolverNode.context;this._nativeConvolverNode.buffer=e.createBuffer(1,1,e.sampleRate),this._isBufferNullified=!0,s(this,0)}else this._isBufferNullified=!1,s(this,null===this._nativeConvolverNode.buffer?0:this._nativeConvolverNode.buffer.duration)}get normalize(){return this._nativeConvolverNode.normalize}set normalize(e){this._nativeConvolverNode.normalize=e}})(on,Un,Vn,Zt,Qt,Tn),Gn=((e,t,n,a,i)=>s=>{const r=new WeakMap;return{render(o,l){const u=r.get(l);return void 0!==u?Promise.resolve(u):(async(o,l)=>{let u=n(o);const c=X(u,l);if(!c){const e={channelCount:u.channelCount,channelCountMode:u.channelCountMode,channelInterpretation:u.channelInterpretation,delayTime:u.delayTime.value,maxDelayTime:s};u=t(l,e)}return r.set(l,u),c?await e(l,o.delayTime,u.delayTime):await a(l,o.delayTime,u.delayTime),await i(o,l,u),u})(o,l)}}})(vn,dt,we,wn,Kt),qn=((e,t,n,a,i,s,r)=>class extends e{constructor(e,o){const l=i(e),u={...Ge,...o},c=a(l,u),h=s(l);super(e,!1,c,h?n(u.maxDelayTime):null),this._delayTime=t(this,h,c.delayTime),r(this,u.maxDelayTime)}get delayTime(){return this._delayTime}})(on,xn,Gn,dt,Zt,Qt,Tn),Hn=(e=>(t,n)=>{const a=t.createDynamicsCompressor();if(nt(a,n),n.channelCount>2)throw e();if("max"===n.channelCountMode)throw e();return it(a,n,"attack"),it(a,n,"knee"),it(a,n,"ratio"),it(a,n,"release"),it(a,n,"threshold"),a})(yt),Kn=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={attack:l.attack.value,channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,knee:l.knee.value,ratio:l.ratio.value,release:l.release.value,threshold:l.threshold.value};l=t(o,e)}return s.set(o,l),u?(await e(o,r.attack,l.attack),await e(o,r.knee,l.knee),await e(o,r.ratio,l.ratio),await e(o,r.release,l.release),await e(o,r.threshold,l.threshold)):(await a(o,r.attack,l.attack),await a(o,r.knee,l.knee),await a(o,r.ratio,l.ratio),await a(o,r.release,l.release),await a(o,r.threshold,l.threshold)),await i(r,o,l),l})(r,o)}}})(vn,Hn,we,wn,Kt),$n=((e,t,n,a,i,s,r,o)=>class extends e{constructor(e,i){const l=s(e),u={...He,...i},c=a(l,u),h=r(l);super(e,!1,c,h?n():null),this._attack=t(this,h,c.attack),this._knee=t(this,h,c.knee),this._nativeDynamicsCompressorNode=c,this._ratio=t(this,h,c.ratio),this._release=t(this,h,c.release),this._threshold=t(this,h,c.threshold),o(this,.006)}get attack(){return this._attack}get channelCount(){return this._nativeDynamicsCompressorNode.channelCount}set channelCount(e){const t=this._nativeDynamicsCompressorNode.channelCount;if(this._nativeDynamicsCompressorNode.channelCount=e,e>2)throw this._nativeDynamicsCompressorNode.channelCount=t,i()}get channelCountMode(){return this._nativeDynamicsCompressorNode.channelCountMode}set channelCountMode(e){const t=this._nativeDynamicsCompressorNode.channelCountMode;if(this._nativeDynamicsCompressorNode.channelCountMode=e,"max"===e)throw this._nativeDynamicsCompressorNode.channelCountMode=t,i()}get knee(){return this._knee}get ratio(){return this._ratio}get reduction(){return"number"==typeof this._nativeDynamicsCompressorNode.reduction.value?this._nativeDynamicsCompressorNode.reduction.value:this._nativeDynamicsCompressorNode.reduction}get release(){return this._release}get threshold(){return this._threshold}})(on,xn,Kn,Hn,yt,Zt,Qt,Tn),Zn=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,gain:l.gain.value};l=t(o,e)}return s.set(o,l),u?await e(o,r.gain,l.gain):await a(o,r.gain,l.gain),await i(r,o,l),l})(r,o)}}})(vn,pt,we,wn,Kt),Xn=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=i(e),l={...Ke,...r},u=a(o,l),c=s(o);super(e,!1,u,c?n():null),this._gain=t(this,c,u.gain,ne,te)}get gain(){return this._gain}})(on,xn,Zn,pt,Zt,Qt),Yn=((e,t,n,a)=>(i,s,{channelCount:r,channelCountMode:o,channelInterpretation:l,feedback:u,feedforward:c})=>{const h=ot(s,i.sampleRate),d=u instanceof Float64Array?u:new Float64Array(u),p=c instanceof Float64Array?c:new Float64Array(c),m=d.length,f=p.length,g=Math.min(m,f);if(0===m||m>20)throw a();if(0===d[0])throw t();if(0===f||f>20)throw a();if(0===p[0])throw t();if(1!==d[0]){for(let e=0;e{const t=e.inputBuffer,n=e.outputBuffer,a=t.numberOfChannels;for(let e=0;ey.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>y.dispatchEvent(e[0]),getFrequencyResponse(t,n,a){if(t.length!==n.length||n.length!==a.length)throw e();const i=t.length;for(let e=0;ey.removeEventListener(e[0],e[1],e[2])},y)})(Ze,$e,gt,yt),Qn=((e,t,n,a)=>i=>e(Je,(()=>Je(i)))?Promise.resolve(e(a,a)).then((e=>{if(!e){const e=n(i,512,0,1);i.oncomplete=()=>{e.onaudioprocess=null,e.disconnect()},e.onaudioprocess=()=>i.currentTime,e.connect(i.destination)}return i.startRendering()})):new Promise((e=>{const n=t(i,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});i.oncomplete=t=>{n.disconnect(),e(t.renderedBuffer)},n.connect(i.destination),i.startRendering()})))(Vt,pt,gt,((e,t)=>()=>{if(null===t)return Promise.resolve(!1);const n=new t(1,1,44100),a=e(n,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});return new Promise((e=>{n.oncomplete=()=>{a.disconnect(),e(0!==n.currentTime)},n.startRendering()}))})(pt,Yt)),Jn=((e,t,n,a,i)=>(s,r)=>{const o=new WeakMap;let l=null;const u=async(u,c)=>{let h=null,d=t(u);const p=X(d,c);if(void 0===c.createIIRFilter?h=e(c,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}):p||(d=c.createIIRFilter(r,s)),o.set(c,null===h?d:h),null!==h){if(null===l){if(null===n)throw new Error("Missing the native OfflineAudioContext constructor.");const e=new n(u.context.destination.channelCount,u.context.length,c.sampleRate);l=(async()=>{await a(u,e,e.destination);return((e,t,n,a)=>{const i=n instanceof Float64Array?n:new Float64Array(n),s=a instanceof Float64Array?a:new Float64Array(a),r=i.length,o=s.length,l=Math.min(r,o);if(1!==i[0]){for(let e=0;e(t,n,a)=>{if(void 0===t.createIIRFilter)return e(t,n,a);const i=t.createIIRFilter(a.feedforward,a.feedback);return nt(i,a),i})(Yn),ta=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=a(e),l=i(o),u={...Xe,...r},c=t(o,l?null:e.baseLatency,u);super(e,!1,c,l?n(u.feedback,u.feedforward):null),(e=>{var t;e.getFrequencyResponse=(t=e.getFrequencyResponse,(n,a,i)=>{if(n.length!==a.length||a.length!==i.length)throw Ze();return t.call(e,n,a,i)})})(c),this._nativeIIRFilterNode=c,s(this,1)}getFrequencyResponse(e,t,n){return this._nativeIIRFilterNode.getFrequencyResponse(e,t,n)}})(on,ea,Jn,Zt,Qt,Tn),na=((e,t,n,a,i,s,r,o)=>(l,u)=>{const c=u.listener,{forwardX:h,forwardY:d,forwardZ:p,positionX:m,positionY:f,positionZ:g,upX:y,upY:b,upZ:v}=void 0===c.forwardX?(()=>{const h=new Float32Array(1),d=t(u,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:9}),p=r(u);let m=!1,f=[0,0,-1,0,1,0],g=[0,0,0];const y=()=>{if(m)return;m=!0;const e=a(u,256,9,0);e.onaudioprocess=({inputBuffer:e})=>{const t=[s(e,h,0),s(e,h,1),s(e,h,2),s(e,h,3),s(e,h,4),s(e,h,5)];t.some(((e,t)=>e!==f[t]))&&(c.setOrientation(...t),f=t);const n=[s(e,h,6),s(e,h,7),s(e,h,8)];n.some(((e,t)=>e!==g[t]))&&(c.setPosition(...n),g=n)},d.connect(e)},b=e=>t=>{t!==f[e]&&(f[e]=t,c.setOrientation(...f))},v=e=>t=>{t!==g[e]&&(g[e]=t,c.setPosition(...g))},k=(t,a,s)=>{const r=n(u,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",offset:a});r.connect(d,0,t),r.start(),Object.defineProperty(r.offset,"defaultValue",{get:()=>a});const c=e({context:l},p,r.offset,ne,te);var h,m,f,g,b,v,k;return o(c,"value",(e=>()=>e.call(c)),(e=>t=>{try{e.call(c,t)}catch(e){if(9!==e.code)throw e}y(),p&&s(t)})),c.cancelAndHoldAtTime=(h=c.cancelAndHoldAtTime,p?()=>{throw i()}:(...e)=>{const t=h.apply(c,e);return y(),t}),c.cancelScheduledValues=(m=c.cancelScheduledValues,p?()=>{throw i()}:(...e)=>{const t=m.apply(c,e);return y(),t}),c.exponentialRampToValueAtTime=(f=c.exponentialRampToValueAtTime,p?()=>{throw i()}:(...e)=>{const t=f.apply(c,e);return y(),t}),c.linearRampToValueAtTime=(g=c.linearRampToValueAtTime,p?()=>{throw i()}:(...e)=>{const t=g.apply(c,e);return y(),t}),c.setTargetAtTime=(b=c.setTargetAtTime,p?()=>{throw i()}:(...e)=>{const t=b.apply(c,e);return y(),t}),c.setValueAtTime=(v=c.setValueAtTime,p?()=>{throw i()}:(...e)=>{const t=v.apply(c,e);return y(),t}),c.setValueCurveAtTime=(k=c.setValueCurveAtTime,p?()=>{throw i()}:(...e)=>{const t=k.apply(c,e);return y(),t}),c};return{forwardX:k(0,0,b(0)),forwardY:k(1,0,b(1)),forwardZ:k(2,-1,b(2)),positionX:k(6,0,v(0)),positionY:k(7,0,v(1)),positionZ:k(8,0,v(2)),upX:k(3,0,b(3)),upY:k(4,1,b(4)),upZ:k(5,0,b(5))}})():c;return{get forwardX(){return h},get forwardY(){return d},get forwardZ(){return p},get positionX(){return m},get positionY(){return f},get positionZ(){return g},get upX(){return y},get upY(){return b},get upZ(){return v}}})(xn,Dn,Ln,gt,yt,St,Qt,_t),aa=new WeakMap,ia=((e,t,n,a,i,s)=>class extends n{constructor(n,s){super(n),this._nativeContext=n,R.set(this,n),a(n)&&i.set(n,new Set),this._destination=new e(this,s),this._listener=t(this,n),this._onstatechange=null}get currentTime(){return this._nativeContext.currentTime}get destination(){return this._destination}get listener(){return this._listener}get onstatechange(){return this._onstatechange}set onstatechange(e){const t="function"==typeof e?s(this,e):null;this._nativeContext.onstatechange=t;const n=this._nativeContext.onstatechange;this._onstatechange=null!==n&&n===t?e:n}get sampleRate(){return this._nativeContext.sampleRate}get state(){return this._nativeContext.state}})(En,na,en,Qt,aa,Mt),sa=((e,t,n,a,i,s)=>(r,o)=>{const l=r.createOscillator();return nt(l,o),it(l,o,"detune"),it(l,o,"frequency"),void 0!==o.periodicWave?l.setPeriodicWave(o.periodicWave):tt(l,o,"type"),t(n,(()=>n(r)))||st(l),t(a,(()=>a(r)))||s(l,r),t(i,(()=>i(r)))||rt(l),e(r,l),l})(yn,Vt,It,Nt,Rt,Ot),ra=((e,t,n,a,i)=>()=>{const s=new WeakMap;let r=null,o=null,l=null;return{set periodicWave(e){r=e},set start(e){o=e},set stop(e){l=e},render(u,c){const h=s.get(c);return void 0!==h?Promise.resolve(h):(async(u,c)=>{let h=n(u);const d=X(h,c);if(!d){const e={channelCount:h.channelCount,channelCountMode:h.channelCountMode,channelInterpretation:h.channelInterpretation,detune:h.detune.value,frequency:h.frequency.value,periodicWave:null===r?void 0:r,type:h.type};h=t(c,e),null!==o&&h.start(o),null!==l&&h.stop(l)}return s.set(c,h),d?(await e(c,u.detune,h.detune),await e(c,u.frequency,h.frequency)):(await a(c,u.detune,h.detune),await a(c,u.frequency,h.frequency)),await i(u,c,h),h})(u,c)}}})(vn,sa,we,wn,Kt),oa=((e,t,n,a,i,s,r)=>class extends e{constructor(e,r){const o=i(e),l={...vt,...r},u=n(o,l),c=s(o),h=c?a():null,d=e.sampleRate/2;super(e,!1,u,h),this._detune=t(this,c,u.detune,153600,-153600),this._frequency=t(this,c,u.frequency,d,-d),this._nativeOscillatorNode=u,this._onended=null,this._oscillatorNodeRenderer=h,null!==this._oscillatorNodeRenderer&&void 0!==l.periodicWave&&(this._oscillatorNodeRenderer.periodicWave=l.periodicWave)}get detune(){return this._detune}get frequency(){return this._frequency}get onended(){return this._onended}set onended(e){const t="function"==typeof e?r(this,e):null;this._nativeOscillatorNode.onended=t;const n=this._nativeOscillatorNode.onended;this._onended=null!==n&&n===t?e:n}get type(){return this._nativeOscillatorNode.type}set type(e){this._nativeOscillatorNode.type=e,null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.periodicWave=null)}setPeriodicWave(e){this._nativeOscillatorNode.setPeriodicWave(e),null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.periodicWave=e)}start(e=0){if(this._nativeOscillatorNode.start(e),null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.start=e),"closed"!==this.context.state){q(this);const e=()=>{this._nativeOscillatorNode.removeEventListener("ended",e),ae(this)&&K(this)};this._nativeOscillatorNode.addEventListener("ended",e)}}stop(e=0){this._nativeOscillatorNode.stop(e),null!==this._oscillatorNodeRenderer&&(this._oscillatorNodeRenderer.stop=e)}})(on,xn,sa,ra,Zt,Qt,Mt),la=(e=>(t,n)=>{const a=e(t,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}),i=t.createBuffer(1,2,44100);return a.buffer=i,a.loop=!0,a.connect(n),a.start(),()=>{a.stop(),a.disconnect(n)}})(kn),ua=((e,t,n,a,i)=>(s,{curve:r,oversample:o,...l})=>{const u=s.createWaveShaper(),c=s.createWaveShaper();nt(u,l),nt(c,l);const h=n(s,{...l,gain:1}),d=n(s,{...l,gain:-1}),p=n(s,{...l,gain:1}),m=n(s,{...l,gain:-1});let f=null,g=!1,y=null;const b={get bufferSize(){},get channelCount(){return u.channelCount},set channelCount(e){h.channelCount=e,d.channelCount=e,u.channelCount=e,p.channelCount=e,c.channelCount=e,m.channelCount=e},get channelCountMode(){return u.channelCountMode},set channelCountMode(e){h.channelCountMode=e,d.channelCountMode=e,u.channelCountMode=e,p.channelCountMode=e,c.channelCountMode=e,m.channelCountMode=e},get channelInterpretation(){return u.channelInterpretation},set channelInterpretation(e){h.channelInterpretation=e,d.channelInterpretation=e,u.channelInterpretation=e,p.channelInterpretation=e,c.channelInterpretation=e,m.channelInterpretation=e},get context(){return u.context},get curve(){return y},set curve(n){if(null!==n&&n.length<2)throw t();if(null===n)u.curve=n,c.curve=n;else{const e=n.length,t=new Float32Array(e+2-e%2),a=new Float32Array(e+2-e%2);t[0]=n[0],a[0]=-n[e-1];const i=Math.ceil((e+1)/2),s=(e+1)/2-1;for(let r=1;rh.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>h.dispatchEvent(e[0]),removeEventListener:(...e)=>h.removeEventListener(e[0],e[1],e[2])};null!==r&&(b.curve=r instanceof Float32Array?r:new Float32Array(r)),o!==b.oversample&&(b.oversample=o);return i(ht(b,p),(()=>{h.connect(u).connect(p),h.connect(d).connect(c).connect(m).connect(p),g=!0,a(y)&&(f=e(s,h))}),(()=>{h.disconnect(u),u.disconnect(p),h.disconnect(d),d.disconnect(c),c.disconnect(m),m.disconnect(p),g=!1,null!==f&&(f(),f=null)}))})(la,$e,pt,Et,Nn),ca=((e,t,n,a,i,s,r)=>(o,l)=>{const u=o.createWaveShaper();if(null!==s&&"webkitAudioContext"===s.name&&void 0===o.createGain().gain.automationRate)return n(o,l);nt(u,l);const c=null===l.curve||l.curve instanceof Float32Array?l.curve:new Float32Array(l.curve);if(null!==c&&c.length<2)throw t();tt(u,{curve:c},"curve"),tt(u,l,"oversample");let h=null,d=!1;r(u,"curve",(e=>()=>e.call(u)),(t=>n=>(t.call(u,n),d&&(a(n)&&null===h?h=e(o,u):a(n)||null===h||(h(),h=null)),n)));return i(u,(()=>{d=!0,a(u.curve)&&(h=e(o,u))}),(()=>{d=!1,null!==h&&(h(),h=null)}))})(la,$e,ua,Et,Nn,tn,_t),ha=((e,t,n,a,i,s,r,o,l,u)=>(c,{coneInnerAngle:h,coneOuterAngle:d,coneOuterGain:p,distanceModel:m,maxDistance:f,orientationX:g,orientationY:y,orientationZ:b,panningModel:v,positionX:k,positionY:w,positionZ:A,refDistance:x,rolloffFactor:C,...S})=>{const E=c.createPanner();if(S.channelCount>2)throw r();if("max"===S.channelCountMode)throw r();nt(E,S);const _={channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete"},T=n(c,{..._,channelInterpretation:"speakers",numberOfInputs:6}),I=a(c,{...S,gain:1}),N=a(c,{..._,gain:1}),R=a(c,{..._,gain:0}),D=a(c,{..._,gain:0}),z=a(c,{..._,gain:0}),O=a(c,{..._,gain:0}),M=a(c,{..._,gain:0}),B=i(c,256,6,1),F=s(c,{..._,curve:new Float32Array([1,1]),oversample:"none"});let L=[g,y,b],P=[k,w,A];const j=new Float32Array(1);B.onaudioprocess=({inputBuffer:e})=>{const t=[l(e,j,0),l(e,j,1),l(e,j,2)];t.some(((e,t)=>e!==L[t]))&&(E.setOrientation(...t),L=t);const n=[l(e,j,3),l(e,j,4),l(e,j,5)];n.some(((e,t)=>e!==P[t]))&&(E.setPosition(...n),P=n)},Object.defineProperty(R.gain,"defaultValue",{get:()=>0}),Object.defineProperty(D.gain,"defaultValue",{get:()=>0}),Object.defineProperty(z.gain,"defaultValue",{get:()=>0}),Object.defineProperty(O.gain,"defaultValue",{get:()=>0}),Object.defineProperty(M.gain,"defaultValue",{get:()=>0});const V={get bufferSize(){},get channelCount(){return E.channelCount},set channelCount(e){if(e>2)throw r();I.channelCount=e,E.channelCount=e},get channelCountMode(){return E.channelCountMode},set channelCountMode(e){if("max"===e)throw r();I.channelCountMode=e,E.channelCountMode=e},get channelInterpretation(){return E.channelInterpretation},set channelInterpretation(e){I.channelInterpretation=e,E.channelInterpretation=e},get coneInnerAngle(){return E.coneInnerAngle},set coneInnerAngle(e){E.coneInnerAngle=e},get coneOuterAngle(){return E.coneOuterAngle},set coneOuterAngle(e){E.coneOuterAngle=e},get coneOuterGain(){return E.coneOuterGain},set coneOuterGain(e){if(e<0||e>1)throw t();E.coneOuterGain=e},get context(){return E.context},get distanceModel(){return E.distanceModel},set distanceModel(e){E.distanceModel=e},get inputs(){return[I]},get maxDistance(){return E.maxDistance},set maxDistance(e){if(e<0)throw new RangeError;E.maxDistance=e},get numberOfInputs(){return E.numberOfInputs},get numberOfOutputs(){return E.numberOfOutputs},get orientationX(){return N.gain},get orientationY(){return R.gain},get orientationZ(){return D.gain},get panningModel(){return E.panningModel},set panningModel(e){E.panningModel=e},get positionX(){return z.gain},get positionY(){return O.gain},get positionZ(){return M.gain},get refDistance(){return E.refDistance},set refDistance(e){if(e<0)throw new RangeError;E.refDistance=e},get rolloffFactor(){return E.rolloffFactor},set rolloffFactor(e){if(e<0)throw new RangeError;E.rolloffFactor=e},addEventListener:(...e)=>I.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>I.dispatchEvent(e[0]),removeEventListener:(...e)=>I.removeEventListener(e[0],e[1],e[2])};h!==V.coneInnerAngle&&(V.coneInnerAngle=h),d!==V.coneOuterAngle&&(V.coneOuterAngle=d),p!==V.coneOuterGain&&(V.coneOuterGain=p),m!==V.distanceModel&&(V.distanceModel=m),f!==V.maxDistance&&(V.maxDistance=f),g!==V.orientationX.value&&(V.orientationX.value=g),y!==V.orientationY.value&&(V.orientationY.value=y),b!==V.orientationZ.value&&(V.orientationZ.value=b),v!==V.panningModel&&(V.panningModel=v),k!==V.positionX.value&&(V.positionX.value=k),w!==V.positionY.value&&(V.positionY.value=w),A!==V.positionZ.value&&(V.positionZ.value=A),x!==V.refDistance&&(V.refDistance=x),C!==V.rolloffFactor&&(V.rolloffFactor=C),1===L[0]&&0===L[1]&&0===L[2]||E.setOrientation(...L),0===P[0]&&0===P[1]&&0===P[2]||E.setPosition(...P);return u(ht(V,E),(()=>{I.connect(E),e(I,F,0,0),F.connect(N).connect(T,0,0),F.connect(R).connect(T,0,1),F.connect(D).connect(T,0,2),F.connect(z).connect(T,0,3),F.connect(O).connect(T,0,4),F.connect(M).connect(T,0,5),T.connect(B).connect(c.destination)}),(()=>{I.disconnect(E),o(I,F,0,0),F.disconnect(N),N.disconnect(T),F.disconnect(R),R.disconnect(T),F.disconnect(D),D.disconnect(T),F.disconnect(z),z.disconnect(T),F.disconnect(O),O.disconnect(T),F.disconnect(M),M.disconnect(T),T.disconnect(B),B.disconnect(c.destination)}))})(ge,$e,Dn,pt,gt,ca,yt,ke,St,Nn),da=(e=>(t,n)=>{const a=t.createPanner();return void 0===a.orientationX?e(t,n):(nt(a,n),it(a,n,"orientationX"),it(a,n,"orientationY"),it(a,n,"orientationZ"),it(a,n,"positionX"),it(a,n,"positionY"),it(a,n,"positionZ"),tt(a,n,"coneInnerAngle"),tt(a,n,"coneOuterAngle"),tt(a,n,"coneOuterGain"),tt(a,n,"distanceModel"),tt(a,n,"maxDistance"),tt(a,n,"panningModel"),tt(a,n,"refDistance"),tt(a,n,"rolloffFactor"),a)})(ha),pa=((e,t,n,a,i,s,r,o,l,u)=>()=>{const c=new WeakMap;let h=null;return{render(d,p){const m=c.get(p);return void 0!==m?Promise.resolve(m):(async(d,p)=>{let m=null,f=s(d);const g={channelCount:f.channelCount,channelCountMode:f.channelCountMode,channelInterpretation:f.channelInterpretation},y={...g,coneInnerAngle:f.coneInnerAngle,coneOuterAngle:f.coneOuterAngle,coneOuterGain:f.coneOuterGain,distanceModel:f.distanceModel,maxDistance:f.maxDistance,panningModel:f.panningModel,refDistance:f.refDistance,rolloffFactor:f.rolloffFactor},b=X(f,p);if("bufferSize"in f)m=a(p,{...g,gain:1});else if(!b){const e={...y,orientationX:f.orientationX.value,orientationY:f.orientationY.value,orientationZ:f.orientationZ.value,positionX:f.positionX.value,positionY:f.positionY.value,positionZ:f.positionZ.value};f=i(p,e)}if(c.set(p,null===m?f:m),null!==m){if(null===h){if(null===r)throw new Error("Missing the native OfflineAudioContext constructor.");const e=new r(6,d.context.length,p.sampleRate),a=t(e,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:6});a.connect(e.destination),h=(async()=>{const t=await Promise.all([d.orientationX,d.orientationY,d.orientationZ,d.positionX,d.positionY,d.positionZ].map((async(t,a)=>{const i=n(e,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",offset:0===a?1:0});return await o(e,t,i.offset),i})));for(let e=0;e<6;e+=1)t[e].connect(a,0,e),t[e].start(0);return u(e)})()}const e=await h,s=a(p,{...g,gain:1});await l(d,p,s);const c=[];for(let t=0;te!==f[t]))||n.some(((e,t)=>e!==b[t]))){f=e,b=n;const r=t/p.sampleRate;v.gain.setValueAtTime(0,r),v=a(p,{...g,gain:0}),k=i(p,{...y,orientationX:f[0],orientationY:f[1],orientationZ:f[2],positionX:b[0],positionY:b[1],positionZ:b[2]}),v.gain.setValueAtTime(1,r),s.connect(v).connect(k.inputs[0]),k.connect(m)}}return m}return b?(await e(p,d.orientationX,f.orientationX),await e(p,d.orientationY,f.orientationY),await e(p,d.orientationZ,f.orientationZ),await e(p,d.positionX,f.positionX),await e(p,d.positionY,f.positionY),await e(p,d.positionZ,f.positionZ)):(await o(p,d.orientationX,f.orientationX),await o(p,d.orientationY,f.orientationY),await o(p,d.orientationZ,f.orientationZ),await o(p,d.positionX,f.positionX),await o(p,d.positionY,f.positionY),await o(p,d.positionZ,f.positionZ)),fe(f)?await l(d,p,f.inputs[0]):await l(d,p,f),f})(d,p)}}})(vn,Dn,Ln,pt,da,we,Yt,wn,Kt,Qn),ma=((e,t,n,a,i,s,r)=>class extends e{constructor(e,o){const l=i(e),u={...kt,...o},c=n(l,u),h=s(l);super(e,!1,c,h?a():null),this._nativePannerNode=c,this._orientationX=t(this,h,c.orientationX,ne,te),this._orientationY=t(this,h,c.orientationY,ne,te),this._orientationZ=t(this,h,c.orientationZ,ne,te),this._positionX=t(this,h,c.positionX,ne,te),this._positionY=t(this,h,c.positionY,ne,te),this._positionZ=t(this,h,c.positionZ,ne,te),r(this,1)}get coneInnerAngle(){return this._nativePannerNode.coneInnerAngle}set coneInnerAngle(e){this._nativePannerNode.coneInnerAngle=e}get coneOuterAngle(){return this._nativePannerNode.coneOuterAngle}set coneOuterAngle(e){this._nativePannerNode.coneOuterAngle=e}get coneOuterGain(){return this._nativePannerNode.coneOuterGain}set coneOuterGain(e){this._nativePannerNode.coneOuterGain=e}get distanceModel(){return this._nativePannerNode.distanceModel}set distanceModel(e){this._nativePannerNode.distanceModel=e}get maxDistance(){return this._nativePannerNode.maxDistance}set maxDistance(e){this._nativePannerNode.maxDistance=e}get orientationX(){return this._orientationX}get orientationY(){return this._orientationY}get orientationZ(){return this._orientationZ}get panningModel(){return this._nativePannerNode.panningModel}set panningModel(e){this._nativePannerNode.panningModel=e}get positionX(){return this._positionX}get positionY(){return this._positionY}get positionZ(){return this._positionZ}get refDistance(){return this._nativePannerNode.refDistance}set refDistance(e){this._nativePannerNode.refDistance=e}get rolloffFactor(){return this._nativePannerNode.rolloffFactor}set rolloffFactor(e){this._nativePannerNode.rolloffFactor=e}})(on,xn,da,pa,Zt,Qt,Tn),fa=(e=>(t,{disableNormalization:n,imag:a,real:i})=>{const s=a instanceof Float32Array?a:new Float32Array(a),r=i instanceof Float32Array?i:new Float32Array(i),o=t.createPeriodicWave(r,s,{disableNormalization:n});if(Array.from(a).length<2)throw e();return o})(Q),ga=((e,t,n,a)=>class i{constructor(i,s){const r=t(i),o=a({...wt,...s}),l=e(r,o);return n.add(l),l}static[Symbol.hasInstance](e){return null!==e&&"object"==typeof e&&Object.getPrototypeOf(e)===i.prototype||n.has(e)}})(fa,Zt,new WeakSet,(e=>{const{imag:t,real:n}=e;return void 0===t?void 0===n?{...e,imag:[0,0],real:[0,0]}:{...e,imag:Array.from(n,(()=>0)),real:n}:void 0===n?{...e,imag:t,real:Array.from(t,(()=>0))}:{...e,imag:t,real:n}})),ya=((e,t,n,a,i,s)=>{const r=16385,o=new Float32Array([1,1]),l=Math.PI/2,u={channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete"},c={...u,oversample:"none"},h=(e,s,h,d,p)=>{if(1===s)return((e,t,i,s)=>{const h=new Float32Array(r),d=new Float32Array(r);for(let e=0;e{const d=new Float32Array(r),p=new Float32Array(r),m=new Float32Array(r),f=new Float32Array(r),g=Math.floor(8192.5);for(let e=0;eg){const t=(e-g)/(16384-g)*l;d[e]=Math.cos(t),p[e]=Math.sin(t),m[e]=0,f[e]=1}else{const t=e/(16384-g)*l;d[e]=1,p[e]=0,m[e]=Math.cos(t),f[e]=Math.sin(t)}const y=t(e,{channelCount:2,channelCountMode:"explicit",channelInterpretation:"discrete",numberOfOutputs:2}),b=n(e,{...u,gain:0}),v=a(e,{...c,curve:d}),k=n(e,{...u,gain:0}),w=a(e,{...c,curve:p}),A=a(e,{...c,curve:o}),x=n(e,{...u,gain:0}),C=a(e,{...c,curve:m}),S=n(e,{...u,gain:0}),E=a(e,{...c,curve:f});return{connectGraph(){i.connect(y),i.connect(void 0===A.inputs?A:A.inputs[0]),y.connect(b,0),y.connect(k,0),y.connect(x,1),y.connect(S,1),A.connect(s),s.connect(void 0===v.inputs?v:v.inputs[0]),s.connect(void 0===w.inputs?w:w.inputs[0]),s.connect(void 0===C.inputs?C:C.inputs[0]),s.connect(void 0===E.inputs?E:E.inputs[0]),v.connect(b.gain),w.connect(k.gain),C.connect(x.gain),E.connect(S.gain),b.connect(h,0,0),x.connect(h,0,0),k.connect(h,0,1),S.connect(h,0,1)},disconnectGraph(){i.disconnect(y),i.disconnect(void 0===A.inputs?A:A.inputs[0]),y.disconnect(b,0),y.disconnect(k,0),y.disconnect(x,1),y.disconnect(S,1),A.disconnect(s),s.disconnect(void 0===v.inputs?v:v.inputs[0]),s.disconnect(void 0===w.inputs?w:w.inputs[0]),s.disconnect(void 0===C.inputs?C:C.inputs[0]),s.disconnect(void 0===E.inputs?E:E.inputs[0]),v.disconnect(b.gain),w.disconnect(k.gain),C.disconnect(x.gain),E.disconnect(S.gain),b.disconnect(h,0,0),x.disconnect(h,0,0),k.disconnect(h,0,1),S.disconnect(h,0,1)}}})(e,h,d,p);throw i()};return(t,{channelCount:a,channelCountMode:r,pan:o,...l})=>{if("max"===r)throw i();const u=e(t,{...l,channelCount:1,channelCountMode:r,numberOfInputs:2}),c=n(t,{...l,channelCount:a,channelCountMode:r,gain:1}),d=n(t,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:o});let{connectGraph:p,disconnectGraph:m}=h(t,a,c,d,u);Object.defineProperty(d.gain,"defaultValue",{get:()=>0}),Object.defineProperty(d.gain,"maxValue",{get:()=>1}),Object.defineProperty(d.gain,"minValue",{get:()=>-1});const f={get bufferSize(){},get channelCount(){return c.channelCount},set channelCount(e){c.channelCount!==e&&(g&&m(),({connectGraph:p,disconnectGraph:m}=h(t,e,c,d,u)),g&&p()),c.channelCount=e},get channelCountMode(){return c.channelCountMode},set channelCountMode(e){if("clamped-max"===e||"max"===e)throw i();c.channelCountMode=e},get channelInterpretation(){return c.channelInterpretation},set channelInterpretation(e){c.channelInterpretation=e},get context(){return c.context},get inputs(){return[c]},get numberOfInputs(){return c.numberOfInputs},get numberOfOutputs(){return c.numberOfOutputs},get pan(){return d.gain},addEventListener:(...e)=>c.addEventListener(e[0],e[1],e[2]),dispatchEvent:(...e)=>c.dispatchEvent(e[0]),removeEventListener:(...e)=>c.removeEventListener(e[0],e[1],e[2])};let g=!1;return s(ht(f,u),(()=>{p(),g=!0}),(()=>{m(),g=!1}))}})(Dn,ct,pt,ca,yt,Nn),ba=((e,t)=>(n,a)=>{const i=a.channelCountMode;if("clamped-max"===i)throw t();if(void 0===n.createStereoPanner)return e(n,a);const s=n.createStereoPanner();return nt(s,a),it(s,a,"pan"),Object.defineProperty(s,"channelCountMode",{get:()=>i,set:e=>{if(e!==i)throw t()}}),s})(ya,yt),va=((e,t,n,a,i)=>()=>{const s=new WeakMap;return{render(r,o){const l=s.get(o);return void 0!==l?Promise.resolve(l):(async(r,o)=>{let l=n(r);const u=X(l,o);if(!u){const e={channelCount:l.channelCount,channelCountMode:l.channelCountMode,channelInterpretation:l.channelInterpretation,pan:l.pan.value};l=t(o,e)}return s.set(o,l),u?await e(o,r.pan,l.pan):await a(o,r.pan,l.pan),fe(l)?await i(r,o,l.inputs[0]):await i(r,o,l),l})(r,o)}}})(vn,ba,we,wn,Kt),ka=((e,t,n,a,i,s)=>class extends e{constructor(e,r){const o=i(e),l={...At,...r},u=n(o,l),c=s(o);super(e,!1,u,c?a():null),this._pan=t(this,c,u.pan)}get pan(){return this._pan}})(on,xn,ba,va,Zt,Qt),wa=((e,t,n)=>()=>{const a=new WeakMap;return{render(i,s){const r=a.get(s);return void 0!==r?Promise.resolve(r):(async(i,s)=>{let r=t(i);if(!X(r,s)){const t={channelCount:r.channelCount,channelCountMode:r.channelCountMode,channelInterpretation:r.channelInterpretation,curve:r.curve,oversample:r.oversample};r=e(s,t)}return a.set(s,r),fe(r)?await n(i,s,r.inputs[0]):await n(i,s,r),r})(i,s)}}})(ca,we,Kt),Aa=((e,t,n,a,i,s,r)=>class extends e{constructor(e,t){const o=i(e),l={...Ct,...t},u=n(o,l);super(e,!0,u,s(o)?a():null),this._isCurveNullified=!1,this._nativeWaveShaperNode=u,r(this,1)}get curve(){return this._isCurveNullified?null:this._nativeWaveShaperNode.curve}set curve(e){if(null===e)this._isCurveNullified=!0,this._nativeWaveShaperNode.curve=new Float32Array([0,0]);else{if(e.length<2)throw t();this._isCurveNullified=!1,this._nativeWaveShaperNode.curve=e}}get oversample(){return this._nativeWaveShaperNode.oversample}set oversample(e){this._nativeWaveShaperNode.oversample=e}})(on,$e,ca,wa,Zt,Qt,Tn),xa=(e=>null!==e&&e.isSecureContext)(Gt),Ca=(e=>(t,n,a)=>{Object.defineProperties(e,{currentFrame:{configurable:!0,get:()=>Math.round(t*n)},currentTime:{configurable:!0,get:()=>t}});try{return a()}finally{null!==e&&(delete e.currentFrame,delete e.currentTime)}})(Gt),Sa=new WeakMap,Ea=((e,t)=>n=>{let a=e.get(n);if(void 0!==a)return a;if(null===t)throw new Error("Missing the native OfflineAudioContext constructor.");return a=new t(1,1,44100),e.set(n,a),a})(Sa,Yt),_a=xa?((e,t,n,a,i,s,r,o,l,u,c,h,d)=>{let p=0;return(m,f,g={credentials:"omit"})=>{const y=c.get(m);if(void 0!==y&&y.has(f))return Promise.resolve();const b=u.get(m);if(void 0!==b){const e=b.get(f);if(void 0!==e)return e}const v=s(m),k=void 0===v.audioWorklet?i(f).then((([e,t])=>{const[a,i]=L(e,t);return n(`${a};((a,b)=>{(a[b]=a[b]||[]).push((AudioWorkletProcessor,global,registerProcessor,sampleRate,self,window)=>{${i}\n})})(window,'_AWGS')`)})).then((()=>{const e=d._AWGS.pop();if(void 0===e)throw new SyntaxError;a(v.currentTime,v.sampleRate,(()=>e(class{},void 0,((e,n)=>{if(""===e.trim())throw t();const a=O.get(v);if(void 0!==a){if(a.has(e))throw t();j(n),P(n.parameterDescriptors),a.set(e,n)}else j(n),P(n.parameterDescriptors),O.set(v,new Map([[e,n]]))}),v.sampleRate,void 0,void 0)))})):Promise.all([i(f),Promise.resolve(e(h,h))]).then((([[e,t],n])=>{const a=p+1;p=a;const[i,s]=L(e,t),u=new Blob([`${i};((AudioWorkletProcessor,registerProcessor)=>{${s}\n})(${n?"AudioWorkletProcessor":"class extends AudioWorkletProcessor {__b=new WeakSet();constructor(){super();(p=>p.postMessage=(q=>(m,t)=>q.call(p,m,t?t.filter(u=>!this.__b.has(u)):t))(p.postMessage))(this.port)}}"},(n,p)=>registerProcessor(n,class extends p{${n?"":"__c = (a) => a.forEach(e=>this.__b.add(e.buffer));"}process(i,o,p){${n?"":"i.forEach(this.__c);o.forEach(this.__c);this.__c(Object.values(p));"}return super.process(i.map(j=>j.some(k=>k.length===0)?[]:j),o,p)}}));registerProcessor('__sac${a}',class extends AudioWorkletProcessor{process(){return !1}})`],{type:"application/javascript; charset=utf-8"}),c=URL.createObjectURL(u);return v.audioWorklet.addModule(c,g).then((()=>{if(o(v))return v;const e=r(v);return e.audioWorklet.addModule(c,g).then((()=>e))})).then((e=>{if(null===l)throw new SyntaxError;try{new l(e,`__sac${a}`)}catch{throw new SyntaxError}})).finally((()=>URL.revokeObjectURL(c)))}));return void 0===b?u.set(m,new Map([[f,k]])):b.set(f,k),k.then((()=>{const e=c.get(m);void 0===e?c.set(m,new Set([f])):e.add(f)})).finally((()=>{const e=u.get(m);void 0!==e&&e.delete(f)})),k}})(Vt,yt,(e=>t=>new Promise(((n,a)=>{if(null===e)return void a(new SyntaxError);const i=e.document.head;if(null===i)a(new SyntaxError);else{const s=e.document.createElement("script"),r=new Blob([t],{type:"application/javascript"}),o=URL.createObjectURL(r),l=e.onerror,u=()=>{e.onerror=l,URL.revokeObjectURL(o)};e.onerror=(t,n,i,s,r)=>n===o||n===e.location.href&&1===i&&1===s?(u(),a(r),!1):null!==l?l(t,n,i,s,r):void 0,s.onerror=()=>{u(),a(new SyntaxError)},s.onload=()=>{u(),n()},s.src=o,s.type="module",i.appendChild(s)}})))(Gt),Ca,(e=>async t=>{try{const e=await fetch(t);if(e.ok)return[await e.text(),e.url]}catch{}throw e()})((()=>new DOMException("","AbortError"))),Zt,Ea,Qt,rn,new WeakMap,new WeakMap,((e,t)=>async()=>{if(null===e)return!0;if(null===t)return!1;const n=new Blob(['class A extends AudioWorkletProcessor{process(i){this.port.postMessage(i,[i[0][0].buffer])}}registerProcessor("a",A)'],{type:"application/javascript; charset=utf-8"}),a=new t(1,128,44100),i=URL.createObjectURL(n);let s=!1,r=!1;try{await a.audioWorklet.addModule(i);const t=new e(a,"a",{numberOfOutputs:0}),n=a.createOscillator();t.port.onmessage=()=>s=!0,t.onprocessorerror=()=>r=!0,n.connect(t),n.start(0),await a.startRendering(),await new Promise((e=>setTimeout(e)))}catch{}finally{URL.revokeObjectURL(i)}return s&&!r})(rn,Yt),Gt):void 0,Ta=((e,t)=>n=>e(n)||t(n))(nn,Qt),Ia=((e,t,n,a,i,s,r,o,l,u,c)=>(h,d)=>{const p=r(h)?h:s(h);if(i.has(d)){const e=n();return Promise.reject(e)}try{i.add(d)}catch{}return t(l,(()=>l(p)))?p.decodeAudioData(d).then((n=>(We(d).catch((()=>{})),t(o,(()=>o(n)))||c(n),e.add(n),n))):new Promise(((t,n)=>{const i=async()=>{try{await We(d)}catch{}},s=e=>{n(e),i()};try{p.decodeAudioData(d,(n=>{"function"!=typeof n.copyFromChannel&&(u(n),J(n)),e.add(n),i().then((()=>t(n)))}),(e=>{s(null===e?a():e)}))}catch(e){s(e)}}))})(cn,Vt,(()=>new DOMException("","DataCloneError")),(()=>new DOMException("","EncodingError")),new WeakSet,Zt,Ta,Y,Je,mn,fn),Na=((e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f,g,y,b,v)=>class extends m{constructor(t,n){super(t,n),this._nativeContext=t,this._audioWorklet=void 0===e?void 0:{addModule:(t,n)=>e(this,t,n)}}get audioWorklet(){return this._audioWorklet}createAnalyser(){return new t(this)}createBiquadFilter(){return new i(this)}createBuffer(e,t,a){return new n({length:t,numberOfChannels:e,sampleRate:a})}createBufferSource(){return new a(this)}createChannelMerger(e=6){return new s(this,{numberOfInputs:e})}createChannelSplitter(e=6){return new r(this,{numberOfOutputs:e})}createConstantSource(){return new o(this)}createConvolver(){return new l(this)}createDelay(e=1){return new c(this,{maxDelayTime:e})}createDynamicsCompressor(){return new h(this)}createGain(){return new d(this)}createIIRFilter(e,t){return new p(this,{feedback:t,feedforward:e})}createOscillator(){return new f(this)}createPanner(){return new g(this)}createPeriodicWave(e,t,n={disableNormalization:!1}){return new y(this,{...n,imag:t,real:e})}createStereoPanner(){return new b(this)}createWaveShaper(){return new v(this)}decodeAudioData(e,t,n){return u(this._nativeContext,e).then((e=>("function"==typeof t&&t(e),e)),(e=>{throw"function"==typeof n&&n(e),e}))}})(_a,un,gn,Sn,In,On,Bn,jn,Wn,Ia,qn,$n,Xn,ta,ia,oa,ma,ga,ka,Aa),Ra=((e,t,n,a)=>class extends e{constructor(e,i){const s=n(e),r=t(s,i);if(a(s))throw TypeError();super(e,!0,r,null),this._nativeMediaElementAudioSourceNode=r}get mediaElement(){return this._nativeMediaElementAudioSourceNode.mediaElement}})(on,((e,t)=>e.createMediaElementSource(t.mediaElement)),Zt,Qt),Da=((e,t,n,a)=>class extends e{constructor(e,i){const s=n(e);if(a(s))throw new TypeError;const r={...Qe,...i},o=t(s,r);super(e,!1,o,null),this._nativeMediaStreamAudioDestinationNode=o}get stream(){return this._nativeMediaStreamAudioDestinationNode.stream}})(on,((e,t)=>{const n=e.createMediaStreamDestination();return nt(n,t),1===n.numberOfOutputs&&Object.defineProperty(n,"numberOfOutputs",{get:()=>0}),n}),Zt,Qt),za=((e,t,n,a)=>class extends e{constructor(e,i){const s=n(e),r=t(s,i);if(a(s))throw new TypeError;super(e,!0,r,null),this._nativeMediaStreamAudioSourceNode=r}get mediaStream(){return this._nativeMediaStreamAudioSourceNode.mediaStream}})(on,((e,{mediaStream:t})=>{const n=t.getAudioTracks();n.sort(((e,t)=>e.idt.id?1:0));const a=n.slice(0,1),i=e.createMediaStreamSource(new MediaStream(a));return Object.defineProperty(i,"mediaStream",{value:t}),i}),Zt,Qt),Oa=((e,t)=>(n,{mediaStreamTrack:a})=>{if("function"==typeof n.createMediaStreamTrackSource)return n.createMediaStreamTrackSource(a);const i=new MediaStream([a]),s=n.createMediaStreamSource(i);if("audio"!==a.kind)throw e();if(t(n))throw new TypeError;return s})($e,Qt),Ma=((e,t,n)=>class extends e{constructor(e,a){const i=n(e);super(e,!0,t(i,a),null)}})(on,Oa,Zt),Ba=((e,t,n,a,i,s,r,o,l)=>class extends e{constructor(e={}){if(null===l)throw new Error("Missing the native AudioContext constructor.");let t;try{t=new l(e)}catch(e){if(12===e.code&&"sampleRate is not in range"===e.message)throw n();throw e}if(null===t)throw a();if(!ue(e.latencyHint))throw new TypeError(`The provided value '${e.latencyHint}' is not a valid enum value of type AudioContextLatencyCategory.`);if(void 0!==e.sampleRate&&t.sampleRate!==e.sampleRate)throw n();super(t,2);const{latencyHint:i}=e,{sampleRate:s}=t;if(this._baseLatency="number"==typeof t.baseLatency?t.baseLatency:"balanced"===i?512/s:"interactive"===i||void 0===i?256/s:"playback"===i?1024/s:128*Math.max(2,Math.min(128,Math.round(i*s/128)))/s,this._nativeAudioContext=t,"webkitAudioContext"===l.name?(this._nativeGainNode=t.createGain(),this._nativeOscillatorNode=t.createOscillator(),this._nativeGainNode.gain.value=1e-37,this._nativeOscillatorNode.connect(this._nativeGainNode).connect(t.destination),this._nativeOscillatorNode.start()):(this._nativeGainNode=null,this._nativeOscillatorNode=null),this._state=null,"running"===t.state){this._state="suspended";const e=()=>{"suspended"===this._state&&(this._state=null),t.removeEventListener("statechange",e)};t.addEventListener("statechange",e)}}get baseLatency(){return this._baseLatency}get state(){return null!==this._state?this._state:this._nativeAudioContext.state}close(){return"closed"===this.state?this._nativeAudioContext.close().then((()=>{throw t()})):("suspended"===this._state&&(this._state=null),this._nativeAudioContext.close().then((()=>{null!==this._nativeGainNode&&null!==this._nativeOscillatorNode&&(this._nativeOscillatorNode.stop(),this._nativeGainNode.disconnect(),this._nativeOscillatorNode.disconnect()),le(this)})))}createMediaElementSource(e){return new i(this,{mediaElement:e})}createMediaStreamDestination(){return new s(this)}createMediaStreamSource(e){return new r(this,{mediaStream:e})}createMediaStreamTrackSource(e){return new o(this,{mediaStreamTrack:e})}resume(){return"suspended"===this._state?new Promise(((e,t)=>{const n=()=>{this._nativeAudioContext.removeEventListener("statechange",n),"running"===this._nativeAudioContext.state?e():this.resume().then(e,t)};this._nativeAudioContext.addEventListener("statechange",n)})):this._nativeAudioContext.resume().catch((e=>{if(void 0===e||15===e.code)throw t();throw e}))}suspend(){return this._nativeAudioContext.suspend().catch((e=>{if(void 0===e)throw t();throw e}))}})(Na,$e,yt,xt,Ra,Da,za,Ma,tn),Fa=(e=>t=>{const n=e.get(t);if(void 0===n)throw new Error("The context has no set of AudioWorkletNodes.");return n})(aa),La=(e=>(t,n)=>{e(t).add(n)})(Fa),Pa=(e=>(t,n,a=0,i=0)=>{const s=t[a];if(void 0===s)throw e();return _e(n)?s.connect(n,0,i):s.connect(n,0)})(Q),ja=(e=>(t,n)=>{e(t).delete(n)})(Fa),Va=(e=>(t,n=void 0,a=void 0,i=0)=>void 0===n?t.forEach((e=>e.disconnect())):"number"==typeof n?qe(e,t,n).disconnect():_e(n)?void 0===a?t.forEach((e=>e.disconnect(n))):void 0===i?qe(e,t,a).disconnect(n,0):qe(e,t,a).disconnect(n,0,i):void 0===a?t.forEach((e=>e.disconnect(n))):qe(e,t,a).disconnect(n,0))(Q),Ua=new WeakMap,Wa=((e,t)=>n=>t(e,n))(Ua,V),Ga=((e,t,n,a,i,s,r,o,l,u,c,h,d)=>(p,m,f,g)=>{if(0===g.numberOfInputs&&0===g.numberOfOutputs)throw l();const y=Array.isArray(g.outputChannelCount)?g.outputChannelCount:Array.from(g.outputChannelCount);if(y.some((e=>e<1)))throw l();if(y.length!==g.numberOfOutputs)throw t();if("explicit"!==g.channelCountMode)throw l();const b=g.channelCount*g.numberOfInputs,v=y.reduce(((e,t)=>e+t),0),k=void 0===f.parameterDescriptors?0:f.parameterDescriptors.length;if(b+k>6||v>6)throw l();const w=new MessageChannel,A=[],x=[];for(let e=0;evoid 0===e?0:e},maxValue:{get:()=>void 0===t?ne:t},minValue:{get:()=>void 0===n?te:n}}),C.push(i)}const S=a(p,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:Math.max(1,b+k)}),E=ot(m,p.sampleRate),_=o(p,E,b+k,Math.max(1,v)),T=i(p,{channelCount:Math.max(1,v),channelCountMode:"explicit",channelInterpretation:"discrete",numberOfOutputs:Math.max(1,v)}),I=[];for(let e=0;e{const n=C[t];return n.connect(S,0,b+t),n.start(0),[e,n.offset]})));S.connect(_);let R=g.channelInterpretation,D=null;const z=0===g.numberOfOutputs?[_]:I,O={get bufferSize(){return E},get channelCount(){return g.channelCount},set channelCount(e){throw n()},get channelCountMode(){return g.channelCountMode},set channelCountMode(e){throw n()},get channelInterpretation(){return R},set channelInterpretation(e){for(const t of A)t.channelInterpretation=e;R=e},get context(){return _.context},get inputs(){return A},get numberOfInputs(){return g.numberOfInputs},get numberOfOutputs(){return g.numberOfOutputs},get onprocessorerror(){return D},set onprocessorerror(e){"function"==typeof D&&O.removeEventListener("processorerror",D),D="function"==typeof e?e:null,"function"==typeof D&&O.addEventListener("processorerror",D)},get parameters(){return N},get port(){return w.port2},addEventListener:(...e)=>_.addEventListener(e[0],e[1],e[2]),connect:e.bind(null,z),disconnect:u.bind(null,z),dispatchEvent:(...e)=>_.dispatchEvent(e[0]),removeEventListener:(...e)=>_.removeEventListener(e[0],e[1],e[2])},B=new Map;var F,L;w.port1.addEventListener=(F=w.port1.addEventListener,(...e)=>{if("message"===e[0]){const t="function"==typeof e[1]?e[1]:"object"==typeof e[1]&&null!==e[1]&&"function"==typeof e[1].handleEvent?e[1].handleEvent:null;if(null!==t){const n=B.get(e[1]);void 0!==n?e[1]=n:(e[1]=e=>{c(p.currentTime,p.sampleRate,(()=>t(e)))},B.set(t,e[1]))}}return F.call(w.port1,e[0],e[1],e[2])}),w.port1.removeEventListener=(L=w.port1.removeEventListener,(...e)=>{if("message"===e[0]){const t=B.get(e[1]);void 0!==t&&(B.delete(e[1]),e[1]=t)}return L.call(w.port1,e[0],e[1],e[2])});let P=null;Object.defineProperty(w.port1,"onmessage",{get:()=>P,set:e=>{"function"==typeof P&&w.port1.removeEventListener("message",P),P="function"==typeof e?e:null,"function"==typeof P&&(w.port1.addEventListener("message",P),w.port1.start())}}),f.prototype.port=w.port1;let j=null;const V=((e,t,n,a)=>{let i=M.get(e);void 0===i&&(i=new WeakMap,M.set(e,i));const s=lt(n,a);return i.set(t,s),s})(p,O,f,g);V.then((e=>j=e));const U=Be(g.numberOfInputs,g.channelCount),W=Be(g.numberOfOutputs,y),G=void 0===f.parameterDescriptors?[]:f.parameterDescriptors.reduce(((e,{name:t})=>({...e,[t]:new Float32Array(128)})),{});let q=!0;const H=()=>{g.numberOfOutputs>0&&_.disconnect(T);for(let e=0,t=0;e{if(null!==j){const n=h(O);for(let a=0;a{Oe(e,G,t,b+n,a)}));for(let e=0;e{if(n[t].size>0)return K.set(t,E/128),e;const a=K.get(t);return void 0===a?[]:(e.every((e=>e.every((e=>0===e))))&&(1===a?K.delete(t):K.set(t,a-1)),e)})),i=c(p.currentTime+a/p.sampleRate,p.sampleRate,(()=>j.process(e,W,G)));q=i;for(let e=0,n=0;e_.connect(Z).connect(p.destination),Y=()=>{_.disconnect(Z),Z.disconnect()};return X(),d(O,(()=>{if(q){Y(),g.numberOfOutputs>0&&_.connect(T);for(let e=0,t=0;e{q&&(X(),H()),$=!1}))})(Pa,Q,$e,Dn,ct,Ln,pt,gt,yt,Va,Ca,Wa,Nn),qa=((e,t,n,a,i)=>(s,r,o,l,u,c)=>{if(null!==o)try{const t=new o(s,l,c),a=new Map;let r=null;if(Object.defineProperties(t,{channelCount:{get:()=>c.channelCount,set:()=>{throw e()}},channelCountMode:{get:()=>"explicit",set:()=>{throw e()}},onprocessorerror:{get:()=>r,set:e=>{"function"==typeof r&&t.removeEventListener("processorerror",r),r="function"==typeof e?e:null,"function"==typeof r&&t.addEventListener("processorerror",r)}}}),t.addEventListener=(d=t.addEventListener,(...e)=>{if("processorerror"===e[0]){const t="function"==typeof e[1]?e[1]:"object"==typeof e[1]&&null!==e[1]&&"function"==typeof e[1].handleEvent?e[1].handleEvent:null;if(null!==t){const n=a.get(e[1]);void 0!==n?e[1]=n:(e[1]=n=>{"error"===n.type?(Object.defineProperties(n,{type:{value:"processorerror"}}),t(n)):t(new ErrorEvent(e[0],{...n}))},a.set(t,e[1]))}}return d.call(t,"error",e[1],e[2]),d.call(t,...e)}),t.removeEventListener=(h=t.removeEventListener,(...e)=>{if("processorerror"===e[0]){const t=a.get(e[1]);void 0!==t&&(a.delete(e[1]),e[1]=t)}return h.call(t,"error",e[1],e[2]),h.call(t,e[0],e[1],e[2])}),0!==c.numberOfOutputs){const e=n(s,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",gain:0});t.connect(e).connect(s.destination);return i(t,(()=>e.disconnect()),(()=>e.connect(s.destination)))}return t}catch(e){if(11===e.code)throw a();throw e}var h,d;if(void 0===u)throw a();return(e=>{const{port1:t}=new MessageChannel;try{t.postMessage(e)}finally{t.close()}})(c),t(s,r,u,c)})($e,Ga,pt,yt,Nn),Ha=((e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f)=>(g,y,b)=>{const v=new WeakMap;let k=null;return{render(w,A){o(A,w);const x=v.get(A);return void 0!==x?Promise.resolve(x):(async(o,w)=>{let A=c(o),x=null;const C=X(A,w),S=Array.isArray(y.outputChannelCount)?y.outputChannelCount:Array.from(y.outputChannelCount);if(null===h){const e=S.reduce(((e,t)=>e+t),0),n=i(w,{channelCount:Math.max(1,e),channelCountMode:"explicit",channelInterpretation:"discrete",numberOfOutputs:Math.max(1,e)}),s=[];for(let e=0;e{const l=new d(n,128*Math.ceil(o.context.length/128),w.sampleRate),u=[],c=[];for(let e=0;e{const t=s(l,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"discrete",offset:e.value});return await p(l,e,t.offset),t}))),g=a(l,{channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",numberOfInputs:Math.max(1,e+t)});for(let e=0;em(o,l,e)))),f(l)};k=Fe(o,0===n?null:await l(),w,y,S,b,u)}const e=await k,t=n(w,{buffer:null,channelCount:2,channelCountMode:"max",channelInterpretation:"speakers",loop:!1,loopEnd:0,loopStart:0,playbackRate:1}),[l,c,h]=x;null!==e&&(t.buffer=e,t.start(0)),t.connect(l);for(let e=0,t=0;et=>e.get(t))(Sa),$a=(e=>(t,n)=>{e.set(t,n)})(Ua),Za=xa?((e,t,n,a,i,s,r,o,l,u,c,h,d,p)=>class extends t{constructor(t,p,m){var f;const g=o(t),y=l(g),b=c({...ze,...m});d(b);const v=O.get(g),k=null==v?void 0:v.get(p),w=y||"closed"!==g.state?g:null!==(f=r(g))&&void 0!==f?f:g,A=i(w,y?null:t.baseLatency,u,p,k,b);super(t,!0,A,y?a(p,b,k):null);const x=[];A.parameters.forEach(((e,t)=>{const a=n(this,y,e);x.push([t,a])})),this._nativeAudioWorkletNode=A,this._onprocessorerror=null,this._parameters=new De(x),y&&e(g,this);const{activeInputs:C}=s(this);h(A,C)}get onprocessorerror(){return this._onprocessorerror}set onprocessorerror(e){const t="function"==typeof e?p(this,e):null;this._nativeAudioWorkletNode.onprocessorerror=t;const n=this._nativeAudioWorkletNode.onprocessorerror;this._onprocessorerror=null!==n&&n===t?e:n}get parameters(){return null===this._parameters?this._nativeAudioWorkletNode.parameters:this._parameters}get port(){return this._nativeAudioWorkletNode.port}})(La,on,xn,Ha,qa,se,Ka,Zt,Qt,rn,(e=>({...e,outputChannelCount:void 0!==e.outputChannelCount?e.outputChannelCount:1===e.numberOfInputs&&1===e.numberOfOutputs?[e.channelCount]:Array.from({length:e.numberOfOutputs},(()=>1))})),$a,(e=>{const{port1:t,port2:n}=new MessageChannel;try{t.postMessage(e)}finally{t.close(),n.close()}}),Mt):void 0,Xa=(((e,t,n,a,i)=>{})($e,yt,xt,ia,tn),((e,t)=>(n,a,i)=>{if(null===t)throw new Error("Missing the native OfflineAudioContext constructor.");try{return new t(n,a,i)}catch(t){if("SyntaxError"===t.name)throw e();throw t}})(yt,Yt)),Ya=((e,t,n,a,i,s,r,o)=>(l,u)=>n(l).render(l,u).then((()=>Promise.all(Array.from(a(u)).map((e=>n(e).render(e,u)))))).then((()=>i(u))).then((n=>("function"!=typeof n.copyFromChannel?(r(n),J(n)):t(s,(()=>s(n)))||o(n),e.add(n),n))))(cn,Vt,Ht,Fa,Qn,Y,mn,fn),Qa=(((e,t,n,a,i)=>{})(Vt,$e,Xa,ia,Ya),((e,t,n,a,i)=>class extends e{constructor(e,n,i){let s;if("number"==typeof e&&void 0!==n&&void 0!==i)s={length:n,numberOfChannels:e,sampleRate:i};else{if("object"!=typeof e)throw new Error("The given parameters are not valid.");s=e}const{length:r,numberOfChannels:o,sampleRate:l}={...bt,...s},u=a(o,r,l);t(Je,(()=>Je(u)))||u.addEventListener("statechange",(()=>{let e=0;const t=n=>{"running"===this._state&&(e>0?(u.removeEventListener("statechange",t),n.stopImmediatePropagation(),this._waitForThePromiseToSettle(n)):e+=1)};return t})()),super(u,o),this._length=r,this._nativeOfflineAudioContext=u,this._state=null}get length(){return void 0===this._nativeOfflineAudioContext.length?this._length:this._nativeOfflineAudioContext.length}get state(){return null===this._state?this._nativeOfflineAudioContext.state:this._state}startRendering(){return"running"===this._state?Promise.reject(n()):(this._state="running",i(this.destination,this._nativeOfflineAudioContext).finally((()=>{this._state=null,le(this)})))}_waitForThePromiseToSettle(e){null===this._state?this._nativeOfflineAudioContext.dispatchEvent(e):setTimeout((()=>this._waitForThePromiseToSettle(e)))}})(Na,Vt,$e,Xa,Ya)),Ja=((e,t)=>n=>{const a=e.get(n);return t(a)||t(n)})(R,nn),ei=((e,t)=>n=>e.has(n)||t(n))(T,an),ti=((e,t)=>n=>e.has(n)||t(n))(N,sn),ni=((e,t)=>n=>{const a=e.get(n);return t(a)||t(n)})(R,Qt),ai=()=>(async(e,t,n,a,i,s,r,o,l,u,c,h,d,p,m,f)=>{if(e(t,t)&&e(n,n)&&e(i,i)&&e(s,s)&&e(o,o)&&e(l,l)&&e(u,u)&&e(c,c)&&e(h,h)&&e(d,d)&&e(p,p))return(await Promise.all([e(a,a),e(r,r),e(m,m),e(f,f)])).every((e=>e));return!1})(Vt,(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createBuffer(1,1,44100);if(void 0===t.copyToChannel)return!0;const n=new Float32Array(2);try{t.copyFromChannel(n,0,0)}catch{return!1}return!0})(Yt),(e=>()=>{if(null===e)return!1;if(void 0!==e.prototype&&void 0!==e.prototype.close)return!0;const t=new e,n=void 0!==t.close;try{t.close()}catch{}return n})(tn),(e=>()=>{if(null===e)return Promise.resolve(!1);const t=new e(1,1,44100);return new Promise((e=>{let n=!0;const a=a=>{n&&(n=!1,t.startRendering(),e(a instanceof TypeError))};let i;try{i=t.decodeAudioData(null,(()=>{}),a)}catch(e){a(e)}void 0!==i&&i.catch(a)}))})(Yt),(e=>()=>{if(null===e)return!1;let t;try{t=new e({latencyHint:"balanced"})}catch{return!1}return t.close(),!0})(tn),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createGain(),n=t.connect(t)===t;return t.disconnect(t),n})(Yt),((e,t)=>async()=>{if(null===e)return!0;if(null===t)return!1;const n=new Blob(['let c,p;class A extends AudioWorkletProcessor{constructor(){super();this.port.onmessage=(e)=>{p=e.data;p.onmessage=()=>{p.postMessage(c);p.close()};this.port.postMessage(0)}}process(){c=1}}registerProcessor("a",A)'],{type:"application/javascript; charset=utf-8"}),a=new MessageChannel,i=new t(1,128,44100),s=URL.createObjectURL(n);let r=!1;try{await i.audioWorklet.addModule(s);const t=new e(i,"a",{numberOfOutputs:0}),n=i.createOscillator();await new Promise((e=>{t.port.onmessage=()=>e(),t.port.postMessage(a.port2,[a.port2])})),t.port.onmessage=()=>r=!0,n.connect(t),n.start(0),await i.startRendering(),r=await new Promise((e=>{a.port1.onmessage=({data:t})=>e(1===t),a.port1.postMessage(0)}))}catch{}finally{a.port1.close(),URL.revokeObjectURL(s)}return r})(rn,Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createChannelMerger();if("max"===t.channelCountMode)return!0;try{t.channelCount=2}catch{return!0}return!1})(Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100);return void 0===t.createConstantSource||t.createConstantSource().offset.maxValue!==Number.POSITIVE_INFINITY})(Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100),n=t.createConvolver();n.buffer=t.createBuffer(1,1,t.sampleRate);try{n.buffer=t.createBuffer(1,1,t.sampleRate)}catch{return!1}return!0})(Yt),(e=>()=>{if(null===e)return!1;const t=new e(1,1,44100).createConvolver();try{t.channelCount=1}catch{return!1}return!0})(Yt),Dt,(e=>()=>null!==e&&e.hasOwnProperty("isSecureContext"))(Gt),(e=>()=>{if(null===e)return!1;const t=new e;try{return t.createMediaStreamSource(new MediaStream),!1}catch(e){return!0}finally{t.close()}})(tn),(e=>()=>{if(null===e)return Promise.resolve(!1);const t=new e(1,1,44100);if(void 0===t.createStereoPanner)return Promise.resolve(!0);if(void 0===t.createConstantSource)return Promise.resolve(!0);const n=t.createConstantSource(),a=t.createStereoPanner();return n.channelCount=1,n.offset.value=1,a.channelCount=1,n.start(),n.connect(a).connect(t.destination),t.startRendering().then((e=>1!==e.getChannelData(0)[0]))})(Yt),zt);function ii(e,t){if(!e)throw new Error(t)}function si(e,t,n=1/0){if(!(t<=e&&e<=n))throw new RangeError(`Value must be within [${t}, ${n}], got: ${e}`)}function ri(e){e.isOffline||"running"===e.state||ci('The AudioContext is "suspended". Invoke Tone.start() from a user action to start the audio.')}let oi=console;function li(e){oi=e}function ui(...e){oi.log(...e)}function ci(...e){oi.warn(...e)}function hi(e){return void 0===e}function di(e){return!hi(e)}function pi(e){return"function"==typeof e}function mi(e){return"number"==typeof e}function fi(e){return"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object}function gi(e){return"boolean"==typeof e}function yi(e){return Array.isArray(e)}function bi(e){return"string"==typeof e}function vi(e){return bi(e)&&/^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i.test(e)}const ki="object"==typeof self?self:null,wi=ki&&(ki.hasOwnProperty("AudioContext")||ki.hasOwnProperty("webkitAudioContext"));function Ai(e,t,n,a){var i,s=arguments.length,r=s<3?t:null===a?a=Object.getOwnPropertyDescriptor(t,n):a;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,n,a);else for(var o=e.length-1;o>=0;o--)(i=e[o])&&(r=(s<3?i(r):s>3?i(t,n,r):i(t,n))||r);return s>3&&r&&Object.defineProperty(t,n,r),r}function xi(e,t,n,a){return new(n||(n=Promise))((function(i,s){function r(e){try{l(a.next(e))}catch(e){s(e)}}function o(e){try{l(a.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,o)}l((a=a.apply(e,t||[])).next())}))}Object.create;Object.create;"function"==typeof SuppressedError&&SuppressedError;class Ci{constructor(e,t,n){this._callback=e,this._type=t,this._updateInterval=n,this._createClock()}_createWorker(){const e=new Blob([`\n\t\t\t// the initial timeout time\n\t\t\tlet timeoutTime = ${(1e3*this._updateInterval).toFixed(1)};\n\t\t\t// onmessage callback\n\t\t\tself.onmessage = function(msg){\n\t\t\t\ttimeoutTime = parseInt(msg.data);\n\t\t\t};\n\t\t\t// the tick function which posts a message\n\t\t\t// and schedules a new tick\n\t\t\tfunction tick(){\n\t\t\t\tsetTimeout(tick, timeoutTime);\n\t\t\t\tself.postMessage('tick');\n\t\t\t}\n\t\t\t// call tick initially\n\t\t\ttick();\n\t\t\t`],{type:"text/javascript"}),t=URL.createObjectURL(e),n=new Worker(t);n.onmessage=this._callback.bind(this),this._worker=n}_createTimeout(){this._timeout=setTimeout((()=>{this._createTimeout(),this._callback()}),1e3*this._updateInterval)}_createClock(){if("worker"===this._type)try{this._createWorker()}catch(e){this._type="timeout",this._createClock()}else"timeout"===this._type&&this._createTimeout()}_disposeClock(){this._timeout&&(clearTimeout(this._timeout),this._timeout=0),this._worker&&(this._worker.terminate(),this._worker.onmessage=null)}get updateInterval(){return this._updateInterval}set updateInterval(e){this._updateInterval=Math.max(e,128/44100),"worker"===this._type&&this._worker.postMessage(Math.max(1e3*e,1))}get type(){return this._type}set type(e){this._disposeClock(),this._type=e,this._createClock()}dispose(){this._disposeClock()}}function Si(e){return ti(e)}function Ei(e){return ei(e)}function _i(e){return ni(e)}function Ti(e){return Ja(e)}function Ii(e){return e instanceof AudioBuffer}function Ni(e,t){return"value"===e||Si(t)||Ei(t)||Ii(t)}function Ri(e,...t){if(!t.length)return e;const n=t.shift();if(fi(e)&&fi(n))for(const t in n)Ni(t,n[t])?e[t]=n[t]:fi(n[t])?(e[t]||Object.assign(e,{[t]:{}}),Ri(e[t],n[t])):Object.assign(e,{[t]:n[t]});return Ri(e,...t)}function Di(e,t,n=[],a){const i={},s=Array.from(t);if(fi(s[0])&&a&&!Reflect.has(s[0],a)){Object.keys(s[0]).some((t=>Reflect.has(e,t)))||(Ri(i,{[a]:s[0]}),n.splice(n.indexOf(a),1),s.shift())}if(1===s.length&&fi(s[0]))Ri(i,s[0]);else for(let e=0;e{Reflect.has(e,t)&&delete e[t]})),e}class Mi{constructor(){this.debug=!1,this._wasDisposed=!1}static getDefaults(){return{}}log(...e){(this.debug||ki&&this.toString()===ki.TONE_DEBUG_CLASS)&&ui(this,...e)}dispose(){return this._wasDisposed=!0,this}get disposed(){return this._wasDisposed}toString(){return this.name}}Mi.version=s;const Bi=1e-6;function Fi(e,t){return e>t+Bi}function Li(e,t){return Fi(e,t)||ji(e,t)}function Pi(e,t){return e+Bithis.memory){const e=this.length-this.memory;this._timeline.splice(0,e)}return this}remove(e){const t=this._timeline.indexOf(e);return-1!==t&&this._timeline.splice(t,1),this}get(e,t="time"){const n=this._search(e,t);return-1!==n?this._timeline[n]:null}peek(){return this._timeline[0]}shift(){return this._timeline.shift()}getAfter(e,t="time"){const n=this._search(e,t);return n+10&&this._timeline[t-1].time=0?this._timeline[n-1]:null}cancel(e){if(this._timeline.length>1){let t=this._search(e);if(t>=0)if(ji(this._timeline[t].time,e)){for(let n=t;n>=0&&ji(this._timeline[n].time,e);n--)t=n;this._timeline=this._timeline.slice(0,t)}else this._timeline=this._timeline.slice(0,t+1);else this._timeline=[]}else 1===this._timeline.length&&Li(this._timeline[0].time,e)&&(this._timeline=[]);return this}cancelBefore(e){const t=this._search(e);return t>=0&&(this._timeline=this._timeline.slice(t+1)),this}previousEvent(e){const t=this._timeline.indexOf(e);return t>0?this._timeline[t-1]:null}_search(e,t="time"){if(0===this._timeline.length)return-1;let n=0;const a=this._timeline.length;let i=a;if(a>0&&this._timeline[a-1][t]<=e)return a-1;for(;n=0&&this._timeline[n].time>=e;)n--;return this._iterate(t,n+1),this}forEachAtTime(e,t){const n=this._search(e);if(-1!==n&&ji(this._timeline[n].time,e)){let a=n;for(let t=n;t>=0&&ji(this._timeline[t].time,e);t--)a=t;this._iterate((e=>{t(e)}),a,n)}return this}dispose(){return super.dispose(),this._timeline=[],this}}const Wi=[];function Gi(e){Wi.push(e)}const qi=[];function Hi(e){qi.push(e)}class Ki extends Mi{constructor(){super(...arguments),this.name="Emitter"}on(e,t){return e.split(/\W+/).forEach((e=>{hi(this._events)&&(this._events={}),this._events.hasOwnProperty(e)||(this._events[e]=[]),this._events[e].push(t)})),this}once(e,t){const n=(...a)=>{t(...a),this.off(e,n)};return this.on(e,n),this}off(e,t){return e.split(/\W+/).forEach((n=>{if(hi(this._events)&&(this._events={}),this._events.hasOwnProperty(e))if(hi(t))this._events[e]=[];else{const n=this._events[e];for(let e=n.length-1;e>=0;e--)n[e]===t&&n.splice(e,1)}})),this}emit(e,...t){if(this._events&&this._events.hasOwnProperty(e)){const n=this._events[e].slice(0);for(let e=0,a=n.length;e{const n=Object.getOwnPropertyDescriptor(Ki.prototype,t);Object.defineProperty(e.prototype,t,n)}))}dispose(){return super.dispose(),this._events=void 0,this}}class $i extends Ki{constructor(){super(...arguments),this.isOffline=!1}toJSON(){return{}}}class Zi extends $i{constructor(){super(),this.name="Context",this._constants=new Map,this._timeouts=new Ui,this._timeoutIds=0,this._initialized=!1,this.isOffline=!1,this._workletModules=new Map;const e=Di(Zi.getDefaults(),arguments,["context"]);e.context?this._context=e.context:this._context=function(e){return new Ba(e)}({latencyHint:e.latencyHint}),this._ticker=new Ci(this.emit.bind(this,"tick"),e.clockSource,e.updateInterval),this.on("tick",this._timeoutLoop.bind(this)),this._context.onstatechange=()=>{this.emit("statechange",this.state)},this._setLatencyHint(e.latencyHint),this.lookAhead=e.lookAhead}static getDefaults(){return{clockSource:"worker",latencyHint:"interactive",lookAhead:.1,updateInterval:.05}}initialize(){var e;return this._initialized||(e=this,Wi.forEach((t=>t(e))),this._initialized=!0),this}createAnalyser(){return this._context.createAnalyser()}createOscillator(){return this._context.createOscillator()}createBufferSource(){return this._context.createBufferSource()}createBiquadFilter(){return this._context.createBiquadFilter()}createBuffer(e,t,n){return this._context.createBuffer(e,t,n)}createChannelMerger(e){return this._context.createChannelMerger(e)}createChannelSplitter(e){return this._context.createChannelSplitter(e)}createConstantSource(){return this._context.createConstantSource()}createConvolver(){return this._context.createConvolver()}createDelay(e){return this._context.createDelay(e)}createDynamicsCompressor(){return this._context.createDynamicsCompressor()}createGain(){return this._context.createGain()}createIIRFilter(e,t){return this._context.createIIRFilter(e,t)}createPanner(){return this._context.createPanner()}createPeriodicWave(e,t,n){return this._context.createPeriodicWave(e,t,n)}createStereoPanner(){return this._context.createStereoPanner()}createWaveShaper(){return this._context.createWaveShaper()}createMediaStreamSource(e){ii(Ti(this._context),"Not available if OfflineAudioContext");return this._context.createMediaStreamSource(e)}createMediaElementSource(e){ii(Ti(this._context),"Not available if OfflineAudioContext");return this._context.createMediaElementSource(e)}createMediaStreamDestination(){ii(Ti(this._context),"Not available if OfflineAudioContext");return this._context.createMediaStreamDestination()}decodeAudioData(e){return this._context.decodeAudioData(e)}get currentTime(){return this._context.currentTime}get state(){return this._context.state}get sampleRate(){return this._context.sampleRate}get listener(){return this.initialize(),this._listener}set listener(e){ii(!this._initialized,"The listener cannot be set after initialization."),this._listener=e}get transport(){return this.initialize(),this._transport}set transport(e){ii(!this._initialized,"The transport cannot be set after initialization."),this._transport=e}get draw(){return this.initialize(),this._draw}set draw(e){ii(!this._initialized,"Draw cannot be set after initialization."),this._draw=e}get destination(){return this.initialize(),this._destination}set destination(e){ii(!this._initialized,"The destination cannot be set after initialization."),this._destination=e}createAudioWorkletNode(e,t){return function(e,t,n){return ii(di(Za),"This node only works in a secure context (https or localhost)"),new Za(e,t,n)}(this.rawContext,e,t)}addAudioWorkletModule(e,t){return xi(this,void 0,void 0,(function*(){ii(di(this.rawContext.audioWorklet),"AudioWorkletNode is only available in a secure context (https or localhost)"),this._workletModules.has(t)||this._workletModules.set(t,this.rawContext.audioWorklet.addModule(e)),yield this._workletModules.get(t)}))}workletsAreReady(){return xi(this,void 0,void 0,(function*(){const e=[];this._workletModules.forEach((t=>e.push(t))),yield Promise.all(e)}))}get updateInterval(){return this._ticker.updateInterval}set updateInterval(e){this._ticker.updateInterval=e}get clockSource(){return this._ticker.type}set clockSource(e){this._ticker.type=e}get latencyHint(){return this._latencyHint}_setLatencyHint(e){let t=0;if(this._latencyHint=e,bi(e))switch(e){case"interactive":t=.1;break;case"playback":t=.5;break;case"balanced":t=.25}this.lookAhead=t,this.updateInterval=t/2}get rawContext(){return this._context}now(){return this._context.currentTime+this.lookAhead}immediate(){return this._context.currentTime}resume(){return Ti(this._context)?this._context.resume():Promise.resolve()}close(){return xi(this,void 0,void 0,(function*(){var e;Ti(this._context)&&(yield this._context.close()),this._initialized&&(e=this,qi.forEach((t=>t(e))))}))}getConstant(e){if(this._constants.has(e))return this._constants.get(e);{const t=this._context.createBuffer(1,128,this._context.sampleRate),n=t.getChannelData(0);for(let t=0;tthis._constants[e].disconnect())),this}_timeoutLoop(){const e=this.now();let t=this._timeouts.peek();for(;this._timeouts.length&&t&&t.time<=e;)t.callback(),this._timeouts.shift(),t=this._timeouts.peek()}setTimeout(e,t){this._timeoutIds++;const n=this.now();return this._timeouts.add({callback:e,id:this._timeoutIds,time:n+t}),this._timeoutIds}clearTimeout(e){return this._timeouts.forEach((t=>{t.id===e&&this._timeouts.remove(t)})),this}clearInterval(e){return this.clearTimeout(e)}setInterval(e,t){const n=++this._timeoutIds,a=()=>{const i=this.now();this._timeouts.add({callback:()=>{e(),a()},id:n,time:i+t})};return a(),n}}function Xi(e,t){yi(t)?t.forEach((t=>Xi(e,t))):Object.defineProperty(e,t,{enumerable:!0,writable:!1})}function Yi(e,t){yi(t)?t.forEach((t=>Yi(e,t))):Object.defineProperty(e,t,{writable:!0})}const Qi=()=>{};class Ji extends Mi{constructor(){super(),this.name="ToneAudioBuffer",this.onload=Qi;const e=Di(Ji.getDefaults(),arguments,["url","onload","onerror"]);this.reverse=e.reverse,this.onload=e.onload,e.url&&Ii(e.url)||e.url instanceof Ji?this.set(e.url):bi(e.url)&&this.load(e.url).catch(e.onerror)}static getDefaults(){return{onerror:Qi,onload:Qi,reverse:!1}}get sampleRate(){return this._buffer?this._buffer.sampleRate:as().sampleRate}set(e){return e instanceof Ji?e.loaded?this._buffer=e.get():e.onload=()=>{this.set(e),this.onload(this)}:this._buffer=e,this._reversed&&this._reverse(),this}get(){return this._buffer}load(e){return xi(this,void 0,void 0,(function*(){const t=Ji.load(e).then((e=>{this.set(e),this.onload(this)}));Ji.downloads.push(t);try{yield t}finally{const e=Ji.downloads.indexOf(t);Ji.downloads.splice(e,1)}return this}))}dispose(){return super.dispose(),this._buffer=void 0,this}fromArray(e){const t=yi(e)&&e[0].length>0,n=t?e.length:1,a=t?e[0].length:e.length,i=as(),s=i.createBuffer(n,a,i.sampleRate),r=t||1!==n?e:[e];for(let e=0;ee/t)),this.fromArray(e)}return this}toArray(e){if(mi(e))return this.getChannelData(e);if(1===this.numberOfChannels)return this.toArray(0);{const e=[];for(let t=0;t0}get duration(){return this._buffer?this._buffer.duration:0}get length(){return this._buffer?this._buffer.length:0}get numberOfChannels(){return this._buffer?this._buffer.numberOfChannels:0}get reverse(){return this._reversed}set reverse(e){this._reversed!==e&&(this._reversed=e,this._reverse())}static fromArray(e){return(new Ji).fromArray(e)}static fromUrl(e){return xi(this,void 0,void 0,(function*(){const t=new Ji;return yield t.load(e)}))}static load(e){return xi(this,void 0,void 0,(function*(){const t=e.match(/\[([^\]\[]+\|.+)\]$/);if(t){const n=t[1].split("|");let a=n[0];for(const e of n)if(Ji.supportsType(e)){a=e;break}e=e.replace(t[0],a)}const n=""===Ji.baseUrl||Ji.baseUrl.endsWith("/")?Ji.baseUrl:Ji.baseUrl+"/",a=yield fetch(n+e);if(!a.ok)throw new Error(`could not load url: ${e}`);const i=yield a.arrayBuffer();return yield as().decodeAudioData(i)}))}static supportsType(e){const t=e.split("."),n=t[t.length-1];return""!==document.createElement("audio").canPlayType("audio/"+n)}static loaded(){return xi(this,void 0,void 0,(function*(){for(yield Promise.resolve();Ji.downloads.length;)yield Ji.downloads[0]}))}}Ji.baseUrl="",Ji.downloads=[];class es extends Zi{constructor(){var e,t,n;super({clockSource:"offline",context:_i(arguments[0])?arguments[0]:(e=arguments[0],t=arguments[1]*arguments[2],n=arguments[2],new Qa(e,t,n)),lookAhead:0,updateInterval:_i(arguments[0])?128/arguments[0].sampleRate:128/arguments[2]}),this.name="OfflineContext",this._currentTime=0,this.isOffline=!0,this._duration=_i(arguments[0])?arguments[0].length/arguments[0].sampleRate:arguments[1]}now(){return this._currentTime}get currentTime(){return this._currentTime}_renderClock(e){return xi(this,void 0,void 0,(function*(){let t=0;for(;this._duration-this._currentTime>=0;){this.emit("tick"),this._currentTime+=128/this.sampleRate,t++;const n=Math.floor(this.sampleRate/128);e&&t%n==0&&(yield new Promise((e=>setTimeout(e,1))))}}))}render(e=!0){return xi(this,void 0,void 0,(function*(){yield this.workletsAreReady(),yield this._renderClock(e);const t=yield this._context.startRendering();return new Ji(t)}))}close(){return Promise.resolve()}}const ts=new class extends $i{constructor(){super(...arguments),this.lookAhead=0,this.latencyHint=0,this.isOffline=!1}createAnalyser(){return{}}createOscillator(){return{}}createBufferSource(){return{}}createBiquadFilter(){return{}}createBuffer(e,t,n){return{}}createChannelMerger(e){return{}}createChannelSplitter(e){return{}}createConstantSource(){return{}}createConvolver(){return{}}createDelay(e){return{}}createDynamicsCompressor(){return{}}createGain(){return{}}createIIRFilter(e,t){return{}}createPanner(){return{}}createPeriodicWave(e,t,n){return{}}createStereoPanner(){return{}}createWaveShaper(){return{}}createMediaStreamSource(e){return{}}createMediaElementSource(e){return{}}createMediaStreamDestination(){return{}}decodeAudioData(e){return Promise.resolve({})}createAudioWorkletNode(e,t){return{}}get rawContext(){return{}}addAudioWorkletModule(e,t){return xi(this,void 0,void 0,(function*(){return Promise.resolve()}))}resume(){return Promise.resolve()}setTimeout(e,t){return 0}clearTimeout(e){return this}setInterval(e,t){return 0}clearInterval(e){return this}getConstant(e){return{}}get currentTime(){return 0}get state(){return{}}get sampleRate(){return 0}get listener(){return{}}get transport(){return{}}get draw(){return{}}set draw(e){}get destination(){return{}}set destination(e){}now(){return 0}immediate(){return 0}};let ns=ts;function as(){return ns===ts&&wi&&is(new Zi),ns}function is(e){ns=Ti(e)?new Zi(e):_i(e)?new es(e):e}function ss(){return ns.resume()}if(ki&&!ki.TONE_SILENCE_LOGGING){let e="v";"dev"===s&&(e="")}function rs(e){return Math.pow(10,e/20)}function os(e){return Math.log(e)/Math.LN10*20}function ls(e){return Math.pow(2,e/12)}let us=440;function cs(e){return Math.round(hs(e))}function hs(e){return 69+12*Math.log2(e/us)}function ds(e){return us*Math.pow(2,(e-69)/12)}class ps extends Mi{constructor(e,t,n){super(),this.defaultUnits="s",this._val=t,this._units=n,this.context=e,this._expressions=this._getExpressions()}_getExpressions(){return{hz:{method:e=>this._frequencyToUnits(parseFloat(e)),regexp:/^(\d+(?:\.\d+)?)hz$/i},i:{method:e=>this._ticksToUnits(parseInt(e,10)),regexp:/^(\d+)i$/i},m:{method:e=>this._beatsToUnits(parseInt(e,10)*this._getTimeSignature()),regexp:/^(\d+)m$/i},n:{method:(e,t)=>{const n=parseInt(e,10),a="."===t?1.5:1;return 1===n?this._beatsToUnits(this._getTimeSignature())*a:this._beatsToUnits(4/n)*a},regexp:/^(\d+)n(\.?)$/i},number:{method:e=>this._expressions[this.defaultUnits].method.call(this,e),regexp:/^(\d+(?:\.\d+)?)$/},s:{method:e=>this._secondsToUnits(parseFloat(e)),regexp:/^(\d+(?:\.\d+)?)s$/},samples:{method:e=>parseInt(e,10)/this.context.sampleRate,regexp:/^(\d+)samples$/},t:{method:e=>{const t=parseInt(e,10);return this._beatsToUnits(8/(3*Math.floor(t)))},regexp:/^(\d+)t$/i},tr:{method:(e,t,n)=>{let a=0;return e&&"0"!==e&&(a+=this._beatsToUnits(this._getTimeSignature()*parseFloat(e))),t&&"0"!==t&&(a+=this._beatsToUnits(parseFloat(t))),n&&"0"!==n&&(a+=this._beatsToUnits(parseFloat(n)/4)),a},regexp:/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?$/}}}valueOf(){if(this._val instanceof ps&&this.fromType(this._val),hi(this._val))return this._noArg();if(bi(this._val)&&hi(this._units)){for(const e in this._expressions)if(this._expressions[e].regexp.test(this._val.trim())){this._units=e;break}}else if(fi(this._val)){let e=0;for(const t in this._val)if(di(this._val[t])){const n=this._val[t];e+=new this.constructor(this.context,t).valueOf()*n}return e}if(di(this._units)){const e=this._expressions[this._units],t=this._val.toString().trim().match(e.regexp);return t?e.method.apply(this,t.slice(1)):e.method.call(this,this._val)}return bi(this._val)?parseFloat(this._val):this._val}_frequencyToUnits(e){return 1/e}_beatsToUnits(e){return 60/this._getBpm()*e}_secondsToUnits(e){return e}_ticksToUnits(e){return e*this._beatsToUnits(1)/this._getPPQ()}_noArg(){return this._now()}_getBpm(){return this.context.transport.bpm.value}_getTimeSignature(){return this.context.transport.timeSignature}_getPPQ(){return this.context.transport.PPQ}fromType(e){switch(this._units=void 0,this.defaultUnits){case"s":this._val=e.toSeconds();break;case"i":this._val=e.toTicks();break;case"hz":this._val=e.toFrequency();break;case"midi":this._val=e.toMidi()}return this}toFrequency(){return 1/this.toSeconds()}toSamples(){return this.toSeconds()*this.context.sampleRate}toMilliseconds(){return 1e3*this.toSeconds()}}class ms extends ps{constructor(){super(...arguments),this.name="TimeClass"}_getExpressions(){return Object.assign(super._getExpressions(),{now:{method:e=>this._now()+new this.constructor(this.context,e).valueOf(),regexp:/^\+(.+)/},quantize:{method:e=>{const t=new ms(this.context,e).valueOf();return this._secondsToUnits(this.context.transport.nextSubdivision(t))},regexp:/^@(.+)/}})}quantize(e,t=1){const n=new this.constructor(this.context,e).valueOf(),a=this.valueOf();return a+(Math.round(a/n)*n-a)*t}toNotation(){const e=this.toSeconds(),t=["1m"];for(let e=1;e<9;e++){const n=Math.pow(2,e);t.push(n+"n."),t.push(n+"n"),t.push(n+"t")}t.push("0");let n=t[0],a=new ms(this.context,t[0]).toSeconds();return t.forEach((t=>{const i=new ms(this.context,t).toSeconds();Math.abs(i-e)3&&(a=parseFloat(parseFloat(i).toFixed(3)));return[n,t,a].join(":")}toTicks(){const e=this._beatsToUnits(1),t=this.valueOf()/e;return Math.round(t*this._getPPQ())}toSeconds(){return this.valueOf()}toMidi(){return cs(this.toFrequency())}_now(){return this.context.now()}}function fs(e,t){return new ms(as(),e,t)}class gs extends ms{constructor(){super(...arguments),this.name="Frequency",this.defaultUnits="hz"}static get A4(){return us}static set A4(e){!function(e){us=e}(e)}_getExpressions(){return Object.assign({},super._getExpressions(),{midi:{regexp:/^(\d+(?:\.\d+)?midi)/,method(e){return"midi"===this.defaultUnits?e:gs.mtof(e)}},note:{regexp:/^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i,method(e,t){const n=ys[e.toLowerCase()]+12*(parseInt(t,10)+1);return"midi"===this.defaultUnits?n:gs.mtof(n)}},tr:{regexp:/^(\d+(?:\.\d+)?):(\d+(?:\.\d+)?):?(\d+(?:\.\d+)?)?/,method(e,t,n){let a=1;return e&&"0"!==e&&(a*=this._beatsToUnits(this._getTimeSignature()*parseFloat(e))),t&&"0"!==t&&(a*=this._beatsToUnits(parseFloat(t))),n&&"0"!==n&&(a*=this._beatsToUnits(parseFloat(n)/4)),a}}})}transpose(e){return new gs(this.context,this.valueOf()*ls(e))}harmonize(e){return e.map((e=>this.transpose(e)))}toMidi(){return cs(this.valueOf())}toNote(){const e=this.toFrequency(),t=Math.log2(e/gs.A4);let n=Math.round(12*t)+57;const a=Math.floor(n/12);a<0&&(n+=-12*a);return bs[n%12]+a.toString()}toSeconds(){return 1/super.toSeconds()}toTicks(){const e=this._beatsToUnits(1),t=this.valueOf()/e;return Math.floor(t*this._getPPQ())}_noArg(){return 0}_frequencyToUnits(e){return e}_ticksToUnits(e){return 1/(60*e/(this._getBpm()*this._getPPQ()))}_beatsToUnits(e){return 1/super._beatsToUnits(e)}_secondsToUnits(e){return 1/e}static mtof(e){return ds(e)}static ftom(e){return cs(e)}}const ys={cbb:-2,cb:-1,c:0,"c#":1,cx:2,dbb:0,db:1,d:2,"d#":3,dx:4,ebb:2,eb:3,e:4,"e#":5,ex:6,fbb:3,fb:4,f:5,"f#":6,fx:7,gbb:5,gb:6,g:7,"g#":8,gx:9,abb:7,ab:8,a:9,"a#":10,ax:11,bbb:9,bb:10,b:11,"b#":12,bx:13},bs=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function vs(e,t){return new gs(as(),e,t)}class ks extends ms{constructor(){super(...arguments),this.name="TransportTime"}_now(){return this.context.transport.seconds}}function ws(e,t){return new ks(as(),e,t)}class As extends Mi{constructor(){super();const e=Di(As.getDefaults(),arguments,["context"]);this.defaultContext?this.context=this.defaultContext:this.context=e.context}static getDefaults(){return{context:as()}}now(){return this.context.currentTime+this.context.lookAhead}immediate(){return this.context.currentTime}get sampleTime(){return 1/this.context.sampleRate}get blockTime(){return 128/this.context.sampleRate}toSeconds(e){return new ms(this.context,e).toSeconds()}toFrequency(e){return new gs(this.context,e).toFrequency()}toTicks(e){return new ks(this.context,e).toTicks()}_getPartialProperties(e){const t=this.get();return Object.keys(t).forEach((n=>{hi(e[n])&&delete t[n]})),t}get(){const e=this.constructor.getDefaults();return Object.keys(e).forEach((t=>{if(Reflect.has(this,t)){const n=this[t];di(n)&&di(n.value)&&di(n.setValueAtTime)?e[t]=n.value:n instanceof As?e[t]=n._getPartialProperties(e[t]):yi(n)||mi(n)||bi(n)||gi(n)?e[t]=n:delete e[t]}})),e}set(e){return Object.keys(e).forEach((t=>{Reflect.has(this,t)&&di(this[t])&&(this[t]&&di(this[t].value)&&di(this[t].setValueAtTime)?this[t].value!==e[t]&&(this[t].value=e[t]):this[t]instanceof As?this[t].set(e[t]):this[t]=e[t])})),this}}class xs extends Ui{constructor(e="stopped"){super(),this.name="StateTimeline",this._initial=e,this.setStateAtTime(this._initial,0)}getValueAtTime(e){const t=this.get(e);return null!==t?t.state:this._initial}setStateAtTime(e,t,n){return si(t,0),this.add(Object.assign({},n,{state:e,time:t})),this}getLastState(e,t){for(let n=this._search(t);n>=0;n--){const t=this._timeline[n];if(t.state===e)return t}}getNextState(e,t){const n=this._search(t);if(-1!==n)for(let t=n;t0,"timeConstant must be a number greater than 0");const i=this.toSeconds(t);return this._assertRange(a),ii(isFinite(a)&&isFinite(i),`Invalid argument(s) to setTargetAtTime: ${JSON.stringify(e)}, ${JSON.stringify(t)}`),this._events.add({constant:n,time:i,type:"setTargetAtTime",value:a}),this.log(this.units,"setTargetAtTime",e,i,n),this._param.setTargetAtTime(a,i,n),this}setValueCurveAtTime(e,t,n,a=1){n=this.toSeconds(n),t=this.toSeconds(t);const i=this._fromType(e[0])*a;this.setValueAtTime(this._toType(i),t);const s=n/(e.length-1);for(let n=1;n{"cancelScheduledValues"===t.type?e.cancelScheduledValues(t.time):"setTargetAtTime"===t.type?e.setTargetAtTime(t.value,t.time,t.constant):e[t.type](t.value,t.time)})),this}setParam(e){ii(this._swappable,"The Param must be assigned as 'swappable' in the constructor");const t=this.input;return t.disconnect(this._param),this.apply(e),this._param=e,t.connect(this._param),this}dispose(){return super.dispose(),this._events.dispose(),this}get defaultValue(){return this._toType(this._param.defaultValue)}_exponentialApproach(e,t,n,a,i){return n+(t-n)*Math.exp(-(i-e)/a)}_linearInterpolate(e,t,n,a,i){return t+(i-e)/(n-e)*(a-t)}_exponentialInterpolate(e,t,n,a,i){return t*Math.pow(a/t,(i-e)/(n-e))}}class Ss extends As{constructor(){super(...arguments),this.name="ToneAudioNode",this._internalChannels=[]}get numberOfInputs(){return di(this.input)?Si(this.input)||this.input instanceof Cs?1:this.input.numberOfInputs:0}get numberOfOutputs(){return di(this.output)?this.output.numberOfOutputs:0}_isAudioNode(e){return di(e)&&(e instanceof Ss||Ei(e))}_getInternalNodes(){const e=this._internalChannels.slice(0);return this._isAudioNode(this.input)&&e.push(this.input),this._isAudioNode(this.output)&&this.input!==this.output&&e.push(this.output),e}_setChannelProperties(e){this._getInternalNodes().forEach((t=>{t.channelCount=e.channelCount,t.channelCountMode=e.channelCountMode,t.channelInterpretation=e.channelInterpretation}))}_getChannelProperties(){const e=this._getInternalNodes();ii(e.length>0,"ToneAudioNode does not have any internal nodes");const t=e[0];return{channelCount:t.channelCount,channelCountMode:t.channelCountMode,channelInterpretation:t.channelInterpretation}}get channelCount(){return this._getChannelProperties().channelCount}set channelCount(e){const t=this._getChannelProperties();this._setChannelProperties(Object.assign(t,{channelCount:e}))}get channelCountMode(){return this._getChannelProperties().channelCountMode}set channelCountMode(e){const t=this._getChannelProperties();this._setChannelProperties(Object.assign(t,{channelCountMode:e}))}get channelInterpretation(){return this._getChannelProperties().channelInterpretation}set channelInterpretation(e){const t=this._getChannelProperties();this._setChannelProperties(Object.assign(t,{channelInterpretation:e}))}connect(e,t=0,n=0){return _s(this,e,t,n),this}toDestination(){return this.connect(this.context.destination),this}toMaster(){return ci("toMaster() has been renamed toDestination()"),this.toDestination()}disconnect(e,t=0,n=0){return Ts(this,e,t,n),this}chain(...e){return Es(this,...e),this}fan(...e){return e.forEach((e=>this.connect(e))),this}dispose(){return super.dispose(),di(this.input)&&(this.input instanceof Ss?this.input.dispose():Ei(this.input)&&this.input.disconnect()),di(this.output)&&(this.output instanceof Ss?this.output.dispose():Ei(this.output)&&this.output.disconnect()),this._internalChannels=[],this}}function Es(...e){const t=e.shift();e.reduce(((e,t)=>(e instanceof Ss?e.connect(t):Ei(e)&&_s(e,t),t)),t)}function _s(e,t,n=0,a=0){for(ii(di(e),"Cannot connect from undefined node"),ii(di(t),"Cannot connect to undefined node"),(t instanceof Ss||Ei(t))&&ii(t.numberOfInputs>0,"Cannot connect to node with no inputs"),ii(e.numberOfOutputs>0,"Cannot connect from node with no outputs");t instanceof Ss||t instanceof Cs;)di(t.input)&&(t=t.input);for(;e instanceof Ss;)di(e.output)&&(e=e.output);Si(t)?e.connect(t,n):e.connect(t,n,a)}function Ts(e,t,n=0,a=0){if(di(t))for(;t instanceof Ss;)t=t.input;for(;!Ei(e);)di(e.output)&&(e=e.output);Si(t)?e.disconnect(t,n):Ei(t)?e.disconnect(t,n,a):e.disconnect()}class Is extends Ss{constructor(){super(Di(Is.getDefaults(),arguments,["gain","units"])),this.name="Gain",this._gainNode=this.context.createGain(),this.input=this._gainNode,this.output=this._gainNode;const e=Di(Is.getDefaults(),arguments,["gain","units"]);this.gain=new Cs({context:this.context,convert:e.convert,param:this._gainNode.gain,units:e.units,value:e.gain,minValue:e.minValue,maxValue:e.maxValue}),Xi(this,"gain")}static getDefaults(){return Object.assign(Ss.getDefaults(),{convert:!0,gain:1,units:"gain"})}dispose(){return super.dispose(),this._gainNode.disconnect(),this.gain.dispose(),this}}class Ns extends Ss{constructor(e){super(e),this.onended=Qi,this._startTime=-1,this._stopTime=-1,this._timeout=-1,this.output=new Is({context:this.context,gain:0}),this._gainNode=this.output,this.getStateAtTime=function(e){const t=this.toSeconds(e);return-1!==this._startTime&&t>=this._startTime&&(-1===this._stopTime||t<=this._stopTime)?"started":"stopped"},this._fadeIn=e.fadeIn,this._fadeOut=e.fadeOut,this._curve=e.curve,this.onended=e.onended}static getDefaults(){return Object.assign(Ss.getDefaults(),{curve:"linear",fadeIn:0,fadeOut:0,onended:Qi})}_startGain(e,t=1){ii(-1===this._startTime,"Source cannot be started more than once");const n=this.toSeconds(this._fadeIn);return this._startTime=e+n,this._startTime=Math.max(this._startTime,this.context.currentTime),n>0?(this._gainNode.gain.setValueAtTime(0,e),"linear"===this._curve?this._gainNode.gain.linearRampToValueAtTime(t,e+n):this._gainNode.gain.exponentialApproachValueAtTime(t,e,n)):this._gainNode.gain.setValueAtTime(t,e),this}stop(e){return this.log("stop",e),this._stopGain(this.toSeconds(e)),this}_stopGain(e){ii(-1!==this._startTime,"'start' must be called before 'stop'"),this.cancelStop();const t=this.toSeconds(this._fadeOut);return this._stopTime=this.toSeconds(e)+t,this._stopTime=Math.max(this._stopTime,this.context.currentTime),t>0?"linear"===this._curve?this._gainNode.gain.linearRampTo(0,t,e):this._gainNode.gain.targetRampTo(0,t,e):(this._gainNode.gain.cancelAndHoldAtTime(e),this._gainNode.gain.setValueAtTime(0,e)),this.context.clearTimeout(this._timeout),this._timeout=this.context.setTimeout((()=>{const e="exponential"===this._curve?2*t:0;this._stopSource(this.now()+e),this._onended()}),this._stopTime-this.context.currentTime),this}_onended(){if(this.onended!==Qi&&(this.onended(this),this.onended=Qi,!this.context.isOffline)){const e=()=>this.dispose();void 0!==window.requestIdleCallback?window.requestIdleCallback(e):setTimeout(e,1e3)}}get state(){return this.getStateAtTime(this.now())}cancelStop(){return this.log("cancelStop"),ii(-1!==this._startTime,"Source is not started"),this._gainNode.gain.cancelScheduledValues(this._startTime+this.sampleTime),this.context.clearTimeout(this._timeout),this._stopTime=-1,this}dispose(){return super.dispose(),this._gainNode.disconnect(),this}}class Rs extends Ns{constructor(){super(Di(Rs.getDefaults(),arguments,["offset"])),this.name="ToneConstantSource",this._source=this.context.createConstantSource();const e=Di(Rs.getDefaults(),arguments,["offset"]);_s(this._source,this._gainNode),this.offset=new Cs({context:this.context,convert:e.convert,param:this._source.offset,units:e.units,value:e.offset,minValue:e.minValue,maxValue:e.maxValue})}static getDefaults(){return Object.assign(Ns.getDefaults(),{convert:!0,offset:1,units:"number"})}start(e){const t=this.toSeconds(e);return this.log("start",t),this._startGain(t),this._source.start(t),this}_stopSource(e){this._source.stop(e)}dispose(){return super.dispose(),"started"===this.state&&this.stop(),this._source.disconnect(),this.offset.dispose(),this}}class Ds extends Ss{constructor(){super(Di(Ds.getDefaults(),arguments,["value","units"])),this.name="Signal",this.override=!0;const e=Di(Ds.getDefaults(),arguments,["value","units"]);this.output=this._constantSource=new Rs({context:this.context,convert:e.convert,offset:e.value,units:e.units,minValue:e.minValue,maxValue:e.maxValue}),this._constantSource.start(0),this.input=this._param=this._constantSource.offset}static getDefaults(){return Object.assign(Ss.getDefaults(),{convert:!0,units:"number",value:0})}connect(e,t=0,n=0){return zs(this,e,t,n),this}dispose(){return super.dispose(),this._param.dispose(),this._constantSource.dispose(),this}setValueAtTime(e,t){return this._param.setValueAtTime(e,t),this}getValueAtTime(e){return this._param.getValueAtTime(e)}setRampPoint(e){return this._param.setRampPoint(e),this}linearRampToValueAtTime(e,t){return this._param.linearRampToValueAtTime(e,t),this}exponentialRampToValueAtTime(e,t){return this._param.exponentialRampToValueAtTime(e,t),this}exponentialRampTo(e,t,n){return this._param.exponentialRampTo(e,t,n),this}linearRampTo(e,t,n){return this._param.linearRampTo(e,t,n),this}targetRampTo(e,t,n){return this._param.targetRampTo(e,t,n),this}exponentialApproachValueAtTime(e,t,n){return this._param.exponentialApproachValueAtTime(e,t,n),this}setTargetAtTime(e,t,n){return this._param.setTargetAtTime(e,t,n),this}setValueCurveAtTime(e,t,n,a){return this._param.setValueCurveAtTime(e,t,n,a),this}cancelScheduledValues(e){return this._param.cancelScheduledValues(e),this}cancelAndHoldAtTime(e){return this._param.cancelAndHoldAtTime(e),this}rampTo(e,t,n){return this._param.rampTo(e,t,n),this}get value(){return this._param.value}set value(e){this._param.value=e}get convert(){return this._param.convert}set convert(e){this._param.convert=e}get units(){return this._param.units}get overridden(){return this._param.overridden}set overridden(e){this._param.overridden=e}get maxValue(){return this._param.maxValue}get minValue(){return this._param.minValue}apply(e){return this._param.apply(e),this}}function zs(e,t,n,a){(t instanceof Cs||Si(t)||t instanceof Ds&&t.override)&&(t.cancelScheduledValues(0),t.setValueAtTime(0,0),t instanceof Ds&&(t.overridden=!0)),_s(e,t,n,a)}class Os extends Cs{constructor(){super(Di(Os.getDefaults(),arguments,["value"])),this.name="TickParam",this._events=new Ui(1/0),this._multiplier=1;const e=Di(Os.getDefaults(),arguments,["value"]);this._multiplier=e.multiplier,this._events.cancel(0),this._events.add({ticks:0,time:0,type:"setValueAtTime",value:this._fromType(e.value)}),this.setValueAtTime(e.value,0)}static getDefaults(){return Object.assign(Cs.getDefaults(),{multiplier:1,units:"hertz",value:1})}setTargetAtTime(e,t,n){t=this.toSeconds(t),this.setRampPoint(t);const a=this._fromType(e),i=this._events.get(t),s=Math.round(Math.max(1/n,1));for(let e=0;e<=s;e++){const s=n*e+t,r=this._exponentialApproach(i.time,i.value,a,n,s);this.linearRampToValueAtTime(this._toType(r),s)}return this}setValueAtTime(e,t){const n=this.toSeconds(t);super.setValueAtTime(e,t);const a=this._events.get(n),i=this._events.previousEvent(a),s=this._getTicksUntilEvent(i,n);return a.ticks=Math.max(s,0),this}linearRampToValueAtTime(e,t){const n=this.toSeconds(t);super.linearRampToValueAtTime(e,t);const a=this._events.get(n),i=this._events.previousEvent(a),s=this._getTicksUntilEvent(i,n);return a.ticks=Math.max(s,0),this}exponentialRampToValueAtTime(e,t){t=this.toSeconds(t);const n=this._fromType(e),a=this._events.get(t),i=Math.round(Math.max(10*(t-a.time),1)),s=(t-a.time)/i;for(let e=0;e<=i;e++){const i=s*e+a.time,r=this._exponentialInterpolate(a.time,a.value,t,n,i);this.linearRampToValueAtTime(this._toType(r),i)}return this}_getTicksUntilEvent(e,t){if(null===e)e={ticks:0,time:0,type:"setValueAtTime",value:0};else if(hi(e.ticks)){const t=this._events.previousEvent(e);e.ticks=this._getTicksUntilEvent(t,e.time)}const n=this._fromType(this.getValueAtTime(e.time));let a=this._fromType(this.getValueAtTime(t));const i=this._events.get(t);return i&&i.time===t&&"setValueAtTime"===i.type&&(a=this._fromType(this.getValueAtTime(t-this.sampleTime))),.5*(t-e.time)*(n+a)+e.ticks}getTicksAtTime(e){const t=this.toSeconds(e),n=this._events.get(t);return Math.max(this._getTicksUntilEvent(n,t),0)}getDurationOfTicks(e,t){const n=this.toSeconds(t),a=this.getTicksAtTime(t);return this.getTimeOfTick(a+e)-n}getTimeOfTick(e){const t=this._events.get(e,"ticks"),n=this._events.getAfter(e,"ticks");if(t&&t.ticks===e)return t.time;if(t&&n&&"linearRampToValueAtTime"===n.type&&t.value!==n.value){const a=this._fromType(this.getValueAtTime(t.time)),i=(this._fromType(this.getValueAtTime(n.time))-a)/(n.time-t.time),s=Math.sqrt(Math.pow(a,2)-2*i*(t.ticks-e)),r=(-a+s)/i;return(r>0?r:(-a-s)/i)+t.time}return t?0===t.value?1/0:t.time+(e-t.ticks)/t.value:e/this._initialValue}ticksToTime(e,t){return this.getDurationOfTicks(e,t)}timeToTicks(e,t){const n=this.toSeconds(t),a=this.toSeconds(e),i=this.getTicksAtTime(n);return this.getTicksAtTime(n+a)-i}_fromType(e){return"bpm"===this.units&&this.multiplier?1/(60/e/this.multiplier):super._fromType(e)}_toType(e){return"bpm"===this.units&&this.multiplier?e/this.multiplier*60:super._toType(e)}get multiplier(){return this._multiplier}set multiplier(e){const t=this.value;this._multiplier=e,this.cancelScheduledValues(0),this.setValueAtTime(t,0)}}class Ms extends Ds{constructor(){super(Di(Ms.getDefaults(),arguments,["value"])),this.name="TickSignal";const e=Di(Ms.getDefaults(),arguments,["value"]);this.input=this._param=new Os({context:this.context,convert:e.convert,multiplier:e.multiplier,param:this._constantSource.offset,units:e.units,value:e.value})}static getDefaults(){return Object.assign(Ds.getDefaults(),{multiplier:1,units:"hertz",value:1})}ticksToTime(e,t){return this._param.ticksToTime(e,t)}timeToTicks(e,t){return this._param.timeToTicks(e,t)}getTimeOfTick(e){return this._param.getTimeOfTick(e)}getDurationOfTicks(e,t){return this._param.getDurationOfTicks(e,t)}getTicksAtTime(e){return this._param.getTicksAtTime(e)}get multiplier(){return this._param.multiplier}set multiplier(e){this._param.multiplier=e}dispose(){return super.dispose(),this._param.dispose(),this}}class Bs extends As{constructor(){super(Di(Bs.getDefaults(),arguments,["frequency"])),this.name="TickSource",this._state=new xs,this._tickOffset=new Ui;const e=Di(Bs.getDefaults(),arguments,["frequency"]);this.frequency=new Ms({context:this.context,units:e.units,value:e.frequency}),Xi(this,"frequency"),this._state.setStateAtTime("stopped",0),this.setTicksAtTime(0,0)}static getDefaults(){return Object.assign({frequency:1,units:"hertz"},As.getDefaults())}get state(){return this.getStateAtTime(this.now())}start(e,t){const n=this.toSeconds(e);return"started"!==this._state.getValueAtTime(n)&&(this._state.setStateAtTime("started",n),di(t)&&this.setTicksAtTime(t,n)),this}stop(e){const t=this.toSeconds(e);if("stopped"===this._state.getValueAtTime(t)){const e=this._state.get(t);e&&e.time>0&&(this._tickOffset.cancel(e.time),this._state.cancel(e.time))}return this._state.cancel(t),this._state.setStateAtTime("stopped",t),this.setTicksAtTime(0,t),this}pause(e){const t=this.toSeconds(e);return"started"===this._state.getValueAtTime(t)&&this._state.setStateAtTime("paused",t),this}cancel(e){return e=this.toSeconds(e),this._state.cancel(e),this._tickOffset.cancel(e),this}getTicksAtTime(e){const t=this.toSeconds(e),n=this._state.getLastState("stopped",t),a={state:"paused",time:t};this._state.add(a);let i=n,s=0;return this._state.forEachBetween(n.time,t+this.sampleTime,(e=>{let t=i.time;const n=this._tickOffset.get(e.time);n&&n.time>=i.time&&(s=n.ticks,t=n.time),"started"===i.state&&"started"!==e.state&&(s+=this.frequency.getTicksAtTime(e.time)-this.frequency.getTicksAtTime(t)),i=e})),this._state.remove(a),s}get ticks(){return this.getTicksAtTime(this.now())}set ticks(e){this.setTicksAtTime(e,this.now())}get seconds(){return this.getSecondsAtTime(this.now())}set seconds(e){const t=this.now(),n=this.frequency.timeToTicks(e,t);this.setTicksAtTime(n,t)}getSecondsAtTime(e){e=this.toSeconds(e);const t=this._state.getLastState("stopped",e),n={state:"paused",time:e};this._state.add(n);let a=t,i=0;return this._state.forEachBetween(t.time,e+this.sampleTime,(e=>{let t=a.time;const n=this._tickOffset.get(e.time);n&&n.time>=a.time&&(i=n.seconds,t=n.time),"started"===a.state&&"started"!==e.state&&(i+=e.time-t),a=e})),this._state.remove(n),i}setTicksAtTime(e,t){return t=this.toSeconds(t),this._tickOffset.cancel(t),this._tickOffset.add({seconds:this.frequency.getDurationOfTicks(e,t),ticks:e,time:t}),this}getStateAtTime(e){return e=this.toSeconds(e),this._state.getValueAtTime(e)}getTimeOfTick(e,t=this.now()){const n=this._tickOffset.get(t),a=this._state.get(t),i=Math.max(n.time,a.time),s=this.frequency.getTicksAtTime(i)+e-n.ticks;return this.frequency.getTimeOfTick(s)}forEachTickBetween(e,t,n){let a=this._state.get(e);this._state.forEachBetween(e,t,(t=>{a&&"started"===a.state&&"started"!==t.state&&this.forEachTickBetween(Math.max(a.time,e),t.time-this.sampleTime,n),a=t}));let i=null;if(a&&"started"===a.state){const s=Math.max(a.time,e),r=this.frequency.getTicksAtTime(s),o=r-this.frequency.getTicksAtTime(a.time);let l=Math.ceil(o)-o;l=ji(l,1)?0:l;let u=this.frequency.getTimeOfTick(r+l);for(;u{switch(e.state){case"started":const t=this._tickSource.getTicksAtTime(e.time);this.emit("start",e.time,t);break;case"stopped":0!==e.time&&this.emit("stop",e.time);break;case"paused":this.emit("pause",e.time)}})),this._tickSource.forEachTickBetween(e,t,((e,t)=>{this.callback(e,t)})))}getStateAtTime(e){const t=this.toSeconds(e);return this._state.getValueAtTime(t)}dispose(){return super.dispose(),this.context.off("tick",this._boundLoop),this._tickSource.dispose(),this._state.dispose(),this}}Ki.mixin(Fs);class Ls extends Ss{constructor(){super(Di(Ls.getDefaults(),arguments,["delayTime","maxDelay"])),this.name="Delay";const e=Di(Ls.getDefaults(),arguments,["delayTime","maxDelay"]),t=this.toSeconds(e.maxDelay);this._maxDelay=Math.max(t,this.toSeconds(e.delayTime)),this._delayNode=this.input=this.output=this.context.createDelay(t),this.delayTime=new Cs({context:this.context,param:this._delayNode.delayTime,units:"time",value:e.delayTime,minValue:0,maxValue:this.maxDelay}),Xi(this,"delayTime")}static getDefaults(){return Object.assign(Ss.getDefaults(),{delayTime:0,maxDelay:1})}get maxDelay(){return this._maxDelay}dispose(){return super.dispose(),this._delayNode.disconnect(),this.delayTime.dispose(),this}}function Ps(e,t,n=2,a=as().sampleRate){return xi(this,void 0,void 0,(function*(){const i=as(),s=new es(n,t,a);is(s),yield e(s);const r=s.render();is(i);const o=yield r;return new Ji(o)}))}class js extends Mi{constructor(){super(),this.name="ToneAudioBuffers",this._buffers=new Map,this._loadingCount=0;const e=Di(js.getDefaults(),arguments,["urls","onload","baseUrl"],"urls");this.baseUrl=e.baseUrl,Object.keys(e.urls).forEach((t=>{this._loadingCount++;const n=e.urls[t];this.add(t,n,this._bufferLoaded.bind(this,e.onload),e.onerror)}))}static getDefaults(){return{baseUrl:"",onerror:Qi,onload:Qi,urls:{}}}has(e){return this._buffers.has(e.toString())}get(e){return ii(this.has(e),`ToneAudioBuffers has no buffer named: ${e}`),this._buffers.get(e.toString())}_bufferLoaded(e){this._loadingCount--,0===this._loadingCount&&e&&e()}get loaded(){return Array.from(this._buffers).every((([e,t])=>t.loaded))}add(e,t,n=Qi,a=Qi){return bi(t)?this._buffers.set(e.toString(),new Ji(this.baseUrl+t,n,a)):this._buffers.set(e.toString(),new Ji(t,n,a)),this}dispose(){return super.dispose(),this._buffers.forEach((e=>e.dispose())),this._buffers.clear(),this}}class Vs extends gs{constructor(){super(...arguments),this.name="MidiClass",this.defaultUnits="midi"}_frequencyToUnits(e){return cs(super._frequencyToUnits(e))}_ticksToUnits(e){return cs(super._ticksToUnits(e))}_beatsToUnits(e){return cs(super._beatsToUnits(e))}_secondsToUnits(e){return cs(super._secondsToUnits(e))}toMidi(){return this.valueOf()}toFrequency(){return ds(this.toMidi())}transpose(e){return new Vs(this.context,this.toMidi()+e)}}function Us(e,t){return new Vs(as(),e,t)}class Ws extends ks{constructor(){super(...arguments),this.name="Ticks",this.defaultUnits="i"}_now(){return this.context.transport.ticks}_beatsToUnits(e){return this._getPPQ()*e}_secondsToUnits(e){return Math.floor(e/(60/this._getBpm())*this._getPPQ())}_ticksToUnits(e){return e}toTicks(){return this.valueOf()}toSeconds(){return this.valueOf()/this._getPPQ()*(60/this._getBpm())}}function Gs(e,t){return new Ws(as(),e,t)}class qs extends As{constructor(){super(...arguments),this.name="Draw",this.expiration=.25,this.anticipation=.008,this._events=new Ui,this._boundDrawLoop=this._drawLoop.bind(this),this._animationFrame=-1}schedule(e,t){return this._events.add({callback:e,time:this.toSeconds(t)}),1===this._events.length&&(this._animationFrame=requestAnimationFrame(this._boundDrawLoop)),this}cancel(e){return this._events.cancel(this.toSeconds(e)),this}_drawLoop(){const e=this.context.currentTime;for(;this._events.length&&this._events.peek().time-this.anticipation<=e;){const t=this._events.shift();t&&e-t.time<=this.expiration&&t.callback()}this._events.length>0&&(this._animationFrame=requestAnimationFrame(this._boundDrawLoop))}dispose(){return super.dispose(),this._events.dispose(),cancelAnimationFrame(this._animationFrame),this}}Gi((e=>{e.draw=new qs({context:e})})),Hi((e=>{e.draw.dispose()}));class Hs extends Mi{constructor(){super(...arguments),this.name="IntervalTimeline",this._root=null,this._length=0}add(e){ii(di(e.time),"Events must have a time property"),ii(di(e.duration),"Events must have a duration parameter"),e.time=e.time.valueOf();let t=new Ks(e.time,e.time+e.duration,e);for(null===this._root?this._root=t:this._root.insert(t),this._length++;null!==t;)t.updateHeight(),t.updateMax(),this._rebalance(t),t=t.parent;return this}remove(e){if(null!==this._root){const t=[];this._root.search(e.time,t);for(const n of t)if(n.event===e){this._removeNode(n),this._length--;break}}return this}get length(){return this._length}cancel(e){return this.forEachFrom(e,(e=>this.remove(e))),this}_setRoot(e){this._root=e,null!==this._root&&(this._root.parent=null)}_replaceNodeInParent(e,t){null!==e.parent?(e.isLeftChild()?e.parent.left=t:e.parent.right=t,this._rebalance(e.parent)):this._setRoot(t)}_removeNode(e){if(null===e.left&&null===e.right)this._replaceNodeInParent(e,null);else if(null===e.right)this._replaceNodeInParent(e,e.left);else if(null===e.left)this._replaceNodeInParent(e,e.right);else{let t,n=null;if(e.getBalance()>0)if(null===e.left.right)t=e.left,t.right=e.right,n=t;else{for(t=e.left.right;null!==t.right;)t=t.right;t.parent&&(t.parent.right=t.left,n=t.parent,t.left=e.left,t.right=e.right)}else if(null===e.right.left)t=e.right,t.left=e.left,n=t;else{for(t=e.right.left;null!==t.left;)t=t.left;t.parent&&(t.parent.left=t.right,n=t.parent,t.left=e.left,t.right=e.right)}null!==e.parent?e.isLeftChild()?e.parent.left=t:e.parent.right=t:this._setRoot(t),n&&this._rebalance(n)}e.dispose()}_rotateLeft(e){const t=e.parent,n=e.isLeftChild(),a=e.right;a&&(e.right=a.left,a.left=e),null!==t?n?t.left=a:t.right=a:this._setRoot(a)}_rotateRight(e){const t=e.parent,n=e.isLeftChild(),a=e.left;a&&(e.left=a.right,a.right=e),null!==t?n?t.left=a:t.right=a:this._setRoot(a)}_rebalance(e){const t=e.getBalance();t>1&&e.left?e.left.getBalance()<0?this._rotateLeft(e.left):this._rotateRight(e):t<-1&&e.right&&(e.right.getBalance()>0?this._rotateRight(e.right):this._rotateLeft(e))}get(e){if(null!==this._root){const t=[];if(this._root.search(e,t),t.length>0){let e=t[0];for(let n=1;ne.low&&(e=t[n]);return e.event}}return null}forEach(e){if(null!==this._root){const t=[];this._root.traverse((e=>t.push(e))),t.forEach((t=>{t.event&&e(t.event)}))}return this}forEachAtTime(e,t){if(null!==this._root){const n=[];this._root.search(e,n),n.forEach((e=>{e.event&&t(e.event)}))}return this}forEachFrom(e,t){if(null!==this._root){const n=[];this._root.searchAfter(e,n),n.forEach((e=>{e.event&&t(e.event)}))}return this}dispose(){return super.dispose(),null!==this._root&&this._root.traverse((e=>e.dispose())),this._root=null,this}}class Ks{constructor(e,t,n){this._left=null,this._right=null,this.parent=null,this.height=0,this.event=n,this.low=e,this.high=t,this.max=this.high}insert(e){e.low<=this.low?null===this.left?this.left=e:this.left.insert(e):null===this.right?this.right=e:this.right.insert(e)}search(e,t){e>this.max||(null!==this.left&&this.left.search(e,t),this.low<=e&&this.high>e&&t.push(this),this.low>e||null!==this.right&&this.right.search(e,t))}searchAfter(e,t){this.low>=e&&(t.push(this),null!==this.left&&this.left.searchAfter(e,t)),null!==this.right&&this.right.searchAfter(e,t)}traverse(e){e(this),null!==this.left&&this.left.traverse(e),null!==this.right&&this.right.traverse(e)}updateHeight(){null!==this.left&&null!==this.right?this.height=Math.max(this.left.height,this.right.height)+1:null!==this.right?this.height=this.right.height+1:null!==this.left?this.height=this.left.height+1:this.height=0}updateMax(){this.max=this.high,null!==this.left&&(this.max=Math.max(this.max,this.left.max)),null!==this.right&&(this.max=Math.max(this.max,this.right.max))}getBalance(){let e=0;return null!==this.left&&null!==this.right?e=this.left.height-this.right.height:null!==this.left?e=this.left.height+1:null!==this.right&&(e=-(this.right.height+1)),e}isLeftChild(){return null!==this.parent&&this.parent.left===this}get left(){return this._left}set left(e){this._left=e,null!==e&&(e.parent=this),this.updateHeight(),this.updateMax()}get right(){return this._right}set right(e){this._right=e,null!==e&&(e.parent=this),this.updateHeight(),this.updateMax()}dispose(){this.parent=null,this._left=null,this._right=null,this.event=null}}class $s extends Ss{constructor(){super(Di($s.getDefaults(),arguments,["volume"])),this.name="Volume";const e=Di($s.getDefaults(),arguments,["volume"]);this.input=this.output=new Is({context:this.context,gain:e.volume,units:"decibels"}),this.volume=this.output.gain,Xi(this,"volume"),this._unmutedVolume=e.volume,this.mute=e.mute}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,volume:0})}get mute(){return this.volume.value===-1/0}set mute(e){!this.mute&&e?(this._unmutedVolume=this.volume.value,this.volume.value=-1/0):this.mute&&!e&&(this.volume.value=this._unmutedVolume)}dispose(){return super.dispose(),this.input.dispose(),this.volume.dispose(),this}}class Zs extends Ss{constructor(){super(Di(Zs.getDefaults(),arguments)),this.name="Destination",this.input=new $s({context:this.context}),this.output=new Is({context:this.context}),this.volume=this.input.volume;const e=Di(Zs.getDefaults(),arguments);Es(this.input,this.output,this.context.rawContext.destination),this.mute=e.mute,this._internalChannels=[this.input,this.context.rawContext.destination,this.output]}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,volume:0})}get mute(){return this.input.mute}set mute(e){this.input.mute=e}chain(...e){return this.input.disconnect(),e.unshift(this.input),e.push(this.output),Es(...e),this}get maxChannelCount(){return this.context.rawContext.destination.maxChannelCount}dispose(){return super.dispose(),this.volume.dispose(),this}}Gi((e=>{e.destination=new Zs({context:e})})),Hi((e=>{e.destination.dispose()}));class Xs extends Mi{constructor(e){super(),this.name="TimelineValue",this._timeline=new Ui({memory:10}),this._initialValue=e}set(e,t){return this._timeline.add({value:e,time:t}),this}get(e){const t=this._timeline.get(e);return t?t.value:this._initialValue}}class Ys{constructor(e,t){this.id=Ys._eventId++;const n=Object.assign(Ys.getDefaults(),t);this.transport=e,this.callback=n.callback,this._once=n.once,this.time=n.time}static getDefaults(){return{callback:Qi,once:!1,time:0}}invoke(e){this.callback&&(this.callback(e),this._once&&this.transport.clear(this.id))}dispose(){return this.callback=void 0,this}}Ys._eventId=0;class Qs extends Ys{constructor(e,t){super(e,t),this._currentId=-1,this._nextId=-1,this._nextTick=this.time,this._boundRestart=this._restart.bind(this);const n=Object.assign(Qs.getDefaults(),t);this.duration=new Ws(e.context,n.duration).valueOf(),this._interval=new Ws(e.context,n.interval).valueOf(),this._nextTick=n.time,this.transport.on("start",this._boundRestart),this.transport.on("loopStart",this._boundRestart),this.context=this.transport.context,this._restart()}static getDefaults(){return Object.assign({},Ys.getDefaults(),{duration:1/0,interval:1,once:!1})}invoke(e){this._createEvents(e),super.invoke(e)}_createEvents(e){const t=this.transport.getTicksAtTime(e);t>=this.time&&t>=this._nextTick&&this._nextTick+this._intervalthis.time&&(this._nextTick=this.time+Math.ceil((t-this.time)/this._interval)*this._interval),this._currentId=this.transport.scheduleOnce(this.invoke.bind(this),new Ws(this.context,this._nextTick).toSeconds()),this._nextTick+=this._interval,this._nextId=this.transport.scheduleOnce(this.invoke.bind(this),new Ws(this.context,this._nextTick).toSeconds())}dispose(){return super.dispose(),this.transport.clear(this._currentId),this.transport.clear(this._nextId),this.transport.off("start",this._boundRestart),this.transport.off("loopStart",this._boundRestart),this}}class Js extends As{constructor(){super(Di(Js.getDefaults(),arguments)),this.name="Transport",this._loop=new Xs(!1),this._loopStart=0,this._loopEnd=0,this._scheduledEvents={},this._timeline=new Ui,this._repeatedEvents=new Hs,this._syncedSignals=[],this._swingAmount=0;const e=Di(Js.getDefaults(),arguments);this._ppq=e.ppq,this._clock=new Fs({callback:this._processTick.bind(this),context:this.context,frequency:0,units:"bpm"}),this._bindClockEvents(),this.bpm=this._clock.frequency,this._clock.frequency.multiplier=e.ppq,this.bpm.setValueAtTime(e.bpm,0),Xi(this,"bpm"),this._timeSignature=e.timeSignature,this._swingTicks=e.ppq/2}static getDefaults(){return Object.assign(As.getDefaults(),{bpm:120,loopEnd:"4m",loopStart:0,ppq:192,swing:0,swingSubdivision:"8n",timeSignature:4})}_processTick(e,t){if(this._loop.get(e)&&t>=this._loopEnd&&(this.emit("loopEnd",e),this._clock.setTicksAtTime(this._loopStart,e),t=this._loopStart,this.emit("loopStart",e,this._clock.getSecondsAtTime(e)),this.emit("loop",e)),this._swingAmount>0&&t%this._ppq!=0&&t%(2*this._swingTicks)!=0){const n=t%(2*this._swingTicks)/(2*this._swingTicks),a=Math.sin(n*Math.PI)*this._swingAmount;e+=new Ws(this.context,2*this._swingTicks/3).toSeconds()*a}this._timeline.forEachAtTime(t,(t=>t.invoke(e)))}schedule(e,t){const n=new Ys(this,{callback:e,time:new ks(this.context,t).toTicks()});return this._addEvent(n,this._timeline)}scheduleRepeat(e,t,n,a=1/0){const i=new Qs(this,{callback:e,duration:new ms(this.context,a).toTicks(),interval:new ms(this.context,t).toTicks(),time:new ks(this.context,n).toTicks()});return this._addEvent(i,this._repeatedEvents)}scheduleOnce(e,t){const n=new Ys(this,{callback:e,once:!0,time:new ks(this.context,t).toTicks()});return this._addEvent(n,this._timeline)}clear(e){if(this._scheduledEvents.hasOwnProperty(e)){const t=this._scheduledEvents[e.toString()];t.timeline.remove(t.event),t.event.dispose(),delete this._scheduledEvents[e.toString()]}return this}_addEvent(e,t){return this._scheduledEvents[e.id.toString()]={event:e,timeline:t},t.add(e),e.id}cancel(e=0){const t=this.toTicks(e);return this._timeline.forEachFrom(t,(e=>this.clear(e.id))),this._repeatedEvents.forEachFrom(t,(e=>this.clear(e.id))),this}_bindClockEvents(){this._clock.on("start",((e,t)=>{t=new Ws(this.context,t).toSeconds(),this.emit("start",e,t)})),this._clock.on("stop",(e=>{this.emit("stop",e)})),this._clock.on("pause",(e=>{this.emit("pause",e)}))}get state(){return this._clock.getStateAtTime(this.now())}start(e,t){let n;return di(t)&&(n=this.toTicks(t)),this._clock.start(e,n),this}stop(e){return this._clock.stop(e),this}pause(e){return this._clock.pause(e),this}toggle(e){return e=this.toSeconds(e),"started"!==this._clock.getStateAtTime(e)?this.start(e):this.stop(e),this}get timeSignature(){return this._timeSignature}set timeSignature(e){yi(e)&&(e=e[0]/e[1]*4),this._timeSignature=e}get loopStart(){return new ms(this.context,this._loopStart,"i").toSeconds()}set loopStart(e){this._loopStart=this.toTicks(e)}get loopEnd(){return new ms(this.context,this._loopEnd,"i").toSeconds()}set loopEnd(e){this._loopEnd=this.toTicks(e)}get loop(){return this._loop.get(this.now())}set loop(e){this._loop.set(e,this.now())}setLoopPoints(e,t){return this.loopStart=e,this.loopEnd=t,this}get swing(){return this._swingAmount}set swing(e){this._swingAmount=e}get swingSubdivision(){return new Ws(this.context,this._swingTicks).toNotation()}set swingSubdivision(e){this._swingTicks=this.toTicks(e)}get position(){const e=this.now(),t=this._clock.getTicksAtTime(e);return new Ws(this.context,t).toBarsBeatsSixteenths()}set position(e){const t=this.toTicks(e);this.ticks=t}get seconds(){return this._clock.seconds}set seconds(e){const t=this.now(),n=this._clock.frequency.timeToTicks(e,t);this.ticks=n}get progress(){if(this.loop){const e=this.now();return(this._clock.getTicksAtTime(e)-this._loopStart)/(this._loopEnd-this._loopStart)}return 0}get ticks(){return this._clock.ticks}set ticks(e){if(this._clock.ticks!==e){const t=this.now();if("started"===this.state){const n=this._clock.getTicksAtTime(t),a=t+this._clock.frequency.getDurationOfTicks(Math.ceil(n)-n,t);this.emit("stop",a),this._clock.setTicksAtTime(e,a),this.emit("start",a,this._clock.getSecondsAtTime(a))}else this._clock.setTicksAtTime(e,t)}}getTicksAtTime(e){return Math.round(this._clock.getTicksAtTime(e))}getSecondsAtTime(e){return this._clock.getSecondsAtTime(e)}get PPQ(){return this._clock.frequency.multiplier}set PPQ(e){this._clock.frequency.multiplier=e}nextSubdivision(e){if(e=this.toTicks(e),"started"!==this.state)return 0;{const t=this.now(),n=e-this.getTicksAtTime(t)%e;return this._clock.nextTickTime(n,t)}}syncSignal(e,t){if(!t){const n=this.now();if(0!==e.getValueAtTime(n)){const a=1/(60/this.bpm.getValueAtTime(n)/this.PPQ);t=e.getValueAtTime(n)/a}else t=0}const n=new Is(t);return this.bpm.connect(n),n.connect(e._param),this._syncedSignals.push({initial:e.value,ratio:n,signal:e}),e.value=0,this}unsyncSignal(e){for(let t=this._syncedSignals.length-1;t>=0;t--){const n=this._syncedSignals[t];n.signal===e&&(n.ratio.dispose(),n.signal.value=n.initial,this._syncedSignals.splice(t,1))}return this}dispose(){return super.dispose(),this._clock.dispose(),Yi(this,"bpm"),this._timeline.dispose(),this._repeatedEvents.dispose(),this}}Ki.mixin(Js),Gi((e=>{e.transport=new Js({context:e})})),Hi((e=>{e.transport.dispose()}));class er extends Ss{constructor(e){super(e),this.input=void 0,this._state=new xs("stopped"),this._synced=!1,this._scheduled=[],this._syncedStart=Qi,this._syncedStop=Qi,this._state.memory=100,this._state.increasing=!0,this._volume=this.output=new $s({context:this.context,mute:e.mute,volume:e.volume}),this.volume=this._volume.volume,Xi(this,"volume"),this.onstop=e.onstop}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,onstop:Qi,volume:0})}get state(){return this._synced?"started"===this.context.transport.state?this._state.getValueAtTime(this.context.transport.seconds):"stopped":this._state.getValueAtTime(this.now())}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}_clampToCurrentTime(e){return this._synced?e:Math.max(e,this.context.currentTime)}start(e,t,n){let a=hi(e)&&this._synced?this.context.transport.seconds:this.toSeconds(e);if(a=this._clampToCurrentTime(a),this._synced||"started"!==this._state.getValueAtTime(a))if(this.log("start",a),this._state.setStateAtTime("started",a),this._synced){const e=this._state.get(a);e&&(e.offset=this.toSeconds(zi(t,0)),e.duration=n?this.toSeconds(n):void 0);const i=this.context.transport.schedule((e=>{this._start(e,t,n)}),a);this._scheduled.push(i),"started"===this.context.transport.state&&this.context.transport.getSecondsAtTime(this.immediate())>a&&this._syncedStart(this.now(),this.context.transport.seconds)}else ri(this.context),this._start(a,t,n);else ii(Fi(a,this._state.get(a).time),"Start time must be strictly greater than previous start time"),this._state.cancel(a),this._state.setStateAtTime("started",a),this.log("restart",a),this.restart(a,t,n);return this}stop(e){let t=hi(e)&&this._synced?this.context.transport.seconds:this.toSeconds(e);if(t=this._clampToCurrentTime(t),"started"===this._state.getValueAtTime(t)||di(this._state.getNextState("started",t))){if(this.log("stop",t),this._synced){const e=this.context.transport.schedule(this._stop.bind(this),t);this._scheduled.push(e)}else this._stop(t);this._state.cancel(t),this._state.setStateAtTime("stopped",t)}return this}restart(e,t,n){return e=this.toSeconds(e),"started"===this._state.getValueAtTime(e)&&(this._state.cancel(e),this._restart(e,t,n)),this}sync(){return this._synced||(this._synced=!0,this._syncedStart=(e,t)=>{if(t>0){const n=this._state.get(t);if(n&&"started"===n.state&&n.time!==t){const a=t-this.toSeconds(n.time);let i;n.duration&&(i=this.toSeconds(n.duration)-a),this._start(e,this.toSeconds(n.offset)+a,i)}}},this._syncedStop=e=>{const t=this.context.transport.getSecondsAtTime(Math.max(e-this.sampleTime,0));"started"===this._state.getValueAtTime(t)&&this._stop(e)},this.context.transport.on("start",this._syncedStart),this.context.transport.on("loopStart",this._syncedStart),this.context.transport.on("stop",this._syncedStop),this.context.transport.on("pause",this._syncedStop),this.context.transport.on("loopEnd",this._syncedStop)),this}unsync(){return this._synced&&(this.context.transport.off("stop",this._syncedStop),this.context.transport.off("pause",this._syncedStop),this.context.transport.off("loopEnd",this._syncedStop),this.context.transport.off("start",this._syncedStart),this.context.transport.off("loopStart",this._syncedStart)),this._synced=!1,this._scheduled.forEach((e=>this.context.transport.clear(e))),this._scheduled=[],this._state.cancel(0),this._stop(0),this}dispose(){return super.dispose(),this.onstop=Qi,this.unsync(),this._volume.dispose(),this._state.dispose(),this}}class tr extends Ns{constructor(){super(Di(tr.getDefaults(),arguments,["url","onload"])),this.name="ToneBufferSource",this._source=this.context.createBufferSource(),this._internalChannels=[this._source],this._sourceStarted=!1,this._sourceStopped=!1;const e=Di(tr.getDefaults(),arguments,["url","onload"]);_s(this._source,this._gainNode),this._source.onended=()=>this._stopSource(),this.playbackRate=new Cs({context:this.context,param:this._source.playbackRate,units:"positive",value:e.playbackRate}),this.loop=e.loop,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this._buffer=new Ji(e.url,e.onload,e.onerror),this._internalChannels.push(this._source)}static getDefaults(){return Object.assign(Ns.getDefaults(),{url:new Ji,loop:!1,loopEnd:0,loopStart:0,onload:Qi,onerror:Qi,playbackRate:1})}get fadeIn(){return this._fadeIn}set fadeIn(e){this._fadeIn=e}get fadeOut(){return this._fadeOut}set fadeOut(e){this._fadeOut=e}get curve(){return this._curve}set curve(e){this._curve=e}start(e,t,n,a=1){ii(this.buffer.loaded,"buffer is either not set or not loaded");const i=this.toSeconds(e);this._startGain(i,a),t=this.loop?zi(t,this.loopStart):zi(t,0);let s=Math.max(this.toSeconds(t),0);if(this.loop){const e=this.toSeconds(this.loopEnd)||this.buffer.duration,t=this.toSeconds(this.loopStart),n=e-t;Li(s,e)&&(s=(s-t)%n+t),ji(s,this.buffer.duration)&&(s=0)}if(this._source.buffer=this.buffer.get(),this._source.loopEnd=this.toSeconds(this.loopEnd)||this.buffer.duration,Pi(s,this.buffer.duration)&&(this._sourceStarted=!0,this._source.start(i,s)),di(n)){let e=this.toSeconds(n);e=Math.max(e,0),this.stop(i+e)}return this}_stopSource(e){!this._sourceStopped&&this._sourceStarted&&(this._sourceStopped=!0,this._source.stop(this.toSeconds(e)),this._onended())}get loopStart(){return this._source.loopStart}set loopStart(e){this._source.loopStart=this.toSeconds(e)}get loopEnd(){return this._source.loopEnd}set loopEnd(e){this._source.loopEnd=this.toSeconds(e)}get buffer(){return this._buffer}set buffer(e){this._buffer.set(e)}get loop(){return this._source.loop}set loop(e){this._source.loop=e,this._sourceStarted&&this.cancelStop()}dispose(){return super.dispose(),this._source.onended=null,this._source.disconnect(),this._buffer.dispose(),this.playbackRate.dispose(),this}}class nr extends er{constructor(){super(Di(nr.getDefaults(),arguments,["type"])),this.name="Noise",this._source=null;const e=Di(nr.getDefaults(),arguments,["type"]);this._playbackRate=e.playbackRate,this.type=e.type,this._fadeIn=e.fadeIn,this._fadeOut=e.fadeOut}static getDefaults(){return Object.assign(er.getDefaults(),{fadeIn:0,fadeOut:0,playbackRate:1,type:"white"})}get type(){return this._type}set type(e){if(ii(e in sr,"Noise: invalid type: "+e),this._type!==e&&(this._type=e,"started"===this.state)){const e=this.now();this._stop(e),this._start(e)}}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this._source&&(this._source.playbackRate.value=e)}_start(e){const t=sr[this._type];this._source=new tr({url:t,context:this.context,fadeIn:this._fadeIn,fadeOut:this._fadeOut,loop:!0,onended:()=>this.onstop(this),playbackRate:this._playbackRate}).connect(this.output),this._source.start(this.toSeconds(e),Math.random()*(t.duration-.001))}_stop(e){this._source&&(this._source.stop(this.toSeconds(e)),this._source=null)}get fadeIn(){return this._fadeIn}set fadeIn(e){this._fadeIn=e,this._source&&(this._source.fadeIn=this._fadeIn)}get fadeOut(){return this._fadeOut}set fadeOut(e){this._fadeOut=e,this._source&&(this._source.fadeOut=this._fadeOut)}_restart(e){this._stop(e),this._start(e)}dispose(){return super.dispose(),this._source&&this._source.disconnect(),this}}const ar=220500,ir={brown:null,pink:null,white:null},sr={get brown(){if(!ir.brown){const e=[];for(let t=0;t<2;t++){const n=new Float32Array(ar);e[t]=n;let a=0;for(let e=0;et.label===e||t.deviceId===e)),!this._device&&t.length>0&&(this._device=t[0]),ii(di(this._device),`No matching device ${e}`));const n={audio:{echoCancellation:!1,sampleRate:this.context.sampleRate,noiseSuppression:!1,mozNoiseSuppression:!1}};this._device&&(n.audio.deviceId=this._device.deviceId);const a=yield navigator.mediaDevices.getUserMedia(n);if(!this._stream){this._stream=a;const e=this.context.createMediaStreamSource(a);_s(e,this.output),this._mediaStream=e}return this}))}close(){return this._stream&&this._mediaStream&&(this._stream.getAudioTracks().forEach((e=>{e.stop()})),this._stream=void 0,this._mediaStream.disconnect(),this._mediaStream=void 0),this._device=void 0,this}static enumerateDevices(){return xi(this,void 0,void 0,(function*(){return(yield navigator.mediaDevices.enumerateDevices()).filter((e=>"audioinput"===e.kind))}))}get state(){return this._stream&&this._stream.active?"started":"stopped"}get deviceId(){return this._device?this._device.deviceId:void 0}get groupId(){return this._device?this._device.groupId:void 0}get label(){return this._device?this._device.label:void 0}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}dispose(){return super.dispose(),this.close(),this._volume.dispose(),this.volume.dispose(),this}static get supported(){return di(navigator.mediaDevices)&&di(navigator.mediaDevices.getUserMedia)}}function or(e,t){return xi(this,void 0,void 0,(function*(){const n=t/e.context.sampleRate,a=new es(1,n,e.context.sampleRate);new e.constructor(Object.assign(e.get(),{frequency:2/n,detune:0,context:a})).toDestination().start(0);return(yield a.render()).getChannelData(0)}))}class lr extends Ns{constructor(){super(Di(lr.getDefaults(),arguments,["frequency","type"])),this.name="ToneOscillatorNode",this._oscillator=this.context.createOscillator(),this._internalChannels=[this._oscillator];const e=Di(lr.getDefaults(),arguments,["frequency","type"]);_s(this._oscillator,this._gainNode),this.type=e.type,this.frequency=new Cs({context:this.context,param:this._oscillator.frequency,units:"frequency",value:e.frequency}),this.detune=new Cs({context:this.context,param:this._oscillator.detune,units:"cents",value:e.detune}),Xi(this,["frequency","detune"])}static getDefaults(){return Object.assign(Ns.getDefaults(),{detune:0,frequency:440,type:"sine"})}start(e){const t=this.toSeconds(e);return this.log("start",t),this._startGain(t),this._oscillator.start(t),this}_stopSource(e){this._oscillator.stop(e)}setPeriodicWave(e){return this._oscillator.setPeriodicWave(e),this}get type(){return this._oscillator.type}set type(e){this._oscillator.type=e}dispose(){return super.dispose(),"started"===this.state&&this.stop(),this._oscillator.disconnect(),this.frequency.dispose(),this.detune.dispose(),this}}class ur extends er{constructor(){super(Di(ur.getDefaults(),arguments,["frequency","type"])),this.name="Oscillator",this._oscillator=null;const e=Di(ur.getDefaults(),arguments,["frequency","type"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),Xi(this,"frequency"),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),Xi(this,"detune"),this._partials=e.partials,this._partialCount=e.partialCount,this._type=e.type,e.partialCount&&"custom"!==e.type&&(this._type=this.baseType+e.partialCount.toString()),this.phase=e.phase}static getDefaults(){return Object.assign(er.getDefaults(),{detune:0,frequency:440,partialCount:0,partials:[],phase:0,type:"sine"})}_start(e){const t=this.toSeconds(e),n=new lr({context:this.context,onended:()=>this.onstop(this)});this._oscillator=n,this._wave?this._oscillator.setPeriodicWave(this._wave):this._oscillator.type=this._type,this._oscillator.connect(this.output),this.frequency.connect(this._oscillator.frequency),this.detune.connect(this._oscillator.detune),this._oscillator.start(t)}_stop(e){const t=this.toSeconds(e);this._oscillator&&this._oscillator.stop(t)}_restart(e){const t=this.toSeconds(e);return this.log("restart",t),this._oscillator&&this._oscillator.cancelStop(),this._state.cancel(t),this}syncFrequency(){return this.context.transport.syncSignal(this.frequency),this}unsyncFrequency(){return this.context.transport.unsyncSignal(this.frequency),this}_getCachedPeriodicWave(){if("custom"===this._type){return ur._periodicWaveCache.find((e=>{return e.phase===this._phase&&(t=e.partials,n=this._partials,t.length===n.length&&t.every(((e,t)=>n[t]===e)));var t,n}))}{const e=ur._periodicWaveCache.find((e=>e.type===this._type&&e.phase===this._phase));return this._partialCount=e?e.partialCount:this._partialCount,e}}get type(){return this._type}set type(e){this._type=e;const t=-1!==["sine","square","sawtooth","triangle"].indexOf(e);if(0===this._phase&&t)this._wave=void 0,this._partialCount=0,null!==this._oscillator&&(this._oscillator.type=e);else{const t=this._getCachedPeriodicWave();if(di(t)){const{partials:e,wave:n}=t;this._wave=n,this._partials=e,null!==this._oscillator&&this._oscillator.setPeriodicWave(this._wave)}else{const[t,n]=this._getRealImaginary(e,this._phase),a=this.context.createPeriodicWave(t,n);this._wave=a,null!==this._oscillator&&this._oscillator.setPeriodicWave(this._wave),ur._periodicWaveCache.push({imag:n,partialCount:this._partialCount,partials:this._partials,phase:this._phase,real:t,type:this._type,wave:this._wave}),ur._periodicWaveCache.length>100&&ur._periodicWaveCache.shift()}}}get baseType(){return this._type.replace(this.partialCount.toString(),"")}set baseType(e){this.partialCount&&"custom"!==this._type&&"custom"!==e?this.type=e+this.partialCount:this.type=e}get partialCount(){return this._partialCount}set partialCount(e){si(e,0);let t=this._type;const n=/^(sine|triangle|square|sawtooth)(\d+)$/.exec(this._type);if(n&&(t=n[1]),"custom"!==this._type)this.type=0===e?t:t+e.toString();else{const t=new Float32Array(e);this._partials.forEach(((e,n)=>t[n]=e)),this._partials=Array.from(t),this.type=this._type}}_getRealImaginary(e,t){let n=2048;const a=new Float32Array(n),i=new Float32Array(n);let s=1;if("custom"===e){if(s=this._partials.length+1,this._partialCount=this._partials.length,n=s,0===this._partials.length)return[a,i]}else{const t=/^(sine|triangle|square|sawtooth)(\d+)$/.exec(e);t?(s=parseInt(t[2],10)+1,this._partialCount=parseInt(t[2],10),e=t[1],s=Math.max(s,2),n=s):this._partialCount=0,this._partials=[]}for(let r=1;r>1&1?-1:1):0,this._partials[r-1]=o;break;case"custom":o=this._partials[r-1];break;default:throw new TypeError("Oscillator: invalid type: "+e)}0!==o?(a[r]=-o*Math.sin(t*r),i[r]=o*Math.cos(t*r)):(a[r]=0,i[r]=0)}return[a,i]}_inverseFFT(e,t,n){let a=0;const i=e.length;for(let s=0;st.includes(e))),"oversampling must be either 'none', '2x', or '4x'"),this._shaper.oversample=e}dispose(){return super.dispose(),this._shaper.disconnect(),this}}class dr extends cr{constructor(){super(...arguments),this.name="AudioToGain",this._norm=new hr({context:this.context,mapping:e=>(e+1)/2}),this.input=this._norm,this.output=this._norm}dispose(){return super.dispose(),this._norm.dispose(),this}}class pr extends Ds{constructor(){super(Object.assign(Di(pr.getDefaults(),arguments,["value"]))),this.name="Multiply",this.override=!1;const e=Di(pr.getDefaults(),arguments,["value"]);this._mult=this.input=this.output=new Is({context:this.context,minValue:e.minValue,maxValue:e.maxValue}),this.factor=this._param=this._mult.gain,this.factor.setValueAtTime(e.value,0)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._mult.dispose(),this}}class mr extends er{constructor(){super(Di(mr.getDefaults(),arguments,["frequency","type","modulationType"])),this.name="AMOscillator",this._modulationScale=new dr({context:this.context}),this._modulationNode=new Is({context:this.context});const e=Di(mr.getDefaults(),arguments,["frequency","type","modulationType"]);this._carrier=new ur({context:this.context,detune:e.detune,frequency:e.frequency,onstop:()=>this.onstop(this),phase:e.phase,type:e.type}),this.frequency=this._carrier.frequency,this.detune=this._carrier.detune,this._modulator=new ur({context:this.context,phase:e.phase,type:e.modulationType}),this.harmonicity=new pr({context:this.context,units:"positive",value:e.harmonicity}),this.frequency.chain(this.harmonicity,this._modulator.frequency),this._modulator.chain(this._modulationScale,this._modulationNode.gain),this._carrier.chain(this._modulationNode,this.output),Xi(this,["frequency","detune","harmonicity"])}static getDefaults(){return Object.assign(ur.getDefaults(),{harmonicity:1,modulationType:"square"})}_start(e){this._modulator.start(e),this._carrier.start(e)}_stop(e){this._modulator.stop(e),this._carrier.stop(e)}_restart(e){this._modulator.restart(e),this._carrier.restart(e)}get type(){return this._carrier.type}set type(e){this._carrier.type=e}get baseType(){return this._carrier.baseType}set baseType(e){this._carrier.baseType=e}get partialCount(){return this._carrier.partialCount}set partialCount(e){this._carrier.partialCount=e}get modulationType(){return this._modulator.type}set modulationType(e){this._modulator.type=e}get phase(){return this._carrier.phase}set phase(e){this._carrier.phase=e,this._modulator.phase=e}get partials(){return this._carrier.partials}set partials(e){this._carrier.partials=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.frequency.dispose(),this.detune.dispose(),this.harmonicity.dispose(),this._carrier.dispose(),this._modulator.dispose(),this._modulationNode.dispose(),this._modulationScale.dispose(),this}}class fr extends er{constructor(){super(Di(fr.getDefaults(),arguments,["frequency","type","modulationType"])),this.name="FMOscillator",this._modulationNode=new Is({context:this.context,gain:0});const e=Di(fr.getDefaults(),arguments,["frequency","type","modulationType"]);this._carrier=new ur({context:this.context,detune:e.detune,frequency:0,onstop:()=>this.onstop(this),phase:e.phase,type:e.type}),this.detune=this._carrier.detune,this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),this._modulator=new ur({context:this.context,phase:e.phase,type:e.modulationType}),this.harmonicity=new pr({context:this.context,units:"positive",value:e.harmonicity}),this.modulationIndex=new pr({context:this.context,units:"positive",value:e.modulationIndex}),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.frequency.chain(this.modulationIndex,this._modulationNode),this._modulator.connect(this._modulationNode.gain),this._modulationNode.connect(this._carrier.frequency),this._carrier.connect(this.output),this.detune.connect(this._modulator.detune),Xi(this,["modulationIndex","frequency","detune","harmonicity"])}static getDefaults(){return Object.assign(ur.getDefaults(),{harmonicity:1,modulationIndex:2,modulationType:"square"})}_start(e){this._modulator.start(e),this._carrier.start(e)}_stop(e){this._modulator.stop(e),this._carrier.stop(e)}_restart(e){return this._modulator.restart(e),this._carrier.restart(e),this}get type(){return this._carrier.type}set type(e){this._carrier.type=e}get baseType(){return this._carrier.baseType}set baseType(e){this._carrier.baseType=e}get partialCount(){return this._carrier.partialCount}set partialCount(e){this._carrier.partialCount=e}get modulationType(){return this._modulator.type}set modulationType(e){this._modulator.type=e}get phase(){return this._carrier.phase}set phase(e){this._carrier.phase=e,this._modulator.phase=e}get partials(){return this._carrier.partials}set partials(e){this._carrier.partials=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.frequency.dispose(),this.harmonicity.dispose(),this._carrier.dispose(),this._modulator.dispose(),this._modulationNode.dispose(),this.modulationIndex.dispose(),this}}class gr extends er{constructor(){super(Di(gr.getDefaults(),arguments,["frequency","width"])),this.name="PulseOscillator",this._widthGate=new Is({context:this.context,gain:0}),this._thresh=new hr({context:this.context,mapping:e=>e<=0?-1:1});const e=Di(gr.getDefaults(),arguments,["frequency","width"]);this.width=new Ds({context:this.context,units:"audioRange",value:e.width}),this._triangle=new ur({context:this.context,detune:e.detune,frequency:e.frequency,onstop:()=>this.onstop(this),phase:e.phase,type:"triangle"}),this.frequency=this._triangle.frequency,this.detune=this._triangle.detune,this._triangle.chain(this._thresh,this.output),this.width.chain(this._widthGate,this._thresh),Xi(this,["width","frequency","detune"])}static getDefaults(){return Object.assign(er.getDefaults(),{detune:0,frequency:440,phase:0,type:"pulse",width:.2})}_start(e){e=this.toSeconds(e),this._triangle.start(e),this._widthGate.gain.setValueAtTime(1,e)}_stop(e){e=this.toSeconds(e),this._triangle.stop(e),this._widthGate.gain.cancelScheduledValues(e),this._widthGate.gain.setValueAtTime(0,e)}_restart(e){this._triangle.restart(e),this._widthGate.gain.cancelScheduledValues(e),this._widthGate.gain.setValueAtTime(1,e)}get phase(){return this._triangle.phase}set phase(e){this._triangle.phase=e}get type(){return"pulse"}get baseType(){return"pulse"}get partials(){return[]}get partialCount(){return 0}set carrierType(e){this._triangle.type=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this._triangle.dispose(),this.width.dispose(),this._widthGate.dispose(),this._thresh.dispose(),this}}class yr extends er{constructor(){super(Di(yr.getDefaults(),arguments,["frequency","type","spread"])),this.name="FatOscillator",this._oscillators=[];const e=Di(yr.getDefaults(),arguments,["frequency","type","spread"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),this._spread=e.spread,this._type=e.type,this._phase=e.phase,this._partials=e.partials,this._partialCount=e.partialCount,this.count=e.count,Xi(this,["frequency","detune"])}static getDefaults(){return Object.assign(ur.getDefaults(),{count:3,spread:20,type:"sawtooth"})}_start(e){e=this.toSeconds(e),this._forEach((t=>t.start(e)))}_stop(e){e=this.toSeconds(e),this._forEach((t=>t.stop(e)))}_restart(e){this._forEach((t=>t.restart(e)))}_forEach(e){for(let t=0;tt.type=e))}get spread(){return this._spread}set spread(e){if(this._spread=e,this._oscillators.length>1){const t=-e/2,n=e/(this._oscillators.length-1);this._forEach(((e,a)=>e.detune.value=t+n*a))}}get count(){return this._oscillators.length}set count(e){if(si(e,1),this._oscillators.length!==e){this._forEach((e=>e.dispose())),this._oscillators=[];for(let t=0;tthis.onstop(this):Qi});"custom"===this.type&&(n.partials=this._partials),this.frequency.connect(n.frequency),this.detune.connect(n.detune),n.detune.overridden=!1,n.connect(this.output),this._oscillators[t]=n}this.spread=this._spread,"started"===this.state&&this._forEach((e=>e.start()))}}get phase(){return this._phase}set phase(e){this._phase=e,this._forEach(((e,t)=>e.phase=this._phase+t/this.count*360))}get baseType(){return this._oscillators[0].baseType}set baseType(e){this._forEach((t=>t.baseType=e)),this._type=this._oscillators[0].type}get partials(){return this._oscillators[0].partials}set partials(e){this._partials=e,this._partialCount=this._partials.length,e.length&&(this._type="custom",this._forEach((t=>t.partials=e)))}get partialCount(){return this._oscillators[0].partialCount}set partialCount(e){this._partialCount=e,this._forEach((t=>t.partialCount=e)),this._type=this._oscillators[0].type}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.frequency.dispose(),this.detune.dispose(),this._forEach((e=>e.dispose())),this}}class br extends er{constructor(){super(Di(br.getDefaults(),arguments,["frequency","modulationFrequency"])),this.name="PWMOscillator",this.sourceType="pwm",this._scale=new pr({context:this.context,value:2});const e=Di(br.getDefaults(),arguments,["frequency","modulationFrequency"]);this._pulse=new gr({context:this.context,frequency:e.modulationFrequency}),this._pulse.carrierType="sine",this.modulationFrequency=this._pulse.frequency,this._modulator=new ur({context:this.context,detune:e.detune,frequency:e.frequency,onstop:()=>this.onstop(this),phase:e.phase}),this.frequency=this._modulator.frequency,this.detune=this._modulator.detune,this._modulator.chain(this._scale,this._pulse.width),this._pulse.connect(this.output),Xi(this,["modulationFrequency","frequency","detune"])}static getDefaults(){return Object.assign(er.getDefaults(),{detune:0,frequency:440,modulationFrequency:.4,phase:0,type:"pwm"})}_start(e){e=this.toSeconds(e),this._modulator.start(e),this._pulse.start(e)}_stop(e){e=this.toSeconds(e),this._modulator.stop(e),this._pulse.stop(e)}_restart(e){this._modulator.restart(e),this._pulse.restart(e)}get type(){return"pwm"}get baseType(){return"pwm"}get partials(){return[]}get partialCount(){return 0}get phase(){return this._modulator.phase}set phase(e){this._modulator.phase=e}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this._pulse.dispose(),this._scale.dispose(),this._modulator.dispose(),this}}const vr={am:mr,fat:yr,fm:fr,oscillator:ur,pulse:gr,pwm:br};class kr extends er{constructor(){super(Di(kr.getDefaults(),arguments,["frequency","type"])),this.name="OmniOscillator";const e=Di(kr.getDefaults(),arguments,["frequency","type"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency}),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),Xi(this,["frequency","detune"]),this.set(e)}static getDefaults(){return Object.assign(ur.getDefaults(),fr.getDefaults(),mr.getDefaults(),yr.getDefaults(),gr.getDefaults(),br.getDefaults())}_start(e){this._oscillator.start(e)}_stop(e){this._oscillator.stop(e)}_restart(e){return this._oscillator.restart(e),this}get type(){let e="";return["am","fm","fat"].some((e=>this._sourceType===e))&&(e=this._sourceType),e+this._oscillator.type}set type(e){"fm"===e.substr(0,2)?(this._createNewOscillator("fm"),this._oscillator=this._oscillator,this._oscillator.type=e.substr(2)):"am"===e.substr(0,2)?(this._createNewOscillator("am"),this._oscillator=this._oscillator,this._oscillator.type=e.substr(2)):"fat"===e.substr(0,3)?(this._createNewOscillator("fat"),this._oscillator=this._oscillator,this._oscillator.type=e.substr(3)):"pwm"===e?(this._createNewOscillator("pwm"),this._oscillator=this._oscillator):"pulse"===e?this._createNewOscillator("pulse"):(this._createNewOscillator("oscillator"),this._oscillator=this._oscillator,this._oscillator.type=e)}get partials(){return this._oscillator.partials}set partials(e){this._getOscType(this._oscillator,"pulse")||this._getOscType(this._oscillator,"pwm")||(this._oscillator.partials=e)}get partialCount(){return this._oscillator.partialCount}set partialCount(e){this._getOscType(this._oscillator,"pulse")||this._getOscType(this._oscillator,"pwm")||(this._oscillator.partialCount=e)}set(e){return Reflect.has(e,"type")&&e.type&&(this.type=e.type),super.set(e),this}_createNewOscillator(e){if(e!==this._sourceType){this._sourceType=e;const t=vr[e],n=this.now();if(this._oscillator){const e=this._oscillator;e.stop(n),this.context.setTimeout((()=>e.dispose()),this.blockTime)}this._oscillator=new t({context:this.context}),this.frequency.connect(this._oscillator.frequency),this.detune.connect(this._oscillator.detune),this._oscillator.connect(this.output),this._oscillator.onstop=()=>this.onstop(this),"started"===this.state&&this._oscillator.start(n)}}get phase(){return this._oscillator.phase}set phase(e){this._oscillator.phase=e}get sourceType(){return this._sourceType}set sourceType(e){let t="sine";"pwm"!==this._oscillator.type&&"pulse"!==this._oscillator.type&&(t=this._oscillator.type),"fm"===e?this.type="fm"+t:"am"===e?this.type="am"+t:"fat"===e?this.type="fat"+t:"oscillator"===e?this.type=t:"pulse"===e?this.type="pulse":"pwm"===e&&(this.type="pwm")}_getOscType(e,t){return e instanceof vr[t]}get baseType(){return this._oscillator.baseType}set baseType(e){this._getOscType(this._oscillator,"pulse")||this._getOscType(this._oscillator,"pwm")||"pulse"===e||"pwm"===e||(this._oscillator.baseType=e)}get width(){return this._getOscType(this._oscillator,"pulse")?this._oscillator.width:void 0}get count(){return this._getOscType(this._oscillator,"fat")?this._oscillator.count:void 0}set count(e){this._getOscType(this._oscillator,"fat")&&mi(e)&&(this._oscillator.count=e)}get spread(){return this._getOscType(this._oscillator,"fat")?this._oscillator.spread:void 0}set spread(e){this._getOscType(this._oscillator,"fat")&&mi(e)&&(this._oscillator.spread=e)}get modulationType(){return this._getOscType(this._oscillator,"fm")||this._getOscType(this._oscillator,"am")?this._oscillator.modulationType:void 0}set modulationType(e){(this._getOscType(this._oscillator,"fm")||this._getOscType(this._oscillator,"am"))&&bi(e)&&(this._oscillator.modulationType=e)}get modulationIndex(){return this._getOscType(this._oscillator,"fm")?this._oscillator.modulationIndex:void 0}get harmonicity(){return this._getOscType(this._oscillator,"fm")||this._getOscType(this._oscillator,"am")?this._oscillator.harmonicity:void 0}get modulationFrequency(){return this._getOscType(this._oscillator,"pwm")?this._oscillator.modulationFrequency:void 0}asArray(e=1024){return xi(this,void 0,void 0,(function*(){return or(this,e)}))}dispose(){return super.dispose(),this.detune.dispose(),this.frequency.dispose(),this._oscillator.dispose(),this}}class wr extends Ds{constructor(){super(Object.assign(Di(wr.getDefaults(),arguments,["value"]))),this.override=!1,this.name="Add",this._sum=new Is({context:this.context}),this.input=this._sum,this.output=this._sum,this.addend=this._param,Es(this._constantSource,this._sum)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._sum.dispose(),this}}class Ar extends cr{constructor(){super(Object.assign(Di(Ar.getDefaults(),arguments,["min","max"]))),this.name="Scale";const e=Di(Ar.getDefaults(),arguments,["min","max"]);this._mult=this.input=new pr({context:this.context,value:e.max-e.min}),this._add=this.output=new wr({context:this.context,value:e.min}),this._min=e.min,this._max=e.max,this.input.connect(this.output)}static getDefaults(){return Object.assign(cr.getDefaults(),{max:1,min:0})}get min(){return this._min}set min(e){this._min=e,this._setRange()}get max(){return this._max}set max(e){this._max=e,this._setRange()}_setRange(){this._add.value=this._min,this._mult.value=this._max-this._min}dispose(){return super.dispose(),this._add.dispose(),this._mult.dispose(),this}}class xr extends cr{constructor(){super(Object.assign(Di(xr.getDefaults(),arguments))),this.name="Zero",this._gain=new Is({context:this.context}),this.output=this._gain,this.input=void 0,_s(this.context.getConstant(0),this._gain)}dispose(){return super.dispose(),Ts(this.context.getConstant(0),this._gain),this}}class Cr extends Ss{constructor(){super(Di(Cr.getDefaults(),arguments,["frequency","min","max"])),this.name="LFO",this._stoppedValue=0,this._units="number",this.convert=!0,this._fromType=Cs.prototype._fromType,this._toType=Cs.prototype._toType,this._is=Cs.prototype._is,this._clampValue=Cs.prototype._clampValue;const e=Di(Cr.getDefaults(),arguments,["frequency","min","max"]);this._oscillator=new ur(e),this.frequency=this._oscillator.frequency,this._amplitudeGain=new Is({context:this.context,gain:e.amplitude,units:"normalRange"}),this.amplitude=this._amplitudeGain.gain,this._stoppedSignal=new Ds({context:this.context,units:"audioRange",value:0}),this._zeros=new xr({context:this.context}),this._a2g=new dr({context:this.context}),this._scaler=this.output=new Ar({context:this.context,max:e.max,min:e.min}),this.units=e.units,this.min=e.min,this.max=e.max,this._oscillator.chain(this._amplitudeGain,this._a2g,this._scaler),this._zeros.connect(this._a2g),this._stoppedSignal.connect(this._a2g),Xi(this,["amplitude","frequency"]),this.phase=e.phase}static getDefaults(){return Object.assign(ur.getDefaults(),{amplitude:1,frequency:"4n",max:1,min:0,type:"sine",units:"number"})}start(e){return e=this.toSeconds(e),this._stoppedSignal.setValueAtTime(0,e),this._oscillator.start(e),this}stop(e){return e=this.toSeconds(e),this._stoppedSignal.setValueAtTime(this._stoppedValue,e),this._oscillator.stop(e),this}sync(){return this._oscillator.sync(),this._oscillator.syncFrequency(),this}unsync(){return this._oscillator.unsync(),this._oscillator.unsyncFrequency(),this}_setStoppedValue(){this._stoppedValue=this._oscillator.getInitialValue(),this._stoppedSignal.value=this._stoppedValue}get min(){return this._toType(this._scaler.min)}set min(e){e=this._fromType(e),this._scaler.min=e}get max(){return this._toType(this._scaler.max)}set max(e){e=this._fromType(e),this._scaler.max=e}get type(){return this._oscillator.type}set type(e){this._oscillator.type=e,this._setStoppedValue()}get partials(){return this._oscillator.partials}set partials(e){this._oscillator.partials=e,this._setStoppedValue()}get phase(){return this._oscillator.phase}set phase(e){this._oscillator.phase=e,this._setStoppedValue()}get units(){return this._units}set units(e){const t=this.min,n=this.max;this._units=e,this.min=t,this.max=n}get state(){return this._oscillator.state}connect(e,t,n){return(e instanceof Cs||e instanceof Ds)&&(this.convert=e.convert,this.units=e.units),zs(this,e,t,n),this}dispose(){return super.dispose(),this._oscillator.dispose(),this._stoppedSignal.dispose(),this._zeros.dispose(),this._scaler.dispose(),this._a2g.dispose(),this._amplitudeGain.dispose(),this.amplitude.dispose(),this}}function Sr(e,t=1/0){const n=new WeakMap;return function(a,i){Reflect.defineProperty(a,i,{configurable:!0,enumerable:!0,get:function(){return n.get(this)},set:function(a){si(a,e,t),n.set(this,a)}})}}function Er(e,t=1/0){const n=new WeakMap;return function(a,i){Reflect.defineProperty(a,i,{configurable:!0,enumerable:!0,get:function(){return n.get(this)},set:function(a){si(this.toSeconds(a),e,t),n.set(this,a)}})}}class _r extends er{constructor(){super(Di(_r.getDefaults(),arguments,["url","onload"])),this.name="Player",this._activeSources=new Set;const e=Di(_r.getDefaults(),arguments,["url","onload"]);this._buffer=new Ji({onload:this._onload.bind(this,e.onload),onerror:e.onerror,reverse:e.reverse,url:e.url}),this.autostart=e.autostart,this._loop=e.loop,this._loopStart=e.loopStart,this._loopEnd=e.loopEnd,this._playbackRate=e.playbackRate,this.fadeIn=e.fadeIn,this.fadeOut=e.fadeOut}static getDefaults(){return Object.assign(er.getDefaults(),{autostart:!1,fadeIn:0,fadeOut:0,loop:!1,loopEnd:0,loopStart:0,onload:Qi,onerror:Qi,playbackRate:1,reverse:!1})}load(e){return xi(this,void 0,void 0,(function*(){return yield this._buffer.load(e),this._onload(),this}))}_onload(e=Qi){e(),this.autostart&&this.start()}_onSourceEnd(e){this.onstop(this),this._activeSources.delete(e),0!==this._activeSources.size||this._synced||"started"!==this._state.getValueAtTime(this.now())||(this._state.cancel(this.now()),this._state.setStateAtTime("stopped",this.now()))}start(e,t,n){return super.start(e,t,n),this}_start(e,t,n){t=this._loop?zi(t,this._loopStart):zi(t,0);const a=this.toSeconds(t),i=n;n=zi(n,Math.max(this._buffer.duration-a,0));let s=this.toSeconds(n);s/=this._playbackRate,e=this.toSeconds(e);const r=new tr({url:this._buffer,context:this.context,fadeIn:this.fadeIn,fadeOut:this.fadeOut,loop:this._loop,loopEnd:this._loopEnd,loopStart:this._loopStart,onended:this._onSourceEnd.bind(this),playbackRate:this._playbackRate}).connect(this.output);this._loop||this._synced||(this._state.cancel(e+s),this._state.setStateAtTime("stopped",e+s,{implicitEnd:!0})),this._activeSources.add(r),this._loop&&hi(i)?r.start(e,a):r.start(e,a,s-this.toSeconds(this.fadeOut))}_stop(e){const t=this.toSeconds(e);this._activeSources.forEach((e=>e.stop(t)))}restart(e,t,n){return super.restart(e,t,n),this}_restart(e,t,n){this._stop(e),this._start(e,t,n)}seek(e,t){const n=this.toSeconds(t);if("started"===this._state.getValueAtTime(n)){const t=this.toSeconds(e);this._stop(n),this._start(n,t)}return this}setLoopPoints(e,t){return this.loopStart=e,this.loopEnd=t,this}get loopStart(){return this._loopStart}set loopStart(e){this._loopStart=e,this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._activeSources.forEach((t=>{t.loopStart=e}))}get loopEnd(){return this._loopEnd}set loopEnd(e){this._loopEnd=e,this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._activeSources.forEach((t=>{t.loopEnd=e}))}get buffer(){return this._buffer}set buffer(e){this._buffer.set(e)}get loop(){return this._loop}set loop(e){if(this._loop!==e&&(this._loop=e,this._activeSources.forEach((t=>{t.loop=e})),e)){const e=this._state.getNextState("stopped",this.now());e&&this._state.cancel(e.time)}}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e;const t=this.now(),n=this._state.getNextState("stopped",t);n&&n.implicitEnd&&(this._state.cancel(n.time),this._activeSources.forEach((e=>e.cancelStop()))),this._activeSources.forEach((n=>{n.playbackRate.setValueAtTime(e,t)}))}get reverse(){return this._buffer.reverse}set reverse(e){this._buffer.reverse=e}get loaded(){return this._buffer.loaded}dispose(){return super.dispose(),this._activeSources.forEach((e=>e.dispose())),this._activeSources.clear(),this._buffer.dispose(),this}}Ai([Er(0)],_r.prototype,"fadeIn",void 0),Ai([Er(0)],_r.prototype,"fadeOut",void 0);class Tr extends Ss{constructor(){super(Di(Tr.getDefaults(),arguments,["urls","onload"],"urls")),this.name="Players",this.input=void 0,this._players=new Map;const e=Di(Tr.getDefaults(),arguments,["urls","onload"],"urls");this._volume=this.output=new $s({context:this.context,volume:e.volume}),this.volume=this._volume.volume,Xi(this,"volume"),this._buffers=new js({urls:e.urls,onload:e.onload,baseUrl:e.baseUrl,onerror:e.onerror}),this.mute=e.mute,this._fadeIn=e.fadeIn,this._fadeOut=e.fadeOut}static getDefaults(){return Object.assign(er.getDefaults(),{baseUrl:"",fadeIn:0,fadeOut:0,mute:!1,onload:Qi,onerror:Qi,urls:{},volume:0})}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}get fadeIn(){return this._fadeIn}set fadeIn(e){this._fadeIn=e,this._players.forEach((t=>{t.fadeIn=e}))}get fadeOut(){return this._fadeOut}set fadeOut(e){this._fadeOut=e,this._players.forEach((t=>{t.fadeOut=e}))}get state(){return Array.from(this._players).some((([e,t])=>"started"===t.state))?"started":"stopped"}has(e){return this._buffers.has(e)}player(e){if(ii(this.has(e),`No Player with the name ${e} exists on this object`),!this._players.has(e)){const t=new _r({context:this.context,fadeIn:this._fadeIn,fadeOut:this._fadeOut,url:this._buffers.get(e)}).connect(this.output);this._players.set(e,t)}return this._players.get(e)}get loaded(){return this._buffers.loaded}add(e,t,n){return ii(!this._buffers.has(e),"A buffer with that name already exists on this object"),this._buffers.add(e,t,n),this}stopAll(e){return this._players.forEach((t=>t.stop(e))),this}dispose(){return super.dispose(),this._volume.dispose(),this.volume.dispose(),this._players.forEach((e=>e.dispose())),this._buffers.dispose(),this}}class Ir extends er{constructor(){super(Di(Ir.getDefaults(),arguments,["url","onload"])),this.name="GrainPlayer",this._loopStart=0,this._loopEnd=0,this._activeSources=[];const e=Di(Ir.getDefaults(),arguments,["url","onload"]);this.buffer=new Ji({onload:e.onload,onerror:e.onerror,reverse:e.reverse,url:e.url}),this._clock=new Fs({context:this.context,callback:this._tick.bind(this),frequency:1/e.grainSize}),this._playbackRate=e.playbackRate,this._grainSize=e.grainSize,this._overlap=e.overlap,this.detune=e.detune,this.overlap=e.overlap,this.loop=e.loop,this.playbackRate=e.playbackRate,this.grainSize=e.grainSize,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this.reverse=e.reverse,this._clock.on("stop",this._onstop.bind(this))}static getDefaults(){return Object.assign(er.getDefaults(),{onload:Qi,onerror:Qi,overlap:.1,grainSize:.2,playbackRate:1,detune:0,loop:!1,loopStart:0,loopEnd:0,reverse:!1})}_start(e,t,n){t=zi(t,0),t=this.toSeconds(t),e=this.toSeconds(e);const a=1/this._clock.frequency.getValueAtTime(e);this._clock.start(e,t/a),n&&this.stop(e+this.toSeconds(n))}restart(e,t,n){return super.restart(e,t,n),this}_restart(e,t,n){this._stop(e),this._start(e,t,n)}_stop(e){this._clock.stop(e)}_onstop(e){this._activeSources.forEach((t=>{t.fadeOut=0,t.stop(e)})),this.onstop(this)}_tick(e){const t=this._clock.getTicksAtTime(e),n=t*this._grainSize;if(this.log("offset",n),!this.loop&&n>this.buffer.duration)return void this.stop(e);const a=n{const e=this._activeSources.indexOf(i);-1!==e&&this._activeSources.splice(e,1)}}get playbackRate(){return this._playbackRate}set playbackRate(e){si(e,.001),this._playbackRate=e,this.grainSize=this._grainSize}get loopStart(){return this._loopStart}set loopStart(e){this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._loopStart=this.toSeconds(e)}get loopEnd(){return this._loopEnd}set loopEnd(e){this.buffer.loaded&&si(this.toSeconds(e),0,this.buffer.duration),this._loopEnd=this.toSeconds(e)}get reverse(){return this.buffer.reverse}set reverse(e){this.buffer.reverse=e}get grainSize(){return this._grainSize}set grainSize(e){this._grainSize=this.toSeconds(e),this._clock.frequency.setValueAtTime(this._playbackRate/this._grainSize,this.now())}get overlap(){return this._overlap}set overlap(e){const t=this.toSeconds(e);si(t,0),this._overlap=t}get loaded(){return this.buffer.loaded}dispose(){return super.dispose(),this.buffer.dispose(),this._clock.dispose(),this._activeSources.forEach((e=>e.dispose())),this}}class Nr extends cr{constructor(){super(...arguments),this.name="Abs",this._abs=new hr({context:this.context,mapping:e=>Math.abs(e)<.001?0:Math.abs(e)}),this.input=this._abs,this.output=this._abs}dispose(){return super.dispose(),this._abs.dispose(),this}}class Rr extends cr{constructor(){super(...arguments),this.name="GainToAudio",this._norm=new hr({context:this.context,mapping:e=>2*Math.abs(e)-1}),this.input=this._norm,this.output=this._norm}dispose(){return super.dispose(),this._norm.dispose(),this}}class Dr extends cr{constructor(){super(...arguments),this.name="Negate",this._multiply=new pr({context:this.context,value:-1}),this.input=this._multiply,this.output=this._multiply}dispose(){return super.dispose(),this._multiply.dispose(),this}}class zr extends Ds{constructor(){super(Object.assign(Di(zr.getDefaults(),arguments,["value"]))),this.override=!1,this.name="Subtract",this._sum=new Is({context:this.context}),this.input=this._sum,this.output=this._sum,this._neg=new Dr({context:this.context}),this.subtrahend=this._param,Es(this._constantSource,this._neg,this._sum)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._neg.dispose(),this._sum.dispose(),this}}class Or extends cr{constructor(){super(Object.assign(Di(Or.getDefaults(),arguments))),this.name="GreaterThanZero",this._thresh=this.output=new hr({context:this.context,length:127,mapping:e=>e<=0?0:1}),this._scale=this.input=new pr({context:this.context,value:1e4}),this._scale.connect(this._thresh)}dispose(){return super.dispose(),this._scale.dispose(),this._thresh.dispose(),this}}class Mr extends Ds{constructor(){super(Object.assign(Di(Mr.getDefaults(),arguments,["value"]))),this.name="GreaterThan",this.override=!1;const e=Di(Mr.getDefaults(),arguments,["value"]);this._subtract=this.input=new zr({context:this.context,value:e.value}),this._gtz=this.output=new Or({context:this.context}),this.comparator=this._param=this._subtract.subtrahend,Xi(this,"comparator"),this._subtract.connect(this._gtz)}static getDefaults(){return Object.assign(Ds.getDefaults(),{value:0})}dispose(){return super.dispose(),this._gtz.dispose(),this._subtract.dispose(),this.comparator.dispose(),this}}class Br extends cr{constructor(){super(Object.assign(Di(Br.getDefaults(),arguments,["value"]))),this.name="Pow";const e=Di(Br.getDefaults(),arguments,["value"]);this._exponentScaler=this.input=this.output=new hr({context:this.context,mapping:this._expFunc(e.value),length:8192}),this._exponent=e.value}static getDefaults(){return Object.assign(cr.getDefaults(),{value:1})}_expFunc(e){return t=>Math.pow(Math.abs(t),e)}get value(){return this._exponent}set value(e){this._exponent=e,this._exponentScaler.setMap(this._expFunc(this._exponent))}dispose(){return super.dispose(),this._exponentScaler.dispose(),this}}class Fr extends Ar{constructor(){super(Object.assign(Di(Fr.getDefaults(),arguments,["min","max","exponent"]))),this.name="ScaleExp";const e=Di(Fr.getDefaults(),arguments,["min","max","exponent"]);this.input=this._exp=new Br({context:this.context,value:e.exponent}),this._exp.connect(this._mult)}static getDefaults(){return Object.assign(Ar.getDefaults(),{exponent:1})}get exponent(){return this._exp.value}set exponent(e){this._exp.value=e}dispose(){return super.dispose(),this._exp.dispose(),this}}class Lr extends Ds{constructor(){super(Di(Ds.getDefaults(),arguments,["value","units"])),this.name="SyncedSignal",this.override=!1;const e=Di(Ds.getDefaults(),arguments,["value","units"]);this._lastVal=e.value,this._synced=this.context.transport.scheduleRepeat(this._onTick.bind(this),"1i"),this._syncedCallback=this._anchorValue.bind(this),this.context.transport.on("start",this._syncedCallback),this.context.transport.on("pause",this._syncedCallback),this.context.transport.on("stop",this._syncedCallback),this._constantSource.disconnect(),this._constantSource.stop(0),this._constantSource=this.output=new Rs({context:this.context,offset:e.value,units:e.units}).start(0),this.setValueAtTime(e.value,0)}_onTick(e){const t=super.getValueAtTime(this.context.transport.seconds);this._lastVal!==t&&(this._lastVal=t,this._constantSource.offset.setValueAtTime(t,e))}_anchorValue(e){const t=super.getValueAtTime(this.context.transport.seconds);this._lastVal=t,this._constantSource.offset.cancelAndHoldAtTime(e),this._constantSource.offset.setValueAtTime(t,e)}getValueAtTime(e){const t=new ks(this.context,e).toSeconds();return super.getValueAtTime(t)}setValueAtTime(e,t){const n=new ks(this.context,t).toSeconds();return super.setValueAtTime(e,n),this}linearRampToValueAtTime(e,t){const n=new ks(this.context,t).toSeconds();return super.linearRampToValueAtTime(e,n),this}exponentialRampToValueAtTime(e,t){const n=new ks(this.context,t).toSeconds();return super.exponentialRampToValueAtTime(e,n),this}setTargetAtTime(e,t,n){const a=new ks(this.context,t).toSeconds();return super.setTargetAtTime(e,a,n),this}cancelScheduledValues(e){const t=new ks(this.context,e).toSeconds();return super.cancelScheduledValues(t),this}setValueCurveAtTime(e,t,n,a){const i=new ks(this.context,t).toSeconds();return n=this.toSeconds(n),super.setValueCurveAtTime(e,i,n,a),this}cancelAndHoldAtTime(e){const t=new ks(this.context,e).toSeconds();return super.cancelAndHoldAtTime(t),this}setRampPoint(e){const t=new ks(this.context,e).toSeconds();return super.setRampPoint(t),this}exponentialRampTo(e,t,n){const a=new ks(this.context,n).toSeconds();return super.exponentialRampTo(e,t,a),this}linearRampTo(e,t,n){const a=new ks(this.context,n).toSeconds();return super.linearRampTo(e,t,a),this}targetRampTo(e,t,n){const a=new ks(this.context,n).toSeconds();return super.targetRampTo(e,t,a),this}dispose(){return super.dispose(),this.context.transport.clear(this._synced),this.context.transport.off("start",this._syncedCallback),this.context.transport.off("pause",this._syncedCallback),this.context.transport.off("stop",this._syncedCallback),this._constantSource.dispose(),this}}class Pr extends Ss{constructor(){super(Di(Pr.getDefaults(),arguments,["attack","decay","sustain","release"])),this.name="Envelope",this._sig=new Ds({context:this.context,value:0}),this.output=this._sig,this.input=void 0;const e=Di(Pr.getDefaults(),arguments,["attack","decay","sustain","release"]);this.attack=e.attack,this.decay=e.decay,this.sustain=e.sustain,this.release=e.release,this.attackCurve=e.attackCurve,this.releaseCurve=e.releaseCurve,this.decayCurve=e.decayCurve}static getDefaults(){return Object.assign(Ss.getDefaults(),{attack:.01,attackCurve:"linear",decay:.1,decayCurve:"exponential",release:1,releaseCurve:"exponential",sustain:.5})}get value(){return this.getValueAtTime(this.now())}_getCurve(e,t){if(bi(e))return e;{let n;for(n in jr)if(jr[n][t]===e)return n;return e}}_setCurve(e,t,n){if(bi(n)&&Reflect.has(jr,n)){const a=jr[n];fi(a)?"_decayCurve"!==e&&(this[e]=a[t]):this[e]=a}else{if(!yi(n)||"_decayCurve"===e)throw new Error("Envelope: invalid curve: "+n);this[e]=n}}get attackCurve(){return this._getCurve(this._attackCurve,"In")}set attackCurve(e){this._setCurve("_attackCurve","In",e)}get releaseCurve(){return this._getCurve(this._releaseCurve,"Out")}set releaseCurve(e){this._setCurve("_releaseCurve","Out",e)}get decayCurve(){return this._decayCurve}set decayCurve(e){ii(["linear","exponential"].some((t=>t===e)),`Invalid envelope curve: ${e}`),this._decayCurve=e}triggerAttack(e,t=1){this.log("triggerAttack",e,t),e=this.toSeconds(e);let n=this.toSeconds(this.attack);const a=this.toSeconds(this.decay),i=this.getValueAtTime(e);if(i>0){n=(1-i)/(1/n)}if(n0){const n=this.toSeconds(this.release);n{const e=128;let t,n;const a=[];for(t=0;t{const a=e[t],i=this.context.transport.schedule((a=>{e[t]=a,n.apply(this,e)}),a);this._scheduledEvents.push(i)}}unsync(){return this._scheduledEvents.forEach((e=>this.context.transport.clear(e))),this._scheduledEvents=[],this._synced&&(this._synced=!1,this.triggerAttack=this._original_triggerAttack,this.triggerRelease=this._original_triggerRelease),this}triggerAttackRelease(e,t,n,a){const i=this.toSeconds(n),s=this.toSeconds(t);return this.triggerAttack(e,i,a),this.triggerRelease(i+s),this}dispose(){return super.dispose(),this._volume.dispose(),this.unsync(),this._scheduledEvents=[],this}}class Ur extends Vr{constructor(){super(Di(Ur.getDefaults(),arguments));const e=Di(Ur.getDefaults(),arguments);this.portamento=e.portamento,this.onsilence=e.onsilence}static getDefaults(){return Object.assign(Vr.getDefaults(),{detune:0,onsilence:Qi,portamento:0})}triggerAttack(e,t,n=1){this.log("triggerAttack",e,t,n);const a=this.toSeconds(t);return this._triggerEnvelopeAttack(a,n),this.setNote(e,a),this}triggerRelease(e){this.log("triggerRelease",e);const t=this.toSeconds(e);return this._triggerEnvelopeRelease(t),this}setNote(e,t){const n=this.toSeconds(t),a=e instanceof gs?e.toFrequency():e;if(this.portamento>0&&this.getLevelAtTime(n)>.05){const e=this.toSeconds(this.portamento);this.frequency.exponentialRampTo(a,e,n)}else this.frequency.setValueAtTime(a,n);return this}}Ai([Er(0)],Ur.prototype,"portamento",void 0);class Wr extends Pr{constructor(){super(Di(Wr.getDefaults(),arguments,["attack","decay","sustain","release"])),this.name="AmplitudeEnvelope",this._gainNode=new Is({context:this.context,gain:0}),this.output=this._gainNode,this.input=this._gainNode,this._sig.connect(this._gainNode.gain),this.output=this._gainNode,this.input=this._gainNode}dispose(){return super.dispose(),this._gainNode.dispose(),this}}class Gr extends Ur{constructor(){super(Di(Gr.getDefaults(),arguments)),this.name="Synth";const e=Di(Gr.getDefaults(),arguments);this.oscillator=new kr(Object.assign({context:this.context,detune:e.detune,onstop:()=>this.onsilence(this)},e.oscillator)),this.frequency=this.oscillator.frequency,this.detune=this.oscillator.detune,this.envelope=new Wr(Object.assign({context:this.context},e.envelope)),this.oscillator.chain(this.envelope,this.output),Xi(this,["oscillator","frequency","detune","envelope"])}static getDefaults(){return Object.assign(Ur.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.005,decay:.1,release:1,sustain:.3}),oscillator:Object.assign(Oi(kr.getDefaults(),[...Object.keys(er.getDefaults()),"frequency","detune"]),{type:"triangle"})})}_triggerEnvelopeAttack(e,t){if(this.envelope.triggerAttack(e,t),this.oscillator.start(e),0===this.envelope.sustain){const t=this.toSeconds(this.envelope.attack),n=this.toSeconds(this.envelope.decay);this.oscillator.stop(e+t+n)}}_triggerEnvelopeRelease(e){this.envelope.triggerRelease(e),this.oscillator.stop(e+this.toSeconds(this.envelope.release))}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}dispose(){return super.dispose(),this.oscillator.dispose(),this.envelope.dispose(),this}}class qr extends Ur{constructor(){super(Di(qr.getDefaults(),arguments)),this.name="ModulationSynth";const e=Di(qr.getDefaults(),arguments);this._carrier=new Gr({context:this.context,oscillator:e.oscillator,envelope:e.envelope,onsilence:()=>this.onsilence(this),volume:-10}),this._modulator=new Gr({context:this.context,oscillator:e.modulation,envelope:e.modulationEnvelope,volume:-10}),this.oscillator=this._carrier.oscillator,this.envelope=this._carrier.envelope,this.modulation=this._modulator.oscillator,this.modulationEnvelope=this._modulator.envelope,this.frequency=new Ds({context:this.context,units:"frequency"}),this.detune=new Ds({context:this.context,value:e.detune,units:"cents"}),this.harmonicity=new pr({context:this.context,value:e.harmonicity,minValue:0}),this._modulationNode=new Is({context:this.context,gain:0}),Xi(this,["frequency","harmonicity","oscillator","envelope","modulation","modulationEnvelope","detune"])}static getDefaults(){return Object.assign(Ur.getDefaults(),{harmonicity:3,oscillator:Object.assign(Oi(kr.getDefaults(),[...Object.keys(er.getDefaults()),"frequency","detune"]),{type:"sine"}),envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.01,decay:.01,sustain:1,release:.5}),modulation:Object.assign(Oi(kr.getDefaults(),[...Object.keys(er.getDefaults()),"frequency","detune"]),{type:"square"}),modulationEnvelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.5,decay:0,sustain:1,release:.5})})}_triggerEnvelopeAttack(e,t){this._carrier._triggerEnvelopeAttack(e,t),this._modulator._triggerEnvelopeAttack(e,t)}_triggerEnvelopeRelease(e){return this._carrier._triggerEnvelopeRelease(e),this._modulator._triggerEnvelopeRelease(e),this}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}dispose(){return super.dispose(),this._carrier.dispose(),this._modulator.dispose(),this.frequency.dispose(),this.detune.dispose(),this.harmonicity.dispose(),this._modulationNode.dispose(),this}}class Hr extends qr{constructor(){super(Di(Hr.getDefaults(),arguments)),this.name="AMSynth",this._modulationScale=new dr({context:this.context}),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.detune.fan(this._carrier.detune,this._modulator.detune),this._modulator.chain(this._modulationScale,this._modulationNode.gain),this._carrier.chain(this._modulationNode,this.output)}dispose(){return super.dispose(),this._modulationScale.dispose(),this}}class Kr extends Ss{constructor(){super(Di(Kr.getDefaults(),arguments,["frequency","type"])),this.name="BiquadFilter";const e=Di(Kr.getDefaults(),arguments,["frequency","type"]);this._filter=this.context.createBiquadFilter(),this.input=this.output=this._filter,this.Q=new Cs({context:this.context,units:"number",value:e.Q,param:this._filter.Q}),this.frequency=new Cs({context:this.context,units:"frequency",value:e.frequency,param:this._filter.frequency}),this.detune=new Cs({context:this.context,units:"cents",value:e.detune,param:this._filter.detune}),this.gain=new Cs({context:this.context,units:"decibels",convert:!1,value:e.gain,param:this._filter.gain}),this.type=e.type}static getDefaults(){return Object.assign(Ss.getDefaults(),{Q:1,type:"lowpass",frequency:350,detune:0,gain:0})}get type(){return this._filter.type}set type(e){ii(-1!==["lowpass","highpass","bandpass","lowshelf","highshelf","notch","allpass","peaking"].indexOf(e),`Invalid filter type: ${e}`),this._filter.type=e}getFrequencyResponse(e=128){const t=new Float32Array(e);for(let n=0;nt.type=e))}get rolloff(){return this._rolloff}set rolloff(e){const t=mi(e)?e:parseInt(e,10),n=[-12,-24,-48,-96];let a=n.indexOf(t);ii(-1!==a,`rolloff can only be ${n.join(", ")}`),a+=1,this._rolloff=t,this.input.disconnect(),this._filters.forEach((e=>e.disconnect())),this._filters=new Array(a);for(let e=0;e1));return this._filters.forEach((()=>{t.getFrequencyResponse(e).forEach(((e,t)=>n[t]*=e))})),t.dispose(),n}dispose(){return super.dispose(),this._filters.forEach((e=>{e.dispose()})),Yi(this,["detune","frequency","gain","Q"]),this.frequency.dispose(),this.Q.dispose(),this.detune.dispose(),this.gain.dispose(),this}}class Zr extends Pr{constructor(){super(Di(Zr.getDefaults(),arguments,["attack","decay","sustain","release"])),this.name="FrequencyEnvelope";const e=Di(Zr.getDefaults(),arguments,["attack","decay","sustain","release"]);this._octaves=e.octaves,this._baseFrequency=this.toFrequency(e.baseFrequency),this._exponent=this.input=new Br({context:this.context,value:e.exponent}),this._scale=this.output=new Ar({context:this.context,min:this._baseFrequency,max:this._baseFrequency*Math.pow(2,this._octaves)}),this._sig.chain(this._exponent,this._scale)}static getDefaults(){return Object.assign(Pr.getDefaults(),{baseFrequency:200,exponent:1,octaves:4})}get baseFrequency(){return this._baseFrequency}set baseFrequency(e){const t=this.toFrequency(e);si(t,0),this._baseFrequency=t,this._scale.min=this._baseFrequency,this.octaves=this._octaves}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._scale.max=this._baseFrequency*Math.pow(2,e)}get exponent(){return this._exponent.value}set exponent(e){this._exponent.value=e}dispose(){return super.dispose(),this._exponent.dispose(),this._scale.dispose(),this}}class Xr extends Ur{constructor(){super(Di(Xr.getDefaults(),arguments)),this.name="MonoSynth";const e=Di(Xr.getDefaults(),arguments);this.oscillator=new kr(Object.assign(e.oscillator,{context:this.context,detune:e.detune,onstop:()=>this.onsilence(this)})),this.frequency=this.oscillator.frequency,this.detune=this.oscillator.detune,this.filter=new $r(Object.assign(e.filter,{context:this.context})),this.filterEnvelope=new Zr(Object.assign(e.filterEnvelope,{context:this.context})),this.envelope=new Wr(Object.assign(e.envelope,{context:this.context})),this.oscillator.chain(this.filter,this.envelope,this.output),this.filterEnvelope.connect(this.filter.frequency),Xi(this,["oscillator","frequency","detune","filter","filterEnvelope","envelope"])}static getDefaults(){return Object.assign(Ur.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.005,decay:.1,release:1,sustain:.9}),filter:Object.assign(Oi($r.getDefaults(),Object.keys(Ss.getDefaults())),{Q:1,rolloff:-12,type:"lowpass"}),filterEnvelope:Object.assign(Oi(Zr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.6,baseFrequency:200,decay:.2,exponent:2,octaves:3,release:2,sustain:.5}),oscillator:Object.assign(Oi(kr.getDefaults(),Object.keys(er.getDefaults())),{type:"sawtooth"})})}_triggerEnvelopeAttack(e,t=1){if(this.envelope.triggerAttack(e,t),this.filterEnvelope.triggerAttack(e),this.oscillator.start(e),0===this.envelope.sustain){const t=this.toSeconds(this.envelope.attack),n=this.toSeconds(this.envelope.decay);this.oscillator.stop(e+t+n)}}_triggerEnvelopeRelease(e){this.envelope.triggerRelease(e),this.filterEnvelope.triggerRelease(e),this.oscillator.stop(e+this.toSeconds(this.envelope.release))}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}dispose(){return super.dispose(),this.oscillator.dispose(),this.envelope.dispose(),this.filterEnvelope.dispose(),this.filter.dispose(),this}}class Yr extends Ur{constructor(){super(Di(Yr.getDefaults(),arguments)),this.name="DuoSynth";const e=Di(Yr.getDefaults(),arguments);this.voice0=new Xr(Object.assign(e.voice0,{context:this.context,onsilence:()=>this.onsilence(this)})),this.voice1=new Xr(Object.assign(e.voice1,{context:this.context})),this.harmonicity=new pr({context:this.context,units:"positive",value:e.harmonicity}),this._vibrato=new Cr({frequency:e.vibratoRate,context:this.context,min:-50,max:50}),this._vibrato.start(),this.vibratoRate=this._vibrato.frequency,this._vibratoGain=new Is({context:this.context,units:"normalRange",gain:e.vibratoAmount}),this.vibratoAmount=this._vibratoGain.gain,this.frequency=new Ds({context:this.context,units:"frequency",value:440}),this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),this.frequency.connect(this.voice0.frequency),this.frequency.chain(this.harmonicity,this.voice1.frequency),this._vibrato.connect(this._vibratoGain),this._vibratoGain.fan(this.voice0.detune,this.voice1.detune),this.detune.fan(this.voice0.detune,this.voice1.detune),this.voice0.connect(this.output),this.voice1.connect(this.output),Xi(this,["voice0","voice1","frequency","vibratoAmount","vibratoRate"])}getLevelAtTime(e){return e=this.toSeconds(e),this.voice0.envelope.getValueAtTime(e)+this.voice1.envelope.getValueAtTime(e)}static getDefaults(){return Ri(Ur.getDefaults(),{vibratoAmount:.5,vibratoRate:5,harmonicity:1.5,voice0:Ri(Oi(Xr.getDefaults(),Object.keys(Ur.getDefaults())),{filterEnvelope:{attack:.01,decay:0,sustain:1,release:.5},envelope:{attack:.01,decay:0,sustain:1,release:.5}}),voice1:Ri(Oi(Xr.getDefaults(),Object.keys(Ur.getDefaults())),{filterEnvelope:{attack:.01,decay:0,sustain:1,release:.5},envelope:{attack:.01,decay:0,sustain:1,release:.5}})})}_triggerEnvelopeAttack(e,t){this.voice0._triggerEnvelopeAttack(e,t),this.voice1._triggerEnvelopeAttack(e,t)}_triggerEnvelopeRelease(e){return this.voice0._triggerEnvelopeRelease(e),this.voice1._triggerEnvelopeRelease(e),this}dispose(){return super.dispose(),this.voice0.dispose(),this.voice1.dispose(),this.frequency.dispose(),this.detune.dispose(),this._vibrato.dispose(),this.vibratoRate.dispose(),this._vibratoGain.dispose(),this.harmonicity.dispose(),this}}class Qr extends qr{constructor(){super(Di(Qr.getDefaults(),arguments)),this.name="FMSynth";const e=Di(Qr.getDefaults(),arguments);this.modulationIndex=new pr({context:this.context,value:e.modulationIndex}),this.frequency.connect(this._carrier.frequency),this.frequency.chain(this.harmonicity,this._modulator.frequency),this.frequency.chain(this.modulationIndex,this._modulationNode),this.detune.fan(this._carrier.detune,this._modulator.detune),this._modulator.connect(this._modulationNode.gain),this._modulationNode.connect(this._carrier.frequency),this._carrier.connect(this.output)}static getDefaults(){return Object.assign(qr.getDefaults(),{modulationIndex:10})}dispose(){return super.dispose(),this.modulationIndex.dispose(),this}}const Jr=[1,1.483,1.932,2.546,2.63,3.897];class eo extends Ur{constructor(){super(Di(eo.getDefaults(),arguments)),this.name="MetalSynth",this._oscillators=[],this._freqMultipliers=[];const e=Di(eo.getDefaults(),arguments);this.detune=new Ds({context:this.context,units:"cents",value:e.detune}),this.frequency=new Ds({context:this.context,units:"frequency"}),this._amplitude=new Is({context:this.context,gain:0}).connect(this.output),this._highpass=new $r({Q:0,context:this.context,type:"highpass"}).connect(this._amplitude);for(let t=0;tthis.onsilence(this):Qi,type:"square"});n.connect(this._highpass),this._oscillators[t]=n;const a=new pr({context:this.context,value:Jr[t]});this._freqMultipliers[t]=a,this.frequency.chain(a,n.frequency),this.detune.connect(n.detune)}this._filterFreqScaler=new Ar({context:this.context,max:7e3,min:this.toFrequency(e.resonance)}),this.envelope=new Pr({attack:e.envelope.attack,attackCurve:"linear",context:this.context,decay:e.envelope.decay,release:e.envelope.release,sustain:0}),this.envelope.chain(this._filterFreqScaler,this._highpass.frequency),this.envelope.connect(this._amplitude.gain),this._octaves=e.octaves,this.octaves=e.octaves}static getDefaults(){return Ri(Ur.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{attack:.001,decay:1.4,release:.2}),harmonicity:5.1,modulationIndex:32,octaves:1.5,resonance:4e3})}_triggerEnvelopeAttack(e,t=1){return this.envelope.triggerAttack(e,t),this._oscillators.forEach((t=>t.start(e))),0===this.envelope.sustain&&this._oscillators.forEach((t=>{t.stop(e+this.toSeconds(this.envelope.attack)+this.toSeconds(this.envelope.decay))})),this}_triggerEnvelopeRelease(e){return this.envelope.triggerRelease(e),this._oscillators.forEach((t=>t.stop(e+this.toSeconds(this.envelope.release)))),this}getLevelAtTime(e){return e=this.toSeconds(e),this.envelope.getValueAtTime(e)}get modulationIndex(){return this._oscillators[0].modulationIndex.value}set modulationIndex(e){this._oscillators.forEach((t=>t.modulationIndex.value=e))}get harmonicity(){return this._oscillators[0].harmonicity.value}set harmonicity(e){this._oscillators.forEach((t=>t.harmonicity.value=e))}get resonance(){return this._filterFreqScaler.min}set resonance(e){this._filterFreqScaler.min=this.toFrequency(e),this.octaves=this._octaves}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._filterFreqScaler.max=this._filterFreqScaler.min*Math.pow(2,e)}dispose(){return super.dispose(),this._oscillators.forEach((e=>e.dispose())),this._freqMultipliers.forEach((e=>e.dispose())),this.frequency.dispose(),this.detune.dispose(),this._filterFreqScaler.dispose(),this._amplitude.dispose(),this.envelope.dispose(),this._highpass.dispose(),this}}class to extends Gr{constructor(){super(Di(to.getDefaults(),arguments)),this.name="MembraneSynth",this.portamento=0;const e=Di(to.getDefaults(),arguments);this.pitchDecay=e.pitchDecay,this.octaves=e.octaves,Xi(this,["oscillator","envelope"])}static getDefaults(){return Ri(Ur.getDefaults(),Gr.getDefaults(),{envelope:{attack:.001,attackCurve:"exponential",decay:.4,release:1.4,sustain:.01},octaves:10,oscillator:{type:"sine"},pitchDecay:.05})}setNote(e,t){const n=this.toSeconds(t),a=this.toFrequency(e instanceof gs?e.toFrequency():e),i=a*this.octaves;return this.oscillator.frequency.setValueAtTime(i,n),this.oscillator.frequency.exponentialRampToValueAtTime(a,n+this.toSeconds(this.pitchDecay)),this}dispose(){return super.dispose(),this}}Ai([Sr(0)],to.prototype,"octaves",void 0),Ai([Er(0)],to.prototype,"pitchDecay",void 0);class no extends Vr{constructor(){super(Di(no.getDefaults(),arguments)),this.name="NoiseSynth";const e=Di(no.getDefaults(),arguments);this.noise=new nr(Object.assign({context:this.context},e.noise)),this.envelope=new Wr(Object.assign({context:this.context},e.envelope)),this.noise.chain(this.envelope,this.output)}static getDefaults(){return Object.assign(Vr.getDefaults(),{envelope:Object.assign(Oi(Pr.getDefaults(),Object.keys(Ss.getDefaults())),{decay:.1,sustain:0}),noise:Object.assign(Oi(nr.getDefaults(),Object.keys(er.getDefaults())),{type:"white"})})}triggerAttack(e,t=1){return e=this.toSeconds(e),this.envelope.triggerAttack(e,t),this.noise.start(e),0===this.envelope.sustain&&this.noise.stop(e+this.toSeconds(this.envelope.attack)+this.toSeconds(this.envelope.decay)),this}triggerRelease(e){return e=this.toSeconds(e),this.envelope.triggerRelease(e),this.noise.stop(e+this.toSeconds(this.envelope.release)),this}sync(){return this._syncState()&&(this._syncMethod("triggerAttack",0),this._syncMethod("triggerRelease",0)),this}triggerAttackRelease(e,t,n=1){return t=this.toSeconds(t),e=this.toSeconds(e),this.triggerAttack(t,n),this.triggerRelease(t+e),this}dispose(){return super.dispose(),this.noise.dispose(),this.envelope.dispose(),this}}const ao=new Set;function io(e){ao.add(e)}function so(e,t){const n=`registerProcessor("${e}", ${t})`;ao.add(n)}class ro extends Ss{constructor(e){super(e),this.name="ToneAudioWorklet",this.workletOptions={},this.onprocessorerror=Qi;const t=URL.createObjectURL(new Blob([Array.from(ao).join("\n")],{type:"text/javascript"})),n=this._audioWorkletName();this._dummyGain=this.context.createGain(),this._dummyParam=this._dummyGain.gain,this.context.addAudioWorkletModule(t,n).then((()=>{this.disposed||(this._worklet=this.context.createAudioWorkletNode(n,this.workletOptions),this._worklet.onprocessorerror=this.onprocessorerror.bind(this),this.onReady(this._worklet))}))}dispose(){return super.dispose(),this._dummyGain.disconnect(),this._worklet&&(this._worklet.port.postMessage("dispose"),this._worklet.disconnect()),this}}io('\n\t/**\n\t * The base AudioWorkletProcessor for use in Tone.js. Works with the [[ToneAudioWorklet]]. \n\t */\n\tclass ToneAudioWorkletProcessor extends AudioWorkletProcessor {\n\n\t\tconstructor(options) {\n\t\t\t\n\t\t\tsuper(options);\n\t\t\t/**\n\t\t\t * If the processor was disposed or not. Keep alive until it\'s disposed.\n\t\t\t */\n\t\t\tthis.disposed = false;\n\t\t \t/** \n\t\t\t * The number of samples in the processing block\n\t\t\t */\n\t\t\tthis.blockSize = 128;\n\t\t\t/**\n\t\t\t * the sample rate\n\t\t\t */\n\t\t\tthis.sampleRate = sampleRate;\n\n\t\t\tthis.port.onmessage = (event) => {\n\t\t\t\t// when it receives a dispose \n\t\t\t\tif (event.data === "dispose") {\n\t\t\t\t\tthis.disposed = true;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n');io("\n\t/**\n\t * Abstract class for a single input/output processor. \n\t * has a 'generate' function which processes one sample at a time\n\t */\n\tclass SingleIOProcessor extends ToneAudioWorkletProcessor {\n\n\t\tconstructor(options) {\n\t\t\tsuper(Object.assign(options, {\n\t\t\t\tnumberOfInputs: 1,\n\t\t\t\tnumberOfOutputs: 1\n\t\t\t}));\n\t\t\t/**\n\t\t\t * Holds the name of the parameter and a single value of that\n\t\t\t * parameter at the current sample\n\t\t\t * @type { [name: string]: number }\n\t\t\t */\n\t\t\tthis.params = {}\n\t\t}\n\n\t\t/**\n\t\t * Generate an output sample from the input sample and parameters\n\t\t * @abstract\n\t\t * @param input number\n\t\t * @param channel number\n\t\t * @param parameters { [name: string]: number }\n\t\t * @returns number\n\t\t */\n\t\tgenerate(){}\n\n\t\t/**\n\t\t * Update the private params object with the \n\t\t * values of the parameters at the given index\n\t\t * @param parameters { [name: string]: Float32Array },\n\t\t * @param index number\n\t\t */\n\t\tupdateParams(parameters, index) {\n\t\t\tfor (const paramName in parameters) {\n\t\t\t\tconst param = parameters[paramName];\n\t\t\t\tif (param.length > 1) {\n\t\t\t\t\tthis.params[paramName] = parameters[paramName][index];\n\t\t\t\t} else {\n\t\t\t\t\tthis.params[paramName] = parameters[paramName][0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Process a single frame of the audio\n\t\t * @param inputs Float32Array[][]\n\t\t * @param outputs Float32Array[][]\n\t\t */\n\t\tprocess(inputs, outputs, parameters) {\n\t\t\tconst input = inputs[0];\n\t\t\tconst output = outputs[0];\n\t\t\t// get the parameter values\n\t\t\tconst channelCount = Math.max(input && input.length || 0, output.length);\n\t\t\tfor (let sample = 0; sample < this.blockSize; sample++) {\n\t\t\t\tthis.updateParams(parameters, sample);\n\t\t\t\tfor (let channel = 0; channel < channelCount; channel++) {\n\t\t\t\t\tconst inputSample = input && input.length ? input[channel][sample] : 0;\n\t\t\t\t\toutput[channel][sample] = this.generate(inputSample, channel, this.params);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn !this.disposed;\n\t\t}\n\t};\n");io("\n\t/**\n\t * A multichannel buffer for use within an AudioWorkletProcessor as a delay line\n\t */\n\tclass DelayLine {\n\t\t\n\t\tconstructor(size, channels) {\n\t\t\tthis.buffer = [];\n\t\t\tthis.writeHead = []\n\t\t\tthis.size = size;\n\n\t\t\t// create the empty channels\n\t\t\tfor (let i = 0; i < channels; i++) {\n\t\t\t\tthis.buffer[i] = new Float32Array(this.size);\n\t\t\t\tthis.writeHead[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Push a value onto the end\n\t\t * @param channel number\n\t\t * @param value number\n\t\t */\n\t\tpush(channel, value) {\n\t\t\tthis.writeHead[channel] += 1;\n\t\t\tif (this.writeHead[channel] > this.size) {\n\t\t\t\tthis.writeHead[channel] = 0;\n\t\t\t}\n\t\t\tthis.buffer[channel][this.writeHead[channel]] = value;\n\t\t}\n\n\t\t/**\n\t\t * Get the recorded value of the channel given the delay\n\t\t * @param channel number\n\t\t * @param delay number delay samples\n\t\t */\n\t\tget(channel, delay) {\n\t\t\tlet readHead = this.writeHead[channel] - Math.floor(delay);\n\t\t\tif (readHead < 0) {\n\t\t\t\treadHead += this.size;\n\t\t\t}\n\t\t\treturn this.buffer[channel][readHead];\n\t\t}\n\t}\n");const oo="feedback-comb-filter";so(oo,'\n\tclass FeedbackCombFilterWorklet extends SingleIOProcessor {\n\n\t\tconstructor(options) {\n\t\t\tsuper(options);\n\t\t\tthis.delayLine = new DelayLine(this.sampleRate, options.channelCount || 2);\n\t\t}\n\n\t\tstatic get parameterDescriptors() {\n\t\t\treturn [{\n\t\t\t\tname: "delayTime",\n\t\t\t\tdefaultValue: 0.1,\n\t\t\t\tminValue: 0,\n\t\t\t\tmaxValue: 1,\n\t\t\t\tautomationRate: "k-rate"\n\t\t\t}, {\n\t\t\t\tname: "feedback",\n\t\t\t\tdefaultValue: 0.5,\n\t\t\t\tminValue: 0,\n\t\t\t\tmaxValue: 0.9999,\n\t\t\t\tautomationRate: "k-rate"\n\t\t\t}];\n\t\t}\n\n\t\tgenerate(input, channel, parameters) {\n\t\t\tconst delayedSample = this.delayLine.get(channel, parameters.delayTime * this.sampleRate);\n\t\t\tthis.delayLine.push(channel, input + delayedSample * parameters.feedback);\n\t\t\treturn delayedSample;\n\t\t}\n\t}\n');class lo extends ro{constructor(){super(Di(lo.getDefaults(),arguments,["delayTime","resonance"])),this.name="FeedbackCombFilter";const e=Di(lo.getDefaults(),arguments,["delayTime","resonance"]);this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this.delayTime=new Cs({context:this.context,value:e.delayTime,units:"time",minValue:0,maxValue:1,param:this._dummyParam,swappable:!0}),this.resonance=new Cs({context:this.context,value:e.resonance,units:"normalRange",param:this._dummyParam,swappable:!0}),Xi(this,["resonance","delayTime"])}_audioWorkletName(){return oo}static getDefaults(){return Object.assign(Ss.getDefaults(),{delayTime:.1,resonance:.5})}onReady(e){Es(this.input,e,this.output);const t=e.parameters.get("delayTime");this.delayTime.setParam(t);const n=e.parameters.get("feedback");this.resonance.setParam(n)}dispose(){return super.dispose(),this.input.dispose(),this.output.dispose(),this.delayTime.dispose(),this.resonance.dispose(),this}}class uo extends Ss{constructor(){super(Di(uo.getDefaults(),arguments,["frequency","type"])),this.name="OnePoleFilter";const e=Di(uo.getDefaults(),arguments,["frequency","type"]);this._frequency=e.frequency,this._type=e.type,this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this._createFilter()}static getDefaults(){return Object.assign(Ss.getDefaults(),{frequency:880,type:"lowpass"})}_createFilter(){const e=this._filter,t=this.toFrequency(this._frequency),n=1/(2*Math.PI*t);if("lowpass"===this._type){const e=1/(n*this.context.sampleRate),t=e-1;this._filter=this.context.createIIRFilter([e,0],[1,t])}else{const e=1/(n*this.context.sampleRate)-1;this._filter=this.context.createIIRFilter([1,-1],[1,e])}this.input.chain(this._filter,this.output),e&&this.context.setTimeout((()=>{this.disposed||(this.input.disconnect(e),e.disconnect())}),this.blockTime)}get frequency(){return this._frequency}set frequency(e){this._frequency=e,this._createFilter()}get type(){return this._type}set type(e){this._type=e,this._createFilter()}getFrequencyResponse(e=128){const t=new Float32Array(e);for(let n=0;nt.voice===e));this._activeVoices.splice(t,1)}_getNextAvailableVoice(){if(this._availableVoices.length)return this._availableVoices.shift();if(this._voices.lengthMath.ceil(this._averageActiveVoices+1)){const e=this._availableVoices.shift(),t=this._voices.indexOf(e);this._voices.splice(t,1),this.context.isOffline||e.dispose()}}_triggerAttack(e,t,n){e.forEach((e=>{const a=new Vs(this.context,e).toMidi(),i=this._getNextAvailableVoice();i&&(i.triggerAttack(e,t,n),this._activeVoices.push({midi:a,voice:i,released:!1}),this.log("triggerAttack",e,t))}))}_triggerRelease(e,t){e.forEach((e=>{const n=new Vs(this.context,e).toMidi(),a=this._activeVoices.find((({midi:e,released:t})=>e===n&&!t));a&&(a.voice.triggerRelease(t),a.released=!0,this.log("triggerRelease",e,t))}))}_scheduleEvent(e,t,n,a){ii(!this.disposed,"Synth was already disposed"),n<=this.now()?"attack"===e?this._triggerAttack(t,n,a):this._triggerRelease(t,n):this.context.setTimeout((()=>{this._scheduleEvent(e,t,n,a)}),n-this.now())}triggerAttack(e,t,n){Array.isArray(e)||(e=[e]);const a=this.toSeconds(t);return this._scheduleEvent("attack",e,a,n),this}triggerRelease(e,t){Array.isArray(e)||(e=[e]);const n=this.toSeconds(t);return this._scheduleEvent("release",e,n),this}triggerAttackRelease(e,t,n,a){const i=this.toSeconds(n);if(this.triggerAttack(e,i,a),yi(t)){ii(yi(e),"If the duration is an array, the notes must also be an array");for(let n=0;n0,"The duration must be greater than 0"),this.triggerRelease(e[n],i+s)}}else{const n=this.toSeconds(t);ii(n>0,"The duration must be greater than 0"),this.triggerRelease(e,i+n)}return this}sync(){return this._syncState()&&(this._syncMethod("triggerAttack",1),this._syncMethod("triggerRelease",1)),this}set(e){const t=Oi(e,["onsilence","context"]);return this.options=Ri(this.options,t),this._voices.forEach((e=>e.set(t))),this._dummyVoice.set(t),this}get(){return this._dummyVoice.get()}releaseAll(e){const t=this.toSeconds(e);return this._activeVoices.forEach((({voice:e})=>{e.triggerRelease(t)})),this}dispose(){return super.dispose(),this._dummyVoice.dispose(),this._voices.forEach((e=>e.dispose())),this._activeVoices=[],this._availableVoices=[],this.context.clearInterval(this._gcTimeout),this}}class mo extends Vr{constructor(){super(Di(mo.getDefaults(),arguments,["urls","onload","baseUrl"],"urls")),this.name="Sampler",this._activeSources=new Map;const e=Di(mo.getDefaults(),arguments,["urls","onload","baseUrl"],"urls"),t={};Object.keys(e.urls).forEach((n=>{const a=parseInt(n,10);if(ii(vi(n)||mi(a)&&isFinite(a),`url key is neither a note or midi pitch: ${n}`),vi(n)){const a=new gs(this.context,n).toMidi();t[a]=e.urls[n]}else mi(a)&&isFinite(a)&&(t[a]=e.urls[a])})),this._buffers=new js({urls:t,onload:e.onload,baseUrl:e.baseUrl,onerror:e.onerror}),this.attack=e.attack,this.release=e.release,this.curve=e.curve,this._buffers.loaded&&Promise.resolve().then(e.onload)}static getDefaults(){return Object.assign(Vr.getDefaults(),{attack:0,baseUrl:"",curve:"exponential",onload:Qi,onerror:Qi,release:.1,urls:{}})}_findClosest(e){let t=0;for(;t<96;){if(this._buffers.has(e+t))return-t;if(this._buffers.has(e-t))return t;t++}throw new Error(`No available buffers for note: ${e}`)}triggerAttack(e,t,n=1){return this.log("triggerAttack",e,t,n),Array.isArray(e)||(e=[e]),e.forEach((e=>{const a=hs(new gs(this.context,e).toFrequency()),i=Math.round(a),s=a-i,r=this._findClosest(i),o=i-r,l=this._buffers.get(o),u=ls(r+s),c=new tr({url:l,context:this.context,curve:this.curve,fadeIn:this.attack,fadeOut:this.release,playbackRate:u}).connect(this.output);c.start(t,0,l.duration/u,n),yi(this._activeSources.get(i))||this._activeSources.set(i,[]),this._activeSources.get(i).push(c),c.onended=()=>{if(this._activeSources&&this._activeSources.has(i)){const e=this._activeSources.get(i),t=e.indexOf(c);-1!==t&&e.splice(t,1)}}})),this}triggerRelease(e,t){return this.log("triggerRelease",e,t),Array.isArray(e)||(e=[e]),e.forEach((e=>{const n=new gs(this.context,e).toMidi();if(this._activeSources.has(n)&&this._activeSources.get(n).length){const e=this._activeSources.get(n);t=this.toSeconds(t),e.forEach((e=>{e.stop(t)})),this._activeSources.set(n,[])}})),this}releaseAll(e){const t=this.toSeconds(e);return this._activeSources.forEach((e=>{for(;e.length;){e.shift().stop(t)}})),this}sync(){return this._syncState()&&(this._syncMethod("triggerAttack",1),this._syncMethod("triggerRelease",1)),this}triggerAttackRelease(e,t,n,a=1){const i=this.toSeconds(n);return this.triggerAttack(e,i,a),yi(t)?(ii(yi(e),"notes must be an array when duration is array"),e.forEach(((e,n)=>{const a=t[Math.min(n,t.length-1)];this.triggerRelease(e,i+this.toSeconds(a))}))):this.triggerRelease(e,i+this.toSeconds(t)),this}add(e,t,n){if(ii(vi(e)||isFinite(e),`note must be a pitch or midi: ${e}`),vi(e)){const a=new gs(this.context,e).toMidi();this._buffers.add(a,t,n)}else this._buffers.add(e,t,n);return this}get loaded(){return this._buffers.loaded}dispose(){return super.dispose(),this._buffers.dispose(),this._activeSources.forEach((e=>{e.forEach((e=>e.dispose()))})),this._activeSources.clear(),this}}Ai([Er(0)],mo.prototype,"attack",void 0),Ai([Er(0)],mo.prototype,"release",void 0);class fo extends As{constructor(){super(Di(fo.getDefaults(),arguments,["callback","value"])),this.name="ToneEvent",this._state=new xs("stopped"),this._startOffset=0;const e=Di(fo.getDefaults(),arguments,["callback","value"]);this._loop=e.loop,this.callback=e.callback,this.value=e.value,this._loopStart=this.toTicks(e.loopStart),this._loopEnd=this.toTicks(e.loopEnd),this._playbackRate=e.playbackRate,this._probability=e.probability,this._humanize=e.humanize,this.mute=e.mute,this._playbackRate=e.playbackRate,this._state.increasing=!0,this._rescheduleEvents()}static getDefaults(){return Object.assign(As.getDefaults(),{callback:Qi,humanize:!1,loop:!1,loopEnd:"1m",loopStart:0,mute:!1,playbackRate:1,probability:1,value:null})}_rescheduleEvents(e=-1){this._state.forEachFrom(e,(e=>{let t;if("started"===e.state){-1!==e.id&&this.context.transport.clear(e.id);const n=e.time+Math.round(this.startOffset/this._playbackRate);if(!0===this._loop||mi(this._loop)&&this._loop>1){t=1/0,mi(this._loop)&&(t=this._loop*this._getLoopDuration());const a=this._state.getAfter(n);null!==a&&(t=Math.min(t,a.time-n)),t!==1/0&&(this._state.setStateAtTime("stopped",n+t+1,{id:-1}),t=new Ws(this.context,t));const i=new Ws(this.context,this._getLoopDuration());e.id=this.context.transport.scheduleRepeat(this._tick.bind(this),i,new Ws(this.context,n),t)}else e.id=this.context.transport.schedule(this._tick.bind(this),new Ws(this.context,n))}}))}get state(){return this._state.getValueAtTime(this.context.transport.ticks)}get startOffset(){return this._startOffset}set startOffset(e){this._startOffset=e}get probability(){return this._probability}set probability(e){this._probability=e}get humanize(){return this._humanize}set humanize(e){this._humanize=e}start(e){const t=this.toTicks(e);return"stopped"===this._state.getValueAtTime(t)&&(this._state.add({id:-1,state:"started",time:t}),this._rescheduleEvents(t)),this}stop(e){this.cancel(e);const t=this.toTicks(e);if("started"===this._state.getValueAtTime(t)){this._state.setStateAtTime("stopped",t,{id:-1});const e=this._state.getBefore(t);let n=t;null!==e&&(n=e.time),this._rescheduleEvents(n)}return this}cancel(e){e=zi(e,-1/0);const t=this.toTicks(e);return this._state.forEachFrom(t,(e=>{this.context.transport.clear(e.id)})),this._state.cancel(t),this}_tick(e){const t=this.context.transport.getTicksAtTime(e);if(!this.mute&&"started"===this._state.getValueAtTime(t)){if(this.probability<1&&Math.random()>this.probability)return;if(this.humanize){let t=.02;gi(this.humanize)||(t=this.toSeconds(this.humanize)),e+=(2*Math.random()-1)*t}this.callback(e,this.value)}}_getLoopDuration(){return Math.round((this._loopEnd-this._loopStart)/this._playbackRate)}get loop(){return this._loop}set loop(e){this._loop=e,this._rescheduleEvents()}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this._rescheduleEvents()}get loopEnd(){return new Ws(this.context,this._loopEnd).toSeconds()}set loopEnd(e){this._loopEnd=this.toTicks(e),this._loop&&this._rescheduleEvents()}get loopStart(){return new Ws(this.context,this._loopStart).toSeconds()}set loopStart(e){this._loopStart=this.toTicks(e),this._loop&&this._rescheduleEvents()}get progress(){if(this._loop){const e=this.context.transport.ticks,t=this._state.get(e);if(null!==t&&"started"===t.state){const n=this._getLoopDuration();return(e-t.time)%n/n}return 0}return 0}dispose(){return super.dispose(),this.cancel(),this._state.dispose(),this}}class go extends As{constructor(){super(Di(go.getDefaults(),arguments,["callback","interval"])),this.name="Loop";const e=Di(go.getDefaults(),arguments,["callback","interval"]);this._event=new fo({context:this.context,callback:this._tick.bind(this),loop:!0,loopEnd:e.interval,playbackRate:e.playbackRate,probability:e.probability}),this.callback=e.callback,this.iterations=e.iterations}static getDefaults(){return Object.assign(As.getDefaults(),{interval:"4n",callback:Qi,playbackRate:1,iterations:1/0,probability:1,mute:!1,humanize:!1})}start(e){return this._event.start(e),this}stop(e){return this._event.stop(e),this}cancel(e){return this._event.cancel(e),this}_tick(e){this.callback(e)}get state(){return this._event.state}get progress(){return this._event.progress}get interval(){return this._event.loopEnd}set interval(e){this._event.loopEnd=e}get playbackRate(){return this._event.playbackRate}set playbackRate(e){this._event.playbackRate=e}get humanize(){return this._event.humanize}set humanize(e){this._event.humanize=e}get probability(){return this._event.probability}set probability(e){this._event.probability=e}get mute(){return this._event.mute}set mute(e){this._event.mute=e}get iterations(){return!0===this._event.loop?1/0:this._event.loop}set iterations(e){this._event.loop=e===1/0||e}dispose(){return super.dispose(),this._event.dispose(),this}}class yo extends fo{constructor(){super(Di(yo.getDefaults(),arguments,["callback","events"])),this.name="Part",this._state=new xs("stopped"),this._events=new Set;const e=Di(yo.getDefaults(),arguments,["callback","events"]);this._state.increasing=!0,e.events.forEach((e=>{yi(e)?this.add(e[0],e[1]):this.add(e)}))}static getDefaults(){return Object.assign(fo.getDefaults(),{events:[]})}start(e,t){const n=this.toTicks(e);if("started"!==this._state.getValueAtTime(n)){t=zi(t,this._loop?this._loopStart:0),t=this._loop?zi(t,this._loopStart):zi(t,0);const e=this.toTicks(t);this._state.add({id:-1,offset:e,state:"started",time:n}),this._forEach((t=>{this._startNote(t,n,e)}))}return this}_startNote(e,t,n){t-=n,this._loop?e.startOffset>=this._loopStart&&e.startOffset=n&&(e.loop=!1,e.start(new Ws(this.context,t))):e.startOffset>=n&&e.start(new Ws(this.context,t))}get startOffset(){return this._startOffset}set startOffset(e){this._startOffset=e,this._forEach((e=>{e.startOffset+=this._startOffset}))}stop(e){const t=this.toTicks(e);return this._state.cancel(t),this._state.setStateAtTime("stopped",t),this._forEach((t=>{t.stop(e)})),this}at(e,t){const n=new ks(this.context,e).toTicks(),a=new Ws(this.context,1).toSeconds(),i=this._events.values();let s=i.next();for(;!s.done;){const e=s.value;if(Math.abs(n-e.startOffset){"started"===t.state?this._startNote(e,t.time,t.offset):e.stop(new Ws(this.context,t.time))}))}remove(e,t){return fi(e)&&e.hasOwnProperty("time")&&(e=(t=e).time),e=this.toTicks(e),this._events.forEach((n=>{n.startOffset===e&&(hi(t)||di(t)&&n.value===t)&&(this._events.delete(n),n.dispose())})),this}clear(){return this._forEach((e=>e.dispose())),this._events.clear(),this}cancel(e){return this._forEach((t=>t.cancel(e))),this._state.cancel(this.toTicks(e)),this}_forEach(e){return this._events&&this._events.forEach((t=>{t instanceof yo?t._forEach(e):e(t)})),this}_setAll(e,t){this._forEach((n=>{n[e]=t}))}_tick(e,t){this.mute||this.callback(e,t)}_testLoopBoundries(e){this._loop&&(e.startOffset=this._loopEnd)?e.cancel(0):"stopped"===e.state&&this._restartEvent(e)}get probability(){return this._probability}set probability(e){this._probability=e,this._setAll("probability",e)}get humanize(){return this._humanize}set humanize(e){this._humanize=e,this._setAll("humanize",e)}get loop(){return this._loop}set loop(e){this._loop=e,this._forEach((t=>{t.loopStart=this.loopStart,t.loopEnd=this.loopEnd,t.loop=e,this._testLoopBoundries(t)}))}get loopEnd(){return new Ws(this.context,this._loopEnd).toSeconds()}set loopEnd(e){this._loopEnd=this.toTicks(e),this._loop&&this._forEach((t=>{t.loopEnd=e,this._testLoopBoundries(t)}))}get loopStart(){return new Ws(this.context,this._loopStart).toSeconds()}set loopStart(e){this._loopStart=this.toTicks(e),this._loop&&this._forEach((e=>{e.loopStart=this.loopStart,this._testLoopBoundries(e)}))}get playbackRate(){return this._playbackRate}set playbackRate(e){this._playbackRate=e,this._setAll("playbackRate",e)}get length(){return this._events.size}dispose(){return super.dispose(),this.clear(),this}}function*bo(e){let t=0;for(;t=0;)t=wo(t,e),yield e[t],t--}function*ko(e,t){for(;;)yield*t(e)}function wo(e,t){return Vi(e,0,t.length-1)}function*Ao(e,t){let n=t?0:e.length-1;for(;;)n=wo(n,e),yield e[n],t?(n++,n>=e.length-1&&(t=!1)):(n--,n<=0&&(t=!0))}function*xo(e){let t=0,n=0;for(;t=0;)t=wo(t,e),yield e[t],n++,t+=n%2?-2:1}function*So(e){const t=[];for(let n=0;n0;){const n=wo(t.splice(Math.floor(t.length*Math.random()),1)[0],e);yield e[n]}}function*Eo(e,t="up",n=0){switch(ii(e.length>0,"The array must have more than one value in it"),t){case"up":yield*ko(e,bo);case"down":yield*ko(e,vo);case"upDown":yield*Ao(e,!0);case"downUp":yield*Ao(e,!1);case"alternateUp":yield*ko(e,xo);case"alternateDown":yield*ko(e,Co);case"random":yield*function*(e){for(;;){const t=Math.floor(Math.random()*e.length);yield e[t]}}(e);case"randomOnce":yield*ko(e,So);case"randomWalk":yield*function*(e){let t=Math.floor(Math.random()*e.length);for(;;)0===t?t++:t===e.length-1||Math.random()<.5?t--:t++,yield e[t]}(e)}}class _o extends go{constructor(){super(Di(_o.getDefaults(),arguments,["callback","values","pattern"])),this.name="Pattern";const e=Di(_o.getDefaults(),arguments,["callback","values","pattern"]);this.callback=e.callback,this._values=e.values,this._pattern=Eo(e.values,e.pattern),this._type=e.pattern}static getDefaults(){return Object.assign(go.getDefaults(),{pattern:"up",values:[],callback:Qi})}_tick(e){const t=this._pattern.next();this._value=t.value,this.callback(e,this._value)}get values(){return this._values}set values(e){this._values=e,this.pattern=this._type}get value(){return this._value}get pattern(){return this._type}set pattern(e){this._type=e,this._pattern=Eo(this._values,this._type)}}class To extends fo{constructor(){super(Di(To.getDefaults(),arguments,["callback","events","subdivision"])),this.name="Sequence",this._part=new yo({callback:this._seqCallback.bind(this),context:this.context}),this._events=[],this._eventsArray=[];const e=Di(To.getDefaults(),arguments,["callback","events","subdivision"]);this._subdivision=this.toTicks(e.subdivision),this.events=e.events,this.loop=e.loop,this.loopStart=e.loopStart,this.loopEnd=e.loopEnd,this.playbackRate=e.playbackRate,this.probability=e.probability,this.humanize=e.humanize,this.mute=e.mute,this.playbackRate=e.playbackRate}static getDefaults(){return Object.assign(Oi(fo.getDefaults(),["value"]),{events:[],loop:!0,loopEnd:0,loopStart:0,subdivision:"8n"})}_seqCallback(e,t){null!==t&&this.callback(e,t)}get events(){return this._events}set events(e){this.clear(),this._eventsArray=e,this._events=this._createSequence(this._eventsArray),this._eventsUpdated()}start(e,t){return this._part.start(e,t?this._indexTime(t):t),this}stop(e){return this._part.stop(e),this}get subdivision(){return new Ws(this.context,this._subdivision).toSeconds()}_createSequence(e){return new Proxy(e,{get:(e,t)=>e[t],set:(e,t,n)=>(bi(t)&&isFinite(parseInt(t,10))&&yi(n)?e[t]=this._createSequence(n):e[t]=n,this._eventsUpdated(),!0)})}_eventsUpdated(){this._part.clear(),this._rescheduleSequence(this._eventsArray,this._subdivision,this.startOffset),this.loopEnd=this.loopEnd}_rescheduleSequence(e,t,n){e.forEach(((e,a)=>{const i=a*t+n;if(yi(e))this._rescheduleSequence(e,t/e.length,i);else{const t=new Ws(this.context,i,"i").toSeconds();this._part.add(t,e)}}))}_indexTime(e){return new Ws(this.context,e*this._subdivision+this.startOffset).toSeconds()}clear(){return this._part.clear(),this}dispose(){return super.dispose(),this._part.dispose(),this}get loop(){return this._part.loop}set loop(e){this._part.loop=e}get loopStart(){return this._loopStart}set loopStart(e){this._loopStart=e,this._part.loopStart=this._indexTime(e)}get loopEnd(){return this._loopEnd}set loopEnd(e){this._loopEnd=e,this._part.loopEnd=0===e?this._indexTime(this._eventsArray.length):this._indexTime(e)}get startOffset(){return this._part.startOffset}set startOffset(e){this._part.startOffset=e}get playbackRate(){return this._part.playbackRate}set playbackRate(e){this._part.playbackRate=e}get probability(){return this._part.probability}set probability(e){this._part.probability=e}get progress(){return this._part.progress}get humanize(){return this._part.humanize}set humanize(e){this._part.humanize=e}get length(){return this._part.length}}class Io extends Ss{constructor(){super(Object.assign(Di(Io.getDefaults(),arguments,["fade"]))),this.name="CrossFade",this._panner=this.context.createStereoPanner(),this._split=this.context.createChannelSplitter(2),this._g2a=new Rr({context:this.context}),this.a=new Is({context:this.context,gain:0}),this.b=new Is({context:this.context,gain:0}),this.output=new Is({context:this.context}),this._internalChannels=[this.a,this.b];const e=Di(Io.getDefaults(),arguments,["fade"]);this.fade=new Ds({context:this.context,units:"normalRange",value:e.fade}),Xi(this,"fade"),this.context.getConstant(1).connect(this._panner),this._panner.connect(this._split),this._panner.channelCount=1,this._panner.channelCountMode="explicit",_s(this._split,this.a.gain,0),_s(this._split,this.b.gain,1),this.fade.chain(this._g2a,this._panner.pan),this.a.connect(this.output),this.b.connect(this.output)}static getDefaults(){return Object.assign(Ss.getDefaults(),{fade:.5})}dispose(){return super.dispose(),this.a.dispose(),this.b.dispose(),this.output.dispose(),this.fade.dispose(),this._g2a.dispose(),this._panner.disconnect(),this._split.disconnect(),this}}class No extends Ss{constructor(e){super(e),this.name="Effect",this._dryWet=new Io({context:this.context}),this.wet=this._dryWet.fade,this.effectSend=new Is({context:this.context}),this.effectReturn=new Is({context:this.context}),this.input=new Is({context:this.context}),this.output=this._dryWet,this.input.fan(this._dryWet.a,this.effectSend),this.effectReturn.connect(this._dryWet.b),this.wet.setValueAtTime(e.wet,0),this._internalChannels=[this.effectReturn,this.effectSend],Xi(this,"wet")}static getDefaults(){return Object.assign(Ss.getDefaults(),{wet:1})}connectEffect(e){return this._internalChannels.push(e),this.effectSend.chain(e,this.effectReturn),this}dispose(){return super.dispose(),this._dryWet.dispose(),this.effectSend.dispose(),this.effectReturn.dispose(),this.wet.dispose(),this}}class Ro extends No{constructor(e){super(e),this.name="LFOEffect",this._lfo=new Cr({context:this.context,frequency:e.frequency,amplitude:e.depth}),this.depth=this._lfo.amplitude,this.frequency=this._lfo.frequency,this.type=e.type,Xi(this,["frequency","depth"])}static getDefaults(){return Object.assign(No.getDefaults(),{frequency:1,type:"sine",depth:1})}start(e){return this._lfo.start(e),this}stop(e){return this._lfo.stop(e),this}sync(){return this._lfo.sync(),this}unsync(){return this._lfo.unsync(),this}get type(){return this._lfo.type}set type(e){this._lfo.type=e}dispose(){return super.dispose(),this._lfo.dispose(),this.frequency.dispose(),this.depth.dispose(),this}}class Do extends Ro{constructor(){super(Di(Do.getDefaults(),arguments,["frequency","baseFrequency","octaves"])),this.name="AutoFilter";const e=Di(Do.getDefaults(),arguments,["frequency","baseFrequency","octaves"]);this.filter=new $r(Object.assign(e.filter,{context:this.context})),this.connectEffect(this.filter),this._lfo.connect(this.filter.frequency),this.octaves=e.octaves,this.baseFrequency=e.baseFrequency}static getDefaults(){return Object.assign(Ro.getDefaults(),{baseFrequency:200,octaves:2.6,filter:{type:"lowpass",rolloff:-12,Q:1}})}get baseFrequency(){return this._lfo.min}set baseFrequency(e){this._lfo.min=this.toFrequency(e),this.octaves=this._octaves}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._lfo.max=this._lfo.min*Math.pow(2,e)}dispose(){return super.dispose(),this.filter.dispose(),this}}class zo extends Ss{constructor(){super(Object.assign(Di(zo.getDefaults(),arguments,["pan"]))),this.name="Panner",this._panner=this.context.createStereoPanner(),this.input=this._panner,this.output=this._panner;const e=Di(zo.getDefaults(),arguments,["pan"]);this.pan=new Cs({context:this.context,param:this._panner.pan,value:e.pan,minValue:-1,maxValue:1}),this._panner.channelCount=e.channelCount,this._panner.channelCountMode="explicit",Xi(this,"pan")}static getDefaults(){return Object.assign(Ss.getDefaults(),{pan:0,channelCount:1})}dispose(){return super.dispose(),this._panner.disconnect(),this.pan.dispose(),this}}class Oo extends Ro{constructor(){super(Di(Oo.getDefaults(),arguments,["frequency"])),this.name="AutoPanner";const e=Di(Oo.getDefaults(),arguments,["frequency"]);this._panner=new zo({context:this.context,channelCount:e.channelCount}),this.connectEffect(this._panner),this._lfo.connect(this._panner.pan),this._lfo.min=-1,this._lfo.max=1}static getDefaults(){return Object.assign(Ro.getDefaults(),{channelCount:1})}dispose(){return super.dispose(),this._panner.dispose(),this}}class Mo extends Ss{constructor(){super(Di(Mo.getDefaults(),arguments,["smoothing"])),this.name="Follower";const e=Di(Mo.getDefaults(),arguments,["smoothing"]);this._abs=this.input=new Nr({context:this.context}),this._lowpass=this.output=new uo({context:this.context,frequency:1/this.toSeconds(e.smoothing),type:"lowpass"}),this._abs.connect(this._lowpass),this._smoothing=e.smoothing}static getDefaults(){return Object.assign(Ss.getDefaults(),{smoothing:.05})}get smoothing(){return this._smoothing}set smoothing(e){this._smoothing=e,this._lowpass.frequency=1/this.toSeconds(this.smoothing)}dispose(){return super.dispose(),this._abs.dispose(),this._lowpass.dispose(),this}}class Bo extends No{constructor(){super(Di(Bo.getDefaults(),arguments,["baseFrequency","octaves","sensitivity"])),this.name="AutoWah";const e=Di(Bo.getDefaults(),arguments,["baseFrequency","octaves","sensitivity"]);this._follower=new Mo({context:this.context,smoothing:e.follower}),this._sweepRange=new Fr({context:this.context,min:0,max:1,exponent:.5}),this._baseFrequency=this.toFrequency(e.baseFrequency),this._octaves=e.octaves,this._inputBoost=new Is({context:this.context}),this._bandpass=new $r({context:this.context,rolloff:-48,frequency:0,Q:e.Q}),this._peaking=new $r({context:this.context,type:"peaking"}),this._peaking.gain.value=e.gain,this.gain=this._peaking.gain,this.Q=this._bandpass.Q,this.effectSend.chain(this._inputBoost,this._follower,this._sweepRange),this._sweepRange.connect(this._bandpass.frequency),this._sweepRange.connect(this._peaking.frequency),this.effectSend.chain(this._bandpass,this._peaking,this.effectReturn),this._setSweepRange(),this.sensitivity=e.sensitivity,Xi(this,["gain","Q"])}static getDefaults(){return Object.assign(No.getDefaults(),{baseFrequency:100,octaves:6,sensitivity:0,Q:2,gain:2,follower:.2})}get octaves(){return this._octaves}set octaves(e){this._octaves=e,this._setSweepRange()}get follower(){return this._follower.smoothing}set follower(e){this._follower.smoothing=e}get baseFrequency(){return this._baseFrequency}set baseFrequency(e){this._baseFrequency=this.toFrequency(e),this._setSweepRange()}get sensitivity(){return os(1/this._inputBoost.gain.value)}set sensitivity(e){this._inputBoost.gain.value=1/rs(e)}_setSweepRange(){this._sweepRange.min=this._baseFrequency,this._sweepRange.max=Math.min(this._baseFrequency*Math.pow(2,this._octaves),this.context.sampleRate/2)}dispose(){return super.dispose(),this._follower.dispose(),this._sweepRange.dispose(),this._bandpass.dispose(),this._peaking.dispose(),this._inputBoost.dispose(),this}}const Fo="bit-crusher";so(Fo,"\n\tclass BitCrusherWorklet extends SingleIOProcessor {\n\n\t\tstatic get parameterDescriptors() {\n\t\t\treturn [{\n\t\t\t\tname: \"bits\",\n\t\t\t\tdefaultValue: 12,\n\t\t\t\tminValue: 1,\n\t\t\t\tmaxValue: 16,\n\t\t\t\tautomationRate: 'k-rate'\n\t\t\t}];\n\t\t}\n\n\t\tgenerate(input, _channel, parameters) {\n\t\t\tconst step = Math.pow(0.5, parameters.bits - 1);\n\t\t\tconst val = step * Math.floor(input / step + 0.5);\n\t\t\treturn val;\n\t\t}\n\t}\n");class Lo extends No{constructor(){super(Di(Lo.getDefaults(),arguments,["bits"])),this.name="BitCrusher";const e=Di(Lo.getDefaults(),arguments,["bits"]);this._bitCrusherWorklet=new Po({context:this.context,bits:e.bits}),this.connectEffect(this._bitCrusherWorklet),this.bits=this._bitCrusherWorklet.bits}static getDefaults(){return Object.assign(No.getDefaults(),{bits:4})}dispose(){return super.dispose(),this._bitCrusherWorklet.dispose(),this}}class Po extends ro{constructor(){super(Di(Po.getDefaults(),arguments)),this.name="BitCrusherWorklet";const e=Di(Po.getDefaults(),arguments);this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this.bits=new Cs({context:this.context,value:e.bits,units:"positive",minValue:1,maxValue:16,param:this._dummyParam,swappable:!0})}static getDefaults(){return Object.assign(ro.getDefaults(),{bits:12})}_audioWorkletName(){return Fo}onReady(e){Es(this.input,e,this.output);const t=e.parameters.get("bits");this.bits.setParam(t)}dispose(){return super.dispose(),this.input.dispose(),this.output.dispose(),this.bits.dispose(),this}}class jo extends No{constructor(){super(Di(jo.getDefaults(),arguments,["order"])),this.name="Chebyshev";const e=Di(jo.getDefaults(),arguments,["order"]);this._shaper=new hr({context:this.context,length:4096}),this._order=e.order,this.connectEffect(this._shaper),this.order=e.order,this.oversample=e.oversample}static getDefaults(){return Object.assign(No.getDefaults(),{order:1,oversample:"none"})}_getCoefficient(e,t,n){return n.has(t)||(0===t?n.set(t,0):1===t?n.set(t,e):n.set(t,2*e*this._getCoefficient(e,t-1,n)-this._getCoefficient(e,t-2,n))),n.get(t)}get order(){return this._order}set order(e){this._order=e,this._shaper.setMap((t=>this._getCoefficient(t,e,new Map)))}get oversample(){return this._shaper.oversample}set oversample(e){this._shaper.oversample=e}dispose(){return super.dispose(),this._shaper.dispose(),this}}class Vo extends Ss{constructor(){super(Di(Vo.getDefaults(),arguments,["channels"])),this.name="Split";const e=Di(Vo.getDefaults(),arguments,["channels"]);this._splitter=this.input=this.output=this.context.createChannelSplitter(e.channels),this._internalChannels=[this._splitter]}static getDefaults(){return Object.assign(Ss.getDefaults(),{channels:2})}dispose(){return super.dispose(),this._splitter.disconnect(),this}}class Uo extends Ss{constructor(){super(Di(Uo.getDefaults(),arguments,["channels"])),this.name="Merge";const e=Di(Uo.getDefaults(),arguments,["channels"]);this._merger=this.output=this.input=this.context.createChannelMerger(e.channels)}static getDefaults(){return Object.assign(Ss.getDefaults(),{channels:2})}dispose(){return super.dispose(),this._merger.disconnect(),this}}class Wo extends Ss{constructor(e){super(e),this.name="StereoEffect",this.input=new Is({context:this.context}),this.input.channelCount=2,this.input.channelCountMode="explicit",this._dryWet=this.output=new Io({context:this.context,fade:e.wet}),this.wet=this._dryWet.fade,this._split=new Vo({context:this.context,channels:2}),this._merge=new Uo({context:this.context,channels:2}),this.input.connect(this._split),this.input.connect(this._dryWet.a),this._merge.connect(this._dryWet.b),Xi(this,["wet"])}connectEffectLeft(...e){this._split.connect(e[0],0,0),Es(...e),_s(e[e.length-1],this._merge,0,0)}connectEffectRight(...e){this._split.connect(e[0],1,0),Es(...e),_s(e[e.length-1],this._merge,0,1)}static getDefaults(){return Object.assign(Ss.getDefaults(),{wet:1})}dispose(){return super.dispose(),this._dryWet.dispose(),this._split.dispose(),this._merge.dispose(),this}}class Go extends Wo{constructor(e){super(e),this.feedback=new Ds({context:this.context,value:e.feedback,units:"normalRange"}),this._feedbackL=new Is({context:this.context}),this._feedbackR=new Is({context:this.context}),this._feedbackSplit=new Vo({context:this.context,channels:2}),this._feedbackMerge=new Uo({context:this.context,channels:2}),this._merge.connect(this._feedbackSplit),this._feedbackMerge.connect(this._split),this._feedbackSplit.connect(this._feedbackL,0,0),this._feedbackL.connect(this._feedbackMerge,0,0),this._feedbackSplit.connect(this._feedbackR,1,0),this._feedbackR.connect(this._feedbackMerge,0,1),this.feedback.fan(this._feedbackL.gain,this._feedbackR.gain),Xi(this,["feedback"])}static getDefaults(){return Object.assign(Wo.getDefaults(),{feedback:.5})}dispose(){return super.dispose(),this.feedback.dispose(),this._feedbackL.dispose(),this._feedbackR.dispose(),this._feedbackSplit.dispose(),this._feedbackMerge.dispose(),this}}class qo extends Go{constructor(){super(Di(qo.getDefaults(),arguments,["frequency","delayTime","depth"])),this.name="Chorus";const e=Di(qo.getDefaults(),arguments,["frequency","delayTime","depth"]);this._depth=e.depth,this._delayTime=e.delayTime/1e3,this._lfoL=new Cr({context:this.context,frequency:e.frequency,min:0,max:1}),this._lfoR=new Cr({context:this.context,frequency:e.frequency,min:0,max:1,phase:180}),this._delayNodeL=new Ls({context:this.context}),this._delayNodeR=new Ls({context:this.context}),this.frequency=this._lfoL.frequency,Xi(this,["frequency"]),this._lfoL.frequency.connect(this._lfoR.frequency),this.connectEffectLeft(this._delayNodeL),this.connectEffectRight(this._delayNodeR),this._lfoL.connect(this._delayNodeL.delayTime),this._lfoR.connect(this._delayNodeR.delayTime),this.depth=this._depth,this.type=e.type,this.spread=e.spread}static getDefaults(){return Object.assign(Go.getDefaults(),{frequency:1.5,delayTime:3.5,depth:.7,type:"sine",spread:180,feedback:0,wet:.5})}get depth(){return this._depth}set depth(e){this._depth=e;const t=this._delayTime*e;this._lfoL.min=Math.max(this._delayTime-t,0),this._lfoL.max=this._delayTime+t,this._lfoR.min=Math.max(this._delayTime-t,0),this._lfoR.max=this._delayTime+t}get delayTime(){return 1e3*this._delayTime}set delayTime(e){this._delayTime=e/1e3,this.depth=this._depth}get type(){return this._lfoL.type}set type(e){this._lfoL.type=e,this._lfoR.type=e}get spread(){return this._lfoR.phase-this._lfoL.phase}set spread(e){this._lfoL.phase=90-e/2,this._lfoR.phase=e/2+90}start(e){return this._lfoL.start(e),this._lfoR.start(e),this}stop(e){return this._lfoL.stop(e),this._lfoR.stop(e),this}sync(){return this._lfoL.sync(),this._lfoR.sync(),this}unsync(){return this._lfoL.unsync(),this._lfoR.unsync(),this}dispose(){return super.dispose(),this._lfoL.dispose(),this._lfoR.dispose(),this._delayNodeL.dispose(),this._delayNodeR.dispose(),this.frequency.dispose(),this}}class Ho extends No{constructor(){super(Di(Ho.getDefaults(),arguments,["distortion"])),this.name="Distortion";const e=Di(Ho.getDefaults(),arguments,["distortion"]);this._shaper=new hr({context:this.context,length:4096}),this._distortion=e.distortion,this.connectEffect(this._shaper),this.distortion=e.distortion,this.oversample=e.oversample}static getDefaults(){return Object.assign(No.getDefaults(),{distortion:.4,oversample:"none"})}get distortion(){return this._distortion}set distortion(e){this._distortion=e;const t=100*e,n=Math.PI/180;this._shaper.setMap((e=>Math.abs(e)<.001?0:(3+t)*e*20*n/(Math.PI+t*Math.abs(e))))}get oversample(){return this._shaper.oversample}set oversample(e){this._shaper.oversample=e}dispose(){return super.dispose(),this._shaper.dispose(),this}}class Ko extends No{constructor(e){super(e),this.name="FeedbackEffect",this._feedbackGain=new Is({context:this.context,gain:e.feedback,units:"normalRange"}),this.feedback=this._feedbackGain.gain,Xi(this,"feedback"),this.effectReturn.chain(this._feedbackGain,this.effectSend)}static getDefaults(){return Object.assign(No.getDefaults(),{feedback:.125})}dispose(){return super.dispose(),this._feedbackGain.dispose(),this.feedback.dispose(),this}}class $o extends Ko{constructor(){super(Di($o.getDefaults(),arguments,["delayTime","feedback"])),this.name="FeedbackDelay";const e=Di($o.getDefaults(),arguments,["delayTime","feedback"]);this._delayNode=new Ls({context:this.context,delayTime:e.delayTime,maxDelay:e.maxDelay}),this.delayTime=this._delayNode.delayTime,this.connectEffect(this._delayNode),Xi(this,"delayTime")}static getDefaults(){return Object.assign(Ko.getDefaults(),{delayTime:.25,maxDelay:1})}dispose(){return super.dispose(),this._delayNode.dispose(),this.delayTime.dispose(),this}}class Zo extends Ss{constructor(e){super(e),this.name="PhaseShiftAllpass",this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this.offset90=new Is({context:this.context});this._bank0=this._createAllPassFilterBank([.6923878,.9360654322959,.988229522686,.9987488452737]),this._bank1=this._createAllPassFilterBank([.4021921162426,.856171088242,.9722909545651,.9952884791278]),this._oneSampleDelay=this.context.createIIRFilter([0,1],[1,0]),Es(this.input,...this._bank0,this._oneSampleDelay,this.output),Es(this.input,...this._bank1,this.offset90)}_createAllPassFilterBank(e){return e.map((e=>{const t=[[e*e,0,-1],[1,0,-e*e]];return this.context.createIIRFilter(t[0],t[1])}))}dispose(){return super.dispose(),this.input.dispose(),this.output.dispose(),this.offset90.dispose(),this._bank0.forEach((e=>e.disconnect())),this._bank1.forEach((e=>e.disconnect())),this._oneSampleDelay.disconnect(),this}}class Xo extends No{constructor(){super(Di(Xo.getDefaults(),arguments,["frequency"])),this.name="FrequencyShifter";const e=Di(Xo.getDefaults(),arguments,["frequency"]);this.frequency=new Ds({context:this.context,units:"frequency",value:e.frequency,minValue:-this.context.sampleRate/2,maxValue:this.context.sampleRate/2}),this._sine=new lr({context:this.context,type:"sine"}),this._cosine=new ur({context:this.context,phase:-90,type:"sine"}),this._sineMultiply=new pr({context:this.context}),this._cosineMultiply=new pr({context:this.context}),this._negate=new Dr({context:this.context}),this._add=new wr({context:this.context}),this._phaseShifter=new Zo({context:this.context}),this.effectSend.connect(this._phaseShifter),this.frequency.fan(this._sine.frequency,this._cosine.frequency),this._phaseShifter.offset90.connect(this._cosineMultiply),this._cosine.connect(this._cosineMultiply.factor),this._phaseShifter.connect(this._sineMultiply),this._sine.connect(this._sineMultiply.factor),this._sineMultiply.connect(this._negate),this._cosineMultiply.connect(this._add),this._negate.connect(this._add.addend),this._add.connect(this.effectReturn);const t=this.immediate();this._sine.start(t),this._cosine.start(t)}static getDefaults(){return Object.assign(No.getDefaults(),{frequency:0})}dispose(){return super.dispose(),this.frequency.dispose(),this._add.dispose(),this._cosine.dispose(),this._cosineMultiply.dispose(),this._negate.dispose(),this._phaseShifter.dispose(),this._sine.dispose(),this._sineMultiply.dispose(),this}}const Yo=[1557/44100,1617/44100,1491/44100,1422/44100,1277/44100,1356/44100,1188/44100,1116/44100],Qo=[225,556,441,341];class Jo extends Wo{constructor(){super(Di(Jo.getDefaults(),arguments,["roomSize","dampening"])),this.name="Freeverb",this._combFilters=[],this._allpassFiltersL=[],this._allpassFiltersR=[];const e=Di(Jo.getDefaults(),arguments,["roomSize","dampening"]);this.roomSize=new Ds({context:this.context,value:e.roomSize,units:"normalRange"}),this._allpassFiltersL=Qo.map((e=>{const t=this.context.createBiquadFilter();return t.type="allpass",t.frequency.value=e,t})),this._allpassFiltersR=Qo.map((e=>{const t=this.context.createBiquadFilter();return t.type="allpass",t.frequency.value=e,t})),this._combFilters=Yo.map(((t,n)=>{const a=new co({context:this.context,dampening:e.dampening,delayTime:t});return nt.dampening=e))}dispose(){return super.dispose(),this._allpassFiltersL.forEach((e=>e.disconnect())),this._allpassFiltersR.forEach((e=>e.disconnect())),this._combFilters.forEach((e=>e.dispose())),this.roomSize.dispose(),this}}const el=[.06748,.06404,.08212,.09004],tl=[.773,.802,.753,.733],nl=[347,113,37];class al extends Wo{constructor(){super(Di(al.getDefaults(),arguments,["roomSize"])),this.name="JCReverb",this._allpassFilters=[],this._feedbackCombFilters=[];const e=Di(al.getDefaults(),arguments,["roomSize"]);this.roomSize=new Ds({context:this.context,value:e.roomSize,units:"normalRange"}),this._scaleRoomSize=new Ar({context:this.context,min:-.733,max:.197}),this._allpassFilters=nl.map((e=>{const t=this.context.createBiquadFilter();return t.type="allpass",t.frequency.value=e,t})),this._feedbackCombFilters=el.map(((e,t)=>{const n=new lo({context:this.context,delayTime:e});return this._scaleRoomSize.connect(n.resonance),n.resonance.value=tl[t],te.disconnect())),this._feedbackCombFilters.forEach((e=>e.dispose())),this.roomSize.dispose(),this._scaleRoomSize.dispose(),this}}class il extends Go{constructor(e){super(e),this._feedbackL.disconnect(),this._feedbackL.connect(this._feedbackMerge,0,1),this._feedbackR.disconnect(),this._feedbackR.connect(this._feedbackMerge,0,0),Xi(this,["feedback"])}}class sl extends il{constructor(){super(Di(sl.getDefaults(),arguments,["delayTime","feedback"])),this.name="PingPongDelay";const e=Di(sl.getDefaults(),arguments,["delayTime","feedback"]);this._leftDelay=new Ls({context:this.context,maxDelay:e.maxDelay}),this._rightDelay=new Ls({context:this.context,maxDelay:e.maxDelay}),this._rightPreDelay=new Ls({context:this.context,maxDelay:e.maxDelay}),this.delayTime=new Ds({context:this.context,units:"time",value:e.delayTime}),this.connectEffectLeft(this._leftDelay),this.connectEffectRight(this._rightPreDelay,this._rightDelay),this.delayTime.fan(this._leftDelay.delayTime,this._rightDelay.delayTime,this._rightPreDelay.delayTime),this._feedbackL.disconnect(),this._feedbackL.connect(this._rightDelay),Xi(this,["delayTime"])}static getDefaults(){return Object.assign(il.getDefaults(),{delayTime:.25,maxDelay:1})}dispose(){return super.dispose(),this._leftDelay.dispose(),this._rightDelay.dispose(),this._rightPreDelay.dispose(),this.delayTime.dispose(),this}}class rl extends Ko{constructor(){super(Di(rl.getDefaults(),arguments,["pitch"])),this.name="PitchShift";const e=Di(rl.getDefaults(),arguments,["pitch"]);this._frequency=new Ds({context:this.context}),this._delayA=new Ls({maxDelay:1,context:this.context}),this._lfoA=new Cr({context:this.context,min:0,max:.1,type:"sawtooth"}).connect(this._delayA.delayTime),this._delayB=new Ls({maxDelay:1,context:this.context}),this._lfoB=new Cr({context:this.context,min:0,max:.1,type:"sawtooth",phase:180}).connect(this._delayB.delayTime),this._crossFade=new Io({context:this.context}),this._crossFadeLFO=new Cr({context:this.context,min:0,max:1,type:"triangle",phase:90}).connect(this._crossFade.fade),this._feedbackDelay=new Ls({delayTime:e.delayTime,context:this.context}),this.delayTime=this._feedbackDelay.delayTime,Xi(this,"delayTime"),this._pitch=e.pitch,this._windowSize=e.windowSize,this._delayA.connect(this._crossFade.a),this._delayB.connect(this._crossFade.b),this._frequency.fan(this._lfoA.frequency,this._lfoB.frequency,this._crossFadeLFO.frequency),this.effectSend.fan(this._delayA,this._delayB),this._crossFade.chain(this._feedbackDelay,this.effectReturn);const t=this.now();this._lfoA.start(t),this._lfoB.start(t),this._crossFadeLFO.start(t),this.windowSize=this._windowSize}static getDefaults(){return Object.assign(Ko.getDefaults(),{pitch:0,windowSize:.1,delayTime:0,feedback:0})}get pitch(){return this._pitch}set pitch(e){this._pitch=e;let t=0;e<0?(this._lfoA.min=0,this._lfoA.max=this._windowSize,this._lfoB.min=0,this._lfoB.max=this._windowSize,t=ls(e-1)+1):(this._lfoA.min=this._windowSize,this._lfoA.max=0,this._lfoB.min=this._windowSize,this._lfoB.max=0,t=ls(e)-1),this._frequency.value=t*(1.2/this._windowSize)}get windowSize(){return this._windowSize}set windowSize(e){this._windowSize=this.toSeconds(e),this.pitch=this._pitch}dispose(){return super.dispose(),this._frequency.dispose(),this._delayA.dispose(),this._delayB.dispose(),this._lfoA.dispose(),this._lfoB.dispose(),this._crossFade.dispose(),this._crossFadeLFO.dispose(),this._feedbackDelay.dispose(),this}}class ol extends Wo{constructor(){super(Di(ol.getDefaults(),arguments,["frequency","octaves","baseFrequency"])),this.name="Phaser";const e=Di(ol.getDefaults(),arguments,["frequency","octaves","baseFrequency"]);this._lfoL=new Cr({context:this.context,frequency:e.frequency,min:0,max:1}),this._lfoR=new Cr({context:this.context,frequency:e.frequency,min:0,max:1,phase:180}),this._baseFrequency=this.toFrequency(e.baseFrequency),this._octaves=e.octaves,this.Q=new Ds({context:this.context,value:e.Q,units:"positive"}),this._filtersL=this._makeFilters(e.stages,this._lfoL),this._filtersR=this._makeFilters(e.stages,this._lfoR),this.frequency=this._lfoL.frequency,this.frequency.value=e.frequency,this.connectEffectLeft(...this._filtersL),this.connectEffectRight(...this._filtersR),this._lfoL.frequency.connect(this._lfoR.frequency),this.baseFrequency=e.baseFrequency,this.octaves=e.octaves,this._lfoL.start(),this._lfoR.start(),Xi(this,["frequency","Q"])}static getDefaults(){return Object.assign(Wo.getDefaults(),{frequency:.5,octaves:3,stages:10,Q:10,baseFrequency:350})}_makeFilters(e,t){const n=[];for(let a=0;ae.disconnect())),this._filtersR.forEach((e=>e.disconnect())),this.frequency.dispose(),this}}class ll extends No{constructor(){super(Di(ll.getDefaults(),arguments,["decay"])),this.name="Reverb",this._convolver=this.context.createConvolver(),this.ready=Promise.resolve();const e=Di(ll.getDefaults(),arguments,["decay"]);this._decay=e.decay,this._preDelay=e.preDelay,this.generate(),this.connectEffect(this._convolver)}static getDefaults(){return Object.assign(No.getDefaults(),{decay:1.5,preDelay:.01})}get decay(){return this._decay}set decay(e){si(e=this.toSeconds(e),.001),this._decay=e,this.generate()}get preDelay(){return this._preDelay}set preDelay(e){si(e=this.toSeconds(e),0),this._preDelay=e,this.generate()}generate(){return xi(this,void 0,void 0,(function*(){const e=this.ready,t=new es(2,this._decay+this._preDelay,this.context.sampleRate),n=new nr({context:t}),a=new nr({context:t}),i=new Uo({context:t});n.connect(i,0,0),a.connect(i,0,1);const s=new Is({context:t}).toDestination();i.connect(s),n.start(0),a.start(0),s.gain.setValueAtTime(0,0),s.gain.setValueAtTime(1,this._preDelay),s.gain.exponentialApproachValueAtTime(0,this._preDelay,this.decay);const r=t.render();return this.ready=r.then(Qi),yield e,this._convolver.buffer=(yield r).get(),this}))}dispose(){return super.dispose(),this._convolver.disconnect(),this}}class ul extends Ss{constructor(){super(Di(ul.getDefaults(),arguments)),this.name="MidSideSplit",this._split=this.input=new Vo({channels:2,context:this.context}),this._midAdd=new wr({context:this.context}),this.mid=new pr({context:this.context,value:Math.SQRT1_2}),this._sideSubtract=new zr({context:this.context}),this.side=new pr({context:this.context,value:Math.SQRT1_2}),this._split.connect(this._midAdd,0),this._split.connect(this._midAdd.addend,1),this._split.connect(this._sideSubtract,0),this._split.connect(this._sideSubtract.subtrahend,1),this._midAdd.connect(this.mid),this._sideSubtract.connect(this.side)}dispose(){return super.dispose(),this.mid.dispose(),this.side.dispose(),this._midAdd.dispose(),this._sideSubtract.dispose(),this._split.dispose(),this}}class cl extends Ss{constructor(){super(Di(cl.getDefaults(),arguments)),this.name="MidSideMerge",this.mid=new Is({context:this.context}),this.side=new Is({context:this.context}),this._left=new wr({context:this.context}),this._leftMult=new pr({context:this.context,value:Math.SQRT1_2}),this._right=new zr({context:this.context}),this._rightMult=new pr({context:this.context,value:Math.SQRT1_2}),this._merge=this.output=new Uo({context:this.context}),this.mid.fan(this._left),this.side.connect(this._left.addend),this.mid.connect(this._right),this.side.connect(this._right.subtrahend),this._left.connect(this._leftMult),this._right.connect(this._rightMult),this._leftMult.connect(this._merge,0,0),this._rightMult.connect(this._merge,0,1)}dispose(){return super.dispose(),this.mid.dispose(),this.side.dispose(),this._leftMult.dispose(),this._rightMult.dispose(),this._left.dispose(),this._right.dispose(),this}}class hl extends No{constructor(e){super(e),this.name="MidSideEffect",this._midSideMerge=new cl({context:this.context}),this._midSideSplit=new ul({context:this.context}),this._midSend=this._midSideSplit.mid,this._sideSend=this._midSideSplit.side,this._midReturn=this._midSideMerge.mid,this._sideReturn=this._midSideMerge.side,this.effectSend.connect(this._midSideSplit),this._midSideMerge.connect(this.effectReturn)}connectEffectMid(...e){this._midSend.chain(...e,this._midReturn)}connectEffectSide(...e){this._sideSend.chain(...e,this._sideReturn)}dispose(){return super.dispose(),this._midSideSplit.dispose(),this._midSideMerge.dispose(),this._midSend.dispose(),this._sideSend.dispose(),this._midReturn.dispose(),this._sideReturn.dispose(),this}}class dl extends hl{constructor(){super(Di(dl.getDefaults(),arguments,["width"])),this.name="StereoWidener";const e=Di(dl.getDefaults(),arguments,["width"]);this.width=new Ds({context:this.context,value:e.width,units:"normalRange"}),Xi(this,["width"]),this._twoTimesWidthMid=new pr({context:this.context,value:2}),this._twoTimesWidthSide=new pr({context:this.context,value:2}),this._midMult=new pr({context:this.context}),this._twoTimesWidthMid.connect(this._midMult.factor),this.connectEffectMid(this._midMult),this._oneMinusWidth=new zr({context:this.context}),this._oneMinusWidth.connect(this._twoTimesWidthMid),_s(this.context.getConstant(1),this._oneMinusWidth),this.width.connect(this._oneMinusWidth.subtrahend),this._sideMult=new pr({context:this.context}),this.width.connect(this._twoTimesWidthSide),this._twoTimesWidthSide.connect(this._sideMult.factor),this.connectEffectSide(this._sideMult)}static getDefaults(){return Object.assign(hl.getDefaults(),{width:.5})}dispose(){return super.dispose(),this.width.dispose(),this._midMult.dispose(),this._sideMult.dispose(),this._twoTimesWidthMid.dispose(),this._twoTimesWidthSide.dispose(),this._oneMinusWidth.dispose(),this}}class pl extends Wo{constructor(){super(Di(pl.getDefaults(),arguments,["frequency","depth"])),this.name="Tremolo";const e=Di(pl.getDefaults(),arguments,["frequency","depth"]);this._lfoL=new Cr({context:this.context,type:e.type,min:1,max:0}),this._lfoR=new Cr({context:this.context,type:e.type,min:1,max:0}),this._amplitudeL=new Is({context:this.context}),this._amplitudeR=new Is({context:this.context}),this.frequency=new Ds({context:this.context,value:e.frequency,units:"frequency"}),this.depth=new Ds({context:this.context,value:e.depth,units:"normalRange"}),Xi(this,["frequency","depth"]),this.connectEffectLeft(this._amplitudeL),this.connectEffectRight(this._amplitudeR),this._lfoL.connect(this._amplitudeL.gain),this._lfoR.connect(this._amplitudeR.gain),this.frequency.fan(this._lfoL.frequency,this._lfoR.frequency),this.depth.fan(this._lfoR.amplitude,this._lfoL.amplitude),this.spread=e.spread}static getDefaults(){return Object.assign(Wo.getDefaults(),{frequency:10,type:"sine",depth:.5,spread:180})}start(e){return this._lfoL.start(e),this._lfoR.start(e),this}stop(e){return this._lfoL.stop(e),this._lfoR.stop(e),this}sync(){return this._lfoL.sync(),this._lfoR.sync(),this.context.transport.syncSignal(this.frequency),this}unsync(){return this._lfoL.unsync(),this._lfoR.unsync(),this.context.transport.unsyncSignal(this.frequency),this}get type(){return this._lfoL.type}set type(e){this._lfoL.type=e,this._lfoR.type=e}get spread(){return this._lfoR.phase-this._lfoL.phase}set spread(e){this._lfoL.phase=90-e/2,this._lfoR.phase=e/2+90}dispose(){return super.dispose(),this._lfoL.dispose(),this._lfoR.dispose(),this._amplitudeL.dispose(),this._amplitudeR.dispose(),this.frequency.dispose(),this.depth.dispose(),this}}class ml extends No{constructor(){super(Di(ml.getDefaults(),arguments,["frequency","depth"])),this.name="Vibrato";const e=Di(ml.getDefaults(),arguments,["frequency","depth"]);this._delayNode=new Ls({context:this.context,delayTime:0,maxDelay:e.maxDelay}),this._lfo=new Cr({context:this.context,type:e.type,min:0,max:e.maxDelay,frequency:e.frequency,phase:-90}).start().connect(this._delayNode.delayTime),this.frequency=this._lfo.frequency,this.depth=this._lfo.amplitude,this.depth.value=e.depth,Xi(this,["frequency","depth"]),this.effectSend.chain(this._delayNode,this.effectReturn)}static getDefaults(){return Object.assign(No.getDefaults(),{maxDelay:.005,frequency:5,depth:.1,type:"sine"})}get type(){return this._lfo.type}set type(e){this._lfo.type=e}dispose(){return super.dispose(),this._delayNode.dispose(),this._lfo.dispose(),this.frequency.dispose(),this.depth.dispose(),this}}class fl extends Ss{constructor(){super(Di(fl.getDefaults(),arguments,["type","size"])),this.name="Analyser",this._analysers=[],this._buffers=[];const e=Di(fl.getDefaults(),arguments,["type","size"]);this.input=this.output=this._gain=new Is({context:this.context}),this._split=new Vo({context:this.context,channels:e.channels}),this.input.connect(this._split),si(e.channels,1);for(let t=0;t{const n=this._buffers[t];"fft"===this._type?e.getFloatFrequencyData(n):"waveform"===this._type&&e.getFloatTimeDomainData(n)})),1===this.channels?this._buffers[0]:this._buffers}get size(){return this._analysers[0].frequencyBinCount}set size(e){this._analysers.forEach(((t,n)=>{t.fftSize=2*e,this._buffers[n]=new Float32Array(e)}))}get channels(){return this._analysers.length}get type(){return this._type}set type(e){ii("waveform"===e||"fft"===e,`Analyser: invalid type: ${e}`),this._type=e}get smoothing(){return this._analysers[0].smoothingTimeConstant}set smoothing(e){this._analysers.forEach((t=>t.smoothingTimeConstant=e))}dispose(){return super.dispose(),this._analysers.forEach((e=>e.disconnect())),this._split.dispose(),this._gain.dispose(),this}}class gl extends Ss{constructor(){super(Di(gl.getDefaults(),arguments)),this.name="MeterBase",this.input=this.output=this._analyser=new fl({context:this.context,size:256,type:"waveform"})}dispose(){return super.dispose(),this._analyser.dispose(),this}}class yl extends gl{constructor(){super(Di(yl.getDefaults(),arguments,["smoothing"])),this.name="Meter",this._rms=0;const e=Di(yl.getDefaults(),arguments,["smoothing"]);this.input=this.output=this._analyser=new fl({context:this.context,size:256,type:"waveform",channels:e.channels}),this.smoothing=e.smoothing,this.normalRange=e.normalRange}static getDefaults(){return Object.assign(gl.getDefaults(),{smoothing:.8,normalRange:!1,channels:1})}getLevel(){return ci("'getLevel' has been changed to 'getValue'"),this.getValue()}getValue(){const e=this._analyser.getValue(),t=(1===this.channels?[e]:e).map((e=>{const t=e.reduce(((e,t)=>e+t*t),0),n=Math.sqrt(t/e.length);return this._rms=Math.max(n,this._rms*this.smoothing),this.normalRange?this._rms:os(this._rms)}));return 1===this.channels?t[0]:t}get channels(){return this._analyser.channels}dispose(){return super.dispose(),this._analyser.dispose(),this}}class bl extends gl{constructor(){super(Di(bl.getDefaults(),arguments,["size"])),this.name="FFT";const e=Di(bl.getDefaults(),arguments,["size"]);this.normalRange=e.normalRange,this._analyser.type="fft",this.size=e.size}static getDefaults(){return Object.assign(Ss.getDefaults(),{normalRange:!1,size:1024,smoothing:.8})}getValue(){return this._analyser.getValue().map((e=>this.normalRange?rs(e):e))}get size(){return this._analyser.size}set size(e){this._analyser.size=e}get smoothing(){return this._analyser.smoothing}set smoothing(e){this._analyser.smoothing=e}getFrequencyOfIndex(e){return ii(0<=e&&ee._updateSolo()))}get muted(){return 0===this.input.gain.value}_addSolo(){wl._soloed.has(this.context)||wl._soloed.set(this.context,new Set),wl._soloed.get(this.context).add(this)}_removeSolo(){wl._soloed.has(this.context)&&wl._soloed.get(this.context).delete(this)}_isSoloed(){return wl._soloed.has(this.context)&&wl._soloed.get(this.context).has(this)}_noSolos(){return!wl._soloed.has(this.context)||wl._soloed.has(this.context)&&0===wl._soloed.get(this.context).size}_updateSolo(){this._isSoloed()||this._noSolos()?this.input.gain.value=1:this.input.gain.value=0}dispose(){return super.dispose(),wl._allSolos.get(this.context).delete(this),this._removeSolo(),this}}wl._allSolos=new Map,wl._soloed=new Map;class Al extends Ss{constructor(){super(Di(Al.getDefaults(),arguments,["pan","volume"])),this.name="PanVol";const e=Di(Al.getDefaults(),arguments,["pan","volume"]);this._panner=this.input=new zo({context:this.context,pan:e.pan,channelCount:e.channelCount}),this.pan=this._panner.pan,this._volume=this.output=new $s({context:this.context,volume:e.volume}),this.volume=this._volume.volume,this._panner.connect(this._volume),this.mute=e.mute,Xi(this,["pan","volume"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{mute:!1,pan:0,volume:0,channelCount:1})}get mute(){return this._volume.mute}set mute(e){this._volume.mute=e}dispose(){return super.dispose(),this._panner.dispose(),this.pan.dispose(),this._volume.dispose(),this.volume.dispose(),this}}class xl extends Ss{constructor(){super(Di(xl.getDefaults(),arguments,["volume","pan"])),this.name="Channel";const e=Di(xl.getDefaults(),arguments,["volume","pan"]);this._solo=this.input=new wl({solo:e.solo,context:this.context}),this._panVol=this.output=new Al({context:this.context,pan:e.pan,volume:e.volume,mute:e.mute,channelCount:e.channelCount}),this.pan=this._panVol.pan,this.volume=this._panVol.volume,this._solo.connect(this._panVol),Xi(this,["pan","volume"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{pan:0,volume:0,mute:!1,solo:!1,channelCount:1})}get solo(){return this._solo.solo}set solo(e){this._solo.solo=e}get muted(){return this._solo.muted||this.mute}get mute(){return this._panVol.mute}set mute(e){this._panVol.mute=e}_getBus(e){return xl.buses.has(e)||xl.buses.set(e,new Is({context:this.context})),xl.buses.get(e)}send(e,t=0){const n=this._getBus(e),a=new Is({context:this.context,units:"decibels",gain:t});return this.connect(a),a.connect(n),a}receive(e){return this._getBus(e).connect(this),this}dispose(){return super.dispose(),this._panVol.dispose(),this.pan.dispose(),this.volume.dispose(),this._solo.dispose(),this}}xl.buses=new Map;class Cl extends Ss{constructor(){super(Di(Cl.getDefaults(),arguments)),this.name="Mono",this.input=new Is({context:this.context}),this._merge=this.output=new Uo({channels:2,context:this.context}),this.input.connect(this._merge,0,0),this.input.connect(this._merge,0,1)}dispose(){return super.dispose(),this._merge.dispose(),this.input.dispose(),this}}class Sl extends Ss{constructor(){super(Di(Sl.getDefaults(),arguments,["lowFrequency","highFrequency"])),this.name="MultibandSplit",this.input=new Is({context:this.context}),this.output=void 0,this.low=new $r({context:this.context,frequency:0,type:"lowpass"}),this._lowMidFilter=new $r({context:this.context,frequency:0,type:"highpass"}),this.mid=new $r({context:this.context,frequency:0,type:"lowpass"}),this.high=new $r({context:this.context,frequency:0,type:"highpass"}),this._internalChannels=[this.low,this.mid,this.high];const e=Di(Sl.getDefaults(),arguments,["lowFrequency","highFrequency"]);this.lowFrequency=new Ds({context:this.context,units:"frequency",value:e.lowFrequency}),this.highFrequency=new Ds({context:this.context,units:"frequency",value:e.highFrequency}),this.Q=new Ds({context:this.context,units:"positive",value:e.Q}),this.input.fan(this.low,this.high),this.input.chain(this._lowMidFilter,this.mid),this.lowFrequency.fan(this.low.frequency,this._lowMidFilter.frequency),this.highFrequency.fan(this.mid.frequency,this.high.frequency),this.Q.connect(this.low.Q),this.Q.connect(this._lowMidFilter.Q),this.Q.connect(this.mid.Q),this.Q.connect(this.high.Q),Xi(this,["high","mid","low","highFrequency","lowFrequency"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{Q:1,highFrequency:2500,lowFrequency:400})}dispose(){return super.dispose(),Yi(this,["high","mid","low","highFrequency","lowFrequency"]),this.low.dispose(),this._lowMidFilter.dispose(),this.mid.dispose(),this.high.dispose(),this.lowFrequency.dispose(),this.highFrequency.dispose(),this.Q.dispose(),this}}class El extends Ss{constructor(){super(...arguments),this.name="Listener",this.positionX=new Cs({context:this.context,param:this.context.rawContext.listener.positionX}),this.positionY=new Cs({context:this.context,param:this.context.rawContext.listener.positionY}),this.positionZ=new Cs({context:this.context,param:this.context.rawContext.listener.positionZ}),this.forwardX=new Cs({context:this.context,param:this.context.rawContext.listener.forwardX}),this.forwardY=new Cs({context:this.context,param:this.context.rawContext.listener.forwardY}),this.forwardZ=new Cs({context:this.context,param:this.context.rawContext.listener.forwardZ}),this.upX=new Cs({context:this.context,param:this.context.rawContext.listener.upX}),this.upY=new Cs({context:this.context,param:this.context.rawContext.listener.upY}),this.upZ=new Cs({context:this.context,param:this.context.rawContext.listener.upZ})}static getDefaults(){return Object.assign(Ss.getDefaults(),{positionX:0,positionY:0,positionZ:0,forwardX:0,forwardY:0,forwardZ:-1,upX:0,upY:1,upZ:0})}dispose(){return super.dispose(),this.positionX.dispose(),this.positionY.dispose(),this.positionZ.dispose(),this.forwardX.dispose(),this.forwardY.dispose(),this.forwardZ.dispose(),this.upX.dispose(),this.upY.dispose(),this.upZ.dispose(),this}}Gi((e=>{e.listener=new El({context:e})})),Hi((e=>{e.listener.dispose()}));class _l extends Ss{constructor(){super(Di(_l.getDefaults(),arguments,["positionX","positionY","positionZ"])),this.name="Panner3D";const e=Di(_l.getDefaults(),arguments,["positionX","positionY","positionZ"]);this._panner=this.input=this.output=this.context.createPanner(),this.panningModel=e.panningModel,this.maxDistance=e.maxDistance,this.distanceModel=e.distanceModel,this.coneOuterGain=e.coneOuterGain,this.coneOuterAngle=e.coneOuterAngle,this.coneInnerAngle=e.coneInnerAngle,this.refDistance=e.refDistance,this.rolloffFactor=e.rolloffFactor,this.positionX=new Cs({context:this.context,param:this._panner.positionX,value:e.positionX}),this.positionY=new Cs({context:this.context,param:this._panner.positionY,value:e.positionY}),this.positionZ=new Cs({context:this.context,param:this._panner.positionZ,value:e.positionZ}),this.orientationX=new Cs({context:this.context,param:this._panner.orientationX,value:e.orientationX}),this.orientationY=new Cs({context:this.context,param:this._panner.orientationY,value:e.orientationY}),this.orientationZ=new Cs({context:this.context,param:this._panner.orientationZ,value:e.orientationZ})}static getDefaults(){return Object.assign(Ss.getDefaults(),{coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0,distanceModel:"inverse",maxDistance:1e4,orientationX:0,orientationY:0,orientationZ:0,panningModel:"equalpower",positionX:0,positionY:0,positionZ:0,refDistance:1,rolloffFactor:1})}setPosition(e,t,n){return this.positionX.value=e,this.positionY.value=t,this.positionZ.value=n,this}setOrientation(e,t,n){return this.orientationX.value=e,this.orientationY.value=t,this.orientationZ.value=n,this}get panningModel(){return this._panner.panningModel}set panningModel(e){this._panner.panningModel=e}get refDistance(){return this._panner.refDistance}set refDistance(e){this._panner.refDistance=e}get rolloffFactor(){return this._panner.rolloffFactor}set rolloffFactor(e){this._panner.rolloffFactor=e}get distanceModel(){return this._panner.distanceModel}set distanceModel(e){this._panner.distanceModel=e}get coneInnerAngle(){return this._panner.coneInnerAngle}set coneInnerAngle(e){this._panner.coneInnerAngle=e}get coneOuterAngle(){return this._panner.coneOuterAngle}set coneOuterAngle(e){this._panner.coneOuterAngle=e}get coneOuterGain(){return this._panner.coneOuterGain}set coneOuterGain(e){this._panner.coneOuterGain=e}get maxDistance(){return this._panner.maxDistance}set maxDistance(e){this._panner.maxDistance=e}dispose(){return super.dispose(),this._panner.disconnect(),this.orientationX.dispose(),this.orientationY.dispose(),this.orientationZ.dispose(),this.positionX.dispose(),this.positionY.dispose(),this.positionZ.dispose(),this}}class Tl extends Ss{constructor(){super(Di(Tl.getDefaults(),arguments)),this.name="Recorder";const e=Di(Tl.getDefaults(),arguments);this.input=new Is({context:this.context}),ii(Tl.supported,"Media Recorder API is not available"),this._stream=this.context.createMediaStreamDestination(),this.input.connect(this._stream),this._recorder=new MediaRecorder(this._stream.stream,{mimeType:e.mimeType})}static getDefaults(){return Ss.getDefaults()}get mimeType(){return this._recorder.mimeType}static get supported(){return null!==ki&&Reflect.has(ki,"MediaRecorder")}get state(){return"inactive"===this._recorder.state?"stopped":"paused"===this._recorder.state?"paused":"started"}start(){return xi(this,void 0,void 0,(function*(){ii("started"!==this.state,"Recorder is already started");const e=new Promise((e=>{const t=()=>{this._recorder.removeEventListener("start",t,!1),e()};this._recorder.addEventListener("start",t,!1)}));return this._recorder.start(),yield e}))}stop(){return xi(this,void 0,void 0,(function*(){ii("stopped"!==this.state,"Recorder is not started");const e=new Promise((e=>{const t=n=>{this._recorder.removeEventListener("dataavailable",t,!1),e(n.data)};this._recorder.addEventListener("dataavailable",t,!1)}));return this._recorder.stop(),yield e}))}pause(){return ii("started"===this.state,"Recorder must be started"),this._recorder.pause(),this}dispose(){return super.dispose(),this.input.dispose(),this._stream.disconnect(),this}}class Il extends Ss{constructor(){super(Di(Il.getDefaults(),arguments,["threshold","ratio"])),this.name="Compressor",this._compressor=this.context.createDynamicsCompressor(),this.input=this._compressor,this.output=this._compressor;const e=Di(Il.getDefaults(),arguments,["threshold","ratio"]);this.threshold=new Cs({minValue:this._compressor.threshold.minValue,maxValue:this._compressor.threshold.maxValue,context:this.context,convert:!1,param:this._compressor.threshold,units:"decibels",value:e.threshold}),this.attack=new Cs({minValue:this._compressor.attack.minValue,maxValue:this._compressor.attack.maxValue,context:this.context,param:this._compressor.attack,units:"time",value:e.attack}),this.release=new Cs({minValue:this._compressor.release.minValue,maxValue:this._compressor.release.maxValue,context:this.context,param:this._compressor.release,units:"time",value:e.release}),this.knee=new Cs({minValue:this._compressor.knee.minValue,maxValue:this._compressor.knee.maxValue,context:this.context,convert:!1,param:this._compressor.knee,units:"decibels",value:e.knee}),this.ratio=new Cs({minValue:this._compressor.ratio.minValue,maxValue:this._compressor.ratio.maxValue,context:this.context,convert:!1,param:this._compressor.ratio,units:"positive",value:e.ratio}),Xi(this,["knee","release","attack","ratio","threshold"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{attack:.003,knee:30,ratio:12,release:.25,threshold:-24})}get reduction(){return this._compressor.reduction}dispose(){return super.dispose(),this._compressor.disconnect(),this.attack.dispose(),this.release.dispose(),this.threshold.dispose(),this.ratio.dispose(),this.knee.dispose(),this}}class Nl extends Ss{constructor(){super(Object.assign(Di(Nl.getDefaults(),arguments,["threshold","smoothing"]))),this.name="Gate";const e=Di(Nl.getDefaults(),arguments,["threshold","smoothing"]);this._follower=new Mo({context:this.context,smoothing:e.smoothing}),this._gt=new Mr({context:this.context,value:rs(e.threshold)}),this.input=new Is({context:this.context}),this._gate=this.output=new Is({context:this.context}),this.input.connect(this._gate),this.input.chain(this._follower,this._gt,this._gate.gain)}static getDefaults(){return Object.assign(Ss.getDefaults(),{smoothing:.1,threshold:-40})}get threshold(){return os(this._gt.value)}set threshold(e){this._gt.value=rs(e)}get smoothing(){return this._follower.smoothing}set smoothing(e){this._follower.smoothing=e}dispose(){return super.dispose(),this.input.dispose(),this._follower.dispose(),this._gt.dispose(),this._gate.dispose(),this}}class Rl extends Ss{constructor(){super(Object.assign(Di(Rl.getDefaults(),arguments,["threshold"]))),this.name="Limiter";const e=Di(Rl.getDefaults(),arguments,["threshold"]);this._compressor=this.input=this.output=new Il({context:this.context,ratio:20,attack:.003,release:.01,threshold:e.threshold}),this.threshold=this._compressor.threshold,Xi(this,"threshold")}static getDefaults(){return Object.assign(Ss.getDefaults(),{threshold:-12})}get reduction(){return this._compressor.reduction}dispose(){return super.dispose(),this._compressor.dispose(),this.threshold.dispose(),this}}class Dl extends Ss{constructor(){super(Object.assign(Di(Dl.getDefaults(),arguments))),this.name="MidSideCompressor";const e=Di(Dl.getDefaults(),arguments);this._midSideSplit=this.input=new ul({context:this.context}),this._midSideMerge=this.output=new cl({context:this.context}),this.mid=new Il(Object.assign(e.mid,{context:this.context})),this.side=new Il(Object.assign(e.side,{context:this.context})),this._midSideSplit.mid.chain(this.mid,this._midSideMerge.mid),this._midSideSplit.side.chain(this.side,this._midSideMerge.side),Xi(this,["mid","side"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{mid:{ratio:3,threshold:-24,release:.03,attack:.02,knee:16},side:{ratio:6,threshold:-30,release:.25,attack:.03,knee:10}})}dispose(){return super.dispose(),this.mid.dispose(),this.side.dispose(),this._midSideSplit.dispose(),this._midSideMerge.dispose(),this}}class zl extends Ss{constructor(){super(Object.assign(Di(zl.getDefaults(),arguments))),this.name="MultibandCompressor";const e=Di(zl.getDefaults(),arguments);this._splitter=this.input=new Sl({context:this.context,lowFrequency:e.lowFrequency,highFrequency:e.highFrequency}),this.lowFrequency=this._splitter.lowFrequency,this.highFrequency=this._splitter.highFrequency,this.output=new Is({context:this.context}),this.low=new Il(Object.assign(e.low,{context:this.context})),this.mid=new Il(Object.assign(e.mid,{context:this.context})),this.high=new Il(Object.assign(e.high,{context:this.context})),this._splitter.low.chain(this.low,this.output),this._splitter.mid.chain(this.mid,this.output),this._splitter.high.chain(this.high,this.output),Xi(this,["high","mid","low","highFrequency","lowFrequency"])}static getDefaults(){return Object.assign(Ss.getDefaults(),{lowFrequency:250,highFrequency:2e3,low:{ratio:6,threshold:-30,release:.25,attack:.03,knee:10},mid:{ratio:3,threshold:-24,release:.03,attack:.02,knee:16},high:{ratio:3,threshold:-24,release:.03,attack:.02,knee:16}})}dispose(){return super.dispose(),this._splitter.dispose(),this.low.dispose(),this.mid.dispose(),this.high.dispose(),this.output.dispose(),this}}class Ol extends Ss{constructor(){super(Di(Ol.getDefaults(),arguments,["low","mid","high"])),this.name="EQ3",this.output=new Is({context:this.context}),this._internalChannels=[];const e=Di(Ol.getDefaults(),arguments,["low","mid","high"]);this.input=this._multibandSplit=new Sl({context:this.context,highFrequency:e.highFrequency,lowFrequency:e.lowFrequency}),this._lowGain=new Is({context:this.context,gain:e.low,units:"decibels"}),this._midGain=new Is({context:this.context,gain:e.mid,units:"decibels"}),this._highGain=new Is({context:this.context,gain:e.high,units:"decibels"}),this.low=this._lowGain.gain,this.mid=this._midGain.gain,this.high=this._highGain.gain,this.Q=this._multibandSplit.Q,this.lowFrequency=this._multibandSplit.lowFrequency,this.highFrequency=this._multibandSplit.highFrequency,this._multibandSplit.low.chain(this._lowGain,this.output),this._multibandSplit.mid.chain(this._midGain,this.output),this._multibandSplit.high.chain(this._highGain,this.output),Xi(this,["low","mid","high","lowFrequency","highFrequency"]),this._internalChannels=[this._multibandSplit]}static getDefaults(){return Object.assign(Ss.getDefaults(),{high:0,highFrequency:2500,low:0,lowFrequency:400,mid:0})}dispose(){return super.dispose(),Yi(this,["low","mid","high","lowFrequency","highFrequency"]),this._multibandSplit.dispose(),this.lowFrequency.dispose(),this.highFrequency.dispose(),this._lowGain.dispose(),this._midGain.dispose(),this._highGain.dispose(),this.low.dispose(),this.mid.dispose(),this.high.dispose(),this.Q.dispose(),this}}class Ml extends Ss{constructor(){super(Di(Ml.getDefaults(),arguments,["url","onload"])),this.name="Convolver",this._convolver=this.context.createConvolver();const e=Di(Ml.getDefaults(),arguments,["url","onload"]);this._buffer=new Ji(e.url,(t=>{this.buffer=t,e.onload()})),this.input=new Is({context:this.context}),this.output=new Is({context:this.context}),this._buffer.loaded&&(this.buffer=this._buffer),this.normalize=e.normalize,this.input.chain(this._convolver,this.output)}static getDefaults(){return Object.assign(Ss.getDefaults(),{normalize:!0,onload:Qi})}load(e){return xi(this,void 0,void 0,(function*(){this.buffer=yield this._buffer.load(e)}))}get buffer(){return this._buffer.length?this._buffer:null}set buffer(e){e&&this._buffer.set(e),this._convolver.buffer&&(this.input.disconnect(),this._convolver.disconnect(),this._convolver=this.context.createConvolver(),this.input.chain(this._convolver,this.output));const t=this._buffer.get();this._convolver.buffer=t||null}get normalize(){return this._convolver.normalize}set normalize(e){this._convolver.normalize=e}dispose(){return super.dispose(),this._buffer.dispose(),this._convolver.disconnect(),this}}function Bl(){return as().now()}function Fl(){return as().immediate()}const Ll=as().transport;function Pl(){return as().transport}const jl=as().destination,Vl=as().destination;function Ul(){return as().destination}const Wl=as().listener;function Gl(){return as().listener}const ql=as().draw;function Hl(){return as().draw}const Kl=as();function $l(){return Ji.loaded()}const Zl=Ji,Xl=js,Yl=tr},8990:function(e,t,n){(function(){"use strict";var e;function t(e){var t=0;return function(){return t>>0)+"_",i=0;return function e(a){if(this instanceof e)throw new TypeError("Symbol is not a constructor");return new t(n+(a||"")+"_"+i++,a)}})),s("Symbol.iterator",(function(e){if(e)return e;e=Symbol("Symbol.iterator");for(var n="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),s=0;s(t=t||0)&&(t=Math.max(t+a,0));ts)a[n++]=s;else{if(2048>s)a[n++]=s>>6|192;else{if(55296<=s&&57343>=s){if(56319>=s&&i=r){s=1024*(s-55296)+r-56320+65536,a[n++]=s>>18|240,a[n++]=s>>12&63|128,a[n++]=s>>6&63|128,a[n++]=63&s|128;continue}i--}if(t)throw Error("Found an unpaired surrogate");s=65533}a[n++]=s>>12|224,a[n++]=s>>6&63|128}a[n++]=63&s|128}}e=a.subarray(0,n)}return e}var z={},O=null;function M(e,t){void 0===t&&(t=0),F(),t=z[t];for(var n=Array(Math.floor(e.length/3)),a=t[64]||"",i=0,s=0;i>2];r=t[(3&r)<<4|o>>4],o=t[(15&o)<<2|l>>6],l=t[63&l],n[s++]=u+r+o+l}switch(u=0,l=a,e.length-i){case 2:l=t[(15&(u=e[i+1]))<<2]||a;case 1:e=e[i],n[s]=t[e>>2]+t[(3&e)<<4|u>>4]+l+a}return n.join("")}function B(e){var t=e.length,n=3*t/4;n%3?n=Math.floor(n):-1!="=.".indexOf(e[t-1])&&(n=-1!="=.".indexOf(e[t-2])?n-2:n-1);var a=new Uint8Array(n),i=0;return function(e,t){function n(t){for(;a>4),64!=r&&(t(s<<4&240|r>>2),64!=o&&t(r<<6&192|o))}}(e,(function(e){a[i++]=e})),a.subarray(0,i)}function F(){if(!O){O={};for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),t=["+/=","+/","-_=","-_.","-_"],n=0;5>n;n++){var a=e.concat(t[n].split(""));z[n]=a;for(var i=0;ii&&128<=t;i++)n|=(127&(t=e.h[e.g++]))<<7*i;if(128<=t&&(n|=(127&(t=e.h[e.g++]))<<28,a|=(127&t)>>4),128<=t)for(i=0;5>i&&128<=t;i++)a|=(127&(t=e.h[e.g++]))<<7*i+3;if(128>t)return e=n>>>0,(a=2147483648&(t=a>>>0))&&(t=~t>>>0,0==(e=1+~e>>>0)&&(t=t+1>>>0)),e=4294967296*t+(e>>>0),a?-e:e;e.m=!0}U.prototype.reset=function(){this.g=this.l},U.prototype.i=function(){var e=this.h,t=e[this.g],n=127&t;return 128>t?(this.g+=1,n):(n|=(127&(t=e[this.g+1]))<<7,128>t?(this.g+=2,n):(n|=(127&(t=e[this.g+2]))<<14,128>t?(this.g+=3,n):(n|=(127&(t=e[this.g+3]))<<21,128>t?(this.g+=4,n):(n|=(15&(t=e[this.g+4]))<<28,128>t?(this.g+=5,n>>>0):(this.g+=5,128<=e[this.g++]&&128<=e[this.g++]&&128<=e[this.g++]&&128<=e[this.g++]&&this.g++,n)))))},U.prototype.o=function(){var e=this.h[this.g],t=this.h[this.g+1],n=this.h[this.g+2],a=this.h[this.g+3];return this.g+=4,e=2*((n=(e|t<<8|n<<16|a<<24)>>>0)>>31)+1,t=n>>>23&255,n&=8388607,255==t?n?NaN:1/0*e:0==t?e*Math.pow(2,-149)*n:e*Math.pow(2,t-150)*(n+Math.pow(2,23))};var q=[];function H(){this.g=new Uint8Array(64),this.h=0}function K(e,t){for(;127>>=7;e.push(t)}function $(e){var t={},n=void 0!==t.N&&t.N;this.o={v:void 0!==t.v&&t.v},this.N=n,t=this.o,q.length?(n=q.pop(),t&&(n.v=t.v),e&&W(n,e),e=n):e=new U(e,t),this.g=e,this.m=this.g.g,this.h=this.i=this.l=-1,this.j=!1}function Z(e){var t=e.g;if((t=t.g==t.j)||(t=e.j)||(t=(t=e.g).m||0>t.g||t.g>t.j),t)return!1;e.m=e.g.g;var n=7&(t=e.g.i());return 0!=n&&5!=n&&1!=n&&2!=n&&3!=n&&4!=n?(e.j=!0,!1):(e.i=t,e.l=t>>>3,e.h=n,!0)}function X(e){switch(e.h){case 0:if(0!=e.h)X(e);else{for(e=e.g;128&e.h[e.g];)e.g++;e.g++}break;case 1:1!=e.h?X(e):(e=e.g).g+=8;break;case 2:if(2!=e.h)X(e);else{var t=e.g.i();(e=e.g).g+=t}break;case 5:5!=e.h?X(e):(e=e.g).g+=4;break;case 3:for(t=e.l;;){if(!Z(e)){e.j=!0;break}if(4==e.h){e.l!=t&&(e.j=!0);break}X(e)}break;default:e.j=!0}}function Y(e,t,n){var a=e.g.j,i=e.g.i(),s=e.g.g+i;if(e.g.j=s,n(t,e),0!==(n=s-e.g.g))throw Error("Message parsing ended unexpectedly. Expected to read "+i+" bytes, instead read "+(i-n)+" bytes, either the data ended unexpectedly or the message misreported its own length");return e.g.g=s,e.g.j=a,t}function Q(e){return e.g.o()}function J(e){var t,n=e.g.i(),a=(e=e.g).g;if(e.g+=n,e=e.h,N)(t=T)||(t=T=new TextDecoder("utf-8",{fatal:!1})),t=t.decode(e.subarray(a,a+n));else{n=a+n;for(var i,s,r,o=[],l=null;a(i=e[a++])?o.push(i):224>i?a>=n?o.push(65533):(s=e[a++],194>i||128!=(192&s)?(a--,o.push(65533)):o.push((31&i)<<6|63&s)):240>i?a>=n-1?o.push(65533):128!=(192&(s=e[a++]))||224===i&&160>s||237===i&&160<=s||128!=(192&(t=e[a++]))?(a--,o.push(65533)):o.push((15&i)<<12|(63&s)<<6|63&t):244>=i?a>=n-2?o.push(65533):128!=(192&(s=e[a++]))||s-144+(i<<28)>>30||128!=(192&(t=e[a++]))||128!=(192&(r=e[a++]))?(a--,o.push(65533)):(i=(7&i)<<18|(63&s)<<12|(63&t)<<6|63&r,i-=65536,o.push(55296+(i>>10&1023),56320+(1023&i))):o.push(65533),8192<=o.length&&(l=_(l,o),o.length=0);t=_(l,o)}return t}function ee(e,t,n){var a=e.g.i();for(a=e.g.g+a;e.g.ga?1:0)?-a:a)?0<1/a?V=0:(0,V=2147483648):isNaN(a)?(0,V=2147483647):34028234663852886e22>>0):11754943508222875e-54>a?(a=Math.round(a/Math.pow(2,-149)),0,V=(n<<31|a)>>>0):(t=Math.floor(Math.log(a)/Math.LN2),a*=Math.pow(2,-t),16777216<=(a=Math.round(8388608*a))&&++t,0,V=(n<<31|t+127<<23|8388607&a)>>>0),n=V,e.push(n>>>0&255),e.push(n>>>8&255),e.push(n>>>16&255),e.push(n>>>24&255)}}H.prototype.push=function(e){if(!(this.h+1=e.l?e.i?e.i[t]:void 0:e.h[t+e.j]}function ye(e,t){var n=void 0!==n&&n,a=ge(e,t,n);return null==a&&(a=me),a===me&&we(e,t,a=de([]),n),a}function be(e){var t=ye(e,3);if(e.m||(e.m={}),!e.m[3]){for(var n=0;n=e.l?(fe(e),e.i[t]=n):e.h[t+e.j]=n}function Ae(e,t,n){if(-1===n)return null;if(e.g||(e.g={}),!e.g[n]){var a=ge(e,n,!1);a&&(e.g[n]=new t(a))}return e.g[n]}function xe(e,t){e.g||(e.g={});var n=e.g[1];if(!n){var a=ye(e,1);n=[];for(var i=0;i_;var T=(_=Math.abs(_))>>>0;for(_=Math.floor((_-T)/4294967296),_>>>=0,S&&(_=~_>>>0,4294967295<(T=1+(~T>>>0))&&(T=0,4294967295<++_&&(_=0))),S=V=T,T=_;0>>7|T<<25)>>>0,T>>>=7;E.push(S)}if(_e(x,C),A=ie(A),k.call(v,w,A),y.O)for(v=0;v_;_++)S.push(127&T|128),T>>=7;S.push(1)}se(E,2,ge(C,2)),null!=(S=ge(C,3))&&(S=D(S),K(E.g,26),K(E.g,S.length),ae(E,E.g.end()),ae(E,S)),null!=(S=ge(C,4))&&(S=D(S),K(E.g,34),K(E.g,S.length),ae(E,E.g.end()),ae(E,S)),_e(C,E),x=ie(x),w.call(k,A,x)}}m=m.data;break e;default:m={}}}switch(c=m,h=u.stream,u.type){case"video":i.pushTexture2d(Object.assign(Object.assign({},c),{stream:h,timestamp:a}));break;case"detections":(d=c).stream=h,d.timestamp=a,i.pushDetectionList(d);break;default:throw Error("Unknown input config type: '"+u.type+"'")}}return p.i.send(i),b(n,p.C,4);case 4:i.delete(),n.g=0}}))}))},e.onResults=function(e,t){this.listeners[t||"$"]=e},E("Solution",nt),E("OptionType",{BOOL:0,NUMBER:1,aa:2,0:"BOOL",1:"NUMBER",2:"STRING"});var lt={files:[{url:"face_mesh_solution_packed_assets_loader.js"},{simd:!0,url:"face_mesh_solution_simd_wasm_bin.js"},{simd:!1,url:"face_mesh_solution_wasm_bin.js"}],graph:{url:"face_mesh.binarypb"},listeners:[{wants:["multi_face_geometry","image_transformed","multi_face_landmarks"],outs:{image:"image_transformed",multiFaceGeometry:{type:"proto_list",stream:"multi_face_geometry",transform:function(e){return e.map(ot)}},multiFaceLandmarks:{type:"proto_list",stream:"multi_face_landmarks",transform:function(e){return e.map((function(e){return xe(je(e),Fe).map(Ze)}))}}}}],inputs:{image:{type:"video",stream:"input_frames_gpu"}},options:{useCpuInference:{type:0,graphOptionXref:{calculatorType:"InferenceCalculator",fieldName:"use_cpu_inference"},default:"iPad Simulator;iPhone Simulator;iPod Simulator;iPad;iPhone;iPod".split(";").includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document},enableFaceGeometry:{type:0,graphOptionXref:{calculatorName:"EnableFaceGeometryConstant",calculatorType:"ConstantSidePacketCalculator",fieldName:"bool_value"}},selfieMode:{type:0,graphOptionXref:{calculatorType:"GlScalerCalculator",calculatorIndex:1,fieldName:"flip_horizontal"}},maxNumFaces:{type:1,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorNumFaces",fieldName:"int_value"}},refineLandmarks:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorRefineLandmarks",fieldName:"bool_value"}},minDetectionConfidence:{type:1,graphOptionXref:{calculatorType:"TensorsToDetectionsCalculator",calculatorName:"facelandmarkfrontgpu__facedetectionshortrangegpu__facedetectionshortrangecommon__TensorsToDetectionsCalculator",fieldName:"min_score_thresh"}},minTrackingConfidence:{type:1,graphOptionXref:{calculatorType:"ThresholdingCalculator",calculatorName:"facelandmarkfrontgpu__facelandmarkgpu__ThresholdingCalculator",fieldName:"threshold"}},cameraNear:{type:1,graphOptionXref:{calculatorType:"FaceGeometryEnvGeneratorCalculator",fieldName:"near"}},cameraFar:{type:1,graphOptionXref:{calculatorType:"FaceGeometryEnvGeneratorCalculator",fieldName:"far"}},cameraVerticalFovDegrees:{type:1,graphOptionXref:{calculatorType:"FaceGeometryEnvGeneratorCalculator",fieldName:"vertical_fov_degrees"}}}},ut=[[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]],ct=[[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]],ht=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],dt=[[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]],pt=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],mt=[[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]],ft=[].concat(l(ut),l(ct),l(ht),l(dt),l(pt),l(mt));function gt(e){e=e||{},e=Object.assign(Object.assign({},lt),e),this.g=new nt(e)}(e=gt.prototype).close=function(){return this.g.close(),Promise.resolve()},e.onResults=function(e){this.g.onResults(e)},e.initialize=function(){return De(this,(function e(){var t=this;return x(e,(function(e){return b(e,t.g.initialize(),0)}))}))},e.reset=function(){this.g.reset()},e.send=function(e){return De(this,(function t(){var n=this;return x(t,(function(t){return b(t,n.g.send(e),0)}))}))},e.setOptions=function(e){this.g.setOptions(e)},E("FACE_GEOMETRY",{Layout:{COLUMN_MAJOR:0,ROW_MAJOR:1,0:"COLUMN_MAJOR",1:"ROW_MAJOR"},PrimitiveType:{TRIANGLE:0,0:"TRIANGLE"},VertexType:{VERTEX_PT:0,0:"VERTEX_PT"},DEFAULT_CAMERA_PARAMS:{verticalFovDegrees:63,near:1,far:1e4}}),E("FaceMesh",gt),E("FACEMESH_LIPS",ut),E("FACEMESH_LEFT_EYE",ct),E("FACEMESH_LEFT_EYEBROW",ht),E("FACEMESH_LEFT_IRIS",[[474,475],[475,476],[476,477],[477,474]]),E("FACEMESH_RIGHT_EYE",dt),E("FACEMESH_RIGHT_EYEBROW",pt),E("FACEMESH_RIGHT_IRIS",[[469,470],[470,471],[471,472],[472,469]]),E("FACEMESH_FACE_OVAL",mt),E("FACEMESH_CONTOURS",ft),E("FACEMESH_TESSELATION",[[127,34],[34,139],[139,127],[11,0],[0,37],[37,11],[232,231],[231,120],[120,232],[72,37],[37,39],[39,72],[128,121],[121,47],[47,128],[232,121],[121,128],[128,232],[104,69],[69,67],[67,104],[175,171],[171,148],[148,175],[118,50],[50,101],[101,118],[73,39],[39,40],[40,73],[9,151],[151,108],[108,9],[48,115],[115,131],[131,48],[194,204],[204,211],[211,194],[74,40],[40,185],[185,74],[80,42],[42,183],[183,80],[40,92],[92,186],[186,40],[230,229],[229,118],[118,230],[202,212],[212,214],[214,202],[83,18],[18,17],[17,83],[76,61],[61,146],[146,76],[160,29],[29,30],[30,160],[56,157],[157,173],[173,56],[106,204],[204,194],[194,106],[135,214],[214,192],[192,135],[203,165],[165,98],[98,203],[21,71],[71,68],[68,21],[51,45],[45,4],[4,51],[144,24],[24,23],[23,144],[77,146],[146,91],[91,77],[205,50],[50,187],[187,205],[201,200],[200,18],[18,201],[91,106],[106,182],[182,91],[90,91],[91,181],[181,90],[85,84],[84,17],[17,85],[206,203],[203,36],[36,206],[148,171],[171,140],[140,148],[92,40],[40,39],[39,92],[193,189],[189,244],[244,193],[159,158],[158,28],[28,159],[247,246],[246,161],[161,247],[236,3],[3,196],[196,236],[54,68],[68,104],[104,54],[193,168],[168,8],[8,193],[117,228],[228,31],[31,117],[189,193],[193,55],[55,189],[98,97],[97,99],[99,98],[126,47],[47,100],[100,126],[166,79],[79,218],[218,166],[155,154],[154,26],[26,155],[209,49],[49,131],[131,209],[135,136],[136,150],[150,135],[47,126],[126,217],[217,47],[223,52],[52,53],[53,223],[45,51],[51,134],[134,45],[211,170],[170,140],[140,211],[67,69],[69,108],[108,67],[43,106],[106,91],[91,43],[230,119],[119,120],[120,230],[226,130],[130,247],[247,226],[63,53],[53,52],[52,63],[238,20],[20,242],[242,238],[46,70],[70,156],[156,46],[78,62],[62,96],[96,78],[46,53],[53,63],[63,46],[143,34],[34,227],[227,143],[123,117],[117,111],[111,123],[44,125],[125,19],[19,44],[236,134],[134,51],[51,236],[216,206],[206,205],[205,216],[154,153],[153,22],[22,154],[39,37],[37,167],[167,39],[200,201],[201,208],[208,200],[36,142],[142,100],[100,36],[57,212],[212,202],[202,57],[20,60],[60,99],[99,20],[28,158],[158,157],[157,28],[35,226],[226,113],[113,35],[160,159],[159,27],[27,160],[204,202],[202,210],[210,204],[113,225],[225,46],[46,113],[43,202],[202,204],[204,43],[62,76],[76,77],[77,62],[137,123],[123,116],[116,137],[41,38],[38,72],[72,41],[203,129],[129,142],[142,203],[64,98],[98,240],[240,64],[49,102],[102,64],[64,49],[41,73],[73,74],[74,41],[212,216],[216,207],[207,212],[42,74],[74,184],[184,42],[169,170],[170,211],[211,169],[170,149],[149,176],[176,170],[105,66],[66,69],[69,105],[122,6],[6,168],[168,122],[123,147],[147,187],[187,123],[96,77],[77,90],[90,96],[65,55],[55,107],[107,65],[89,90],[90,180],[180,89],[101,100],[100,120],[120,101],[63,105],[105,104],[104,63],[93,137],[137,227],[227,93],[15,86],[86,85],[85,15],[129,102],[102,49],[49,129],[14,87],[87,86],[86,14],[55,8],[8,9],[9,55],[100,47],[47,121],[121,100],[145,23],[23,22],[22,145],[88,89],[89,179],[179,88],[6,122],[122,196],[196,6],[88,95],[95,96],[96,88],[138,172],[172,136],[136,138],[215,58],[58,172],[172,215],[115,48],[48,219],[219,115],[42,80],[80,81],[81,42],[195,3],[3,51],[51,195],[43,146],[146,61],[61,43],[171,175],[175,199],[199,171],[81,82],[82,38],[38,81],[53,46],[46,225],[225,53],[144,163],[163,110],[110,144],[52,65],[65,66],[66,52],[229,228],[228,117],[117,229],[34,127],[127,234],[234,34],[107,108],[108,69],[69,107],[109,108],[108,151],[151,109],[48,64],[64,235],[235,48],[62,78],[78,191],[191,62],[129,209],[209,126],[126,129],[111,35],[35,143],[143,111],[117,123],[123,50],[50,117],[222,65],[65,52],[52,222],[19,125],[125,141],[141,19],[221,55],[55,65],[65,221],[3,195],[195,197],[197,3],[25,7],[7,33],[33,25],[220,237],[237,44],[44,220],[70,71],[71,139],[139,70],[122,193],[193,245],[245,122],[247,130],[130,33],[33,247],[71,21],[21,162],[162,71],[170,169],[169,150],[150,170],[188,174],[174,196],[196,188],[216,186],[186,92],[92,216],[2,97],[97,167],[167,2],[141,125],[125,241],[241,141],[164,167],[167,37],[37,164],[72,38],[38,12],[12,72],[38,82],[82,13],[13,38],[63,68],[68,71],[71,63],[226,35],[35,111],[111,226],[101,50],[50,205],[205,101],[206,92],[92,165],[165,206],[209,198],[198,217],[217,209],[165,167],[167,97],[97,165],[220,115],[115,218],[218,220],[133,112],[112,243],[243,133],[239,238],[238,241],[241,239],[214,135],[135,169],[169,214],[190,173],[173,133],[133,190],[171,208],[208,32],[32,171],[125,44],[44,237],[237,125],[86,87],[87,178],[178,86],[85,86],[86,179],[179,85],[84,85],[85,180],[180,84],[83,84],[84,181],[181,83],[201,83],[83,182],[182,201],[137,93],[93,132],[132,137],[76,62],[62,183],[183,76],[61,76],[76,184],[184,61],[57,61],[61,185],[185,57],[212,57],[57,186],[186,212],[214,207],[207,187],[187,214],[34,143],[143,156],[156,34],[79,239],[239,237],[237,79],[123,137],[137,177],[177,123],[44,1],[1,4],[4,44],[201,194],[194,32],[32,201],[64,102],[102,129],[129,64],[213,215],[215,138],[138,213],[59,166],[166,219],[219,59],[242,99],[99,97],[97,242],[2,94],[94,141],[141,2],[75,59],[59,235],[235,75],[24,110],[110,228],[228,24],[25,130],[130,226],[226,25],[23,24],[24,229],[229,23],[22,23],[23,230],[230,22],[26,22],[22,231],[231,26],[112,26],[26,232],[232,112],[189,190],[190,243],[243,189],[221,56],[56,190],[190,221],[28,56],[56,221],[221,28],[27,28],[28,222],[222,27],[29,27],[27,223],[223,29],[30,29],[29,224],[224,30],[247,30],[30,225],[225,247],[238,79],[79,20],[20,238],[166,59],[59,75],[75,166],[60,75],[75,240],[240,60],[147,177],[177,215],[215,147],[20,79],[79,166],[166,20],[187,147],[147,213],[213,187],[112,233],[233,244],[244,112],[233,128],[128,245],[245,233],[128,114],[114,188],[188,128],[114,217],[217,174],[174,114],[131,115],[115,220],[220,131],[217,198],[198,236],[236,217],[198,131],[131,134],[134,198],[177,132],[132,58],[58,177],[143,35],[35,124],[124,143],[110,163],[163,7],[7,110],[228,110],[110,25],[25,228],[356,389],[389,368],[368,356],[11,302],[302,267],[267,11],[452,350],[350,349],[349,452],[302,303],[303,269],[269,302],[357,343],[343,277],[277,357],[452,453],[453,357],[357,452],[333,332],[332,297],[297,333],[175,152],[152,377],[377,175],[347,348],[348,330],[330,347],[303,304],[304,270],[270,303],[9,336],[336,337],[337,9],[278,279],[279,360],[360,278],[418,262],[262,431],[431,418],[304,408],[408,409],[409,304],[310,415],[415,407],[407,310],[270,409],[409,410],[410,270],[450,348],[348,347],[347,450],[422,430],[430,434],[434,422],[313,314],[314,17],[17,313],[306,307],[307,375],[375,306],[387,388],[388,260],[260,387],[286,414],[414,398],[398,286],[335,406],[406,418],[418,335],[364,367],[367,416],[416,364],[423,358],[358,327],[327,423],[251,284],[284,298],[298,251],[281,5],[5,4],[4,281],[373,374],[374,253],[253,373],[307,320],[320,321],[321,307],[425,427],[427,411],[411,425],[421,313],[313,18],[18,421],[321,405],[405,406],[406,321],[320,404],[404,405],[405,320],[315,16],[16,17],[17,315],[426,425],[425,266],[266,426],[377,400],[400,369],[369,377],[322,391],[391,269],[269,322],[417,465],[465,464],[464,417],[386,257],[257,258],[258,386],[466,260],[260,388],[388,466],[456,399],[399,419],[419,456],[284,332],[332,333],[333,284],[417,285],[285,8],[8,417],[346,340],[340,261],[261,346],[413,441],[441,285],[285,413],[327,460],[460,328],[328,327],[355,371],[371,329],[329,355],[392,439],[439,438],[438,392],[382,341],[341,256],[256,382],[429,420],[420,360],[360,429],[364,394],[394,379],[379,364],[277,343],[343,437],[437,277],[443,444],[444,283],[283,443],[275,440],[440,363],[363,275],[431,262],[262,369],[369,431],[297,338],[338,337],[337,297],[273,375],[375,321],[321,273],[450,451],[451,349],[349,450],[446,342],[342,467],[467,446],[293,334],[334,282],[282,293],[458,461],[461,462],[462,458],[276,353],[353,383],[383,276],[308,324],[324,325],[325,308],[276,300],[300,293],[293,276],[372,345],[345,447],[447,372],[352,345],[345,340],[340,352],[274,1],[1,19],[19,274],[456,248],[248,281],[281,456],[436,427],[427,425],[425,436],[381,256],[256,252],[252,381],[269,391],[391,393],[393,269],[200,199],[199,428],[428,200],[266,330],[330,329],[329,266],[287,273],[273,422],[422,287],[250,462],[462,328],[328,250],[258,286],[286,384],[384,258],[265,353],[353,342],[342,265],[387,259],[259,257],[257,387],[424,431],[431,430],[430,424],[342,353],[353,276],[276,342],[273,335],[335,424],[424,273],[292,325],[325,307],[307,292],[366,447],[447,345],[345,366],[271,303],[303,302],[302,271],[423,266],[266,371],[371,423],[294,455],[455,460],[460,294],[279,278],[278,294],[294,279],[271,272],[272,304],[304,271],[432,434],[434,427],[427,432],[272,407],[407,408],[408,272],[394,430],[430,431],[431,394],[395,369],[369,400],[400,395],[334,333],[333,299],[299,334],[351,417],[417,168],[168,351],[352,280],[280,411],[411,352],[325,319],[319,320],[320,325],[295,296],[296,336],[336,295],[319,403],[403,404],[404,319],[330,348],[348,349],[349,330],[293,298],[298,333],[333,293],[323,454],[454,447],[447,323],[15,16],[16,315],[315,15],[358,429],[429,279],[279,358],[14,15],[15,316],[316,14],[285,336],[336,9],[9,285],[329,349],[349,350],[350,329],[374,380],[380,252],[252,374],[318,402],[402,403],[403,318],[6,197],[197,419],[419,6],[318,319],[319,325],[325,318],[367,364],[364,365],[365,367],[435,367],[367,397],[397,435],[344,438],[438,439],[439,344],[272,271],[271,311],[311,272],[195,5],[5,281],[281,195],[273,287],[287,291],[291,273],[396,428],[428,199],[199,396],[311,271],[271,268],[268,311],[283,444],[444,445],[445,283],[373,254],[254,339],[339,373],[282,334],[334,296],[296,282],[449,347],[347,346],[346,449],[264,447],[447,454],[454,264],[336,296],[296,299],[299,336],[338,10],[10,151],[151,338],[278,439],[439,455],[455,278],[292,407],[407,415],[415,292],[358,371],[371,355],[355,358],[340,345],[345,372],[372,340],[346,347],[347,280],[280,346],[442,443],[443,282],[282,442],[19,94],[94,370],[370,19],[441,442],[442,295],[295,441],[248,419],[419,197],[197,248],[263,255],[255,359],[359,263],[440,275],[275,274],[274,440],[300,383],[383,368],[368,300],[351,412],[412,465],[465,351],[263,467],[467,466],[466,263],[301,368],[368,389],[389,301],[395,378],[378,379],[379,395],[412,351],[351,419],[419,412],[436,426],[426,322],[322,436],[2,164],[164,393],[393,2],[370,462],[462,461],[461,370],[164,0],[0,267],[267,164],[302,11],[11,12],[12,302],[268,12],[12,13],[13,268],[293,300],[300,301],[301,293],[446,261],[261,340],[340,446],[330,266],[266,425],[425,330],[426,423],[423,391],[391,426],[429,355],[355,437],[437,429],[391,327],[327,326],[326,391],[440,457],[457,438],[438,440],[341,382],[382,362],[362,341],[459,457],[457,461],[461,459],[434,430],[430,394],[394,434],[414,463],[463,362],[362,414],[396,369],[369,262],[262,396],[354,461],[461,457],[457,354],[316,403],[403,402],[402,316],[315,404],[404,403],[403,315],[314,405],[405,404],[404,314],[313,406],[406,405],[405,313],[421,418],[418,406],[406,421],[366,401],[401,361],[361,366],[306,408],[408,407],[407,306],[291,409],[409,408],[408,291],[287,410],[410,409],[409,287],[432,436],[436,410],[410,432],[434,416],[416,411],[411,434],[264,368],[368,383],[383,264],[309,438],[438,457],[457,309],[352,376],[376,401],[401,352],[274,275],[275,4],[4,274],[421,428],[428,262],[262,421],[294,327],[327,358],[358,294],[433,416],[416,367],[367,433],[289,455],[455,439],[439,289],[462,370],[370,326],[326,462],[2,326],[326,370],[370,2],[305,460],[460,455],[455,305],[254,449],[449,448],[448,254],[255,261],[261,446],[446,255],[253,450],[450,449],[449,253],[252,451],[451,450],[450,252],[256,452],[452,451],[451,256],[341,453],[453,452],[452,341],[413,464],[464,463],[463,413],[441,413],[413,414],[414,441],[258,442],[442,441],[441,258],[257,443],[443,442],[442,257],[259,444],[444,443],[443,259],[260,445],[445,444],[444,260],[467,342],[342,445],[445,467],[459,458],[458,250],[250,459],[289,392],[392,290],[290,289],[290,328],[328,460],[460,290],[376,433],[433,435],[435,376],[250,290],[290,392],[392,250],[411,416],[416,433],[433,411],[341,463],[463,464],[464,341],[453,464],[464,465],[465,453],[357,465],[465,412],[412,357],[343,412],[412,399],[399,343],[360,363],[363,440],[440,360],[437,399],[399,456],[456,437],[420,456],[456,363],[363,420],[401,435],[435,288],[288,401],[372,383],[383,353],[353,372],[339,255],[255,249],[249,339],[448,261],[261,255],[255,448],[133,243],[243,190],[190,133],[133,155],[155,112],[112,133],[33,246],[246,247],[247,33],[33,130],[130,25],[25,33],[398,384],[384,286],[286,398],[362,398],[398,414],[414,362],[362,463],[463,341],[341,362],[263,359],[359,467],[467,263],[263,249],[249,255],[255,263],[466,467],[467,260],[260,466],[75,60],[60,166],[166,75],[238,239],[239,79],[79,238],[162,127],[127,139],[139,162],[72,11],[11,37],[37,72],[121,232],[232,120],[120,121],[73,72],[72,39],[39,73],[114,128],[128,47],[47,114],[233,232],[232,128],[128,233],[103,104],[104,67],[67,103],[152,175],[175,148],[148,152],[119,118],[118,101],[101,119],[74,73],[73,40],[40,74],[107,9],[9,108],[108,107],[49,48],[48,131],[131,49],[32,194],[194,211],[211,32],[184,74],[74,185],[185,184],[191,80],[80,183],[183,191],[185,40],[40,186],[186,185],[119,230],[230,118],[118,119],[210,202],[202,214],[214,210],[84,83],[83,17],[17,84],[77,76],[76,146],[146,77],[161,160],[160,30],[30,161],[190,56],[56,173],[173,190],[182,106],[106,194],[194,182],[138,135],[135,192],[192,138],[129,203],[203,98],[98,129],[54,21],[21,68],[68,54],[5,51],[51,4],[4,5],[145,144],[144,23],[23,145],[90,77],[77,91],[91,90],[207,205],[205,187],[187,207],[83,201],[201,18],[18,83],[181,91],[91,182],[182,181],[180,90],[90,181],[181,180],[16,85],[85,17],[17,16],[205,206],[206,36],[36,205],[176,148],[148,140],[140,176],[165,92],[92,39],[39,165],[245,193],[193,244],[244,245],[27,159],[159,28],[28,27],[30,247],[247,161],[161,30],[174,236],[236,196],[196,174],[103,54],[54,104],[104,103],[55,193],[193,8],[8,55],[111,117],[117,31],[31,111],[221,189],[189,55],[55,221],[240,98],[98,99],[99,240],[142,126],[126,100],[100,142],[219,166],[166,218],[218,219],[112,155],[155,26],[26,112],[198,209],[209,131],[131,198],[169,135],[135,150],[150,169],[114,47],[47,217],[217,114],[224,223],[223,53],[53,224],[220,45],[45,134],[134,220],[32,211],[211,140],[140,32],[109,67],[67,108],[108,109],[146,43],[43,91],[91,146],[231,230],[230,120],[120,231],[113,226],[226,247],[247,113],[105,63],[63,52],[52,105],[241,238],[238,242],[242,241],[124,46],[46,156],[156,124],[95,78],[78,96],[96,95],[70,46],[46,63],[63,70],[116,143],[143,227],[227,116],[116,123],[123,111],[111,116],[1,44],[44,19],[19,1],[3,236],[236,51],[51,3],[207,216],[216,205],[205,207],[26,154],[154,22],[22,26],[165,39],[39,167],[167,165],[199,200],[200,208],[208,199],[101,36],[36,100],[100,101],[43,57],[57,202],[202,43],[242,20],[20,99],[99,242],[56,28],[28,157],[157,56],[124,35],[35,113],[113,124],[29,160],[160,27],[27,29],[211,204],[204,210],[210,211],[124,113],[113,46],[46,124],[106,43],[43,204],[204,106],[96,62],[62,77],[77,96],[227,137],[137,116],[116,227],[73,41],[41,72],[72,73],[36,203],[203,142],[142,36],[235,64],[64,240],[240,235],[48,49],[49,64],[64,48],[42,41],[41,74],[74,42],[214,212],[212,207],[207,214],[183,42],[42,184],[184,183],[210,169],[169,211],[211,210],[140,170],[170,176],[176,140],[104,105],[105,69],[69,104],[193,122],[122,168],[168,193],[50,123],[123,187],[187,50],[89,96],[96,90],[90,89],[66,65],[65,107],[107,66],[179,89],[89,180],[180,179],[119,101],[101,120],[120,119],[68,63],[63,104],[104,68],[234,93],[93,227],[227,234],[16,15],[15,85],[85,16],[209,129],[129,49],[49,209],[15,14],[14,86],[86,15],[107,55],[55,9],[9,107],[120,100],[100,121],[121,120],[153,145],[145,22],[22,153],[178,88],[88,179],[179,178],[197,6],[6,196],[196,197],[89,88],[88,96],[96,89],[135,138],[138,136],[136,135],[138,215],[215,172],[172,138],[218,115],[115,219],[219,218],[41,42],[42,81],[81,41],[5,195],[195,51],[51,5],[57,43],[43,61],[61,57],[208,171],[171,199],[199,208],[41,81],[81,38],[38,41],[224,53],[53,225],[225,224],[24,144],[144,110],[110,24],[105,52],[52,66],[66,105],[118,229],[229,117],[117,118],[227,34],[34,234],[234,227],[66,107],[107,69],[69,66],[10,109],[109,151],[151,10],[219,48],[48,235],[235,219],[183,62],[62,191],[191,183],[142,129],[129,126],[126,142],[116,111],[111,143],[143,116],[118,117],[117,50],[50,118],[223,222],[222,52],[52,223],[94,19],[19,141],[141,94],[222,221],[221,65],[65,222],[196,3],[3,197],[197,196],[45,220],[220,44],[44,45],[156,70],[70,139],[139,156],[188,122],[122,245],[245,188],[139,71],[71,162],[162,139],[149,170],[170,150],[150,149],[122,188],[188,196],[196,122],[206,216],[216,92],[92,206],[164,2],[2,167],[167,164],[242,141],[141,241],[241,242],[0,164],[164,37],[37,0],[11,72],[72,12],[12,11],[12,38],[38,13],[13,12],[70,63],[63,71],[71,70],[31,226],[226,111],[111,31],[36,101],[101,205],[205,36],[203,206],[206,165],[165,203],[126,209],[209,217],[217,126],[98,165],[165,97],[97,98],[237,220],[220,218],[218,237],[237,239],[239,241],[241,237],[210,214],[214,169],[169,210],[140,171],[171,32],[32,140],[241,125],[125,237],[237,241],[179,86],[86,178],[178,179],[180,85],[85,179],[179,180],[181,84],[84,180],[180,181],[182,83],[83,181],[181,182],[194,201],[201,182],[182,194],[177,137],[137,132],[132,177],[184,76],[76,183],[183,184],[185,61],[61,184],[184,185],[186,57],[57,185],[185,186],[216,212],[212,186],[186,216],[192,214],[214,187],[187,192],[139,34],[34,156],[156,139],[218,79],[79,237],[237,218],[147,123],[123,177],[177,147],[45,44],[44,4],[4,45],[208,201],[201,32],[32,208],[98,64],[64,129],[129,98],[192,213],[213,138],[138,192],[235,59],[59,219],[219,235],[141,242],[242,97],[97,141],[97,2],[2,141],[141,97],[240,75],[75,235],[235,240],[229,24],[24,228],[228,229],[31,25],[25,226],[226,31],[230,23],[23,229],[229,230],[231,22],[22,230],[230,231],[232,26],[26,231],[231,232],[233,112],[112,232],[232,233],[244,189],[189,243],[243,244],[189,221],[221,190],[190,189],[222,28],[28,221],[221,222],[223,27],[27,222],[222,223],[224,29],[29,223],[223,224],[225,30],[30,224],[224,225],[113,247],[247,225],[225,113],[99,60],[60,240],[240,99],[213,147],[147,215],[215,213],[60,20],[20,166],[166,60],[192,187],[187,213],[213,192],[243,112],[112,244],[244,243],[244,233],[233,245],[245,244],[245,128],[128,188],[188,245],[188,114],[114,174],[174,188],[134,131],[131,220],[220,134],[174,217],[217,236],[236,174],[236,198],[198,134],[134,236],[215,177],[177,58],[58,215],[156,143],[143,124],[124,156],[25,110],[110,7],[7,25],[31,228],[228,25],[25,31],[264,356],[356,368],[368,264],[0,11],[11,267],[267,0],[451,452],[452,349],[349,451],[267,302],[302,269],[269,267],[350,357],[357,277],[277,350],[350,452],[452,357],[357,350],[299,333],[333,297],[297,299],[396,175],[175,377],[377,396],[280,347],[347,330],[330,280],[269,303],[303,270],[270,269],[151,9],[9,337],[337,151],[344,278],[278,360],[360,344],[424,418],[418,431],[431,424],[270,304],[304,409],[409,270],[272,310],[310,407],[407,272],[322,270],[270,410],[410,322],[449,450],[450,347],[347,449],[432,422],[422,434],[434,432],[18,313],[313,17],[17,18],[291,306],[306,375],[375,291],[259,387],[387,260],[260,259],[424,335],[335,418],[418,424],[434,364],[364,416],[416,434],[391,423],[423,327],[327,391],[301,251],[251,298],[298,301],[275,281],[281,4],[4,275],[254,373],[373,253],[253,254],[375,307],[307,321],[321,375],[280,425],[425,411],[411,280],[200,421],[421,18],[18,200],[335,321],[321,406],[406,335],[321,320],[320,405],[405,321],[314,315],[315,17],[17,314],[423,426],[426,266],[266,423],[396,377],[377,369],[369,396],[270,322],[322,269],[269,270],[413,417],[417,464],[464,413],[385,386],[386,258],[258,385],[248,456],[456,419],[419,248],[298,284],[284,333],[333,298],[168,417],[417,8],[8,168],[448,346],[346,261],[261,448],[417,413],[413,285],[285,417],[326,327],[327,328],[328,326],[277,355],[355,329],[329,277],[309,392],[392,438],[438,309],[381,382],[382,256],[256,381],[279,429],[429,360],[360,279],[365,364],[364,379],[379,365],[355,277],[277,437],[437,355],[282,443],[443,283],[283,282],[281,275],[275,363],[363,281],[395,431],[431,369],[369,395],[299,297],[297,337],[337,299],[335,273],[273,321],[321,335],[348,450],[450,349],[349,348],[359,446],[446,467],[467,359],[283,293],[293,282],[282,283],[250,458],[458,462],[462,250],[300,276],[276,383],[383,300],[292,308],[308,325],[325,292],[283,276],[276,293],[293,283],[264,372],[372,447],[447,264],[346,352],[352,340],[340,346],[354,274],[274,19],[19,354],[363,456],[456,281],[281,363],[426,436],[436,425],[425,426],[380,381],[381,252],[252,380],[267,269],[269,393],[393,267],[421,200],[200,428],[428,421],[371,266],[266,329],[329,371],[432,287],[287,422],[422,432],[290,250],[250,328],[328,290],[385,258],[258,384],[384,385],[446,265],[265,342],[342,446],[386,387],[387,257],[257,386],[422,424],[424,430],[430,422],[445,342],[342,276],[276,445],[422,273],[273,424],[424,422],[306,292],[292,307],[307,306],[352,366],[366,345],[345,352],[268,271],[271,302],[302,268],[358,423],[423,371],[371,358],[327,294],[294,460],[460,327],[331,279],[279,294],[294,331],[303,271],[271,304],[304,303],[436,432],[432,427],[427,436],[304,272],[272,408],[408,304],[395,394],[394,431],[431,395],[378,395],[395,400],[400,378],[296,334],[334,299],[299,296],[6,351],[351,168],[168,6],[376,352],[352,411],[411,376],[307,325],[325,320],[320,307],[285,295],[295,336],[336,285],[320,319],[319,404],[404,320],[329,330],[330,349],[349,329],[334,293],[293,333],[333,334],[366,323],[323,447],[447,366],[316,15],[15,315],[315,316],[331,358],[358,279],[279,331],[317,14],[14,316],[316,317],[8,285],[285,9],[9,8],[277,329],[329,350],[350,277],[253,374],[374,252],[252,253],[319,318],[318,403],[403,319],[351,6],[6,419],[419,351],[324,318],[318,325],[325,324],[397,367],[367,365],[365,397],[288,435],[435,397],[397,288],[278,344],[344,439],[439,278],[310,272],[272,311],[311,310],[248,195],[195,281],[281,248],[375,273],[273,291],[291,375],[175,396],[396,199],[199,175],[312,311],[311,268],[268,312],[276,283],[283,445],[445,276],[390,373],[373,339],[339,390],[295,282],[282,296],[296,295],[448,449],[449,346],[346,448],[356,264],[264,454],[454,356],[337,336],[336,299],[299,337],[337,338],[338,151],[151,337],[294,278],[278,455],[455,294],[308,292],[292,415],[415,308],[429,358],[358,355],[355,429],[265,340],[340,372],[372,265],[352,346],[346,280],[280,352],[295,442],[442,282],[282,295],[354,19],[19,370],[370,354],[285,441],[441,295],[295,285],[195,248],[248,197],[197,195],[457,440],[440,274],[274,457],[301,300],[300,368],[368,301],[417,351],[351,465],[465,417],[251,301],[301,389],[389,251],[394,395],[395,379],[379,394],[399,412],[412,419],[419,399],[410,436],[436,322],[322,410],[326,2],[2,393],[393,326],[354,370],[370,461],[461,354],[393,164],[164,267],[267,393],[268,302],[302,12],[12,268],[312,268],[268,13],[13,312],[298,293],[293,301],[301,298],[265,446],[446,340],[340,265],[280,330],[330,425],[425,280],[322,426],[426,391],[391,322],[420,429],[429,437],[437,420],[393,391],[391,326],[326,393],[344,440],[440,438],[438,344],[458,459],[459,461],[461,458],[364,434],[434,394],[394,364],[428,396],[396,262],[262,428],[274,354],[354,457],[457,274],[317,316],[316,402],[402,317],[316,315],[315,403],[403,316],[315,314],[314,404],[404,315],[314,313],[313,405],[405,314],[313,421],[421,406],[406,313],[323,366],[366,361],[361,323],[292,306],[306,407],[407,292],[306,291],[291,408],[408,306],[291,287],[287,409],[409,291],[287,432],[432,410],[410,287],[427,434],[434,411],[411,427],[372,264],[264,383],[383,372],[459,309],[309,457],[457,459],[366,352],[352,401],[401,366],[1,274],[274,4],[4,1],[418,421],[421,262],[262,418],[331,294],[294,358],[358,331],[435,433],[433,367],[367,435],[392,289],[289,439],[439,392],[328,462],[462,326],[326,328],[94,2],[2,370],[370,94],[289,305],[305,455],[455,289],[339,254],[254,448],[448,339],[359,255],[255,446],[446,359],[254,253],[253,449],[449,254],[253,252],[252,450],[450,253],[252,256],[256,451],[451,252],[256,341],[341,452],[452,256],[414,413],[413,463],[463,414],[286,441],[441,414],[414,286],[286,258],[258,441],[441,286],[258,257],[257,442],[442,258],[257,259],[259,443],[443,257],[259,260],[260,444],[444,259],[260,467],[467,445],[445,260],[309,459],[459,250],[250,309],[305,289],[289,290],[290,305],[305,290],[290,460],[460,305],[401,376],[376,435],[435,401],[309,250],[250,392],[392,309],[376,411],[411,433],[433,376],[453,341],[341,464],[464,453],[357,453],[453,465],[465,357],[343,357],[357,412],[412,343],[437,343],[343,399],[399,437],[344,360],[360,440],[440,344],[420,437],[437,456],[456,420],[360,420],[420,363],[363,360],[361,401],[401,288],[288,361],[265,372],[372,353],[353,265],[390,339],[339,249],[249,390],[339,448],[448,255],[255,339]]),E("matrixDataToMatrix",(function(e){for(var t=e.getCols(),n=e.getRows(),a=e.getPackedDataList(),i=[],s=0;s{e.exports=function e(t,n,a){function i(r,o){if(!n[r]){if(!t[r]){if(s)return s(r,!0);var l=new Error("Cannot find module '"+r+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[r]={exports:{}};t[r][0].call(u.exports,(function(e){var n=t[r][1][e];return i(n||e)}),u,u.exports,e,t,n,a)}return n[r].exports}for(var s=void 0,r=0;r=43)}})).catch((function(){return!1}))}function A(e){return"boolean"==typeof f?u.resolve(f):w(e).then((function(e){return f=e}))}function x(e){var t=g[e.name],n={};n.promise=new u((function(e,t){n.resolve=e,n.reject=t})),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then((function(){return n.promise})):t.dbReady=n.promise}function C(e){var t=g[e.name].deferredOperations.pop();if(t)return t.resolve(),t.promise}function S(e,t){var n=g[e.name].deferredOperations.pop();if(n)return n.reject(t),n.promise}function E(e,t){return new u((function(n,a){if(g[e.name]=g[e.name]||B(),e.db){if(!t)return n(e.db);x(e),e.db.close()}var i=[e.name];t&&i.push(e.version);var s=r.open.apply(r,i);t&&(s.onupgradeneeded=function(t){var n=s.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(m)}catch(e){if("ConstraintError"!==e.name)throw e}}),s.onerror=function(e){e.preventDefault(),a(s.error)},s.onsuccess=function(){var t=s.result;t.onversionchange=function(e){e.target.close()},n(t),C(e)}}))}function _(e){return E(e,!1)}function T(e){return E(e,!0)}function I(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),a=e.versione.db.version;if(a&&(e.version,e.version=e.db.version),i||n){if(n){var s=e.db.version+1;s>e.version&&(e.version=s)}return!0}return!1}function N(e){return new u((function(t,n){var a=new FileReader;a.onerror=n,a.onloadend=function(n){var a=btoa(n.target.result||"");t({__local_forage_encoded_blob:!0,data:a,type:e.type})},a.readAsBinaryString(e)}))}function R(e){return l([k(atob(e.data))],{type:e.type})}function D(e){return e&&e.__local_forage_encoded_blob}function z(e){var t=this,n=t._initReady().then((function(){var e=g[t._dbInfo.name];if(e&&e.dbReady)return e.dbReady}));return h(n,e,e),n}function O(e){x(e);for(var t=g[e.name],n=t.forages,a=0;a0&&(!e.db||"InvalidStateError"===i.name||"NotFoundError"===i.name))return u.resolve().then((function(){if(!e.db||"NotFoundError"===i.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),T(e)})).then((function(){return O(e).then((function(){M(e,t,n,a-1)}))})).catch(n);n(i)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function F(e){var t=this,n={db:null};if(e)for(var a in e)n[a]=e[a];var i=g[n.name];i||(i=B(),g[n.name]=i),i.forages.push(t),t._initReady||(t._initReady=t.ready,t.ready=z);var s=[];function r(){return u.resolve()}for(var o=0;o>4,c[l++]=(15&a)<<4|i>>2,c[l++]=(3&i)<<6|63&s;return u}function me(e){var t,n=new Uint8Array(e),a="";for(t=0;t>2],a+=Z[(3&n[t])<<4|n[t+1]>>4],a+=Z[(15&n[t+1])<<2|n[t+2]>>6],a+=Z[63&n[t+2]];return n.length%3==2?a=a.substring(0,a.length-1)+"=":n.length%3==1&&(a=a.substring(0,a.length-2)+"=="),a}function fe(e,t){var n="";if(e&&(n=de.call(e)),e&&("[object ArrayBuffer]"===n||e.buffer&&"[object ArrayBuffer]"===de.call(e.buffer))){var a,i=Q;e instanceof ArrayBuffer?(a=e,i+=ee):(a=e.buffer,"[object Int8Array]"===n?i+=ne:"[object Uint8Array]"===n?i+=ae:"[object Uint8ClampedArray]"===n?i+=ie:"[object Int16Array]"===n?i+=se:"[object Uint16Array]"===n?i+=oe:"[object Int32Array]"===n?i+=re:"[object Uint32Array]"===n?i+=le:"[object Float32Array]"===n?i+=ue:"[object Float64Array]"===n?i+=ce:t(new Error("Failed to get type for BinaryArray"))),t(i+me(a))}else if("[object Blob]"===n){var s=new FileReader;s.onload=function(){var n=X+e.type+"~"+me(this.result);t(Q+te+n)},s.readAsArrayBuffer(e)}else try{t(JSON.stringify(e))}catch(e){t(null,e)}}function ge(e){if(e.substring(0,J)!==Q)return JSON.parse(e);var t,n=e.substring(he),a=e.substring(J,he);if(a===te&&Y.test(n)){var i=n.match(Y);t=i[1],n=n.substring(i[0].length)}var s=pe(n);switch(a){case ee:return s;case te:return l([s],{type:t});case ne:return new Int8Array(s);case ae:return new Uint8Array(s);case ie:return new Uint8ClampedArray(s);case se:return new Int16Array(s);case oe:return new Uint16Array(s);case re:return new Int32Array(s);case le:return new Uint32Array(s);case ue:return new Float32Array(s);case ce:return new Float64Array(s);default:throw new Error("Unkown type: "+a)}}var ye={serialize:fe,deserialize:ge,stringToBuffer:pe,bufferToString:me};function be(e,t,n,a){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,a)}function ve(e){var t=this,n={db:null};if(e)for(var a in e)n[a]="string"!=typeof e[a]?e[a].toString():e[a];var i=new u((function(e,a){try{n.db=openDatabase(n.name,String(n.version),n.description,n.size)}catch(e){return a(e)}n.db.transaction((function(i){be(i,n,(function(){t._dbInfo=n,e()}),(function(e,t){a(t)}))}),a)}));return n.serializer=ye,i}function ke(e,t,n,a,i,s){e.executeSql(n,a,i,(function(e,r){r.code===r.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],(function(e,o){o.rows.length?s(e,r):be(e,t,(function(){e.executeSql(n,a,i,s)}),s)}),s):s(e,r)}),s)}function we(e,t){var n=this;e=d(e);var a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"SELECT * FROM "+i.storeName+" WHERE key = ? LIMIT 1",[e],(function(e,n){var a=n.rows.length?n.rows.item(0).value:null;a&&(a=i.serializer.deserialize(a)),t(a)}),(function(e,t){a(t)}))}))})).catch(a)}));return c(a,t),a}function Ae(e,t){var n=this,a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"SELECT * FROM "+i.storeName,[],(function(n,a){for(var s=a.rows,r=s.length,o=0;o0)return void s(xe.apply(i,[e,o,n,a-1]));r(t)}}))}))})).catch(r)}));return c(s,n),s}function Ce(e,t,n){return xe.apply(this,[e,t,n,1])}function Se(e,t){var n=this;e=d(e);var a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"DELETE FROM "+i.storeName+" WHERE key = ?",[e],(function(){t()}),(function(e,t){a(t)}))}))})).catch(a)}));return c(a,t),a}function Ee(e){var t=this,n=new u((function(e,n){t.ready().then((function(){var a=t._dbInfo;a.db.transaction((function(t){ke(t,a,"DELETE FROM "+a.storeName,[],(function(){e()}),(function(e,t){n(t)}))}))})).catch(n)}));return c(n,e),n}function _e(e){var t=this,n=new u((function(e,n){t.ready().then((function(){var a=t._dbInfo;a.db.transaction((function(t){ke(t,a,"SELECT COUNT(key) as c FROM "+a.storeName,[],(function(t,n){var a=n.rows.item(0).c;e(a)}),(function(e,t){n(t)}))}))})).catch(n)}));return c(n,e),n}function Te(e,t){var n=this,a=new u((function(t,a){n.ready().then((function(){var i=n._dbInfo;i.db.transaction((function(n){ke(n,i,"SELECT key FROM "+i.storeName+" WHERE id = ? LIMIT 1",[e+1],(function(e,n){var a=n.rows.length?n.rows.item(0).key:null;t(a)}),(function(e,t){a(t)}))}))})).catch(a)}));return c(a,t),a}function Ie(e){var t=this,n=new u((function(e,n){t.ready().then((function(){var a=t._dbInfo;a.db.transaction((function(t){ke(t,a,"SELECT key FROM "+a.storeName,[],(function(t,n){for(var a=[],i=0;i '__WebKitDatabaseInfoTable__'",[],(function(n,a){for(var i=[],s=0;s0}function Fe(e){var t=this,n={};if(e)for(var a in e)n[a]=e[a];return n.keyPrefix=Oe(e,t._defaultConfig),Be()?(t._dbInfo=n,n.serializer=ye,u.resolve()):u.reject()}function Le(e){var t=this,n=t.ready().then((function(){for(var e=t._dbInfo.keyPrefix,n=localStorage.length-1;n>=0;n--){var a=localStorage.key(n);0===a.indexOf(e)&&localStorage.removeItem(a)}}));return c(n,e),n}function Pe(e,t){var n=this;e=d(e);var a=n.ready().then((function(){var t=n._dbInfo,a=localStorage.getItem(t.keyPrefix+e);return a&&(a=t.serializer.deserialize(a)),a}));return c(a,t),a}function je(e,t){var n=this,a=n.ready().then((function(){for(var t=n._dbInfo,a=t.keyPrefix,i=a.length,s=localStorage.length,r=1,o=0;o=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}})):u.reject("Invalid arguments"),c(a,t),a}var Ke={_driver:"localStorageWrapper",_initStorage:Fe,_support:ze(),iterate:je,getItem:Pe,setItem:qe,removeItem:Ge,clear:Le,length:We,key:Ve,keys:Ue,dropInstance:He},$e=function(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)},Ze=function(e,t){for(var n=e.length,a=0;a{e.exports=n;var t=null;try{t=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,n){this.low=0|e,this.high=0|t,this.unsigned=!!n}function a(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=a;var i={},s={};function r(e,t){var n,a,r;return t?(r=0<=(e>>>=0)&&e<256)&&(a=s[e])?a:(n=l(e,(0|e)<0?-1:0,!0),r&&(s[e]=n),n):(r=-128<=(e|=0)&&e<128)&&(a=i[e])?a:(n=l(e,e<0?-1:0,!1),r&&(i[e]=n),n)}function o(e,t){if(isNaN(e))return t?y:g;if(t){if(e<0)return y;if(e>=p)return A}else{if(e<=-m)return x;if(e+1>=m)return w}return e<0?o(-e,t).neg():l(e%d|0,e/d|0,t)}function l(e,t,a){return new n(e,t,a)}n.fromInt=r,n.fromNumber=o,n.fromBits=l;var u=Math.pow;function c(e,t,n){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(n=t,t=!1):t=!!t,(n=n||10)<2||360)throw Error("interior hyphen");if(0===a)return c(e.substring(1),t,n).neg();for(var i=o(u(n,8)),s=g,r=0;r>>0:this.low},C.toNumber=function(){return this.unsigned?(this.high>>>0)*d+(this.low>>>0):this.high*d+(this.low>>>0)},C.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((s=l).isZero())return c+r;for(;c.length<6;)c="0"+c;r=""+c+r}},C.getHighBits=function(){return this.high},C.getHighBitsUnsigned=function(){return this.high>>>0},C.getLowBits=function(){return this.low},C.getLowBitsUnsigned=function(){return this.low>>>0},C.getNumBitsAbs=function(){if(this.isNegative())return this.eq(x)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&!(e&1<=0},C.isOdd=function(){return!(1&~this.low)},C.isEven=function(){return!(1&this.low)},C.equals=function(e){return a(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},C.eq=C.equals,C.notEquals=function(e){return!this.eq(e)},C.neq=C.notEquals,C.ne=C.notEquals,C.lessThan=function(e){return this.comp(e)<0},C.lt=C.lessThan,C.lessThanOrEqual=function(e){return this.comp(e)<=0},C.lte=C.lessThanOrEqual,C.le=C.lessThanOrEqual,C.greaterThan=function(e){return this.comp(e)>0},C.gt=C.greaterThan,C.greaterThanOrEqual=function(e){return this.comp(e)>=0},C.gte=C.greaterThanOrEqual,C.ge=C.greaterThanOrEqual,C.compare=function(e){if(a(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),n=e.isNegative();return t&&!n?-1:!t&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},C.comp=C.compare,C.negate=function(){return!this.unsigned&&this.eq(x)?x:this.not().add(b)},C.neg=C.negate,C.add=function(e){a(e)||(e=h(e));var t=this.high>>>16,n=65535&this.high,i=this.low>>>16,s=65535&this.low,r=e.high>>>16,o=65535&e.high,u=e.low>>>16,c=0,d=0,p=0,m=0;return p+=(m+=s+(65535&e.low))>>>16,d+=(p+=i+u)>>>16,c+=(d+=n+o)>>>16,c+=t+r,l((p&=65535)<<16|(m&=65535),(c&=65535)<<16|(d&=65535),this.unsigned)},C.subtract=function(e){return a(e)||(e=h(e)),this.add(e.neg())},C.sub=C.subtract,C.multiply=function(e){if(this.isZero())return g;if(a(e)||(e=h(e)),t)return l(t.mul(this.low,this.high,e.low,e.high),t.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(x))return e.isOdd()?x:g;if(e.eq(x))return this.isOdd()?x:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(f)&&e.lt(f))return o(this.toNumber()*e.toNumber(),this.unsigned);var n=this.high>>>16,i=65535&this.high,s=this.low>>>16,r=65535&this.low,u=e.high>>>16,c=65535&e.high,d=e.low>>>16,p=65535&e.low,m=0,y=0,b=0,v=0;return b+=(v+=r*p)>>>16,y+=(b+=s*p)>>>16,b&=65535,y+=(b+=r*d)>>>16,m+=(y+=i*p)>>>16,y&=65535,m+=(y+=s*d)>>>16,y&=65535,m+=(y+=r*c)>>>16,m+=n*p+i*d+s*c+r*u,l((b&=65535)<<16|(v&=65535),(m&=65535)<<16|(y&=65535),this.unsigned)},C.mul=C.multiply,C.divide=function(e){if(a(e)||(e=h(e)),e.isZero())throw Error("division by zero");var n,i,s;if(t)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?t.div_u:t.div_s)(this.low,this.high,e.low,e.high),t.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?y:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return y;if(e.gt(this.shru(1)))return v;s=y}else{if(this.eq(x))return e.eq(b)||e.eq(k)?x:e.eq(x)?b:(n=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?b:k:(i=this.sub(e.mul(n)),s=n.add(i.div(e)));if(e.eq(x))return this.unsigned?y:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();s=g}for(i=this;i.gte(e);){n=Math.max(1,Math.floor(i.toNumber()/e.toNumber()));for(var r=Math.ceil(Math.log(n)/Math.LN2),c=r<=48?1:u(2,r-48),d=o(n),p=d.mul(e);p.isNegative()||p.gt(i);)p=(d=o(n-=c,this.unsigned)).mul(e);d.isZero()&&(d=b),s=s.add(d),i=i.sub(p)}return s},C.div=C.divide,C.modulo=function(e){return a(e)||(e=h(e)),t?l((this.unsigned?t.rem_u:t.rem_s)(this.low,this.high,e.low,e.high),t.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},C.mod=C.modulo,C.rem=C.modulo,C.not=function(){return l(~this.low,~this.high,this.unsigned)},C.and=function(e){return a(e)||(e=h(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},C.or=function(e){return a(e)||(e=h(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},C.xor=function(e){return a(e)||(e=h(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},C.shiftLeft=function(e){return a(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},C.shr=C.shiftRight,C.shiftRightUnsigned=function(e){if(a(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},C.shru=C.shiftRightUnsigned,C.shr_u=C.shiftRightUnsigned,C.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},C.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},C.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},C.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},C.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,a){return a?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},9464:function(e,t){var n,a,i;a=[e],n=function(e){"use strict";function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var n=Object.assign||function(e){for(var t=1;tMath.abs(n[s][r])&&(r=o);for(var l=s;l=s;h--)n[h][c]-=n[h][s]*n[s][c]/n[s][s]}for(var d=a-1;d>=0;d--){for(var p=0,m=d+1;m=0;w--)k+=w>1?y[w]+"x^"+w+" + ":1===w?y[w]+"x + ":y[w];return{string:k,points:v,predict:b,equation:[].concat(a(y)).reverse(),r2:o(s(e,v),t.precision)}}};function u(){var e=function(e,a){return n({_round:o},e,t({},a,(function(e,t){return l[a](e,n({},i,t))})))};return Object.keys(l).reduce(e,{})}e.exports=u()},void 0===(i="function"==typeof n?n.apply(t,a):n)||(e.exports=i)},2183:(e,t,n)=>{var a=n(1812),i=n(6357),s=n(1119),r=n(147),o=n(6297),l=n(9181),u=n(7529);u.alea=a,u.xor128=i,u.xorwow=s,u.xorshift7=r,u.xor4096=o,u.tychei=l,e.exports=u},1812:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n=function(){var e=4022871197,t=function(t){t=String(t);for(var n=0;n>>0,e=(a*=e)>>>0,e+=4294967296*(a-=e)}return 2.3283064365386963e-10*(e>>>0)};return t}();t.next=function(){var e=2091639*t.s0+2.3283064365386963e-10*t.c;return t.s0=t.s1,t.s1=t.s2,t.s2=e-(t.c=0|e)},t.c=1,t.s0=n(" "),t.s1=n(" "),t.s2=n(" "),t.s0-=n(e),t.s0<0&&(t.s0+=1),t.s1-=n(e),t.s1<0&&(t.s1+=1),t.s2-=n(e),t.s2<0&&(t.s2+=1),n=null}function o(e,t){return t.c=e.c,t.s0=e.s0,t.s1=e.s1,t.s2=e.s2,t}function l(e,t){var n=new r(e),a=t&&t.state,i=n.next;return i.int32=function(){return 4294967296*n.next()|0},i.double=function(){return i()+11102230246251565e-32*(2097152*i()|0)},i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.alea=l}(0,e=n.nmd(e),n.amdD)},9181:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n="";t.next=function(){var e=t.b,n=t.c,a=t.d,i=t.a;return e=e<<25^e>>>7^n,n=n-a|0,a=a<<24^a>>>8^i,i=i-e|0,t.b=e=e<<20^e>>>12^n,t.c=n=n-a|0,t.d=a<<16^n>>>16^i,t.a=i-e|0},t.a=0,t.b=0,t.c=-1640531527,t.d=1367130551,e===Math.floor(e)?(t.a=e/4294967296|0,t.b=0|e):n+=e;for(var a=0;a>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.tychei=l}(0,e=n.nmd(e),n.amdD)},6357:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n="";t.x=0,t.y=0,t.z=0,t.w=0,t.next=function(){var e=t.x^t.x<<11;return t.x=t.y,t.y=t.z,t.z=t.w,t.w^=t.w>>>19^e^e>>>8},e===(0|e)?t.x=e:n+=e;for(var a=0;a>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xor128=l}(0,e=n.nmd(e),n.amdD)},6297:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this;t.next=function(){var e,n,a=t.w,i=t.X,s=t.i;return t.w=a=a+1640531527|0,n=i[s+34&127],e=i[s=s+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,n=i[s]=n^e,t.i=s,n+(a^a>>>16)|0},function(e,t){var n,a,i,s,r,o=[],l=128;for(t===(0|t)?(a=t,t=null):(t+="\0",a=0,l=Math.max(l,t.length)),i=0,s=-32;s>>15,a^=a<<4,a^=a>>>13,s>=0&&(r=r+1640531527|0,i=0==(n=o[127&s]^=a+r)?i+1:0);for(i>=128&&(o[127&(t&&t.length||0)]=-1),i=127,s=512;s>0;--s)a=o[i+34&127],n=o[i=i+1&127],a^=a<<13,n^=n<<17,a^=a>>>15,n^=n>>>12,o[i]=a^n;e.w=r,e.X=o,e.i=i}(t,e)}function o(e,t){return t.i=e.i,t.w=e.w,t.X=e.X.slice(),t}function l(e,t){null==e&&(e=+new Date);var n=new r(e),a=t&&t.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&(a.X&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xor4096=l}(0,e=n.nmd(e),n.amdD)},147:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this;t.next=function(){var e,n,a=t.x,i=t.i;return e=a[i],n=(e^=e>>>7)^e<<24,n^=(e=a[i+1&7])^e>>>10,n^=(e=a[i+3&7])^e>>>3,n^=(e=a[i+4&7])^e<<7,e=a[i+7&7],n^=(e^=e<<13)^e<<9,a[i]=n,t.i=i+1&7,n},function(e,t){var n,a=[];if(t===(0|t))a[0]=t;else for(t=""+t,n=0;n0;--n)e.next()}(t,e)}function o(e,t){return t.x=e.x.slice(),t.i=e.i,t}function l(e,t){null==e&&(e=+new Date);var n=new r(e),a=t&&t.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&(a.x&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xorshift7=l}(0,e=n.nmd(e),n.amdD)},1119:function(e,t,n){var a;!function(e,i,s){function r(e){var t=this,n="";t.next=function(){var e=t.x^t.x>>>2;return t.x=t.y,t.y=t.z,t.z=t.w,t.w=t.v,(t.d=t.d+362437|0)+(t.v=t.v^t.v<<4^e^e<<1)|0},t.x=0,t.y=0,t.z=0,t.w=0,t.v=0,e===(0|e)?t.x=e:n+=e;for(var a=0;a>>4),t.next()}function o(e,t){return t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w,t.v=e.v,t.d=e.d,t}function l(e,t){var n=new r(e),a=t&&t.state,i=function(){return(n.next()>>>0)/4294967296};return i.double=function(){do{var e=((n.next()>>>11)+(n.next()>>>0)/4294967296)/(1<<21)}while(0===e);return e},i.int32=n.next,i.quick=i,a&&("object"==typeof a&&o(a,n),i.state=function(){return o(n,{})}),i}i&&i.exports?i.exports=l:n.amdD&&n.amdO?void 0===(a=function(){return l}.call(t,n,t,i))||(i.exports=a):this.xorwow=l}(0,e=n.nmd(e),n.amdD)},7529:function(e,t,n){var a;!function(i,s,r){var o,l=256,u=r.pow(l,6),c=r.pow(2,52),h=2*c,d=l-1;function p(e,t,n){var a=[],d=y(g((t=1==t?{entropy:!0}:t||{}).entropy?[e,b(s)]:null==e?function(){try{var e;return o&&(e=o.randomBytes)?e=e(l):(e=new Uint8Array(l),(i.crypto||i.msCrypto).getRandomValues(e)),b(e)}catch(e){var t=i.navigator,n=t&&t.plugins;return[+new Date,i,n,i.screen,b(s)]}}():e,3),a),p=new m(a),v=function(){for(var e=p.g(6),t=u,n=0;e=h;)e/=2,t/=2,n>>>=1;return(e+n)/t};return v.int32=function(){return 0|p.g(4)},v.quick=function(){return p.g(4)/4294967296},v.double=v,y(b(p.S),s),(t.pass||n||function(e,t,n,a){return a&&(a.S&&f(a,p),e.state=function(){return f(p,{})}),n?(r.random=e,t):e})(v,d,"global"in t?t.global:this==r,t.state)}function m(e){var t,n=e.length,a=this,i=0,s=a.i=a.j=0,r=a.S=[];for(n||(e=[n++]);i{},9830:()=>{},3818:()=>{},6308:()=>{},7695:()=>{},170:()=>{}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var n=__webpack_module_cache__[e]={id:e,loaded:!1,exports:{}};return __webpack_modules__[e].call(n.exports,n,n.exports,__webpack_require__),n.loaded=!0,n.exports}__webpack_require__.amdD=function(){throw new Error("define cannot be used indirect")},__webpack_require__.amdO={},__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var n in t)__webpack_require__.o(t,n)&&!__webpack_require__.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),__webpack_require__.nc=void 0;var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>fX});var e={};__webpack_require__.r(e),__webpack_require__.d(e,{CompositeArrayBuffer:()=>uh,browserFiles:()=>ap,browserHTTPRequest:()=>dp,concatenateArrayBuffers:()=>Th,copyModel:()=>pd,decodeWeights:()=>vh,decodeWeightsStream:()=>Ch,encodeWeights:()=>bh,fromMemory:()=>gp,fromMemorySync:()=>yp,getLoadHandlers:()=>Ph,getModelArtifactsForJSON:()=>Dh,getModelArtifactsForJSONSync:()=>Rh,getModelArtifactsInfoForJSON:()=>zh,getSaveHandlers:()=>Lh,getWeightSpecs:()=>Oh,http:()=>hp,isHTTPScheme:()=>up,listModels:()=>hd,loadWeights:()=>rp,moveModel:()=>md,registerLoadRouter:()=>Fh,registerSaveRouter:()=>Bh,removeModel:()=>dd,weightsLoaderFactory:()=>op,withSaveHandler:()=>bp,withSaveHandlerSync:()=>vp});var t={};__webpack_require__.r(t),__webpack_require__.d(t,{assertParamsValid:()=>Ip,computeFlatOffset:()=>Up,computeOutShape:()=>Rp,getNormalizedAxes:()=>Mp,isSliceContinous:()=>Vp,maskToAxes:()=>Np,parseSliceParams:()=>Wp,sliceInfo:()=>Gp,startForAxis:()=>Pp,startIndicesWithElidedDims:()=>Bp,stopForAxis:()=>jp,stopIndicesWithElidedDims:()=>Fp,stridesForAxis:()=>Lp,stridesWithElidedDims:()=>Dp});var n={};__webpack_require__.r(n),__webpack_require__.d(n,{conv2d:()=>ib,depthwiseConv2d:()=>ob,matMul:()=>lb});var a={};__webpack_require__.r(a),__webpack_require__.d(a,{collectGatherOpShapeInfo:()=>pk,computeOutShape:()=>dk,segOpComputeOptimalWindowSize:()=>hk});var i={};__webpack_require__.r(i),__webpack_require__.d(i,{ERF_A1:()=>Iv,ERF_A2:()=>Nv,ERF_A3:()=>Rv,ERF_A4:()=>Dv,ERF_A5:()=>zv,ERF_P:()=>Tv,PARALLELIZE_THRESHOLD:()=>yv,RowPartitionType:()=>hv,SELU_SCALE:()=>_v,SELU_SCALEALPHA:()=>Ev,applyActivation:()=>nb,assertAndGetBroadcastShape:()=>Kd,assertAxesAreInnerMostDims:()=>bf,assertParamsConsistent:()=>uv,assignToTypedArray:()=>Pv,axesAreInnerMostDims:()=>mf,calculateShapes:()=>Dy,checkEinsumDimSizes:()=>$v,checkPadOnDimRoundingMode:()=>bm,combineLocations:()=>ff,combineRaggedTensorToTensorShapes:()=>pv,complexWithEvenIndex:()=>Bv,complexWithOddIndex:()=>Fv,computeConv2DInfo:()=>om,computeConv3DInfo:()=>lm,computeDefaultPad:()=>um,computeDilation2DInfo:()=>im,computeOptimalWindowSize:()=>bv,computeOutAndReduceShapes:()=>gf,computeOutShape:()=>cv,computePool2DInfo:()=>sm,computePool3DInfo:()=>rm,convertConv2DDataFormat:()=>ym,decodeEinsumEquation:()=>Hv,eitherStridesOrDilationsAreOne:()=>fm,expandShapeToKeepDim:()=>yf,exponent:()=>Vv,exponents:()=>jv,fromStringArrayToUint8:()=>fk,fromUint8ToStringArray:()=>mk,getAxesPermutation:()=>vf,getBroadcastDims:()=>qd,getComplexWithIndex:()=>Lv,getEinsumComputePath:()=>Zv,getEinsumPermutation:()=>Kv,getFusedBiasGradient:()=>tb,getFusedDyActivation:()=>eb,getImageCenter:()=>vv,getInnerMostAxes:()=>wf,getPermuted:()=>wv,getRaggedRank:()=>fv,getReductionAxes:()=>Hd,getReshaped:()=>kv,getReshapedPermuted:()=>Av,getRowPartitionTypesHelper:()=>mv,getSliceBeginCoords:()=>xv,getSliceSize:()=>Cv,getSparseFillEmptyRowsIndicesDenseShapeMismatch:()=>Jv,getSparseFillEmptyRowsNegativeIndexErrorMessage:()=>ek,getSparseFillEmptyRowsOutOfRangeIndexErrorMessage:()=>tk,getSparseReshapeEmptyTensorZeroOutputDimErrorMessage:()=>ik,getSparseReshapeInputOutputMismatchErrorMessage:()=>rk,getSparseReshapeInputOutputMultipleErrorMessage:()=>sk,getSparseReshapeMultipleNegativeOneOutputDimErrorMessage:()=>nk,getSparseReshapeNegativeOutputDimErrorMessage:()=>ak,getSparseSegmentReductionIndicesOutOfRangeErrorMessage:()=>ck,getSparseSegmentReductionNegativeSegmentIdsErrorMessage:()=>ok,getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage:()=>lk,getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage:()=>uk,getUndoAxesPermutation:()=>kf,isIdentityPermutation:()=>Xv,log:()=>Tu,mergeRealAndImagArrays:()=>Ov,prepareAndValidate:()=>Sv,prepareSplitSize:()=>Qv,segment_util:()=>a,shouldFuse:()=>ab,slice_util:()=>t,splitRealAndImagArrays:()=>Mv,stridesOrDilationsArePositive:()=>gm,tupleValuesAreOne:()=>mm,upcastType:()=>Oc,validateDefaultValueShape:()=>gv,validateInput:()=>Ry,validateUpdateShape:()=>Ny,warn:()=>_u});var s={};__webpack_require__.r(s),__webpack_require__.d(s,{json:()=>M_});var r={};__webpack_require__.r(r),__webpack_require__.d(r,{json:()=>B_});var o={};__webpack_require__.r(o),__webpack_require__.d(o,{json:()=>F_});var l={};__webpack_require__.r(l),__webpack_require__.d(l,{json:()=>L_});var u={};__webpack_require__.r(u),__webpack_require__.d(u,{json:()=>P_});var c={};__webpack_require__.r(c),__webpack_require__.d(c,{json:()=>j_});var h={};__webpack_require__.r(h),__webpack_require__.d(h,{json:()=>V_});var d={};__webpack_require__.r(d),__webpack_require__.d(d,{json:()=>U_});var p={};__webpack_require__.r(p),__webpack_require__.d(p,{json:()=>W_});var m={};__webpack_require__.r(m),__webpack_require__.d(m,{json:()=>G_});var f={};__webpack_require__.r(f),__webpack_require__.d(f,{json:()=>q_});var g={};__webpack_require__.r(g),__webpack_require__.d(g,{json:()=>H_});var y={};__webpack_require__.r(y),__webpack_require__.d(y,{json:()=>K_});var b={};__webpack_require__.r(b),__webpack_require__.d(b,{json:()=>$_});var v={};__webpack_require__.r(v),__webpack_require__.d(v,{json:()=>Z_});var k={};__webpack_require__.r(k),__webpack_require__.d(k,{json:()=>X_});var w={};__webpack_require__.r(w),__webpack_require__.d(w,{json:()=>Y_});var A={};__webpack_require__.r(A),__webpack_require__.d(A,{json:()=>Q_});var x={};__webpack_require__.r(x),__webpack_require__.d(x,{json:()=>J_});var C={};__webpack_require__.r(C),__webpack_require__.d(C,{OP_SCOPE_SUFFIX:()=>ah,abs:()=>Gd,acos:()=>Hp,acosh:()=>Kp,add:()=>xd,addN:()=>$p,all:()=>Zp,any:()=>Xp,argMax:()=>Yp,argMin:()=>Qp,asin:()=>Jp,asinh:()=>em,atan:()=>tm,atan2:()=>nm,atanh:()=>am,avgPool:()=>km,avgPool3d:()=>wm,basicLSTMCell:()=>_m,batchNorm:()=>Im,batchNorm2d:()=>Nm,batchNorm3d:()=>Rm,batchNorm4d:()=>Dm,batchToSpaceND:()=>Tm,bincount:()=>zm,bitwiseAnd:()=>Om,booleanMaskAsync:()=>Wy,broadcastArgs:()=>Mm,broadcastTo:()=>Bm,buffer:()=>vd,cast:()=>kd,ceil:()=>Fm,clipByValue:()=>Lm,clone:()=>wd,complex:()=>sh,concat:()=>Am,concat1d:()=>Pm,concat2d:()=>jm,concat3d:()=>Vm,concat4d:()=>Um,conv1d:()=>Gm,conv2d:()=>Wm,conv2dTranspose:()=>Hm,conv3d:()=>Km,conv3dTranspose:()=>Zm,cos:()=>Xm,cosh:()=>Ym,cosineWindow:()=>Yy,cumprod:()=>Qm,cumsum:()=>Jm,denseBincount:()=>ef,depthToSpace:()=>tf,depthwiseConv2d:()=>nf,diag:()=>af,dilation2d:()=>sf,div:()=>Sd,divNoNan:()=>lf,dot:()=>uf,dropout:()=>Zy,einsum:()=>cf,elu:()=>hf,enclosingPowerOfTwo:()=>Xy,ensureShape:()=>df,equal:()=>rf,erf:()=>pf,euclideanNorm:()=>_f,exp:()=>Tf,expandDims:()=>If,expm1:()=>Nf,eye:()=>Df,fft:()=>my,fill:()=>Pd,floor:()=>zf,floorDiv:()=>Cd,fused:()=>n,gather:()=>Of,gatherND:()=>$y,greater:()=>Mf,greaterEqual:()=>Bf,ifft:()=>fy,imag:()=>Ff,image:()=>tv,inTopKAsync:()=>Qy,irfft:()=>gy,isFinite:()=>Lf,isInf:()=>Pf,isNaN:()=>jf,leakyRelu:()=>Vf,less:()=>Uf,lessEqual:()=>Wf,linalg:()=>nv,linspace:()=>Gf,localResponseNormalization:()=>qf,log:()=>Hf,log1p:()=>Kf,logSigmoid:()=>Xf,logSoftmax:()=>Yf,logSumExp:()=>Qf,logicalAnd:()=>Jf,logicalNot:()=>eg,logicalOr:()=>tg,logicalXor:()=>ng,losses:()=>av,lowerBound:()=>sg,matMul:()=>xm,max:()=>Af,maxPool:()=>rg,maxPool3d:()=>og,maxPoolWithArgmax:()=>lg,maximum:()=>$d,mean:()=>ug,meshgrid:()=>dg,min:()=>xf,minimum:()=>pg,mirrorPad:()=>mg,mod:()=>fg,moments:()=>gg,movingAverage:()=>qy,mul:()=>Ed,multiRNNCell:()=>yg,multinomial:()=>bg,neg:()=>$f,norm:()=>Ef,notEqual:()=>vg,oneHot:()=>kg,ones:()=>hg,onesLike:()=>wg,op:()=>ih,outerProduct:()=>Ag,pad:()=>xg,pad1d:()=>Cg,pad2d:()=>Sg,pad3d:()=>Eg,pad4d:()=>_g,pool:()=>Ig,pow:()=>Vd,prelu:()=>Ng,print:()=>Ad,prod:()=>Rg,raggedGather:()=>Dg,raggedRange:()=>zg,raggedTensorToTensor:()=>Og,rand:()=>Mg,randomGamma:()=>jg,randomNormal:()=>Vg,randomStandardNormal:()=>Ug,randomUniform:()=>Wg,randomUniformInt:()=>Gg,range:()=>qg,real:()=>Hg,reciprocal:()=>Kg,relu:()=>$g,relu6:()=>Zg,reshape:()=>vm,reverse:()=>Xg,reverse1d:()=>Yg,reverse2d:()=>Qg,reverse3d:()=>Jg,reverse4d:()=>ey,rfft:()=>by,round:()=>ty,rsqrt:()=>ny,scalar:()=>Rd,scatterND:()=>Hy,searchSorted:()=>ig,selu:()=>ay,separableConv2d:()=>iy,setdiff1dAsync:()=>sy,sigmoid:()=>Cm,sign:()=>ry,signal:()=>ev,sin:()=>oy,sinh:()=>ly,slice:()=>Sm,slice1d:()=>uy,slice2d:()=>cy,slice3d:()=>hy,slice4d:()=>dy,softmax:()=>py,softplus:()=>Zf,spaceToBatchND:()=>Tg,sparse:()=>iv,sparseToDense:()=>Ky,spectral:()=>Jb,split:()=>yy,sqrt:()=>_d,square:()=>Td,squaredDifference:()=>vy,squeeze:()=>ky,stack:()=>wy,step:()=>Ay,stridedSlice:()=>xy,string:()=>sv,sub:()=>Ud,sum:()=>Cf,tan:()=>Cy,tanh:()=>Em,tensor:()=>oh,tensor1d:()=>Sy,tensor2d:()=>Ey,tensor3d:()=>kp,tensor4d:()=>_y,tensor5d:()=>Ty,tensor6d:()=>Iy,tensorScatterUpdate:()=>zy,tile:()=>Rf,topk:()=>Oy,transpose:()=>Gy,truncatedNormal:()=>My,unique:()=>By,unsortedSegmentSum:()=>Fy,unstack:()=>Ly,upperBound:()=>Py,variable:()=>jy,where:()=>of,whereAsync:()=>Uy,zeros:()=>cg,zerosLike:()=>Id});var S={};__webpack_require__.r(S),__webpack_require__.d(S,{mx:()=>eN,XI:()=>HN,Nk:()=>KN,f6:()=>ZN,ct:()=>ZI,YG:()=>JN,hH:()=>sR,z3:()=>WR,sG:()=>eD,uM:()=>sD,vS:()=>AD,qB:()=>ND,GG:()=>DD,lg:()=>FD,rq:()=>OD,cu:()=>XD,WR:()=>KD,GE:()=>JD,px:()=>tz,jC:()=>gz,He:()=>vz,hE:()=>Iz,BF:()=>MR,Dk:()=>Pz,cl:()=>Kz,_B:()=>rO,ub:()=>hO,_f:()=>mO,Ku:()=>kO,qy:()=>AO,Zy:()=>OO,bu:()=>FO,zv:()=>jI,dH:()=>uN,HS:()=>UN,yH:()=>aM,l3:()=>sM,z9:()=>oM,x6:()=>dM,_m:()=>vM,eW:()=>CM,GK:()=>_M,SP:()=>NM,yr:()=>DM,dl:()=>hD,Dw:()=>FM,xT:()=>jM,_X:()=>gN,wz:()=>qM});var E=__webpack_require__(7786),_=__webpack_require__(9043);E.A.prototype._CONST=Object.freeze({N:{VIDEO_W:{DESKTOP:208,MOBILE:144},VIDEO_MARGIN:"10px",VIDEO_MARGIN_BOTTOM:"40px",GAZE_CALIBRATION:{R:40,MARGIN:32,BORDER:8,CENTER_EXTRA_CHECK_OFFSET:2,MID_EXTRA_CHECK_OFFSET:6},PPI_DONT_USE:127.7,PD_DONT_USE:6.4,VIEW_DIST_DONT_USE:40},S:{AUTO:"AUTO",CLICK_TYPE:{MOUSE:"mouse",TOUCH:"touch"}},COLOR:{LIGHT_GREY:"#cccccc",ORANGE:"#ff9a00",DARK_RED:"#ac0d0d",RED:"#ee0000"},LTR:"LTR",RTL:"RTL",VIEW_METHOD:{B:"BlindSpot",F:"FaceMesh"},IN_TO_CM:2.54,UNITS:{CM:"cm",IN_D:"inDecimal",IN_F:"inFractional"}}),E.A.prototype._debuggerDefault=Object.freeze({date:new Date("July 20, 69 20:17:40 GMT+00:00"),timestamp:performance.now(),screenSize:{value:{screenWidthCm:28.6,screenHeightCm:17.9,screenPhysicalPpi:250,screenPpi:125,screenDiagonalCm:33.8,screenDiagonalIn:13.3}},measureDistance:{value:40,method:"BlindSpot"},trackDistance:{value:{viewingDistanceCm:40,PDCm:6.4,nearPointCm:{x:0,y:0},latencyMs:50},method:"FaceMesh"},trackGaze:{value:{x:screen.width/2,y:screen.height/2,latencyMs:50}},performance:{value:{computeArrayFillMHz:(0,_.Nh)(.5,3),computeRandomMHz:(0,_.Nh)(5,3),idealFps:60,stressFps:60}}});var T=__webpack_require__(115),I=__webpack_require__.n(T),N=__webpack_require__(3389),R=__webpack_require__.n(N),D=__webpack_require__(402),z=__webpack_require__.n(D),O=__webpack_require__(880),M=__webpack_require__.n(O),B=__webpack_require__(3282),F=__webpack_require__.n(B);const L=(e,t)=>{e.style.top=`${Math.round(t.querySelector(".calibration-instruction").getBoundingClientRect().bottom)+25}px`},P=e=>{const t=e.value/e.max;e.style.background=`linear-gradient(90deg, #ffc772, #ffc772 ${100*t}%, #fff ${100*t}%)`};var j=__webpack_require__(9853),V=__webpack_require__(359),U=__webpack_require__(9199);const W=(e,t,n=null,a=!0,i=["return"])=>{if(!t)return()=>{};const s=((e,t)=>e?(e.event_handlers.current.push(t),()=>{e.event_handlers.current=e.event_handlers.current.filter((e=>e!==t))}):()=>{})(t,(r=>{i.includes(r.name)&&(t.all_keys.current=[],e&&e.click(),n&&n(),a&&s())}));return s};E.A.prototype._displaySize=function(e=!1){if(!e&&!this.checkInitialized())return;const t={value:{displayWidthPx:screen.width,displayHeightPx:screen.height,windowWidthPx:window.innerWidth,windowHeightPx:window.innerHeight},timestamp:performance.now()};this.displayData.length&&I()(t.value,this.displayData[this.displayData.length-1].value)||(this.newDisplayData=t)};const G={card:R(),arrow:z(),usba:M(),usbc:F()},q={card:3.375,usba:.787402,usbc:.787402};E.A.prototype.screenSize=function(e={},t=void 0){if(!this.checkInitialized())return;(0,_.$k)();const n=Object.assign({fullscreen:!1,repeatTesting:1,decimalPlace:1,defaultObject:"card",headline:`🖥️ ${U.H.RC_screenSizeTitle[this.L]}`,description:U.H.RC_screenSizeIntro[this.L],check:!1,checkCallback:null},e);this.getFullscreen(n.fullscreen),["usba","usbc","card"].includes(n.defaultObject)||(n.defaultObject="card"),n.description+=`

        ${U.H.RC_screenSizeHave[this.L].replace("xxx",``)}`,this._addBackground(),this._addBackgroundText(n.headline,n.description),this._addCreditOnBackground(U.H.RC_screenSizeCredit[this.L]),function(e,t,n,a){const i=((e,t,n)=>{const a=document.createElement("input");return a.id="rc-size-slider",a.className="rc-slider",a.type="range",a.min=t,a.max=n,a.value=Math.max(Math.min(Math.round(100*Math.random()),80),20),a.step=.1,L(a,e),P(a),e.appendChild(a),a})(t,0,100),s=(t,n)=>{if("rc-slider"===t.target.className&&"rc-size-slider"===t.target.id&&(n===e._CONST.S.CLICK_TYPE.MOUSE&&1===t.which||n===e._CONST.S.CLICK_TYPE.TOUCH)){t.target.style.cursor="grabbing",c.setAttribute("fill",e._CONST.COLOR.ORANGE);const a=()=>{i.style.cursor="grab",c.setAttribute("fill",e._CONST.COLOR.LIGHT_GREY),document.removeEventListener("mouseup",a,!1)};n===e._CONST.S.CLICK_TYPE.MOUSE?document.addEventListener("mouseup",a,!1):n===e._CONST.S.CLICK_TYPE.TOUCH&&document.addEventListener("touchend",a,!1)}},r=e=>{s(e,"mouse")},o=e=>{s(e,"touch")};document.addEventListener("mousedown",r,!1),document.addEventListener("touchstart",o,!1);const l=$(["card","arrow","usba","usbc"],t);let u=n.defaultObject;document.getElementById("matching-obj").addEventListener("change",(e=>{Z(e.target.value,l,d),u=e.target.value})),Z("card",l);const c=document.getElementById("size-arrow-fill");c.setAttribute("fill",e._CONST.COLOR.LIGHT_GREY);const h={width:l.arrow.getBoundingClientRect().width,height:l.arrow.getBoundingClientRect().height},d=()=>{H(e,i,l.card,l.arrow,h),K(i,l.usba),K(i,l.usbc)};d();const p=()=>{P(i),d()},m=new ResizeObserver((()=>{d(),L(i,t),Y(l,i)}));m.observe(t);const f=W(null,e.keypadHandler,(()=>{y()}),!1,["return","space"]),g=()=>{document.removeEventListener("mousedown",r,!1),document.removeEventListener("touchstart",o,!1),document.removeEventListener("input",p,!1),m.unobserve(t),e._removeBackground(),f(),(0,j.l)(b)},y=()=>{const t=(l[u].getBoundingClientRect().width||Number.parseInt(l[u].style.width))/q[u],i=n.decimalPlace,s=X(t,i);e.newScreenData=s,g(),n.check?e._checkScreenSize(a,s,n.checkCallback):(0,_.nB)(a,s)};i.addEventListener("input",p,!1);const b=(0,j.m)({Escape:g,Enter:y," ":y});(0,V.F)(e.L,e.background,{go:y,cancel:g},e.params.showCancelButton),Z(u,l,d)}(this,this.background,n,t)};const H=(e,t,n,a,i)=>{const s=(t.offsetWidth-30)*(t.value/100)*(window.innerWidth<480?2:1)+15;n.style.width=`${s}px`;const r=n.getBoundingClientRect();0!==r.width&&(a.style.left=`${r.left+s}px`,a.style.top=`${r.top+e.background.scrollTop+(.63*s-i.height)/2}px`)},K=(e,t)=>{t.style.width=`${(0,_.Ew)(e.value**1.5,0,1e3,50,400)}px`},$=(e,t)=>{const n=document.getElementsByClassName("size-obj");for(;n.length;)n[0].parentNode.removeChild(n[0]);const a={};for(const n of e){let e=document.createElement("div");t.appendChild(e),e.outerHTML=G[n],e=document.getElementById(`size-${n}`),e.setAttribute("preserveAspectRatio","none"),e.style.visibility="hidden",a[n]=e}return Y(a,document.querySelector("#rc-size-slider")),a},Z=(e,t,n)=>{for(const n in t)t[n].style.visibility=n===e?"visible":"hidden";t.arrow.style.visibility="hidden",(0,_.nB)(n)},X=(e,t)=>{const n={value:{screenWidthCm:(0,_.Nh)(2.54*window.screen.width/e,t),screenHeightCm:(0,_.Nh)(2.54*window.screen.height/e,t),screenPhysicalPpi:(0,_.Nh)(e*window.devicePixelRatio,t),screenPpi:(0,_.Nh)(e,t)},timestamp:performance.now()};return n.value.screenDiagonalCm=(0,_.Nh)(Math.hypot(n.value.screenWidthCm,n.value.screenHeightCm),t),n.value.screenDiagonalIn=(0,_.Nh)(n.value.screenDiagonalCm/2.54,t),n},Y=(e,t)=>{for(const n in e)e[n].style.top=`${t.getBoundingClientRect().top+50}px`};function Q(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function J(e,t){return e.get(Q(e,t))}function ee(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const te={},ne=e=>new Promise((t=>{if(!e)return t();const n=window.scrollX,a=window.scrollY;te.restoreFocusTimeout=setTimeout((()=>{te.previousActiveElement instanceof HTMLElement?(te.previousActiveElement.focus(),te.previousActiveElement=null):document.body&&document.body.focus(),t()}),100),window.scrollTo(n,a)})),ae="swal2-",ie=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","default-outline","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error"].reduce(((e,t)=>(e[t]=ae+t,e)),{}),se=["success","warning","info","question","error"].reduce(((e,t)=>(e[t]=ae+t,e)),{}),re=e=>e.charAt(0).toUpperCase()+e.slice(1),oe=e=>{},le=[],ue=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,le.includes(n)||(le.push(n),oe(n))},ce=e=>"function"==typeof e?e():e,he=e=>e&&"function"==typeof e.toPromise,de=e=>he(e)?e.toPromise():Promise.resolve(e),pe=e=>e&&Promise.resolve(e)===e,me=()=>document.body.querySelector(`.${ie.container}`),fe=e=>{const t=me();return t?t.querySelector(e):null},ge=e=>fe(`.${e}`),ye=()=>ge(ie.popup),be=()=>ge(ie.icon),ve=()=>ge(ie.title),ke=()=>ge(ie["html-container"]),we=()=>ge(ie.image),Ae=()=>ge(ie["progress-steps"]),xe=()=>ge(ie["validation-message"]),Ce=()=>fe(`.${ie.actions} .${ie.confirm}`),Se=()=>fe(`.${ie.actions} .${ie.cancel}`),Ee=()=>fe(`.${ie.actions} .${ie.deny}`),_e=()=>fe(`.${ie.loader}`),Te=()=>ge(ie.actions),Ie=()=>ge(ie.footer),Ne=()=>ge(ie["timer-progress-bar"]),Re=()=>ge(ie.close),De=()=>{const e=ye();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort(((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),a=parseInt(t.getAttribute("tabindex")||"0");return n>a?1:n"-1"!==e.getAttribute("tabindex")));return[...new Set(n.concat(i))].filter((e=>Xe(e)))},ze=()=>Be(document.body,ie.shown)&&!Be(document.body,ie["toast-shown"])&&!Be(document.body,ie["no-backdrop"]),Oe=()=>{const e=ye();return!!e&&Be(e,ie.toast)},Me=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),a=n.querySelector("head");a&&Array.from(a.childNodes).forEach((t=>{e.appendChild(t)}));const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach((t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)}))}},Be=(e,t)=>{if(!t)return!1;const n=t.split(/\s+/);for(let t=0;t{if(((e,t)=>{Array.from(e.classList).forEach((n=>{Object.values(ie).includes(n)||Object.values(se).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)}))})(e,t),!t.customClass)return;const a=t.customClass[n];a&&("string"==typeof a||a.forEach?Ve(e,a):oe(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof a}"`))},Le=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${ie.popup} > .${ie[t]}`);case"checkbox":return e.querySelector(`.${ie.popup} > .${ie.checkbox} input`);case"radio":return e.querySelector(`.${ie.popup} > .${ie.radio} input:checked`)||e.querySelector(`.${ie.popup} > .${ie.radio} input:first-child`);case"range":return e.querySelector(`.${ie.popup} > .${ie.range} input`);default:return e.querySelector(`.${ie.popup} > .${ie.input}`)}},Pe=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},je=(e,t,n)=>{e&&t&&("string"==typeof t&&(t=t.split(/\s+/).filter(Boolean)),t.forEach((t=>{Array.isArray(e)?e.forEach((e=>{n?e.classList.add(t):e.classList.remove(t)})):n?e.classList.add(t):e.classList.remove(t)})))},Ve=(e,t)=>{je(e,t,!0)},Ue=(e,t)=>{je(e,t,!1)},We=(e,t)=>{const n=Array.from(e.children);for(let e=0;e{n===`${parseInt(n)}`&&(n=parseInt(n)),n||0===parseInt(n)?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},qe=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"flex";e&&(e.style.display=t)},He=e=>{e&&(e.style.display="none")},Ke=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"block";e&&new MutationObserver((()=>{Ze(e,e.innerHTML,t)})).observe(e,{childList:!0,subtree:!0})},$e=(e,t,n,a)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,a)},Ze=function(e,t){t?qe(e,arguments.length>2&&void 0!==arguments[2]?arguments[2]:"flex"):He(e)},Xe=e=>!(!e||!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),Ye=e=>!!(e.scrollHeight>e.clientHeight),Qe=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),a=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||a>0},Je=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=Ne();n&&Xe(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout((()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"}),10))},et=`\n
        \n \n
          \n
          \n \n

          \n
          \n \n \n
          \n \n \n
          \n \n
          \n \n \n
          \n
          \n
          \n \n \n \n
          \n
          \n
          \n
          \n
          \n
          \n`.replace(/(^|\n)\s*/g,""),tt=()=>{te.currentInstance.resetValidationMessage()},nt=e=>{const t=(()=>{const e=me();return!!e&&(e.remove(),Ue([document.documentElement,document.body],[ie["no-backdrop"],ie["toast-shown"],ie["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return;const n=document.createElement("div");n.className=ie.container,t&&Ve(n,ie["no-transition"]),Me(n,et);const a="string"==typeof(i=e.target)?document.querySelector(i):i;var i;a.appendChild(n),(e=>{const t=ye();t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true")})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&Ve(me(),ie.rtl)})(a),(()=>{const e=ye(),t=We(e,ie.input),n=We(e,ie.file),a=e.querySelector(`.${ie.range} input`),i=e.querySelector(`.${ie.range} output`),s=We(e,ie.select),r=e.querySelector(`.${ie.checkbox} input`),o=We(e,ie.textarea);t.oninput=tt,n.onchange=tt,s.onchange=tt,r.onchange=tt,o.oninput=tt,a.oninput=()=>{tt(),i.value=a.value},a.onchange=()=>{tt(),i.value=a.value}})()},at=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?it(e,t):e&&Me(t,e)},it=(e,t)=>{e.jquery?st(t,e):Me(t,e.toString())},st=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},rt=(e,t)=>{const n=Te(),a=_e();n&&a&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?qe(n):He(n),Fe(n,t,"actions"),function(e,t,n){const a=Ce(),i=Ee(),s=Se();if(!a||!i||!s)return;ot(a,"confirm",n),ot(i,"deny",n),ot(s,"cancel",n),function(e,t,n,a){if(!a.buttonsStyling)return void Ue([e,t,n],ie.styled);Ve([e,t,n],ie.styled),a.confirmButtonColor&&(e.style.backgroundColor=a.confirmButtonColor,Ve(e,ie["default-outline"]));a.denyButtonColor&&(t.style.backgroundColor=a.denyButtonColor,Ve(t,ie["default-outline"]));a.cancelButtonColor&&(n.style.backgroundColor=a.cancelButtonColor,Ve(n,ie["default-outline"]))}(a,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,a),e.insertBefore(i,a)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(a,t)))}(n,a,t),Me(a,t.loaderHtml||""),Fe(a,t,"loader"))};function ot(e,t,n){const a=re(t);Ze(e,n[`show${a}Button`],"inline-block"),Me(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=ie[t],Fe(e,n,`${t}Button`)}const lt=(e,t)=>{const n=me();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||Ve([document.documentElement,document.body],ie["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in ie?Ve(e,ie[t]):(oe('The "position" parameter is not valid, defaulting to "center"'),Ve(e,ie.center))}(n,t.position),function(e,t){if(!t)return;Ve(e,ie[`grow-${t}`])}(n,t.grow),Fe(n,t,"container"))};var ut={innerParams:new WeakMap,domCache:new WeakMap};const ct=["input","file","range","select","radio","checkbox","textarea"],ht=e=>{if(!e.input)return;if(!bt[e.input])return Object.keys(bt).join(" | "),void e.input;const t=gt(e.input);if(!t)return;const n=bt[e.input](t,e);qe(t),e.inputAutoFocus&&setTimeout((()=>{Pe(n)}))},dt=(e,t)=>{const n=ye();if(!n)return;const a=Le(n,e);if(a){(e=>{for(let t=0;t{if(!e.input)return;const t=gt(e.input);t&&Fe(t,e,"input")},mt=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},ft=(e,t,n)=>{if(n.inputLabel){const a=document.createElement("label"),i=ie["input-label"];a.setAttribute("for",e.id),a.className=i,"object"==typeof n.customClass&&Ve(a,n.customClass.inputLabel),a.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",a)}},gt=e=>{const t=ye();if(t)return We(t,ie[e]||ie.input)},yt=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:pe(t)||oe(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},bt={};bt.text=bt.email=bt.password=bt.number=bt.tel=bt.url=bt.search=bt.date=bt["datetime-local"]=bt.time=bt.week=bt.month=(e,t)=>(yt(e,t.inputValue),ft(e,e,t),mt(e,t),e.type=t.input,e),bt.file=(e,t)=>(ft(e,e,t),mt(e,t),e),bt.range=(e,t)=>{const n=e.querySelector("input"),a=e.querySelector("output");return yt(n,t.inputValue),n.type=t.input,yt(a,t.inputValue),ft(n,e,t),e},bt.select=(e,t)=>{if(e.textContent="",t.inputPlaceholder){const n=document.createElement("option");Me(n,t.inputPlaceholder),n.value="",n.disabled=!0,n.selected=!0,e.appendChild(n)}return ft(e,e,t),e},bt.radio=e=>(e.textContent="",e),bt.checkbox=(e,t)=>{const n=Le(ye(),"checkbox");n.value="1",n.checked=Boolean(t.inputValue);const a=e.querySelector("span");return Me(a,t.inputPlaceholder||t.inputLabel),n},bt.textarea=(e,t)=>{yt(e,t.inputValue),mt(e,t),ft(e,e,t);return setTimeout((()=>{if("MutationObserver"in window){const n=parseInt(window.getComputedStyle(ye()).width);new MutationObserver((()=>{if(!document.body.contains(e))return;const a=e.offsetWidth+(i=e,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;a>n?ye().style.width=`${a}px`:Ge(ye(),"width",t.width)})).observe(e,{attributes:!0,attributeFilter:["style"]})}})),e};const vt=(e,t)=>{const n=ke();n&&(Ke(n),Fe(n,t,"htmlContainer"),t.html?(at(t.html,n),qe(n,"block")):t.text?(n.textContent=t.text,qe(n,"block")):He(n),((e,t)=>{const n=ye();if(!n)return;const a=ut.innerParams.get(e),i=!a||t.input!==a.input;ct.forEach((e=>{const a=We(n,ie[e]);a&&(dt(e,t.inputAttributes),a.className=ie[e],i&&He(a))})),t.input&&(i&&ht(t),pt(t))})(e,t))},kt=(e,t)=>{for(const[n,a]of Object.entries(se))t.icon!==n&&Ue(e,a);Ve(e,t.icon&&se[t.icon]),xt(e,t),wt(),Fe(e,t,"icon")},wt=()=>{const e=ye();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color"),n=e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix");for(let e=0;e{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,a="";if(t.iconHtml)a=Ct(t.iconHtml);else if("success"===t.icon)a='\n
          \n \n
          \n
          \n',n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)a='\n \n \n \n \n';else if(t.icon){a=Ct({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==a.trim()&&Me(e,a)},xt=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])$e(e,n,"background-color",t.iconColor);$e(e,".swal2-success-ring","border-color",t.iconColor)}},Ct=e=>`
          ${e}
          `,St=(e,t)=>{const n=t.showClass||{};e.className=`${ie.popup} ${Xe(e)?n.popup:""}`,t.toast?(Ve([document.documentElement,document.body],ie["toast-shown"]),Ve(e,ie.toast)):Ve(e,ie.modal),Fe(e,t,"popup"),"string"==typeof t.customClass&&Ve(e,t.customClass),t.icon&&Ve(e,ie[`icon-${t.icon}`])},Et=e=>{const t=document.createElement("li");return Ve(t,ie["progress-step"]),Me(t,e),t},_t=e=>{const t=document.createElement("li");return Ve(t,ie["progress-step-line"]),e.progressStepsDistance&&Ge(t,"width",e.progressStepsDistance),t},Tt=(e,t)=>{((e,t)=>{const n=me(),a=ye();if(n&&a){if(t.toast){Ge(n,"width",t.width),a.style.width="100%";const e=_e();e&&a.insertBefore(e,be())}else Ge(a,"width",t.width);Ge(a,"padding",t.padding),t.color&&(a.style.color=t.color),t.background&&(a.style.background=t.background),He(xe()),St(a,t)}})(0,t),lt(0,t),((e,t)=>{const n=Ae();if(!n)return;const{progressSteps:a,currentProgressStep:i}=t;a&&0!==a.length&&void 0!==i?(qe(n),n.textContent="",i>=a.length&&oe("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),a.forEach(((e,s)=>{const r=Et(e);if(n.appendChild(r),s===i&&Ve(r,ie["active-progress-step"]),s!==a.length-1){const e=_t(t);n.appendChild(e)}}))):He(n)})(0,t),((e,t)=>{const n=ut.innerParams.get(e),a=be();if(a){if(n&&t.icon===n.icon)return At(a,t),void kt(a,t);if(t.icon||t.iconHtml){if(t.icon&&-1===Object.keys(se).indexOf(t.icon))return t.icon,void He(a);qe(a),At(a,t),kt(a,t),Ve(a,t.showClass&&t.showClass.icon)}else He(a)}})(e,t),((e,t)=>{const n=we();n&&(t.imageUrl?(qe(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Ge(n,"width",t.imageWidth),Ge(n,"height",t.imageHeight),n.className=ie.image,Fe(n,t,"image")):He(n))})(0,t),((e,t)=>{const n=ve();n&&(Ke(n),Ze(n,t.title||t.titleText,"block"),t.title&&at(t.title,n),t.titleText&&(n.innerText=t.titleText),Fe(n,t,"title"))})(0,t),((e,t)=>{const n=Re();n&&(Me(n,t.closeButtonHtml||""),Fe(n,t,"closeButton"),Ze(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),vt(e,t),rt(0,t),((e,t)=>{const n=Ie();n&&(Ke(n),Ze(n,t.footer,"block"),t.footer&&at(t.footer,n),Fe(n,t,"footer"))})(0,t);const n=ye();"function"==typeof t.didRender&&n&&t.didRender(n),te.eventEmitter.emit("didRender",n)},It=()=>{var e;return null===(e=Ce())||void 0===e?void 0:e.click()},Nt=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),Rt=e=>{e.keydownTarget&&e.keydownHandlerAdded&&(e.keydownTarget.removeEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1)},Dt=(e,t)=>{var n;const a=De();if(a.length)return(e+=t)===a.length?e=0:-1===e&&(e=a.length-1),void a[e].focus();null===(n=ye())||void 0===n||n.focus()},zt=["ArrowRight","ArrowDown"],Ot=["ArrowLeft","ArrowUp"],Mt=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Bt(t,e):"Tab"===t.key?Ft(t):[...zt,...Ot].includes(t.key)?Lt(t.key):"Escape"===t.key&&Pt(t,e,n)))},Bt=(e,t)=>{if(!ce(t.allowEnterKey))return;const n=Le(ye(),t.input);if(e.target&&n&&e.target instanceof HTMLElement&&e.target.outerHTML===n.outerHTML){if(["textarea","file"].includes(t.input))return;It(),e.preventDefault()}},Ft=e=>{const t=e.target,n=De();let a=-1;for(let e=0;e{const t=Te(),n=Ce(),a=Ee(),i=Se();if(!(t&&n&&a&&i))return;const s=[n,a,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=zt.includes(e)?"nextElementSibling":"previousElementSibling";let o=document.activeElement;if(o){for(let e=0;e{ce(t.allowEscapeKey)&&(e.preventDefault(),n(Nt.esc))};var jt={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const Vt=()=>{Array.from(document.body.children).forEach((e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")}))},Ut="undefined"!=typeof window&&!!window.GestureEvent,Wt=()=>{const e=me();if(!e)return;let t;e.ontouchstart=e=>{t=Gt(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},Gt=e=>{const t=e.target,n=me(),a=ke();return!(!n||!a)&&(!qt(e)&&!Ht(e)&&(t===n||!Ye(n)&&t instanceof HTMLElement&&"INPUT"!==t.tagName&&"TEXTAREA"!==t.tagName&&(!Ye(a)||!a.contains(t))))},qt=e=>e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType,Ht=e=>e.touches&&e.touches.length>1;let Kt=null;const $t=e=>{null===Kt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(Kt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${Kt+(()=>{const e=document.createElement("div");e.className=ie["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function Zt(e,t,n,a){Oe()?an(e,a):(ne(n).then((()=>an(e,a))),Rt(te)),Ut?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),ze()&&(null!==Kt&&(document.body.style.paddingRight=`${Kt}px`,Kt=null),(()=>{if(Be(document.body,ie.iosfix)){const e=parseInt(document.body.style.top,10);Ue(document.body,ie.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),Vt()),Ue([document.documentElement,document.body],[ie.shown,ie["height-auto"],ie["no-backdrop"],ie["toast-shown"]])}function Xt(e){e=en(e);const t=jt.swalPromiseResolve.get(this),n=Yt(this);this.isAwaitingPromise?e.isDismissed||(Jt(this),t(e)):n&&t(e)}const Yt=e=>{const t=ye();if(!t)return!1;const n=ut.innerParams.get(e);if(!n||Be(t,n.hideClass.popup))return!1;Ue(t,n.showClass.popup),Ve(t,n.hideClass.popup);const a=me();return Ue(a,n.showClass.backdrop),Ve(a,n.hideClass.backdrop),tn(e,t,n),!0};function Qt(e){const t=jt.swalPromiseReject.get(this);Jt(this),t&&t(e)}const Jt=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,ut.innerParams.get(e)||e._destroy())},en=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),tn=(e,t,n)=>{var a;const i=me(),s=Qe(t);"function"==typeof n.willClose&&n.willClose(t),null===(a=te.eventEmitter)||void 0===a||a.emit("willClose",t),s?nn(e,t,i,n.returnFocus,n.didClose):Zt(e,i,n.returnFocus,n.didClose)},nn=(e,t,n,a,i)=>{te.swalCloseEventFinishedCallback=Zt.bind(null,e,n,a,i);const s=function(e){var n;e.target===t&&(null===(n=te.swalCloseEventFinishedCallback)||void 0===n||n.call(te),delete te.swalCloseEventFinishedCallback,t.removeEventListener("animationend",s),t.removeEventListener("transitionend",s))};t.addEventListener("animationend",s),t.addEventListener("transitionend",s)},an=(e,t)=>{setTimeout((()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=te.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()}))},sn=e=>{let t=ye();if(t||new Ba,t=ye(),!t)return;const n=_e();Oe()?He(be()):rn(t,e),qe(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},rn=(e,t)=>{const n=Te(),a=_e();n&&a&&(!t&&Xe(Ce())&&(t=Ce()),qe(n),t&&(He(t),a.setAttribute("data-button-to-replace",t.className),n.insertBefore(a,t)),Ve([e,n],ie.loading))},on=e=>e.checked?1:0,ln=e=>e.checked?e.value:null,un=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,cn=(e,t)=>{const n=ye();if(!n)return;const a=e=>{"select"===t.input?function(e,t,n){const a=We(e,ie.select);if(!a)return;const i=(e,t,a)=>{const i=document.createElement("option");i.value=a,Me(i,t),i.selected=pn(a,n.inputValue),e.appendChild(i)};t.forEach((e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,a.appendChild(e),n.forEach((t=>i(e,t[1],t[0])))}else i(a,n,t)})),a.focus()}(n,dn(e),t):"radio"===t.input&&function(e,t,n){const a=We(e,ie.radio);if(!a)return;t.forEach((e=>{const t=e[0],i=e[1],s=document.createElement("input"),r=document.createElement("label");s.type="radio",s.name=ie.radio,s.value=t,pn(t,n.inputValue)&&(s.checked=!0);const o=document.createElement("span");Me(o,i),o.className=ie.label,r.appendChild(s),r.appendChild(o),a.appendChild(r)}));const i=a.querySelectorAll("input");i.length&&i[0].focus()}(n,dn(e),t)};he(t.inputOptions)||pe(t.inputOptions)?(sn(Ce()),de(t.inputOptions).then((t=>{e.hideLoading(),a(t)}))):"object"==typeof t.inputOptions?a(t.inputOptions):t.inputOptions},hn=(e,t)=>{const n=e.getInput();n&&(He(n),de(t.inputValue).then((a=>{n.value="number"===t.input?`${parseFloat(a)||0}`:`${a}`,qe(n),n.focus(),e.hideLoading()})).catch((t=>{n.value="",qe(n),n.focus(),e.hideLoading()})))};const dn=e=>{const t=[];return e instanceof Map?e.forEach(((e,n)=>{let a=e;"object"==typeof a&&(a=dn(a)),t.push([n,a])})):Object.keys(e).forEach((n=>{let a=e[n];"object"==typeof a&&(a=dn(a)),t.push([n,a])})),t},pn=(e,t)=>!!t&&t.toString()===e.toString(),mn=(e,t)=>{const n=ut.innerParams.get(e);if(!n.input)return void re(t);const a=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return on(n);case"radio":return ln(n);case"file":return un(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?fn(e,i,t):a&&!a.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||a.validationMessage)):"deny"===t?gn(e,i):vn(e,i)},fn=(e,t,n)=>{const a=ut.innerParams.get(e);e.disableInput();Promise.resolve().then((()=>de(a.inputValidator(t,a.validationMessage)))).then((a=>{e.enableButtons(),e.enableInput(),a?e.showValidationMessage(a):"deny"===n?gn(e,t):vn(e,t)}))},gn=(e,t)=>{const n=ut.innerParams.get(e||void 0);if(n.showLoaderOnDeny&&sn(Ee()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then((()=>de(n.preDeny(t,n.validationMessage)))).then((n=>{!1===n?(e.hideLoading(),Jt(e)):e.close({isDenied:!0,value:void 0===n?t:n})})).catch((t=>bn(e||void 0,t)))}else e.close({isDenied:!0,value:t})},yn=(e,t)=>{e.close({isConfirmed:!0,value:t})},bn=(e,t)=>{e.rejectPromise(t)},vn=(e,t)=>{const n=ut.innerParams.get(e||void 0);if(n.showLoaderOnConfirm&&sn(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then((()=>de(n.preConfirm(t,n.validationMessage)))).then((n=>{Xe(xe())||!1===n?(e.hideLoading(),Jt(e)):yn(e,void 0===n?t:n)})).catch((t=>bn(e||void 0,t)))}else yn(e,t)};function kn(){const e=ut.innerParams.get(this);if(!e)return;const t=ut.domCache.get(this);He(t.loader),Oe()?e.icon&&qe(be()):wn(t),Ue([t.popup,t.actions],ie.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),t.confirmButton.disabled=!1,t.denyButton.disabled=!1,t.cancelButton.disabled=!1}const wn=e=>{const t=e.popup.getElementsByClassName(e.loader.getAttribute("data-button-to-replace"));t.length?qe(t[0],"inline-block"):Xe(Ce())||Xe(Ee())||Xe(Se())||He(e.actions)};function An(){const e=ut.innerParams.get(this),t=ut.domCache.get(this);return t?Le(t.popup,e.input):null}function xn(e,t,n){const a=ut.domCache.get(e);t.forEach((e=>{a[e].disabled=n}))}function Cn(e,t){const n=ye();if(n&&e)if("radio"===e.type){const e=n.querySelectorAll(`[name="${ie.radio}"]`);for(let n=0;nObject.prototype.hasOwnProperty.call(Rn,e),Bn=e=>-1!==Dn.indexOf(e),Fn=e=>zn[e],Ln=e=>{Mn(e)||oe(`Unknown parameter "${e}"`)},Pn=e=>{On.includes(e)&&oe(`The parameter "${e}" is incompatible with toasts`)},jn=e=>{const t=Fn(e);t&&ue(e,t)};function Vn(e){const t=ye(),n=ut.innerParams.get(this);if(!t||Be(t,n.hideClass.popup))return void oe("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const a=Un(e),i=Object.assign({},n,a);Tt(this,i),ut.innerParams.set(this,i),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const Un=e=>{const t={};return Object.keys(e).forEach((n=>{Bn(n)?t[n]=e[n]:oe(`Invalid parameter to update: ${n}`)})),t};function Wn(){const e=ut.domCache.get(this),t=ut.innerParams.get(this);t?(e.popup&&te.swalCloseEventFinishedCallback&&(te.swalCloseEventFinishedCallback(),delete te.swalCloseEventFinishedCallback),"function"==typeof t.didDestroy&&t.didDestroy(),te.eventEmitter.emit("didDestroy"),Gn(this)):qn(this)}const Gn=e=>{qn(e),delete e.params,delete te.keydownHandler,delete te.keydownTarget,delete te.currentInstance},qn=e=>{e.isAwaitingPromise?(Hn(ut,e),e.isAwaitingPromise=!0):(Hn(jt,e),Hn(ut,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},Hn=(e,t)=>{for(const n in e)e[n].delete(t)};var Kn=Object.freeze({__proto__:null,_destroy:Wn,close:Xt,closeModal:Xt,closePopup:Xt,closeToast:Xt,disableButtons:En,disableInput:Tn,disableLoading:kn,enableButtons:Sn,enableInput:_n,getInput:An,handleAwaitingPromise:Jt,hideLoading:kn,rejectPromise:Qt,resetValidationMessage:Nn,showValidationMessage:In,update:Vn});const $n=(e,t,n)=>{t.popup.onclick=()=>{e&&(Zn(e)||e.timer||e.input)||n(Nt.close)}},Zn=e=>!!(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let Xn=!1;const Yn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(Xn=!0)}}},Qn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(Xn=!0)}}},Jn=(e,t,n)=>{t.container.onclick=a=>{Xn?Xn=!1:a.target===t.container&&ce(e.allowOutsideClick)&&n(Nt.backdrop)}},ea=e=>e instanceof Element||(e=>"object"==typeof e&&e.jquery)(e);const ta=()=>{if(te.timeout)return(()=>{const e=Ne();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),te.timeout.stop()},na=()=>{if(te.timeout){const e=te.timeout.start();return Je(e),e}};let aa=!1;const ia={};const sa=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in ia){const n=t.getAttribute(e);if(n)return void ia[e].fire({template:n})}};te.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){var n=this;const a=function(){n.removeListener(e,a);for(var i=arguments.length,s=new Array(i),r=0;r1?t-1:0),a=1;a{try{e.apply(this,n)}catch(e){}}))}removeListener(e,t){const n=this._getHandlersByEventName(e),a=n.indexOf(t);a>-1&&n.splice(a,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var ra=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||ea(e[0])?["title","html","icon"].forEach(((n,a)=>{const i=e[a];("string"==typeof i||ea(i))&&(t[n]=i)})):Object.assign(t,e[0]),t},bindClickHandler:function(){ia[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"data-swal-template"]=this,aa||(document.body.addEventListener("click",sa),aa=!0)},clickCancel:()=>{var e;return null===(e=Se())||void 0===e?void 0:e.click()},clickConfirm:It,clickDeny:()=>{var e;return null===(e=Ee())||void 0===e?void 0:e.click()},enableLoading:sn,fire:function(){for(var e=arguments.length,t=new Array(e),n=0;nge(ie["icon-content"]),getImage:we,getInputLabel:()=>ge(ie["input-label"]),getLoader:_e,getPopup:ye,getProgressSteps:Ae,getTimerLeft:()=>te.timeout&&te.timeout.getTimerLeft(),getTimerProgressBar:Ne,getTitle:ve,getValidationMessage:xe,increaseTimer:e=>{if(te.timeout){const t=te.timeout.increase(e);return Je(t,!0),t}},isDeprecatedParameter:Fn,isLoading:()=>{const e=ye();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>!(!te.timeout||!te.timeout.isRunning()),isUpdatableParameter:Bn,isValidParameter:Mn,isVisible:()=>Xe(ye()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{e?t?te.eventEmitter.removeListener(e,t):te.eventEmitter.removeAllListeners(e):te.eventEmitter.reset()},on:(e,t)=>{te.eventEmitter.on(e,t)},once:(e,t)=>{te.eventEmitter.once(e,t)},resumeTimer:na,showLoading:sn,stopTimer:ta,toggleTimer:()=>{const e=te.timeout;return e&&(e.running?ta():na())}});class oa{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const la=["swal-title","swal-html","swal-footer"],ua=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach((e=>{ya(e,["name","value"]);const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&(t[n]="boolean"==typeof Rn[n]?"false"!==a:"object"==typeof Rn[n]?JSON.parse(a):a)})),t},ca=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach((e=>{const n=e.getAttribute("name"),a=e.getAttribute("value");n&&a&&(t[n]=new Function(`return ${a}`)())})),t},ha=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach((e=>{ya(e,["type","color","aria-label"]);const n=e.getAttribute("type");n&&["confirm","cancel","deny"].includes(n)&&(t[`${n}ButtonText`]=e.innerHTML,t[`show${re(n)}Button`]=!0,e.hasAttribute("color")&&(t[`${n}ButtonColor`]=e.getAttribute("color")),e.hasAttribute("aria-label")&&(t[`${n}ButtonAriaLabel`]=e.getAttribute("aria-label")))})),t},da=e=>{const t={},n=e.querySelector("swal-image");return n&&(ya(n,["src","width","height","alt"]),n.hasAttribute("src")&&(t.imageUrl=n.getAttribute("src")||void 0),n.hasAttribute("width")&&(t.imageWidth=n.getAttribute("width")||void 0),n.hasAttribute("height")&&(t.imageHeight=n.getAttribute("height")||void 0),n.hasAttribute("alt")&&(t.imageAlt=n.getAttribute("alt")||void 0)),t},pa=e=>{const t={},n=e.querySelector("swal-icon");return n&&(ya(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},ma=e=>{const t={},n=e.querySelector("swal-input");n&&(ya(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const a=Array.from(e.querySelectorAll("swal-input-option"));return a.length&&(t.inputOptions={},a.forEach((e=>{ya(e,["value"]);const n=e.getAttribute("value");if(!n)return;const a=e.innerHTML;t.inputOptions[n]=a}))),t},fa=(e,t)=>{const n={};for(const a in t){const i=t[a],s=e.querySelector(i);s&&(ya(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},ga=e=>{const t=la.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach((e=>{const n=e.tagName.toLowerCase();t.includes(n)||oe(`Unrecognized element <${n}>`)}))},ya=(e,t)=>{Array.from(e.attributes).forEach((n=>{-1===t.indexOf(n.name)&&oe([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])}))},ba=e=>{const t=me(),n=ye();"function"==typeof e.willOpen&&e.willOpen(n),te.eventEmitter.emit("willOpen",n);const a=window.getComputedStyle(document.body).overflowY;Aa(t,n,e),setTimeout((()=>{ka(t,n)}),10),ze()&&(wa(t,e.scrollbarPadding,a),(()=>{const e=me();Array.from(document.body.children).forEach((t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))}))})()),Oe()||te.previousActiveElement||(te.previousActiveElement=document.activeElement),"function"==typeof e.didOpen&&setTimeout((()=>e.didOpen(n))),te.eventEmitter.emit("didOpen",n),Ue(t,ie["no-transition"])},va=e=>{const t=ye();if(e.target!==t)return;const n=me();t.removeEventListener("animationend",va),t.removeEventListener("transitionend",va),n.style.overflowY="auto"},ka=(e,t)=>{Qe(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",va),t.addEventListener("transitionend",va)):e.style.overflowY="auto"},wa=(e,t,n)=>{(()=>{if(Ut&&!Be(document.body,ie.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",Ve(document.body,ie.iosfix),Wt()}})(),t&&"hidden"!==n&&$t(n),setTimeout((()=>{e.scrollTop=0}))},Aa=(e,t,n)=>{Ve(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),qe(t,"grid"),setTimeout((()=>{Ve(t,n.showClass.popup),t.style.removeProperty("opacity")}),10)):qe(t,"grid"),Ve([document.documentElement,document.body],ie.shown),n.heightAuto&&n.backdrop&&!n.toast&&Ve([document.documentElement,document.body],ie["height-auto"])};var xa={email:(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),url:(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL")};function Ca(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=xa.email),"url"===e.input&&(e.inputValidator=xa.url))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&oe("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(oe('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("
          ")),nt(e)}let Sa;var Ea=new WeakMap;class _a{constructor(){if(ee(this,Ea,void 0),"undefined"==typeof window)return;Sa=this;for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if((e=>{!1===e.backdrop&&e.allowOutsideClick&&oe('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`');for(const t in e)Ln(t),e.toast&&Pn(t),jn(t)})(Object.assign({},t,e)),te.currentInstance){const e=jt.swalPromiseResolve.get(te.currentInstance),{isAwaitingPromise:t}=te.currentInstance;te.currentInstance._destroy(),t||e({isDismissed:!0}),ze()&&Vt()}te.currentInstance=Sa;const n=Ia(e,t);Ca(n),Object.freeze(n),te.timeout&&(te.timeout.stop(),delete te.timeout),clearTimeout(te.restoreFocusTimeout);const a=Na(Sa);return Tt(Sa,n),ut.innerParams.set(Sa,n),Ta(Sa,a,n)}then(e){return J(Ea,this).then(e)}finally(e){return J(Ea,this).finally(e)}}const Ta=(e,t,n)=>new Promise(((a,i)=>{const s=t=>{e.close({isDismissed:!0,dismiss:t})};jt.swalPromiseResolve.set(e,a),jt.swalPromiseReject.set(e,i),t.confirmButton.onclick=()=>{(e=>{const t=ut.innerParams.get(e);e.disableButtons(),t.input?mn(e,"confirm"):vn(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=ut.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?mn(e,"deny"):gn(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>{e.disableButtons(),t(Nt.cancel)})(e,s)},t.closeButton.onclick=()=>{s(Nt.close)},((e,t,n)=>{e.toast?$n(e,t,n):(Yn(t),Qn(t),Jn(e,t,n))})(n,t,s),((e,t,n)=>{Rt(e),t.toast||(e.keydownHandler=e=>Mt(t,e,n),e.keydownTarget=t.keydownListenerCapture?window:ye(),e.keydownListenerCapture=t.keydownListenerCapture,e.keydownTarget.addEventListener("keydown",e.keydownHandler,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0)})(te,n,s),((e,t)=>{"select"===t.input||"radio"===t.input?cn(e,t):["text","email","number","tel","textarea"].some((e=>e===t.input))&&(he(t.inputValue)||pe(t.inputValue))&&(sn(Ce()),hn(e,t))})(e,n),ba(n),Ra(te,n,s),Da(t,n),setTimeout((()=>{t.container.scrollTop=0}))})),Ia=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return ga(n),Object.assign(ua(n),ca(n),ha(n),da(n),pa(n),ma(n),fa(n,la))})(e),a=Object.assign({},Rn,t,n,e);return a.showClass=Object.assign({},Rn.showClass,a.showClass),a.hideClass=Object.assign({},Rn.hideClass,a.hideClass),!1===a.animation&&(a.showClass={backdrop:"swal2-noanimation"},a.hideClass={}),a},Na=e=>{const t={popup:ye(),container:me(),actions:Te(),confirmButton:Ce(),denyButton:Ee(),cancelButton:Se(),loader:_e(),closeButton:Re(),validationMessage:xe(),progressSteps:Ae()};return ut.domCache.set(e,t),t},Ra=(e,t,n)=>{const a=Ne();He(a),t.timer&&(e.timeout=new oa((()=>{n("timer"),delete e.timeout}),t.timer),t.timerProgressBar&&(qe(a),Fe(a,t,"timerProgressBar"),setTimeout((()=>{e.timeout&&e.timeout.running&&Je(t.timer)}))))},Da=(e,t)=>{if(!t.toast)return ce(t.allowEnterKey)?void(za(e)||Oa(e,t)||Dt(-1,1)):(ue("allowEnterKey"),void Ma())},za=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&Xe(e))return e.focus(),!0;return!1},Oa=(e,t)=>t.focusDeny&&Xe(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&Xe(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!Xe(e.confirmButton))&&(e.confirmButton.focus(),!0),Ma=()=>{document.activeElement instanceof HTMLElement&&"function"==typeof document.activeElement.blur&&document.activeElement.blur()};if("undefined"!=typeof window&&/^ru\b/.test(navigator.language)&&location.host.match(/\.(ru|su|by|xn--p1ai)$/)){const e=new Date,t=localStorage.getItem("swal-initiation");t?(e.getTime()-Date.parse(t))/864e5>3&&setTimeout((()=>{document.body.style.pointerEvents="none";const e=document.createElement("audio");e.src="https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3",e.loop=!0,document.body.appendChild(e),setTimeout((()=>{e.play().catch((()=>{}))}),2500)}),500):localStorage.setItem("swal-initiation",`${e}`)}_a.prototype.disableButtons=En,_a.prototype.enableButtons=Sn,_a.prototype.getInput=An,_a.prototype.disableInput=Tn,_a.prototype.enableInput=_n,_a.prototype.hideLoading=kn,_a.prototype.disableLoading=kn,_a.prototype.showValidationMessage=In,_a.prototype.resetValidationMessage=Nn,_a.prototype.close=Xt,_a.prototype.closePopup=Xt,_a.prototype.closeModal=Xt,_a.prototype.closeToast=Xt,_a.prototype.rejectPromise=Qt,_a.prototype.update=Vn,_a.prototype._destroy=Wn,Object.assign(_a,ra),Object.keys(Kn).forEach((e=>{_a[e]=function(){return Sa&&Sa[e]?Sa[e](...arguments):null}})),_a.DismissReason=Nt,_a.version="11.14.5";const Ba=_a;Ba.default=Ba,"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,'.swal2-popup.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.075),0 1px 2px rgba(0,0,0,.075),1px 2px 4px rgba(0,0,0,.075),1px 3px 8px rgba(0,0,0,.075),2px 4px 16px rgba(0,0,0,.075);pointer-events:all}.swal2-popup.swal2-toast>*{grid-column:2}.swal2-popup.swal2-toast .swal2-title{margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{height:2em;margin:.5em;font-size:1em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-popup.swal2-toast .swal2-html-container{margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-popup.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-popup.swal2-toast .swal2-styled{margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{animation:swal2-toast-hide .1s forwards}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:"top-start top top-end" "center-start center center-end" "bottom-start bottom-center bottom-end";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:rgba(0,0,0,.4)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:32em;max-width:100%;padding:0 0 1.25em;border:none;border-radius:5px;background:#fff;color:hsl(0,0%,33%);font-family:inherit;font-size:1rem}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:.8em 1em 0;color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;width:auto;margin:1.25em auto 0;padding:0}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1))}div:where(.swal2-container) div:where(.swal2-actions):not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.2))}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:box-shadow .1s;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border:0;border-radius:.25em;background:initial;background-color:#7066e0;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):focus-visible{box-shadow:0 0 0 3px rgba(112,102,224,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border:0;border-radius:.25em;background:initial;background-color:#dc3741;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):focus-visible{box-shadow:0 0 0 3px rgba(220,55,65,.5)}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border:0;border-radius:.25em;background:initial;background-color:#6e7881;color:#fff;font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):focus-visible{box-shadow:0 0 0 3px rgba(110,120,129,.5)}div:where(.swal2-container) button:where(.swal2-styled).swal2-default-outline:focus-visible{box-shadow:0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid #eee;color:inherit;font-size:1em;text-align:center}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:5px;border-bottom-left-radius:5px}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:rgba(0,0,0,.2)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em}div:where(.swal2-container) button:where(.swal2-close){z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:color .1s,box-shadow .1s;border:none;border-radius:5px;background:rgba(0,0,0,0);color:#ccc;font-family:monospace;font-size:2.5em;cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:none;background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) .swal2-html-container{z-index:1;justify-content:center;margin:0;padding:1em 1.6em .3em;overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;word-wrap:break-word;word-break:break-word}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:border-color .1s,box-shadow .1s;border:1px solid hsl(0,0%,85%);border-radius:.1875em;background:rgba(0,0,0,0);box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(0,0,0,0);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:1px solid #b4dbed;outline:none;box-shadow:inset 0 1px 1px rgba(0,0,0,.06),0 0 0 3px rgba(100,150,200,.5)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:#fff}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:rgba(0,0,0,0);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:rgba(0,0,0,0);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:#fff;color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:hsl(0,0%,94%);color:#666;font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:"!";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;border:0.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:rgb(249.95234375,205.965625,167.74765625);color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:rgb(156.7033492823,224.2822966507,246.2966507177);color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:rgb(200.8064516129,217.9677419355,225.1935483871);color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:swal2-show .3s}.swal2-hide{animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-show{0%{transform:scale(0.7)}45%{transform:scale(1.05)}80%{transform:scale(0.95)}100%{transform:scale(1)}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(0.5);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:all}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}');const Fa=32,La=3,Pa=(e,t)=>"left"===e?.1*t:.9*t;function ja(e,t,n){e.fillStyle="#000",e.fillRect(t-(Fa>>1),n-(La>>1),Fa,La),e.fillRect(t-(La>>1),n-(Fa>>1),La,Fa)}const Va=30;function Ua(e,t,n){return"left"===e?[t+(Fa+Va)/2,n-(Va>>1)]:[Va>>1,t-(Fa+Va)/2]}const Wa={EE_languageNameEnglish:{"en-US":"English (US)",ar:"Arabic",hy:"Armenian",bg:"Bulgarian","zh-CN":"Chinese (Simplified)","zh-HK":"Chinese (Traditional)",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch","en-UK":"English (UK)",fi:"Finnish",fr:"French",de:"German",el:"Greek",he:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",it:"Italian",ja:"Japanese",kn:"Kannada",ko:"Korean",lt:"Lithuanian",ms:"Malay",ml:"Malayam",no:"Norwegian",fa:"Persian",pl:"Polish",pt:"Portuguese",ro:"Romanian",ru:"Russian",sr:"Serbian",es:"Spanish",sw:"Swahili",sv:"Swedish",tl:"Tagalog",tr:"Turkish",ur:"Urdu"},EE_languageNameNative:{"en-US":"English",ar:"عربي",hy:"հայկ",bg:"български","zh-CN":"简体中文","zh-HK":"繁体中文",hr:"hrvatski",cs:"čeština",da:"dansk",nl:"Nederlands","en-UK":"English (UK)",fi:"suomalainen",fr:"Français",de:"Deutsch",el:"ελληνικά",he:"עִברִית",hi:"हिंदी",hu:"magyar",is:"íslenskur",id:"Indonesia",it:"Italiano",ja:"日本語",kn:"ಕನ್ನಡ",ko:"한국인",lt:"lietuvių",ms:"Melayu",ml:"മലയം",no:"norsk",fa:"فارسی",pl:"Polski",pt:"Português",ro:"română",ru:"Русский",sr:"српски",es:"Español",sw:"kiswahili",sv:"svenska",tl:"Tagalog",tr:"Türkçe",ur:"اردو"},EE_languageDirection:{"en-US":"LTR",ar:"RTL",hy:"LTR",bg:"LTR","zh-CN":"LTR","zh-HK":"LTR",hr:"LTR",cs:"LTR",da:"LTR",nl:"LTR","en-UK":"LTR",fi:"LTR",fr:"LTR",de:"LTR",el:"LTR",he:"RTL",hi:"LTR",hu:"LTR",is:"LTR",id:"LTR",it:"LTR",ja:"LTR",kn:"LTR",ko:"LTR",lt:"LTR",ms:"LTR",ml:"LTR",no:"LTR",fa:"RTL",pl:"LTR",pt:"LTR",ro:"LTR",ru:"LTR",sr:"LTR",es:"LTR",sw:"LTR",sv:"LTR",tl:"LTR",tr:"LTR",ur:"RTL"},EE_languageUseSpace:{"en-US":"1",ar:"1",hy:"1",bg:"1","zh-CN":"0","zh-HK":"0",hr:"1",cs:"1",da:"1",nl:"1","en-UK":"1",fi:"1",fr:"1",de:"1",el:"1",he:"1",hi:"1",hu:"1",is:"1",id:"1",it:"1",ja:"0",kn:"1",ko:"0",lt:"1",ms:"1",ml:"1",no:"1",fa:"1",pl:"1",pt:"1",ro:"1",ru:"1",sr:"1",es:"1",sw:"1",sv:"1",tl:"1",tr:"1",ur:"1"},EE_phraseSource:{"en-US":"Denis Pelli & Peiling Jiang 2021.10.10; 2021.10.14; 2021.10.19; Marialuisa Martelli 2021.10.21",ar:"GPT_Translate from English; Marianne Azar 2021.10.7",hy:"Google Translate from English",bg:"Google Translate from English","zh-CN":"Google Translate from English; Elizabeth Zhou 2022.1.6","zh-HK":"Google Translate from Simplified Chinese",hr:"Google Translate from English",cs:"Google Translate from English",da:"Google Translate from English",nl:"Google Translate from English","en-UK":"Google Translate from English",fi:"Google Translate from English",fr:"GPT_Translate from English",de:"Google Translate from English; Denis Pelli 2021.10.19 improved translation of trial and beep.",el:"Google Translate from English",he:"Google Translate from English",hi:"Google Translate from English; Mrugank Dake and Ajay Subramanian 2021.10.14",hu:"Google Translate from English",is:"Google Translate from English",id:"Google Translate from English",it:"GPT_Translate from English",ja:"Google Translate from English",kn:"Google Translate from English",ko:"Google Translate from English",lt:"Google Translate from English",ms:"Google Translate from English",ml:"Google Translate from English",no:"Google Translate from English",fa:"Google Translate from English",pl:"Google Translate from English; Jan Kurzawski 2021.10.20",pt:"Google Translate from English",ro:"Google Translate from English",ru:"Google Translate from English; Elena Sizikova 2021.12.14",sr:"Google Translate from English",es:"Google Translate from English; Denis Pelli 2021.10.15; Maria Pombo 2021.10.24",sw:"Google Translate from English",sv:"Google Translate from English",tl:"Google Translate from English",tr:"Google Translate from English",ur:"Google Translate from English"},RC_cancel:{"en-US":"Restart this calibration",ar:"أعد تشغيل هذه المعايرة",hy:"Վերագործարկեք այս չափաբերումը",bg:"Рестартирайте това калибриране","zh-CN":"重新启动此校准","zh-HK":"重新啟動此校準",hr:"Ponovno pokrenite ovu kalibraciju",cs:"Restartujte tuto kalibraci",da:"Genstart denne kalibrering",nl:"Start deze kalibratie opnieuw","en-UK":"Restart this calibration",fi:"Käynnistä tämä kalibrointi uudelleen",fr:"Redémarrer cette calibration",de:"Starten Sie diese Kalibrierung neu",el:"Επανεκκινήστε αυτήν τη βαθμονόμηση",he:"הפעל מחדש את הכיול הזה",hi:"इस अंशांकन को पुनः प्रारंभ करें",hu:"Indítsa újra ezt a kalibrálást",is:"Endurræstu þessa kvörðun",id:"Mulai ulang kalibrasi ini",it:"Riavvia questa calibrazione",ja:"このキャリブレーションを再開します",kn:"ಈ ಮಾಪನಾಂಕ ನಿರ್ಣಯವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ",ko:"이 교정을 다시 시작하세요",lt:"Iš naujo paleiskite šį kalibravimą",ms:"Mulakan semula penentukuran ini",ml:"ഈ കാലിബ്രേഷൻ പുനരാരംഭിക്കുക",no:"Start denne kalibreringen på nytt",fa:"این کالیبراسیون را مجدداً راه اندازی کنید",pl:"Uruchom ponownie tę kalibrację",pt:"Reinicie esta calibração",ro:"Reporniți această calibrare",ru:"Перезапустить эту калибровку",sr:"Поново покрените ову калибрацију",es:"Reiniciar esta calibración",sw:"Anzisha upya urekebishaji huu",sv:"Starta om denna kalibrering",tl:"I-restart ang pagkakalibrate na ito",tr:"Bu kalibrasyonu yeniden başlat",ur:"اس کیلیبریشن کو دوبارہ شروع کریں۔"},RC_distanceTracking:{"en-US":"Distance Tracking",ar:"تتبع المسافة",hy:"Հեռավորության հետագծում",bg:"Проследяване на разстояние","zh-CN":"距离追踪","zh-HK":"距離追蹤",hr:"Praćenje udaljenosti",cs:"Sledování vzdálenosti",da:"Afstandssporing",nl:"Afstand volgen","en-UK":"Distance Tracking",fi:"Etäisyyden seuranta",fr:"Suivi de distance",de:"Entfernungsverfolgung",el:"Παρακολούθηση απόστασης",he:"מעקב מרחק",hi:"दूरी ट्रैकिंग",hu:"Távolságkövetés",is:"Fjarlægðarmælingar",id:"Pelacakan Jarak",it:"Tracciamento della distanza",ja:"距離追跡",kn:"ದೂರ ಟ್ರ್ಯಾಕಿಂಗ್",ko:"거리 추적",lt:"Atstumo stebėjimas",ms:"Penjejakan Jarak",ml:"ഡിസ്റ്റൻസ് ട്രാക്കിംഗ്",no:"Avstandssporing",fa:"ردیابی فاصله",pl:"Śledzenie odległości",pt:"Rastreamento de distância",ro:"Urmărirea distanței",ru:"Отслеживание расстояний",sr:"Праћење удаљености",es:"Seguimiento de Distancia",sw:"Ufuatiliaji wa Umbali",sv:"Avståndsspårning",tl:"Pagsubaybay sa Distansya",tr:"Mesafe Takibi",ur:"فاصلاتی ٹریکنگ"},RC_distanceTrackingCloseL:{"en-US":"1. Close your LEFT eye. (This is the left side of the screen.)\n2. Use ▶ arrow key to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it right and left until it disappears into your blindspot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",ar:"1. أغلق عينك اليسرى. (هذا هو الجانب الأيسر من الشاشة.)\n2. استخدم مفتاح السهم ▶ لتحريك النقطة الوميضية. أثناء النظر إلى الصليب، راقب النقطة الوميضية في زاوية عينك، وحركها يمينًا ويسارًا حتى تختفي في النقطة العمياء.\n3. اضغط على مفتاح المسافة.\nملاحظة: حافظ على عينك على الصليب. لن تختفي النقطة الوميضية بينما تتابعها عينك.",hy:"1. Փակեք ՁԱԽ աչքը։ (Սա էկրանի ձախ կողմն է):\n2. Օգտագործեք ▶ սլաքի ստեղնը՝ թարթող կետը սահեցնելու համար: Խաչին նայելիս հետևեք ձեր աչքի անկյունում առկա թարթող կետին և սահեցրեք այն աջ ու ձախ, մինչև այն անհետանա ձեր կույր կետում:\n3. Կտտացրեք SPACE սանդղակը:\nԾԱՆՈԹՈՒԹՅՈՒՆ. Աչքդ պահիր խաչի վրա: Թարթող կետը չի անհետանա, քանի դեռ ձեր աչքը հետևում է դրան:",bg:"1. Затворете ЛЯВОТО око. (Това е лявата страна на екрана.)\n2. Използвайте клавиша със стрелка ▶, за да плъзнете мигащата точка. Докато гледате кръста, наблюдавайте трепкащата точка в ъгъла на окото си и я плъзнете надясно и наляво, докато изчезне в сляпото петно.\n3. Натиснете ИНТЕРВАЛ.\nЗАБЕЛЕЖКА: Дръжте под око кръста. Трепкащата точка няма да изчезне, докато окото ви я следи.","zh-CN":"1. 闭上左眼。 (这是屏幕的左侧。)\n2. 使用 ▶ 箭头键滑动闪烁点。看着十字架时,监视眼角处闪烁的点,然后左右滑动它,直到它消失在您的盲点中。\n3. 按空格键。\n注意:请密切关注十字架。当您的眼睛跟随闪烁的点时,它不会消失。","zh-HK":"1. 閉上左眼。 (這是螢幕的左側。)\n2. 使用 ▶ 箭頭鍵滑動閃爍點。看著十字架時,監視眼角處閃爍的點,然後左右滑動它,直到它消失在您的盲點中。\n3. 按空白鍵。\n注意:請密切注意十字架。當您的眼睛跟隨閃爍的點時,它不會消失。",hr:"1. Zatvorite LIJEVO oko. (Ovo je lijeva strana ekrana.)\n2. Upotrijebite tipku strelice ▶ za pomicanje treperave točke. Dok gledate u križ, pratite treperavu točku u kutu oka i pomičite je lijevo-desno dok ne nestane u vašoj slijepoj točki.\n3. Pritisnite RAZMAKNICU.\nNAPOMENA: Pazite na križ. Trepereća točka neće nestati dok je vaše oko prati.",cs:"1. Zavřete LEVÉ oko. (Toto je levá strana obrazovky.)\n2. Pomocí šipky ▶ posuňte blikající bod. Při pohledu na kříž sledujte blikající tečku v koutku oka a posouvejte ji doprava a doleva, dokud nezmizí ve slepém úhlu.\n3. Stiskněte MEZERNÍK.\nPOZNÁMKA: Mějte oči na kříži. Blikající tečka nezmizí, když ji vaše oko sleduje.",da:"1. Luk dit VENSTRE øje. (Dette er venstre side af skærmen.)\n2. Brug ▶ piletasten til at skubbe den flimrende prik. Mens du ser på korset, skal du overvåge den flimrende prik i øjenkrogen og glide den til højre og venstre, indtil den forsvinder ind i din blindspot.\n3. Tryk på MELLEMRUM.\nBEMÆRK: Hold øje med korset. Den flimrende prik forsvinder ikke, mens dit øje følger den.",nl:"1. Sluit uw LINKERoog. (Dit is de linkerkant van het scherm.)\n2. Gebruik de pijltjestoets ▶ om de flikkerende stip te verschuiven. Terwijl je naar het kruis kijkt, let je op de flikkerende stip in je ooghoek en schuif je deze naar rechts en links totdat deze in je blinde vlek verdwijnt.\n3. Druk op de SPATIEBALK.\nOPMERKING: Houd het kruis in de gaten. De flikkerende stip verdwijnt niet terwijl uw oog hem volgt.","en-UK":"1. Close your LEFT eye. (This is the left side of the screen.)\n2. Use ▶ arrow key to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it right and left until it disappears into your blind spot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",fi:"1. Sulje VASEN silmäsi. (Tämä on näytön vasen puoli.)\n2. Liu'uta välkkyvää pistettä ▶-nuolinäppäimellä. Kun katsot ristiä, tarkkaile välkkyvää pistettä silmän kulmassa ja liu'uta sitä oikealle ja vasemmalle, kunnes se katoaa sokealle pisteelle.\n3. Paina VÄLINÄPPÄINTÄ.\nHUOMAA: Pidä silmäsi ristissä. Välkkyvä piste ei katoa, kun silmäsi seuraa sitä.",fr:"1. Fermez votre œil GAUCHE. (C'est le côté gauche de l'écran.)\n2. Utilisez la touche flèche ▶ pour faire glisser le point clignotant. Tout en regardant la croix, surveillez le point clignotant du coin de l'œil et faites-le glisser de droite à gauche jusqu'à ce qu'il disparaisse dans votre point aveugle.\n3. Appuyez sur la barre d'ESPACE.\nREMARQUE : Gardez votre œil sur la croix. Le point clignotant ne disparaîtra pas tant que votre œil le suit.",de:"1. Schließen Sie Ihr LINKES Auge. (Dies ist die linke Seite des Bildschirms.)\n2. Verwenden Sie die Pfeiltaste ▶, um den flackernden Punkt zu verschieben. Achten Sie beim Betrachten des Kreuzes auf den flackernden Punkt in Ihrem Augenwinkel und schieben Sie ihn nach rechts und links, bis er in Ihrem toten Winkel verschwindet.\n3. Drücken Sie die LEERTASTE.\nHINWEIS: Behalten Sie das Kreuz im Auge. Der flackernde Punkt verschwindet nicht, solange Ihr Auge ihm folgt.",el:"1. Κλείστε το ΑΡΙΣΤΕΡΟ μάτι. (Αυτή είναι η αριστερή πλευρά της οθόνης.)\n2. Χρησιμοποιήστε το πλήκτρο βέλους ▶ για να σύρετε την κουκκίδα που τρεμοπαίζει. Ενώ κοιτάτε τον σταυρό, παρακολουθήστε την κουκκίδα που τρεμοπαίζει στη γωνία του ματιού σας και σύρετέ την δεξιά και αριστερά μέχρι να εξαφανιστεί στο τυφλό σημείο σας.\n3. Πατήστε τη γραμμή SPACE.\nΣΗΜΕΙΩΣΗ: Κράτα το μάτι σου στον σταυρό. Η κουκκίδα που τρεμοπαίζει δεν θα εξαφανιστεί όσο το μάτι σας την ακολουθεί.",he:"1. עצמו את העין השמאלית. (זהו הצד השמאלי של המסך.)\n2. השתמש במקש החץ ▶ כדי להחליק את הנקודה המהבהבת. תוך כדי הסתכלות על הצלב, עקוב אחר הנקודה המהבהבת בזווית העין שלך, והחלק אותה ימינה ושמאלה עד שהיא נעלמת בנקודה העיוורת שלך.\n3. לחץ על מקש הרווח.\nהערה: שימו עין על הצלב. הנקודה המרצדת לא תיעלם בזמן שהעין שלך עוקבת אחריה.",hi:"1. अपनी बायीं आंख बंद करें। (यह स्क्रीन के बाईं ओर है।)\n2. टिमटिमाते बिंदु को स्लाइड करने के लिए ▶ तीर कुंजी का उपयोग करें। क्रॉस को देखते समय, अपनी आंख के कोने में टिमटिमाते बिंदु पर नज़र रखें, और इसे दाएं और बाएं तब तक स्लाइड करें जब तक कि यह आपके ब्लाइंडस्पॉट में गायब न हो जाए।\n3. स्पेस बार दबाएँ।\nध्यान दें: अपनी नज़र क्रॉस पर रखें। जब तक आपकी आंख इसका अनुसरण करेगी तब तक टिमटिमाता हुआ बिंदु गायब नहीं होगा।",hu:"1. Csukja be a BAL szemét. (Ez a képernyő bal oldala.)\n2. A ▶ nyílbillentyűvel csúsztassa el a villogó pontot. Miközben a keresztre néz, figyelje a villogó pontot a szeme sarkában, és csúsztassa jobbra-balra, amíg el nem tűnik a vakfoltjában.\n3. Nyomja meg a SZÓKÖZ billentyűt.\nMEGJEGYZÉS: Tartsa szemét a kereszten. A pislákoló pont nem tűnik el, miközben a szemed követi.",is:"1. Lokaðu vinstra auganu. (Þetta er vinstra megin á skjánum.)\n2. Notaðu ▶ örvatakkann til að renna flöktandi punktinum. Meðan þú horfir á krossinn skaltu fylgjast með flöktandi punktinum í augnkróknum og renna honum til hægri og vinstri þar til hann hverfur í blindblettinn þinn.\n3. Smelltu á bilsstikuna.\nATH: Hafðu auga með krossinum. Flikkandi punkturinn hverfur ekki á meðan augað þitt fylgist með honum.",id:"1. Tutup mata KIRI Anda. (Ini adalah sisi kiri layar.)\n2. Gunakan tombol panah ▶ untuk menggeser titik yang berkedip-kedip. Sambil melihat salib, pantau titik yang berkedip-kedip di sudut mata Anda, lalu geser ke kanan dan ke kiri hingga menghilang di titik buta Anda.\n3. Tekan bilah SPASI.\nCATATAN: Perhatikan salib. Titik yang berkedip-kedip tidak akan hilang selama mata Anda mengikutinya.",it:"1. Chiudi l'occhio SINISTRO. (Questo è il lato sinistro dello schermo.)\n2. Usa il tasto freccia ▶ per spostare il punto lampeggiante. Mentre guardi la croce, monitora il punto lampeggiante con la coda dell'occhio e spostalo a destra e a sinistra finché non scompare nel tuo punto cieco.\n3. Premi la barra SPAZIATRICE.\nNOTA: Tieni l'occhio sulla croce. Il punto lampeggiante non scomparirà mentre il tuo occhio lo segue.",ja:"1. 左目を閉じます。 (こちらは画面左側です。)\n2. ▶ 矢印キーを使用して、点滅するドットをスライドします。十字を見ながら、目の隅にある点がちらつくのを観察し、それが死角に消えるまで左右にスライドさせます。\n3. スペースバーを押します。\n注: 十字架から目を離さないでください。点滅するドットは、目で追っている間は消えません。",kn:"1. ನಿಮ್ಮ ಎಡಗಣ್ಣನ್ನು ಮುಚ್ಚಿ. (ಇದು ಪರದೆಯ ಎಡಭಾಗವಾಗಿದೆ.)\n2. ಮಿನುಗುವ ಡಾಟ್ ಅನ್ನು ಸ್ಲೈಡ್ ಮಾಡಲು ▶ ಬಾಣದ ಕೀಲಿಯನ್ನು ಬಳಸಿ. ಶಿಲುಬೆಯನ್ನು ನೋಡುವಾಗ, ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಲ್ಲಿರುವ ಮಿನುಗುವ ಚುಕ್ಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ ಮತ್ತು ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾಗುವವರೆಗೆ ಅದನ್ನು ಬಲಕ್ಕೆ ಮತ್ತು ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ.\n3. SPACE ಬಾರ್ ಅನ್ನು ಹಿಟ್ ಮಾಡಿ.\nಸೂಚನೆ: ಶಿಲುಬೆಯ ಮೇಲೆ ನಿಮ್ಮ ಕಣ್ಣನ್ನು ಇರಿಸಿ. ನಿಮ್ಮ ಕಣ್ಣು ಅದನ್ನು ಅನುಸರಿಸುವಾಗ ಮಿನುಗುವ ಚುಕ್ಕೆ ಮಾಯವಾಗುವುದಿಲ್ಲ.",ko:"1. 왼쪽 눈을 감으세요. (화면의 왼쪽 부분입니다.)\n2. ▶ 화살표 키를 이용하여 깜박이는 점을 슬라이드 하세요. 십자가를 보면서 눈꼬리의 깜박이는 점을 관찰하고 그것이 사각지대에 사라질 때까지 좌우로 밀어 넣으십시오.\n3. 스페이스바를 누르세요.\n참고: 십자가를 바라보십시오. 깜박이는 점은 눈이 따라가는 동안 사라지지 않습니다.",lt:"1. Užmerkite KAIRIĄ akį. (Tai yra kairėje ekrano pusėje.)\n2. Norėdami slysti mirgantį tašką, naudokite rodyklės klavišą ▶. Žiūrėdami į kryžių, stebėkite mirgantį tašką akies kamputyje ir slinkite jį į dešinę ir į kairę, kol jis išnyks jūsų aklojoje zonoje.\n3. Paspauskite tarpo klavišą.\nPASTABA: stebėkite kryžių. Mirgantis taškas neišnyks, kol akis jį seks.",ms:"1. Tutup mata KIRI anda. (Ini adalah bahagian kiri skrin.)\n2. Gunakan kekunci anak panah ▶ untuk meluncurkan titik berkelip. Semasa melihat salib, pantau titik berkelip di sudut mata anda, dan luncurkannya ke kanan dan kiri sehingga ia hilang ke titik buta anda.\n3. Tekan bar SPACE.\nNOTA: Perhatikan salib. Titik yang berkelip tidak akan hilang semasa mata anda mengikutinya.",ml:"1. നിങ്ങളുടെ ഇടത് കണ്ണ് അടയ്ക്കുക. (ഇത് സ്ക്രീനിൻ്റെ ഇടതുവശത്താണ്.)\n2. മിന്നുന്ന ഡോട്ട് സ്ലൈഡ് ചെയ്യാൻ ▶ ആരോ കീ ഉപയോഗിക്കുക. കുരിശിലേക്ക് നോക്കുമ്പോൾ, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിലുള്ള മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുക, അത് നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അപ്രത്യക്ഷമാകുന്നതുവരെ വലത്തോട്ടും ഇടത്തോട്ടും സ്ലൈഡ് ചെയ്യുക.\n3. SPACE ബാറിൽ അമർത്തുക.\nശ്രദ്ധിക്കുക: കുരിശിൽ നിങ്ങളുടെ കണ്ണ് വയ്ക്കുക. നിങ്ങളുടെ കണ്ണ് അതിനെ പിന്തുടരുമ്പോൾ മിന്നുന്ന ഡോട്ട് അപ്രത്യക്ഷമാകില്ല.",no:"1. Lukk VENSTRE øye. (Dette er venstre side av skjermen.)\n2. Bruk piltasten ▶ for å skyve den flimrende prikken. Mens du ser på korset, overvåk den flimrende prikken i øyekroken, og skyv den til høyre og venstre til den forsvinner inn i blindsonen.\n3. Trykk på MELLOMROM.\nMERK: Hold øye med korset. Den flimrende prikken forsvinner ikke mens øyet følger den.",fa:"1. چشم چپ خود را ببندید. (این سمت چپ صفحه است.)\n2. از کلید پیکان ▶ برای بلغزاندن نقطه سوسوزن استفاده کنید. در حالی که به صلیب نگاه می کنید، نقطه سوسو زن گوشه چشم خود را زیر نظر بگیرید و آن را به راست و چپ بلغزانید تا در نقطه کور ناپدید شود.\n3. نوار SPACE را بزنید.\nتوجه: چشم خود را روی صلیب نگه دارید. وقتی چشم شما آن را دنبال می کند، نقطه سوسو ناپدید نمی شود.",pl:"1. Zamknij LEWE oko. (To jest lewa strona ekranu.)\n2. Użyj klawisza strzałki ▶, aby przesunąć migoczącą kropkę. Patrząc na krzyżyk, obserwuj migoczącą kropkę w kąciku oka i przesuwaj ją w prawo i w lewo, aż zniknie w twoim martwym punkcie.\n3. Naciśnij spację.\nUWAGA: Nie spuszczaj oka z krzyża. Migocząca kropka nie zniknie, gdy Twoje oko będzie za nią podążać.",pt:"1. Feche o olho ESQUERDO. (Este é o lado esquerdo da tela.)\n2. Use a tecla de seta ▶ para deslizar o ponto trêmulo. Enquanto olha para a cruz, monitore o ponto tremeluzente no canto do olho e deslize-o para a direita e para a esquerda até que desapareça no ponto cego.\n3. Clique na barra de ESPAÇO.\nNOTA: Fique de olho na cruz. O ponto tremeluzente não desaparecerá enquanto seu olho o seguir.",ro:"1. Închide ochiul STÂNG. (Aceasta este partea stângă a ecranului.)\n2. Folosiți tasta săgeată ▶ pentru a glisa punctul care pâlpâie. În timp ce te uiți la cruce, monitorizează punctul care pâlpâie din colțul ochiului și glisează-l la dreapta și la stânga până când dispare în punctul tău mort.\n3. Apăsați bara SPAȚIU.\nNOTĂ: Țineți ochii pe cruce. Punctul care pâlpâie nu va dispărea în timp ce ochiul tău îl urmărește.",ru:"1. Закройте ЛЕВЫЙ глаз. (Это левая часть экрана.)\n2. С помощью клавиши со стрелкой ▶ переместите мерцающую точку. Глядя на крест, следите за мерцающей точкой в ​​уголке глаза и перемещайте ее вправо и влево, пока она не исчезнет в вашей слепой зоне.\n3. Нажмите клавишу ПРОБЕЛ.\nПРИМЕЧАНИЕ. Следите за крестом. Мерцающая точка не исчезнет, ​​пока ваш глаз будет следить за ней.",sr:"1. Затворите ЛЕВО око. (Ово је лева страна екрана.)\n2. Користите тастер са стрелицом ▶ да померите тачку која трепери. Док гледате у крст, пратите трепераву тачку у углу ока и померајте је десно и лево док не нестане у вашој слепој тачки.\n3. Притисните размакницу.\nНАПОМЕНА: Пазите на крст. Тачка која трепери неће нестати док је ваше око прати.",es:"1. Cierra tu ojo IZQUIERDO. (Este es el lado izquierdo de la pantalla.)\n2. Usa la tecla de flecha ▶ para deslizar el punto parpadeante. Mientras miras la cruz, observa el punto parpadeante en el rabillo del ojo y deslízalo hacia la derecha e izquierda hasta que desaparezca en tu punto ciego.\n3. Presiona la barra ESPACIADORA.\nNOTA: Mantén tu ojo en la cruz. El punto parpadeante no desaparecerá mientras tu ojo lo siga.",sw:"1. Funga jicho lako la KUSHOTO. (Huu ni upande wa kushoto wa skrini.)\n2. Tumia ▶ kitufe cha mshale kutelezesha kitone kinachopeperusha. Unapoutazama msalaba, fuatilia kitone kinachopepea kwenye kona ya jicho lako, na telezesha kulia na kushoto hadi kipotee kwenye sehemu yako ya upofu.\n3. Piga upau wa SPACE.\nKUMBUKA: Weka macho yako msalabani. Nukta inayopepea haitatoweka jicho lako likiifuata.",sv:"1. Stäng ditt VÄNSTER öga. (Detta är den vänstra sidan av skärmen.)\n2. Använd piltangenten ▶ för att skjuta den flimrande punkten. Medan du tittar på korset, övervaka den flimrande punkten i ögonvrån och skjut den åt höger och vänster tills den försvinner i din döda vinkel.\n3. Tryck på MELLANSLAG.\nOBS: Håll ögonen på korset. Den flimrande punkten försvinner inte medan ditt öga följer den.",tl:"1. Ipikit ang KALIWA mong mata. (Ito ang kaliwang bahagi ng screen.)\n2. Gamitin ang ▶ arrow key upang i-slide ang kumikislap na tuldok. Habang nakatingin sa krus, subaybayan ang kumikislap na tuldok sa sulok ng iyong mata, at i-slide ito pakanan at pakaliwa hanggang mawala ito sa iyong blindspot.\n3. Pindutin ang SPACE bar.\nTANDAAN: Itutok ang iyong mata sa krus. Hindi mawawala ang kumikislap na tuldok habang sinusundan ito ng iyong mata.",tr:"1. SOL gözünüzü kapatın. (Bu ekranın sol tarafıdır.)\n2. Titreşen noktayı kaydırmak için ▶ ok tuşunu kullanın. Çarmıha bakarken gözünüzün köşesinde titreyen noktayı izleyin ve kör noktanızda kaybolana kadar sağa ve sola kaydırın.\n3. BOŞLUK çubuğuna basın.\nNOT: Gözünüzü çarmıhta tutun. Titreşen nokta, gözünüz onu takip ederken kaybolmaz.",ur:"1. اپنی بائیں آنکھ بند کریں۔ (یہ اسکرین کا بائیں جانب ہے۔)\n2۔ ٹمٹماتے نقطے کو سلائیڈ کرنے کے لیے ▶ تیر والی کلید کا استعمال کریں۔ کراس کو دیکھتے ہوئے، اپنی آنکھ کے کونے میں ٹمٹماتے نقطے کی نگرانی کریں، اور اسے دائیں اور بائیں سلائیڈ کریں جب تک کہ یہ آپ کے بلائنڈ سپاٹ میں غائب نہ ہوجائے۔\n3. اسپیس بار کو دبائیں۔\nنوٹ: اپنی نظر صلیب پر رکھیں۔ جب آپ کی آنکھ اس کی پیروی کرے گی تو ٹمٹماتا نقطہ غائب نہیں ہوگا۔"},RC_distanceTrackingCloseR:{"en-US":"1. Close your RIGHT eye. (This is the right side of the screen.)\n2. Use the arrow key ◀ to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it left and right until it disappears into your blindspot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",ar:"1. أغلق عينك اليمنى. (هذا هو الجانب الأيمن من الشاشة.)\n2. استخدم مفتاح السهم ◀ لتحريك النقطة الوميضية. أثناء النظر إلى الصليب، راقب النقطة الوميضية في زاوية عينك، وحركها لليسار واليمين حتى تختفي في النقطة العمياء.\n3. اضغط على مفتاح المسافة.\nملاحظة: حافظ على عينك على الصليب. لن تختفي النقطة الوميضية بينما تتابعها عينك.",hy:"1. Փակեք ձեր աջ աչքը։ (Սա էկրանի աջ կողմն է):\n2. Օգտագործեք ◀ սլաքի ստեղնը՝ թարթող կետը սահեցնելու համար: Խաչին նայելիս հետևեք ձեր աչքի անկյունում առկա թարթող կետին և սահեցրեք այն աջ ու ձախ, մինչև այն անհետանա ձեր կույր կետում:\n3. Կտտացրեք SPACE սանդղակը:\nԾԱՆՈԹՈՒԹՅՈՒՆ. Աչքդ պահիր խաչի վրա: Թարթող կետը չի անհետանա, քանի դեռ ձեր աչքը հետևում է դրան:",bg:"1. Затворете ДЯСНОТО око. (Това е дясната страна на екрана.)\n2. Използвайте клавиша със стрелка ◀, за да плъзнете мигащата точка. Докато гледате кръста, наблюдавайте мигащата точка в ъгъла на окото си и я плъзгайте наляво и надясно, докато изчезне в сляпото петно.\n3. Натиснете ИНТЕРВАЛ.\nЗАБЕЛЕЖКА: Дръжте под око кръста. Трепкащата точка няма да изчезне, докато окото ви я следи.","zh-CN":"1. 闭上右眼。 (这是屏幕的右侧。)\n2. 使用箭头键 ◀ 滑动闪烁的点。看着十字架时,用眼角余光观察闪烁的点,然后左右滑动它,直到它消失在您的盲点中。\n3. 按空格键。\n注意:请密切关注十字架。当您的眼睛跟随闪烁的点时,它不会消失。","zh-HK":"1. 閉上右眼。 (這是螢幕的右側。)\n2. 使用箭頭鍵 ◀ 滑動閃爍的點。看著十字架時,用眼角余光觀察閃爍的點,然後左右滑動它,直到它消失在您的盲點中。\n3. 按空白鍵。\n注意:請密切注意十字架。當您的眼睛跟隨閃爍的點時,它不會消失。",hr:"1. Zatvorite DESNO oko. (Ovo je desna strana ekrana.)\n2. Koristite tipku sa strelicom ◀ za pomicanje treperave točke. Dok gledate u križ, pratite treperavu točku u kutu oka i pomičite je lijevo-desno dok ne nestane u vašoj slijepoj točki.\n3. Pritisnite RAZMAKNICU.\nNAPOMENA: Pazite na križ. Trepereća točka neće nestati dok je vaše oko prati.",cs:"1. Zavřete PRAVÉ oko. (Toto je pravá strana obrazovky.)\n2. Pomocí tlačítka se šipkou ◀ posuňte blikající bod. Při pohledu na kříž sledujte blikající tečku v koutku oka a posouvejte ji doleva a doprava, dokud nezmizí ve slepém úhlu.\n3. Stiskněte MEZERNÍK.\nPOZNÁMKA: Mějte oči na kříži. Blikající tečka nezmizí, když ji vaše oko sleduje.",da:"1. Luk dit HØJRE øje. (Dette er højre side af skærmen.)\n2. Brug piletasten ◀ til at skubbe den flimrende prik. Mens du ser på korset, skal du overvåge den flimrende prik i øjenkrogen og glide den til venstre og højre, indtil den forsvinder ind i din blindspot.\n3. Tryk på MELLEMRUM.\nBEMÆRK: Hold øje med korset. Den flimrende prik forsvinder ikke, mens dit øje følger den.",nl:"1. Sluit uw RECHTERoog. (Dit is de rechterkant van het scherm.)\n2. Gebruik de pijltjestoets ◀ om de flikkerende stip te verschuiven. Terwijl je naar het kruis kijkt, let je op de flikkerende stip in je ooghoek en schuif je deze naar links en rechts totdat deze in je blinde vlek verdwijnt.\n3. Druk op de SPATIEBALK.\nOPMERKING: Houd het kruis in de gaten. De flikkerende stip verdwijnt niet terwijl uw oog hem volgt.","en-UK":"1. Close your RIGHT eye. (This is the right side of the screen.)\n2. Use the arrow key ◀ to slide the flickering dot. While looking at the cross, monitor the flickering dot in the corner of your eye, and slide it left and right until it disappears into your blind spot.\n3. Hit the SPACE bar.\nNOTE: Keep your eye on the cross. The flickering dot won't disappear while your eye follows it.",fi:"1. Sulje OIKEA silmäsi. (Tämä on näytön oikea puoli.)\n2. Liu'uta välkkyvää pistettä nuolinäppäimellä ◀. Kun katsot ristiä, tarkkaile välkkyvää pistettä silmän kulmassa ja liu'uta sitä vasemmalle ja oikealle, kunnes se katoaa sokealle pisteelle.\n3. Paina VÄLINÄPPÄINTÄ.\nHUOMAA: Pidä silmäsi ristissä. Välkkyvä piste ei katoa, kun silmäsi seuraa sitä.",fr:"1. Fermez votre œil DROIT. (C'est le côté droit de l'écran.)\n2. Utilisez la touche fléchée ◀ pour faire glisser le point clignotant. Tout en regardant la croix, surveillez le point clignotant du coin de votre œil et faites-le glisser de gauche à droite jusqu'à ce qu'il disparaisse dans votre angle mort.\n3. Appuyez sur la barre d'ESPACE.\nREMARQUE : Gardez votre œil sur la croix. Le point clignotant ne disparaîtra pas tant que votre œil le suit.",de:"1. Schließen Sie Ihr RECHTES Auge. (Dies ist die rechte Seite des Bildschirms.)\n2. Verwenden Sie die Pfeiltaste ◀, um den flackernden Punkt zu verschieben. Achten Sie beim Betrachten des Kreuzes auf den flackernden Punkt in Ihrem Augenwinkel und schieben Sie ihn nach links und rechts, bis er in Ihrem toten Winkel verschwindet.\n3. Drücken Sie die LEERTASTE.\nHINWEIS: Behalten Sie das Kreuz im Auge. Der flackernde Punkt verschwindet nicht, solange Ihr Auge ihm folgt.",el:"1. Κλείστε το ΔΕΞΙ μάτι. (Αυτή είναι η δεξιά πλευρά της οθόνης.)\n2. Χρησιμοποιήστε το πλήκτρο βέλους ◀ για να σύρετε την κουκκίδα που τρεμοπαίζει. Ενώ κοιτάτε τον σταυρό, παρακολουθήστε την κουκκίδα που τρεμοπαίζει στη γωνία του ματιού σας και σύρετέ την αριστερά και δεξιά μέχρι να εξαφανιστεί στο τυφλό σημείο σας.\n3. Πατήστε τη γραμμή SPACE.\nΣΗΜΕΙΩΣΗ: Κράτα το μάτι σου στον σταυρό. Η κουκκίδα που τρεμοπαίζει δεν θα εξαφανιστεί όσο το μάτι σας την ακολουθεί.",he:"1. עצמו את העין הימנית. (זהו הצד הימני של המסך.)\n2. השתמש במקש החץ ◀ כדי להחליק את הנקודה המהבהבת. תוך כדי הסתכלות על הצלב, עקוב אחר הנקודה המהבהבת בזווית העין שלך, והחלק אותה ימינה ושמאלה עד שהיא נעלמת בנקודה העיוורת שלך.\n3. לחץ על מקש הרווח.\nהערה: שימו עין על הצלב. הנקודה המרצדת לא תיעלם בזמן שהעין שלך עוקבת אחריה.",hi:"1. अपनी दाहिनी आंख बंद करें। (यह स्क्रीन का दाहिनी ओर है।)\n2. टिमटिमाते बिंदु को स्लाइड करने के लिए तीर कुंजी ◀ का उपयोग करें। क्रॉस को देखते समय, अपनी आंख के कोने में टिमटिमाते बिंदु पर नज़र रखें, और इसे तब तक बाएँ और दाएँ सरकाएँ जब तक कि यह आपके ब्लाइंडस्पॉट में गायब न हो जाए।\n3. स्पेस बार दबाएँ।\nध्यान दें: अपनी नज़र क्रॉस पर रखें। जब तक आपकी आंख इसका अनुसरण करेगी तब तक टिमटिमाता हुआ बिंदु गायब नहीं होगा।",hu:"1. Csukja be JOBB szemét. (Ez a képernyő jobb oldala.)\n2. A ◀ nyílbillentyűvel csúsztassa el a villogó pontot. Miközben a keresztre néz, figyelje a villogó pontot a szeme sarkában, és csúsztassa balra-jobbra, amíg el nem tűnik a vakfoltban.\n3. Nyomja meg a SZÓKÖZ billentyűt.\nMEGJEGYZÉS: Tartsa szemét a kereszten. A pislákoló pont nem tűnik el, miközben a szemed követi.",is:"1. Lokaðu HÆGRA auga. (Þetta er hægra megin á skjánum.)\n2. Notaðu örvatakkann ◀ til að renna flöktandi punktinum. Meðan þú horfir á krossinn skaltu fylgjast með flöktandi punktinum í augnkróknum og renna honum til vinstri og hægri þar til hann hverfur í blindblettinn þinn.\n3. Smelltu á bilsstikuna.\nATH: Hafðu auga með krossinum. Flikkandi punkturinn hverfur ekki á meðan augað þitt fylgist með honum.",id:"1. Tutup mata KANAN Anda. (Ini adalah sisi kanan layar.)\n2. Gunakan tombol panah ◀ untuk menggeser titik yang berkedip-kedip. Sambil melihat salib, pantau titik yang berkedip-kedip di sudut mata Anda, lalu geser ke kiri dan ke kanan hingga menghilang di titik buta Anda.\n3. Tekan bilah SPASI.\nCATATAN: Perhatikan salib. Titik yang berkedip-kedip tidak akan hilang selama mata Anda mengikutinya.",it:"1. Chiudi l'occhio DESTRO. (Questo è il lato destro dello schermo.) 2. Usa il tasto freccia ◀ per far scorrere il punto lampeggiante. Mentre guardi la croce, monitora il punto lampeggiante con la coda dell'occhio e fallo scorrere a sinistra e a destra finché non scompare nel tuo punto cieco. 3. Premi la barra SPAZIATRICE. NOTA: Tieni l'occhio sulla croce. Il punto lampeggiante non scomparirà mentre il tuo occhio lo segue.",ja:"1. 右目を閉じます。 (画面右側です。)\n2. 矢印キー ◀ を使用して、点滅するドットをスライドします。十字架を見ながら、目の隅にある点がちらつくのを観察し、それが死角に消えるまで左右にスライドさせます。\n3. スペースバーを押します。\n注: 十字架から目を離さないでください。点滅するドットは、目で追っている間は消えません。",kn:"1. ನಿಮ್ಮ ಬಲಗಣ್ಣನ್ನು ಮುಚ್ಚಿ. (ಇದು ಪರದೆಯ ಬಲಭಾಗವಾಗಿದೆ.)\n2. ಮಿನುಗುವ ಡಾಟ್ ಅನ್ನು ಸ್ಲೈಡ್ ಮಾಡಲು ಬಾಣದ ಕೀ ◀ ಬಳಸಿ. ಶಿಲುಬೆಯನ್ನು ನೋಡುವಾಗ, ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಲ್ಲಿ ಮಿನುಗುವ ಚುಕ್ಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ ಮತ್ತು ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾಗುವವರೆಗೆ ಎಡಕ್ಕೆ ಮತ್ತು ಬಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ.\n3. SPACE ಬಾರ್ ಅನ್ನು ಹಿಟ್ ಮಾಡಿ.\nಸೂಚನೆ: ಶಿಲುಬೆಯ ಮೇಲೆ ನಿಮ್ಮ ಕಣ್ಣನ್ನು ಇರಿಸಿ. ನಿಮ್ಮ ಕಣ್ಣು ಅದನ್ನು ಅನುಸರಿಸುವಾಗ ಮಿನುಗುವ ಚುಕ್ಕೆ ಮಾಯವಾಗುವುದಿಲ್ಲ.",ko:"1. 오른쪽 눈을 감으세요. (화면의 오른쪽 부분입니다.)\n2. 화살표 키를 사용하여 깜박이는 점을 이동합니다. 십자가를 보면서 눈꼬리의 깜박이는 점을 관찰하고 그것이 사각지대에 사라질 때까지 좌우로 밀어 넣으십시오.\n3. 스페이스바를 누르세요.\n참고: 십자가를 바라보십시오. 깜박이는 점은 눈이 따라가는 동안 사라지지 않습니다.",lt:"1. Užmerkite DEŠINĮ akį. (Tai yra dešinėje ekrano pusėje.)\n2. Naudokite rodyklės klavišą ◀, kad slystumėte mirksintį tašką. Žiūrėdami į kryžių, stebėkite mirgantį tašką akies kamputyje ir slinkite jį kairėn ir dešinėn, kol jis išnyks jūsų aklojoje zonoje.\n3. Paspauskite tarpo klavišą.\nPASTABA: stebėkite kryžių. Mirgantis taškas neišnyks, kol akis jį seks.",ms:"1. Tutup mata KANAN anda. (Ini adalah bahagian kanan skrin.)\n2. Gunakan kekunci anak panah ◀ untuk meluncurkan titik berkelip. Semasa melihat salib, pantau titik berkelip di sudut mata anda, dan luncurkannya ke kiri dan kanan sehingga ia hilang ke titik buta anda.\n3. Tekan bar SPACE.\nNOTA: Perhatikan salib. Titik yang berkelip tidak akan hilang semasa mata anda mengikutinya.",ml:"1. നിങ്ങളുടെ വലത് കണ്ണ് അടയ്ക്കുക. (ഇത് സ്ക്രീനിൻ്റെ വലതുഭാഗമാണ്.)\n2. മിന്നുന്ന ഡോട്ട് സ്ലൈഡ് ചെയ്യാൻ അമ്പടയാള കീ ◀ ഉപയോഗിക്കുക. കുരിശിലേക്ക് നോക്കുമ്പോൾ, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിലുള്ള മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുക, അത് നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അപ്രത്യക്ഷമാകുന്നതുവരെ ഇടത്തോട്ടും വലത്തോട്ടും സ്ലൈഡ് ചെയ്യുക.\n3. SPACE ബാറിൽ അമർത്തുക.\nശ്രദ്ധിക്കുക: കുരിശിൽ നിങ്ങളുടെ കണ്ണ് വയ്ക്കുക. നിങ്ങളുടെ കണ്ണ് അതിനെ പിന്തുടരുമ്പോൾ മിന്നുന്ന ഡോട്ട് അപ്രത്യക്ഷമാകില്ല.",no:"1. Lukk HØYRE øye. (Dette er høyre side av skjermen.)\n2. Bruk piltasten ◀ for å skyve den flimrende prikken. Mens du ser på korset, overvåk den flimrende prikken i øyekroken, og skyv den til venstre og høyre til den forsvinner inn i blindsonen.\n3. Trykk på MELLOMROM.\nMERK: Hold øye med korset. Den flimrende prikken forsvinner ikke mens øyet følger den.",fa:"1. چشم راست خود را ببندید. (این سمت راست صفحه است.)\n2. از کلید پیکان ◀ برای بلغزاندن نقطه سوسوزن استفاده کنید. در حالی که به صلیب نگاه می کنید، نقطه سوسوی گوشه چشم خود را زیر نظر بگیرید و آن را به چپ و راست بلغزانید تا در نقطه کور ناپدید شود.\n3. نوار SPACE را بزنید.\nتوجه: چشم خود را روی صلیب نگه دارید. وقتی چشم شما آن را دنبال می کند، نقطه سوسو ناپدید نمی شود.",pl:"1. Zamknij PRAWE oko. (To jest prawa strona ekranu.)\n2. Użyj klawisza strzałki ◀, aby przesunąć migoczącą kropkę. Patrząc na krzyżyk, obserwuj migoczącą kropkę w kąciku oka i przesuwaj ją w lewo i prawo, aż zniknie w twoim martwym punkcie.\n3. Naciśnij spację.\nUWAGA: Nie spuszczaj oka z krzyża. Migocząca kropka nie zniknie, gdy Twoje oko będzie za nią podążać.",pt:"1. Feche o olho DIREITO. (Este é o lado direito da tela.)\n2. Use a tecla de seta ◀ para deslizar o ponto tremeluzente. Enquanto olha para a cruz, monitore o ponto tremeluzente no canto do olho e deslize-o para a esquerda e para a direita até que desapareça no ponto cego.\n3. Clique na barra de ESPAÇO.\nNOTA: Fique de olho na cruz. O ponto tremeluzente não desaparecerá enquanto seu olho o seguir.",ro:"1. Închide ochiul DREPT. (Aceasta este partea dreaptă a ecranului.)\n2. Folosiți tasta săgeată ◀ pentru a glisa punctul care pâlpâie. În timp ce te uiți la cruce, monitorizează punctul care pâlpâie din colțul ochiului și glisează-l la stânga și la dreapta până când dispare în punctul orb.\n3. Apăsați bara SPAȚIU.\nNOTĂ: Țineți ochii pe cruce. Punctul care pâlpâie nu va dispărea în timp ce ochiul tău îl urmărește.",ru:"1. Закройте ПРАВЫЙ глаз. (Это правая часть экрана.)\n2. С помощью клавиши со стрелкой ◀ переместите мерцающую точку. Глядя на крест, следите за мерцающей точкой в ​​уголке глаза и перемещайте ее влево и вправо, пока она не исчезнет в вашей слепой зоне.\n3. Нажмите клавишу ПРОБЕЛ.\nПРИМЕЧАНИЕ. Следите за крестом. Мерцающая точка не исчезнет, ​​пока ваш глаз будет следить за ней.",sr:"1. Затворите ДЕСНО око. (Ово је десна страна екрана.)\n2. Користите тастер са стрелицом ◀ да померите тачку која трепери. Док гледате у крст, пратите трепераву тачку у углу ока и померајте је лево-десно док не нестане у вашој слепој тачки.\n3. Притисните размакницу.\nНАПОМЕНА: Пазите на крст. Тачка која трепери неће нестати док је ваше око прати.",es:"1. Cierra tu ojo DERECHO. (Este es el lado derecho de la pantalla.) 2. Usa la tecla de flecha ◀ para deslizar el punto parpadeante. Mientras miras la cruz, observa el punto parpadeante en el rabillo del ojo y deslízalo hacia la izquierda y la derecha hasta que desaparezca en tu punto ciego. 3. Presiona la barra ESPACIADORA. NOTA: Mantén tu ojo en la cruz. El punto parpadeante no desaparecerá mientras tu ojo lo siga.",sw:"1. Funga jicho lako la KULIA. (Huu ndio upande wa kulia wa skrini.)\n2. Tumia kitufe cha mshale ◀ kutelezesha kitone kinachoelea. Unapotazama msalaba, fuatilia kitone kinachopepea kwenye kona ya jicho lako, na ukitelezeshe kushoto na kulia hadi kipotee kwenye upofu wako.\n3. Piga upau wa SPACE.\nKUMBUKA: Weka macho yako msalabani. Nukta inayopepea haitatoweka jicho lako likiifuata.",sv:"1. Slut ditt HÖGER öga. (Detta är den högra sidan av skärmen.)\n2. Använd piltangenten ◀ för att skjuta den flimrande punkten. Medan du tittar på korset, övervaka den flimrande punkten i ögonvrån och skjut den åt vänster och höger tills den försvinner i din döda vinkel.\n3. Tryck på MELLANSLAG.\nOBS: Håll ögonen på korset. Den flimrande punkten försvinner inte medan ditt öga följer den.",tl:"1. Ipikit mo ang KANAN mong mata. (Ito ang kanang bahagi ng screen.)\n2. Gamitin ang arrow key ◀ upang i-slide ang kumikislap na tuldok. Habang nakatingin sa krus, subaybayan ang kumukutitap na tuldok sa sulok ng iyong mata, at i-slide ito pakaliwa at pakanan hanggang mawala ito sa iyong blindspot.\n3. Pindutin ang SPACE bar.\nTANDAAN: Itutok ang iyong mata sa krus. Hindi mawawala ang kumikislap na tuldok habang sinusundan ito ng iyong mata.",tr:"1. SAĞ gözünüzü kapatın. (Bu, ekranın sağ tarafıdır.)\n2. Titreşen noktayı kaydırmak için ok tuşunu ◀ kullanın. Çarmıha bakarken gözünüzün köşesinde titreyen noktayı izleyin ve kör noktanızda kaybolana kadar sola ve sağa kaydırın.\n3. BOŞLUK çubuğuna basın.\nNOT: Gözünüzü çarmıhta tutun. Titreşen nokta, gözünüz onu takip ederken kaybolmaz.",ur:"1. اپنی دائیں آنکھ بند کریں۔ (یہ اسکرین کا دائیں طرف ہے۔)\n2۔ ٹمٹماتے نقطے کو سلائیڈ کرنے کے لیے تیر والی کلید ◀ استعمال کریں۔ کراس کو دیکھتے ہوئے، اپنی آنکھ کے کونے میں ٹمٹماتے نقطے کی نگرانی کریں، اور اسے بائیں اور دائیں سلائیڈ کریں جب تک کہ یہ آپ کے بلائنڈ سپاٹ میں غائب نہ ہوجائے۔\n3. اسپیس بار کو دبائیں۔\nنوٹ: اپنی نظر صلیب پر رکھیں۔ جب آپ کی آنکھ اس کی پیروی کرے گی تو ٹمٹماتا نقطہ غائب نہیں ہوگا۔"},RC_distanceTrackingGuide:{"en-US":"Your eyes are xx1 cm from the screen, but the experiment needs xx2 cm. The experiment will resume when you reach the correct distance.",ar:"عيناك تبعدان xx1 سم عن الشاشة، لكن التجربة تحتاج إلى xx2 سم. ستستأنف التجربة عندما تصل إلى المسافة الصحيحة.",hy:"Ձեր աչքերը էկրանից հեռու են xx1 սմ, բայց փորձի համար անհրաժեշտ է xx2 սմ: Փորձը կվերսկսվի, երբ հասնեք ճիշտ հեռավորությանը:",bg:"Очите ви са на xx1 cm от екрана, но за експеримента са необходими xx2 cm. Експериментът ще се възобнови, когато достигнете правилното разстояние.","zh-CN":"你的眼睛距屏幕 xx1 厘米,但实验需要 xx2 厘米。当您到达正确的距离时,实验将继续。","zh-HK":"你的眼睛距離螢幕 xx1 厘米,但實驗需要 xx2 厘米。當您到達正確的距離時,實驗將繼續。",hr:"Vaše oči udaljene su xx1 cm od ekrana, ali eksperiment treba xx2 cm. Eksperiment će se nastaviti kada dosegnete točnu udaljenost.",cs:"Vaše oči jsou xx1 cm od obrazovky, ale experiment potřebuje xx2 cm. Experiment bude pokračovat, když dosáhnete správné vzdálenosti.",da:"Dine øjne er xx1 cm fra skærmen, men eksperimentet skal bruge xx2 cm. Eksperimentet genoptages, når du når den korrekte afstand.",nl:"Je ogen bevinden zich op xx1 cm van het scherm, maar voor het experiment is xx2 cm nodig. Het experiment wordt hervat zodra u de juiste afstand heeft bereikt.","en-UK":"Your eyes are xx1 cm from the screen, but the experiment needs xx2 cm. The experiment will resume when you reach the correct distance.",fi:"Silmäsi ovat xx1 cm näytöstä, mutta kokeeseen tarvitaan xx2 cm. Kokeilu jatkuu, kun saavutat oikean etäisyyden.",fr:"Vos yeux sont à xx1 cm de l'écran, mais l'expérience nécessite xx2 cm. L'expérience reprendra lorsque vous atteindrez la distance correcte.",de:"Ihre Augen sind xx1 cm vom Bildschirm entfernt, aber das Experiment benötigt xx2 cm. Das Experiment wird fortgesetzt, wenn Sie den richtigen Abstand erreicht haben.",el:"Τα μάτια σας απέχουν xx1 cm από την οθόνη, αλλά το πείραμα χρειάζεται xx2 cm. Το πείραμα θα συνεχιστεί όταν φτάσετε στη σωστή απόσταση.",he:'העיניים שלך מרוחקות xx1 ס"מ מהמסך, אבל הניסוי צריך xx2 ס"מ. הניסוי יתחדש כאשר תגיע למרחק הנכון.',hi:"आपकी आंखें स्क्रीन से xx1 सेमी दूर हैं, लेकिन प्रयोग के लिए xx2 सेमी की आवश्यकता है। जब आप सही दूरी पर पहुंच जाएंगे तो प्रयोग फिर से शुरू हो जाएगा।",hu:"A szeme xx1 cm-re van a képernyőtől, de a kísérlethez xx2 cm-re van szüksége. A kísérlet akkor folytatódik, ha eléri a megfelelő távolságot.",is:"Augun þín eru xx1 cm frá skjánum, en tilraunin þarf xx2 cm. Tilraunin mun halda áfram þegar þú nærð réttri fjarlægð.",id:"Mata Anda berjarak xx1 cm dari layar, namun eksperimen memerlukan xx2 cm. Eksperimen akan dilanjutkan ketika Anda mencapai jarak yang benar.",it:"I tuoi occhi sono a xx1 cm dallo schermo, ma l'esperimento richiede xx2 cm. L'esperimento riprenderà quando raggiungerai la distanza corretta.",ja:"あなたの目は画面から xx1 cm 離れていますが、実験には xx2 cm が必要です。正しい距離に到達すると実験が再開されます。",kn:"ನಿಮ್ಮ ಕಣ್ಣುಗಳು ಪರದೆಯಿಂದ xx1 cm, ಆದರೆ ಪ್ರಯೋಗಕ್ಕೆ xx2 cm ಅಗತ್ಯವಿದೆ. ನೀವು ಸರಿಯಾದ ದೂರವನ್ನು ತಲುಪಿದಾಗ ಪ್ರಯೋಗವು ಪುನರಾರಂಭವಾಗುತ್ತದೆ.",ko:"당신의 눈은 화면에서 xx1cm 떨어져 있지만 실험에는 xx2cm가 필요합니다. 올바른 거리에 도달하면 실험이 재개됩니다.",lt:"Jūsų akys yra xx1 cm atstumu nuo ekrano, bet eksperimentui reikia xx2 cm. Eksperimentas bus tęsiamas, kai pasieksite reikiamą atstumą.",ms:"Mata anda adalah xx1 cm dari skrin, tetapi percubaan memerlukan xx2 cm. Percubaan akan disambung semula apabila anda mencapai jarak yang betul.",ml:"നിങ്ങളുടെ കണ്ണുകൾ സ്ക്രീനിൽ നിന്ന് xx1 സെൻ്റിമീറ്ററാണ്, എന്നാൽ പരീക്ഷണത്തിന് xx2 സെൻ്റീമീറ്റർ ആവശ്യമാണ്. നിങ്ങൾ ശരിയായ ദൂരത്തിൽ എത്തുമ്പോൾ പരീക്ഷണം പുനരാരംഭിക്കും.",no:"Øynene dine er xx1 cm fra skjermen, men eksperimentet trenger xx2 cm. Eksperimentet gjenopptas når du når riktig avstand.",fa:"چشمان شما xx1 سانتی متر از صفحه نمایش فاصله دارد، اما آزمایش به xx2 سانتی متر نیاز دارد. با رسیدن به فاصله صحیح، آزمایش از سر گرفته می شود.",pl:"Twoje oczy znajdują się w odległości xx1 cm od ekranu, ale do eksperymentu potrzebne są xx2 cm. Eksperyment zostanie wznowiony, gdy osiągniesz odpowiednią odległość.",pt:"Seus olhos estão a xx1 cm da tela, mas o experimento precisa de xx2 cm. O experimento será retomado quando você atingir a distância correta.",ro:"Ochii tăi sunt la xx1 cm de ecran, dar experimentul are nevoie de xx2 cm. Experimentul se va relua când ajungeți la distanța corectă.",ru:"Ваши глаза находятся на расстоянии хх1 см от экрана, но для эксперимента нужно хх2 см. Эксперимент возобновится, когда вы достигнете правильного расстояния.",sr:"Ваше очи су кк1 цм од екрана, али за експеримент је потребно кк2 цм. Експеримент ће се наставити када достигнете тачну удаљеност.",es:"Tus ojos están a xx1 cm de la pantalla, pero el experimento necesita xx2 cm. El experimento se reanudará cuando alcances la distancia correcta.",sw:"Macho yako ni sentimita xx1 kutoka kwenye skrini, lakini jaribio linahitaji sentimita xx2. Jaribio litaendelea utakapofika umbali sahihi.",sv:"Dina ögon är xx1 cm från skärmen, men experimentet behöver xx2 cm. Experimentet kommer att återupptas när du når rätt avstånd.",tl:"Ang iyong mga mata ay xx1 cm mula sa screen, ngunit ang eksperimento ay nangangailangan ng xx2 cm. Magpapatuloy ang eksperimento kapag naabot mo ang tamang distansya.",tr:"Gözleriniz ekrandan xx1 cm uzakta, ancak deney için xx2 cm'ye ihtiyaç var. Doğru mesafeye ulaştığınızda deney devam edecektir.",ur:"آپ کی آنکھیں اسکرین سے xx1 سینٹی میٹر دور ہیں، لیکن تجربے کے لیے xx2 سینٹی میٹر کی ضرورت ہے۔ تجربہ دوبارہ شروع ہو جائے گا جب آپ صحیح فاصلے پر پہنچ جائیں گے۔"},RC_distanceTrackingIntroEnd:{"en-US":"Once you're done, distance tracking will begin.",ar:"بمجرد الانتهاء، سيبدأ تتبع المسافة.",hy:"Ավարտելուց հետո կսկսվի հեռավորության հետագծումը:",bg:"След като приключите, проследяването на разстоянието ще започне.","zh-CN":"在您完成后,视距追踪将开始。","zh-HK":"完成後,距離追蹤將開始。",hr:"Kada završite, započet će praćenje udaljenosti.",cs:"Jakmile budete hotovi, začne sledování vzdálenosti.",da:"Når du er færdig, begynder distancesporing.",nl:"Zodra u klaar bent, begint het volgen van de afstand.","en-UK":"Once you're done, distance tracking will commence.",fi:"Kun olet valmis, etäisyysseuranta alkaa.",fr:"Une fois que vous aurez terminé, le suivi de la distance commencera.",de:"Sobald Sie fertig sind, beginnt die Distanzverfolgung.",el:"Μόλις τελειώσετε, θα ξεκινήσει η παρακολούθηση απόστασης.",he:"לאחר שתסיים, יתחיל מעקב מרחק.",hi:"एक बार जब आपका काम पूरा हो जाएगा, तो दूरी की ट्रैकिंग शुरू हो जाएगी।",hu:"Ha végzett, megkezdődik a távolságkövetés.",is:"Þegar þú ert búinn hefst fjarlægðarmæling.",id:"Setelah Anda selesai, pelacakan jarak akan dimulai.",it:"Una volta terminato, inizierà il tracciamento della distanza.",ja:"「終わったら、距離の追跡が始まります。」",kn:"ಮುಗಿದ ನಂತರ, ದೂರದರ್ಶನ ಟ್ರ್ಯಾಕಿಂಗ್ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.",ko:"완료되면 거리 추적이 시작됩니다.",lt:"Kai baigsite, atstumo sekimas prasidės.",ms:"Sebaik sahaja anda selesai, penjejakan jarak akan bermula.",ml:"നിങ്ങൾ ചെയ്തുകഴിഞ്ഞാൽ, ദൂരം ട്രാക്കിംഗ് ആരംഭിക്കും.",no:'"Once you\'re done, distance tracking will begin."\n"Når du er ferdig, vil avstandssporing begynne."',fa:"پس از اتمام کار، ردیابی مسافت آغاز خواهد شد.",pl:"Gdy skończysz, rozpocznie się śledzenie odległości.",pt:"Quando terminar, o rastreamento de distância começará.",ro:"După ce ați terminat, va începe urmărirea distanței.",ru:"Как только вы закончите, начнется отслеживание расстояния.",sr:"Kada završite, praćenje udaljenosti će početi.",es:"Una vez que termines, comenzará el seguimiento de distancia.",sw:"Baada ya kumaliza, ufuatiliaji wa umbali utaanza.",sv:"När du är klar kommer distansspårningen att börja.",tl:"Kapag tapos ka na, magsisimula ang pagsubaybay sa distansya.",tr:"Tamamlandığında, mesafe takibi başlayacak.",ur:"جب آپ کام مکمل کر لیں، فاصلہ کی پیمائش شروع ہو جائے گی۔"},RC_distanceTrackingIntroStart:{"en-US":"❌ RC_distanceTrackingIntroStart is obsolete.",ar:"❌ RC_distanceTrackingIntroStart is obsolete.",hy:"❌ RC_distanceTrackingIntroStart-ը հնացած է:",bg:"❌ RC_distanceTrackingIntroStart е остарял.","zh-CN":"❌ RC_distanceTrackingIntroStart 已过时。","zh-HK":"❌ RC_distanceTrackingIntroStart 已過時。",hr:"❌ RC_distanceTrackingIntroStart je zastario.",cs:"❌ RC_distanceTrackingIntroStart je zastaralý.",da:"❌ RC_distanceTrackingIntroStart er forældet.",nl:"❌ RC_distanceTrackingIntroStart is verouderd.","en-UK":"RC_distanceTrackingIntroStart is obsolete.",fi:"❌ RC_distanceTrackingIntroStart on vanhentunut.",fr:"❌ RC_distanceTrackingIntroStart is obsolete.",de:"❌ RC_distanceTrackingIntroStart ist veraltet.",el:"❌ Το RC_distanceTrackingIntroStart είναι ξεπερασμένο.",he:"❌ RC_distanceTrackingIntroStart מיושן.",hi:"❌ RC_distanceTrackingIntroStart अप्रचलित है।",hu:"❌ Az RC_distanceTrackingIntroStart elavult.",is:"❌ RC_distanceTrackingIntroStart er úreltur.",id:"❌ RC_distanceTrackingIntroStart sudah usang.",it:"❌ RC_distanceTrackingIntroStart is obsolete.",ja:"❌ RC_distanceTrackingIntroStart is obsolete.",kn:"❌ RC_distanceTrackingIntroStart is obsolete.",ko:"❌ RC_distanceTrackingIntroStart is obsolete.",lt:"❌ RC_distanceTrackingIntroStart is obsolete.",ms:"❌ RC_distanceTrackingIntroStart is obsolete.",ml:"❌ RC_distanceTrackingIntroStart കാലഹരണപ്പെട്ടതാണ്.",no:"❌ RC_distanceTrackingIntroStart is obsolete.",fa:"❌ RC_distanceTrackingIntroStart is obsolete.",pl:"❌ RC_distanceTrackingIntroStart is obsolete.",pt:"❌ RC_distanceTrackingIntroStart is obsolete.",ro:"❌ RC_distanceTrackingIntroStart is obsolete.",ru:"❌ RC_distanceTrackingIntroStart is obsolete.",sr:"❌ RC_distanceTrackingIntroStart is obsolete.",es:"❌ RC_distanceTrackingIntroStart is obsolete.",sw:"❌ RC_distanceTrackingIntroStart is obsolete.",sv:"❌ RC_distanceTrackingIntroStart is obsolete.",tl:"❌ RC_distanceTrackingIntroStart is obsolete.",tr:"❌ RC_distanceTrackingIntroStart is obsolete.",ur:"❌ RC_distanceTrackingIntroStart is obsolete."},RC_distanceTrackingMoveCloser:{"en-US":"Move closer",ar:"اقترب أكثر",hy:"Մոտեցեք",bg:"Приближете се","zh-CN":"靠近一点。","zh-HK":"靠近一點",hr:"Primakni se bliže",cs:"Posuňte se blíž",da:"Flyt tættere på",nl:"Kom dichterbij","en-UK":"Move closer",fi:"Siirry lähemmäs",fr:"Rapproche-toi",de:"Gehen Sie näher heran",el:"Κινηθείτε πιο κοντά",he:"תתקרב",hi:"निकट आएं",hu:"Lépj közelebb",is:"Færðu þig nær",id:"Merapat",it:"Avvicinati",ja:"もっと近づいてください。",kn:"ಹತ್ತಿರಕ್ಕೆ ಬಾರಿಸಿ",ko:"더 가까이 다가가세요",lt:"Judėti arčiau",ms:"Bergerak lebih dekat",ml:"അടുത്തേക്ക് നീങ്ങുക",no:"Flytt nærmere",fa:"نزدیکتر بیایید",pl:"Podejdź bliżej",pt:"Aproxime-se",ro:"Apropie-te",ru:"Подойди ближе",sr:"Приђи ближе",es:"Acércate",sw:"Sogeza karibu",sv:"Flytta dig närmare",tl:"Lumapit ka",tr:"Daha yaklaş",ur:"قریب ہو جاؤ"},RC_distanceTrackingMoveFurther:{"en-US":"Move farther",ar:"ابتعد أكثر",hy:"Շարժվեք ավելի հեռու",bg:"Придвижете се по-далеч","zh-CN":"走得更远","zh-HK":"走得更遠",hr:"Pomakni se dalje",cs:"Přesuňte se dále",da:"Flyt længere",nl:"Ga verder","en-UK":"Move further",fi:"Siirry kauemmas",fr:"Éloigne-toi davantage",de:"Bewegen Sie sich weiter",el:"Μετακινηθείτε πιο μακριά",he:"זז רחוק יותר",hi:"आगे बढ़ो",hu:"Menj messzebbre",is:"Færðu þig lengra",id:"Bergerak lebih jauh",it:"Muoviti più lontano",ja:"もっと離れてください。",kn:"ದೂರ ಸರಿಯಿರಿ",ko:"더 멀리 이동",lt:"Pajudėk toliau",ms:"Bergerak lebih jauh",ml:"കൂടുതൽ ദൂരം നീങ്ങുക",no:"Flytt lenger",fa:"به دورتر حرکت کنید",pl:"Idź dalej",pt:"Vá mais longe",ro:"Muta-te mai departe",ru:"Двигайтесь дальше",sr:"Pomeri se dalje",es:"Mueve más lejos",sw:"Endelea mbali zaidi",sv:"Flytta längre",tl:"Lumipat ng mas malayo",tr:"Daha ileri git",ur:"اور دور جاؤ"},RC_rulerUnit:{"en-US":"1. If you have one, select your longest ruler or tape measure. \n2. What units are marked on it? (If several, choose one.) \n3. If you don’t have a ruler or tape measure, click None to proceed.",ar:"1. إذا كان لديك واحد، اختر أطول مسطرة أو شريط قياس لديك.\n2. ما هي الوحدات المعلّمة عليه؟ (إذا كان هناك عدة، اختر واحدة.)\n3. إذا لم يكن لديك مسطرة أو شريط قياس، انقر على لا شيء للمتابعة.",hy:"1. Եթե ունեք, ընտրեք ձեր ամենաերկար քանոնը կամ ժապավենը: \n2. Ի՞նչ միավորներ են նշված դրա վրա: (Եթե մի քանիսը, ընտրեք մեկը): \n3. Եթե չունեք քանոն կամ ժապավեն, սեղմեք Ոչ մեկը՝ շարունակելու համար:",bg:"1. Ако имате такъв, изберете най-дългата линийка или ролетка. \n2. Какви мерни единици са отбелязани на него? (Ако са няколко, изберете един.) \n3. Ако нямате линийка или ролетка, щракнете върху Няма, за да продължите.","zh-CN":"1. 如果有,请选择最长的尺子或卷尺。 \n2. 上面标注的单位是什么? (如果有多个,请选择一个。) \n3. 如果您没有尺子或卷尺,请单击“无”继续。","zh-HK":"1. 如果有,請選擇最長的尺子或捲尺。 \n2. 上面標註的單位是什麼? (如果有多個,請選擇一個。) \n3. 如果您沒有尺或捲尺,請按一下「無」繼續。",hr:"1. Ako ga imate, odaberite svoje najduže ravnalo ili metar. \n2. Koje su jedinice označene na njemu? (Ako ih je više, odaberite jedno.) \n3. Ako nemate ravnalo ili metar, kliknite Ništa za nastavak.",cs:"1. Pokud nějaké máte, vyberte si nejdelší pravítko nebo svinovací metr. \n2. Jaké jednotky jsou na něm vyznačeny? (Pokud je jich několik, vyberte jednu.) \n3. Pokud nemáte pravítko nebo svinovací metr, pokračujte kliknutím na Žádný.",da:"1. Hvis du har en, skal du vælge din længste lineal eller målebånd. \n2. Hvilke enheder er markeret på den? (Hvis flere, vælg én.) \n3. Hvis du ikke har en lineal eller et målebånd, skal du klikke på Ingen for at fortsætte.",nl:"1. Als je er een hebt, selecteer dan je langste liniaal of meetlint. \n2. Welke eenheden staan ​​erop aangegeven? (Als er meerdere zijn, kies er dan één.) \n3. Als u geen liniaal of meetlint heeft, klikt u op Geen om door te gaan.","en-UK":"1. If you have one, select your longest ruler or tape measure. \n2. What units are marked on it? (If several, choose one.) \n3. If you don’t have a ruler or tape measure, click None to proceed.",fi:"1. Jos sinulla on sellainen, valitse pisin viivain tai mittanauha. \n2. Mitä yksiköitä siihen on merkitty? (Jos useita, valitse yksi.) \n3. Jos sinulla ei ole viivainta tai mittanauhaa, jatka valitsemalla Ei mitään.",fr:"1. Si vous en avez un, sélectionnez votre règle ou mètre ruban le plus long.\n2. Quelles unités y sont marquées ? (Si plusieurs, choisissez-en une.)\n3. Si vous n'avez pas de règle ou de mètre ruban, cliquez sur Aucun pour continuer.",de:"1. Wenn Sie eines haben, wählen Sie Ihr längstes Lineal oder Maßband aus. \n2. Welche Einheiten sind darauf markiert? (Wenn mehrere, wählen Sie eine aus.) \n3. Wenn Sie kein Lineal oder Maßband haben, klicken Sie auf „Keine“, um fortzufahren.",el:"1. Εάν έχετε, επιλέξτε τον μεγαλύτερο χάρακα ή τη μεζούρα σας. \n2. Ποιες μονάδες σημειώνονται σε αυτό; (Εάν υπάρχουν πολλά, επιλέξτε ένα.) \n3. Εάν δεν έχετε χάρακα ή μεζούρα, κάντε κλικ στο Κανένα για να συνεχίσετε.",he:"1. אם יש לך אחד כזה, בחר את הסרגל או סרט המידה הארוכים ביותר. \n2. אילו יחידות מסומנות עליו? (אם כמה, בחר אחד.) \n3. אם אין לך סרגל או סרט מדידה, לחץ על None כדי להמשיך.",hi:"1. यदि आपके पास एक है, तो अपना सबसे लंबा रूलर या टेप माप चुनें। \n2. इस पर कौन सी इकाइयाँ अंकित हैं? (यदि अनेक हों तो एक चुनें।) \n3. यदि आपके पास रूलर या टेप माप नहीं है, तो आगे बढ़ने के लिए कोई नहीं पर क्लिक करें।",hu:"1. Ha rendelkezik ilyennel, válassza ki a leghosszabb vonalzót vagy mérőszalagot. \n2. Milyen mértékegységek vannak jelölve rajta? (Ha több, válasszon egyet.) \n3. Ha nincs vonalzója vagy mérőszalagja, kattintson a Nincs lehetőségre a folytatáshoz.",is:"1. Ef þú ert með einn skaltu velja lengstu reglustikuna þína eða málband. \n2. Hvaða einingar eru merktar á það? (Ef fleiri, veldu einn.) \n3. Ef þú ert ekki með reglustiku eða málband, smelltu á Ekkert til að halda áfram.",id:"1. Jika ada, pilih penggaris atau pita pengukur terpanjang Anda. \n2. Satuan apa yang ditandai di atasnya? (Jika beberapa, pilih salah satu.) \n3. Jika Anda tidak memiliki penggaris atau pita pengukur, klik Tidak Ada untuk melanjutkan.",it:"1. Se ne hai uno, seleziona il tuo righello o metro a nastro più lungo. \n2. Quali unità sono segnate su di esso? (Se ce ne sono diverse, scegline una.) \n3. Se non hai un righello o un metro a nastro, clicca Nessuno per procedere.",ja:"1. 持っている場合は、最長の定規または巻尺を選択します。 \n2. どの単位がマークされていますか? (複数ある場合は1つお選びください。) \n3. 定規や巻尺がない場合は、「なし」をクリックして続行します。",kn:"1. ನೀವು ಒಂದನ್ನು ಹೊಂದಿದ್ದರೆ, ನಿಮ್ಮ ಉದ್ದವಾದ ಆಡಳಿತಗಾರ ಅಥವಾ ಟೇಪ್ ಅಳತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ. \n2. ಅದರ ಮೇಲೆ ಯಾವ ಘಟಕಗಳನ್ನು ಗುರುತಿಸಲಾಗಿದೆ? (ಹಲವಾರು ಇದ್ದರೆ, ಒಂದನ್ನು ಆರಿಸಿ.) \n3. ನೀವು ರೂಲರ್ ಅಥವಾ ಟೇಪ್ ಅಳತೆಯನ್ನು ಹೊಂದಿಲ್ಲದಿದ್ದರೆ, ಮುಂದುವರೆಯಲು ಯಾವುದೂ ಇಲ್ಲ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ.",ko:"1. 가지고 있다면 가장 긴 자나 줄자를 선택하세요. \n2. 어떤 단위가 표시되어 있나요? (여러 개일 경우 하나를 선택하세요.) \n3. 자나 줄자가 없으면 없음을 클릭하여 계속 진행하세요.",lt:"1. Jei turite, pasirinkite ilgiausią liniuotę arba matavimo juostą. \n2. Kokie vienetai pažymėti ant jo? (Jei keli, pasirinkite vieną.) \n3. Jei neturite liniuotės arba matavimo juostos, spustelėkite Nėra, kad tęstumėte.",ms:"1. Jika anda mempunyai satu, pilih pembaris terpanjang atau pita pengukur anda. \n2. Apakah unit yang ditanda padanya? (Jika beberapa, pilih satu.) \n3. Jika anda tidak mempunyai pembaris atau pita pengukur, klik Tiada untuk meneruskan.",ml:"1. നിങ്ങൾക്ക് ഒരെണ്ണം ഉണ്ടെങ്കിൽ, നിങ്ങളുടെ ഏറ്റവും ദൈർഘ്യമേറിയ ഭരണാധികാരി അല്ലെങ്കിൽ ടേപ്പ് അളവ് തിരഞ്ഞെടുക്കുക. \n2. അതിൽ എന്ത് യൂണിറ്റുകൾ അടയാളപ്പെടുത്തിയിരിക്കുന്നു? (നിരവധി ആണെങ്കിൽ, ഒന്ന് തിരഞ്ഞെടുക്കുക.) \n3. നിങ്ങൾക്ക് ഒരു റൂളറോ ടേപ്പ് അളവോ ഇല്ലെങ്കിൽ, തുടരാൻ ഒന്നുമില്ല ക്ലിക്ക് ചെയ്യുക.",no:"1. Hvis du har en, velg den lengste linjalen eller målebåndet. \n2. Hvilke enheter er merket på den? (Hvis flere, velg én.) \n3. Hvis du ikke har en linjal eller målebånd, klikker du på Ingen for å fortsette.",fa:"1. اگر یکی دارید، بلندترین خط کش یا متر نوار خود را انتخاب کنید. \n2. چه واحدهایی روی آن مشخص شده است؟ (اگر چندین، یکی را انتخاب کنید.) \n3. اگر خط کش یا متر نوار ندارید، برای ادامه روی None کلیک کنید.",pl:"1. Jeśli masz, wybierz najdłuższą linijkę lub centymetr. \n2. Jakie jednostki są na nim zaznaczone? (Jeśli jest ich kilka, wybierz jeden.) \n3. Jeśli nie masz linijki ani taśmy mierniczej, kliknij Brak, aby kontynuować.",pt:"1. Se você tiver uma, selecione sua régua ou fita métrica mais longa. \n2. Quais unidades estão marcadas nele? (Se houver vários, escolha um.) \n3. Se você não tiver uma régua ou fita métrica, clique em Nenhum para continuar.",ro:"1. Dacă aveți una, selectați cea mai lungă riglă sau bandă de măsură. \n2. Ce unități sunt marcate pe el? (Dacă sunt mai multe, alegeți unul.) \n3. Dacă nu aveți o riglă sau o bandă de măsură, faceți clic pe Nimic pentru a continua.",ru:"1. Если она у вас есть, выберите самую длинную линейку или рулетку. \n2. Какие единицы измерения на нем обозначены? (Если несколько, выберите один.) \n3. Если у вас нет линейки или рулетки, нажмите «Нет», чтобы продолжить.",sr:"1. Ако га имате, изаберите најдужи лењир или меру. \n2. Које јединице су означене на њему? (Ако их је неколико, изаберите једну.) \n3. Ако немате лењир или меру, кликните на Ништа да бисте наставили.",es:"1. Si tienes uno, selecciona tu regla o cinta métrica más larga. \n2. ¿Qué unidades están marcadas en ella? (Si hay varias, elige una.) \n3. Si no tienes una regla o cinta métrica, haz clic en Ninguno para continuar.",sw:"1. Ikiwa unayo, chagua rula yako ndefu zaidi au kipimo cha tepi. \n2. Ni vitengo gani vilivyowekwa alama juu yake? (Ikiwa ni kadhaa, chagua moja.) \n3. Ikiwa huna rula au kipimo cha tepi, bofya Hakuna ili kuendelea.",sv:"1. Om du har en, välj din längsta linjal eller måttband. \n2. Vilka enheter är markerade på den? (Om flera, välj en.) \n3. Om du inte har en linjal eller måttband klickar du på Ingen för att fortsätta.",tl:"1. Kung mayroon ka, piliin ang iyong pinakamahabang ruler o tape measure. \n2. Anong mga yunit ang nakamarka dito? (Kung marami, pumili ng isa.) \n3. Kung wala kang ruler o tape measure, i-click ang Wala upang magpatuloy.",tr:"1. Eğer elinizde varsa en uzun cetvelinizi veya şerit metrenizi seçin. \n2. Üzerinde hangi birimler işaretlenmiştir? (Birkaç tane varsa birini seçin.) \n3. Cetveliniz veya şerit metreniz yoksa devam etmek için Yok'a tıklayın.",ur:"1. اگر آپ کے پاس ہے، تو اپنا سب سے لمبا حکمران یا ٹیپ پیمائش منتخب کریں۔ \n2. اس پر کون سی اکائیاں نشان زد ہیں؟ (اگر متعدد ہوں تو ایک کا انتخاب کریں۔) \n3. اگر آپ کے پاس حکمران یا ٹیپ پیمائش نہیں ہے، تو آگے بڑھنے کے لیے کوئی نہیں پر کلک کریں۔"},RC_howLong:{"en-US":"How long is your ruler or tape measure, in AAA?",ar:"ما هو طول مسطرتك أو شريط القياس الخاص بك، في AAA؟",hy:"Որքա՞ն երկար է ձեր քանոնը կամ ժապավենը AAA-ով:",bg:"Колко дълга е вашата линийка или ролетка в AAA?","zh-CN":"您的尺子或卷尺有多长(AAA)?","zh-HK":"您的尺或捲尺有多長(AAA)?",hr:"Koliko je dugo vaše ravnalo ili metar u AAA?",cs:"Jak dlouhé je vaše pravítko nebo svinovací metr v AAA?",da:"Hvor lang er din lineal eller målebånd i AAA?",nl:"Hoe lang is uw liniaal of meetlint, in AAA?","en-UK":"How long is your ruler or tape measure, in AAA?",fi:"Kuinka pitkä viivain tai mittanauhasi on AAA-muodossa?",fr:"Quelle est la longueur de votre règle ou mètre ruban, en AAA ?",de:"Wie lang ist Ihr Lineal oder Maßband in AAA?",el:"Πόσο μήκος έχει ο χάρακας ή η μεζούρα σας, σε ΑΑΑ;",he:"כמה זמן הסרגל או סרט המידה שלך ב-AAA?",hi:"आपका रूलर या टेप माप एएए में कितना लंबा है?",hu:"Milyen hosszú a vonalzód vagy mérőszalagod AAA-ban?",is:"Hversu langt er reglustikið eða málbandið þitt í AAA?",id:"Berapa panjang penggaris atau pita pengukur Anda, dalam ukuran AAA?",it:"Quanto è lungo il tuo righello o metro a nastro, in AAA?",ja:"あなたの定規または巻尺の長さは AAA 単位でどれくらいですか?",kn:"AAA ನಲ್ಲಿ ನಿಮ್ಮ ರೂಲರ್ ಅಥವಾ ಟೇಪ್ ಅಳತೆ ಎಷ್ಟು?",ko:"자나 줄자는 AAA 단위로 얼마나 긴가요?",lt:"Kokio ilgio jūsų liniuotė arba matavimo juosta yra AAA?",ms:"Berapa lama pembaris atau pita pengukur anda, dalam AAA?",ml:"AAA-യിൽ നിങ്ങളുടെ ഭരണാധികാരി അല്ലെങ്കിൽ ടേപ്പ് അളവ് എത്രയാണ്?",no:"Hvor lang er linjalen eller målebåndet ditt i AAA?",fa:"طول خط کش یا متر نوار شما، در AAA چقدر است؟",pl:"Jaką długość ma Twoja linijka lub miarka w formacie AAA?",pt:"Qual é o comprimento da sua régua ou fita métrica, em AAA?",ro:"Cât de lungă este rigla sau banda ta de măsură, în AAA?",ru:"Какова длина вашей линейки или рулетки в формате AAA?",sr:"Колико је дугачак ваш лењир или мерач траке, у ААА?",es:"¿Cuánto mide tu regla o cinta métrica, en AAA?",sw:"Je, kipimo chako cha rula au tepi ni cha muda gani, katika AAA?",sv:"Hur lång är din linjal eller måttband i AAA?",tl:"Gaano katagal ang iyong ruler o tape measure, sa AAA?",tr:"Cetvelinizin veya şerit metrenizin uzunluğu AAA cinsinden ne kadardır?",ur:"اے اے اے میں آپ کا حکمران یا ٹیپ پیمائش کتنی لمبی ہے؟"},RC_produceDistanceTitle:{"en-US":"Set Your Viewing Distance, Step 222 of 333",ar:"اضبط مسافة المشاهدة الخاصة بك، الخطوة 222 من 333",hy:"Սահմանեք ձեր դիտման հեռավորությունը, քայլ 222-ը 333-ից",bg:"Задайте вашето разстояние за гледане, стъпка 222 от 333","zh-CN":"设置您的观看距离,第 222 步(共 333 步)","zh-HK":"設定您的觀看距離,第 222 步(共 333 步)",hr:"Postavite udaljenost gledanja, korak 222 od 333",cs:"Nastavte svou pozorovací vzdálenost, krok 222 z 333",da:"Indstil din synsafstand, trin 222 af 333",nl:"Stel uw kijkafstand in, stap 222 van 333","en-UK":"Set Your Viewing Distance, Step 222 of 333",fi:"Aseta katseluetäisyys, vaihe 222/333",fr:"Réglez votre distance de visionnement, étape 222 sur 333",de:"Stellen Sie Ihren Betrachtungsabstand ein, Schritt 222 von 333",el:"Ορίστε την απόσταση προβολής σας, Βήμα 222 από 333",he:"הגדר את מרחק הצפייה שלך, שלב 222 מתוך 333",hi:"अपनी देखने की दूरी निर्धारित करें, 333 में से चरण 222",hu:"Állítsa be a látótávolságot, 222/333 lépés",is:"Stilltu útsýnisfjarlægð þína, skref 222 af 333",id:"Atur Jarak Pandang Anda, Langkah 222 dari 333",it:"Imposta la tua distanza di visione, passaggio 222 di 333",ja:"視聴距離を設定する、ステップ 222/333",kn:"ನಿಮ್ಮ ವೀಕ್ಷಣಾ ದೂರವನ್ನು ಹೊಂದಿಸಿ, ಹಂತ 222 ರಲ್ಲಿ 333",ko:"시청 거리 설정, 333단계 중 222단계",lt:"Nustatykite savo žiūrėjimo atstumą, 222 veiksmas iš 333",ms:"Tetapkan Jarak Tontonan Anda, Langkah 222 daripada 333",ml:"നിങ്ങളുടെ കാഴ്ച ദൂരം സജ്ജീകരിക്കുക, ഘട്ടം 222 / 333",no:"Still inn visningsavstand, trinn 222 av 333",fa:"فاصله مشاهده خود را تنظیم کنید، مرحله 222 از 333",pl:"Ustaw odległość oglądania, krok 222 z 333",pt:"Defina sua distância de visualização, Etapa 222 de 333",ro:"Setați distanța de vizualizare, Pasul 222 din 333",ru:"Установите расстояние просмотра, шаг 222 из 333",sr:"Подесите своју удаљеност гледања, корак 222 од 333",es:"Configura tu distancia de visualización, paso 222 de 333",sw:"Weka Umbali Wako wa Kutazama, Hatua ya 222 kati ya 333",sv:"Ställ in ditt visningsavstånd, steg 222 av 333",tl:"Itakda ang Iyong Distansya sa Pagtingin, Hakbang 222 ng 333",tr:"İzleme Mesafenizi Ayarlayın, Adım 222 / 333",ur:"اپنا دیکھنے کا فاصلہ طے کریں، مرحلہ 222 ​​از 333"},RC_produceDistance:{"en-US":"1. Measure the distance from the center of your screen to the front of your eye (either eye is fine). Use a ruler or tape measure, and ignore any glasses while measuring.\n2. Adjust your position by leaning forward or back, or by moving your chair, until the distance is 111 AAA.\n3. Once you’re at the correct distance, keep your head steady and set the ruler aside to ensure the camera has a clear view of your entire face.\n4. Press RETURN on your keyboard (or phone-screen keypad) to proceed. ",ar:"1. قم بقياس المسافة من مركز شاشتك إلى مقدمة عينك (أي عين تكون جيدة). استخدم مسطرة أو شريط قياس، وتجاهل أي نظارات أثناء القياس.\n2. قم بتعديل وضعيتك عن طريق الانحناء للأمام أو للخلف، أو بتحريك كرسيك، حتى تصبح المسافة 111 AAA.\n3. بمجرد أن تكون على المسافة الصحيحة، حافظ على رأسك ثابتًا وضع المسطرة جانبًا لضمان أن الكاميرا لديها رؤية واضحة لوجهك بالكامل.\n4. اضغط على RETURN على لوحة المفاتيح الخاصة بك (أو لوحة المفاتيح على شاشة الهاتف) للمتابعة.",hy:"1. Չափեք ձեր էկրանի կենտրոնից մինչև ձեր աչքի առջևի հատվածը (ցանկացած աչքը լավ է): Օգտագործեք քանոն կամ ժապավեն և չափելիս անտեսեք ցանկացած ակնոց:\n2. Կարգավորեք ձեր դիրքը՝ թեքվելով առաջ կամ հետ, կամ աթոռը շարժելով՝ մինչև հեռավորությունը 111 AAA:\n3. Երբ դուք ճիշտ հեռավորության վրա եք, ձեր գլուխը պահեք անշարժ և մի կողմ դրեք քանոնը, որպեսզի տեսախցիկը հստակ տեսնի ձեր ամբողջ դեմքը:\n4. Շարունակելու համար սեղմեք RETURN ստեղնաշարի (կամ հեռախոսի էկրանի ստեղնաշարի վրա): ",bg:"1. Измерете разстоянието от центъра на екрана до предната част на окото (и двете очи са наред). Използвайте линийка или рулетка и игнорирайте очилата, докато измервате.\n2. Регулирайте позицията си, като се наведете напред или назад или като преместите стола си, докато разстоянието стане 111 AAA.\n3. След като сте на правилното разстояние, дръжте главата си стабилна и оставете линийката настрани, за да сте сигурни, че камерата има ясен изглед към цялото ви лице.\n4. Натиснете RETURN на клавиатурата (или клавиатурата на екрана на телефона), за да продължите. ","zh-CN":"1. 测量屏幕中心到眼睛前方的距离(任意一只眼睛都可以)。使用尺子或卷尺进行测量,并忽略任何眼镜。\n2. 通过向前或向后倾斜或移动椅子来调整您的位置,直到距离为 111 AAA。\n3. 一旦达到正确的距离,请保持头部稳定并将尺子放在一边,以确保相机可以清晰地看到您的整个脸部。\n4. 按键盘(或电话屏幕键盘)上的 RETURN 继续。 ","zh-HK":"1. 測量螢幕中心到眼睛前方的距離(任一隻眼睛都可以)。使用尺或捲尺進行測量,並忽略任何眼鏡。\n2. 透過向前或向後傾斜或移動椅子來調整您的位置,直到距離為 111 AAA。\n3. 一旦達到正確的距離,請保持頭部穩定並將尺子放在一邊,以確保相機可以清楚地看到您的整個臉部。\n4. 按鍵盤(或電話螢幕鍵盤)上的 RETURN 繼續。 ",hr:"1. Izmjerite udaljenost od središta zaslona do prednjeg dijela oka (s oba oka je u redu). Koristite ravnalo ili mjernu traku i zanemarite naočale tijekom mjerenja.\n2. Prilagodite svoj položaj naginjući se naprijed ili natrag, ili pomičući stolac, dok udaljenost ne bude 111 AAA.\n3. Nakon što ste na ispravnoj udaljenosti, držite glavu mirno i postavite ravnalo u stranu kako bi kamera imala jasan pregled cijelog vašeg lica.\n4. Pritisnite RETURN na tipkovnici (ili tipkovnici na zaslonu telefona) za nastavak. ",cs:"1. Změřte vzdálenost od středu obrazovky k přední části oka (oba oko je v pořádku). Použijte pravítko nebo svinovací metr a při měření ignorujte brýle.\n2. Upravte svou polohu předklonem nebo vzad nebo posunutím židle, dokud nebude vzdálenost 111 AAA.\n3. Jakmile jste ve správné vzdálenosti, držte hlavu v klidu a odložte pravítko stranou, abyste zajistili, že kamera bude mít jasný výhled na celý váš obličej.\n4. Pokračujte stisknutím RETURN na klávesnici (nebo klávesnici na obrazovce telefonu). ",da:"1. Mål afstanden fra midten af ​​din skærm til forsiden af ​​dit øje (begge øjne er fine). Brug en lineal eller et målebånd, og ignorer eventuelle briller, mens du måler.\n2. Juster din position ved at læne dig frem eller tilbage, eller ved at flytte din stol, indtil afstanden er 111 AAA.\n3. Når du er i den rigtige afstand, skal du holde hovedet roligt og stille linealen til side for at sikre, at kameraet har frit udsyn til hele dit ansigt.\n4. Tryk på RETURN på dit tastatur (eller telefonskærmtastaturet) for at fortsætte. ",nl:"1. Meet de afstand vanaf het midden van uw scherm tot de voorkant van uw oog (beide ogen zijn prima). Gebruik een liniaal of meetlint en negeer een bril tijdens het meten.\n2. Pas uw positie aan door naar voren of naar achteren te leunen, of door uw stoel te verplaatsen, totdat de afstand 111 AAA is.\n3. Zodra u op de juiste afstand bent, houdt u uw hoofd stil en legt u de liniaal opzij, zodat de camera uw hele gezicht duidelijk kan zien.\n4. Druk op RETURN op uw toetsenbord (of het toetsenbord op het telefoonscherm) om door te gaan. ","en-UK":"1. Measure the distance from the centre of your screen to the front of your eye (either eye is fine). Use a ruler or tape measure, and ignore any glasses while measuring.\n2. Adjust your position by leaning forward or back, or by moving your chair, until the distance is 111 AAA.\n3. Once you’re at the correct distance, keep your head steady and set the ruler aside to ensure the camera has a clear view of your entire face.\n4. Press RETURN on your keyboard (or phone-screen keypad) to proceed.",fi:"1. Mittaa etäisyys näytön keskustasta silmäsi etuosaan (kumpi tahansa silmä on kunnossa). Käytä viivainta tai mittanauhaa ja jätä huomioimatta lasit mittauksen aikana.\n2. Säädä asentoasi nojaamalla eteenpäin tai taaksepäin tai liikuttamalla tuolia, kunnes etäisyys on 111 AAA.\n3. Kun olet oikealla etäisyydellä, pidä pää vakaana ja aseta viivain sivuun varmistaaksesi, että kameralla on selkeä näkymä koko kasvosi.\n4. Jatka painamalla näppäimistön (tai puhelimen näytön näppäimistön) RETURN-painiketta. ",fr:"1. Mesurez la distance entre le centre de votre écran et le devant de votre œil (n'importe quel œil convient). Utilisez une règle ou un mètre ruban, et ignorez les lunettes pendant la mesure. \n2. Ajustez votre position en vous penchant en avant ou en arrière, ou en déplaçant votre chaise, jusqu'à ce que la distance soit de 111 AAA. \n3. Une fois à la bonne distance, gardez la tête immobile et mettez la règle de côté pour que la caméra ait une vue dégagée de l'ensemble de votre visage. \n4. Appuyez sur RETOUR sur votre clavier (ou le clavier de l'écran de votre téléphone) pour continuer.",de:"1. Messen Sie den Abstand von der Mitte Ihres Bildschirms bis zur Vorderseite Ihres Auges (beide Augen sind in Ordnung). Verwenden Sie ein Lineal oder ein Maßband und ignorieren Sie beim Messen jegliche Brille.\n2. Passen Sie Ihre Position an, indem Sie sich nach vorne oder hinten lehnen oder Ihren Stuhl bewegen, bis der Abstand 111 AAA beträgt.\n3. Sobald Sie den richtigen Abstand erreicht haben, halten Sie Ihren Kopf ruhig und legen Sie das Lineal beiseite, um sicherzustellen, dass die Kamera Ihr gesamtes Gesicht klar sehen kann.\n4. Drücken Sie RETURN auf Ihrer Tastatur (oder dem Tastenfeld auf dem Telefonbildschirm), um fortzufahren. ",el:"1. Μετρήστε την απόσταση από το κέντρο της οθόνης σας στο μπροστινό μέρος του ματιού σας (κάθε από τα δύο μάτια είναι εντάξει). Χρησιμοποιήστε χάρακα ή μεζούρα και αγνοήστε τυχόν ποτήρια κατά τη μέτρηση.\n2. Προσαρμόστε τη θέση σας γέρνοντας προς τα εμπρός ή προς τα πίσω ή μετακινώντας την καρέκλα σας, έως ότου η απόσταση είναι 111 ΑΑΑ.\n3. Μόλις φτάσετε στη σωστή απόσταση, κρατήστε το κεφάλι σας σταθερό και αφήστε τον χάρακα στην άκρη για να βεβαιωθείτε ότι η κάμερα έχει καθαρή θέα ολόκληρου του προσώπου σας.\n4. Πατήστε RETURN στο πληκτρολόγιό σας (ή στο πληκτρολόγιο της οθόνης του τηλεφώνου) για να προχωρήσετε. ",he:"1. מדדו את המרחק ממרכז המסך לקדמת העין (כל אחת מהעיניים בסדר). השתמש בסרגל או בסרט מדידה, והתעלם מכל משקפיים בזמן המדידה.\n2. התאם את המיקום שלך על ידי הישענות קדימה או אחורה, או על ידי הזזת הכיסא שלך, עד שהמרחק הוא 111 AAA.\n3. ברגע שאתה במרחק הנכון, שמור על ראשך יציב והנח את הסרגל בצד כדי להבטיח שלמצלמה תהיה נוף ברור של כל הפנים שלך.\n4. לחץ על RETURN במקלדת (או במקלדת מסך הטלפון) כדי להמשיך. ",hi:"1. अपनी स्क्रीन के केंद्र से अपनी आंख के सामने तक की दूरी मापें (दोनों में से कोई भी आंख ठीक है)। एक रूलर या टेप माप का उपयोग करें, और मापते समय किसी भी चश्मे पर ध्यान न दें।\n2. आगे या पीछे झुककर, या अपनी कुर्सी को हिलाकर अपनी स्थिति को समायोजित करें, जब तक कि दूरी 111 एएए न हो जाए।\n3. एक बार जब आप सही दूरी पर हों, तो अपना सिर स्थिर रखें और रूलर को एक तरफ रख दें ताकि यह सुनिश्चित हो सके कि कैमरे को आपके पूरे चेहरे का स्पष्ट दृश्य दिखाई दे।\n4. आगे बढ़ने के लिए अपने कीबोर्ड (या फ़ोन-स्क्रीन कीपैड) पर रिटर्न दबाएँ। ",hu:"1. Mérje meg a távolságot a képernyő közepe és a szeme eleje között (mindegyik szem jó). Használjon vonalzót vagy mérőszalagot, és ne vegye figyelembe a szemüveget mérés közben.\n2. Állítsa be pozícióját előre vagy hátra dőlve, vagy a szék mozgatásával, amíg a távolság el nem éri a 111 AAA-t.\n3. Ha megfelelő távolságra van, tartsa stabilan a fejét, és tegye félre a vonalzót, hogy a kamera jól lássa az egész arcát.\n4. A folytatáshoz nyomja meg a RETURN gombot a billentyűzeten (vagy a telefon képernyőjén). ",is:"1. Mældu fjarlægðina frá miðju skjásins að framhlið augans (hvort augað er í lagi). Notaðu reglustiku eða málband og hunsa öll gleraugu á meðan þú mælir.\n2. Stilltu stöðu þína með því að halla þér fram eða aftur, eða með því að færa stólinn þinn, þar til fjarlægðin er 111 AAA.\n3. Þegar þú ert kominn í rétta fjarlægð skaltu halda höfðinu stöðugu og setja reglustikuna til hliðar til að tryggja að myndavélin hafi skýra sýn á allt andlitið á þér.\n4. Ýttu á RETURN á lyklaborðinu þínu (eða símaskjástakkaborðinu) til að halda áfram. ",id:"1. Ukur jarak dari tengah layar ke depan mata Anda (mata mana pun boleh-boleh saja). Gunakan penggaris atau pita pengukur, dan abaikan gelas apa pun saat mengukur.\n2. Sesuaikan posisi dengan cara mencondongkan tubuh ke depan atau ke belakang, atau dengan menggerakkan kursi, hingga jaraknya 111 AAA.\n3. Setelah Anda berada pada jarak yang tepat, jaga agar kepala Anda tetap stabil dan sisihkan penggaris untuk memastikan kamera dapat melihat seluruh wajah Anda dengan jelas.\n4. Tekan RETURN pada keyboard Anda (atau keypad layar ponsel) untuk melanjutkan. ",it:"1. Misura la distanza dal centro dello schermo alla parte anteriore dell'occhio (va bene qualsiasi occhio). Usa un righello o un metro a nastro e ignora eventuali occhiali durante la misurazione. 2. Regola la tua posizione sporgendoti in avanti o indietro, o spostando la sedia, fino a quando la distanza è di 111 AAA. 3. Una volta raggiunta la distanza corretta, mantieni la testa ferma e metti da parte il righello per garantire che la fotocamera abbia una visione chiara dell'intero viso. 4. Premi INVIO sulla tastiera (o sulla tastiera dello schermo del telefono) per procedere.",ja:"1. 画面の中心から目の前までの距離を測定します (どちらの目でも問題ありません)。定規や巻尺を使用し、測定中は眼鏡を無視してください。\n2. 距離が 111 AAA になるまで、前かがみになったり、椅子を動かしたりして、位置を調整します。\n3. 適切な距離に到達したら、頭を動かさず定規を脇に置き、カメラに顔全体がはっきりと映ることを確認します。\n4. キーボード (または電話画面のキーパッド) の RETURN を押して続行します。 ",kn:"1. ನಿಮ್ಮ ಪರದೆಯ ಮಧ್ಯಭಾಗದಿಂದ ನಿಮ್ಮ ಕಣ್ಣಿನ ಮುಂಭಾಗದ ಅಂತರವನ್ನು ಅಳೆಯಿರಿ (ಎರಡೂ ಕಣ್ಣು ಉತ್ತಮವಾಗಿರುತ್ತದೆ). ಆಡಳಿತಗಾರ ಅಥವಾ ಟೇಪ್ ಅಳತೆಯನ್ನು ಬಳಸಿ ಮತ್ತು ಅಳತೆ ಮಾಡುವಾಗ ಯಾವುದೇ ಕನ್ನಡಕವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ.\n2. ದೂರವು 111 AAA ಆಗುವವರೆಗೆ ಮುಂದಕ್ಕೆ ಅಥವಾ ಹಿಂದಕ್ಕೆ ಅಥವಾ ನಿಮ್ಮ ಕುರ್ಚಿಯನ್ನು ಚಲಿಸುವ ಮೂಲಕ ನಿಮ್ಮ ಸ್ಥಾನವನ್ನು ಹೊಂದಿಸಿ.\n3. ಒಮ್ಮೆ ನೀವು ಸರಿಯಾದ ದೂರದಲ್ಲಿದ್ದರೆ, ನಿಮ್ಮ ತಲೆಯನ್ನು ಸ್ಥಿರವಾಗಿರಿಸಿಕೊಳ್ಳಿ ಮತ್ತು ಕ್ಯಾಮರಾ ನಿಮ್ಮ ಸಂಪೂರ್ಣ ಮುಖದ ಸ್ಪಷ್ಟ ನೋಟವನ್ನು ಹೊಂದಿದೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ರೂಲರ್ ಅನ್ನು ಪಕ್ಕಕ್ಕೆ ಇರಿಸಿ.\n4. ಮುಂದುವರಿಯಲು ನಿಮ್ಮ ಕೀಬೋರ್ಡ್‌ನಲ್ಲಿ (ಅಥವಾ ಫೋನ್-ಸ್ಕ್ರೀನ್ ಕೀಪ್ಯಾಡ್) ರಿಟರ್ನ್ ಒತ್ತಿರಿ. ",ko:"1. 화면 중앙에서 눈 앞쪽까지의 거리를 측정합니다(어느 쪽 눈이라도 괜찮습니다). 자나 줄자를 사용하고 측정하는 동안 안경은 무시하십시오.\n2. 거리가 111 AAA가 될 때까지 앞뒤로 몸을 기울이거나 의자를 움직여 위치를 조정합니다.\n3. 올바른 거리에 도달한 후에는 머리를 안정시키고 카메라가 얼굴 전체를 선명하게 볼 수 있도록 자를 따로 보관해 두세요.\n4. 키보드(또는 휴대폰 화면 키패드)에서 RETURN을 눌러 계속 진행합니다. ",lt:"1. Išmatuokite atstumą nuo ekrano centro iki akies priekio (bet kuri akis tinka). Naudokite liniuotę arba matavimo juostą ir matavimo metu nekreipkite dėmesio į akinius.\n2. Sureguliuokite savo padėtį pasilenkdami į priekį arba atgal arba judindami kėdę, kol atstumas bus 111 AAA.\n3. Kai būsite tinkamu atstumu, laikykite galvą stabiliai ir padėkite liniuotę į šalį, kad fotoaparatas aiškiai matytų visą jūsų veidą.\n4. Norėdami tęsti, paspauskite RETURN klaviatūroje (arba telefono ekrano klaviatūroje). ",ms:"1. Ukur jarak dari tengah skrin anda ke hadapan mata anda (sama ada mata baik). Gunakan pembaris atau pita pengukur, dan abaikan sebarang cermin mata semasa mengukur.\n2. Laraskan kedudukan anda dengan bersandar ke hadapan atau belakang, atau dengan menggerakkan kerusi anda, sehingga jaraknya ialah 111 AAA.\n3. Sebaik sahaja anda berada pada jarak yang betul, pastikan kepala anda stabil dan ketepikan pembaris untuk memastikan kamera mempunyai pandangan yang jelas ke seluruh wajah anda.\n4. Tekan RETURN pada papan kekunci anda (atau pad kekunci skrin telefon) untuk meneruskan. ",ml:"1. നിങ്ങളുടെ സ്‌ക്രീനിൻ്റെ മധ്യഭാഗത്ത് നിന്ന് കണ്ണിൻ്റെ മുൻഭാഗത്തേക്കുള്ള ദൂരം അളക്കുക (ഒന്നുകിൽ കണ്ണ് നന്നായിരിക്കും). ഒരു റൂളർ അല്ലെങ്കിൽ ടേപ്പ് അളവ് ഉപയോഗിക്കുക, അളക്കുന്ന സമയത്ത് ഏതെങ്കിലും ഗ്ലാസുകൾ അവഗണിക്കുക.\n2. ദൂരം 111 എഎഎ ആകുന്നത് വരെ മുന്നോട്ട് അല്ലെങ്കിൽ പിന്നിലേക്ക് ചാഞ്ഞുകൊണ്ട് അല്ലെങ്കിൽ നിങ്ങളുടെ കസേര ചലിപ്പിച്ചുകൊണ്ട് നിങ്ങളുടെ സ്ഥാനം ക്രമീകരിക്കുക.\n3. നിങ്ങൾ കൃത്യമായ അകലത്തിൽ എത്തിക്കഴിഞ്ഞാൽ, നിങ്ങളുടെ തല സ്ഥിരമായി സൂക്ഷിക്കുകയും ക്യാമറയ്ക്ക് നിങ്ങളുടെ മുഴുവൻ മുഖവും വ്യക്തമായി കാണാമെന്ന് ഉറപ്പാക്കാൻ ഭരണാധികാരിയെ മാറ്റിവെക്കുകയും ചെയ്യുക.\n4. തുടരുന്നതിന് നിങ്ങളുടെ കീബോർഡിൽ (അല്ലെങ്കിൽ ഫോൺ-സ്ക്രീൻ കീപാഡ്) RETURN അമർത്തുക. ",no:"1. Mål avstanden fra midten av skjermen til forsiden av øyet (begge øyne er fine). Bruk en linjal eller målebånd, og ignorer eventuelle briller mens du måler.\n2. Juster posisjonen din ved å lene deg forover eller bakover, eller ved å flytte stolen, til avstanden er 111 AAA.\n3. Når du er i riktig avstand, hold hodet stødig og sett linjalen til side for å sikre at kameraet har fri sikt over hele ansiktet ditt.\n4. Trykk RETURN på tastaturet (eller telefonskjermtastaturet) for å fortsette. ",fa:"1. فاصله مرکز صفحه نمایش خود را تا جلوی چشم اندازه گیری کنید (هر کدام از چشم ها خوب است). از یک خط کش یا متر استفاده کنید و در حین اندازه گیری از هر عینکی چشم پوشی کنید.\n2. موقعیت خود را با خم شدن به جلو یا عقب یا با حرکت دادن صندلی تنظیم کنید تا فاصله 111 AAA شود.\n3. هنگامی که در فاصله صحیح قرار گرفتید، سر خود را ثابت نگه دارید و خط کش را کنار بگذارید تا مطمئن شوید دوربین دید واضحی از کل صورت شما دارد.\n4. برای ادامه، RETURN را روی صفحه کلید (یا صفحه کلید صفحه تلفن) فشار دهید. ",pl:"1. Zmierz odległość od środka ekranu do przedniej części oka (każde oko jest w porządku). Użyj linijki lub miarki i podczas pomiaru ignoruj ​​okulary.\n2. Dostosuj swoją pozycję, pochylając się do przodu, do tyłu lub przesuwając krzesło, aż odległość wyniesie 111 AAA.\n3. Gdy znajdziesz się we właściwej odległości, trzymaj głowę stabilnie i odłóż linijkę na bok, aby kamera dobrze widziała całą Twoją twarz.\n4. Naciśnij POWRÓT na klawiaturze (lub klawiaturze na ekranie telefonu), aby kontynuować. ",pt:"1. Meça a distância do centro da tela até a frente do olho (qualquer um dos olhos está bem). Use uma régua ou fita métrica e ignore os óculos durante a medição.\n2. Ajuste sua posição inclinando-se para frente ou para trás, ou movendo a cadeira, até que a distância seja 111 AAA.\n3. Quando estiver na distância correta, mantenha a cabeça firme e deixe a régua de lado para garantir que a câmera tenha uma visão clara de todo o seu rosto.\n4. Pressione RETURN no teclado (ou no teclado da tela do telefone) para continuar. ",ro:"1. Măsurați distanța de la centrul ecranului la partea din față a ochiului (fiecare ochi este bine). Folosiți o riglă sau o bandă de măsură și ignorați orice ochelari în timp ce măsurați.\n2. Reglați-vă poziția aplecându-vă înainte sau înapoi, sau mișcându-vă scaunul, până când distanța este de 111 AAA.\n3. Odată ce vă aflați la distanța corectă, țineți capul neclintit și lăsați rigla deoparte pentru a vă asigura că camera are o vedere clară a întregii fețe.\n4. Apăsați RETURN de pe tastatură (sau de pe ecranul telefonului) pentru a continua. ",ru:"1. Измерьте расстояние от центра экрана до передней части глаза (любой глаз в порядке). Используйте линейку или рулетку и не обращайте внимания на очки при измерении.\n2. Отрегулируйте свое положение, наклоняясь вперед или назад или перемещая стул до тех пор, пока расстояние не составит 111 ААА.\n3. Как только вы окажетесь на нужном расстоянии, держите голову ровно и отложите линейку в сторону, чтобы камера могла четко видеть все ваше лицо.\n4. Нажмите RETURN на клавиатуре (или клавиатуре экрана телефона), чтобы продолжить. ",sr:"1. Измерите растојање од центра екрана до предњег дела ока (свако око је у реду). Користите лењир или мерну траку и занемарите наочаре док мерите.\n2. Подесите свој положај нагињањем напред или назад, или померањем столице, све док растојање не буде 111 ААА.\n3. Када се нађете на тачној удаљености, држите главу мирно и одложите лењир да бисте осигурали да камера има јасан поглед на цело лице.\n4. Притисните РЕТУРН на тастатури (или тастатури на екрану телефона) да бисте наставили. ",es:"1. Mide la distancia desde el centro de tu pantalla hasta el frente de tu ojo (cualquiera de los dos está bien). Usa una regla o cinta métrica, e ignora cualquier gafas mientras mides. 2. Ajusta tu posición inclinándote hacia adelante o hacia atrás, o moviendo tu silla, hasta que la distancia sea de 111 AAA. 3. Una vez que estés a la distancia correcta, mantén la cabeza firme y deja la regla a un lado para asegurar que la cámara tenga una vista clara de toda tu cara. 4. Presiona RETURN en tu teclado (o teclado de pantalla del teléfono) para continuar.",sw:"1. Pima umbali kutoka katikati ya skrini yako hadi mbele ya jicho lako (jicho lolote ni sawa). Tumia rula au kipimo cha tepi, na upuuze miwani yoyote wakati wa kupima.\n2. Rekebisha msimamo wako kwa kuegemea mbele au nyuma, au kwa kusonga kiti chako, hadi umbali ni 111 AAA.\n3. Unapokuwa katika umbali ufaao, weka kichwa chako sawa na uweke rula kando ili kuhakikisha kuwa kamera ina mwonekano wazi wa uso wako wote.\n4. Bonyeza RETURN kwenye kibodi yako (au vitufe vya skrini ya simu) ili kuendelea. ",sv:"1. Mät avståndet från mitten av skärmen till framsidan av ögat (bdera ögat är bra). Använd en linjal eller ett måttband och ignorera eventuella glasögon medan du mäter.\n2. Justera din position genom att luta dig framåt eller bakåt, eller genom att flytta din stol, tills avståndet är 111 AAA.\n3. När du är på rätt avstånd, håll huvudet stadigt och ställ linjalen åt sidan för att säkerställa att kameran har fri sikt över hela ditt ansikte.\n4. Tryck på RETURN på ditt tangentbord (eller telefonens knappsats) för att fortsätta. ",tl:"1. Sukatin ang distansya mula sa gitna ng iyong screen hanggang sa harap ng iyong mata (alinman sa mata ay maayos). Gumamit ng ruler o tape measure, at huwag pansinin ang anumang baso habang sumusukat.\n2. Ayusin ang iyong posisyon sa pamamagitan ng paghilig pasulong o likod, o sa pamamagitan ng paggalaw ng iyong upuan, hanggang ang distansya ay 111 AAA.\n3. Kapag nasa tamang distansya ka na, panatilihing matatag ang iyong ulo at itabi ang ruler upang matiyak na malinaw na nakikita ng camera ang iyong buong mukha.\n4. Pindutin ang RETURN sa iyong keyboard (o phone-screen keypad) upang magpatuloy. ",tr:"1. Ekranınızın ortasından gözünüzün ön kısmına kadar olan mesafeyi ölçün (her iki göz de iyidir). Bir cetvel veya şerit metre kullanın ve ölçüm yaparken gözlükleri dikkate almayın.\n2. Mesafe 111 AAA olana kadar öne veya arkaya eğilerek veya sandalyenizi hareket ettirerek konumunuzu ayarlayın.\n3. Doğru mesafeye geldiğinizde başınızı sabit tutun ve kameranın tüm yüzünüzü net bir şekilde görmesini sağlamak için cetveli bir kenara bırakın.\n4. Devam etmek için klavyenizdeki (veya telefon ekranı tuş takımınızdaki) RETURN tuşuna basın. ",ur:"1. اپنی اسکرین کے مرکز سے اپنی آنکھ کے سامنے تک فاصلے کی پیمائش کریں (یا تو آنکھ ٹھیک ہے)۔ ایک حکمران یا ٹیپ کی پیمائش کا استعمال کریں، اور پیمائش کرتے وقت کسی بھی شیشے کو نظر انداز کریں.\n2. آگے یا پیچھے جھک کر، یا اپنی کرسی کو حرکت دے کر اپنی پوزیشن کو ایڈجسٹ کریں، جب تک کہ فاصلہ 111 AAA نہ ہو۔\n3. ایک بار جب آپ صحیح فاصلے پر ہوں، اپنے سر کو ساکت رکھیں اور اس بات کو یقینی بنانے کے لیے کہ کیمرہ آپ کے پورے چہرے کا واضح نظارہ کر سکتا ہے، حکمران کو ایک طرف رکھیں۔\n4. آگے بڑھنے کے لیے اپنے کی بورڈ (یا فون اسکرین کی پیڈ) پر RETURN دبائیں۔ "},RC_TestDistances:{"en-US":"Test Distances",ar:"اختبار المسافات",hy:"Փորձարկման հեռավորություններ",bg:"Тестови разстояния","zh-CN":"测试距离","zh-HK":"測試距離",hr:"Test udaljenosti",cs:"Testovací vzdálenosti",da:"Test afstande",nl:"Afstanden testen","en-UK":"Test Distances",fi:"Testietäisyydet",fr:"Tester les distances",de:"Testentfernungen",el:"Αποστάσεις δοκιμής",he:"מרחקי מבחן",hi:"दूरियाँ परीक्षण करें",hu:"Teszt távolságok",is:"Próf vegalengdir",id:"Jarak Tes",it:"Distanze di prova",ja:"テスト距離",kn:"ಪರೀಕ್ಷಾ ದೂರಗಳು",ko:"테스트 거리",lt:"Bandymo atstumai",ms:"Jarak Ujian",ml:"ടെസ്റ്റ് ദൂരങ്ങൾ",no:"Test avstander",fa:"فاصله های تست",pl:"Odległości testowe",pt:"Distâncias de teste",ro:"Distanțe de testare",ru:"Тестовые расстояния",sr:"Тест Дистанцес",es:"Prueba de distancias",sw:"Umbali wa Mtihani",sv:"Testa avstånd",tl:"Mga Distansya ng Pagsubok",tr:"Test Mesafeleri",ur:"ٹیسٹ فاصلے"},RC_canUsePhoneKeypad:{"en-US":"To respond, you can use the keypad on your phone.",ar:"للرد، يمكنك استخدام لوحة المفاتيح على هاتفك.",hy:"Պատասխանելու համար կարող եք օգտագործել ձեր հեռախոսի ստեղնաշարը:",bg:"За да отговорите, можете да използвате клавиатурата на телефона си.","zh-CN":"要回复,您可以使用手机上的键盘。","zh-HK":"要回复,您可以使用手機上的鍵盤。",hr:"Da biste odgovorili, možete koristiti tipkovnicu na telefonu.",cs:"Chcete-li odpovědět, můžete použít klávesnici na telefonu.",da:"For at svare kan du bruge tastaturet på din telefon.",nl:"Om te reageren kunt u het toetsenbord van uw telefoon gebruiken.","en-UK":"To respond, you can use the keypad on your mobile.",fi:"Voit vastata puhelimesi näppäimistön avulla.",fr:"Pour répondre, vous pouvez utiliser le clavier de votre téléphone.",de:"Um zu antworten, können Sie die Tastatur Ihres Telefons verwenden.",el:"Για να απαντήσετε, μπορείτε να χρησιμοποιήσετε το πληκτρολόγιο του τηλεφώνου σας.",he:"כדי להגיב, תוכל להשתמש בלוח המקשים בטלפון שלך.",hi:"उत्तर देने के लिए, आप अपने फ़ोन पर कीपैड का उपयोग कर सकते हैं।",hu:"A válaszadáshoz használhatja a telefon billentyűzetét.",is:"Til að svara geturðu notað takkaborðið á símanum þínum.",id:"Untuk merespons, Anda dapat menggunakan keypad di ponsel Anda.",it:"Per rispondere, puoi utilizzare il tastierino del tuo telefono.",ja:"応答するには、電話機のキーパッドを使用できます。",kn:"ಪ್ರತಿಕ್ರಿಯಿಸಲು, ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ ನೀವು ಕೀಪ್ಯಾಡ್ ಅನ್ನು ಬಳಸಬಹುದು.",ko:"응답하려면 전화기의 키패드를 사용할 수 있습니다.",lt:"Ryšys veikia! Dabar uždaroma. Ačiū.",ms:"Untuk membalas, anda boleh menggunakan pad kekunci pada telefon anda.",ml:"പ്രതികരിക്കാൻ, നിങ്ങളുടെ ഫോണിലെ കീപാഡ് ഉപയോഗിക്കാം.",no:"Koblingen fungerer! Nå lukkes den. Takk.",fa:"اتصال کار می کند! حالا در حال بستن است. متشکرم.",pl:"Aby odpowiedzieć, możesz użyć klawiatury w telefonie.",pt:"A conexão funciona! Agora está sendo encerrada. Obrigado.",ro:"Pentru a răspunde, puteți utiliza tastatura de pe telefon.",ru:"Соединение работает! Сейчас закрываю. Спасибо.",sr:"Да бисте одговорили, можете користити тастатуру на свом телефону.",es:"Para responder, puedes usar el teclado de tu teléfono.",sw:"Ili kujibu, unaweza kutumia vitufe kwenye simu yako.",sv:"För att svara kan du använda knappsatsen på din telefon.",tl:"Upang tumugon, maaari mong gamitin ang keypad sa iyong telepono.",tr:"Yanıt vermek için telefonunuzun tuş takımını kullanabilirsiniz.",ur:"جواب دینے کے لیے، آپ اپنے فون پر کی پیڈ استعمال کر سکتے ہیں۔"},RC_distanceTrackingRedo:{"en-US":"PROBLEM? If the distance seems terribly wrong, click here to recalibrate it, and restart this block.",ar:"مشكلة؟ إذا كانت المسافة تبدو خاطئة بشكل كبير، انقر هنا لإعادة معايرتها، وأعد تشغيل هذا الجزء.",hy:"ԽՆԴԻՐ. Եթե ​​հեռավորությունը ահավոր սխալ է թվում, սեղմեք այստեղ՝ այն վերահաշվարկելու համար և վերագործարկեք այս բլոկը:",bg:"ПРОБЛЕМ? Ако разстоянието изглежда ужасно грешно, щракнете тук, за да го калибрирате отново и рестартирайте този блок.","zh-CN":"问题?如果距离看起来非常错误,请单击此处重新校准,然后重新启动此块。","zh-HK":"問題?如果距離看起來非常錯誤,請按一下此處重新校準,然後重新啟動此區塊。",hr:"PROBLEM? Ako se udaljenost čini užasno pogrešnom, kliknite ovdje da je ponovno kalibrirate i ponovno pokrenite ovaj blok.",cs:"PROBLÉM? Pokud se vzdálenost zdá strašně špatná, kliknutím sem ji překalibrujte a restartujte tento blok.",da:"PROBLEM? Hvis afstanden virker frygtelig forkert, skal du klikke her for at kalibrere den igen og genstarte denne blok.",nl:"PROBLEEM? Als de afstand vreselijk verkeerd lijkt, klik dan hier om deze opnieuw te kalibreren en start dit blok opnieuw.","en-UK":"PROBLEM? If the distance seems terribly wrong, click here to recalibrate it, and restart this section.",fi:"ONGELMA? Jos etäisyys vaikuttaa hirveän väärältä, napsauta tätä kalibroidaksesi sen uudelleen ja käynnistä tämä lohko uudelleen.",fr:"PROBLÈME ? Si la distance semble terriblement incorrecte, cliquez ici pour la recalibrer et redémarrez ce bloc.",de:"PROBLEM? Wenn der Abstand völlig falsch erscheint, klicken Sie hier, um ihn neu zu kalibrieren, und starten Sie diesen Block neu.",el:"ΠΡΟΒΛΗΜΑ; Εάν η απόσταση φαίνεται τρομερά λάθος, κάντε κλικ εδώ για να την επαναβαθμονομήσετε και επανεκκινήστε αυτό το μπλοκ.",he:"בְּעָיָה? אם המרחק נראה שגוי מאוד, לחץ כאן כדי לכייל אותו מחדש, והפעל מחדש את הבלוק הזה.",hi:"संकट? यदि दूरी बहुत गलत लगती है, तो इसे पुनः कैलिब्रेट करने के लिए यहां क्लिक करें, और इस ब्लॉक को पुनरारंभ करें।",hu:"PROBLÉMA? Ha a távolság nagyon rossznak tűnik, kattintson ide az újrakalibráláshoz, és indítsa újra ezt a blokkot.",is:"VANDAMÁL? Ef fjarlægðin virðist hræðilega röng, smelltu hér til að endurkvarða hana og endurræstu þessa blokk.",id:"MASALAH? Jika jaraknya tampak sangat salah, klik di sini untuk mengkalibrasi ulang, dan mulai ulang blok ini.",it:"PROBLEMA? Se la distanza sembra terribilmente sbagliata, fai clic qui per ricalibrarla e riavvia questo blocco.",ja:"問題?距離が著しく間違っていると思われる場合は、ここをクリックして距離を再調整し、このブロックを再開してください。",kn:"ಸಮಸ್ಯೆ? ದೂರವು ತುಂಬಾ ತಪ್ಪಾಗಿ ಕಂಡುಬಂದರೆ, ಅದನ್ನು ಮರುಮಾಪನ ಮಾಡಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ ಮತ್ತು ಈ ಬ್ಲಾಕ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.",ko:"문제? 거리가 심하게 잘못된 것 같으면 여기를 클릭하여 다시 보정하고 이 블록을 다시 시작하세요.",lt:"PROBLEMA? Jei atstumas atrodo labai neteisingas, spustelėkite čia, kad jį iš naujo sukalibruotumėte ir paleistumėte bloką iš naujo.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"പ്രശ്നം? ദൂരം വളരെ തെറ്റാണെന്ന് തോന്നുന്നുവെങ്കിൽ, അത് വീണ്ടും കാലിബ്രേറ്റ് ചെയ്യാൻ ഇവിടെ ക്ലിക്ക് ചെയ്യുക, ഈ ബ്ലോക്ക് റീസ്റ്റാർട്ട് ചെയ്യുക.",no:"PROBLEM? Hvis avstanden virker veldig feil, klikk her for å kalibrere den på nytt, og start denne blokken på nytt.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"PROBLEM? Jeśli odległość wydaje się strasznie niewłaściwa, kliknij tutaj, aby ją ponownie skalibrować i zrestartuj ten blok.",pt:"PROBLEMA? Se a distância parecer terrivelmente errada, clique aqui para recalibrá-la e reinicie este bloco.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"¿PROBLEMA? Si la distancia parece terriblemente incorrecta, haz clic aquí para recalibrarla y reiniciar este bloque.",sw:"TATIZO? Ikiwa umbali unaonekana kuwa mbaya sana, bofya hapa ili kuirekebisha upya, na uanzishe upya kizuizi hiki.",sv:"PROBLEM? Om avståndet verkar väldigt fel, klicka här för att kalibrera om det och starta om det här blocket.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"SORUN? Mesafe çok yanlış görünüyorsa, yeniden kalibre etmek için buraya tıklayın ve bu bloğu yeniden başlatın.",ur:"مسئلہ؟ اگر فاصلہ بہت غلط لگتا ہے، تو اسے دوبارہ ترتیب دینے کے لیے یہاں کلک کریں، اور اس بلاک کو دوبارہ شروع کریں۔"},RC_distanceTrackingTitle:{"en-US":"Find Your Blindspot",ar:"اكتشف النقطة العمياء لديك",hy:"Գտեք ձեր կույր կետը",bg:"Намерете своето сляпо петно","zh-CN":"找到你的盲点","zh-HK":"找到你的盲點",hr:"Pronađite svoju slijepu točku",cs:"Najděte svůj Blindspot",da:"Find din blindvinkel",nl:"Vind uw blinde vlek","en-UK":"Find Your Blindspot",fi:"Löydä sokeapiste",fr:"Trouvez votre angle mort",de:"Finden Sie Ihren blinden Fleck",el:"Βρείτε το Blindspot σας",he:"מצא את נקודת העיוור שלך",hi:"अपना ब्लाइंडस्पॉट ढूंढें",hu:"Találja meg vakfoltját",is:"Finndu blindblettinn þinn",id:"Temukan Titik Buta Anda",it:"Trova il tuo punto cieco",ja:"盲点を見つけよう",kn:"ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್ ಅನ್ನು ಹುಡುಕಿ",ko:"맹점 찾기",lt:"Raskite savo akląją tašką",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ട് കണ്ടെത്തുക",no:"Finn din blindsone",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Znajdź swój martwy punkt",pt:"Encontre o seu ponto cego",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Encuentra tu punto ciego",sw:"Tafuta Blindspot yako",sv:"Hitta din blinda vinkel",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Kör Noktanızı Bulun",ur:"اپنا بلائنڈ سپاٹ تلاش کریں۔"},RC_errorCameraUseDenied:{"en-US":"As stated in its description, this study is incompatible with ooo, and needs the BBB browser running on a DDD with at least 222 CPU cores",ar:"كما هو مذكور في وصفه، هذه الدراسة غير متوافقة مع ooo، وتحتاج إلى متصفح BBB يعمل على DDD مع ما لا يقل عن 222 نواة CPU.",hy:"Ինչպես նշված է իր նկարագրության մեջ, այս ուսումնասիրությունը անհամատեղելի է ooo-ի հետ և անհրաժեշտ է, որ BBB զննարկիչը աշխատի DDD-ով, որն ունի առնվազն 222 պրոցեսորային միջուկ:",bg:"Както е посочено в описанието му, това проучване е несъвместимо с ooo и се нуждае от браузър BBB, работещ на DDD с поне 222 CPU ядра","zh-CN":"正如其描述中所述,本研究与 ooo 不兼容,并且需要在至少 222 个 CPU 核心的 DDD 上运行 BBB 浏览器","zh-HK":"如其描述中所述,本研究與 ooo 不相容,並且需要在至少 222 個 CPU 核心的 DDD 上執行 BBB 瀏覽器",hr:"Kao što je navedeno u opisu, ova studija nije kompatibilna s ooo i treba BBB preglednik koji radi na DDD-u s najmanje 222 CPU jezgre",cs:"Jak je uvedeno v popisu, tato studie je nekompatibilní s ooo a potřebuje prohlížeč BBB běžící na DDD s alespoň 222 CPU jádry",da:"Som angivet i dens beskrivelse, er denne undersøgelse inkompatibel med ooo og kræver, at BBB-browseren kører på en DDD med mindst 222 CPU-kerner",nl:"Zoals vermeld in de beschrijving, is deze studie incompatibel met ooo en heeft de BBB-browser nodig die draait op een DDD met minimaal 222 CPU-kernen","en-UK":"As stated in its description, this study is incompatible with ooo, and needs the BBB browser running on a DDD with at least 222 CPU cores",fi:"Kuten sen kuvauksessa todetaan, tämä tutkimus ei ole yhteensopiva ooo:n kanssa ja vaatii BBB-selaimen, joka toimii DDD:llä, jossa on vähintään 222 CPU-ydintä",fr:"Comme indiqué dans sa description, cette étude est incompatible avec ooo et nécessite le navigateur BBB fonctionnant sur un DDD avec au moins 222 cœurs de processeur.",de:"Wie in der Beschreibung angegeben, ist diese Studie nicht mit ooo kompatibel und erfordert, dass der BBB-Browser auf einem DDD mit mindestens 222 CPU-Kernen läuft",el:"Όπως αναφέρεται στην περιγραφή της, αυτή η μελέτη δεν είναι συμβατή με το ooo και χρειάζεται το πρόγραμμα περιήγησης BBB να λειτουργεί σε DDD με τουλάχιστον 222 πυρήνες CPU",he:"כפי שצוין בתיאורו, מחקר זה אינו תואם ל-ooo, וזקוק לדפדפן BBB הפועל על DDD עם לפחות 222 ליבות מעבד",hi:"जैसा कि इसके विवरण में कहा गया है, यह अध्ययन ओओओ के साथ असंगत है, और कम से कम 222 सीपीयू कोर के साथ डीडीडी पर चलने वाले बीबीबी ब्राउज़र की आवश्यकता है",hu:"Amint a leírásában szerepel, ez a tanulmány nem kompatibilis az ooo-val, és legalább 222 CPU maggal rendelkező DDD-n futó BBB böngészőre van szüksége",is:"Eins og fram kemur í lýsingu hennar er þessi rannsókn ósamrýmanleg ooo og þarf að BBB vafra keyrir á DDD með að minnsta kosti 222 CPU kjarna",id:"Sebagaimana tercantum dalam uraiannya, penelitian ini tidak kompatibel dengan ooo, dan memerlukan browser BBB yang berjalan pada DDD dengan setidaknya 222 inti CPU",it:"Come indicato nella sua descrizione, questo studio è incompatibile con ooo e necessita del browser BBB in esecuzione su un DDD con almeno 222 core CPU.",ja:"説明に記載されているように、この調査は ooo と互換性がなく、少なくとも 222 CPU コアを備えた DDD 上で実行される BBB ブラウザが必要です。",kn:"ಅದರ ವಿವರಣೆಯಲ್ಲಿ ಹೇಳಿರುವಂತೆ, ಈ ಅಧ್ಯಯನವು ooo ನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ ಮತ್ತು ಕನಿಷ್ಠ 222 CPU ಕೋರ್‌ಗಳೊಂದಿಗೆ DDD ನಲ್ಲಿ ಚಾಲನೆಯಲ್ಲಿರುವ BBB ಬ್ರೌಸರ್ ಅಗತ್ಯವಿದೆ",ko:"설명에 명시된 바와 같이 이 연구는 ooo와 호환되지 않으며 최소 222개의 CPU 코어가 있는 DDD에서 실행되는 BBB 브라우저가 필요합니다.",lt:"Kaip nurodyta jo aprašyme, šis tyrimas nesuderinamas su ooo ir jam reikia BBB naršyklės, veikiančios DDD su mažiausiai 222 procesoriaus branduoliais.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"അതിൻ്റെ വിവരണത്തിൽ പറഞ്ഞിരിക്കുന്നതുപോലെ, ഈ പഠനം ooo-മായി പൊരുത്തപ്പെടുന്നില്ല, കൂടാതെ കുറഞ്ഞത് 222 CPU കോറുകളുള്ള DDD-യിൽ പ്രവർത്തിക്കുന്ന BBB ബ്രൗസർ ആവശ്യമാണ്",no:"Som nevnt i beskrivelsen, er denne studien inkompatibel med ooo, og trenger BBB-nettleseren som kjører på en DDD med minst 222 CPU-kjerner",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Jak stwierdzono w opisie, to badanie jest niekompatybilne z ooo i wymaga przeglądarki BBB działającej na DDD z co najmniej 222 rdzeniami procesora",pt:"Conforme declarado em sua descrição, este estudo é incompatível com ooo e precisa do navegador BBB rodando em um DDD com pelo menos 222 núcleos de CPU",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Según se indica en su descripción, este estudio es incompatible con ooo y necesita que el navegador BBB se ejecute en un DDD con al menos 222 núcleos de CPU.",sw:"Kama ilivyoelezwa katika maelezo yake, utafiti huu hauoani na ooo, na unahitaji kivinjari cha BBB kinachotumia DDD yenye angalau cores 222 za CPU.",sv:"Som anges i beskrivningen är denna studie inkompatibel med ooo och behöver BBB-webbläsaren köras på en DDD med minst 222 CPU-kärnor",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Açıklamasında belirtildiği gibi bu çalışma ooo ile uyumlu değildir ve en az 222 CPU çekirdeğine sahip bir DDD üzerinde çalışan BBB tarayıcısına ihtiyaç duymaktadır.",ur:"جیسا کہ اس کی تفصیل میں بتایا گیا ہے، یہ مطالعہ ooo کے ساتھ مطابقت نہیں رکھتا ہے، اور اسے کم از کم 222 CPU کور والے DDD پر چلنے والے BBB براؤزر کی ضرورت ہے۔"},RC_errorNoCamera:{"en-US":"This study needs to use the webcam. Granting access to your webcam is optional, but we can't continue without it. If you said No by mistake and now wish to grant access to your camera, please find the camera icon in the address bar, click it, allow camera access, and refresh the page. To refresh the page, tap the refresh icon “⟳” in the address bar.",ar:'تحتاج هذه الدراسة إلى استخدام كاميرا الويب. منح الوصول إلى كاميرا الويب الخاصة بك اختياري، لكن لا يمكننا المتابعة بدونها. إذا قلت لا عن طريق الخطأ وترغب الآن في منح الوصول إلى الكاميرا، يرجى العثور على أيقونة الكاميرا في شريط العنوان، انقر عليها، اسمح بالوصول إلى الكاميرا، وقم بتحديث الصفحة. لتحديث الصفحة، اضغط على أيقونة التحديث "⟳" في شريط العنوان.',hy:"Այս ուսումնասիրությունը պետք է օգտագործի վեբ-տեսախցիկը: Ձեր վեբ-տեսախցիկի մուտքի թույլտվությունը պարտադիր չէ, բայց մենք չենք կարող շարունակել առանց դրա: Եթե ​​սխալմամբ «Ոչ» եք ասել և այժմ ցանկանում եք մուտք գործել ձեր տեսախցիկ, խնդրում ենք գտնել տեսախցիկի պատկերակը հասցեագոտում, սեղմել այն, թույլ տալ տեսախցիկի մուտքը և թարմացնել էջը: Էջը թարմացնելու համար հասցեագոտում հպեք «⟳» թարմացման պատկերակին:",bg:"Това изследване трябва да използва уеб камерата. Предоставянето на достъп до вашата уеб камера не е задължително, но не можем да продължим без него. Ако сте казали Не по погрешка и сега искате да предоставите достъп до вашата камера, моля, намерете иконата на камерата в адресната лента, щракнете върху нея, разрешете достъп до камерата и опреснете страницата. За да опресните страницата, докоснете иконата за опресняване „⟳“ в адресната лента.","zh-CN":"本研究需要使用网络摄像头。授予对网络摄像头的访问权限是可选的,但如果没有它,我们就无法继续。如果您错误地说“否”,现在希望授予对相机的访问权限,请在地址栏中找到相机图标,单击它,允许相机访问,然后刷新页面。要刷新页面,请点击地址栏中的刷新图标“⟳”。","zh-HK":"本研究需使用網路攝影機。授予對網路攝影機的存取權限是可選的,但如果沒有它,我們就無法繼續。如果您錯誤地說“否”,現在希望授予對相機的訪問權限,請在地址欄中找到相機圖標,單擊它,允許相機訪問,然後刷新頁面。若要重新整理頁面,請點選網址列中的重新整理圖示「⟳」。",hr:"Ova studija mora koristiti web kameru. Odobravanje pristupa vašoj web kameri nije obavezno, ali ne možemo nastaviti bez njega. Ako ste greškom rekli Ne i sada želite odobriti pristup svojoj kameri, pronađite ikonu kamere u adresnoj traci, kliknite je, dopustite pristup kameri i osvježite stranicu. Da biste osvježili stranicu, dodirnite ikonu za osvježavanje “⟳” u adresnoj traci.",cs:"Tato studie musí používat webovou kameru. Udělení přístupu k vaší webové kameře je volitelné, ale bez něj nemůžeme pokračovat. Pokud jste omylem řekli Ne a nyní si přejete udělit přístup ke své kameře, najděte ikonu fotoaparátu v adresním řádku, klikněte na ni, povolte přístup k fotoaparátu a obnovte stránku. Chcete-li stránku obnovit, klepněte na ikonu obnovení „⟳“ v adresním řádku.",da:'Denne undersøgelse skal bruge webcam. Det er valgfrit at give adgang til dit webcam, men vi kan ikke fortsætte uden det. Hvis du sagde nej ved en fejl og nu ønsker at give adgang til dit kamera, skal du finde kameraikonet i adresselinjen, klikke på det, tillade kameraadgang og opdatere siden. For at opdatere siden skal du trykke på opdateringsikonet "⟳" i adresselinjen.',nl:"Bij dit onderzoek moet gebruik worden gemaakt van de webcam. Het verlenen van toegang tot je webcam is optioneel, maar we kunnen niet zonder. Als u per ongeluk Nee hebt gezegd en nu toegang tot uw camera wilt verlenen, zoek dan het camerapictogram in de adresbalk, klik erop, sta cameratoegang toe en vernieuw de pagina. Om de pagina te vernieuwen, tikt u op het vernieuwingspictogram “⟳” in de adresbalk.","en-UK":"This study needs to use the webcam. Granting access to your webcam is optional, but we can't continue without it. If you said No by mistake and now wish to grant access to your camera, please find the camera icon in the address bar, click it, allow camera access, and refresh the page. To refresh the page, tap the refresh icon “⟳” in the address bar.",fi:'Tässä tutkimuksessa on käytettävä verkkokameraa. Verkkokameran käyttöoikeuden myöntäminen on valinnaista, mutta emme voi jatkaa ilman sitä. Jos sanoit vahingossa Ei ja haluat nyt myöntää kamerasi käyttöoikeuden, etsi kamerakuvake osoitepalkista, napsauta sitä, salli kameran käyttö ja päivitä sivu. Päivitä sivu napauttamalla päivityskuvaketta "⟳" osoitepalkissa.',fr:"Cette étude nécessite l'utilisation de la webcam. Accorder l'accès à votre webcam est facultatif, mais nous ne pouvons pas continuer sans cela. Si vous avez dit Non par erreur et souhaitez maintenant accorder l'accès à votre caméra, veuillez trouver l'icône de la caméra dans la barre d'adresse, cliquez dessus, autorisez l'accès à la caméra et actualisez la page. Pour actualiser la page, appuyez sur l'icône d'actualisation \"⟳\" dans la barre d'adresse.",de:"Für diese Studie muss die Webcam verwendet werden. Das Gewähren des Zugriffs auf Ihre Webcam ist optional, wir können jedoch ohne diesen Zugriff nicht fortfahren. Wenn Sie versehentlich „Nein“ gesagt haben und nun Zugriff auf Ihre Kamera gewähren möchten, suchen Sie bitte das Kamerasymbol in der Adressleiste, klicken Sie darauf, erlauben Sie den Kamerazugriff und aktualisieren Sie die Seite. Um die Seite zu aktualisieren, tippen Sie auf das Aktualisierungssymbol „⟳“ in der Adressleiste.",el:'Αυτή η μελέτη πρέπει να χρησιμοποιεί την κάμερα web. Η παραχώρηση πρόσβασης στην κάμερα web είναι προαιρετική, αλλά δεν μπορούμε να συνεχίσουμε χωρίς αυτήν. Εάν είπατε όχι κατά λάθος και τώρα θέλετε να παραχωρήσετε πρόσβαση στην κάμερά σας, βρείτε το εικονίδιο της κάμερας στη γραμμή διευθύνσεων, κάντε κλικ σε αυτό, επιτρέψτε την πρόσβαση στην κάμερα και ανανεώστε τη σελίδα. Για να ανανεώσετε τη σελίδα, πατήστε το εικονίδιο ανανέωσης "⟳" στη γραμμή διευθύνσεων.',he:'מחקר זה צריך להשתמש במצלמת האינטרנט. הענקת גישה למצלמת האינטרנט שלך היא אופציונלית, אך איננו יכולים להמשיך בלעדיה. אם אמרת לא בטעות וברצונך להעניק גישה למצלמה שלך, אנא מצא את סמל המצלמה בשורת הכתובת, לחץ עליו, אפשר גישה למצלמה ורענן את הדף. כדי לרענן את הדף, הקש על סמל הרענון "⟳" בשורת הכתובת.',hi:'इस अध्ययन के लिए वेबकैम का उपयोग करना आवश्यक है. आपके वेबकैम तक पहुंच प्रदान करना वैकल्पिक है, लेकिन हम इसके बिना जारी नहीं रख सकते। यदि आपने गलती से नहीं कहा है और अब अपने कैमरे तक पहुंच प्रदान करना चाहते हैं, तो कृपया पता बार में कैमरा आइकन ढूंढें, इसे क्लिक करें, कैमरे तक पहुंच की अनुमति दें और पृष्ठ को रीफ्रेश करें। पेज को रीफ्रेश करने के लिए, एड्रेस बार में रीफ्रेश आइकन "⟳" पर टैप करें।',hu:"Ehhez a tanulmányhoz webkamerát kell használni. A webkamerához való hozzáférés megadása nem kötelező, de enélkül nem tudjuk folytatni. Ha tévedésből nemet mondott, és most hozzáférést szeretne biztosítani kamerájához, keresse meg a kamera ikont a címsorban, kattintson rá, engedélyezze a kamera elérését, és frissítse az oldalt. Az oldal frissítéséhez koppintson a „⟳” frissítés ikonra a címsorban.",is:"Þessi rannsókn þarf að nota vefmyndavélina. Að veita aðgang að vefmyndavélinni þinni er valfrjálst, en við getum ekki haldið áfram án hennar. Ef þú sagðir Nei fyrir mistök og vilt nú veita aðgang að myndavélinni þinni, vinsamlegast finndu myndavélartáknið á veffangastikunni, smelltu á það, leyfðu myndavélaraðgang og endurnýjaðu síðuna. Til að endurnýja síðuna, bankaðu á endurnýjunartáknið „⟳“ á veffangastikunni.",id:"Penelitian ini perlu menggunakan webcam. Memberikan akses ke webcam Anda bersifat opsional, namun kami tidak dapat melanjutkan tanpanya. Jika Anda tidak sengaja mengatakan Tidak dan sekarang ingin memberikan akses ke kamera Anda, temukan ikon kamera di bilah alamat, klik, izinkan akses kamera, dan segarkan halaman. Untuk menyegarkan halaman, ketuk ikon segarkan “⟳” di bilah alamat.",it:"Questo studio necessita dell'uso della webcam. Concedere l'accesso alla tua webcam è facoltativo, ma non possiamo continuare senza di esso. Se hai detto No per errore e ora desideri concedere l'accesso alla tua fotocamera, trova l'icona della fotocamera nella barra degli indirizzi, cliccala, consenti l'accesso alla fotocamera e aggiorna la pagina. Per aggiornare la pagina, tocca l'icona di aggiornamento \"⟳\" nella barra degli indirizzi.",ja:"この研究ではウェブカメラを使用する必要があります。 Web カメラへのアクセスを許可するかどうかはオプションですが、それなしでは続行できません。間違って「いいえ」と答えてしまい、カメラへのアクセスを許可したい場合は、アドレス バーでカメラ アイコンを見つけてクリックし、カメラへのアクセスを許可して、ページを更新してください。ページを更新するには、アドレスバーの更新アイコン「⟳」をタップします。",kn:'ಈ ಅಧ್ಯಯನವು ವೆಬ್‌ಕ್ಯಾಮ್ ಅನ್ನು ಬಳಸುವ ಅಗತ್ಯವಿದೆ. ನಿಮ್ಮ ವೆಬ್‌ಕ್ಯಾಮ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡುವುದು ಐಚ್ಛಿಕವಾಗಿದೆ, ಆದರೆ ಅದು ಇಲ್ಲದೆ ನಾವು ಮುಂದುವರಿಯಲು ಸಾಧ್ಯವಿಲ್ಲ. ನೀವು ತಪ್ಪಾಗಿ ಇಲ್ಲ ಎಂದು ಹೇಳಿದರೆ ಮತ್ತು ಈಗ ನಿಮ್ಮ ಕ್ಯಾಮರಾಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಲು ಬಯಸಿದರೆ, ದಯವಿಟ್ಟು ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ ಕ್ಯಾಮರಾ ಐಕಾನ್ ಅನ್ನು ಹುಡುಕಿ, ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ, ಕ್ಯಾಮರಾ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ ಮತ್ತು ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ. ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಲು, ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿರುವ ರಿಫ್ರೆಶ್ ಐಕಾನ್ "⟳" ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.',ko:"이 연구에서는 웹캠을 사용해야 합니다. 웹캠에 대한 액세스 권한을 부여하는 것은 선택 사항이지만, 웹캠 없이는 계속할 수 없습니다. 실수로 아니요라고 선택했고 이제 카메라에 대한 액세스 권한을 부여하려면 주소 표시줄에서 카메라 아이콘을 찾아 클릭한 후 카메라 액세스를 허용하고 페이지를 새로 고치세요. 페이지를 새로 고치려면 주소 표시줄에 있는 새로 고침 아이콘 “⟳”을 탭하세요.",lt:"Šiam tyrimui reikia naudoti internetinę kamerą. Prieigos prie žiniatinklio kameros suteikimas yra neprivalomas, bet negalime tęsti be jos. Jei per klaidą pasakėte Ne ir dabar norite suteikti prieigą prie savo fotoaparato, adreso juostoje raskite fotoaparato piktogramą, spustelėkite ją, leiskite pasiekti fotoaparatą ir atnaujinkite puslapį. Norėdami atnaujinti puslapį, adreso juostoje palieskite atnaujinimo piktogramą „⟳“.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:'ഈ പഠനത്തിന് വെബ്‌ക്യാം ഉപയോഗിക്കേണ്ടതുണ്ട്. നിങ്ങളുടെ വെബ്‌ക്യാമിലേക്ക് ആക്‌സസ് അനുവദിക്കുന്നത് ഓപ്‌ഷണലാണ്, എന്നാൽ ഇത് കൂടാതെ ഞങ്ങൾക്ക് തുടരാനാകില്ല. നിങ്ങൾ അബദ്ധവശാൽ ഇല്ല എന്ന് പറയുകയും ഇപ്പോൾ നിങ്ങളുടെ ക്യാമറയിലേക്ക് ആക്‌സസ് അനുവദിക്കാൻ ആഗ്രഹിക്കുകയും ചെയ്യുന്നുവെങ്കിൽ, വിലാസ ബാറിലെ ക്യാമറ ഐക്കൺ കണ്ടെത്തുക, അതിൽ ക്ലിക്ക് ചെയ്യുക, ക്യാമറ ആക്‌സസ് അനുവദിക്കുക, പേജ് പുതുക്കുക. പേജ് പുതുക്കാൻ, വിലാസ ബാറിലെ പുതുക്കിയ ഐക്കൺ "⟳" ടാപ്പ് ചെയ്യുക.',no:'Denne studien må bruke webkameraet. Å gi tilgang til webkameraet ditt er valgfritt, men vi kan ikke fortsette uten det. Hvis du sa nei ved en feiltakelse og nå ønsker å gi tilgang til kameraet ditt, kan du finne kameraikonet i adressefeltet, klikke på det, gi kameratilgang og oppdatere siden. For å oppdatere siden, trykk på oppdateringsikonet "⟳" i adressefeltet.',fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"W tym badaniu konieczne jest użycie kamery internetowej. Przyznanie dostępu do kamery internetowej jest opcjonalne, ale bez niego nie możemy kontynuować pracy. Jeśli przez pomyłkę odpowiedziałeś Nie, a teraz chcesz przyznać dostęp do swojej kamery, znajdź ikonę kamery w pasku adresu, kliknij ją, zezwól na dostęp do kamery i odśwież stronę. Aby odświeżyć stronę, dotknij ikony odświeżania „⟳” w pasku adresu.",pt:"Este estudo precisa usar a webcam. A concessão de acesso à sua webcam é opcional, mas não podemos continuar sem ela. Se você disse Não por engano e agora deseja conceder acesso à sua câmera, encontre o ícone da câmera na barra de endereço, clique nele, permita o acesso à câmera e atualize a página. Para atualizar a página, toque no ícone de atualização “⟳” na barra de endereço.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Este estudio necesita usar la cámara web. Otorgar acceso a tu cámara web es opcional, pero no podemos continuar sin ello. Si dijiste No por error y ahora deseas otorgar acceso a tu cámara, por favor encuentra el ícono de la cámara en la barra de direcciones, haz clic en él, permite el acceso a la cámara y actualiza la página. Para actualizar la página, toca el ícono de actualización “⟳” en la barra de direcciones.",sw:'Utafiti huu unahitaji kutumia kamera ya wavuti. Kutoa ufikiaji kwa kamera yako ya wavuti ni hiari, lakini hatuwezi kuendelea bila hiyo. Ikiwa ulisema Hapana kimakosa na sasa ungependa kutoa ufikiaji wa kamera yako, tafadhali tafuta aikoni ya kamera kwenye upau wa anwani, uibofye, ruhusu ufikiaji wa kamera na uonyeshe ukurasa upya. Ili kuonyesha upya ukurasa, gusa aikoni ya kuonyesha upya "⟳" katika upau wa anwani.',sv:'Denna studie måste använda webbkameran. Att ge åtkomst till din webbkamera är valfritt, men vi kan inte fortsätta utan den. Om du sa nej av misstag och nu vill ge åtkomst till din kamera, hitta kameraikonen i adressfältet, klicka på den, tillåt kameraåtkomst och uppdatera sidan. För att uppdatera sidan, tryck på uppdateringsikonen "⟳" i adressfältet.',tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bu çalışmada web kamerasının kullanılması gerekiyor. Web kameranıza erişim izni vermek isteğe bağlıdır ancak onsuz devam edemeyiz. Yanlışlıkla Hayır dediyseniz ve şimdi kameranıza erişim izni vermek istiyorsanız, lütfen adres çubuğunda kamera simgesini bulun, tıklayın, kamera erişimine izin verin ve sayfayı yenileyin. Sayfayı yenilemek için adres çubuğundaki “⟳” yenileme simgesine dokunun.",ur:'اس مطالعہ کو ویب کیم استعمال کرنے کی ضرورت ہے۔ آپ کے ویب کیم تک رسائی دینا اختیاری ہے، لیکن ہم اس کے بغیر جاری نہیں رکھ سکتے۔ اگر آپ نے غلطی سے نہیں کہا اور اب آپ اپنے کیمرے تک رسائی دینا چاہتے ہیں، تو براہ کرم ایڈریس بار میں کیمرہ آئیکن تلاش کریں، اس پر کلک کریں، کیمرے تک رسائی کی اجازت دیں، اور صفحہ کو ریفریش کریں۔ صفحہ کو ریفریش کرنے کے لیے، ایڈریس بار میں ریفریش آئیکن "⟳" کو تھپتھپائیں۔'},RC_gazeTracking:{"en-US":"Gaze Tracking",ar:"تتبع النظرات",hy:"Հայացքի հետևում",bg:"Проследяване на погледа","zh-CN":"视线追踪","zh-HK":"視線追蹤",hr:"Praćenje pogleda",cs:"Sledování pohledu",da:"Bliksporing",nl:"Blik volgen","en-UK":"Gaze Tracking",fi:"katseen seuranta",fr:"Suivi du regard",de:"Blickverfolgung",el:"Παρακολούθηση Βλέμματος",he:"מעקב מבט",hi:"टकटकी ट्रैकिंग",hu:"Tekintetkövetés",is:"Augnaráð",id:"Pelacakan Tatapan",it:"Tracciamento dello sguardo",ja:"視線追跡",kn:"ನೋಟ ಟ್ರ್ಯಾಕಿಂಗ್",ko:"시선 추적",lt:"Žvilgsnio sekimas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"നോട്ടം ട്രാക്കിംഗ്",no:"Blikksporing",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Śledzenie wzroku",pt:"Rastreamento de olhar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Seguimiento de la mirada",sw:"Ufuatiliaji wa Macho",sv:"Blickspårning",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bakış Takibi",ur:"نگاہوں سے باخبر رہنا"},RC_gazeTrackingIntro:{"en-US":'PLAY "CATCH THE CROSS!" Now we’ll set up gaze tracking, to monitor eye position. Keep your face in the video feed (see below). Click on the center of the cross, wherever it is. Make sure that your eyes are on it when you click it. When you click it, the cross will move to a new location. Click it in each new location, until the calibration is done. It\'s a game. Catch the cross!',ar:'العب "امسك الصليب!" الآن سنقوم بإعداد تتبع النظرات لمراقبة وضع العين. حافظ على وجهك في الفيديو (انظر أدناه). انقر على مركز الصليب أينما كان. تأكد من أن عينيك عليه عندما تنقر عليه. عندما تنقر عليه، سينتقل الصليب إلى موقع جديد. انقر عليه في كل موقع جديد حتى يتم الانتهاء من المعايرة. إنها لعبة. امسك الصليب!',hy:"ԽԱՂԱՑԵ՛Ք «CATCH THE CROSS»: Այժմ մենք կստեղծենք հայացքի հետևում՝ աչքի դիրքը վերահսկելու համար: Պահեք ձեր դեմքը տեսահոլովակում (տես ստորև): Սեղմեք խաչի կենտրոնի վրա, որտեղ էլ որ լինի: Համոզվեք, որ ձեր աչքերը դրա վրա են, երբ սեղմում եք այն: Երբ սեղմում եք այն, խաչը կտեղափոխվի նոր վայր: Սեղմեք այն յուրաքանչյուր նոր վայրում, մինչև ստուգաչափումն ավարտվի: Դա խաղ է: Բռնե՛ք խաչը։",bg:'ИГРАЙТЕ "ХВАНИ КРЪСТА!" Сега ще настроим проследяване на погледа, за да наблюдаваме позицията на очите. Дръжте лицето си във видео емисия (вижте по-долу). Кликнете върху центъра на кръста, където и да е той. Уверете се, че очите ви са върху него, когато щракнете върху него. Когато щракнете върху него, кръстът ще се премести на ново място. Кликнете върху него на всяко ново място, докато калибрирането приключи. Това е игра. Хвани кръста!',"zh-CN":"玩“抓住十字架!”现在我们将设置注视跟踪,以监控眼睛位置。将您的脸保持在视频源中(见下文)。单击十字的中心,无论它在哪里。单击它时请确保您的眼睛注视着它。当您单击它时,十字将移动到新位置。在每个新位置单击它,直到校准完成。这是一场游戏。抓住十字架!","zh-HK":"玩“抓住十字架!”現在我們將設置注視跟踪,以監控眼睛位置。將您的臉保持在視訊來源中(見下文)。點擊十字的中心,無論它在哪裡。單擊它時請確保您的眼睛注視著它。當您單擊它時,十字將移動到新位置。在每個新位置單擊它,直到校準完成。這是一場遊戲。抓住十字架!",hr:'IGRAJTE "UHVATI KRIŽ!" Sada ćemo postaviti praćenje pogleda kako bismo pratili položaj očiju. Zadržite svoje lice u video feedu (pogledajte dolje). Pritisnite središte križa, gdje god se nalazilo. Uvjerite se da su vam oči uprte u njega kada ga kliknete. Kada ga kliknete, križ će se pomaknuti na novo mjesto. Pritisnite ga na svakom novom mjestu, dok se kalibracija ne završi. To je igra. Uhvatite križ!',cs:'ZAHRAJTE SI "CHYTIT KŘÍŽ!" Nyní nastavíme sledování pohledu, abychom mohli sledovat polohu očí. Udržujte svůj obličej ve videu (viz níže). Klikněte na střed kříže, ať je kdekoli. Když na něj kliknete, ujistěte se, že na něj máte oči. Když na něj kliknete, kříž se přesune na nové místo. Klikněte na něj v každém novém místě, dokud nebude kalibrace dokončena. Je to hra. Chyťte kříž!',da:'SPIL "FANG KORSET!" Nu sætter vi bliksporing op for at overvåge øjenposition. Hold dit ansigt i videofeedet (se nedenfor). Klik på midten af ​​korset, uanset hvor det er. Sørg for, at dine øjne er på den, når du klikker på den. Når du klikker på det, flyttes krydset til en ny placering. Klik på den på hver ny placering, indtil kalibreringen er færdig. Det er et spil. Fang korset!',nl:'SPEEL "VANG HET KRUIS!" Nu gaan we gaze-tracking instellen om de oogpositie te controleren. Houd uw gezicht in de videofeed (zie hieronder). Klik op het midden van het kruis, waar het zich ook bevindt. Zorg ervoor dat uw ogen erop gericht zijn wanneer u erop klikt. Wanneer u erop klikt, verplaatst het kruis zich naar een nieuwe locatie. Klik erop op elke nieuwe locatie, totdat de kalibratie is voltooid. Het is een spel. Vang het kruis!',"en-UK":'PLAY "CATCH THE CROSS!" Now we’ll set up gaze tracking, to monitor eye position. Keep your face in the video feed (see below). Click on the centre of the cross, wherever it is. Make sure that your eyes are on it when you click it. When you click it, the cross will move to a new location. Click it in each new location, until the calibration is done. It\'s a game. Catch the cross!',fi:'PELAA "CATCH THE CROSS!" Nyt määritämme katseen seurannan silmän asennon seuraamiseksi. Pidä kasvosi videosyötteessä (katso alla). Napsauta ristin keskustaa, missä se on. Varmista, että silmäsi ovat siinä, kun napsautat sitä. Kun napsautat sitä, risti siirtyy uuteen paikkaan. Napsauta sitä jokaisessa uudessa paikassa, kunnes kalibrointi on valmis. Se on peli. Ota risti kiinni!',fr:"JOUER \"ATTRAPEZ LA CROIX !\" Nous allons maintenant configurer le suivi du regard, pour surveiller la position des yeux. Gardez votre visage dans le flux vidéo (voir ci-dessous). Cliquez sur le centre de la croix, où qu'elle soit. Assurez-vous que vos yeux sont dessus lorsque vous cliquez. Lorsque vous cliquez, la croix se déplacera vers un nouvel emplacement. Cliquez dessus à chaque nouvel emplacement, jusqu'à ce que l'étalonnage soit terminé. C'est un jeu. Attrapez la croix !",de:"SPIELEN SIE „FANG DAS KREUZ!“ Jetzt richten wir die Blickverfolgung ein, um die Augenposition zu überwachen. Behalten Sie Ihr Gesicht im Video-Feed (siehe unten). Klicken Sie auf die Mitte des Kreuzes, wo immer es sich befindet. Stellen Sie sicher, dass Ihre Augen darauf gerichtet sind, wenn Sie darauf klicken. Wenn Sie darauf klicken, wird das Kreuz an eine neue Position verschoben. Klicken Sie an jeder neuen Stelle darauf, bis die Kalibrierung abgeschlossen ist. Es ist ein Spiel. Fang das Kreuz!",el:'ΠΑΙΞΤΕ "CATCH THE CROSS!" Τώρα θα ρυθμίσουμε την παρακολούθηση βλέμματος, για να παρακολουθούμε τη θέση των ματιών. Κρατήστε το πρόσωπό σας στη ροή βίντεο (δείτε παρακάτω). Κάντε κλικ στο κέντρο του σταυρού, όπου κι αν βρίσκεται. Βεβαιωθείτε ότι τα μάτια σας είναι στραμμένα σε αυτό όταν το κάνετε κλικ. Όταν κάνετε κλικ σε αυτό, ο σταυρός θα μετακινηθεί σε μια νέα θέση. Κάντε κλικ σε κάθε νέα θέση, μέχρι να ολοκληρωθεί η βαθμονόμηση. Είναι ένα παιχνίδι. Πιάσε το σταυρό!',he:'שחקו "תפוס את הצלב!" כעת נגדיר מעקב מבט, כדי לנטר את מיקום העין. שמור את הפנים שלך בפיד הווידאו (ראה למטה). לחץ על מרכז הצלב, היכן שהוא. ודא שעיניך נשואות אליו כאשר אתה לוחץ עליו. כאשר תלחץ עליו, הצלב יעבור למיקום חדש. לחץ עליו בכל מיקום חדש, עד לסיום הכיול. זה משחק. לתפוס את הצלב!',hi:'खेलें "कैच द क्रॉस!" अब हम आंखों की स्थिति पर नजर रखने के लिए टकटकी ट्रैकिंग स्थापित करेंगे। वीडियो फ़ीड में अपना चेहरा रखें (नीचे देखें)। क्रॉस के केंद्र पर, चाहे वह कहीं भी हो, क्लिक करें। सुनिश्चित करें कि जब आप इसे क्लिक करें तो आपकी नजरें इस पर हों। जब आप इसे क्लिक करेंगे, तो क्रॉस एक नए स्थान पर चला जाएगा। अंशांकन पूरा होने तक इसे प्रत्येक नए स्थान पर क्लिक करें। यह एक खेल है. क्रॉस पकड़ो!',hu:'JÁTSSZA "CATCH THE CROSS!" Most beállítjuk a tekintetkövetést a szem helyzetének figyelésére. Tartsa arcát a videó hírfolyamában (lásd lent). Kattintson a kereszt közepére, bárhol is legyen. Győződjön meg róla, hogy a szeme rajta van, amikor rákattint. Ha rákattint, a kereszt új helyre kerül. Kattintson rá minden új helyen, amíg a kalibráció el nem készül. Ez egy játék. Fogd meg a keresztet!',is:'SPILAÐU "CATCH THE CROSS!" Nú munum við setja upp augnaráð til að fylgjast með augnstöðu. Haltu andlitinu þínu í myndbandsstraumnum (sjá hér að neðan). Smelltu á miðju krossins, hvar sem hann er. Gakktu úr skugga um að augun séu á því þegar þú smellir á það. Þegar þú smellir á hann færist krossinn á nýjan stað. Smelltu á það á hverjum nýjum stað þar til kvörðuninni er lokið. Það er leikur. Gríptu krossinn!',id:'MAINKAN "TANGKAP SALIB!" Sekarang kita akan menyiapkan pelacakan pandangan, untuk memantau posisi mata. Pertahankan wajah Anda di umpan video (lihat di bawah). Klik di tengah salib, dimanapun itu berada. Pastikan mata Anda tertuju padanya saat Anda mengkliknya. Saat Anda mengkliknya, salib akan berpindah ke lokasi baru. Klik di setiap lokasi baru, hingga kalibrasi selesai. Ini sebuah permainan. Tangkap salibnya!',it:'GIOCA "CATTURA LA CROCE!" Ora imposteremo il tracciamento dello sguardo, per monitorare la posizione degli occhi. Tieni il viso nel video (vedi sotto). Clicca al centro della croce, ovunque si trovi. Assicurati che i tuoi occhi siano su di essa quando la clicchi. Quando la clicchi, la croce si sposterà in una nuova posizione. Cliccala in ogni nuova posizione, fino a quando la calibrazione è completata. È un gioco. Cattura la croce!',ja:"「キャッチ・ザ・クロス」をプレイしよう!次に、目の位置を監視するために視線追跡を設定します。ビデオフィードに顔を映さないようにしてください (下記を参照)。十字の中心をクリックします(任意の場所)。クリックするときは必ず目を離さないようにしてください。クリックすると、十字が新しい位置に移動します。キャリブレーションが完了するまで、新しい場所ごとにクリックします。それはゲームです。クロスをキャッチ!",kn:'ಪ್ಲೇ "ಕ್ಯಾಚ್ ದಿ ಕ್ರಾಸ್!" ಈಗ ನಾವು ಕಣ್ಣಿನ ಸ್ಥಾನವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಲು ನೋಟ ಟ್ರ್ಯಾಕಿಂಗ್ ಅನ್ನು ಹೊಂದಿಸುತ್ತೇವೆ. ವೀಡಿಯೊ ಫೀಡ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಮುಖವನ್ನು ಇರಿಸಿ (ಕೆಳಗೆ ನೋಡಿ). ಶಿಲುಬೆಯ ಮಧ್ಯಭಾಗದಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ, ಅದು ಎಲ್ಲಿದ್ದರೂ. ನೀವು ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ನಿಮ್ಮ ಕಣ್ಣುಗಳು ಅದರ ಮೇಲೆ ಇರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. ನೀವು ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ, ಅಡ್ಡ ಹೊಸ ಸ್ಥಳಕ್ಕೆ ಚಲಿಸುತ್ತದೆ. ಮಾಪನಾಂಕ ನಿರ್ಣಯವು ಮುಗಿಯುವವರೆಗೆ ಪ್ರತಿ ಹೊಸ ಸ್ಥಳದಲ್ಲಿ ಅದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. ಅದೊಂದು ಆಟ. ಶಿಲುಬೆಯನ್ನು ಹಿಡಿಯಿರಿ!',ko:'"십자가를 잡으세요!"를 플레이하세요. 이제 눈 위치를 모니터링하기 위해 시선 추적을 설정하겠습니다. 비디오 피드에 얼굴을 유지하세요(아래 참조). 십자가의 중앙이 어디에 있든 클릭하세요. 클릭할 때 눈이 거기에 있는지 확인하세요. 클릭하면 십자가가 새로운 위치로 이동합니다. 보정이 완료될 때까지 각각의 새 위치에서 클릭하세요. 그것은 게임이다. 십자가를 잡아라!',lt:'ŽAISKITE "PAGAUKITE KRYŽIUS!" Dabar nustatysime žvilgsnio sekimą, kad galėtume stebėti akių padėtį. Laikykite savo veidą vaizdo įrašų sklaidos kanale (žr. toliau). Spustelėkite kryžiaus centrą, kad ir kur jis būtų. Įsitikinkite, kad spustelėdami jį nukreipėte akis. Kai spustelėsite jį, kryžius persikels į naują vietą. Spustelėkite jį kiekvienoje naujoje vietoje, kol bus atliktas kalibravimas. Tai žaidimas. Pagauk kryžių!',ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:'കളിക്കുക "കുരിശ് പിടിക്കുക!" കണ്ണിൻ്റെ സ്ഥാനം നിരീക്ഷിക്കാൻ ഞങ്ങൾ ഇപ്പോൾ നോട്ട ട്രാക്കിംഗ് സജ്ജീകരിക്കും. വീഡിയോ ഫീഡിൽ നിങ്ങളുടെ മുഖം സൂക്ഷിക്കുക (ചുവടെ കാണുക). കുരിശ് എവിടെയായിരുന്നാലും അതിൻ്റെ മധ്യഭാഗത്ത് ക്ലിക്കുചെയ്യുക. നിങ്ങൾ അതിൽ ക്ലിക്ക് ചെയ്യുമ്പോൾ നിങ്ങളുടെ കണ്ണുകൾ അതിൽ ഉണ്ടെന്ന് ഉറപ്പാക്കുക. നിങ്ങൾ അതിൽ ക്ലിക്ക് ചെയ്യുമ്പോൾ, കുരിശ് ഒരു പുതിയ സ്ഥലത്തേക്ക് മാറും. കാലിബ്രേഷൻ പൂർത്തിയാകുന്നതുവരെ ഓരോ പുതിയ സ്ഥലത്തും അതിൽ ക്ലിക്ക് ചെയ്യുക. അതൊരു കളിയാണ്. കുരിശ് പിടിക്കുക!',no:'SPILL "CATCH THE CROSS!" Nå skal vi sette opp blikksporing for å overvåke øyeposisjon. Hold ansiktet ditt i videofeeden (se nedenfor). Klikk på midten av korset, uansett hvor det er. Pass på at øynene dine er på den når du klikker på den. Når du klikker på det, flyttes krysset til et nytt sted. Klikk den på hvert nytt sted, til kalibreringen er fullført. Det er et spill. Fang korset!',fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"ZAGRAJ „ZŁAP KRZYŻ!” Teraz skonfigurujemy śledzenie wzroku, aby monitorować położenie oczu. Trzymaj twarz w kanale wideo (patrz poniżej). Kliknij środek krzyża, gdziekolwiek się on znajduje. Kiedy klikniesz, upewnij się, że Twoje oczy są na niego skierowane. Po kliknięciu krzyżyk przesunie się w nowe miejsce. Kliknij go w każdej nowej lokalizacji, aż do zakończenia kalibracji. To jest gra. Złap krzyż!",pt:'JOGUE "PEGUE A CRUZ!" Agora vamos configurar o rastreamento do olhar para monitorar a posição dos olhos. Mantenha seu rosto no feed de vídeo (veja abaixo). Clique no centro da cruz, onde quer que esteja. Certifique-se de que seus olhos estejam voltados para ele ao clicar nele. Ao clicar nela, a cruz se moverá para um novo local. Clique nele em cada novo local, até que a calibração seja concluída. É um jogo. Pegue a cruz!',ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:'JUEGA "¡ATRAPA LA CRUZ!" Ahora configuraremos el seguimiento de la mirada para monitorear la posición de los ojos. Mantén tu rostro en el video (ver abajo). Haz clic en el centro de la cruz, donde sea que esté. Asegúrate de que tus ojos estén en ella cuando hagas clic. Cuando hagas clic, la cruz se moverá a una nueva ubicación. Haz clic en cada nueva ubicación, hasta que la calibración esté completa. Es un juego. ¡Atrapa la cruz!',sw:'CHEZA "CHAMAA MSALABA!" Sasa tutaweka ufuatiliaji wa macho, kufuatilia nafasi ya macho. Weka uso wako kwenye mpasho wa video (tazama hapa chini). Bonyeza katikati ya msalaba, popote ulipo. Hakikisha kuwa macho yako yanaitazama unapoibofya. Unapobofya, msalaba utahamia eneo jipya. Bofya katika kila eneo jipya, hadi urekebishaji utakapokamilika. Ni mchezo. Shika msalaba!',sv:'SPELA "CATCH THE CROSS!" Nu ska vi ställa in blickspårning för att övervaka ögonpositionen. Håll ditt ansikte i videoflödet (se nedan). Klicka på mitten av korset, var det än är. Se till att dina ögon är på den när du klickar på den. När du klickar på det flyttas krysset till en ny plats. Klicka på den på varje ny plats tills kalibreringen är klar. Det är ett spel. Fånga korset!',tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:'"HAÇI YAKALA!" OYNA Şimdi göz konumunu izlemek için bakış izlemeyi ayarlayacağız. Yüzünüzü video akışında tutun (aşağıya bakın). Nerede olursa olsun haçın merkezine tıklayın. Tıkladığınızda gözlerinizin üzerinde olduğundan emin olun. Tıkladığınızda çarpı yeni bir konuma taşınacaktır. Kalibrasyon tamamlanana kadar her yeni konumda buna tıklayın. Bu bir oyun. Haçı yakalayın!',ur:'"Catch the Cross!" کھیلیں اب ہم آنکھوں کی پوزیشن کی نگرانی کے لیے نگاہوں سے باخبر رہنے کے لیے سیٹ اپ کریں گے۔ اپنا چہرہ ویڈیو فیڈ میں رکھیں (نیچے دیکھیں)۔ کراس کے مرکز پر کلک کریں، جہاں کہیں بھی ہو۔ اس بات کو یقینی بنائیں کہ جب آپ اسے کلک کریں تو آپ کی نظریں اس پر ہیں۔ جب آپ اس پر کلک کریں گے، کراس ایک نئے مقام پر چلا جائے گا۔ ہر نئے مقام پر اس پر کلک کریں، جب تک کہ انشانکن مکمل نہ ہوجائے۔ یہ ایک کھیل ہے۔ صلیب کو پکڑو!'},RC_gazeTrackingNudge:{"en-US":"CATCH THE CROSS! We need your help. The eye tracker needs more training. As shown by the arrow, when you clicked, the tracker thought your gaze was far from the cross. Please click the cross at each new position. It's a game. Catch the cross!",ar:"امسك الصليب! نحن بحاجة إلى مساعدتك. يحتاج متتبع العين إلى مزيد من التدريب. كما هو موضح بالسهم، عندما نقرت، اعتقد المتتبع أن نظرك كان بعيدًا عن الصليب. يرجى النقر على الصليب في كل موضع جديد. إنها لعبة. امسك الصليب!",hy:"ԲՌՆԵՔ ԽԱՉԸ: Մենք ձեր օգնության կարիքն ունենք: Աչքի հետագծողին ավելի շատ մարզում է հարկավոր: Ինչպես ցույց է տալիս սլաքը, երբ դուք կտտացրել եք, հետախույզը կարծել է, որ ձեր հայացքը խաչից հեռու է: Խնդրում ենք սեղմել խաչը յուրաքանչյուր նոր դիրքում: Դա խաղ է: Բռնե՛ք խաչը։",bg:"ХВАНЕТЕ КРЪСТА! Имаме нужда от вашата помощ. Устройството за проследяване на очите се нуждае от повече обучение. Както е показано от стрелката, когато щракнете, тракерът смята, че погледът ви е далеч от кръста. Моля, щракнете върху кръста на всяка нова позиция. Това е игра. Хвани кръста!","zh-CN":"抓住十字架!我们需要你的帮助。眼动仪需要更多的训练。如箭头所示,当您点击时,追踪器认为您的目光远离十字架。请单击每个新位置处的叉号。这是一场游戏。抓住十字架!","zh-HK":"抓住十字架!我們需要你的幫助。眼動儀需要更多的訓練。如箭頭所示,當您點擊時,追蹤器認為您的目光遠離十字架。請點選每個新位置的叉號。這是一場遊戲。抓住十字架!",hr:"UHVATI KRIŽ! Trebamo vašu pomoć. Praćenju oka treba više obuke. Kao što je prikazano strelicom, kada ste kliknuli, tracker je mislio da je vaš pogled daleko od križa. Kliknite na križić na svakoj novoj poziciji. To je igra. Uhvatite križ!",cs:"CHYŤTE KŘÍŽ! Potřebujeme vaši pomoc. Eye tracker potřebuje více tréninku. Jak ukazuje šipka, když jste klikli, stopař si myslel, že váš pohled je daleko od kříže. Klikněte prosím na křížek u každé nové pozice. Je to hra. Chyťte kříž!",da:"FANG KORSET! Vi har brug for din hjælp. Eye trackeren har brug for mere træning. Som vist af pilen, når du klikkede, troede trackeren, at dit blik var langt fra korset. Klik venligst på krydset ved hver ny position. Det er et spil. Fang korset!",nl:"VANG HET KRUIS! Wij hebben uw hulp nodig. De eyetracker heeft meer training nodig. Zoals aangegeven door de pijl, dacht de tracker dat je blik ver van het kruis was verwijderd toen je klikte. Klik op het kruisje bij elke nieuwe positie. Het is een spel. Vang het kruis!","en-UK":"CATCH THE CROSS! We need your help. The eye tracker needs more training. As shown by the arrow, when you clicked, the tracker thought your gaze was far from the cross. Please click the cross at each new position. It's a game. Catch the cross!",fi:"OTA RISTISTÄ KAPPALE! Tarvitsemme apuasi. Katsemittari tarvitsee lisää koulutusta. Kuten nuolesta näkyy, kun napsautit, jäljitin luuli katseesi olevan kaukana rististä. Napsauta ristiä jokaisen uuden kohdan kohdalla. Se on peli. Ota risti kiinni!",fr:"ATTRAPEZ LA CROIX ! Nous avons besoin de votre aide. Le suivi oculaire a besoin de plus d'entraînement. Comme indiqué par la flèche, lorsque vous avez cliqué, le suivi a pensé que votre regard était loin de la croix. Veuillez cliquer sur la croix à chaque nouvelle position. C'est un jeu. Attrapez la croix !",de:"FANG DAS KREUZ! Wir brauchen Ihre Hilfe. Der Eyetracker benötigt mehr Schulung. Wie der Pfeil zeigt, ging der Tracker beim Klicken davon aus, dass Ihr Blick weit vom Kreuz entfernt war. Bitte klicken Sie bei jeder neuen Position auf das Kreuz. Es ist ein Spiel. Fang das Kreuz!",el:"ΠΙΑΣΕ ΤΟΝ ΣΤΑΥΡΟ! Χρειαζόμαστε τη βοήθειά σας. Το eye tracker χρειάζεται περισσότερη εκπαίδευση. Όπως φαίνεται από το βέλος, όταν κάνατε κλικ, ο ιχνηλάτης νόμιζε ότι το βλέμμα σας ήταν μακριά από το σταυρό. Κάντε κλικ στο σταυρό σε κάθε νέα θέση. Είναι ένα παιχνίδι. Πιάσε το σταυρό!",he:"תפוס את הצלב! אנחנו צריכים את עזרתכם. גשש העיניים זקוק לאימון נוסף. כפי שמוצג על ידי החץ, כאשר לחצת, הגשש חשב שהמבט שלך רחוק מהצלב. אנא לחץ על הצלב בכל עמדה חדשה. זה משחק. לתפוס את הצלב!",hi:"क्रॉस पकड़ो! हमे आपकी मदद की जरूरत है। आई ट्रैकर को अधिक प्रशिक्षण की आवश्यकता है। जैसा कि तीर से पता चलता है, जब आपने क्लिक किया, तो ट्रैकर को लगा कि आपकी नज़र क्रॉस से दूर है। कृपया प्रत्येक नई स्थिति पर क्रॉस पर क्लिक करें। यह एक खेल है. क्रॉस पकड़ो!",hu:"FOGJ EL A KERESZTET! Szükségünk van a segítségedre. A szemkövetőnek több képzésre van szüksége. Ahogy a nyíl mutatja, amikor kattintott, a nyomkövető azt gondolta, hogy a tekintete messze van a kereszttől. Kérjük, kattintson a keresztre minden új pozíciónál. Ez egy játék. Fogd meg a keresztet!",is:"GANGI KROSSINN! Við þurfum hjálp þína. Augnsporið þarf meiri þjálfun. Eins og örin sýnir, þegar þú smelltir, hélt rekjandann að augnaráð þitt væri langt frá krossinum. Vinsamlegast smelltu á krossinn við hverja nýja stöðu. Það er leikur. Gríptu krossinn!",id:"MENANGKAP SALIB! Kami membutuhkan bantuan Anda. Pelacak mata memerlukan lebih banyak pelatihan. Seperti yang ditunjukkan oleh panah, ketika Anda mengklik, pelacak mengira pandangan Anda jauh dari salib. Silakan klik tanda silang pada setiap posisi baru. Ini sebuah permainan. Tangkap salibnya!",it:"ACCHIAPPA LA CROCE! Abbiamo bisogno del tuo aiuto. Il tracciatore oculare ha bisogno di più allenamento. Come indicato dalla freccia, quando hai cliccato, il tracciatore ha pensato che il tuo sguardo fosse lontano dalla croce. Per favore, clicca sulla croce in ogni nuova posizione. È un gioco. Acchiappa la croce!",ja:"クロスをキャッチ!あなたの助けが必要です。アイトラッカーにはさらなるトレーニングが必要です。矢印で示されているように、クリックすると、トラッカーはあなたの視線が十字から遠く離れていると判断しました。新しい位置ごとにバツ印をクリックしてください。それはゲームです。クロスをキャッチ!",kn:"ಕ್ರಾಸ್ ಕ್ಯಾಚ್! ನಮಗೆ ನಿಮ್ಮ ಸಹಾಯ ಬೇಕು. ಕಣ್ಣಿನ ಟ್ರ್ಯಾಕರ್‌ಗೆ ಹೆಚ್ಚಿನ ತರಬೇತಿಯ ಅಗತ್ಯವಿದೆ. ಬಾಣದಿಂದ ತೋರಿಸಿರುವಂತೆ, ನೀವು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ, ನಿಮ್ಮ ನೋಟವು ಅಡ್ಡದಿಂದ ದೂರದಲ್ಲಿದೆ ಎಂದು ಟ್ರ್ಯಾಕರ್ ಭಾವಿಸಿದೆ. ದಯವಿಟ್ಟು ಪ್ರತಿ ಹೊಸ ಸ್ಥಾನದಲ್ಲಿ ಕ್ರಾಸ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. ಅದೊಂದು ಆಟ. ಶಿಲುಬೆಯನ್ನು ಹಿಡಿಯಿರಿ!",ko:"십자가를 잡으라! 여러분의 도움이 필요합니다. 아이트래커는 더 많은 훈련이 필요합니다. 화살표로 표시된 것처럼 클릭하면 추적기는 시선이 십자가에서 멀리 떨어져 있다고 생각했습니다. 각각의 새로운 위치에서 십자가를 클릭하십시오. 그것은 게임이다. 십자가를 잡아라!",lt:"PAGAUKITE KRYŽIUS! Mums reikia jūsų pagalbos. Akių stebėjimui reikia daugiau treniruočių. Kaip rodo rodyklė, kai spustelėjote, seklys manė, kad jūsų žvilgsnis buvo toli nuo kryžiaus. Kiekvienoje naujoje vietoje spustelėkite kryžių. Tai žaidimas. Pagauk kryžių!",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ക്രോസ് പിടിക്കുക! ഞങ്ങൾക്ക് നിങ്ങളുടെ സഹായം ആവശ്യമാണ്. ഐ ട്രാക്കറിന് കൂടുതൽ പരിശീലനം ആവശ്യമാണ്. അമ്പടയാളം കാണിക്കുന്നത് പോലെ, നിങ്ങൾ ക്ലിക്കുചെയ്യുമ്പോൾ, നിങ്ങളുടെ നോട്ടം കുരിശിൽ നിന്ന് വളരെ അകലെയാണെന്ന് ട്രാക്കർ കരുതി. ഓരോ പുതിയ സ്ഥാനത്തും ദയവായി ക്രോസിൽ ക്ലിക്ക് ചെയ്യുക. അതൊരു കളിയാണ്. കുരിശ് പിടിക്കുക!",no:"FANG KORSET! Vi trenger din hjelp. Øyesporeren trenger mer trening. Som vist av pilen, når du klikket, trodde sporeren at blikket ditt var langt fra korset. Vennligst klikk på krysset ved hver nye posisjon. Det er et spill. Fang korset!",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"ZŁAP KRZYŻ! Potrzebujemy twojej pomocy. Eye tracker wymaga więcej szkolenia. Jak pokazuje strzałka, po kliknięciu moduł śledzący pomyślał, że Twój wzrok jest daleko od krzyża. Proszę kliknąć krzyżyk przy każdej nowej pozycji. To jest gra. Złap krzyż!",pt:"PEGUE A CRUZ! Precisamos da sua ajuda. O rastreador ocular precisa de mais treinamento. Conforme mostrado pela seta, quando você clicou, o rastreador pensou que seu olhar estava longe da cruz. Clique na cruz em cada nova posição. É um jogo. Pegue a cruz!",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"¡ATRAPA LA CRUZ! Necesitamos tu ayuda. El rastreador ocular necesita más entrenamiento. Como muestra la flecha, cuando hiciste clic, el rastreador pensó que tu mirada estaba lejos de la cruz. Por favor, haz clic en la cruz en cada nueva posición. Es un juego. ¡Atrapa la cruz!",sw:"KAMATA MSALABA! Tunahitaji msaada wako. Kifuatilia macho kinahitaji mafunzo zaidi. Kama inavyoonyeshwa na mshale, ulipobofya, kifuatiliaji kilifikiri kuwa macho yako yalikuwa mbali na msalaba. Tafadhali bofya msalaba katika kila nafasi mpya. Ni mchezo. Shika msalaba!",sv:"FÅNG KORSET! Vi behöver din hjälp. Eye tracker behöver mer träning. Som pilen visar, när du klickade trodde spåraren att din blick var långt från korset. Klicka på krysset vid varje ny position. Det är ett spel. Fånga korset!",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"HARCAYI YAKALAYIN! Yardımına ihtiyacımız var. Göz takip cihazının daha fazla eğitime ihtiyacı var. Okla gösterildiği gibi, tıkladığınızda izleyici bakışınızın haçtan uzakta olduğunu düşünüyordu. Lütfen her yeni konumdaki çarpı işaretine tıklayın. Bu bir oyun. Haçı yakalayın!",ur:"کراس کو پکڑو! ہمیں آپ کی مدد کی ضرورت ہے۔ آئی ٹریکر کو مزید تربیت کی ضرورت ہے۔ جیسا کہ تیر سے دکھایا گیا ہے، جب آپ نے کلک کیا تو ٹریکر نے سوچا کہ آپ کی نگاہیں صلیب سے دور ہیں۔ براہ کرم ہر نئی پوزیشن پر کراس پر کلک کریں۔ یہ ایک کھیل ہے۔ صلیب کو پکڑو!"},RC_gazeTrackingTitle:{"en-US":"Set Up Gaze Tracking",ar:"إعداد تتبع النظرات",hy:"Կարգավորեք հայացքի հետևում",bg:"Настройте проследяване на погледа","zh-CN":"设置注视追踪","zh-HK":"設定注視追蹤",hr:"Postavite praćenje pogleda",cs:"Nastavte sledování pohledu",da:"Opsæt Gaze Tracking",nl:"Gaze-tracking instellen","en-UK":"Set Up Gaze Tracking",fi:"Määritä katseen seuranta",fr:"Configurer le suivi du regard",de:"Richten Sie die Blickverfolgung ein",el:"Ρύθμιση παρακολούθησης βλέμματος",he:"הגדר מעקב מבט",hi:"टकटकी ट्रैकिंग सेट करें",hu:"A Gaze Tracking beállítása",is:"Settu upp augnaráð",id:"Siapkan Pelacakan Pandangan",it:"Imposta il tracciamento dello sguardo",ja:"視線追跡のセットアップ",kn:"ನೋಟ ಟ್ರ್ಯಾಕಿಂಗ್ ಅನ್ನು ಹೊಂದಿಸಿ",ko:"시선 추적 설정",lt:"Nustatyti žvilgsnio sekimą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാഴ്ച ട്രാക്കിംഗ് സജ്ജീകരിക്കുക",no:"Sett opp blikksporing",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Skonfiguruj śledzenie wzroku",pt:"Configurar o rastreamento do olhar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Configurar seguimiento de mirada",sw:"Weka Ufuatiliaji wa Macho",sv:"Ställ in Gaze Tracking",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bakış Takibini Ayarlama",ur:"Gaze ٹریکنگ سیٹ اپ کریں۔"},RC_nearPointIntro:{"en-US":"We'll measure the distance between your eyes. Use the video image to watch your eyes. Hold a pen horizontally against your face in front of your eyes. Align your right and left thumb nails with the centers of your right and left pupils. Then bring the pen to the on-screen ruler to measure the separation between your thumbs. Allign your left thumb with zero and notice where your right thumb is. Put down the pen and click the ruler at that point. Finally, click OK to continue.",ar:"سنقيس المسافة بين عينيك. استخدم صورة الفيديو لمراقبة عينيك. امسك قلمًا أفقيًا أمام وجهك أمام عينيك. قم بمحاذاة أظافر إبهامك الأيمن والأيسر مع مراكز بؤبؤي عينيك الأيمن والأيسر. ثم أحضر القلم إلى المسطرة على الشاشة لقياس المسافة بين إبهاميك. قم بمحاذاة إبهامك الأيسر مع الصفر ولاحظ مكان إبهامك الأيمن. ضع القلم وانقر على المسطرة في تلك النقطة. أخيرًا، انقر على موافق للمتابعة.",hy:"Մենք չափելու ենք ձեր աչքերի հեռավորությունը: Ձեր աչքերը դիտելու համար օգտագործեք տեսանյութի պատկերը: Գրիչը ձեր դեմքին հորիզոնական պահեք ձեր աչքերի առաջ: Հավասարեցրեք ձեր աջ և ձախ բթամատի եղունգները ձեր աջ և ձախ աշակերտների կենտրոնների հետ: Այնուհետև գրիչը բերեք էկրանի քանոնի մոտ՝ ձեր բութ մատների միջև բաժանումը չափելու համար: Ձեր ձախ բութ մատը հավասարեցրեք զրոյի հետ և նկատեք, թե որտեղ է ձեր աջ բութ մատը: Գրիչը ցած դրեք և այդ կետում սեղմեք քանոնը: Վերջում սեղմեք OK՝ շարունակելու համար:",bg:"Ще измерим разстоянието между очите ви. Използвайте видео изображението, за да наблюдавате очите си. Дръжте писалка хоризонтално срещу лицето си пред очите си. Подравнете ноктите на десния и левия палец с центровете на дясната и лявата зеница. След това донесете писалката до линийката на екрана, за да измерите разстоянието между палците си. Подравнете левия си палец с нулата и забележете къде е десният палец. Поставете писалката и щракнете върху линийката в тази точка. Накрая щракнете върху OK, за да продължите.","zh-CN":"我们将测量您双眼之间的距离。使用视频图像观察您的眼睛。将笔水平放在眼前的脸上。将左右拇指指甲与左右瞳孔的中心对齐。然后将笔放在屏幕上的标尺上以测量拇指之间的间距。将左手拇指与零对齐,并注意右手拇指的位置。放下笔并在该点单击标尺。最后,单击“确定”继续。","zh-HK":"我們將測量您雙眼之間的距離。使用視訊影像觀察您的眼睛。將筆水平放在眼前的臉上。將左右拇指指甲與左右瞳孔的中心對齊。然後將筆放在螢幕上的標尺上以測量拇指之間的間距。將左手拇指與零對齊,並注意右手拇指的位置。放下筆並在該點點擊標尺。最後,按一下“確定”繼續。",hr:"Izmjerit ćemo udaljenost između vaših očiju. Koristite video sliku da promatrate svoje oči. Držite olovku vodoravno na licu ispred očiju. Poravnajte nokte desnog i lijevog palca sa središtima desne i lijeve zjenice. Zatim prinesite olovku ravnalu na zaslonu kako biste izmjerili razmak između svojih palaca. Poravnajte lijevi palac s nulom i primijetite gdje vam je desni palac. Spustite olovku i pritisnite ravnalo na tom mjestu. Na kraju kliknite OK za nastavak.",cs:"Změříme vám vzdálenost mezi očima. Pomocí videoobrazu sledujte své oči. Držte pero vodorovně na obličeji před očima. Zarovnejte pravé a levé nehty se středy pravé a levé zornice. Poté přiložte pero k pravítku na obrazovce a změřte vzdálenost mezi vašimi palci. Srovnejte levý palec s nulou a všimněte si, kde máte pravý palec. Položte pero a v tomto bodě klepněte na pravítko. Nakonec pokračujte kliknutím na OK.",da:"Vi måler afstanden mellem dine øjne. Brug videobilledet til at se dine øjne. Hold en kuglepen vandret mod dit ansigt foran dine øjne. Juster dine højre og venstre tommelfingernegle med midten af ​​dine højre og venstre pupiller. Tag derefter pennen hen til linealen på skærmen for at måle afstanden mellem dine tommelfingre. Ret din venstre tommelfinger mod nul, og læg mærke til, hvor din højre tommelfinger er. Læg pennen fra dig, og klik på linealen på det tidspunkt. Klik til sidst på OK for at fortsætte.",nl:"We meten de afstand tussen uw ogen. Gebruik het videobeeld om naar je ogen te kijken. Houd een pen horizontaal tegen uw gezicht, voor uw ogen. Lijn uw rechter- en linkerduimnagels uit met de middelpunten van uw rechter- en linkerpupillen. Breng vervolgens de pen naar de liniaal op het scherm om de afstand tussen uw duimen te meten. Lijn uw linkerduim uit met nul en merk op waar uw rechterduim is. Leg de pen neer en klik op dat punt met de liniaal. Klik ten slotte op OK om door te gaan.","en-UK":"We'll measure the distance between your eyes. Use the video image to watch your eyes. Hold a pen horizontally against your face in front of your eyes. Align your right and left thumb nails with the centres of your right and left pupils. Then bring the pen to the on-screen ruler to measure the separation between your thumbs. Align your left thumb with zero and notice where your right thumb is. Put down the pen and click the ruler at that point. Finally, click OK to continue.",fi:"Mittaamme silmiesi välisen etäisyyden. Käytä videokuvaa katsellaksesi silmiäsi. Pidä kynää vaakatasossa kasvojasi vasten silmiesi edessä. Kohdista oikean ja vasemman peukalon kynnesi oikean ja vasemman pupillisi keskikohtiin. Tuo sitten kynä näytön viivaimen luo mitataksesi peukalojesi välinen etäisyys. Kohdista vasen peukalosi nollaan ja huomaa, missä oikea peukalosi on. Aseta kynä alas ja napsauta viivainta siinä kohdassa. Jatka lopuksi napsauttamalla OK.",fr:"Nous mesurerons la distance entre vos yeux. Utilisez l'image vidéo pour observer vos yeux. Tenez un stylo horizontalement contre votre visage devant vos yeux. Alignez vos ongles de pouce droit et gauche avec le centre de vos pupilles droite et gauche. Ensuite, amenez le stylo à la règle à l'écran pour mesurer la séparation entre vos pouces. Alignez votre pouce gauche avec zéro et notez où se trouve votre pouce droit. Posez le stylo et cliquez sur la règle à cet endroit. Enfin, cliquez sur OK pour continuer.",de:"Wir messen den Abstand zwischen Ihren Augen. Benutzen Sie das Videobild, um Ihre Augen zu beobachten. Halten Sie einen Stift vor Ihren Augen waagerecht an Ihr Gesicht. Richten Sie Ihren rechten und linken Daumennagel an den Mittelpunkten Ihrer rechten und linken Pupille aus. Halten Sie dann den Stift an das Bildschirmlineal, um den Abstand zwischen Ihren Daumen zu messen. Richten Sie Ihren linken Daumen auf Null aus und achten Sie darauf, wo sich Ihr rechter Daumen befindet. Legen Sie den Stift ab und klicken Sie an dieser Stelle mit dem Lineal. Klicken Sie abschließend auf OK, um fortzufahren.",el:"Θα μετρήσουμε την απόσταση μεταξύ των ματιών σας. Χρησιμοποιήστε την εικόνα του βίντεο για να παρακολουθήσετε τα μάτια σας. Κρατήστε ένα στυλό οριζόντια στο πρόσωπό σας μπροστά στα μάτια σας. Ευθυγραμμίστε τα νύχια του δεξιού και του αριστερού αντίχειρα με το κέντρο της δεξιάς και της αριστερής κόρης σας. Στη συνέχεια, φέρτε το στυλό στον χάρακα της οθόνης για να μετρήσετε το διαχωρισμό μεταξύ των αντίχειρών σας. Ευθυγραμμίστε τον αριστερό σας αντίχειρα με το μηδέν και παρατηρήστε πού βρίσκεται ο δεξιός σας αντίχειρας. Αφήστε κάτω το στυλό και κάντε κλικ στο χάρακα σε εκείνο το σημείο. Τέλος, κάντε κλικ στο OK για να συνεχίσετε.",he:"אנו נמדוד את המרחק בין העיניים שלך. השתמש בתמונת הווידאו כדי לצפות בעיניים שלך. החזק עט אופקית מול הפנים שלך מול העיניים. יישר את ציפורני האגודל הימנית והשמאלית שלך עם מרכז האישונים הימניים והשמאליים שלך. לאחר מכן הביאו את העט לסרגל שעל המסך כדי למדוד את ההפרדה בין האגודלים. יישר את אגודל שמאל לאפס ושם לב היכן נמצא האגודל הימני. הנח את העט ולחץ על הסרגל באותה נקודה. לבסוף, לחץ על אישור כדי להמשיך.",hi:"हम आपकी आँखों के बीच की दूरी मापेंगे। अपनी आँखों को देखने के लिए वीडियो छवि का उपयोग करें। अपनी आंखों के सामने अपने चेहरे पर क्षैतिज रूप से एक पेन पकड़ें। अपने दाएं और बाएं अंगूठे के नाखूनों को अपने दाएं और बाएं पुतलियों के केंद्र के साथ संरेखित करें। फिर अपने अंगूठे के बीच की दूरी को मापने के लिए पेन को ऑन-स्क्रीन रूलर के पास लाएँ। अपने बाएं अंगूठे को शून्य पर संरेखित करें और ध्यान दें कि आपका दाहिना अंगूठा कहां है। पेन नीचे रखें और उस बिंदु पर रूलर पर क्लिक करें। अंत में, जारी रखने के लिए ओके पर क्लिक करें।",hu:"Megmérjük a távolságot a szemei ​​között. Használja a videoképet, hogy figyelje a szemét. Tartsa a tollat ​​vízszintesen az arcához, a szeme elé. Igazítsa jobb és bal hüvelykujjának körmét a jobb és bal pupillák középpontjához. Ezután vigye a tollat ​​a képernyőn megjelenő vonalzóhoz, hogy megmérje a hüvelykujjai közötti távolságot. Állítsa a bal hüvelykujját nullához, és figyelje meg, hol van a jobb hüvelykujja. Tegye le a tollat, és ezen a ponton kattintson a vonalzóra. Végül kattintson az OK gombra a folytatáshoz.",is:"Við mælum fjarlægðina á milli augna þinna. Notaðu myndbandsmyndina til að horfa á augun þín. Haltu penna láréttum að andliti þínu fyrir framan augun. Stilltu hægri og vinstri þumalfingursnöglum þínum við miðju hægri og vinstri sjáaldranna. Komdu síðan með pennann að reglustikunni á skjánum til að mæla bilið á milli þumalfingranna. Stilltu vinstri þumalfingri við núll og taktu eftir hvar hægri þumalfingur þinn er. Leggðu frá þér pennann og smelltu á reglustikuna á þeim tímapunkti. Að lokum, smelltu á OK til að halda áfram.",id:"Kami akan mengukur jarak antara mata Anda. Gunakan gambar video untuk memperhatikan mata Anda. Pegang pena secara horizontal di wajah Anda di depan mata Anda. Sejajarkan kuku ibu jari kanan dan kiri dengan titik tengah pupil kanan dan kiri. Kemudian dekatkan pena ke penggaris di layar untuk mengukur jarak antara ibu jari Anda. Sejajarkan ibu jari kiri Anda dengan angka nol dan perhatikan di mana ibu jari kanan Anda berada. Letakkan pena dan klik penggaris pada saat itu. Terakhir, klik OK untuk melanjutkan.",it:"Misureremo la distanza tra i tuoi occhi. Usa l'immagine video per osservare i tuoi occhi. Tieni una penna orizzontalmente contro il tuo viso davanti ai tuoi occhi. Allinea le unghie dei pollici destro e sinistro con i centri delle tue pupille destra e sinistra. Poi porta la penna al righello sullo schermo per misurare la separazione tra i tuoi pollici. Allinea il pollice sinistro con lo zero e nota dove si trova il pollice destro. Metti giù la penna e clicca sul righello a quel punto. Infine, clicca su OK per continuare.",ja:"あなたの目の間の距離を測定します。ビデオ画像を使用して目を観察してください。ペンを目の前で顔に対して水平に持ちます。左右の親指の爪を左右の瞳孔の中心に合わせます。次に、ペンを画面上の定規に持ってきて、親指の間の間隔を測定します。左手の親指をゼロに合わせて、右手の親指がどこにあるかに注目してください。ペンを置き、その時点で定規をクリックします。最後に、「OK」をクリックして続行します。",kn:"ನಿಮ್ಮ ಕಣ್ಣುಗಳ ನಡುವಿನ ಅಂತರವನ್ನು ನಾವು ಅಳೆಯುತ್ತೇವೆ. ನಿಮ್ಮ ಕಣ್ಣುಗಳನ್ನು ವೀಕ್ಷಿಸಲು ವೀಡಿಯೊ ಚಿತ್ರವನ್ನು ಬಳಸಿ. ನಿಮ್ಮ ಕಣ್ಣುಗಳ ಮುಂದೆ ನಿಮ್ಮ ಮುಖದ ವಿರುದ್ಧ ಪೆನ್ನನ್ನು ಅಡ್ಡಲಾಗಿ ಹಿಡಿದುಕೊಳ್ಳಿ. ನಿಮ್ಮ ಬಲ ಮತ್ತು ಎಡ ಹೆಬ್ಬೆರಳಿನ ಉಗುರುಗಳನ್ನು ನಿಮ್ಮ ಬಲ ಮತ್ತು ಎಡ ವಿದ್ಯಾರ್ಥಿಗಳ ಮಧ್ಯಭಾಗದೊಂದಿಗೆ ಜೋಡಿಸಿ. ನಂತರ ನಿಮ್ಮ ಹೆಬ್ಬೆರಳುಗಳ ನಡುವಿನ ಪ್ರತ್ಯೇಕತೆಯನ್ನು ಅಳೆಯಲು ಆನ್-ಸ್ಕ್ರೀನ್ ರೂಲರ್‌ಗೆ ಪೆನ್ ಅನ್ನು ತನ್ನಿ. ನಿಮ್ಮ ಎಡಗೈ ಹೆಬ್ಬೆರಳನ್ನು ಸೊನ್ನೆಯಿಂದ ಜೋಡಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಬಲ ಹೆಬ್ಬೆರಳು ಎಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ. ಪೆನ್ ಕೆಳಗೆ ಇರಿಸಿ ಮತ್ತು ಆ ಸಮಯದಲ್ಲಿ ರೂಲರ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. ಅಂತಿಮವಾಗಿ, ಮುಂದುವರೆಯಲು ಸರಿ ಕ್ಲಿಕ್ ಮಾಡಿ.",ko:"눈 사이의 거리를 측정해보겠습니다. 비디오 이미지를 사용하여 눈을 살펴보세요. 눈 앞에서 얼굴에 수평으로 펜을 대십시오. 오른쪽 및 왼쪽 엄지손가락 손톱을 오른쪽 및 왼쪽 동공의 중심에 맞춥니다. 그런 다음 펜을 화면의 눈금자에 가져와 엄지손가락 사이의 간격을 측정합니다. 왼쪽 엄지손가락을 0에 맞추고 오른쪽 엄지손가락이 어디에 있는지 확인하세요. 펜을 내려놓고 그 지점에서 눈금자를 클릭하세요. 마지막으로 확인을 클릭하여 계속하세요.",lt:"Mes išmatuosime atstumą tarp jūsų akių. Norėdami stebėti savo akis, naudokite vaizdo įrašo vaizdą. Laikykite rašiklį horizontaliai prie veido prieš akis. Sulygiuokite dešiniojo ir kairiojo nykščio nagus su dešiniojo ir kairiojo vyzdžių centrais. Tada nuneškite rašiklį prie ekrano liniuotės, kad pamatytumėte atstumą tarp nykščių. Kairįjį nykštį sulygiuokite su nuliu ir atkreipkite dėmesį, kur yra dešinysis nykštys. Nuleiskite rašiklį ir spustelėkite liniuotę toje vietoje. Galiausiai spustelėkite Gerai, kad tęstumėte.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"നിങ്ങളുടെ കണ്ണുകൾ തമ്മിലുള്ള ദൂരം ഞങ്ങൾ അളക്കും. നിങ്ങളുടെ കണ്ണുകൾ കാണാൻ വീഡിയോ ചിത്രം ഉപയോഗിക്കുക. നിങ്ങളുടെ കണ്ണുകൾക്ക് മുന്നിൽ നിങ്ങളുടെ മുഖത്തിന് നേരെ തിരശ്ചീനമായി ഒരു പേന പിടിക്കുക. നിങ്ങളുടെ വലത്, ഇടത് തള്ളവിരലുകളുടെ നഖങ്ങൾ നിങ്ങളുടെ വലത്, ഇടത് വിദ്യാർത്ഥികളുടെ മധ്യഭാഗത്ത് വിന്യസിക്കുക. തുടർന്ന് നിങ്ങളുടെ തള്ളവിരലുകൾ തമ്മിലുള്ള വേർതിരിവ് അളക്കാൻ ഓൺ-സ്‌ക്രീൻ റൂളറിലേക്ക് പേന കൊണ്ടുവരിക. നിങ്ങളുടെ ഇടത് തള്ളവിരൽ പൂജ്യം കൊണ്ട് വിന്യസിക്കുക, നിങ്ങളുടെ വലതു തള്ളവിരൽ എവിടെയാണെന്ന് ശ്രദ്ധിക്കുക. പേന താഴെയിട്ട് ആ ഘട്ടത്തിൽ റൂളറിൽ ക്ലിക്ക് ചെയ്യുക. അവസാനം, തുടരാൻ ശരി ക്ലിക്കുചെയ്യുക.",no:"Vi måler avstanden mellom øynene dine. Bruk videobildet til å se øynene dine. Hold en penn vannrett mot ansiktet foran øynene. Juster høyre og venstre tommelengle med midten av høyre og venstre pupille. Ta deretter pennen til linjalen på skjermen for å måle avstanden mellom tomlene. Juster venstre tommel mot null og legg merke til hvor høyre tommel er. Legg ned pennen og klikk på linjalen på det punktet. Til slutt klikker du OK for å fortsette.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierzymy odległość między Twoimi oczami. Użyj obrazu wideo, aby obserwować swoje oczy. Trzymaj długopis poziomo przy twarzy, przed oczami. Dopasuj paznokcie prawego i lewego kciuka do środków prawej i lewej źrenicy. Następnie zbliż pióro do linijki ekranowej i zmierz odległość między kciukami. Ustaw lewy kciuk na zero i zwróć uwagę, gdzie znajduje się prawy kciuk. Odłóż pióro i kliknij linijkę w tym miejscu. Na koniec kliknij OK, aby kontynuować.",pt:"Mediremos a distância entre seus olhos. Use a imagem do vídeo para observar seus olhos. Segure uma caneta horizontalmente contra o rosto, na frente dos olhos. Alinhe as unhas dos polegares direito e esquerdo com o centro das pupilas direita e esquerda. Em seguida, leve a caneta até a régua na tela para medir a separação entre os polegares. Alinhe o polegar esquerdo com zero e observe onde está o polegar direito. Abaixe a caneta e clique na régua nesse ponto. Por fim, clique em OK para continuar.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Mediremos la distancia entre tus ojos. Usa la imagen de video para observar tus ojos. Sostén un bolígrafo horizontalmente contra tu cara frente a tus ojos. Alinea las uñas de tus pulgares derecho e izquierdo con los centros de tus pupilas derecha e izquierda. Luego lleva el bolígrafo a la regla en pantalla para medir la separación entre tus pulgares. Alinea tu pulgar izquierdo con el cero y observa dónde está tu pulgar derecho. Deja el bolígrafo y haz clic en la regla en ese punto. Finalmente, haz clic en OK para continuar.",sw:"Tutapima umbali kati ya macho yako. Tumia picha ya video kutazama macho yako. Shikilia kalamu kwa usawa dhidi ya uso wako mbele ya macho yako. Sawazisha kucha zako za kidole gumba cha kulia na kushoto na vituo vya wanafunzi wako wa kulia na kushoto. Kisha leta kalamu kwenye rula ya skrini ili kupima utengano kati ya vidole gumba vyako. Linganisha kidole gumba chako cha kushoto na sifuri na utambue kidole gumba cha kulia kilipo. Weka kalamu chini na ubofye rula wakati huo. Hatimaye, bofya Sawa ili kuendelea.",sv:"Vi mäter avståndet mellan dina ögon. Använd videobilden för att titta på dina ögon. Håll en penna horisontellt mot ansiktet framför dina ögon. Rikta in dina högra och vänstra tumnaglar med mitten av dina högra och vänstra pupiller. Ta sedan med pennan till linjalen på skärmen för att mäta avståndet mellan tummarna. Rikta vänster tumme mot noll och lägg märke till var höger tumme är. Lägg ner pennan och klicka på linjalen vid den punkten. Klicka slutligen på OK för att fortsätta.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Gözlerinizin arasındaki mesafeyi ölçeceğiz. Gözlerinizi izlemek için video görüntüsünü kullanın. Bir kalemi gözlerinizin önünde yüzünüze yatay olarak tutun. Sağ ve sol başparmak tırnaklarınızı sağ ve sol gözbebeklerinizin merkezleriyle hizalayın. Daha sonra başparmaklarınız arasındaki mesafeyi ölçmek için kalemi ekran cetveline getirin. Sol baş parmağınızı sıfıra hizalayın ve sağ baş parmağınızın nerede olduğuna dikkat edin. Kalemi bırakın ve bu noktada cetvele tıklayın. Son olarak devam etmek için Tamam'a tıklayın.",ur:"ہم آپ کی آنکھوں کے درمیان فاصلے کی پیمائش کریں گے۔ اپنی آنکھوں کو دیکھنے کے لیے ویڈیو امیج کا استعمال کریں۔ اپنی آنکھوں کے سامنے اپنے چہرے کے خلاف افقی طور پر قلم پکڑیں۔ اپنے دائیں اور بائیں انگوٹھے کے ناخنوں کو اپنے دائیں اور بائیں شاگردوں کے مراکز کے ساتھ سیدھ میں رکھیں۔ پھر اپنے انگوٹھوں کے درمیان علیحدگی کی پیمائش کرنے کے لیے قلم کو آن اسکرین رولر پر لائیں۔ اپنے بائیں انگوٹھے کو صفر کے ساتھ سیدھا کریں اور دیکھیں کہ آپ کا دایاں انگوٹھا کہاں ہے۔ قلم نیچے رکھیں اور اس مقام پر حکمران پر کلک کریں۔ آخر میں، جاری رکھنے کے لیے ٹھیک ہے پر کلک کریں۔"},RC_nearPointTitle:{"en-US":"Measure Pupillary Distance",ar:"قياس المسافة بين الحدقتين",hy:"Չափել աշակերտի հեռավորությունը",bg:"Измерете зеничното разстояние","zh-CN":"测量瞳距","zh-HK":"測量瞳距",hr:"Izmjerite udaljenost zjenica",cs:"Změřte vzdálenost zornic",da:"Mål pupilafstand",nl:"Meet de pupilafstand","en-UK":"Measure Pupillary Distance",fi:"Mittaa pupillietäisyys",fr:"Mesurer la distance pupillaire",de:"Pupillenabstand messen",el:"Μετρήστε την απόσταση της κόρης",he:"למדוד מרחק אישונים",hi:"पुतली की दूरी मापें",hu:"Mérje meg a pupilla távolságát",is:"Mældu fjarlægð nemandans",id:"Ukur Jarak Pupil",it:"Misura la distanza interpupillare",ja:"瞳孔間距離の測定",kn:"ಪ್ಯೂಪಿಲ್ಲರಿ ದೂರವನ್ನು ಅಳೆಯಿರಿ",ko:"동공 거리 측정",lt:"Išmatuokite vyzdžių atstumą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"പ്യൂപ്പില്ലറി ദൂരം അളക്കുക",no:"Mål pupillavstand",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierz odległość źrenic",pt:"Medir a distância pupilar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Medir la distancia pupilar",sw:"Pima Umbali wa Pupillary",sv:"Mät pupillavstånd",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Gözbebeği Mesafesini Ölçün",ur:"Pupillary فاصلے کی پیمائش کریں"},RC_ok:{"en-US":"OK",ar:"حسنًا",hy:"Լավ",bg:"добре","zh-CN":"好的","zh-HK":"好的",hr:"U REDU",cs:"OK",da:"OK",nl:"OK","en-UK":"OK",fi:"OK",fr:"D'accord",de:"OK",el:"ΕΝΤΑΞΕΙ",he:"בְּסֵדֶר",hi:"ठीक है",hu:"RENDBEN",is:"Allt í lagi",id:"OKE",it:"Va bene",ja:"わかりました",kn:"ಸರಿ",ko:"좋아요",lt:"Gerai",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ശരി",no:"OK",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"OK",pt:"OK",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Está bien",sw:"Sawa",sv:"OK",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"TAMAM",ur:"ٹھیک ہے"},RC_panelButton:{"en-US":"Done",ar:"تم",hy:"Կատարված է",bg:"Готово","zh-CN":"完毕","zh-HK":"完畢",hr:"Gotovo",cs:"Hotovo",da:"Færdig",nl:"Klaar","en-UK":"Done",fi:"Tehty",fr:"Fait",de:"Erledigt",el:"Γινώμενος",he:"נַעֲשָׂה",hi:"हो गया",hu:"Kész",is:"Búið",id:"Selesai",it:"Fatto",ja:"終わり",kn:"ಮುಗಿದಿದೆ",ko:"완료",lt:"Atlikta",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ചെയ്തു",no:"Ferdig",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zrobione",pt:"Feito",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Hecho",sw:"Imekamilika",sv:"Gjort",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Tamamlamak",ur:"ہو گیا"},RC_panelIntro:{"en-US":" ",ar:'"""',hy:"#VALUE!",bg:"#VALUE!","zh-CN":"#VALUE!","zh-HK":"#VALUE!",hr:"#VALUE!",cs:"#VALUE!",da:"#VALUE!",nl:"#VALUE!","en-UK":"",fi:"#VALUE!",fr:"",de:"#VALUE!",el:"#VALUE!",he:"#VALUE!",hi:"#VALUE!",hu:"#VALUE!",is:"#VALUE!",id:"#VALUE!",it:'""',ja:"#VALUE!",kn:"#VALUE!",ko:"#VALUE!",lt:"#VALUE!",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"#VALUE!",no:"#VALUE!",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"#VALUE!",pt:"#VALUE!",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"",sw:"#VALUE!",sv:"#VALUE!",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"#VALUE!",ur:"#VALUE!"},RC_panelTitle:{"en-US":"Please press a button to calibrate",ar:"يرجى الضغط على زر للمعايرة",hy:"Խնդրում ենք սեղմել կոճակը չափաբերելու համար",bg:"Моля, натиснете бутон за калибриране","zh-CN":"请按按钮进行校准","zh-HK":"請按按鈕進行校準",hr:"Pritisnite gumb za kalibraciju",cs:"Pro kalibraci stiskněte tlačítko",da:"Tryk venligst på en knap for at kalibrere",nl:"Druk op een knop om te kalibreren","en-UK":"Please press a button to calibrate",fi:"Paina painiketta kalibroidaksesi",fr:"Veuillez appuyer sur un bouton pour calibrer.",de:"Bitte drücken Sie zum Kalibrieren eine Taste",el:"Πατήστε ένα κουμπί για βαθμονόμηση",he:"אנא לחץ על כפתור כדי לכייל",hi:"कृपया अंशांकन करने के लिए एक बटन दबाएँ",hu:"Kérjük, nyomja meg a gombot a kalibráláshoz",is:"Vinsamlegast ýttu á hnapp til að kvarða",id:"Silakan tekan tombol untuk mengkalibrasi",it:"Premere un pulsante per calibrare",ja:"ボタンを押して調整してください",kn:"ಮಾಪನಾಂಕ ನಿರ್ಣಯಿಸಲು ದಯವಿಟ್ಟು ಬಟನ್ ಒತ್ತಿರಿ",ko:"버튼을 눌러 교정하세요.",lt:"Norėdami sukalibruoti, paspauskite mygtuką",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാലിബ്രേറ്റ് ചെയ്യുന്നതിന് ദയവായി ഒരു ബട്ടൺ അമർത്തുക",no:"Trykk på en knapp for å kalibrere",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Naciśnij przycisk, aby skalibrować",pt:"Por favor, pressione um botão para calibrar",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Por favor, presione un botón para calibrar.",sw:"Tafadhali bonyeza kitufe ili kurekebisha",sv:"Vänligen tryck på en knapp för att kalibrera",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Kalibre etmek için lütfen bir düğmeye basın",ur:"براہ کرم کیلیبریٹ کرنے کے لیے ایک بٹن دبائیں۔"},RC_panelTitleNext:{"en-US":"Thanks for calibrating. Hit the button to continue.",ar:"شكرًا على المعايرة. اضغط على الزر للمتابعة.",hy:"Շնորհակալություն չափորոշման համար: Շարունակելու համար սեղմեք կոճակը:",bg:"Благодаря за калибрирането. Натиснете бутона, за да продължите.","zh-CN":"感谢您的校准。点击按钮继续。","zh-HK":"感謝您的校準。點擊按鈕繼續。",hr:"Hvala na kalibraciji. Pritisnite gumb za nastavak.",cs:"Díky za kalibraci. Pokračujte stisknutím tlačítka.",da:"Tak for kalibreringen. Tryk på knappen for at fortsætte.",nl:"Bedankt voor het kalibreren. Druk op de knop om door te gaan.","en-UK":"Thanks for calibrating. Press the button to continue.",fi:"Kiitos kalibroinnista. Jatka painamalla painiketta.",fr:"Merci pour l'étalonnage. Appuyez sur le bouton pour continuer.",de:"Vielen Dank für die Kalibrierung. Klicken Sie auf die Schaltfläche, um fortzufahren.",el:"Ευχαριστώ για τη βαθμονόμηση. Πατήστε το κουμπί για να συνεχίσετε.",he:"תודה על הכיול. לחץ על הכפתור כדי להמשיך.",hi:"अंशांकन के लिए धन्यवाद. जारी रखने के लिए बटन दबाएँ.",hu:"Köszönöm a kalibrálást. Nyomja meg a gombot a folytatáshoz.",is:"Takk fyrir kvörðunina. Ýttu á hnappinn til að halda áfram.",id:"Terima kasih telah mengkalibrasi. Tekan tombol untuk melanjutkan.",it:"Grazie per la calibrazione. Premi il pulsante per continuare.",ja:"校正してくれてありがとう。続行するにはボタンを押してください。",kn:"ಮಾಪನಾಂಕ ನಿರ್ಣಯಿಸಿದ್ದಕ್ಕಾಗಿ ಧನ್ಯವಾದಗಳು. ಮುಂದುವರಿಸಲು ಬಟನ್ ಒತ್ತಿರಿ.",ko:"교정해 주셔서 감사합니다. 계속하려면 버튼을 누르세요.",lt:"Ačiū, kad sukalibravote. Norėdami tęsti, paspauskite mygtuką.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാലിബ്രേറ്റ് ചെയ്തതിന് നന്ദി. തുടരാൻ ബട്ടൺ അമർത്തുക.",no:"Takk for kalibreringen. Trykk på knappen for å fortsette.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Dziękuję za kalibrację. Naciśnij przycisk, aby kontynuować.",pt:"Obrigado por calibrar. Aperte o botão para continuar.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Gracias por calibrar. Presiona el botón para continuar.",sw:"Asante kwa kusawazisha. Bonyeza kitufe ili kuendelea.",sv:"Tack för kalibreringen. Tryck på knappen för att fortsätta.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Kalibrasyon için teşekkürler. Devam etmek için düğmeye basın.",ur:"کیلیبریٹ کرنے کا شکریہ۔ جاری رکھنے کے لیے بٹن کو دبائیں۔"},RC_panelIntroNext:{"en-US":" ",ar:'""',hy:"#VALUE!",bg:"#VALUE!","zh-CN":"#VALUE!","zh-HK":"#VALUE!",hr:"#VALUE!",cs:"#VALUE!",da:"#VALUE!",nl:"#VALUE!","en-UK":"",fi:"#VALUE!",fr:"",de:"#VALUE!",el:"#VALUE!",he:"#VALUE!",hi:"#VALUE!",hu:"#VALUE!",is:"#VALUE!",id:"#VALUE!",it:'""',ja:"#VALUE!",kn:"#VALUE!",ko:"#VALUE!",lt:"#VALUE!",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"#VALUE!",no:"#VALUE!",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"#VALUE!",pt:"#VALUE!",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"",sw:"#VALUE!",sv:"#VALUE!",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"#VALUE!",ur:"#VALUE!"},RC_panelUsesWebcam:{"en-US":"uses webcam",ar:"يستخدم كاميرا الويب",hy:"օգտագործում է վեբ-տեսախցիկ",bg:"използва уеб камера","zh-CN":"使用网络摄像头","zh-HK":"使用網路攝影機",hr:"koristi web kameru",cs:"používá webovou kameru",da:"bruger webcam",nl:"maakt gebruik van een webcam","en-UK":"uses webcam",fi:"käyttää web-kameraa",fr:"utilise la webcam",de:"nutzt Webcam",el:"χρησιμοποιεί κάμερα web",he:"משתמש במצלמת אינטרנט",hi:"वेबकैम का उपयोग करता है",hu:"webkamerát használ",is:"notar vefmyndavél",id:"menggunakan kamera web",it:"utilizza la webcam",ja:"ウェブカメラを使用します",kn:"ವೆಬ್‌ಕ್ಯಾಮ್ ಬಳಸುತ್ತದೆ",ko:"웹캠을 사용합니다",lt:"naudoja internetinę kamerą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വെബ്ക്യാം ഉപയോഗിക്കുന്നു",no:"bruker webkamera",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"korzysta z kamery internetowej",pt:"usa webcam",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"usa cámara web",sw:"inatumia webcam",sv:"använder webbkamera",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"web kamerasını kullanır",ur:"ویب کیم استعمال کرتا ہے۔"},RC_panelUsesWebcamPhone:{"en-US":"uses webcam and phone",ar:"يستخدم كاميرا الويب والهاتف",hy:"օգտագործում է վեբ-տեսախցիկ և հեռախոս",bg:"използва уеб камера и телефон","zh-CN":"使用网络摄像头和电话","zh-HK":"使用網路攝影機和電話",hr:"koristi web kameru i telefon",cs:"používá webovou kameru a telefon",da:"bruger webcam og telefon",nl:"maakt gebruik van webcam en telefoon","en-UK":"uses webcam and mobile",fi:"käyttää web-kameraa ja puhelinta",fr:"utilise la webcam et le téléphone",de:"nutzt Webcam und Telefon",el:"χρησιμοποιεί κάμερα web και τηλέφωνο",he:"משתמש במצלמת אינטרנט ובטלפון",hi:"वेबकैम और फ़ोन का उपयोग करता है",hu:"webkamerát és telefont használ",is:"notar vefmyndavél og síma",id:"menggunakan webcam dan telepon",it:"utilizza webcam e telefono",ja:"ウェブカメラと電話を使用する",kn:"ವೆಬ್‌ಕ್ಯಾಮ್ ಮತ್ತು ಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತದೆ",ko:"웹캠과 전화를 사용합니다",lt:"naudoja internetinę kamerą ir telefoną",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വെബ്‌ക്യാമും ഫോണും ഉപയോഗിക്കുന്നു",no:"bruker webkamera og telefon",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"korzysta z kamery internetowej i telefonu",pt:"usa webcam e telefone",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"usa cámara web y teléfono",sw:"hutumia kamera ya wavuti na simu",sv:"använder webbkamera och telefon",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"web kamerası ve telefon kullanıyor",ur:"ویب کیم اور فون استعمال کرتا ہے۔"},RC_performance:{"en-US":"Graphics Performance",ar:"أداء الرسوميات",hy:"Գրաֆիկական կատարում",bg:"Графична производителност","zh-CN":"图形性能","zh-HK":"圖形效能",hr:"Grafička izvedba",cs:"Grafický výkon",da:"Grafisk ydeevne",nl:"Grafische prestaties","en-UK":"Graphics Performance",fi:"Grafiikka suorituskyky",fr:"Performances graphiques",de:"Grafikleistung",el:"Απόδοση γραφικών",he:"ביצועים גרפיים",hi:"ग्राफ़िक्स प्रदर्शन",hu:"Grafikai teljesítmény",is:"Grafísk árangur",id:"Performa Grafis",it:"Prestazioni grafiche",ja:"グラフィックス性能",kn:"ಗ್ರಾಫಿಕ್ಸ್ ಕಾರ್ಯಕ್ಷಮತೆ",ko:"그래픽 성능",lt:"Grafikos našumas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഗ്രാഫിക്സ് പ്രകടനം",no:"Grafisk ytelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Wydajność grafiki",pt:"Desempenho gráfico",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Rendimiento de gráficos",sw:"Utendaji wa Graphics",sv:"Grafikprestanda",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Grafik Performansı",ur:"گرافکس کی کارکردگی"},RC_performanceIntro:{"en-US":"Please do not disturb. Drawing graphics to assess web browser performance ...",ar:"يرجى عدم الإزعاج. يتم رسم الرسوم البيانية لتقييم أداء متصفح الويب ...",hy:"Խնդրում եմ մի խանգարեք: Գծագրական գրաֆիկա՝ վեբ բրաուզերի կատարողականությունը գնահատելու համար...",bg:"Моля, не безпокойте. Рисуване на графики за оценка на ефективността на уеб браузъра...","zh-CN":"请不要打扰。绘制图形来评估网络浏览器性能...","zh-HK":"請不要打擾。繪製圖形來評估網頁瀏覽器效能...",hr:"Molim vas ne smetajte. Crtanje grafike za procjenu performansi web preglednika ...",cs:"Prosím, nerušit. Kreslení grafiky pro posouzení výkonu webového prohlížeče...",da:"Forstyr venligst ikke. Tegning af grafik for at vurdere webbrowserens ydeevne ...",nl:"Gelieve niet te storen. Afbeeldingen tekenen om de prestaties van de webbrowser te beoordelen...","en-UK":"Please do not disturb. Drawing graphics to assess web browser performance ...",fi:"Älä häiritse. Grafiikan piirtäminen verkkoselaimen suorituskyvyn arvioimiseksi...",fr:"Veuillez ne pas déranger. Création de graphiques pour évaluer les performances du navigateur web ...",de:"Bitte nicht stören. Zeichnen von Grafiken zur Beurteilung der Webbrowser-Leistung ...",el:"Παρακαλώ μην ενοχλείτε. Σχεδίαση γραφικών για την αξιολόγηση της απόδοσης του προγράμματος περιήγησης ιστού ...",he:"נא לא להפריע. ציור גרפיקה להערכת ביצועי דפדפן אינטרנט...",hi:"कृपया परेशान न करें। वेब ब्राउज़र के प्रदर्शन का आकलन करने के लिए ग्राफ़िक्स बनाना...",hu:"Kérem, ne zavarjanak. Grafika rajzolása a webböngésző teljesítményének értékeléséhez...",is:"Vinsamlegast ekki trufla. Teikning grafík til að meta árangur vafra ...",id:"Tolong jangan ganggu. Menggambar grafik untuk menilai kinerja browser web ...",it:"Per favore, non disturbare. Sto disegnando grafici per valutare le prestazioni del browser web ...",ja:"邪魔しないでください。グラフィックを描画して Web ブラウザのパフォーマンスを評価します ...",kn:"ದಯವಿಟ್ಟು ತೊಂದರೆ ಕೊಡಬೇಡಿ. ವೆಬ್ ಬ್ರೌಸರ್ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ನಿರ್ಣಯಿಸಲು ಗ್ರಾಫಿಕ್ಸ್ ಅನ್ನು ಚಿತ್ರಿಸುವುದು ...",ko:"방해하지 마십시오. 웹 브라우저 성능을 평가하기 위한 그래픽 그리기...",lt:"Prašome netrukdyti. Grafikos piešimas žiniatinklio naršyklės našumui įvertinti...",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ദയവായി ശല്യപ്പെടുത്തരുത്. വെബ് ബ്രൗസർ പ്രകടനം വിലയിരുത്താൻ ഗ്രാഫിക്സ് വരയ്ക്കുന്നു ...",no:"Vennligst ikke forstyrr. Tegner grafikk for å vurdere nettleserens ytelse ...",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Proszę nie przeszkadzać. Rysowanie grafiki w celu oceny wydajności przeglądarki internetowej...",pt:"Por favor, não perturbe. Desenhar gráficos para avaliar o desempenho do navegador da web...",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Por favor, no molestar. Dibujando gráficos para evaluar el rendimiento del navegador web ...",sw:"Tafadhali usisumbue. Kuchora michoro ili kutathmini utendakazi wa kivinjari cha wavuti ...",sv:"Vänligen stör inte. Rita grafik för att bedöma webbläsarens prestanda ...",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Lütfen rahatsız etmeyin. Web tarayıcısının performansını değerlendirmek için grafik çizmek...",ur:"پلیز ڈسٹرب نہ کریں۔ ویب براؤزر کی کارکردگی کا جائزہ لینے کے لیے گرافکس ڈرائنگ..."},RC_performanceTitle:{"en-US":"Graphics Performance",ar:"أداء الرسوميات",hy:"Գրաֆիկական կատարում",bg:"Графична производителност","zh-CN":"图形性能","zh-HK":"圖形效能",hr:"Grafička izvedba",cs:"Grafický výkon",da:"Grafisk ydeevne",nl:"Grafische prestaties","en-UK":"Graphics Performance",fi:"Grafiikka suorituskyky",fr:"Performances graphiques",de:"Grafikleistung",el:"Απόδοση γραφικών",he:"ביצועים גרפיים",hi:"ग्राफ़िक्स प्रदर्शन",hu:"Grafikai teljesítmény",is:"Grafísk árangur",id:"Performa Grafis",it:"Prestazioni grafiche",ja:"グラフィックス性能",kn:"ಗ್ರಾಫಿಕ್ಸ್ ಕಾರ್ಯಕ್ಷಮತೆ",ko:"그래픽 성능",lt:"Grafikos našumas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഗ്രാഫിക്സ് പ്രകടനം",no:"Grafisk ytelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Wydajność grafiki",pt:"Desempenho gráfico",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Rendimiento de gráficos",sw:"Utendaji wa Graphics",sv:"Grafikprestanda",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Grafik Performansı",ur:"گرافکس کی کارکردگی"},RC_privacyCamera:{"en-US":"ASSURANCE OF CAMERA PRIVACY. No photos or video are recorded. Each webcam frame is used only inside this computer, solely to estimate eye and gaze positions, and then erased, within 10 seconds. Only the eye and gaze positions are retained.",ar:"ضمان خصوصية الكاميرا. لا يتم تسجيل أي صور أو فيديو. يتم استخدام كل إطار من كاميرا الويب فقط داخل هذا الكمبيوتر، فقط لتقدير مواضع العين والنظرة، ثم يتم محوه خلال 10 ثوانٍ. يتم الاحتفاظ فقط بمواضع العين والنظرة.",hy:"Տեսախցիկի ԳԱՂՏՆԻՈՒԹՅԱՆ ԱՊԱՀՈՎՈՒՄ. Ոչ մի լուսանկար կամ տեսանյութ չի ձայնագրվում: Տեսախցիկի յուրաքանչյուր շրջանակ օգտագործվում է միայն այս համակարգչի ներսում՝ բացառապես աչքերի և հայացքի դիրքերը գնահատելու համար, այնուհետև ջնջվում է 10 վայրկյանի ընթացքում: Պահպանվում են միայն աչքի և հայացքի դիրքերը:",bg:"ГАРАНЦИЯ ЗА ПОВЕРИТЕЛНОСТ НА КАМЕРАТА. Не се записват снимки или видео. Всеки кадър на уеб камера се използва само в този компютър, единствено за оценка на позициите на очите и погледа, след което се изтрива в рамките на 10 секунди. Запазват се само позициите на очите и погледа.","zh-CN":"相机隐私的保证。没有记录照片或视频。每个网络摄像头帧仅在计算机内部使用,仅用于估计眼睛和注视位置,然后在 10 秒内删除。仅保留眼睛和凝视位置。","zh-HK":"相機隱私的保證。沒有記錄照片或影片。每個網路攝影機幀僅在電腦內部使用,僅用於估計眼睛和注視位置,然後在 10 秒內刪除。僅保留眼睛和凝視位置。",hr:"JAMSTVO PRIVATNOSTI KAMERE. Ne snimaju se fotografije ili videozapisi. Svaki okvir web kamere koristi se samo unutar ovog računala, isključivo za procjenu položaja očiju i pogleda, a zatim se briše unutar 10 sekundi. Zadržavaju se samo položaji očiju i pogleda.",cs:"ZAJIŠTĚNÍ SOUKROMÍ KAMERY. Nejsou zaznamenány žádné fotografie ani video. Každý snímek webové kamery se používá pouze uvnitř tohoto počítače, pouze k odhadu polohy očí a pohledu, a poté se během 10 sekund vymaže. Zachovány jsou pouze pozice očí a pohledu.",da:"SIKKERHED OM KAMERAENS FORTROLIGHED. Der optages ingen billeder eller video. Hver webcam-ramme bruges kun inde i denne computer, udelukkende til at vurdere øjen- og blikpositioner og slettes derefter inden for 10 sekunder. Kun øjen- og blikpositionerne bevares.",nl:"WAARBORGEN VAN CAMERA PRIVACY. Er worden geen foto's of video's opgenomen. Elk webcamframe wordt alleen in deze computer gebruikt, uitsluitend om de oog- en blikposities te schatten, en vervolgens binnen 10 seconden gewist. Alleen de oog- en blikposities blijven behouden.","en-UK":"ASSURANCE OF CAMERA PRIVACY. No photos or video are recorded. Each webcam frame is used only inside this computer, solely to estimate eye and gaze positions, and then erased, within 10 seconds. Only the eye and gaze positions are retained.",fi:"KAMERAN YKSITYISYYDEN TAKEMINEN. Valokuvia tai videoita ei tallenneta. Jokaista verkkokameran kehystä käytetään vain tämän tietokoneen sisällä, vain silmän ja katseen sijainnin arvioimiseen, ja se poistetaan sitten 10 sekunnin kuluessa. Vain silmän ja katseen asennot säilyvät.",fr:"ASSURANCE DE CONFIDENTIALITÉ DE LA CAMÉRA. Aucune photo ni vidéo n'est enregistrée. Chaque image de la webcam est utilisée uniquement à l'intérieur de cet ordinateur, uniquement pour estimer les positions des yeux et du regard, puis effacée, dans les 10 secondes. Seules les positions des yeux et du regard sont conservées.",de:"GEWÄHRLEISTUNG DER DATENSCHUTZ DER KAMERA. Es werden keine Fotos oder Videos aufgezeichnet. Jeder Webcam-Frame wird nur innerhalb dieses Computers verwendet, ausschließlich zur Schätzung der Augen- und Blickpositionen, und dann innerhalb von 10 Sekunden gelöscht. Lediglich die Augen- und Blickpositionen bleiben erhalten.",el:"ΔΙΑΣΦΑΛΙΣΗ ΑΠΟΡΡΗΤΟΥ ΤΗΣ ΚΑΜΕΡΑΣ. Δεν εγγράφονται φωτογραφίες ή βίντεο. Κάθε πλαίσιο κάμερας web χρησιμοποιείται μόνο μέσα σε αυτόν τον υπολογιστή, αποκλειστικά για την εκτίμηση της θέσης των ματιών και του βλέμματος, και στη συνέχεια διαγράφεται εντός 10 δευτερολέπτων. Διατηρούνται μόνο οι θέσεις των ματιών και του βλέμματος.",he:"הבטחה לפרטיות המצלמה. לא מוקלטים תמונות או וידאו. כל מסגרת של מצלמת אינטרנט משמשת רק בתוך מחשב זה, אך ורק כדי להעריך את עמדות העין והמבט, ולאחר מכן נמחקה, תוך 10 שניות. רק עמדות העין והמבט נשמרות.",hi:"कैमरे की गोपनीयता का आश्वासन. कोई फ़ोटो या वीडियो रिकॉर्ड नहीं किया जाता. प्रत्येक वेबकैम फ्रेम का उपयोग केवल इस कंप्यूटर के अंदर किया जाता है, केवल आंख और टकटकी की स्थिति का अनुमान लगाने के लिए, और फिर 10 सेकंड के भीतर मिटा दिया जाता है। केवल आंख और टकटकी की स्थिति को बरकरार रखा गया है।",hu:"A KAMERA ADATVÉDELME BIZTOSÍTÁSA. Nem rögzítenek fényképeket vagy videót. Minden webkamera keret csak a számítógépen belül használható, kizárólag a szem és a tekintet helyzetének becslésére, majd 10 másodpercen belül törlésre kerül. Csak a szem és a tekintet helyzete marad meg.",is:"FYRIR FRÆÐI MYNDAVÉR. Engar myndir eða myndskeið eru tekin upp. Hver vefmyndavélarrammi er aðeins notaður inni í þessari tölvu, eingöngu til að áætla augn- og augnastöður, og síðan eytt innan 10 sekúndna. Aðeins augn- og augnstöður haldast.",id:"JAMINAN PRIVASI KAMERA. Tidak ada foto atau video yang direkam. Setiap frame webcam hanya digunakan di dalam komputer ini, semata-mata untuk memperkirakan posisi mata dan pandangan, lalu dihapus, dalam waktu 10 detik. Hanya posisi mata dan pandangan yang dipertahankan.",it:"ASSICURAZIONE DELLA PRIVACY DELLA FOTOCAMERA. Nessuna foto o video viene registrato. Ogni fotogramma della webcam viene utilizzato solo all'interno di questo computer, esclusivamente per stimare le posizioni degli occhi e dello sguardo, e poi cancellato, entro 10 secondi. Solo le posizioni degli occhi e dello sguardo vengono conservate.",ja:"カメラのプライバシーの確保。写真やビデオは記録されません。各 Web カメラ フレームはこのコンピューター内でのみ目と視線の位置を推定するためにのみ使用され、その後 10 秒以内に消去されます。目と視線の位置のみが保持されます。",kn:"ಕ್ಯಾಮರಾ ಗೌಪ್ಯತೆಯ ಭರವಸೆ. ಯಾವುದೇ ಫೋಟೋಗಳು ಅಥವಾ ವೀಡಿಯೊಗಳನ್ನು ರೆಕಾರ್ಡ್ ಮಾಡಲಾಗಿಲ್ಲ. ಪ್ರತಿಯೊಂದು ವೆಬ್‌ಕ್ಯಾಮ್ ಫ್ರೇಮ್ ಅನ್ನು ಈ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಮಾತ್ರ ಬಳಸಲಾಗುತ್ತದೆ, ಕೇವಲ ಕಣ್ಣು ಮತ್ತು ನೋಟದ ಸ್ಥಾನಗಳನ್ನು ಅಂದಾಜು ಮಾಡಲು ಮತ್ತು ನಂತರ 10 ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಅಳಿಸಲಾಗುತ್ತದೆ. ಕಣ್ಣು ಮತ್ತು ನೋಟದ ಸ್ಥಾನಗಳನ್ನು ಮಾತ್ರ ಉಳಿಸಿಕೊಳ್ಳಲಾಗುತ್ತದೆ.",ko:"카메라 개인정보 보호 보장. 사진이나 동영상은 녹화되지 않습니다. 각 웹캠 프레임은 이 컴퓨터 내부에서만 눈과 시선 위치를 추정하는 데만 사용되며 10초 이내에 삭제됩니다. 눈과 응시 위치만 유지됩니다.",lt:"KAMEROS PRIVATUMO UŽTIKRINIMAS. Neįrašoma jokių nuotraukų ar vaizdo įrašų. Kiekvienas internetinės kameros rėmelis naudojamas tik šiame kompiuteryje, tik akių ir žvilgsnio padėčiai įvertinti, o tada per 10 sekundžių ištrinamas. Išlaikoma tik akių ir žvilgsnio padėtis.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ക്യാമറ സ്വകാര്യതയുടെ ഉറപ്പ്. ഫോട്ടോകളോ വീഡിയോകളോ രേഖപ്പെടുത്തിയിട്ടില്ല. ഓരോ വെബ്‌ക്യാം ഫ്രെയിമും ഈ കമ്പ്യൂട്ടറിനുള്ളിൽ മാത്രമേ ഉപയോഗിക്കുന്നുള്ളൂ, കണ്ണിൻ്റെയും നോട്ടത്തിൻ്റെയും സ്ഥാനങ്ങൾ കണക്കാക്കാൻ മാത്രം, തുടർന്ന് 10 സെക്കൻഡിനുള്ളിൽ മായ്‌ച്ചുകളയുന്നു. കണ്ണിൻ്റെയും നോട്ടത്തിൻ്റെയും സ്ഥാനങ്ങൾ മാത്രം നിലനിർത്തിയിരിക്കുന്നു.",no:"SIKRING OM KAMERAPERSONVERN. Ingen bilder eller video er tatt opp. Hver webkameraramme brukes kun inne i denne datamaskinen, utelukkende for å beregne øye- og blikkposisjoner, og slettes deretter innen 10 sekunder. Kun øye- og blikkposisjonene beholdes.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"ZAPEWNIENIE PRYWATNOŚCI KAMERY. Nie są rejestrowane żadne zdjęcia ani filmy. Każda klatka kamery internetowej jest używana wyłącznie wewnątrz tego komputera, wyłącznie w celu oszacowania pozycji oczu i wzroku, a następnie usuwana w ciągu 10 sekund. Zachowywane są tylko pozycje oczu i wzroku.",pt:"GARANTIA DE PRIVACIDADE DA CÂMERA. Nenhuma foto ou vídeo é gravado. Cada quadro da webcam é usado apenas dentro deste computador, apenas para estimar as posições dos olhos e do olhar, e depois apagado em 10 segundos. Apenas as posições dos olhos e do olhar são mantidas.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"GARANTÍA DE PRIVACIDAD DE LA CÁMARA. No se graban fotos ni videos. Cada fotograma de la cámara web se utiliza solo dentro de esta computadora, únicamente para estimar las posiciones de los ojos y la mirada, y luego se borra, dentro de 10 segundos. Solo se retienen las posiciones de los ojos y la mirada.",sw:"UHAKIKISHO WA FARAGHA YA KAMERA. Hakuna picha au video iliyorekodiwa. Kila fremu ya kamera ya wavuti inatumika ndani ya kompyuta hii pekee, ili kukadiria nafasi za macho na kutazama, na kufutwa, ndani ya sekunde 10. Nafasi za macho na macho pekee ndizo zinazobaki.",sv:"FÖRSÄKRING AV KAMERANS INTEGRITET. Inga foton eller video spelas in. Varje webbkameraram används endast inuti den här datorn, enbart för att uppskatta ögon- och blickpositioner, och raderas sedan inom 10 sekunder. Endast ögon- och blickpositionerna behålls.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"KAMERA GİZLİLİĞİ GÜVENCESİ. Hiçbir fotoğraf veya video kaydedilmez. Her web kamerası çerçevesi yalnızca bu bilgisayarın içinde, yalnızca göz ve bakış konumlarını tahmin etmek için kullanılır ve ardından 10 saniye içinde silinir. Yalnızca göz ve bakış pozisyonları korunur.",ur:"کیمرے کی رازداری کی یقین دہانی۔ کوئی تصویر یا ویڈیو ریکارڈ نہیں ہے۔ ہر ویب کیم کا فریم صرف اس کمپیوٹر کے اندر استعمال ہوتا ہے، صرف آنکھوں اور نگاہوں کی پوزیشنوں کا اندازہ لگانے کے لیے، اور پھر 10 سیکنڈ کے اندر مٹا دیا جاتا ہے۔ صرف آنکھ اور نگاہ کی پوزیشنیں برقرار ہیں۔"},RC_requestCamera:{"en-US":"To proceed, this study needs your permission to use the camera. ",ar:"للمتابعة، تحتاج هذه الدراسة إلى إذنك لاستخدام الكاميرا.",hy:"Շարունակելու համար այս ուսումնասիրությունը տեսախցիկը օգտագործելու համար ձեր թույլտվության կարիքն ունի: ",bg:"За да продължите, това проучване се нуждае от вашето разрешение за използване на камерата. ","zh-CN":"为了继续进行,本研究需要您的许可才能使用相机。 ","zh-HK":"為了繼續進行,本研究需要您的許可才能使用相機。 ",hr:"Za nastavak ovoj studiji potrebno je vaše dopuštenje za upotrebu kamere. ",cs:"Chcete-li pokračovat, tato studie potřebuje vaše povolení k použití fotoaparátu. ",da:"For at fortsætte skal denne undersøgelse have din tilladelse til at bruge kameraet. ",nl:"Om verder te kunnen gaan, heeft dit onderzoek uw toestemming nodig om de camera te gebruiken. ","en-UK":"To proceed, this study needs your permission to use the camera.",fi:"Tämä tutkimus tarvitsee luvan kameran käyttöön jatkaakseen. ",fr:"Pour continuer, cette étude a besoin de votre autorisation pour utiliser la caméra.",de:"Um fortzufahren, benötigt diese Studie Ihre Erlaubnis zur Verwendung der Kamera. ",el:"Για να συνεχίσει, αυτή η μελέτη χρειάζεται την άδειά σας για να χρησιμοποιήσει την κάμερα. ",he:"כדי להמשיך, מחקר זה זקוק לאישורך להשתמש במצלמה. ",hi:"आगे बढ़ने के लिए, इस अध्ययन को कैमरे का उपयोग करने के लिए आपकी अनुमति की आवश्यकता है। ",hu:"A folytatáshoz ehhez a tanulmányhoz az Ön engedélyére van szüksége a kamera használatához. ",is:"Til að halda áfram þarf þessi rannsókn leyfis þíns til að nota myndavélina. ",id:"Untuk melanjutkan, penelitian ini memerlukan izin Anda untuk menggunakan kamera. ",it:"Per procedere, questo studio necessita del tuo permesso per utilizzare la fotocamera.",ja:"この研究を続行するには、カメラの使用許可が必要です。 ",kn:"ಮುಂದುವರೆಯಲು, ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಲು ಈ ಅಧ್ಯಯನಕ್ಕೆ ನಿಮ್ಮ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ. ",ko:"이 연구를 진행하려면 카메라 사용에 대한 귀하의 허가가 필요합니다. ",lt:"Norint tęsti, šiam tyrimui reikalingas jūsų leidimas naudoti fotoaparatą. ",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"തുടരാൻ, ഈ പഠനത്തിന് ക്യാമറ ഉപയോഗിക്കാൻ നിങ്ങളുടെ അനുമതി ആവശ്യമാണ്. ",no:"For å fortsette trenger denne studien din tillatelse til å bruke kameraet. ",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Aby kontynuować badanie, potrzebujemy Twojej zgody na użycie aparatu. ",pt:"Para prosseguir, este estudo precisa da sua permissão para usar a câmera. ",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Para continuar, este estudio necesita su permiso para usar la cámara.",sw:"Ili kuendelea, utafiti huu unahitaji ruhusa yako ya kutumia kamera. ",sv:"För att fortsätta behöver den här studien din tillåtelse att använda kameran. ",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Devam etmek için bu çalışmanın kamerayı kullanma izninize ihtiyacı var. ",ur:"آگے بڑھنے کے لیے، اس مطالعہ کو کیمرہ استعمال کرنے کے لیے آپ کی اجازت درکار ہے۔ "},RC_screenSize:{"en-US":"Screen Size",ar:"حجم الشاشة",hy:"Էկրանի չափը",bg:"Размер на екрана","zh-CN":"屏幕尺寸","zh-HK":"螢幕尺寸",hr:"Veličina zaslona",cs:"Velikost obrazovky",da:"Skærmstørrelse",nl:"Schermgrootte","en-UK":"Screen Size",fi:"Näytön koko",fr:"Taille de l'écran",de:"Bildschirmgröße",el:"Μέγεθος οθόνης",he:"גודל מסך",hi:"स्क्रीन का साईज़",hu:"Képernyőméret",is:"Skjástærð",id:"Ukuran Layar",it:"Dimensione dello schermo",ja:"画面サイズ",kn:"ಪರದೆಯ ಗಾತ್ರ",ko:"화면 크기",lt:"Ekrano dydis",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"സ്ക്രീൻ വലിപ്പം",no:"Skjermstørrelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Rozmiar ekranu",pt:"Tamanho da tela",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Tamaño de pantalla",sw:"Ukubwa wa skrini",sv:"Skärmstorlek",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Ekran Boyutu",ur:"اسکرین کا سائز"},RC_screenSizeCredit:{"en-US":'Credit card suggested by the Li et al. (2020) "Virtual Chinrest" paper.',ar:'اقترح بطاقة الائتمان من قبل لي وآخرون (2020) في ورقة "الدعامة الذقنية الافتراضية".',hy:"Վարկային քարտը առաջարկվել է Li et al. (2020) «Վիրտուալ Չինրեստ» թուղթ.",bg:"Кредитна карта, предложена от Li et al. (2020) Хартия „Виртуална опора за брадичката“.","zh-CN":"李等人建议的信用卡。 (2020)“虚拟下颌托”论文。","zh-HK":"李等人建議的信用卡。 (2020)「虛擬下顎托」論文。",hr:'Kreditna kartica koju su predložili Li et al. (2020.) Rad "Virtualni naslon za bradu".',cs:"Kreditní karta navržená Li et al. (2020) Papír „Virtual Chinrest“.",da:'Kreditkort foreslået af Li et al. (2020) "Virtual Chinrest" papir.',nl:'Creditcard voorgesteld door Li et al. (2020) Papier "Virtuele kinsteun".',"en-UK":'Credit card suggested by the Li et al. (2020) "Virtual Chinrest" paper.',fi:'Li et al. ehdottama luottokortti. (2020) "Virtual Chinrest" -paperi.',fr:'Carte de crédit suggérée par l\'article "Virtual Chinrest" de Li et al. (2020).',de:"Von Li et al. vorgeschlagene Kreditkarte. (2020) Artikel „Virtual Chinrest“.",el:'Πιστωτική κάρτα που προτείνεται από τους Li et al. (2020) Χαρτί "Virtual Chinrest".',he:'כרטיס אשראי שהוצע על ידי Li et al. (2020) נייר "משענת סנטר וירטואלית".',hi:'ली एट अल द्वारा सुझाया गया क्रेडिट कार्ड। (2020) "वर्चुअल चिनरेस्ट" पेपर।',hu:"Li et al. által javasolt hitelkártya. (2020) „Virtuális álltámasz” papír.",is:"Kreditkort sem Li o.fl. (2020) „Virtual Chinrest“ blað.",id:'Kartu kredit disarankan oleh Li dkk. (2020) Makalah "Sandaran Dagu Virtual".',it:'Carta di credito suggerita dall\'articolo "Virtual Chinrest" di Li et al. (2020).',ja:"Liらによって提案されたクレジットカード。 (2020) 「仮想顎当て」論文。",kn:'ಲಿ ಮತ್ತು ಇತರರು ಸೂಚಿಸಿದ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್. (2020) "ವರ್ಚುವಲ್ ಚಿನ್‌ರೆಸ್ಟ್" ಪೇಪರ್.',ko:'Li 등이 제안한 신용 카드. (2020) "가상 턱받침" 논문.',lt:"Kreditinė kortelė, kurią pasiūlė Li ir kt. (2020) „Virtual Chinrest“ popierius.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:'Li et al നിർദ്ദേശിച്ച ക്രെഡിറ്റ് കാർഡ്. (2020) "വെർച്വൽ ചിൻറെസ്റ്റ്" പേപ്പർ.',no:'Kredittkort foreslått av Li et al. (2020) "Virtual Chinrest" papir.',fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Karta kredytowa zaproponowana przez Li i in. (2020) Artykuł „Wirtualny podbródek”.",pt:'Cartão de crédito sugerido por Li et al. (2020) Artigo "Virtual Chinrest".',ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:'Tarjeta de crédito sugerida por el artículo "Virtual Chinrest" de Li et al. (2020).',sw:'Kadi ya mkopo iliyopendekezwa na Li et al. (2020) karatasi ya "Virtual Chinrest".',sv:'Kreditkort som föreslagits av Li et al. (2020) "Virtual Chinrest" papper.',tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:'Li ve diğerleri tarafından önerilen kredi kartı. (2020) "Sanal Çenelik" makalesi.',ur:'لی ایٹ ال کے ذریعہ تجویز کردہ کریڈٹ کارڈ۔ (2020) "ورچوئل چنریسٹ" پیپر۔'},RC_screenSizeCreditCard:{"en-US":"a credit card",ar:"بطاقة ائتمان",hy:"վարկային քարտ",bg:"кредитна карта","zh-CN":"一张信用卡","zh-HK":"一張信用卡",hr:"kreditna kartica",cs:"kreditní kartou",da:"et kreditkort",nl:"een creditcard","en-UK":"a credit card",fi:"luottokortti",fr:"une carte de crédit",de:"eine Kreditkarte",el:"μια πιστωτική κάρτα",he:"כרטיס אשראי",hi:"एक क्रेडिट कार्ड",hu:"egy hitelkártya",is:"kreditkort",id:"kartu kredit",it:"una carta di credito",ja:"クレジットカード",kn:"ಒಂದು ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್",ko:"신용카드",lt:"kreditine kortele",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഒരു ക്രെഡിറ്റ് കാർഡ്",no:"et kredittkort",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"kartę kredytową",pt:"um cartão de crédito",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"una tarjeta de crédito",sw:"kadi ya mkopo",sv:"ett kreditkort",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"kredi kartı",ur:"ایک کریڈٹ کارڈ"},RC_screenSizeHave:{"en-US":"I have xxx with me.",ar:"لدي xxx معي.",hy:"Ես ունեմ xxx ինձ հետ:",bg:"Имам xxx с мен.","zh-CN":"我身边有xxx。","zh-HK":"我身邊有xxx。",hr:"Imam xxx sa sobom.",cs:"Mám s sebou xxx.",da:"Jeg har xxx med mig.",nl:"Ik heb xxx bij me.","en-UK":"I have xxx with me.",fi:"Minulla on xxx mukanani.",fr:"J'ai xxx avec moi.",de:"Ich habe xxx bei mir.",el:"Έχω xxx μαζί μου.",he:"יש לי xxx איתי.",hi:"मेरे साथ xxx है.",hu:"xxx van velem.",is:"Ég er með xxx með mér.",id:"Aku punya xxx bersamaku.",it:"Ho xxx con me.",ja:"私はxxxを持っています。",kn:"ನನ್ನ ಬಳಿ xxx ಇದೆ.",ko:"나에겐 xxx가 있다.",lt:"Aš turiu xxx su savimi.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"എൻ്റെ കൂടെ xxx ഉണ്ട്.",no:"Jeg har xxx med meg.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Mam przy sobie xxx.",pt:"Eu tenho xxx comigo.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Tengo xxx conmigo.",sw:"Nina xxx nami.",sv:"Jag har xxx med mig.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Yanımda xxx var.",ur:"میرے ساتھ xxx ہے۔"},RC_screenSizeIntro:{"en-US":"We will measure the size of this screen. Use the pull-down menu to choose something handy. You can use any common USB connector (including the one providing power to your computer) or a credit card (or any card of the same size). Place your object on the screen and move the slider to adjust the image to match your object's size. When they match, press RETURN (or click OK) to proceed.",ar:"سنقوم بقياس حجم هذه الشاشة. استخدم القائمة المنسدلة لاختيار شيء مناسب. يمكنك استخدام أي موصل USB شائع (بما في ذلك الموصل الذي يوفر الطاقة لجهاز الكمبيوتر الخاص بك) أو بطاقة ائتمان (أو أي بطاقة بنفس الحجم). ضع الشيء الخاص بك على الشاشة وحرك شريط التمرير لضبط الصورة لتتناسب مع حجم الشيء الخاص بك. عندما يتطابقان، اضغط على RETURN (أو انقر فوق OK) للمتابعة.",hy:"Մենք չափելու ենք այս էկրանի չափը։ Օգտագործեք բացվող ընտրացանկը՝ հարմար բան ընտրելու համար: Դուք կարող եք օգտագործել ցանկացած սովորական USB միակցիչ (ներառյալ այն մեկը, որն ապահովում է ձեր համակարգիչը) կամ վարկային քարտ (կամ նույն չափի ցանկացած քարտ): Տեղադրեք ձեր առարկան էկրանին և շարժեք սահիչը՝ պատկերը հարմարեցնելու ձեր օբյեկտի չափին: Երբ դրանք համընկնեն, սեղմեք RETURN (կամ սեղմեք OK)՝ շարունակելու համար:",bg:"Ще измерим размера на този екран. Използвайте падащото меню, за да изберете нещо удобно. Можете да използвате всеки общ USB конектор (включително този, който осигурява захранване на вашия компютър) или кредитна карта (или всяка карта със същия размер). Поставете вашия обект на екрана и преместете плъзгача, за да настроите изображението, за да съответства на размера на вашия обект. Когато съвпадат, натиснете RETURN (или щракнете върху OK), за да продължите.","zh-CN":"我们将测量该屏幕的尺寸。使用下拉菜单选择方便的内容。您可以使用任何常见的 USB 连接器(包括为计算机供电的连接器)或信用卡(或任何相同尺寸的卡)。将对象放在屏幕上并移动滑块以调整图像以匹配对象的大小。当它们匹配时,按 RETURN(或单击“确定”)继续。","zh-HK":"我們將測量該螢幕的尺寸。使用下拉式選單選擇方便的內容。您可以使用任何常見的 USB 連接器(包括為電腦供電的連接器)或信用卡(或任何相同尺寸的卡片)。將物件放在螢幕上並移動滑桿以調整影像以符合物件的大小。當它們匹配時,請按 RETURN(或按一下「確定」)繼續。",hr:"Izmjerit ćemo veličinu ovog zaslona. Pomoću padajućeg izbornika odaberite nešto što vam je zgodno. Možete koristiti bilo koji uobičajeni USB priključak (uključujući onaj koji napaja vaše računalo) ili kreditnu karticu (ili bilo koju karticu iste veličine). Postavite svoj objekt na zaslon i pomaknite klizač kako biste prilagodili sliku veličini vašeg objekta. Kada se podudaraju, pritisnite RETURN (ili kliknite OK) za nastavak.",cs:"Změříme velikost této obrazovky. Použijte rozbalovací nabídku a vyberte si něco užitečného. Můžete použít jakýkoli běžný konektor USB (včetně toho, který napájí váš počítač) nebo kreditní kartu (nebo jakoukoli kartu stejné velikosti). Umístěte objekt na obrazovku a posunutím posuvníku upravte obrázek tak, aby odpovídal velikosti vašeho objektu. Když se shodují, pokračujte stisknutím RETURN (nebo kliknutím na OK).",da:"Vi vil måle størrelsen på denne skærm. Brug rullemenuen til at vælge noget praktisk. Du kan bruge et hvilket som helst almindeligt USB-stik (inklusive det, der giver strøm til din computer) eller et kreditkort (eller et hvilket som helst kort af samme størrelse). Placer dit objekt på skærmen, og flyt skyderen for at justere billedet, så det passer til dit objekts størrelse. Når de matcher, skal du trykke på RETURN (eller klikke på OK) for at fortsætte.",nl:"Wij meten de grootte van dit scherm. Gebruik het vervolgkeuzemenu om iets handigs te kiezen. U kunt elke gewone USB-connector gebruiken (inclusief de connector die uw computer van stroom voorziet) of een creditcard (of een kaart van hetzelfde formaat). Plaats uw object op het scherm en verplaats de schuifregelaar om de afbeelding aan te passen aan de grootte van uw object. Als ze overeenkomen, drukt u op RETURN (of klikt u op OK) om door te gaan.","en-UK":"We will measure the size of this screen. Use the drop-down menu to choose something handy. You can use any common USB connector (including the one providing power to your computer) or a credit card (or any card of the same size). Place your object on the screen and move the slider to adjust the image to match your object's size. When they match, press RETURN (or click OK) to proceed.",fi:"Mittaamme tämän näytön koon. Käytä avattavaa valikkoa valitaksesi jotain kätevää. Voit käyttää mitä tahansa yleistä USB-liitintä (mukaan lukien se, joka antaa virtaa tietokoneellesi) tai luottokorttia (tai mitä tahansa samankokoista korttia). Aseta objekti näytölle ja säädä kuva vastaamaan objektisi kokoa liikuttamalla liukusäädintä. Kun ne täsmäävät, paina RETURN (tai napsauta OK) jatkaaksesi.",fr:"Nous allons mesurer la taille de cet écran. Utilisez le menu déroulant pour choisir quelque chose de pratique. Vous pouvez utiliser n'importe quel connecteur USB courant (y compris celui qui alimente votre ordinateur) ou une carte de crédit (ou toute carte de la même taille). Placez votre objet sur l'écran et déplacez le curseur pour ajuster l'image à la taille de votre objet. Lorsqu'ils correspondent, appuyez sur RETOUR (ou cliquez sur OK) pour continuer.",de:"Wir werden die Größe dieses Bildschirms messen. Verwenden Sie das Pulldown-Menü, um etwas Praktisches auszuwählen. Sie können jeden gängigen USB-Anschluss (einschließlich desjenigen, der Ihren Computer mit Strom versorgt) oder eine Kreditkarte (oder eine beliebige Karte derselben Größe) verwenden. Platzieren Sie Ihr Objekt auf dem Bildschirm und bewegen Sie den Schieberegler, um das Bild an die Größe Ihres Objekts anzupassen. Wenn sie übereinstimmen, drücken Sie die Eingabetaste (oder klicken Sie auf „OK“), um fortzufahren.",el:"Θα μετρήσουμε το μέγεθος αυτής της οθόνης. Χρησιμοποιήστε το αναπτυσσόμενο μενού για να επιλέξετε κάτι εύχρηστο. Μπορείτε να χρησιμοποιήσετε οποιαδήποτε κοινή υποδοχή USB (συμπεριλαμβανομένης αυτής που παρέχει ρεύμα στον υπολογιστή σας) ή μια πιστωτική κάρτα (ή οποιαδήποτε κάρτα ίδιου μεγέθους). Τοποθετήστε το αντικείμενό σας στην οθόνη και μετακινήστε το ρυθμιστικό για να προσαρμόσετε την εικόνα ώστε να ταιριάζει με το μέγεθος του αντικειμένου σας. Όταν ταιριάζουν, πατήστε RETURN (ή κάντε κλικ στο OK) για να συνεχίσετε.",he:"אנו נמדוד את גודל המסך הזה. השתמש בתפריט הנפתח כדי לבחור משהו שימושי. אתה יכול להשתמש בכל מחבר USB נפוץ (כולל זה שמספק חשמל למחשב שלך) או בכרטיס אשראי (או כל כרטיס באותו גודל). הנח את האובייקט שלך על המסך והזז את המחוון כדי להתאים את התמונה כך שתתאים לגודל האובייקט שלך. כאשר הם תואמים, לחץ על RETURN (או לחץ על אישור) כדי להמשיך.",hi:"हम इस स्क्रीन का आकार मापेंगे. कोई उपयोगी चीज़ चुनने के लिए पुल-डाउन मेनू का उपयोग करें। आप किसी भी सामान्य यूएसबी कनेक्टर (आपके कंप्यूटर को पावर प्रदान करने वाले कनेक्टर सहित) या क्रेडिट कार्ड (या समान आकार के किसी भी कार्ड) का उपयोग कर सकते हैं। अपने ऑब्जेक्ट को स्क्रीन पर रखें और छवि को अपने ऑब्जेक्ट के आकार से मेल खाने के लिए समायोजित करने के लिए स्लाइडर को घुमाएँ। जब वे मेल खाते हैं, तो आगे बढ़ने के लिए रिटर्न दबाएँ (या ओके पर क्लिक करें)।",hu:"Megmérjük ennek a képernyőnek a méretét. A legördülő menü segítségével válasszon valami praktikusat. Használhat bármilyen általános USB-csatlakozót (beleértve azt is, amelyik a számítógép áramellátását biztosítja), vagy hitelkártyát (vagy bármilyen azonos méretű kártyát). Helyezze az objektumot a képernyőre, és mozgassa a csúszkát, hogy a képet az objektum méretéhez igazítsa. Ha megegyeznek, nyomja meg a RETURN gombot (vagy kattintson az OK gombra) a folytatáshoz.",is:"Við munum mæla stærð þessa skjás. Notaðu fellivalmyndina til að velja eitthvað hentugt. Þú getur notað hvaða algenga USB tengi sem er (þar á meðal það sem veitir tölvuna þína rafmagn) eða kreditkort (eða hvaða kort sem er af sömu stærð). Settu hlutinn þinn á skjáinn og færðu sleðann til að stilla myndina þannig að hún passi við stærð hlutarins. Þegar þeir passa saman, ýttu á RETURN (eða smelltu á OK) til að halda áfram.",id:"Kami akan mengukur ukuran layar ini. Gunakan menu tarik-turun untuk memilih sesuatu yang berguna. Anda dapat menggunakan konektor USB umum apa pun (termasuk konektor yang menyediakan daya ke komputer Anda) atau kartu kredit (atau kartu apa pun dengan ukuran yang sama). Tempatkan objek Anda di layar dan gerakkan penggeser untuk menyesuaikan gambar agar sesuai dengan ukuran objek Anda. Jika cocok, tekan RETURN (atau klik OK) untuk melanjutkan.",it:"Misureremo la dimensione di questo schermo. Usa il menu a tendina per scegliere qualcosa di comodo. Puoi usare qualsiasi connettore USB comune (incluso quello che fornisce alimentazione al tuo computer) o una carta di credito (o qualsiasi carta della stessa dimensione). Posiziona il tuo oggetto sullo schermo e sposta il cursore per regolare l'immagine in modo che corrisponda alla dimensione del tuo oggetto. Quando corrispondono, premi INVIO (o fai clic su OK) per procedere.",ja:"この画面のサイズを測ってみます。プルダウン メニューを使用して便利なものを選択します。一般的な USB コネクタ (コンピュータに電力を供給するコネクタを含む) またはクレジット カード (または同じサイズのカード) を使用できます。オブジェクトを画面上に配置し、スライダーを移動してオブジェクトのサイズに合わせて画像を調整します。一致したら、Return キーを押して (または [OK] をクリックして) 続行します。",kn:"ನಾವು ಈ ಪರದೆಯ ಗಾತ್ರವನ್ನು ಅಳೆಯುತ್ತೇವೆ. ಸೂಕ್ತವಾದ ಯಾವುದನ್ನಾದರೂ ಆಯ್ಕೆ ಮಾಡಲು ಪುಲ್-ಡೌನ್ ಮೆನು ಬಳಸಿ. ನೀವು ಯಾವುದೇ ಸಾಮಾನ್ಯ USB ಕನೆಕ್ಟರ್ (ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಪವರ್ ಒದಗಿಸುವುದು ಸೇರಿದಂತೆ) ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ (ಅಥವಾ ಅದೇ ಗಾತ್ರದ ಯಾವುದೇ ಕಾರ್ಡ್) ಅನ್ನು ಬಳಸಬಹುದು. ನಿಮ್ಮ ವಸ್ತುವನ್ನು ಪರದೆಯ ಮೇಲೆ ಇರಿಸಿ ಮತ್ತು ನಿಮ್ಮ ವಸ್ತುವಿನ ಗಾತ್ರಕ್ಕೆ ಹೊಂದಿಸಲು ಚಿತ್ರವನ್ನು ಹೊಂದಿಸಲು ಸ್ಲೈಡರ್ ಅನ್ನು ಸರಿಸಿ. ಅವು ಹೊಂದಿಕೆಯಾದಾಗ, ಮುಂದುವರೆಯಲು RETURN (ಅಥವಾ ಸರಿ ಕ್ಲಿಕ್ ಮಾಡಿ) ಒತ್ತಿರಿ.",ko:"이 화면의 크기를 측정해 보겠습니다. 풀다운 메뉴를 사용하여 편리한 항목을 선택하세요. 일반적인 USB 커넥터(컴퓨터에 전원을 공급하는 커넥터 포함)나 신용 카드(또는 동일한 크기의 카드)를 사용할 수 있습니다. 개체를 화면에 놓고 슬라이더를 움직여 개체의 크기에 맞게 이미지를 조정합니다. 일치하면 RETURN을 누르거나 확인을 클릭하여 계속 진행하세요.",lt:"Išmatuosime šio ekrano dydį. Norėdami pasirinkti ką nors patogaus, naudokite išskleidžiamąjį meniu. Galite naudoti bet kurią įprastą USB jungtį (įskaitant tą, kuri maitina jūsų kompiuterį) arba kredito kortelę (arba bet kurią tokio pat dydžio kortelę). Padėkite objektą ant ekrano ir perkelkite slankiklį, kad vaizdas atitiktų objekto dydį. Kai jie sutampa, paspauskite RETURN (arba spustelėkite Gerai), kad tęstumėte.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഈ സ്ക്രീനിൻ്റെ വലിപ്പം ഞങ്ങൾ അളക്കും. സൗകര്യപ്രദമായ എന്തെങ്കിലും തിരഞ്ഞെടുക്കാൻ പുൾ-ഡൗൺ മെനു ഉപയോഗിക്കുക. നിങ്ങൾക്ക് ഏതെങ്കിലും സാധാരണ USB കണക്ടറോ (നിങ്ങളുടെ കമ്പ്യൂട്ടറിന് പവർ നൽകുന്നതുൾപ്പെടെ) അല്ലെങ്കിൽ ഒരു ക്രെഡിറ്റ് കാർഡോ (അല്ലെങ്കിൽ അതേ വലിപ്പത്തിലുള്ള ഏതെങ്കിലും കാർഡ്) ഉപയോഗിക്കാം. നിങ്ങളുടെ ഒബ്‌ജക്‌റ്റ് സ്‌ക്രീനിൽ വയ്ക്കുക, നിങ്ങളുടെ ഒബ്‌ജക്‌റ്റിൻ്റെ വലുപ്പവുമായി പൊരുത്തപ്പെടുന്നതിന് ചിത്രം ക്രമീകരിക്കുന്നതിന് സ്ലൈഡർ നീക്കുക. അവ പൊരുത്തപ്പെടുമ്പോൾ, തുടരാൻ RETURN അമർത്തുക (അല്ലെങ്കിൽ ശരി ക്ലിക്കുചെയ്യുക).",no:"Vi vil måle størrelsen på denne skjermen. Bruk rullegardinmenyen for å velge noe praktisk. Du kan bruke en hvilken som helst vanlig USB-kontakt (inkludert den som gir strøm til datamaskinen din) eller et kredittkort (eller et hvilket som helst kort av samme størrelse). Plasser objektet på skjermen og flytt glidebryteren for å justere bildet slik at det passer med objektets størrelse. Når de samsvarer, trykk RETURN (eller klikk OK) for å fortsette.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierzymy rozmiar tego ekranu. Użyj menu rozwijanego, aby wybrać coś przydatnego. Możesz użyć dowolnego popularnego złącza USB (w tym tego, które zasila komputer) lub karty kredytowej (lub dowolnej karty o tym samym rozmiarze). Umieść obiekt na ekranie i przesuń suwak, aby dostosować obraz do rozmiaru obiektu. Kiedy pasują, naciśnij RETURN (lub kliknij OK), aby kontynuować.",pt:"Mediremos o tamanho desta tela. Use o menu suspenso para escolher algo útil. Você pode usar qualquer conector USB comum (incluindo aquele que fornece energia ao seu computador) ou um cartão de crédito (ou qualquer cartão do mesmo tamanho). Coloque o seu objeto na tela e mova o controle deslizante para ajustar a imagem de acordo com o tamanho do seu objeto. Quando corresponderem, pressione RETURN (ou clique em OK) para prosseguir.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Mediremos el tamaño de esta pantalla. Usa el menú desplegable para elegir algo práctico. Puedes usar cualquier conector USB común (incluido el que proporciona energía a tu computadora) o una tarjeta de crédito (o cualquier tarjeta del mismo tamaño). Coloca tu objeto en la pantalla y mueve el control deslizante para ajustar la imagen al tamaño de tu objeto. Cuando coincidan, presiona RETURN (o haz clic en OK) para continuar.",sw:"Tutapima ukubwa wa skrini hii. Tumia menyu ya kuvuta-chini ili kuchagua kitu kinachofaa. Unaweza kutumia kiunganishi chochote cha kawaida cha USB (pamoja na kile kinachotoa nishati kwa kompyuta yako) au kadi ya mkopo (au kadi yoyote ya ukubwa sawa). Weka kitu chako kwenye skrini na usogeze kitelezi ili kurekebisha picha ili ilingane na saizi ya kitu chako. Zinapolingana, bonyeza RETURN (au bofya SAWA) ili kuendelea.",sv:"Vi kommer att mäta storleken på denna skärm. Använd rullgardinsmenyn för att välja något praktiskt. Du kan använda vilken vanlig USB-kontakt som helst (inklusive den som ger ström till din dator) eller ett kreditkort (eller vilket kort som helst av samma storlek). Placera ditt objekt på skärmen och flytta reglaget för att justera bilden så att den matchar ditt objekts storlek. När de matchar, tryck på RETURN (eller klicka på OK) för att fortsätta.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Bu ekranın boyutunu ölçeceğiz. Kullanışlı bir şey seçmek için açılır menüyü kullanın. Yaygın olarak kullanılan herhangi bir USB konektörünü (bilgisayarınıza güç sağlayan da dahil) veya kredi kartını (veya aynı boyuttaki herhangi bir kartı) kullanabilirsiniz. Nesnenizi ekrana yerleştirin ve görüntüyü nesnenizin boyutuna uyacak şekilde ayarlamak için kaydırıcıyı hareket ettirin. Eşleştiklerinde devam etmek için RETURN tuşuna basın (veya Tamam'a tıklayın).",ur:"ہم اس سکرین کے سائز کی پیمائش کریں گے۔ کوئی آسان چیز منتخب کرنے کے لیے پل ڈاؤن مینو کا استعمال کریں۔ آپ کوئی بھی عام USB کنیکٹر (بشمول آپ کے کمپیوٹر کو پاور فراہم کرنے والا) یا کریڈٹ کارڈ (یا اسی سائز کا کوئی کارڈ) استعمال کر سکتے ہیں۔ اپنے آبجیکٹ کو اسکرین پر رکھیں اور اپنے آبجیکٹ کے سائز سے ملنے والی تصویر کو ایڈجسٹ کرنے کے لیے سلائیڈر کو حرکت دیں۔ جب وہ مماثل ہو جائیں تو آگے بڑھنے کے لیے RETURN دبائیں (یا ٹھیک ہے پر کلک کریں)۔"},RC_screenSizeTitle:{"en-US":"Screen Size Calibration",ar:"معايرة حجم الشاشة",hy:"Էկրանի չափի չափորոշում",bg:"Калибриране на размера на екрана","zh-CN":"屏幕尺寸校准","zh-HK":"螢幕尺寸校準",hr:"Kalibracija veličine zaslona",cs:"Kalibrace velikosti obrazovky",da:"Kalibrering af skærmstørrelse",nl:"Kalibratie van schermgrootte","en-UK":"Screen Size Calibration",fi:"Näytön koon kalibrointi",fr:"Calibration de la taille de l'écran",de:"Kalibrierung der Bildschirmgröße",el:"Βαθμονόμηση μεγέθους οθόνης",he:"כיול גודל מסך",hi:"स्क्रीन आकार अंशांकन",hu:"Képernyőméret kalibrálása",is:"Kvörðun skjástærðar",id:"Kalibrasi Ukuran Layar",it:"Calibrazione della dimensione dello schermo",ja:"画面サイズの調整",kn:"ಪರದೆಯ ಗಾತ್ರದ ಮಾಪನಾಂಕ ನಿರ್ಣಯ",ko:"화면 크기 보정",lt:"Ekrano dydžio kalibravimas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"സ്‌ക്രീൻ സൈസ് കാലിബ്രേഷൻ",no:"Kalibrering av skjermstørrelse",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Kalibracja rozmiaru ekranu",pt:"Calibração do tamanho da tela",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Calibración del tamaño de pantalla",sw:"Urekebishaji wa Ukubwa wa Skrini",sv:"Kalibrering av skärmstorlek",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Ekran Boyutu Kalibrasyonu",ur:"اسکرین سائز کیلیبریشن"},RC_screenSizeUSBA:{"en-US":"a USB Type A connector",ar:"موصل USB نوع A",hy:"USB Type A միակցիչ",bg:"USB тип A конектор","zh-CN":"USB A 型连接器","zh-HK":"USB A 型連接器",hr:"USB tip A konektor",cs:"konektor USB typu A",da:"et USB Type A-stik",nl:"een USB Type A-connector","en-UK":"a USB Type A connector",fi:"USB Type A -liitin",fr:"un connecteur USB de type A",de:"einen USB-Typ-A-Anschluss",el:"μια υποδοχή USB τύπου Α",he:"מחבר USB מסוג A",hi:"एक यूएसबी टाइप ए कनेक्टर",hu:"A típusú USB csatlakozó",is:"USB tegund A tengi",id:"konektor USB Tipe A",it:"un connettore USB di tipo A",ja:"USB タイプ A コネクタ",kn:"ಯುಎಸ್ಬಿ ಟೈಪ್ ಎ ಕನೆಕ್ಟರ್",ko:"USB 유형 A 커넥터",lt:"A tipo USB jungtis",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഒരു യുഎസ്ബി ടൈപ്പ് എ കണക്ടർ",no:"en USB Type A-kontakt",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"złącze USB typu A",pt:"um conector USB tipo A",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"un conector USB Tipo A",sw:"kiunganishi cha Aina ya A ya USB",sv:"en USB typ A-kontakt",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"bir USB Tip A konektörü",ur:"ایک USB قسم A کنیکٹر"},RC_screenSizeUSBC:{"en-US":"a USB Type C connector",ar:"موصل USB نوع C",hy:"USB Type C միակցիչ",bg:"USB тип C конектор","zh-CN":"USB C 型连接器","zh-HK":"USB C 型連接器",hr:"USB Type C priključak",cs:"konektor USB typu C",da:"et USB Type C-stik",nl:"een USB Type C-connector","en-UK":"a USB Type C connector",fi:"USB Type C -liitin",fr:"un connecteur USB Type C",de:"ein USB-Typ-C-Anschluss",el:"μια υποδοχή USB Type C",he:"מחבר USB מסוג C",hi:"एक यूएसबी टाइप सी कनेक्टर",hu:"egy USB Type C csatlakozó",is:"USB Type C tengi",id:"konektor USB Tipe C",it:"un connettore USB di tipo C",ja:"USB タイプ C コネクタ",kn:"ಯುಎಸ್ಬಿ ಟೈಪ್ ಸಿ ಕನೆಕ್ಟರ್",ko:"USB 타입 C 커넥터",lt:"C tipo USB jungtis",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ഒരു USB ടൈപ്പ് C കണക്ടർ",no:"en USB Type C-kontakt",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"złącze USB typu C",pt:"um conector USB Tipo C",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"un conector USB Tipo C",sw:"kiunganishi cha USB Aina ya C",sv:"en USB typ C-kontakt",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"bir USB Tip C konektörü",ur:"ایک USB ٹائپ سی کنیکٹر"},RC_starting:{"en-US":"Starting ...",ar:"البدء ...",hy:"Սկսվում է...",bg:"Стартиране...","zh-CN":"开始...","zh-HK":"開始...",hr:"Počinje...",cs:"Spuštění...",da:"Starter...",nl:"Beginnend...","en-UK":"Starting ...",fi:"Alkaen...",fr:"Début ...",de:"Beginnend ...",el:"Ξεκινώντας...",he:"מתחיל...",hi:"शुरू हो रहा है...",hu:"Kezdés...",is:"Byrjar...",id:"Mulai...",it:"Inizio ...",ja:"開始...",kn:"ಪ್ರಾರಂಭವಾಗುತ್ತಿದೆ...",ko:"시작 중...",lt:"Pradedama...",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"ആരംഭിക്കുന്നു...",no:"Starter ...",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Rozpoczęcie...",pt:"Começando ...",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Comenzando ...",sw:"Inaanza...",sv:"Börjar...",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Başlıyor...",ur:"شروع ہو رہا ہے..."},RC_viewingBlindSpotCredit:{"en-US":"We enhanced the blindspot mapping of Li et al. (2020) by adding flicker and manual control.",ar:"قمنا بتحسين خريطة النقاط العمياء لـ Li وآخرون (2020) عن طريق إضافة الوميض والتحكم اليدوي.",hy:"Մենք բարելավեցինք Լի և այլոց կույր կետերի քարտեզագրումը: (2020)՝ ավելացնելով թարթում և ձեռքով կառավարում:",bg:"Подобрихме картографирането на слепите петна на Li et al. (2020) чрез добавяне на трептене и ръчно управление.","zh-CN":"我们增强了 Li 等人的盲点测绘。 (2020) 通过添加闪烁和手动控制。","zh-HK":"我們增強了 Li 等人的盲點測繪。 (2020) 透過新增閃爍和手動控制。",hr:"Poboljšali smo mapiranje slijepe točke Li et al. (2020) dodavanjem treperenja i ručne kontrole.",cs:"Vylepšili jsme mapování slepých skvrn Li et al. (2020) přidáním blikání a ručním ovládáním.",da:"Vi forbedrede blindspot-kortlægningen af ​​Li et al. (2020) ved at tilføje flimmer og manuel kontrol.",nl:"We hebben de blinde vlekkartering van Li et al. verbeterd. (2020) door flikkering en handmatige bediening toe te voegen.","en-UK":"We enhanced the blindspot mapping of Li et al. (2020) by adding flicker and manual control.",fi:"Paransimme Li et al.:n sokeapistekartoitusta. (2020) lisäämällä välkyntä ja manuaalinen ohjaus.",fr:"Nous avons amélioré la cartographie des angles morts de Li et al. (2020) en ajoutant un scintillement et un contrôle manuel.",de:"Wir haben die Blindspot-Kartierung von Li et al. verbessert. (2020) durch Hinzufügen von Flimmern und manueller Steuerung.",el:"Βελτιώσαμε τη χαρτογράφηση τυφλού σημείου των Li et al. (2020) προσθέτοντας τρεμόπαιγμα και χειροκίνητο έλεγχο.",he:"שיפרנו את מיפוי הנקודה העיוורת של Li et al. (2020) על ידי הוספת הבהוב ושליטה ידנית.",hi:"हमने ली एट अल की ब्लाइंडस्पॉट मैपिंग को बढ़ाया। (2020) झिलमिलाहट और मैनुअल नियंत्रण जोड़कर।",hu:"Javítottuk Li és munkatársai vakfolt-térképezését. (2020) villogás és kézi vezérlés hozzáadásával.",is:"Við bættum blindblettakortlagningu Li o.fl. (2020) með því að bæta við flökti og handstýringu.",id:"Kami meningkatkan pemetaan titik buta Li et al. (2020) dengan menambahkan kedipan dan kontrol manual.",it:"Abbiamo migliorato la mappatura dei punti ciechi di Li et al. (2020) aggiungendo il flicker e il controllo manuale.",ja:"Li らの盲点マッピングを強化しました。 (2020) ちらつきと手動制御を追加しました。",kn:"ನಾವು Li et al ನ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್ ಮ್ಯಾಪಿಂಗ್ ಅನ್ನು ವರ್ಧಿಸಿದ್ದೇವೆ. (2020) ಫ್ಲಿಕರ್ ಮತ್ತು ಹಸ್ತಚಾಲಿತ ನಿಯಂತ್ರಣವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ.",ko:"우리는 Li et al.의 맹점 매핑을 향상시켰습니다. (2020) 깜박임 및 수동 제어를 추가했습니다.",lt:"Patobulinome Li ir kt. (2020), pridedant mirgėjimą ir rankinį valdymą.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"Li et al ൻ്റെ ബ്ലൈൻഡ്‌സ്‌പോട്ട് മാപ്പിംഗ് ഞങ്ങൾ മെച്ചപ്പെടുത്തി. (2020) ഫ്ലിക്കറും മാനുവൽ നിയന്ത്രണവും ചേർത്ത്.",no:"Vi forbedret blindsonskartleggingen til Li et al. (2020) ved å legge til flimmer og manuell kontroll.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Udoskonaliliśmy mapowanie martwego punktu Li i in. (2020), dodając migotanie i sterowanie ręczne.",pt:"Melhoramos o mapeamento do ponto cego de Li et al. (2020) adicionando cintilação e controle manual.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Mejoramos el mapeo de puntos ciegos de Li et al. (2020) al agregar parpadeo y control manual.",sw:"Tuliboresha ramani ya upofu wa Li et al. (2020) kwa kuongeza flicker na udhibiti wa mwongozo.",sv:"Vi förbättrade blindfläckskartläggningen av Li et al. (2020) genom att lägga till flimmer och manuell kontroll.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Li ve arkadaşlarının kör nokta haritalamasını geliştirdik. (2020) titreşim ve manuel kontrol ekleyerek.",ur:"ہم نے لی ایٹ ال کی بلائنڈ سپاٹ میپنگ کو بڑھایا۔ (2020) فلکر اور دستی کنٹرول شامل کرکے۔"},RC_viewingBlindSpotRejected:{"en-US":"❌ Sorry, the most recent left and right measurements were inconsistent. Try again? Keep one eye closed. Focus on the cross and monitor the flashing dot out of the corner of your eye. Slide the dot left and right until it disappears into your blindspot, and then hit the SPACE bar. Maintain your viewing distance as you test both eyes.",ar:"❌ عذرًا، كانت القياسات الأخيرة لليسار واليمين غير متسقة. حاول مرة أخرى؟ حافظ على إغلاق عين واحدة. ركز على الصليب وراقب النقطة الوميضية من زاوية عينك. حرك النقطة لليسار واليمين حتى تختفي في النقطة العمياء، ثم اضغط على مفتاح المسافة. حافظ على مسافة المشاهدة أثناء اختبار كلتا العينين.",hy:"❌ Ներողություն, ձախ և աջ վերջին չափումները անհամապատասխան էին: Փորձե՞լ նորից: Մի աչքը փակ պահեք։ Կենտրոնացեք խաչի վրա և հետևեք ձեր աչքի անկյունից դուրս գտնվող թարթող կետին: Կետը սահեցրեք ձախ և աջ, մինչև այն անհետանա ձեր կույր կետի մեջ, այնուհետև սեղմեք SPACE սանդղակը: Պահպանեք ձեր դիտման հեռավորությունը, երբ փորձարկում եք երկու աչքերը:",bg:"❌ За съжаление последните леви и десни измервания не съответстват. Опитайте отново? Дръжте едното си око затворено. Фокусирайте се върху кръста и наблюдавайте мигащата точка с ъгъла на окото си. Плъзнете точката наляво и надясно, докато изчезне в сляпото петно, след което натиснете ИНТЕРВАЛ. Поддържайте разстоянието на гледане, докато тествате и двете очи.","zh-CN":"❌ 抱歉,最近的左右测量结果不一致。再试一次?闭上一只眼睛。将注意力集中在十字上,并用眼角余光观察闪烁的点。左右滑动该点,直到它消失在您的盲点中,然后按空格键。测试双眼时保持观看距离。","zh-HK":"❌ 抱歉,最近的左右測量結果不一致。再試一次?閉上一隻眼睛。將注意力集中在十字上,並用眼角餘光觀察閃爍的點。左右滑動該點,直到它消失在您的盲點中,然後按空白鍵。測試雙眼時保持觀看距離。",hr:"❌ Nažalost, posljednja mjerenja lijeve i desne strane nisu bila dosljedna. Pokušajte ponovno? Držite jedno oko zatvoreno. Usredotočite se na križ i promatrajte svjetlucavu točku krajičkom oka. Klizite točkom lijevo i desno dok ne nestane u vašoj mrtvoj točki, a zatim pritisnite RAZMAKNICU. Održavajte udaljenost gledanja dok testirate oba oka.",cs:"❌ Omlouváme se, poslední měření vlevo a vpravo byla nekonzistentní. Zkusit znovu? Mějte jedno oko zavřené. Zaměřte se na kříž a sledujte blikající tečku koutkem oka. Posouvejte tečku doleva a doprava, dokud nezmizí ve vašem slepém úhlu, a poté stiskněte MEZERNÍK. Při testování obou očí udržujte pozorovací vzdálenost.",da:"❌ Beklager, de seneste venstre og højre målinger var inkonsistente. Prøv igen? Hold det ene øje lukket. Fokuser på korset og overvåg den blinkende prik ud af øjenkrogen. Skub prikken til venstre og højre, indtil den forsvinder ind i din blindspot, og tryk derefter på MELLEMRUM. Hold din synsafstand, mens du tester begge øjne.",nl:"❌ Sorry, de meest recente linker- en rechtermetingen waren inconsistent. Opnieuw proberen? Houd één oog gesloten. Concentreer u op het kruis en let op de knipperende stip vanuit uw ooghoek. Schuif de stip naar links en rechts totdat deze in je blinde vlek verdwijnt en druk vervolgens op de SPATIEBALK. Houd uw kijkafstand aan terwijl u beide ogen test.","en-UK":"❌ Sorry, the most recent left and right measurements were inconsistent. Try again? Keep one eye closed. Focus on the cross and monitor the flashing dot out of the corner of your eye. Slide the dot left and right until it disappears into your blind spot, and then hit the SPACE bar. Maintain your viewing distance as you test both eyes.",fi:"❌ Valitettavasti viimeisimmät vasemman ja oikeanpuoleiset mittaukset olivat epäjohdonmukaisia. Yritätkö uudelleen? Pidä toinen silmä kiinni. Keskity ristiin ja tarkkaile vilkkuvaa pistettä silmäkulmassasi. Liu'uta pistettä vasemmalle ja oikealle, kunnes se katoaa sokealle pisteelle, ja paina sitten VÄLINÄPPÄINTÄ. Säilytä katseluetäisyys, kun testaat molempia silmiä.",fr:"❌ Désolé, les mesures les plus récentes à gauche et à droite étaient incohérentes. Réessayer ? Gardez un œil fermé. Concentrez-vous sur la croix et surveillez le point clignotant du coin de l'œil. Faites glisser le point vers la gauche et la droite jusqu'à ce qu'il disparaisse dans votre angle mort, puis appuyez sur la barre d'espace. Maintenez votre distance de vision pendant que vous testez les deux yeux.",de:"❌ Leider waren die letzten linken und rechten Messungen inkonsistent. Versuchen Sie es erneut? Halten Sie ein Auge geschlossen. Konzentrieren Sie sich auf das Kreuz und beobachten Sie den blinkenden Punkt aus dem Augenwinkel. Schieben Sie den Punkt nach links und rechts, bis er in Ihrem toten Winkel verschwindet, und drücken Sie dann die LEERTASTE. Halten Sie Ihren Sehabstand ein, während Sie beide Augen testen.",el:"❌ Λυπούμαστε, οι πιο πρόσφατες μετρήσεις αριστερά και δεξιά ήταν ασυνεπείς. Δοκιμάστε ξανά; Κρατήστε το ένα μάτι κλειστό. Εστιάστε στον σταυρό και παρακολουθήστε την κουκκίδα που αναβοσβήνει με την άκρη του ματιού σας. Σύρετε την κουκκίδα αριστερά και δεξιά μέχρι να εξαφανιστεί στο blindspot σας και, στη συνέχεια, πατήστε τη γραμμή SPACE. Διατηρήστε την απόσταση θέασής σας καθώς δοκιμάζετε και τα δύο μάτια.",he:"❌ מצטערים, המדידות האחרונות משמאל וימין לא היו עקביות. לנסות שוב? סגור עין אחת. התמקד בצלב ועקוב אחר הנקודה המהבהבת בזווית העין. החלק את הנקודה ימינה ושמאלה עד שהיא תיעלם בנקודה העיוורת שלך, ואז לחץ על מקש הרווח. שמור על מרחק צפייה בזמן שאתה בודק את שתי העיניים.",hi:"❌ क्षमा करें, नवीनतम बाएँ और दाएँ माप असंगत थे। पुनः प्रयास करें? एक आंख बंद रखें. क्रॉस पर ध्यान केंद्रित करें और अपनी आंख के कोने से चमकते बिंदु की निगरानी करें। बिंदु को बाएँ और दाएँ तब तक स्लाइड करें जब तक कि वह आपके ब्लाइंडस्पॉट में गायब न हो जाए, और फिर SPACE बार पर क्लिक करें। दोनों आँखों का परीक्षण करते समय अपनी देखने की दूरी बनाए रखें।",hu:"❌ Sajnáljuk, a legutóbbi bal és jobb oldali mérések következetlenek voltak. Megpróbálja újra? Tartsa az egyik szemét csukva. Koncentrálj a keresztre, és figyeld a villogó pontot a szemed sarkából. Csúsztassa a pontot balra és jobbra, amíg el nem tűnik a vakfoltban, majd nyomja meg a SZÓKÖZ billentyűt. Mindkét szem tesztelésekor tartsa be a látótávolságot.",is:"❌ Því miður, nýjustu vinstri og hægri mælingar voru ósamkvæmar. Reyna aftur? Hafðu annað augað lokað. Einbeittu þér að krossinum og fylgdu blikkandi punktinum út úr augnkróknum. Renndu punktinum til vinstri og hægri þar til hann hverfur inn í blindblettinn þinn og ýttu svo á bil. Haltu útsýnisfjarlægð þinni þegar þú prófar bæði augun.",id:"❌ Maaf, pengukuran kiri dan kanan terbaru tidak konsisten. Coba lagi? Tutup satu mata. Fokus pada tanda silang dan pantau titik berkedip dari sudut mata Anda. Geser titik ke kiri dan ke kanan hingga menghilang di titik buta Anda, lalu tekan bilah SPASI. Pertahankan jarak pandang Anda saat Anda menguji kedua mata.",it:"❌ Mi dispiace, le misurazioni più recenti a sinistra e a destra erano incoerenti. Vuoi riprovare? Tieni un occhio chiuso. Concentrati sulla croce e osserva il punto lampeggiante con la coda dell'occhio. Fai scorrere il punto a sinistra e a destra finché non scompare nel tuo punto cieco, quindi premi la barra SPAZIATRICE. Mantieni la distanza di visione mentre testi entrambi gli occhi.",ja:"❌ 申し訳ありませんが、最新の左右の測定値が一致していませんでした。もう一度やり直してください?片目を閉じたままにしてください。十字に焦点を合わせ、目の端に現れる点滅する点を監視してください。死角に消えるまでドットを左右にスライドさせ、スペース バーを押します。両目を検査するときは、観察距離を維持してください。",kn:"❌ ಕ್ಷಮಿಸಿ, ತೀರಾ ಇತ್ತೀಚಿನ ಎಡ ಮತ್ತು ಬಲ ಅಳತೆಗಳು ಅಸಮಂಜಸವಾಗಿವೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸುವುದೇ? ಒಂದು ಕಣ್ಣು ಮುಚ್ಚಿ ಇರಿ. ಶಿಲುಬೆಯ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಿಂದ ಮಿನುಗುವ ಬಿಂದುವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಿ. ಡಾಟ್ ಅನ್ನು ಎಡಕ್ಕೆ ಮತ್ತು ಬಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ, ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾಗುವವರೆಗೆ, ತದನಂತರ SPACE ಬಾರ್ ಅನ್ನು ಒತ್ತಿರಿ. ನೀವು ಎರಡೂ ಕಣ್ಣುಗಳನ್ನು ಪರೀಕ್ಷಿಸುವಾಗ ನಿಮ್ಮ ವೀಕ್ಷಣಾ ಅಂತರವನ್ನು ಕಾಪಾಡಿಕೊಳ್ಳಿ.",ko:"❌ 죄송합니다. 가장 최근의 왼쪽 및 오른쪽 측정값이 일치하지 않았습니다. 다시 시도하시겠습니까? 한쪽 눈을 감고 있으세요. 십자가에 초점을 맞추고 눈 구석에서 깜박이는 점을 관찰하십시오. 점이 사각지대까지 사라질 때까지 점을 왼쪽과 오른쪽으로 민 다음 스페이스바를 누르세요. 두 눈을 테스트할 때 시청 거리를 유지하세요.",lt:"❌ Atsiprašome, paskutiniai kairės ir dešinės pusės matavimai buvo nenuoseklūs. Bandyti dar kartą? Laikykite vieną akį užmerktą. Sutelkite dėmesį į kryžių ir stebėkite mirksintį tašką akies kamputyje. Slinkite tašką kairėn ir dešinėn, kol jis išnyks jūsų aklojoje zonoje, tada paspauskite tarpo klavišą. Išlaikykite žiūrėjimo atstumą, kai tikrinate abi akis.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"❌ ക്ഷമിക്കണം, ഏറ്റവും പുതിയ ഇടത്, വലത് അളവുകൾ പൊരുത്തമില്ലാത്തതായിരുന്നു. വീണ്ടും ശ്രമിക്കുക? ഒരു കണ്ണ് അടയ്ക്കുക. കുരിശിൽ ഫോക്കസ് ചെയ്യുക, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിൽ നിന്ന് മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുക. നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അത് അപ്രത്യക്ഷമാകുന്നതുവരെ ഡോട്ട് ഇടത്തോട്ടും വലത്തോട്ടും സ്ലൈഡുചെയ്യുക, തുടർന്ന് സ്‌പെയ്‌സ് ബാറിൽ അമർത്തുക. രണ്ട് കണ്ണുകളും പരിശോധിക്കുമ്പോൾ നിങ്ങളുടെ കാഴ്ച ദൂരം നിലനിർത്തുക.",no:"❌ Beklager, de siste målingene til venstre og høyre var inkonsekvente. Prøv igjen? Hold ett øye lukket. Fokuser på korset og overvåk den blinkende prikken ut av øyekroken. Skyv prikken til venstre og høyre til den forsvinner inn i blindsonen din, og trykk deretter på MELLOMROM. Hold visningsavstanden mens du tester begge øynene.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"❌ Przepraszamy, ostatnie pomiary lewej i prawej strony były niespójne. Spróbuj ponownie? Trzymaj jedno oko zamknięte. Skup się na krzyżyku i obserwuj migającą kropkę kątem oka. Przesuwaj kropkę w lewo i w prawo, aż zniknie w twoim martwym punkcie, a następnie naciśnij klawisz SPACJA. Utrzymuj odległość patrzenia podczas badania obu oczu.",pt:"❌ Desculpe, as medições esquerda e direita mais recentes foram inconsistentes. Tentar novamente? Mantenha um olho fechado. Concentre-se na cruz e monitore o ponto piscando no canto do olho. Deslize o ponto para a esquerda e para a direita até que ele desapareça no ponto cego e, em seguida, pressione a barra de ESPAÇO. Mantenha a distância de visualização enquanto testa ambos os olhos.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"❌ Lo siento, las mediciones más recientes de izquierda y derecha fueron inconsistentes. ¿Intentar de nuevo? Mantén un ojo cerrado. Enfócate en la cruz y observa el punto parpadeante con el rabillo del ojo. Desliza el punto hacia la izquierda y la derecha hasta que desaparezca en tu punto ciego, y luego presiona la barra ESPACIADORA. Mantén tu distancia de visión mientras pruebas ambos ojos.",sw:"❌ Samahani, vipimo vya hivi majuzi zaidi vya kushoto na kulia havikuwa sawa. Ungependa kujaribu tena? Weka jicho moja limefungwa. Zingatia msalaba na ufuatilie nukta inayong'aa kutoka kwenye kona ya jicho lako. Telezesha kitone kushoto na kulia hadi kipotee kwenye upofu wako, kisha ugonge upau wa SPACE. Dumisha umbali wako wa kutazama unapojaribu macho yote mawili.",sv:"❌ Tyvärr, de senaste vänster- och högermåtten var inkonsekventa. Försök igen? Håll ett öga stängt. Fokusera på korset och övervaka den blinkande punkten i ögonvrån. Skjut punkten åt vänster och höger tills den försvinner i din döda vinkel och tryck sedan på MELLANSLAG. Behåll ditt synavstånd när du testar båda ögonen.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"❌ Üzgünüz, en son sol ve sağ ölçümler tutarsızdı. Tekrar deneyin? Bir gözünüzü kapalı tutun. Çarmıha odaklanın ve yanıp sönen noktayı gözünüzün köşesinden izleyin. Noktayı kör noktanızda kaybolana kadar sola ve sağa kaydırın ve ardından BOŞLUK çubuğuna basın. Her iki gözünüzü test ederken görüş mesafenizi koruyun.",ur:"❌ معذرت، حالیہ بائیں اور دائیں پیمائشیں متضاد تھیں۔ دوبارہ کوشش کریں؟ ایک آنکھ بند رکھیں۔ کراس پر توجہ مرکوز کریں اور اپنی آنکھ کے کونے سے چمکتے ہوئے نقطے کی نگرانی کریں۔ ڈاٹ کو بائیں اور دائیں سلائیڈ کریں جب تک کہ یہ آپ کے بلائنڈ سپاٹ میں غائب نہ ہو جائے، اور پھر SPACE بار کو ماریں۔ دونوں آنکھوں کی جانچ کرتے وقت اپنے دیکھنے کا فاصلہ برقرار رکھیں۔"},RC_viewingDistance:{"en-US":"Viewing Distance",ar:"مسافة المشاهدة",hy:"Դիտման հեռավորությունը",bg:"Разстояние за гледане","zh-CN":"观看距离","zh-HK":"觀看距離",hr:"Udaljenost gledanja",cs:"Zobrazovací vzdálenost",da:"Visningsafstand",nl:"Kijkafstand","en-UK":"Viewing Distance",fi:"Katseluetäisyys",fr:"Distance de visionnement",de:"Betrachtungsentfernung",el:"Απόσταση προβολής",he:"מרחק צפייה",hi:"देखने की दूरी",hu:"Megtekintési távolság",is:"Skoðunarfjarlægð",id:"Jarak Pandang",it:"Distanza di visione",ja:"視聴距離",kn:"ವೀಕ್ಷಣಾ ದೂರ",ko:"시청 거리",lt:"Žiūrėjimo atstumas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാണുന്ന ദൂരം",no:"Visningsavstand",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Odległość oglądania",pt:"Visualizando distância",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Distancia de visualización",sw:"Umbali wa Kutazama",sv:"Betraktningsavstånd",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Görüş Mesafesi",ur:"دیکھنے کا فاصلہ"},RC_viewingDistanceIntroTitle:{"en-US":"Explanation",ar:"تفسير",hy:"Բացատրություն",bg:"Обяснение","zh-CN":"解释","zh-HK":"解釋",hr:"Obrazloženje",cs:"Vysvětlení",da:"Forklaring",nl:"Uitleg","en-UK":"Explanation",fi:"Selitys",fr:"Explication",de:"Erläuterung",el:"Εξήγηση",he:"הֶסבֵּר",hi:"स्पष्टीकरण",hu:"Magyarázat",is:"Skýring",id:"Penjelasan",it:"Spiegazione",ja:"説明",kn:"ವಿವರಣೆ",ko:"설명",lt:"Paaiškinimas",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വിശദീകരണം",no:"Forklaring",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Wyjaśnienie",pt:"Explicação",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Explicación",sw:"Maelezo",sv:"Förklaring",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Açıklama",ur:"وضاحت"},RC_viewingDistanceIntroLiMethod:{"en-US":"EXPLANATION. For this step, come closer, if necessary, so you're no farther than twice the screen width. Every eye has a blindspot. We'll find yours to discover how far your eye is from the screen. You'll be asked to close or cover one eye to isolate the other. While you focus on the cross, watch the flickering dot out of the corner of your eye, and hit RETURN when it disappears into your blindspot. Depending on viewing distance and screen size, the flickering dot typically will reach your blindspot before it gets to the middle of the screen. You'll do this with each eye, alternating, until the last two measurements are consistent. Please maintain your viewing distance as you test both eyes. NOTE. If the dot never disappears, it means that your eye is following the dot, instead of staying on the cross. This test needs you to keep your eye on the cross while monitoring the flickering dot in the corner of your eye. That's hard at first, but becomes easier with practice.",ar:"التفسير. لهذه الخطوة، اقترب إذا لزم الأمر، حتى لا تكون أبعد من ضعف عرض الشاشة. كل عين لديها نقطة عمياء. سنجد لك نقطتك العمياء لاكتشاف مدى بعد عينك عن الشاشة. سيُطلب منك إغلاق أو تغطية عين واحدة لعزل الأخرى. بينما تركز على الصليب، راقب النقطة الوميضية من زاوية عينك، واضغط على RETURN عندما تختفي في نقطتك العمياء. اعتمادًا على مسافة المشاهدة وحجم الشاشة، عادةً ما تصل النقطة الوميضية إلى نقطتك العمياء قبل أن تصل إلى منتصف الشاشة. ستقوم بذلك مع كل عين، بالتناوب، حتى تكون آخر قياسين متسقين. يرجى الحفاظ على مسافة المشاهدة الخاصة بك أثناء اختبار كلتا العينين. ملاحظة. إذا لم تختف النقطة أبدًا، فهذا يعني أن عينك تتبع النقطة، بدلاً من البقاء على الصليب. يحتاج هذا الاختبار إلى إبقاء عينك على الصليب أثناء مراقبة النقطة الوميضية في زاوية عينك. هذا صعب في البداية، لكنه يصبح أسهل مع الممارسة.",hy:"ԲԱՑԱՏՐՈՒԹՅՈՒՆ. Այս քայլին անհրաժեշտության դեպքում մոտեցեք, այնպես որ էկրանի լայնությունից երկու անգամ ավելի հեռու չեք: Յուրաքանչյուր աչք ունի կույր կետ: Մենք կգտնենք ձերը՝ պարզելու համար, թե որքան հեռու է ձեր աչքը էկրանից: Ձեզանից կպահանջվի փակել կամ փակել մի աչքը՝ մյուսը մեկուսացնելու համար: Մինչ դուք կենտրոնանում եք խաչի վրա, դիտեք թարթող կետը ձեր աչքի ծայրով և սեղմեք RETURN, երբ այն անհետանա ձեր կույր կետում: Կախված դիտման հեռավորությունից և էկրանի չափից՝ թարթող կետը սովորաբար կհասնի ձեր կույր կետին՝ նախքան էկրանի կեսին հասնելը: Դուք դա կանեք յուրաքանչյուր աչքով, հերթափոխով, մինչև վերջին երկու չափումները համապատասխանեն: Խնդրում ենք պահպանել դիտման հեռավորությունը երկու աչքը փորձարկելիս: ԾԱՆՈԹԱԳՐՈՒԹՅՈՒՆ. Եթե ​​կետը երբեք չի անհետանում, դա նշանակում է, որ ձեր աչքը խաչի վրա մնալու փոխարեն հետևում է կետին: Այս թեստի համար անհրաժեշտ է, որ դուք ձեր աչքը պահեք խաչի վրա՝ միաժամանակ հետևելով ձեր աչքի անկյունում թարթող կետին: Դա սկզբում դժվար է, բայց գործնականում ավելի հեշտ է դառնում:",bg:"ОБЯСНЕНИЕ. За тази стъпка се приближете, ако е необходимо, така че да не сте по-далече от два пъти ширината на екрана. Всяко око има сляпо петно. Ние ще намерим вашия, за да разберем колко далеч е окото ви от екрана. Ще бъдете помолени да затворите или покриете едното си око, за да изолирате другото. Докато се фокусирате върху кръста, наблюдавайте трепкащата точка с крайчеца на окото си и натиснете RETURN, когато изчезне в сляпото ви петно. В зависимост от разстоянието за гледане и размера на екрана, мигащата точка обикновено ще достигне сляпото ви петно, преди да стигне до средата на екрана. Ще правите това с всяко око, редувайки се, докато последните две измервания станат еднакви. Моля, спазвайте разстоянието на гледане, докато тествате и двете очи. ЗАБЕЛЕЖКА. Ако точката никога не изчезва, това означава, че окото ви следва точката, вместо да стои на кръста. Този тест изисква да държите очите си върху кръста, докато наблюдавате трепкащата точка в ъгъла на окото си. В началото е трудно, но става по-лесно с практиката.","zh-CN":"解释。对于此步骤,如有必要,请靠近一些,这样您的距离就不会超过屏幕宽度的两倍。每只眼睛都有一个盲点。我们会找到您的眼睛,以了解您的眼睛距屏幕有多远。系统会要求您闭上或遮住一只眼睛以隔离另一只眼睛。当你专注于十字架时,用眼角余光观察闪烁的点,当它消失在你的盲点中时按“返回”。根据观看距离和屏幕尺寸,闪烁点通常会在到达屏幕中间之前到达您的盲点。您将用每只眼睛交替执行此操作,直到最后两次测量结果一致。测试双眼时请保持观看距离。笔记。如果该点永远不会消失,则意味着您的眼睛正在追随该点,而不是停留在十字架上。该测试需要您将目光集中在十字架上,同时观察眼角闪烁的点。一开始这很难,但经过练习就会变得更容易。","zh-HK":"解釋。對於此步驟,如有必要,請靠近一些,這樣您的距離就不會超過螢幕寬度的兩倍。每隻眼睛都有一個盲點。我們會找到您的眼睛,以了解您的眼睛離螢幕有多遠。系統會要求您閉上或遮住一隻眼睛以隔離另一隻眼睛。當你專注於十字架時,用眼角余光觀察閃爍的點,當它消失在你的盲點中時按“返回”。根據觀看距離和螢幕尺寸,閃爍點通常會在到達螢幕中間之前到達您的盲點。您將用每隻眼睛交替執行此操作,直到最後兩次測量結果一致。測試雙眼時請保持觀看距離。筆記。如果該點永遠不會消失,則表示您的眼睛正在追隨該點,而不是停留在十字架上。此測試需要您將目光集中在十字架上,同時觀察眼角閃爍的點。一開始這很難,但經過練習就會變得更容易。",hr:"OBRAZLOŽENJE. Za ovaj korak, priđite bliže, ako je potrebno, tako da ne budete dalje od dvostruke širine zaslona. Svako oko ima slijepu mrlju. Pronaći ćemo vaš kako bismo otkrili koliko vam je oko udaljeno od ekrana. Od vas će se tražiti da zatvorite ili pokrijete jedno oko kako biste izolirali drugo. Dok se fokusirate na križ, promatrajte treperavu točku krajičkom oka i pritisnite RETURN kada nestane u vašoj slijepoj točki. Ovisno o udaljenosti gledanja i veličini zaslona, ​​titrajuća točka obično će dosegnuti vašu mrtvu točku prije nego što stigne do sredine zaslona. To ćete učiniti sa svakim okom, naizmjenično, sve dok posljednja dva mjerenja ne budu dosljedna. Održavajte udaljenost gledanja dok testirate oba oka. BILJEŠKA. Ako točka nikad ne nestane, to znači da vaše oko prati točku, umjesto da ostaje na križu. Ovaj test zahtijeva da pogled držite na križu dok promatrate svjetlucavu točkicu u kutu oka. To je u početku teško, ali s vježbom postaje lakše.",cs:"VYSVĚTLENÍ. Při tomto kroku se v případě potřeby přibližte, abyste nebyli dále než dvojnásobek šířky obrazovky. Každé oko má slepou skvrnu. Najdeme ten váš, abychom zjistili, jak daleko je vaše oko od obrazovky. Budete požádáni, abyste zavřeli nebo zakryli jedno oko, abyste izolovali druhé. Zatímco se soustředíte na kříž, sledujte koutkem oka blikající tečku, a když zmizí ve vašem slepém úhlu, stiskněte RETURN. V závislosti na vzdálenosti a velikosti obrazovky se blikající bod obvykle dostane do vašeho mrtvého bodu dříve, než se dostane do středu obrazovky. Budete to dělat s každým okem střídavě, dokud nebudou poslední dvě měření konzistentní. Při testování obou očí dodržujte pozorovací vzdálenost. POZNÁMKA. Pokud tečka nikdy nezmizí, znamená to, že vaše oko sleduje tečku, místo aby zůstalo na kříži. Tento test vyžaduje, abyste drželi oči na kříži a zároveň sledovali blikající tečku v koutku oka. Zpočátku je to těžké, ale s praxí se to zjednoduší.",da:"FORKLARING. Til dette trin skal du om nødvendigt komme tættere på, så du ikke er længere end det dobbelte af skærmens bredde. Hvert øje har en blind plet. Vi finder din for at finde ud af, hvor langt dit øje er fra skærmen. Du bliver bedt om at lukke eller dække det ene øje for at isolere det andet. Mens du fokuserer på korset, så se den flimrende prik ud af øjenkrogen, og tryk på RETURN, når den forsvinder i din blindspot. Afhængig af visningsafstand og skærmstørrelse vil den flimrende prik typisk nå din blindspot, før den når til midten af ​​skærmen. Du vil gøre dette med hvert øje, skiftevis, indtil de sidste to målinger er konsistente. Hold venligst din synsafstand, mens du tester begge øjne. NOTE. Hvis prikken aldrig forsvinder, betyder det, at dit øje følger prikken i stedet for at blive på korset. Denne test kræver, at du holder øje med korset, mens du overvåger den flimrende prik i øjenkrogen. Det er svært i starten, men det bliver lettere med træning.",nl:"UITLEG. Kom voor deze stap indien nodig dichterbij, zodat u niet verder bent dan tweemaal de schermbreedte. Ieder oog heeft een blinde vlek. Wij vinden de uwe om te ontdekken hoe ver uw oog van het scherm verwijderd is. U wordt gevraagd één oog te sluiten of af te dekken om het andere te isoleren. Terwijl je je op het kruis concentreert, bekijk je de flikkerende stip vanuit je ooghoek en druk je op RETURN zodra deze in je blinde vlek verdwijnt. Afhankelijk van de kijkafstand en de schermgrootte bereikt de flikkerende stip doorgaans uw blinde vlek voordat deze het midden van het scherm bereikt. Je doet dit afwisselend met elk oog, totdat de laatste twee metingen consistent zijn. Houd uw kijkafstand aan terwijl u beide ogen test. OPMERKING. Als de stip nooit verdwijnt, betekent dit dat uw oog de stip volgt, in plaats van op het kruis te blijven staan. Bij deze test moet u het kruis in de gaten houden terwijl u de flikkerende stip in uw ooghoek in de gaten houdt. Dat is in het begin moeilijk, maar wordt gemakkelijker naarmate je oefent.","en-UK":"EXPLANATION. For this step, come closer, if necessary, so you're no further than twice the screen width. Every eye has a blind spot. We'll find yours to discover how far your eye is from the screen. You'll be asked to close or cover one eye to isolate the other. While you focus on the cross, watch the flickering dot out of the corner of your eye, and hit RETURN when it disappears into your blind spot. Depending on viewing distance and screen size, the flickering dot typically will reach your blind spot before it gets to the middle of the screen. You'll do this with each eye, alternating, until the last two measurements are consistent. Please maintain your viewing distance as you test both eyes. NOTE. If the dot never disappears, it means that your eye is following the dot, instead of staying on the cross. This test needs you to keep your eye on the cross while monitoring the flickering dot in the corner of your eye. That's hard at first, but becomes easier with practice.",fi:"SELITYS. Tule tätä vaihetta varten tarvittaessa lähemmäksi, jotta et ole kauempana kuin kaksi kertaa näytön leveys. Jokaisella silmällä on sokeapiste. Löydämme omasi selvittääksemme, kuinka kaukana silmäsi on näytöstä. Sinua pyydetään sulkemaan tai peittämään toinen silmä toisen eristämiseksi. Kun keskityt ristiin, katso välkkyvää pistettä silmäkulmasta ja paina RETURN, kun se katoaa sokealle pisteelle. Katseluetäisyydestä ja näytön koosta riippuen välkkyvä piste saavuttaa yleensä sokean pisteen ennen kuin se tulee näytön keskelle. Teet tämän kummallakin silmällä vuorotellen, kunnes kaksi viimeistä mittausta ovat yhdenmukaisia. Säilytä katseluetäisyys, kun testaat molempia silmiä. HUOM. Jos piste ei koskaan katoa, se tarkoittaa, että silmäsi seuraa pistettä sen sijaan, että pysyisi ristillä. Tämä testi edellyttää, että pidät silmäsi ristissä ja tarkkailet välkkyvää pistettä silmäkulmassasi. Se on aluksi vaikeaa, mutta helpottaa harjoittelua.",fr:"EXPLICATION. Pour cette étape, rapprochez-vous si nécessaire, de sorte que vous ne soyez pas à plus de deux fois la largeur de l'écran. Chaque œil a un point aveugle. Nous allons trouver le vôtre pour découvrir à quelle distance votre œil est de l'écran. On vous demandera de fermer ou de couvrir un œil pour isoler l'autre. Pendant que vous vous concentrez sur la croix, regardez le point clignotant du coin de l'œil et appuyez sur RETOUR lorsqu'il disparaît dans votre point aveugle. Selon la distance de vision et la taille de l'écran, le point clignotant atteindra généralement votre point aveugle avant d'arriver au milieu de l'écran. Vous ferez cela avec chaque œil, en alternant, jusqu'à ce que les deux dernières mesures soient cohérentes. Veuillez maintenir votre distance de vision pendant que vous testez les deux yeux. REMARQUE. Si le point ne disparaît jamais, cela signifie que votre œil suit le point, au lieu de rester sur la croix. Ce test nécessite que vous gardiez votre œil sur la croix tout en surveillant le point clignotant dans le coin de votre œil. C'est difficile au début, mais cela devient plus facile avec la pratique.",de:"ERLÄUTERUNG. Gehen Sie für diesen Schritt bei Bedarf näher heran, sodass Sie nicht weiter als die doppelte Bildschirmbreite entfernt sind. Jedes Auge hat einen blinden Fleck. Wir finden Ihr Auge, um herauszufinden, wie weit Ihr Auge vom Bildschirm entfernt ist. Sie werden aufgefordert, ein Auge zu schließen oder abzudecken, um das andere zu isolieren. Während Sie sich auf das Kreuz konzentrieren, beobachten Sie aus dem Augenwinkel den flackernden Punkt und drücken Sie die Eingabetaste, wenn er in Ihrem toten Winkel verschwindet. Abhängig vom Betrachtungsabstand und der Bildschirmgröße erreicht der flackernde Punkt normalerweise Ihren toten Winkel, bevor er die Mitte des Bildschirms erreicht. Dies machen Sie abwechselnd mit jedem Auge, bis die letzten beiden Messungen übereinstimmen. Bitte halten Sie beim Testen beider Augen Ihren Sehabstand ein. NOTIZ. Wenn der Punkt nie verschwindet, bedeutet das, dass Ihr Auge dem Punkt folgt, anstatt am Kreuz zu bleiben. Bei diesem Test müssen Sie das Kreuz im Auge behalten und gleichzeitig den flackernden Punkt im Augenwinkel beobachten. Das ist zunächst schwierig, wird aber mit der Übung einfacher.",el:"ΕΞΗΓΗΣΗ. Για αυτό το βήμα, πλησιάστε, εάν είναι απαραίτητο, ώστε να μην είστε περισσότερο από το διπλάσιο του πλάτους της οθόνης. Κάθε μάτι έχει ένα τυφλό σημείο. Θα βρούμε το δικό σας για να ανακαλύψουμε πόσο απέχει το μάτι σας από την οθόνη. Θα σας ζητηθεί να κλείσετε ή να καλύψετε το ένα μάτι για να απομονώσετε το άλλο. Ενώ εστιάζετε στον σταυρό, παρακολουθήστε την κουκκίδα που τρεμοπαίζει με την άκρη του ματιού σας και πατήστε RETURN όταν εξαφανιστεί στο τυφλό σημείο σας. Ανάλογα με την απόσταση προβολής και το μέγεθος της οθόνης, η κουκκίδα που τρεμοπαίζει συνήθως φτάνει στο σημείο των τυφλών σας πριν φτάσει στο μέσο της οθόνης. Θα το κάνετε αυτό με κάθε μάτι, εναλλάξ, έως ότου οι δύο τελευταίες μετρήσεις είναι συνεπείς. Διατηρήστε την απόσταση θέασής σας καθώς δοκιμάζετε και τα δύο μάτια. ΣΗΜΕΙΩΜΑ. Εάν η τελεία δεν εξαφανιστεί ποτέ, σημαίνει ότι το μάτι σας ακολουθεί την κουκκίδα, αντί να μείνει στον σταυρό. Αυτή η δοκιμή χρειάζεται να κρατάτε το μάτι σας στο σταυρό ενώ παρακολουθείτε την κουκκίδα που τρεμοπαίζει στη γωνία του ματιού σας. Αυτό είναι δύσκολο στην αρχή, αλλά γίνεται πιο εύκολο με την εξάσκηση.",he:"הֶסבֵּר. לשלב זה, התקרבו, במידת הצורך, כך שאתם לא רחוקים מפי שניים מרוחב המסך. לכל עין יש נקודה עיוורת. אנחנו נמצא את שלך כדי לגלות כמה רחוקה העין שלך מהמסך. תתבקש לסגור או לכסות עין אחת כדי לבודד את השנייה. בזמן שאתה מתמקד על הצלב, צפה בנקודה המהבהבת בזווית העין שלך, ולחץ על RETURN כשהיא נעלמת בנקודה העיוורת שלך. בהתאם למרחק הצפייה ולגודל המסך, הנקודה המרצדת בדרך כלל תגיע לנקודה העיוורת שלך לפני שהיא מגיעה לאמצע המסך. אתה תעשה זאת עם כל עין, לסירוגין, עד ששתי המדידות האחרונות יהיו עקביות. נא לשמור על מרחק צפייה בזמן שאתה בודק את שתי העיניים. פֶּתֶק. אם הנקודה לעולם לא נעלמת, זה אומר שהעין שלך עוקבת אחרי הנקודה, במקום להישאר על הצלב. בדיקה זו מחייבת אותך לפקוח עין על הצלב תוך ניטור הנקודה המרצדת בזווית העין. זה קשה בהתחלה, אבל נעשה קל יותר עם התרגול.",hi:"स्पष्टीकरण। इस चरण के लिए, यदि आवश्यक हो तो करीब आएं, ताकि आप स्क्रीन की चौड़ाई से दोगुने से अधिक दूर न रहें। हर आँख में एक ब्लाइंडस्पॉट होता है। हम आपका पता लगाएंगे कि आपकी आंख स्क्रीन से कितनी दूर है। आपको दूसरी आंख को अलग करने के लिए एक आंख बंद करने या ढकने के लिए कहा जाएगा। जब आप क्रॉस पर ध्यान केंद्रित करते हैं, तो अपनी आंख के कोने से टिमटिमाते बिंदु को देखें, और जब यह आपके ब्लाइंडस्पॉट में गायब हो जाए तो रिटर्न दबाएं। देखने की दूरी और स्क्रीन आकार के आधार पर, टिमटिमाता बिंदु आमतौर पर स्क्रीन के मध्य तक पहुंचने से पहले आपके ब्लाइंडस्पॉट तक पहुंच जाएगा। आप इसे प्रत्येक आंख के साथ बारी-बारी से करेंगे, जब तक कि अंतिम दो माप एक समान न हो जाएं। कृपया दोनों आंखों का परीक्षण करते समय देखने की दूरी बनाए रखें। टिप्पणी। यदि बिंदु कभी गायब नहीं होता है, तो इसका मतलब है कि आपकी आंख क्रॉस पर रहने के बजाय बिंदु का अनुसरण कर रही है। इस परीक्षण के लिए आपको अपनी आंख के कोने में टिमटिमाते बिंदु की निगरानी करते हुए अपनी आंख को क्रॉस पर रखना होगा। यह शुरुआत में कठिन है, लेकिन अभ्यास के साथ आसान हो जाता है।",hu:"MAGYARÁZAT. Ehhez a lépéshez, ha szükséges, jöjjön közelebb, hogy ne legyen messzebb a képernyő szélességének kétszeresénél. Minden szemnek van vakfoltja. Megtaláljuk a magáét, hogy megtudjuk, milyen messze van a szeme a képernyőtől. Megkérjük, hogy csukja be vagy takarja le az egyik szemét, hogy elszigetelje a másikat. Amíg a keresztre fókuszál, figyelje a villogó pontot a szeme sarkából, és nyomja meg a RETURN gombot, amikor az eltűnik a vakfoltban. A megtekintési távolságtól és a képernyő méretétől függően a villogó pont általában eléri a vakfoltot, mielőtt a képernyő közepére érne. Ezt mindkét szemmel felváltva kell elvégezni, amíg az utolsó két mérés konzisztens lesz. Kérjük, tartsa be a látótávolságot, miközben mindkét szemét teszteli. JEGYZET. Ha a pont soha nem tűnik el, az azt jelenti, hogy a szemed követi a pontot, ahelyett, hogy a kereszten maradna. Ehhez a teszthez tartsa a szemét a kereszten, miközben figyeli a villogó pontot a szeme sarkában. Eleinte nehéz, de gyakorlással könnyebbé válik.",is:"SKÝRING. Fyrir þetta skref, komdu nær, ef nauðsyn krefur, svo þú sért ekki lengra en tvöfalda skjábreiddina. Hvert auga hefur blindan blett. Við finnum þitt til að uppgötva hversu langt augað þitt er frá skjánum. Þú verður beðinn um að loka eða hylja annað augað til að einangra hitt. Á meðan þú einbeitir þér að krossinum, horfðu á flöktandi punktinn út úr augnkróknum og ýttu á RETURN þegar hann hverfur í blindblettinn þinn. Það fer eftir áhorfsfjarlægð og skjástærð, flöktandi punkturinn nær venjulega blinda blettinum þínum áður en hann kemst á miðjan skjáinn. Þú munt gera þetta með hverju auga, til skiptis, þar til síðustu tvær mælingar eru í samræmi. Vinsamlegast haltu skoðunarfjarlægð þinni þegar þú prófar bæði augun. ATH. Ef punkturinn hverfur aldrei þýðir það að augað þitt fylgir punktinum í stað þess að vera á krossinum. Þetta próf þarf að hafa augun á krossinum á meðan þú fylgist með flöktandi punktinum í augnkróknum. Það er erfitt í fyrstu, en verður auðveldara með æfingum.",id:"PENJELASAN. Untuk langkah ini, mendekatlah, jika perlu, sehingga jarak Anda tidak lebih dari dua kali lebar layar. Setiap mata mempunyai titik buta. Kami akan menemukan milik Anda untuk mengetahui seberapa jauh mata Anda dari layar. Anda akan diminta untuk menutup atau menutupi satu mata untuk mengisolasi mata lainnya. Saat Anda fokus pada salib, perhatikan titik yang berkedip-kedip dari sudut mata Anda, dan tekan RETURN ketika titik tersebut menghilang di titik buta Anda. Tergantung pada jarak pandang dan ukuran layar, titik yang berkedip biasanya akan mencapai titik buta Anda sebelum mencapai bagian tengah layar. Anda akan melakukan ini dengan setiap mata, secara bergantian, hingga dua pengukuran terakhir konsisten. Harap menjaga jarak pandang Anda saat Anda menguji kedua mata. CATATAN. Jika titik tersebut tidak pernah hilang, berarti mata Anda mengikuti titik tersebut, bukannya tetap terpaku pada salib. Tes ini mengharuskan Anda mengawasi salib sambil memantau titik yang berkedip-kedip di sudut mata Anda. Itu sulit pada awalnya, tetapi menjadi lebih mudah dengan latihan.",it:"SPIEGAZIONE. Per questo passaggio, avvicinati, se necessario, in modo da non essere più lontano del doppio della larghezza dello schermo. Ogni occhio ha un punto cieco. Troveremo il tuo per scoprire quanto è lontano il tuo occhio dallo schermo. Ti verrà chiesto di chiudere o coprire un occhio per isolare l'altro. Mentre ti concentri sulla croce, osserva il punto lampeggiante con la coda dell'occhio e premi INVIO quando scompare nel tuo punto cieco. A seconda della distanza di visione e delle dimensioni dello schermo, il punto lampeggiante di solito raggiungerà il tuo punto cieco prima di arrivare al centro dello schermo. Farai questo con ciascun occhio, alternando, fino a quando le ultime due misurazioni saranno coerenti. Si prega di mantenere la distanza di visione mentre si testano entrambi gli occhi. NOTA. Se il punto non scompare mai, significa che il tuo occhio sta seguendo il punto, invece di rimanere sulla croce. Questo test richiede di mantenere l'occhio sulla croce mentre si monitora il punto lampeggiante con la coda dell'occhio. È difficile all'inizio, ma diventa più facile con la pratica.",ja:"説明。この手順では、必要に応じて、画面幅の 2 倍を超えないように近づいてください。どの目にも盲点があります。私たちはあなたの目を見つけて、あなたの目が画面からどのくらい離れているかを調べます。片方の目を閉じるか覆うようにして、もう片方の目を隔離するように求められます。十字に焦点を合わせている間、目の端にちらつく点を観察し、それが死角に消えたら RETURN を押します。視聴距離と画面サイズに応じて、通常、ちらつきドットは画面の中央に到達する前に死角に到達します。最後の 2 つの測定値が一致するまで、これを各目で交互に行います。両目を検査するときは、観察距離を維持してください。注記。点が消えない場合は、目が十字に留まらずに点を追っていることを意味します。このテストでは、目の隅にあるちらつく点を監視しながら、十字から目を離さないようにする必要があります。最初は難しいですが、練習すると簡単になります。",kn:"ವಿವರಣೆ ಈ ಹಂತಕ್ಕಾಗಿ, ಅಗತ್ಯವಿದ್ದರೆ ಹತ್ತಿರ ಬನ್ನಿ, ಆದ್ದರಿಂದ ನೀವು ಪರದೆಯ ಅಗಲಕ್ಕಿಂತ ಎರಡು ಪಟ್ಟು ಹೆಚ್ಚು ದೂರವಿರುವುದಿಲ್ಲ. ಪ್ರತಿಯೊಂದು ಕಣ್ಣಿಗೂ ಒಂದು ಕುರುಡು ಮಚ್ಚೆ ಇರುತ್ತದೆ. ನಿಮ್ಮ ಕಣ್ಣು ಪರದೆಯಿಂದ ಎಷ್ಟು ದೂರದಲ್ಲಿದೆ ಎಂಬುದನ್ನು ಕಂಡುಹಿಡಿಯಲು ನಾವು ನಿಮ್ಮದನ್ನು ಕಂಡುಕೊಳ್ಳುತ್ತೇವೆ. ಒಂದು ಕಣ್ಣನ್ನು ಮುಚ್ಚಲು ಅಥವಾ ಇನ್ನೊಂದನ್ನು ಪ್ರತ್ಯೇಕಿಸಲು ಮುಚ್ಚಲು ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ. ನೀವು ಶಿಲುಬೆಯ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸುತ್ತಿರುವಾಗ, ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಿಂದ ಮಿನುಗುವ ಬಿಂದುವನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ಅದು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್‌ನಲ್ಲಿ ಕಣ್ಮರೆಯಾದಾಗ ಹಿಂತಿರುಗಿ ಒತ್ತಿರಿ. ನೋಡುವ ದೂರ ಮತ್ತು ಪರದೆಯ ಗಾತ್ರವನ್ನು ಅವಲಂಬಿಸಿ, ಮಿನುಗುವ ಚುಕ್ಕೆಯು ಸಾಮಾನ್ಯವಾಗಿ ಪರದೆಯ ಮಧ್ಯಭಾಗಕ್ಕೆ ಬರುವ ಮೊದಲು ನಿಮ್ಮ ಬ್ಲೈಂಡ್‌ಸ್ಪಾಟ್ ಅನ್ನು ತಲುಪುತ್ತದೆ. ಕೊನೆಯ ಎರಡು ಅಳತೆಗಳು ಸ್ಥಿರವಾಗುವವರೆಗೆ ನೀವು ಇದನ್ನು ಪ್ರತಿ ಕಣ್ಣಿನಿಂದ ಪರ್ಯಾಯವಾಗಿ ಮಾಡುತ್ತೀರಿ. ನೀವು ಎರಡೂ ಕಣ್ಣುಗಳನ್ನು ಪರೀಕ್ಷಿಸುವಾಗ ದಯವಿಟ್ಟು ನಿಮ್ಮ ವೀಕ್ಷಣಾ ಅಂತರವನ್ನು ಕಾಪಾಡಿಕೊಳ್ಳಿ. ಗಮನಿಸಿ. ಚುಕ್ಕೆ ಎಂದಿಗೂ ಕಣ್ಮರೆಯಾಗದಿದ್ದರೆ, ನಿಮ್ಮ ಕಣ್ಣು ಶಿಲುಬೆಯಲ್ಲಿ ಉಳಿಯುವ ಬದಲು ಚುಕ್ಕೆಯನ್ನು ಅನುಸರಿಸುತ್ತಿದೆ ಎಂದರ್ಥ. ಈ ಪರೀಕ್ಷೆಯು ನಿಮ್ಮ ಕಣ್ಣಿನ ಮೂಲೆಯಲ್ಲಿ ಮಿನುಗುವ ಬಿಂದುವನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವಾಗ ನಿಮ್ಮ ಕಣ್ಣನ್ನು ಶಿಲುಬೆಯ ಮೇಲೆ ಇರಿಸುವ ಅಗತ್ಯವಿದೆ. ಇದು ಮೊದಲಿಗೆ ಕಷ್ಟ, ಆದರೆ ಅಭ್ಯಾಸದೊಂದಿಗೆ ಸುಲಭವಾಗುತ್ತದೆ.",ko:"설명. 이 단계에서는 필요한 경우 더 가까이 다가가십시오. 그러면 화면 너비의 두 배를 넘지 않게 됩니다. 모든 눈에는 맹점이 있습니다. 우리는 당신의 눈이 화면에서 얼마나 멀리 떨어져 있는지 알아낼 것입니다. 다른 쪽 눈을 격리하기 위해 한쪽 눈을 감거나 가리라는 요청을 받게 됩니다. 십자가에 초점을 맞추면서 눈꼬리에서 깜박이는 점을 관찰하고, 그것이 사각지대 속으로 사라지면 RETURN을 누르십시오. 시청 거리와 화면 크기에 따라 깜박이는 점이 일반적으로 화면 중앙에 도달하기 전에 사각지대에 도달합니다. 마지막 두 측정값이 일치할 때까지 각 눈을 번갈아 가며 이 작업을 수행합니다. 양쪽 눈을 검사할 때는 시청거리를 유지하시기 바랍니다. 메모. 점이 결코 사라지지 않는다면, 당신의 눈이 십자가 위에 머물지 않고 점을 따르고 있다는 뜻입니다. 이 테스트에서는 눈 구석에 깜박이는 점을 모니터링하면서 십자가를 계속 주시해야 합니다. 처음에는 어렵지만 연습하면 쉬워집니다.",lt:"PAAIŠKINIMAS. Norėdami atlikti šį veiksmą, prieikite arčiau, kad būtumėte ne toliau nei dvigubai didesnis už ekrano plotį. Kiekviena akis turi akląją dėmę. Surasime jūsų, kad sužinotume, kiek toli jūsų akis yra nuo ekrano. Jūsų bus paprašyta uždaryti arba uždengti vieną akį, kad izoliuotumėte kitą. Kol sutelkiate dėmesį į kryžių, stebėkite mirksintį tašką akies kamputyje ir paspauskite GRĮŽTI, kai jis išnyks jūsų aklojoje zonoje. Priklausomai nuo žiūrėjimo atstumo ir ekrano dydžio, mirksintis taškas paprastai pasieks jūsų akląją tašką, kol pasieks ekrano vidurį. Tai darysite su kiekviena akimi, pakaitomis, kol paskutiniai du matavimai bus vienodi. Išlaikykite žiūrėjimo atstumą, kai tikrinate abi akis. PASTABA. Jei taškas niekada nedingsta, tai reiškia, kad jūsų akis seka tašką, o ne lieka ant kryžiaus. Atliekant šį testą reikia nuolat stebėti kryžių ir stebėti mirgantį tašką akies kamputyje. Iš pradžių tai sunku, bet praktikuojant tampa lengviau.",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"വിശദീകരണം. ഈ ഘട്ടത്തിനായി, ആവശ്യമെങ്കിൽ അടുത്ത് വരൂ, അതിനാൽ നിങ്ങൾ സ്‌ക്രീൻ വീതിയുടെ ഇരട്ടിയിലധികം അകലെയല്ല. ഓരോ കണ്ണിനും ഒരു അന്ധതയുണ്ട്. നിങ്ങളുടെ കണ്ണ് സ്ക്രീനിൽ നിന്ന് എത്ര ദൂരെയാണെന്ന് കണ്ടെത്താൻ നിങ്ങളുടേത് ഞങ്ങൾ കണ്ടെത്തും. നിങ്ങളോട് ഒരു കണ്ണ് അടയ്‌ക്കാനോ മറയ്‌ക്കാനോ ആവശ്യപ്പെടും. നിങ്ങൾ കുരിശിൽ ശ്രദ്ധ കേന്ദ്രീകരിക്കുമ്പോൾ, നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിൽ നിന്ന് മിന്നുന്ന ഡോട്ട് കാണുക, അത് നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിലേക്ക് അപ്രത്യക്ഷമാകുമ്പോൾ റിട്ടേൺ അമർത്തുക. കാണുന്ന ദൂരത്തെയും സ്‌ക്രീൻ വലുപ്പത്തെയും ആശ്രയിച്ച്, സ്‌ക്രീനിൻ്റെ മധ്യഭാഗത്ത് എത്തുന്നതിന് മുമ്പ് മിന്നുന്ന ഡോട്ട് സാധാരണയായി നിങ്ങളുടെ ബ്ലൈൻഡ്‌സ്‌പോട്ടിൽ എത്തും. അവസാന രണ്ട് അളവുകൾ സ്ഥിരമാകുന്നതുവരെ നിങ്ങൾ ഇത് ഓരോ കണ്ണിലും ഒന്നിടവിട്ട് ചെയ്യും. രണ്ട് കണ്ണുകളും പരിശോധിക്കുമ്പോൾ നിങ്ങളുടെ കാഴ്ച അകലം പാലിക്കുക. കുറിപ്പ്. ഡോട്ട് ഒരിക്കലും അപ്രത്യക്ഷമാകുന്നില്ലെങ്കിൽ, നിങ്ങളുടെ കണ്ണ് കുരിശിൽ നിൽക്കുന്നതിന് പകരം ഡോട്ടിനെ പിന്തുടരുന്നു എന്നാണ് അർത്ഥമാക്കുന്നത്. നിങ്ങളുടെ കണ്ണിൻ്റെ കോണിലുള്ള മിന്നുന്ന ഡോട്ട് നിരീക്ഷിക്കുമ്പോൾ നിങ്ങളുടെ കണ്ണ് കുരിശിൽ സൂക്ഷിക്കാൻ ഈ പരിശോധന ആവശ്യമാണ്. ഇത് ആദ്യം ബുദ്ധിമുട്ടാണ്, പക്ഷേ പരിശീലനത്തിലൂടെ എളുപ്പമാകും.",no:"FORKLARING. For dette trinnet, kom nærmere, om nødvendig, slik at du ikke er lenger enn to ganger skjermbredden. Hvert øye har en blindsone. Vi finner din for å finne ut hvor langt øyet ditt er fra skjermen. Du vil bli bedt om å lukke eller dekke det ene øyet for å isolere det andre. Mens du fokuserer på korset, se den flimrende prikken ut av øyekroken, og trykk RETURN når den forsvinner inn i blindsonen din. Avhengig av visningsavstand og skjermstørrelse, vil den flimrende prikken vanligvis nå blindsonen din før den kommer til midten av skjermen. Du vil gjøre dette med hvert øye, alternerende, til de to siste målingene er konsistente. Vennligst hold visningsavstanden mens du tester begge øynene. NOTE. Hvis prikken aldri forsvinner, betyr det at øyet ditt følger prikken, i stedet for å holde seg på korset. Denne testen krever at du holder øye med korset mens du overvåker den flimrende prikken i øyekroken. Det er vanskelig i begynnelsen, men blir lettere med trening.",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"WYJAŚNIENIE. W tym kroku podejdź bliżej, jeśli to konieczne, tak aby nie znaleźć się dalej niż dwukrotność szerokości ekranu. Każde oko ma ślepą plamkę. Znajdziemy Twoje, aby sprawdzić, jak daleko Twoje oko znajduje się od ekranu. Zostaniesz poproszony o zamknięcie lub zasłonięcie jednego oka, aby odizolować drugie. Skupiając się na krzyżu, obserwuj migoczącą kropkę kątem oka i naciśnij POWRÓT, gdy zniknie w twoim martwym punkcie. W zależności od odległości oglądania i rozmiaru ekranu migocząca kropka zwykle dociera do martwego punktu, zanim dotrze do środka ekranu. Będziesz to robić naprzemiennie z każdym okiem, aż dwa ostatnie pomiary będą spójne. Podczas badania obu oczu zachowaj odległość widzenia. NOTATKA. Jeśli kropka nigdy nie znika, oznacza to, że Twoje oko podąża za kropką, zamiast pozostać na krzyżu. W tym teście musisz trzymać wzrok na krzyżu, jednocześnie obserwując migoczącą kropkę w kąciku oka. Na początku jest to trudne, ale wraz z praktyką staje się łatwiejsze.",pt:"EXPLICAÇÃO. Para esta etapa, aproxime-se, se necessário, para não ultrapassar o dobro da largura da tela. Cada olho tem um ponto cego. Encontraremos o seu para descobrir a que distância seu olho está da tela. Você será solicitado a fechar ou cobrir um olho para isolar o outro. Enquanto você foca na cruz, observe o ponto tremeluzente no canto do olho e pressione RETURN quando ele desaparecer no seu ponto cego. Dependendo da distância de visualização e do tamanho da tela, o ponto trêmulo normalmente atingirá seu ponto cego antes de chegar ao meio da tela. Você fará isso com cada olho, alternando, até que as duas últimas medidas sejam consistentes. Por favor, mantenha a distância de visualização enquanto testa ambos os olhos. OBSERVAÇÃO. Se o ponto nunca desaparecer, significa que o seu olho está seguindo o ponto, em vez de permanecer na cruz. Este teste exige que você fique de olho na cruz enquanto monitora o ponto tremeluzente no canto do olho. Isso é difícil no começo, mas fica mais fácil com a prática.",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"EXPLICACIÓN. Para este paso, acérquese, si es necesario, para no estar a más del doble del ancho de la pantalla. Cada ojo tiene un punto ciego. Encontraremos el suyo para descubrir qué tan lejos está su ojo de la pantalla. Se le pedirá que cierre o cubra un ojo para aislar el otro. Mientras se enfoca en la cruz, observe el punto parpadeante con el rabillo del ojo y presione RETURN cuando desaparezca en su punto ciego. Dependiendo de la distancia de visualización y el tamaño de la pantalla, el punto parpadeante generalmente alcanzará su punto ciego antes de llegar al centro de la pantalla. Hará esto con cada ojo, alternando, hasta que las dos últimas mediciones sean consistentes. Por favor, mantenga su distancia de visualización mientras prueba ambos ojos. NOTA. Si el punto nunca desaparece, significa que su ojo está siguiendo el punto, en lugar de quedarse en la cruz. Esta prueba requiere que mantenga su ojo en la cruz mientras monitorea el punto parpadeante en el rabillo del ojo. Eso es difícil al principio, pero se vuelve más fácil con la práctica.",sw:"MAELEZO. Kwa hatua hii, njoo karibu, ikiwa ni lazima, ili usiwe mbali zaidi ya upana wa skrini mara mbili. Kila jicho lina upofu. Tutapata yako ili kugundua jinsi jicho lako lilivyo mbali na skrini. Utaulizwa kufunga au kufunika jicho moja ili kutenga jingine. Unapoangazia msalaba, tazama nukta inayopepea kutoka kwenye kona ya jicho lako, na ugonge RUDISHA inapopotea kwenye upofu wako. Kulingana na umbali wa kutazama na saizi ya skrini, nukta inayopepea kwa kawaida itafikia eneo lako la upofu kabla ya kufika katikati ya skrini. Utafanya hivi kwa kila jicho, ukibadilishana, hadi vipimo viwili vya mwisho vifanane. Tafadhali tunza umbali wako wa kutazama unapojaribu macho yote mawili. KUMBUKA. Ikiwa nukta haipotei kamwe, inamaanisha kwamba jicho lako linafuata dot, badala ya kukaa juu ya msalaba. Jaribio hili linahitaji uweke jicho lako kwenye msalaba huku ukifuatilia nukta inayopepea kwenye kona ya jicho lako. Hiyo ni ngumu mwanzoni, lakini inakuwa rahisi na mazoezi.",sv:"FÖRKLARING. För det här steget, kom närmare, om det behövs, så att du inte är längre än dubbelt så stor skärmbredd. Varje öga har en blind fläck. Vi hittar din för att upptäcka hur långt ditt öga är från skärmen. Du kommer att bli ombedd att stänga eller täcka ett öga för att isolera det andra. Medan du fokuserar på korset, titta på den flimrande pricken i ögonvrån och tryck på RETURN när den försvinner i din döda vinkel. Beroende på visningsavstånd och skärmstorlek kommer den flimrande punkten vanligtvis att nå din döda vinkel innan den når mitten av skärmen. Du kommer att göra detta med varje öga, omväxlande, tills de två sista mätningarna är konsekventa. Vänligen håll ditt synavstånd när du testar båda ögonen. NOTERA. Om pricken aldrig försvinner betyder det att ditt öga följer pricken, istället för att stanna på korset. Detta test kräver att du håller ögat på korset samtidigt som du övervakar den flimrande punkten i ögonvrån. Det är svårt i början, men det blir lättare med träning.",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"AÇIKLAMA. Bu adım için gerekirse yaklaşın, böylece ekran genişliğinin iki katından daha uzakta olmayacaksınız. Her gözün bir kör noktası vardır. Gözünüzün ekrandan ne kadar uzakta olduğunu keşfetmek için sizinkini bulacağız. Diğerini izole etmek için bir gözünüzü kapatmanız veya kapatmanız istenecektir. Çarmıha odaklanırken gözünüzün ucuyla titreyen noktayı izleyin ve kör noktanızda kaybolduğunda RETURN tuşuna basın. İzleme mesafesine ve ekran boyutuna bağlı olarak, titreyen nokta genellikle ekranın ortasına gelmeden kör noktanıza ulaşacaktır. Son iki ölçüm tutarlı olana kadar bunu her gözünüzle dönüşümlü olarak yapacaksınız. Lütfen her iki gözünüzü test ederken görüş mesafenizi koruyun. NOT. Nokta hiç kaybolmuyorsa bu, gözünüzün haç üzerinde kalmak yerine noktayı takip ettiği anlamına gelir. Bu test, gözünüzün köşesinde titreşen noktayı izlerken gözünüzü artı üzerinde tutmanızı gerektirir. Bu ilk başta zordur, ancak pratik yaptıkça kolaylaşır.",ur:"وضاحت اس قدم کے لیے، اگر ضروری ہو تو قریب آئیں، تاکہ آپ اسکرین کی چوڑائی سے دوگنا دور نہ ہوں۔ ہر آنکھ کا ایک اندھا دھبہ ہوتا ہے۔ آپ کی آنکھ اسکرین سے کتنی دور ہے یہ جاننے کے لیے ہم آپ کو تلاش کریں گے۔ آپ کو دوسری آنکھ کو الگ کرنے کے لیے ایک آنکھ بند کرنے یا ڈھانپنے کو کہا جائے گا۔ جب آپ صلیب پر توجہ مرکوز کرتے ہیں، تو اپنی آنکھ کے کونے سے ٹمٹماتے نقطے کو دیکھیں، اور جب یہ آپ کے بلائنڈ سپاٹ میں غائب ہو جائے تو واپسی کو دبائیں۔ دیکھنے کے فاصلے اور اسکرین کے سائز پر منحصر ہے، ٹمٹماتا نقطہ عام طور پر اسکرین کے بیچ میں آنے سے پہلے آپ کے بلائنڈ سپاٹ تک پہنچ جائے گا۔ آپ یہ ہر آنکھ کے ساتھ کریں گے، باری باری، جب تک کہ آخری دو پیمائشیں برابر نہ ہوں۔ براہ کرم اپنی دونوں آنکھوں کی جانچ کرتے وقت دیکھنے کا فاصلہ برقرار رکھیں۔ نوٹ۔ اگر نقطہ کبھی غائب نہیں ہوتا ہے، تو اس کا مطلب ہے کہ آپ کی آنکھ صلیب پر رہنے کے بجائے نقطے کی پیروی کر رہی ہے۔ اس ٹیسٹ کے لیے ضروری ہے کہ آپ اپنی آنکھ کے کونے میں ٹمٹماتے نقطے کی نگرانی کرتے ہوئے اپنی نظر صلیب پر رکھیں۔ یہ سب سے پہلے مشکل ہے، لیکن مشق کے ساتھ آسان ہو جاتا ہے."},RC_viewingDistanceTitle:{"en-US":"Measure Viewing Distance",ar:"قياس مسافة المشاهدة",hy:"Չափել դիտման հեռավորությունը",bg:"Измерете разстоянието за гледане","zh-CN":"测量观看距离","zh-HK":"測量觀看距離",hr:"Izmjerite udaljenost gledanja",cs:"Změřte pozorovací vzdálenost",da:"Mål synsafstand",nl:"Meet de kijkafstand","en-UK":"Measure Viewing Distance",fi:"Mittaa katseluetäisyys",fr:"Mesurer la distance de visionnement",de:"Messen Sie den Betrachtungsabstand",el:"Μετρήστε την απόσταση θέασης",he:"מדידת מרחק צפייה",hi:"देखने की दूरी मापें",hu:"Mérje meg a nézési távolságot",is:"Mæla útsýnisfjarlægð",id:"Ukur Jarak Pandang",it:"Misura la distanza di visione",ja:"視聴距離の測定",kn:"ವೀಕ್ಷಣಾ ದೂರವನ್ನು ಅಳೆಯಿರಿ",ko:"시청 거리 측정",lt:"Išmatuokite žiūrėjimo atstumą",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"കാണാനുള്ള ദൂരം അളക്കുക",no:"Mål visningsavstand",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Zmierz odległość oglądania",pt:"Medir a distância de visualização",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Medir la distancia de visualización",sw:"Pima Umbali wa Kutazama",sv:"Mät betraktningsavstånd",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"Görüş Mesafesini Ölçün",ur:"دیکھنے کے فاصلے کی پیمائش کریں۔"},T_proceed:{"en-US":"Proceed",ar:"تابع",hy:"Շարունակել",bg:"Продължете","zh-CN":"继续","zh-HK":"繼續",hr:"Nastavi",cs:"Pokračovat",da:"Fortsætte",nl:"Doorgaan","en-UK":"Proceed",fi:"Edetä",fr:"Procéder",de:"Fortfahren",el:"Προχωρώ",he:"לְהִתְקַדֵם",hi:"आगे बढ़ना",hu:"Folytassa",is:"Haltu áfram",id:"Melanjutkan",it:"Procedi",ja:"進む",kn:"ಮುಂದುವರೆಯಿರಿ",ko:"진행하다",lt:"Tęskite",ms:"Di luar 111 cm, lebih sulit untuk mencapai papan ketik komputer Anda, jadi silakan gunakan keypad di smartphone Anda sebagai gantinya.",ml:"തുടരുക",no:"Fortsette",fa:"بیش از ۱۱۱ سانتیمتر، دسترسی به صفحه کلید کامپیوتر سخت‌تر می‌شود، بنابراین از صفحه کلید گوشی هوشمند خود استفاده کنید.",pl:"Przystępować",pt:"Prosseguir",ro:"După 111 cm, este mai dificil să ajungi la tastatura calculatorului, așa că nu ezita să folosești tastatura de pe smartphone-ul tău în schimb.",ru:"За пределами 111 см становится сложнее достать до клавиатуры компьютера, поэтому не стесняйтесь использовать клавиатуру на своем смартфоне вместо этого.",sr:"Preko 111 cm, teže je dosegnuti tastaturu računara, pa slobodno koristite tastaturu na svom pametnom telefonu umesto toga.",es:"Proceder",sw:"Endelea",sv:"Fortsätta",tl:"Sa higit sa 111 cm, mas mahirap na maabot ang keyboard ng iyong computer, kaya maaari kang gumamit ng keypad sa iyong smartphone sa halip.",tr:"İlerlemek",ur:"آگے بڑھیں۔"}},Ga=(e,{showIcon:t})=>({icon:t?"info":void 0,allowEscapeKey:!1,allowEnterKey:!1,allowOutsideClick:!1,showConfirmButton:!0,confirmButtonText:Wa.T_proceed[e.L],showClass:{popup:"fadeInUp",icon:""},hideClass:{popup:"fadeOutDown"},iconColor:e._CONST.COLOR.ORANGE,confirmButtonColor:"#aaa",customClass:{popup:"my__swal2__container",icon:"my__swal2__icon",title:"my__swal2__title",htmlContainer:`my__swal2__html rc-lang-${e.LD.toLowerCase()}`,confirmButton:"rc-button rc-go-button"}});let qa;"mocha"!==E._&&(qa=__webpack_require__(477).l);function Ha(e,t,n=!1,a=void 0){const i=t.control;let s=e._CONST.N.PPI_DONT_USE;e.screenPpi&&(s=e.screenPpi.value);let r=!0,o=[],l=0;const u=document.createElement("div");u.innerHTML='',e.background.appendChild(u),e._constructFloatInstructionElement("blind-spot-instruction",U.H.RC_distanceTrackingCloseL[e.L]),e._addCreditOnBackground(U.H.RC_viewingBlindSpotCredit[e.L]);const c=document.querySelector("#blind-spot-canvas"),h=c.getContext("2d"),d=document.getElementById("blind-spot-instruction");let p="left";e._setFloatInstructionElementPos(p,16);let m,f=Pa(p,c.width);const g=()=>{c.width=window.innerWidth,c.height=window.innerHeight,c.style.width=`${c.width}px`,c.style.height=`${c.height}px`,f=Pa(p,c.width),m=Ua(p,f,c.width)},y=new ResizeObserver((()=>{g()}));y.observe(e.background),g();let b=m["left"===p?0:1],v=b,k=e._CONST.COLOR.DARK_RED,w="left"===p?1:-1,A=W(null,e.keypadHandler,(()=>{C()}),!1);const x=(t=!0)=>{r=!1,i&&function(e,t){document.getElementById(e).removeEventListener("mousedown",t),document.getElementById(e).removeEventListener("touchstart",t)}("blind-spot-canvas",F),y.unobserve(e.background),e._removeBackground(),!e._trackingSetupFinishedStatus.distance&&t&&(e._trackingSetupFinishedStatus.distance=!0,e.gazeTracker.checkInitialized("distance",!1)&&e.endDistance()),(0,j.l)(O),(0,j.l)(M,"keyup")},C=async()=>{if("mocha"!==E._&&qa(),l+=1,o.push({dist:(0,_.Nh)(Ka(b,f,s),t.decimalPlace),v:w,closedEyeSide:p,crossX:f,circleX:b,ppi:s,timestamp:performance.now()}),2===Math.floor(l/t.repeatTesting))if(function(e){const t=[],n=[];for(const a of e)"left"===a.closedEyeSide?t.push(a.dist):n.push(a.dist);const a=(0,_.G8)(t),i=(0,_.G8)(n);return Math.abs(a-i)<.2*Math.min(a,i)}(o)){const i={value:(0,_.Nh)((0,_.JZ)($a(o)),t.decimalPlace),timestamp:performance.now(),method:e._CONST.VIEW_METHOD.B,raw:{...o}};let s;e.newViewingDistanceData=i,s=n?"trackDistance":"measureDistance",x(!1),A(),t.calibrateTrackDistanceCheckBool?await e._checkDistance(a,i,s,t.checkCallback,t.calibrateTrackDistanceCheckCm,t.callbackStatic):(0,_.nB)(a,i)}else{l=0;const t=o[0];z(t.v,t.closedEyeSide,t.crossX),o=[],Ba.fire({...Ga(e,{showIcon:!1}),icon:void 0,html:U.H.RC_viewingBlindSpotRejected[e.L],allowEnterKey:!0})}else l%t.repeatTesting==0?(A(),A=W(null,e.keypadHandler,(()=>{C()}),!1),"left"===p?(p="right",d.innerHTML=U.H.RC_distanceTrackingCloseR[e.L]):(p="left",d.innerHTML=U.H.RC_distanceTrackingCloseL[e.L]),e._setFloatInstructionElementPos(p,16),z(1,p,Pa(p,c.width),!1,!0)):(w=-w,D(p,m))};let S=!1,T=null;const I=t=>{S||(N(),S=!0,k=e._CONST.COLOR.RED,T=setInterval((()=>{"ArrowLeft"===t.key?(b-=10,R()):"ArrowRight"===t.key&&(b+=10,R())}),30))},N=()=>{S=!1,k=e._CONST.COLOR.DARK_RED,T&&(clearInterval(T),T=null)},R=()=>{v=(0,_.AU)(b,...m),b=v},D=(e,t)=>{const n=t["left"===e?0:1],a=Math.abs(t[1]-t[0])/4;let i=(0,_.Av)(n-a,n+a);(i-t[0])*(i-t[1])>0&&(i=2*n-i),b=i},z=(t,n,a,i=!0,s=!0)=>{w=t,p=n,f=a,m=Ua(p,f,c.width),i&&(d.innerHTML="left"===p?U.H.RC_distanceTrackingCloseL[e.L]:U.H.RC_distanceTrackingCloseR[e.L],e._setFloatInstructionElementPos(p,16)),s&&(b=m["left"===p?0:1],D(n,m))},O=(0,j.m)({Escape:t.showCancelButton?x:void 0,Enter:C," ":C,ArrowLeft:i?I:_.Md,ArrowRight:i?I:_.Md}),M=(0,j.m)({ArrowLeft:i?N:_.Md,ArrowRight:i?N:_.Md},"keyup");(0,V.F)(e.L,e.background,{go:C,cancel:t.showCancelButton?x:void 0,custom:{callback:()=>{Ba.fire({...Ga(e,{showIcon:!1}),icon:void 0,html:U.H.RC_viewingDistanceIntroLiMethod[e.L],allowEnterKey:!0})},content:U.H.RC_viewingDistanceIntroTitle[e.L]}},e.params.showCancelButton);const B={x:null,circleX:null},F=t=>{const n=!!t.touches?.[0];let a,i;if(n||t.preventDefault(),n?(a=t.touches[0].clientX,i=t.touches[0].clientY):(a=t.clientX,i=t.clientY),s=b,r=c.height/2,o=a,l=i,(0,_.ll)(s,r,o,l)>1){B.x=a,B.circleX=b;const i=document.getElementById("blind-spot-canvas");k=e._CONST.COLOR.RED,i.classList.replace("cursor-grab","cursor-grabbing");const s=e=>{let a;t.preventDefault(),e.preventDefault(),a=n?e.touches[0].clientX:e.clientX,b=B.circleX+a-B.x,b=(0,_.AU)(b,...Ua(p,f,c.width))};n?document.addEventListener("touchmove",s):document.addEventListener("mousemove",s);const r=()=>{n?(document.removeEventListener("touchend",r),document.removeEventListener("touchmove",s)):(document.removeEventListener("mouseup",r),document.removeEventListener("mousemove",s)),B.x=null,B.circleX=null,k=e._CONST.COLOR.DARK_RED,i.classList.replace("cursor-grabbing","cursor-grab")};n?document.addEventListener("touchend",r):document.addEventListener("mouseup",r)}var s,r,o,l};i&&function(e,t){document.getElementById(e).addEventListener("mousedown",t),document.getElementById(e).addEventListener("touchstart",t)}("blind-spot-canvas",F);const L=performance.now();let P=L;const G=()=>{h.clearRect(0,0,c.width,c.height),ja(h,f,c.height/2),P=performance.now(),function(e,t,n,a,i,s,r=!0){t.beginPath(),t.arc(n,a,Va>>1,0,2*Math.PI),t.closePath(),t.fillStyle=r?i%125<63?s:"#fff":s,t.fill()}(0,h,b,c.height/2,Math.round(P-L),k,t.sparkle),i||(b+=5*w,R()),r?requestAnimationFrame(G):h.clearRect(0,0,c.width,c.height)};requestAnimationFrame(G)}function Ka(e,t,n){return Math.abs(t-e)/n/(a=15,Math.tan(a*Math.PI/180))/.3937;var a}function $a(e){const t=[];for(const n of e)t.push(n.dist);return t}function Za(e,t={framerate:60,break:!1}){let n=0,a=0,i=0;const s=1e3/t.framerate,r=()=>{t.break||requestAnimationFrame(r),n=performance.now(),i=n-a,i>s&&(a=n-i%s,e())};requestAnimationFrame(r)}E.A.prototype.measureDistance=function(e={},t=void 0){if(!this.checkInitialized())return;let n;(0,_.$k)(),n=(e.control,U.H.RC_viewingDistanceIntroLiMethod[this.L]);const a=Object.assign({fullscreen:!1,repeatTesting:1,sparkle:!0,decimalPlace:1,control:!0,headline:`📏 ${U.H.RC_viewingDistanceTitle[this.L]}`,description:n,check:!1,checkCallback:!1,showCancelButton:!0},e);this.getFullscreen(a.fullscreen),this._addBackground(),this._replaceBackground((0,_.$O)(a.headline,null,!0,"")),Ha(this,a,!1,t)};var Xa=__webpack_require__(2646);const Ya=async e=>{if(navigator.permissions?.query)return navigator.permissions.query({name:"camera"}).then((async t=>{if("prompt"===t.state)return await Ba.fire({...Ga(e,{showIcon:!1}),icon:void 0,imageUrl:"data:image/png;base64,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",imageWidth:480,imageAlt:"Please allow camera access",html:`${U.H.RC_requestCamera[e.L]}
          ${U.H.RC_privacyCamera[e.L]}`})})).catch((e=>{}))},Qa={video:!1};E.A.prototype.trackDistance=async function(e={},t=void 0,n=void 0){if(!this.checkInitialized())return;let a;(0,_.$k)(),!1===this.gazeTracker.webgazer.getTracker().modelLoaded&&this.gazeTracker.webgazer.getTracker().loadModel(),a=(void 0!==e.control&&e.control,U.H.RC_viewingDistanceIntroLiMethod[this.L]);const i=Object.assign({fullscreen:!1,repeatTesting:1,sparkle:!0,pipWidthPx:this._CONST.N.VIDEO_W[this.isMobile.value?"MOBILE":"DESKTOP"],showVideo:!0,showFaceOverlay:!1,decimalPlace:1,framerate:3,desiredDistanceCm:void 0,desiredDistanceTolerance:1.2,desiredDistanceMonitor:!1,desiredDistanceMonitorCancelable:!1,desiredDistanceMonitorAllowRecalibrate:!0,nearPoint:!0,showNearPoint:!1,control:!0,headline:`📏 ${U.H.RC_distanceTrackingTitle[this.L]}`,description:U.H.RC_distanceTrackingIntroStart[this.L]+(0,Xa.G)(this.L)+a+(0,Xa.G)(this.L)+U.H.RC_distanceTrackingIntroEnd[this.L],check:!1,checkCallback:null,showCancelButton:!0,callbackStatic:t},e);try{this.viewingDistanceAllowedPreciseBool=e.viewingDistanceAllowedPreciseBool}catch(e){this.viewingDistanceAllowedPreciseBool=!1}if(this.getFullscreen(i.fullscreen),this.gazeTracker.checkInitialized("distance"))return this.gazeTracker._toFixedN=i.decimalPlace,this.showNearPoint(i.showNearPoint),this.showVideo(i.showVideo),void this.showFaceOverlay(i.showFaceOverlay);this._addBackground(),this._constructFloatInstructionElement("gaze-system-instruction",U.H.RC_starting[this.L]),await Ya(this);const s=(e,n=!0)=>{this.showVideo(Qa.video),Qa.video=!1,this.gazeTracker.checkInitialized("gaze",!1)&&this.showGazer(r),n&&(0,_.nB)(t,e),ni.current=e},r=this.gazeTracker.webgazer.params.showGazeDot,o=async()=>{this._addBackground(),this._replaceBackground((0,_.$O)(i.headline,null,!0,"")),this.gazeTracker.checkInitialized("gaze",!1)&&this.showGazer(!1),Ha(this,i,!0,s)};ti.pipWidthPx=i.pipWidthPx,ti.decimalPlace=i.decimalPlace,ti.framerate=i.framerate,ti.nearPoint=i.nearPoint,ti.showNearPoint=i.showNearPoint,ti.desiredDistanceCm=i.desiredDistanceCm,ti.desiredDistanceTolerance=i.desiredDistanceTolerance,ti.desiredDistanceMonitor=i.desiredDistanceMonitor,ti.desiredDistanceMonitorCancelable=i.desiredDistanceMonitorCancelable,ti.desiredDistanceMonitorAllowRecalibrate=i.desiredDistanceMonitorAllowRecalibrate,Qa.video=i.showVideo,this.gazeTracker._init({toFixedN:1,showVideo:!0,showFaceOverlay:i.showFaceOverlay},"distance"),this._trackingSetupFinishedStatus.distance=!1;const l={options:i,callbackStatic:t,callbackTrack:n};i.nearPoint?Ja(this,(()=>this._measurePD({},o)),n,l):Ja(this,o,n,l)},E.A.prototype.setViewingDistanceAllowedPreciseBool=function(e=!0){this.viewingDistanceAllowedPreciseBool=e};const Ja=async(e,t,n,a)=>{await e.gazeTracker.webgazer.getTracker().loadModel(),e.gazeTracker.beginVideo({pipWidthPx:ti.pipWidthPx},(()=>{e._removeFloatInstructionElement(),(0,_.nB)(t),hi(e,ti,n,a)}))},ei=(e,t)=>Math.hypot(e.x-t.x,e.y-t.y,e.z-t.z),ti={pipWidthPx:0,decimalPlace:2,framerate:3,nearPoint:!0,showNearPoint:!1,desiredDistanceCm:void 0,desiredDistanceTolerance:1.2,desiredDistanceMonitor:!1,desiredDistanceMonitorCancelable:!1,desiredDistanceMonitorAllowRecalibrate:!0},ni={current:null};let ai=null,ii=null,si=null;const ri={framerate:20,break:!0};let oi=null,li=!1,ui=0,ci=1;const hi=async(e,t,n,a)=>{(0,_.yy)(1e3).then((async()=>{let i;ui=0,ci=1;const s=await e.gazeTracker.webgazer.getTracker().model,r=e.screenPpi?e.screenPpi.value:e._CONST.N.PPI_DONT_USE;!e.screenPpi&&t.nearPoint,t.nearPoint&&t.showNearPoint&&(oi=document.createElement("div"),oi.id="rc-near-point-dot",document.body.appendChild(oi),Object.assign(oi.style,{display:"block",zIndex:999999,width:"10px",height:"10px",background:"green",position:"fixed",top:"-15px",left:"-15px"})),li=!1;const{desiredDistanceCm:o,desiredDistanceTolerance:l,desiredDistanceMonitor:u,desiredDistanceMonitorCancelable:c,desiredDistanceMonitorAllowRecalibrate:h}=t;e._distanceTrackNudging.distanceCorrectEnabled=!0,e._distanceTrackNudging.distanceDesired=o,e._distanceTrackNudging.distanceAllowedRatio=l,si=async()=>{ii||(ii=document.getElementById("webgazerVideoCanvas"));const l=performance.now();if(i=await s.estimateFaces(ii),i.length){e._trackingVideoFrameTimestamps.distance+=l;const s=i[0].keypoints;if(5===ci){if(ui+=ei(s[133],s[362]),ui/=5,e._trackingVideoFrameTimestamps.distance/=5,null!==ni.current){if(!ai){const t=pi(r),n=Math.sqrt(ni.current.value**2-t**2);ni.current.value=n,ai=ui*ni.current.value,!0!==a.options.calibrateTrackDistanceCheckBool&&e._removeBackground(),e._trackingSetupFinishedStatus.distance=!0,li=!0}const i=performance.now(),l=Math.round(i-e._trackingVideoFrameTimestamps.distance),d={value:(0,_.Nh)(ai/ui,t.decimalPlace),timestamp:i,method:e._CONST.VIEW_METHOD.F,latencyMs:l};let p;e.newViewingDistanceData=d,(li||u)&&(o&&e.nudgeDistance(c,h,a),li=!1),t.nearPoint&&(p=di(e,t,ii,s,ui,i,r,l)),n&&"function"==typeof n&&(e.gazeTracker.defaultDistanceTrackCallback=n,n({value:{viewingDistanceCm:d.value,nearPointCm:p?p.value:[null,null],latencyMs:l},timestamp:i,method:e._CONST.VIEW_METHOD.F}))}ui=0,ci=1,e._trackingVideoFrameTimestamps.distance=0}else ui+=ei(s[133],s[362]),++ci}},ri.break=!1,ri.framerate=5*t.framerate,Za(si,ri)}))},di=(e,t,n,a,i,s,r,o)=>{const l=((e,t,n)=>[(-t.x-n.x+e.videoWidth)/2,(-t.y-n.y+e.videoHeight)/2])(n,a[133],a[362]);l.forEach(((t,n)=>{l[n]=(e.PDCm?e.PDCm.value:e._CONST.N.PD_DONT_USE)*t/i}));const u={value:{x:(0,_.Nh)(l[0],t.decimalPlace),y:(0,_.Nh)(l[1]+screen.height/2*2.54/r,t.decimalPlace),latencyMs:o},timestamp:s};e.newNearPointData=u;if(t.showNearPoint){const e=u.value.x*r/2.54,t=u.value.y*r/2.54;Object.assign(oi.style,{left:screen.width/2-window.screenLeft+e-5+"px",top:screen.height/2-window.screenTop-(window.outerHeight-window.innerHeight)-t-5+"px"})}return u};E.A.prototype.pauseDistance=function(){return this.gazeTracker.checkInitialized("distance",!0)&&!this._trackingPaused.distance?(ri.break=!0,oi&&(oi.style.display="none"),this._trackingVideoFrameTimestamps.distance=0,this._trackingPaused.distance=!0,this.pauseNudger(),this):null},E.A.prototype.resumeDistance=function(){return this.gazeTracker.checkInitialized("distance",!0)&&this._trackingPaused.distance?(ri.break=!1,oi&&(oi.style.display="block"),ui=0,ci=1,this._trackingVideoFrameTimestamps.distance=0,Za(si,ri),this._trackingPaused.distance=!1,this.resumeNudger(),this):null},E.A.prototype.endDistance=function(e=!1,t=!0){return this.gazeTracker.checkInitialized("distance",!0)?(ri.break=!0,ri.framerate=20,ti.pipWidthPx=0,ti.decimalPlace=2,ti.framerate=3,ti.nearPoint=!0,ti.showNearPoint=!1,ti.desiredDistanceCm=void 0,ti.desiredDistanceTolerance=1.2,ti.desiredDistanceMonitor=!1,ti.desiredDistanceMonitorCancelable=!1,ti.desiredDistanceMonitorAllowRecalibrate=!0,ni.current=null,ai=null,ii=null,si=null,li=!1,this._trackingVideoFrameTimestamps.distance=0,this._trackingPaused.distance=!1,oi&&(document.body.removeChild(oi),oi=null),this.endNudger(),t&&this.gazeTracker.end("distance",e),this):null},E.A.prototype.getDistanceNow=async function(e=null){if(!this.checkInitialized()||!this.gazeTracker.checkInitialized("distance",!0)||!ri.break)return;const t=e||this.gazeTracker.defaultDistanceTrackCallback,n=document.querySelector("#webgazerVideoFeed"),a=await this.gazeTracker.webgazer.getTracker().model,i=performance.now(),s=await a.estimateFaces(n);if(s.length){const e=s[0].scaledMesh,a=ei(e[133],e[362]),r=performance.now(),o=r-i;this.newViewingDistanceData={value:(0,_.Nh)(ai/a,ti.decimalPlace),timestamp:r,method:this._CONST.VIEW_METHOD.F,latencyMs:o};const l=this.newViewingDistanceData;let u;return ti.nearPoint&&(u=di(this,ti,n,e,a,r,this.screenPpi?this.screenPpi.value:this._CONST.N.PPI_DONT_USE,o)),(0,_.nB)(t,{value:{viewingDistanceCm:l.value,nearPointCm:u?u.value:null,latencyMs:o},timestamp:r,method:this._CONST.VIEW_METHOD.F}),l}return null},E.A.prototype.showNearPoint=function(e=!0){if(this.gazeTracker.checkInitialized("distance",!1)){const t=document.querySelector("#rc-near-point-dot");t&&(t.display=e?"block":"none")}};const pi=e=>2.54*(window.screen.height/2/e);E.A.prototype.nudgeDistance=function(e,t,n){if(this.checkInitialized()&&this._distanceTrackNudging.distanceDesired){if(this.viewingDistanceCm&&this.viewingDistanceCm.method===this._CONST.VIEW_METHOD.F){if(!mi(this.viewingDistanceCm.value,this._distanceTrackNudging.distanceDesired,this._distanceTrackNudging.distanceAllowedRatio)){const a=()=>{this._removeNudger(),clearInterval(this._distanceTrackNudging.distanceCorrecting),this._distanceTrackNudging.distanceCorrecting=null,(0,j.l)(s)},i=async()=>{this.endDistance(),this._addBackground(),await(0,_.yy)(2e3),this.trackDistance(n.options,n.callbackStatic,n.callbackTrack)},s=(0,j.m)(e?{Escape:this.endNudger}:{});if(null===this._distanceTrackNudging.distanceCorrecting&&this._distanceTrackNudging.distanceCorrectEnabled){const[n,r,o,l]=fi(this);let u=e?{cancel:()=>{this.endNudger()}}:{};t&&(u={...u,custom:{callback:i,content:U.H.RC_distanceTrackingRedo[this.L]}}),(e||t)&&(0,V.F)(this.L,this.nudger,u,this.params.showCancelButton);const c=()=>{n.innerHTML=gi(this,this.viewingDistanceCm.value,this._distanceTrackNudging.distanceDesired),r.innerHTML=this.viewingDistanceAllowedPreciseBool?this.viewingDistanceCm.value.toFixed(1):Math.round(this.viewingDistanceCm.value),o.innerHTML=Math.round(this._distanceTrackNudging.distanceDesired),this._distanceTrackNudging.needEasyEyesKeypadBeyondCm&&this._distanceTrackNudging.distanceDesired>this._distanceTrackNudging.needEasyEyesKeypadBeyondCm?l.innerHTML=` ${U.H.RC_canUsePhoneKeypad[this.L]}`:l.innerHTML=""};c(),this._distanceTrackNudging.distanceCorrecting=setInterval((()=>{c(),mi(this.viewingDistanceCm.value,this._distanceTrackNudging.distanceDesired,this._distanceTrackNudging.distanceAllowedRatio)&&(a(),(0,j.l)(s))}),200)}else this._distanceTrackNudging.distanceCorrecting&&!this._distanceTrackNudging.distanceCorrectEnabled&&a();return!1}return!0}return!1}};const mi=(e,t,n)=>{if(!yi(n))return!1;const a=t*n,i=t/n;return e<=Math.max(a,i)&&e>=Math.min(a,i)},fi=e=>(e._addNudger(`
          \n

          \n

          ${U.H.RC_distanceTrackingGuide[e.L].replace("xx1",'').replace("xx2",'')}

          \n
          \n `),[document.querySelector("#rc-distance-correct-instruction"),document.querySelector("#rc-distance-now"),document.querySelector("#rc-distance-desired"),document.querySelector("#rc-can-use-keypad")]),gi=(e,t,n)=>t>=n?U.H.RC_distanceTrackingMoveCloser[e.L]:U.H.RC_distanceTrackingMoveFurther[e.L],yi=e=>!Number.isNaN(e)&&(e>0&&1!==e);E.A.prototype.setDistanceDesired=function(e,t=null,n=null){return this._distanceTrackNudging.distanceDesired=e,n&&(this._distanceTrackNudging.needEasyEyesKeypadBeyondCm=n),t&&yi(t)&&(this._distanceTrackNudging.distanceAllowedRatio=t),e},E.A.prototype._addNudger=function(e){if(null!==this.nudger)return;let t=document.getElementById("calibration-nudger");return t||(t=document.createElement("div"),t.id="calibration-nudger",t.className=`calibration-nudger rc-lang-${this.LD.toLowerCase()}`,document.body.classList.add("lock-view"),document.body.appendChild(t),t.style.background=this.params.backgroundColor),e&&(t.innerHTML=e),this._nudger.element=t,this.nudger},E.A.prototype._removeNudger=function(){const e=document.getElementById("calibration-nudger");return!!e&&(document.body.classList.remove("lock-view"),document.body.removeChild(e),this._nudger={element:null},!0)},E.A.prototype.pauseNudger=function(){document.body.classList.add("hide-nudger")},E.A.prototype.resumeNudger=function(){document.body.classList.remove("hide-nudger")},E.A.prototype.endNudger=function(){return!!this._distanceTrackNudging.distanceCorrectEnabled&&(this._removeNudger(),this._distanceTrackNudging.distanceCorrectEnabled=!1,this._distanceTrackNudging.distanceCorrecting&&clearInterval(this._distanceTrackNudging.distanceCorrecting),this._distanceTrackNudging.distanceCorrecting=null,this._distanceTrackNudging.distanceDesired=null,this._distanceAllowedRatio=null,!0)};function bi(e,t,n,a,i){const s=setInterval((()=>{const r=document.getElementById("webgazerVideoContainer");r&&(clearInterval(s),r.style.height=t/Number.parseInt(r.style.width)*Number.parseInt(r.style.height)+"px",r.style.width=`${t}px`,r.style.opacity=n,a.setVideoViewerSize(Number.parseInt(r.style.width),Number.parseInt(r.style.height)),vi(e,r),setTimeout((()=>{e.videoOpacity(),e.isMobile.value?r.style.transition="right 0.5s, top 0.5s, width 0.5s, height 0.5s, border-radius 0.5s":r.style.transition="left 0.5s, bottom 0.5s, width 0.5s, height 0.5s, border-radius 0.5s",(0,_.nB)(i)}),700))}),100)}function vi(e,t){e.isMobile.value?(t.style.left="unset",t.style.right=e._CONST.N.VIDEO_MARGIN,t.style.top=e._CONST.N.VIDEO_MARGIN,t.style.bottom="unset"):(t.style.left=e._CONST.N.VIDEO_MARGIN,t.style.right="unset",t.style.top="unset",t.style.bottom=e._CONST.N.VIDEO_MARGIN_BOTTOM)}const ki={video:!1,videoWidth:0,videoHeight:0,opacity:1,gaze:!1,faceOverlay:!1},wi=.9;E.A.prototype._measurePD=async function(e={},t=void 0){if(!this.checkInitialized())return;(0,_.$k)();const n=Object.assign({fullscreen:!1,headline:`👁️ ${U.H.RC_nearPointTitle[this.L]}`,description:U.H.RC_nearPointIntro[this.L],shortDescription:U.H.RC_nearPointIntro[this.L]},e);this.getFullscreen(n.fullscreen),await(0,_.yy)(1e3),this._replaceBackground(),this._replaceBackground((0,_.$O)(n.headline,n.shortDescription,!0));const a=this.screenPpi?this.screenPpi.value:this._CONST.N.PPI_DONT_USE,[i,s]=Ai(this),[r,o]=Si(this,a,i,s),l=(e=!0)=>{r.removeEventListener("mousedown",o),this._removeBackground(),this.showVideo(ki.video),this.showGazer(ki.gaze),this.showFaceOverlay(ki.faceOverlay),this.gazeTracker.webgazer.showFaceFeedbackBox(!0),Object.assign(document.querySelector("#webgazerVideoContainer").style,{height:ki.videoHeight,width:ki.videoWidth,opacity:ki.opacity,borderRadius:"5px"}),vi(this,document.querySelector("#webgazerVideoContainer")),Object.assign(document.querySelector("#webgazerVideoFeed").style,{height:ki.videoHeight,width:ki.videoWidth,top:"unset",transform:"scale(-1, 1)",transformOrigin:"unset"}),ki.video=!1,ki.videoWidth=0,ki.videoHeight=0,ki.opacity=1,ki.gaze=!1,ki.faceOverlay=!1,!this._trackingSetupFinishedStatus.distance&&e&&(this._trackingSetupFinishedStatus.distance=!0,this.endDistance()),(0,j.l)(c)},u=()=>{if(-100!==Ci){const e={value:2.54*Ci/a,timestamp:performance.now()};return this.newPDData=e,l(!1),(0,_.nB)(t,e)}},c=(0,j.m)({Escape:l,Enter:u," ":u});(0,V.F)(this.L,this.background,{go:u,cancel:l},this.params.showCancelButton),setTimeout((()=>{Ba.fire({...Ga(this,{showIcon:!1}),icon:void 0,imageUrl:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAADwCAIAAABXFyDtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGx2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuZGFiYWNiYiwgMjAyMS8wNC8xNC0wMDozOTo0NCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHhtcDpDcmVhdGVEYXRlPSIyMDIxLTA3LTI0VDExOjU3OjU0LTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMS0wOC0yNFQyMjoyNDo1MC0wNDowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMS0wOC0yNFQyMjoyNDo1MC0wNDowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpiMTIzYjE3ZS0wMzUzLTQ4YWEtOGJkYy0zNTk0YmRkODBjMjEiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4MjdjNGM2Yi1jMzExLTE3NGQtYTgxZC0zZGUyN2JmMTgxYjAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNWZiNzMxNi1hNDFiLTQyZTYtYmJiNy0yYTY2ODgxMzI1YTAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjA1ZmI3MzE2LWE0MWItNDJlNi1iYmI3LTJhNjY4ODEzMjVhMCIgc3RFdnQ6d2hlbj0iMjAyMS0wNy0yNFQxMTo1Nzo1NC0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQ3MjQ3ZjY2LTllZjItNDgzNy1hMGYzLWFmNzdmZDBjNDUxMyIgc3RFdnQ6d2hlbj0iMjAyMS0wNy0yNFQxMjozNTo1My0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmIxMjNiMTdlLTAzNTMtNDhhYS04YmRjLTM1OTRiZGQ4MGMyMSIgc3RFdnQ6d2hlbj0iMjAyMS0wOC0yNFQyMjoyNDo1MC0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjQgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+e9Ws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",imageWidth:480,imageAlt:"Measurement Instruction",html:n.description})}),700)};const Ai=e=>{const t=document.querySelector("#webgazerVideoFeed");if(t)return xi(e,t,document.querySelector("#webgazerVideoCanvas"),document.querySelector("#webgazerVideoContainer"))},xi=(e,t,n,a,i=null)=>{const s=.3*window.innerWidth/Number.parseInt(t.style.width)*Number.parseInt(t.style.height);ki.videoWidth=a.style.width,ki.videoHeight=a.style.height,ki.opacity=a.style.opacity;const r={height:`${Math.round(s)}px`,width:`${Math.round(window.innerWidth*wi)}px`,opacity:1,borderRadius:"15px"};Object.assign(a.style,r),e.isMobile.value?Object.assign(a.style,{right:`${Math.round(.5*window.innerWidth*.09999999999999998)}px`,top:`${Math.round(.5*(window.innerHeight-s))}px`}):Object.assign(a.style,{left:`${Math.round(.5*window.innerWidth*.09999999999999998)}px`,bottom:`${Math.round(.5*(window.innerHeight-s))}px`});const o={height:`${Math.round(s*wi/.3)}px`,width:`${Math.round(window.innerWidth*wi)}px`,top:`${Math.round(.6000000000000001*-s)}px`,transform:"scale(-2, 2)",transformOrigin:"center"};return Object.assign(t.style,o),ki.video=e.gazeTracker.webgazer.params.showVideo,ki.gaze=e.gazeTracker.webgazer.params.showGazeDot,ki.faceOverlay=e.gazeTracker.webgazer.params.showFaceOverlay,ki.video||e.showVideo(!0),ki.gaze&&e.showGazer(!1),ki.faceOverlay&&e.showFaceOverlay(!1),e.gazeTracker.webgazer.showFaceFeedbackBox(!1),[window.innerWidth*wi,s]};let Ci=-100;const Si=(e,t,n,a)=>{const i=document.createElement("div");i.id="rc-ruler",Object.assign(i.style,{height:.9*(window.innerHeight-a)/2+"px",width:2*window.innerWidth+"px",left:.25*(window.innerWidth-n)+"px",bottom:0,backgroundColor:"#FFD523dd",borderRadius:"7px 0 0 0",boxSizing:"border-box",borderBottom:"5px solid #bb6600"}),e.background.appendChild(i);const s=document.createElement("div");s.id="rc-ruler-scales",i.appendChild(s);const r=2.54*(i.clientWidth-60)/t;for(let n=0;n<=10*(0,_.Nh)(r,1);n++){const a=document.createElement("div"),i=.1*n*t/2.54+"px";if(a.className="rc-ruler-scale "+(n%10==0?"rc-ruler-major":n%5==0?"rc-ruler-secondary":"rc-ruler-minor"),a.style.left=i,s.appendChild(a),n%10==0){const t=document.createElement("p");t.className="rc-ruler-scale-text",t.style.left=i,t.innerHTML=n/10,s.appendChild(t),0===n&&(t.style.color=e._CONST.COLOR.DARK_RED)}}let o=document.createElement("div");s.appendChild(o),o.outerHTML=z(),o=document.querySelector("#size-arrow"),o.setAttribute("preserveAspectRatio","none"),o.style.left="-100px",o.style.top="40px",document.getElementById("size-arrow-fill").setAttribute("fill",e._CONST.COLOR.DARK_RED);const l=e=>{Ci=e.offsetX-30,o.style.left=`${Ci}px`;const t=e=>{Ci=e.offsetX-30,o.style.left=`${Ci}px`};i.addEventListener("mousemove",t),i.addEventListener("mouseup",(function e(){i.removeEventListener("mousemove",t),i.removeEventListener("mouseup",e)}))};return i.addEventListener("mousedown",l),[i,l]};function Ei(e){return Ei="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ei(e)}var _i=/^\s+/,Ti=/\s+$/;function Ii(e,t){if(t=t||{},(e=e||"")instanceof Ii)return e;if(!(this instanceof Ii))return new Ii(e,t);var n=function(e){var t={r:0,g:0,b:0},n=1,a=null,i=null,s=null,r=!1,o=!1;"string"==typeof e&&(e=function(e){e=e.replace(_i,"").replace(Ti,"").toLowerCase();var t,n=!1;if(Hi[e])e=Hi[e],n=!0;else if("transparent"==e)return{r:0,g:0,b:0,a:0,format:"name"};if(t=ss.rgb.exec(e))return{r:t[1],g:t[2],b:t[3]};if(t=ss.rgba.exec(e))return{r:t[1],g:t[2],b:t[3],a:t[4]};if(t=ss.hsl.exec(e))return{h:t[1],s:t[2],l:t[3]};if(t=ss.hsla.exec(e))return{h:t[1],s:t[2],l:t[3],a:t[4]};if(t=ss.hsv.exec(e))return{h:t[1],s:t[2],v:t[3]};if(t=ss.hsva.exec(e))return{h:t[1],s:t[2],v:t[3],a:t[4]};if(t=ss.hex8.exec(e))return{r:Yi(t[1]),g:Yi(t[2]),b:Yi(t[3]),a:ts(t[4]),format:n?"name":"hex8"};if(t=ss.hex6.exec(e))return{r:Yi(t[1]),g:Yi(t[2]),b:Yi(t[3]),format:n?"name":"hex"};if(t=ss.hex4.exec(e))return{r:Yi(t[1]+""+t[1]),g:Yi(t[2]+""+t[2]),b:Yi(t[3]+""+t[3]),a:ts(t[4]+""+t[4]),format:n?"name":"hex8"};if(t=ss.hex3.exec(e))return{r:Yi(t[1]+""+t[1]),g:Yi(t[2]+""+t[2]),b:Yi(t[3]+""+t[3]),format:n?"name":"hex"};return!1}(e));"object"==Ei(e)&&(rs(e.r)&&rs(e.g)&&rs(e.b)?(l=e.r,u=e.g,c=e.b,t={r:255*Zi(l,255),g:255*Zi(u,255),b:255*Zi(c,255)},r=!0,o="%"===String(e.r).substr(-1)?"prgb":"rgb"):rs(e.h)&&rs(e.s)&&rs(e.v)?(a=Ji(e.s),i=Ji(e.v),t=function(e,t,n){e=6*Zi(e,360),t=Zi(t,100),n=Zi(n,100);var a=Math.floor(e),i=e-a,s=n*(1-t),r=n*(1-i*t),o=n*(1-(1-i)*t),l=a%6,u=[n,r,s,s,o,n][l],c=[o,n,n,r,s,s][l],h=[s,s,o,n,n,r][l];return{r:255*u,g:255*c,b:255*h}}(e.h,a,i),r=!0,o="hsv"):rs(e.h)&&rs(e.s)&&rs(e.l)&&(a=Ji(e.s),s=Ji(e.l),t=function(e,t,n){var a,i,s;function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}if(e=Zi(e,360),t=Zi(t,100),n=Zi(n,100),0===t)a=i=s=n;else{var o=n<.5?n*(1+t):n+t-n*t,l=2*n-o;a=r(l,o,e+1/3),i=r(l,o,e),s=r(l,o,e-1/3)}return{r:255*a,g:255*i,b:255*s}}(e.h,a,s),r=!0,o="hsl"),e.hasOwnProperty("a")&&(n=e.a));var l,u,c;return n=$i(n),{ok:r,format:e.format||o,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}(e);this._originalInput=e,this._r=n.r,this._g=n.g,this._b=n.b,this._a=n.a,this._roundA=Math.round(100*this._a)/100,this._format=t.format||n.format,this._gradientType=t.gradientType,this._r<1&&(this._r=Math.round(this._r)),this._g<1&&(this._g=Math.round(this._g)),this._b<1&&(this._b=Math.round(this._b)),this._ok=n.ok}function Ni(e,t,n){e=Zi(e,255),t=Zi(t,255),n=Zi(n,255);var a,i,s=Math.max(e,t,n),r=Math.min(e,t,n),o=(s+r)/2;if(s==r)a=i=0;else{var l=s-r;switch(i=o>.5?l/(2-s-r):l/(s+r),s){case e:a=(t-n)/l+(t>1)+720)%360;--t;)a.h=(a.h+i)%360,s.push(Ii(a));return s}function qi(e,t){t=t||6;for(var n=Ii(e).toHsv(),a=n.h,i=n.s,s=n.v,r=[],o=1/t;t--;)r.push(Ii({h:a,s:i,v:s})),s=(s+o)%1;return r}Ii.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var e,t,n,a=this.toRgb();return e=a.r/255,t=a.g/255,n=a.b/255,.2126*(e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))},setAlpha:function(e){return this._a=$i(e),this._roundA=Math.round(100*this._a)/100,this},toHsv:function(){var e=Ri(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=Ri(this._r,this._g,this._b),t=Math.round(360*e.h),n=Math.round(100*e.s),a=Math.round(100*e.v);return 1==this._a?"hsv("+t+", "+n+"%, "+a+"%)":"hsva("+t+", "+n+"%, "+a+"%, "+this._roundA+")"},toHsl:function(){var e=Ni(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=Ni(this._r,this._g,this._b),t=Math.round(360*e.h),n=Math.round(100*e.s),a=Math.round(100*e.l);return 1==this._a?"hsl("+t+", "+n+"%, "+a+"%)":"hsla("+t+", "+n+"%, "+a+"%, "+this._roundA+")"},toHex:function(e){return Di(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return function(e,t,n,a,i){var s=[Qi(Math.round(e).toString(16)),Qi(Math.round(t).toString(16)),Qi(Math.round(n).toString(16)),Qi(es(a))];if(i&&s[0].charAt(0)==s[0].charAt(1)&&s[1].charAt(0)==s[1].charAt(1)&&s[2].charAt(0)==s[2].charAt(1)&&s[3].charAt(0)==s[3].charAt(1))return s[0].charAt(0)+s[1].charAt(0)+s[2].charAt(0)+s[3].charAt(0);return s.join("")}(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:Math.round(this._r),g:Math.round(this._g),b:Math.round(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+")":"rgba("+Math.round(this._r)+", "+Math.round(this._g)+", "+Math.round(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:Math.round(100*Zi(this._r,255))+"%",g:Math.round(100*Zi(this._g,255))+"%",b:Math.round(100*Zi(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+Math.round(100*Zi(this._r,255))+"%, "+Math.round(100*Zi(this._g,255))+"%, "+Math.round(100*Zi(this._b,255))+"%)":"rgba("+Math.round(100*Zi(this._r,255))+"%, "+Math.round(100*Zi(this._g,255))+"%, "+Math.round(100*Zi(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(Ki[Di(this._r,this._g,this._b,!0)]||!1)},toFilter:function(e){var t="#"+zi(this._r,this._g,this._b,this._a),n=t,a=this._gradientType?"GradientType = 1, ":"";if(e){var i=Ii(e);n="#"+zi(i._r,i._g,i._b,i._a)}return"progid:DXImageTransform.Microsoft.gradient("+a+"startColorstr="+t+",endColorstr="+n+")"},toString:function(e){var t=!!e;e=e||this._format;var n=!1,a=this._a<1&&this._a>=0;return t||!a||"hex"!==e&&"hex6"!==e&&"hex3"!==e&&"hex4"!==e&&"hex8"!==e&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this._a?this.toName():this.toRgbString()},clone:function(){return Ii(this.toString())},_applyModification:function(e,t){var n=e.apply(null,[this].concat([].slice.call(t)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(Fi,arguments)},brighten:function(){return this._applyModification(Li,arguments)},darken:function(){return this._applyModification(Pi,arguments)},desaturate:function(){return this._applyModification(Oi,arguments)},saturate:function(){return this._applyModification(Mi,arguments)},greyscale:function(){return this._applyModification(Bi,arguments)},spin:function(){return this._applyModification(ji,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(Gi,arguments)},complement:function(){return this._applyCombination(Vi,arguments)},monochromatic:function(){return this._applyCombination(qi,arguments)},splitcomplement:function(){return this._applyCombination(Wi,arguments)},triad:function(){return this._applyCombination(Ui,[3])},tetrad:function(){return this._applyCombination(Ui,[4])}},Ii.fromRatio=function(e,t){if("object"==Ei(e)){var n={};for(var a in e)e.hasOwnProperty(a)&&(n[a]="a"===a?e[a]:Ji(e[a]));e=n}return Ii(e,t)},Ii.equals=function(e,t){return!(!e||!t)&&Ii(e).toRgbString()==Ii(t).toRgbString()},Ii.random=function(){return Ii.fromRatio({r:Math.random(),g:Math.random(),b:Math.random()})},Ii.mix=function(e,t,n){n=0===n?0:n||50;var a=Ii(e).toRgb(),i=Ii(t).toRgb(),s=n/100;return Ii({r:(i.r-a.r)*s+a.r,g:(i.g-a.g)*s+a.g,b:(i.b-a.b)*s+a.b,a:(i.a-a.a)*s+a.a})},Ii.readability=function(e,t){var n=Ii(e),a=Ii(t);return(Math.max(n.getLuminance(),a.getLuminance())+.05)/(Math.min(n.getLuminance(),a.getLuminance())+.05)},Ii.isReadable=function(e,t,n){var a,i,s=Ii.readability(e,t);switch(i=!1,(a=function(e){var t,n;t=((e=e||{level:"AA",size:"small"}).level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),"AA"!==t&&"AAA"!==t&&(t="AA");"small"!==n&&"large"!==n&&(n="small");return{level:t,size:n}}(n)).level+a.size){case"AAsmall":case"AAAlarge":i=s>=4.5;break;case"AAlarge":i=s>=3;break;case"AAAsmall":i=s>=7}return i},Ii.mostReadable=function(e,t,n){var a,i,s,r,o=null,l=0;i=(n=n||{}).includeFallbackColors,s=n.level,r=n.size;for(var u=0;ul&&(l=a,o=Ii(t[u]));return Ii.isReadable(e,o,{level:s,size:r})||!i?o:(n.includeFallbackColors=!1,Ii.mostReadable(e,["#fff","#000"],n))};var Hi=Ii.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},Ki=Ii.hexNames=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}(Hi);function $i(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function Zi(e,t){(function(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)})(e)&&(e="100%");var n=function(e){return"string"==typeof e&&-1!=e.indexOf("%")}(e);return e=Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(e*t,10)/100),Math.abs(e-t)<1e-6?1:e%t/parseFloat(t)}function Xi(e){return Math.min(1,Math.max(0,e))}function Yi(e){return parseInt(e,16)}function Qi(e){return 1==e.length?"0"+e:""+e}function Ji(e){return e<=1&&(e=100*e+"%"),e}function es(e){return Math.round(255*parseFloat(e)).toString(16)}function ts(e){return Yi(e)/255}var ns,as,is,ss=(as="[\\s|\\(]+("+(ns="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+ns+")[,|\\s]+("+ns+")\\s*\\)?",is="[\\s|\\(]+("+ns+")[,|\\s]+("+ns+")[,|\\s]+("+ns+")[,|\\s]+("+ns+")\\s*\\)?",{CSS_UNIT:new RegExp(ns),rgb:new RegExp("rgb"+as),rgba:new RegExp("rgba"+is),hsl:new RegExp("hsl"+as),hsla:new RegExp("hsla"+is),hsv:new RegExp("hsv"+as),hsva:new RegExp("hsva"+is),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function rs(e){return!!ss.CSS_UNIT.exec(e)}var os=__webpack_require__(782);const ls=e=>e/2.54,us={video:!1,gazer:!1};function cs(e,t){e.background?e._replaceBackground((0,_.$O)(t.headline,t.description)):e._addBackground((0,_.$O)(t.headline,t.description)),e._constructFloatInstructionElement("gaze-system-instruction",U.H.RC_starting[e.L])}E.A.prototype.calibrateGaze=function(e={},t=void 0){if(!this.gazeTracker.checkInitialized("gaze",!0))return;(0,_.$k)();const n=Object.assign({greedyLearner:!1,calibrationCount:1,headline:`👀 ${U.H.RC_gazeTrackingTitle[this.L]}`,description:U.H.RC_gazeTrackingIntro[this.L]},e);n.nudge=!1,us.video=this.gazeTracker.webgazer.params.showVideo,us.gazer=this.gazeTracker.webgazer.params.showGazeDot,us.video||this.showVideo(!0),us.gazer||this.showGazer(!0),this.gazeTracker.webgazer.params.greedyLearner=n.greedyLearner,cs(this,n);const a=hs(this,n,(()=>{this._removeBackground(),(0,j.l)(i),(0,_.nB)(t,{timestamp:performance.now()})})),i=(0,j.m)({Escape:()=>{a.deleteSelf(!1),this._removeBackground(),this.showVideo(us.video),this.showGazer(us.gazer),us.video=!1,us.gazer=!1,this._trackingSetupFinishedStatus.gaze||(this._trackingSetupFinishedStatus.gaze=!0,this.endGaze()),(0,j.l)(i)}})};const hs=(e,t,n)=>(e._removeFloatInstructionElement(),new ds(e,document.body,t,us,n));class ds{constructor(e,t,n,a,i){this._sequentialOrder(n.nudge),this.nudge=n.nudge,this.RC=e,this.clickThresholdBase=os.Y?1:n.calibrationCount,this.clicks=0,this.position=this.order.shift(),this.clickThreshold=this.clickThresholdBase,this.r=this.RC._CONST.N.GAZE_CALIBRATION.R,this.div=document.createElement("div");const s=document.createElement("div"),r=document.createElement("div");this.div.className="rc-crosshair",this.div.id="rc-crosshair",s.className="rc-crosshair-component rc-crosshair-vertical",r.className="rc-crosshair-component rc-crosshair-horizontal",r.style.height=s.style.width=`${La}px`,r.style.width=s.style.height=`${Fa}px`,this.div.style.background=e.params.backgroundColor;const o=Ii(e.params.backgroundColor).toRgb();this.div.style.background=`rgba(${o.r}, ${o.g}, ${o.b}, 0.75)`,this.div.appendChild(s),this.div.appendChild(r),this.parent=t,this.parent.appendChild(this.div),this.placeDot(),this.handleClick=this.takeClick.bind(this),this.div.addEventListener("click",this.handleClick,!1),this.originalStyles=a,this.endCalibrationCallback=i}placeDot(){Object.assign(this.div.style,[{left:`${this.RC._CONST.N.GAZE_CALIBRATION.MARGIN}px`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px)`,right:"unset"},{left:window.innerWidth-this.RC._CONST.N.GAZE_CALIBRATION.R-this.RC._CONST.N.GAZE_CALIBRATION.MARGIN+"px",right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerWidth)}px)`,right:"unset"},{left:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerWidth)}px)`,right:"unset"}][this.position[0]],[{top:`${this.RC._CONST.N.GAZE_CALIBRATION.MARGIN}px`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px)`,bottom:"unset"},{top:window.innerHeight-this.RC._CONST.N.GAZE_CALIBRATION.R-this.RC._CONST.N.GAZE_CALIBRATION.MARGIN+"px",bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.CENTER_EXTRA_CHECK_OFFSET)}px)`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px - ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerHeight)}px)`,bottom:"unset"},{top:`calc(50% - ${this.RC._CONST.N.GAZE_CALIBRATION.R/2}px + ${this.getOffsetPx(this.RC._CONST.N.GAZE_CALIBRATION.MID_EXTRA_CHECK_OFFSET,.3*window.innerHeight)}px)`,bottom:"unset"}][this.position[1]])}takeClick(e){if(this.clickAtCenter(e)){this.clicks++,this.clicks>=this.clickThreshold&&(this.order.length?(this.position=this.order.shift(),this.clickThreshold=this.clickThresholdBase,this.placeDot(),this.clicks=0):this.deleteSelf(!0));const e=document.querySelectorAll(".leader-line");e&&e.map((e=>{e.style.opacity=0}))}}deleteSelf(e=!0){this.div.removeEventListener("click",this.handleClick,!1),this.parent.removeChild(this.div),e&&(this.nudge||this.RC.showVideo(this.originalStyles.video),this.nudge||(this.originalStyles.video=!1),this.RC.showGazer(this.originalStyles.gazer),this.originalStyles.gazer=!1,(0,_.nB)(this.endCalibrationCallback),this.nudge||(this.RC._trackingSetupFinishedStatus.gaze=!0))}clickAtCenter(e){const{x:t,y:n}=(0,_.KY)(e),{left:a,top:i,right:s,bottom:r}=this.div.getBoundingClientRect(),o=(a+s)/2,l=(i+r)/2;return t>=o-5&&t<=o+5&&n>=l-5&&n<=l+5}_randomOrder(){this.order=[];for(const e of[0,1,2])for(const t of[0,1,2])this.order.push([e,t]);(0,_.k4)(this.order)}_sequentialOrder(e=!1){this.order=e?[[1,1],[1,3],[4,1],[1,4],[3,1],[1,1],[1,4],[4,1],[1,3],[3,1],[1,1]]:os.Y?[[0,0],[2,0],[2,2],[0,2],[1,1]]:[[1,1],[1,0],[2,0],[2,1],[2,2],[1,2],[0,2],[0,1],[0,0],[1,1],[1,2],[2,2],[2,1],[2,0],[1,0],[0,0],[0,1],[0,2],[1,1],[1,5],[6,5],[6,1],[6,6],[1,6],[5,6],[5,1],[5,5],[1,1],[1,6],[6,6],[6,1],[6,5],[1,5],[5,5],[5,1],[5,6],[1,1],[1,4],[4,1],[1,3],[3,1],[1,1],[1,3],[4,1],[1,4],[3,1],[1,1]]}getOffsetPx(e,t=null){const n=(a=e,i=this.RC.screenPpi?this.RC.screenPpi.value:this.RC._CONST.N.PPI_DONT_USE,s=this.RC.viewingDistanceCm?this.RC.viewingDistanceCm.value:this.RC._CONST.N.VIEW_DIST_DONT_USE,ls(i)*s*Math.tan(a*(Math.PI/180)));var a,i,s;return t?Math.min(n,t):n}}E.A.prototype.trackGaze=async function(e={},t=null,n=null){if(!this.checkInitialized())return;(0,_.$k)(),!1===this.gazeTracker.webgazer.getTracker().modelLoaded&&this.gazeTracker.webgazer.getTracker().loadModel();const a=Object.assign({fullscreen:!1,greedyLearner:!1,framerate:60,showGazer:!0,showVideo:!0,pipWidthPx:this._CONST.N.VIDEO_W[this.isMobile.value?"MOBILE":"DESKTOP"],showFaceOverlay:!1,calibrationCount:1,thresholdDeg:10,decimalPlace:0,headline:`👀 ${U.H.RC_gazeTrackingTitle[this.L]}`,description:U.H.RC_gazeTrackingIntro[this.L]},e);if(this.getFullscreen(a.fullscreen),this.gazeTracker.checkInitialized("gaze"))return this.gazeTracker._toFixedN=a.decimalPlace,this.showGazer(a.showGazer),this.showVideo(a.showVideo),this.showFaceOverlay(a.showFaceOverlay),this.gazeTracker.attachNewCallback(n),void(this.gazeTracker.defaultGazeCallback=n);this._addBackground(),await Ya(this),this.gazeTracker._init({greedyLearner:a.greedyLearner,framerate:a.framerate,toFixedN:a.decimalPlace,showVideo:a.showVideo,showFaceOverlay:a.showFaceOverlay,showGazer:a.showGazer},"gaze"),cs(this,a);const i={pipWidthPx:a.pipWidthPx},s={greedyLearner:a.greedyLearner,calibrationCount:a.calibrationCount,headline:a.headline,description:a.description};this.gazeTracker.begin(i,(()=>{this._trackingSetupFinishedStatus.gaze=!1,this.calibrateGaze(s,r)}));const r=e=>{(0,_.nB)(t,e),this.gazeTracker.webgazer.params.greedyLearner||this.gazeTracker.stopLearning({click:!0,move:!0});return a.thresholdDeg,this.gazeTracker.attachNewCallback(n),void(this.gazeTracker.defaultGazeCallback=n)}},E.A.prototype.getGazeNow=async function(e={},t=null){if(!(this.checkInitialized()&&this.gazeTracker.checkInitialized("gaze",!0)&&this.gazeTracker.webgazer.params.paused&&this._trackingPaused.gaze))return;const n=Object.assign({wait:0,frames:5},e),a=t||this.gazeTracker.defaultGazeCallback;return await this.gazeTracker.getGazeNow(n,a)},E.A.prototype.pauseGaze=function(){!this.gazeTracker.checkInitialized("gaze",!0)&&this._trackingPaused.gaze||(this._trackingPaused.gaze=!0,this.gazeTracker.pause())},E.A.prototype.resumeGaze=function(){(this.gazeTracker.checkInitialized("gaze",!0)||this._trackingPaused.gaze)&&(this._trackingPaused.gaze=!1,this.gazeTracker.resume())},E.A.prototype.endGaze=function(e=!1){this.gazeTracker.checkInitialized("gaze",!0)&&(this._trackingPaused.gaze=!1,this.gazeTracker.end("gaze",e))},E.A.prototype.gazeLearning=function(e,t){const n=Object.assign({click:!0,move:!0},t);e?this.gazeTracker.startLearning(n):this.gazeTracker.stopLearning(n)},E.A.prototype.showGazer=function(e=!0){this.gazeTracker.checkInitialized("gaze",!1)&&this.gazeTracker.showGazer(e)},E.A.prototype.showVideo=function(e=!0){this.gazeTracker.checkInitialized("",!1)&&this.gazeTracker.showVideo(e)},E.A.prototype.showFaceOverlay=function(e=!0){this.gazeTracker.checkInitialized("gaze",!1)&&this.gazeTracker.showFaceOverlay(e)};var ps=__webpack_require__(7158),ms=__webpack_require__.n(ps);const fs={gazer:!1,gazeLearning:!1,gazePaused:!1},gs={current:null};E.A.prototype.nudgeGaze=function(e={},t=void 0){if(!this.checkInitialized()||!this.gazeTracker.checkInitialized("gaze",!0))return;const n=Object.assign({showOffset:!0},e);if(this._gazeTrackNudging.isCorrectingGaze)return;this._gazeTrackNudging.isCorrectingGaze=!0;let a=document.getElementById("gaze-nudger");a||(a=document.createElement("div"),a.id="gaze-nudger",a.className=`gaze-nudger rc-lang-${this.LD.toLowerCase()}`,document.body.classList.add("lock-view"),document.body.appendChild(a),a.style.background=this.params.backgroundColor);const i=`

          ${U.H.RC_gazeTrackingNudge[this.L]}

          `;a.innerHTML+=i;const s=ys(this,a,t);if(this._nudger.gazeElement=a,n.showOffset){const e=document.createElement("div");e.id="fake-gaze-dot",e.style.position="absolute",e.style.left=this.gazePositionPx.value.x-5+"px",e.style.top=this.gazePositionPx.value.y-5+"px",e.style.width="10px",e.style.height="10px",e.style.borderRadius="50%",e.style.background="transparent",e.style.zIndex="9999999999",document.body.appendChild(e),gs.current=new(ms())(ms().pointAnchor(e,{x:"50%",y:"50%"}),ms().pointAnchor(s,{x:"50%",y:"50%"}),{path:"straight",color:this._CONST.COLOR.DARK_RED,startPlug:"disc"});const t=document.querySelector(".leader-line");t.style.zIndex=9999999999,t.style.opacity=.7,t.style.transitionDuration="0.2s"}fs.gazePaused=this._trackingPaused.gaze,fs.gazer=this.gazeTracker.webgazer.params.showGazeDot,fs.gazeLearning=this.gazeTracker._learning,fs.gazePaused&&this.resumeGaze(),fs.gazer||this.showGazer(!0),fs.gazeLearning||this.gazeLearning(!0,{click:!0,move:!1})};const ys=(e,t,n)=>new ds(e,t,{greedyLearner:!1,calibrationCount:1,nudge:!0},fs,(()=>{t.remove(),t=null,e._nudgerElement=null,document.body.classList.remove("lock-view"),fs.gazePaused&&e.pauseGaze(),fs.gazePaused=!1,gs.current&&(gs.current.remove(),gs.current=null),e._gazeTrackNudging.isCorrectingGaze=!1,(0,_.nB)(n)}));var bs=__webpack_require__(4948),vs=__webpack_require__.n(bs);let ks=!1;E.A.prototype.getGazeAccuracy=function(e={},t=void 0,n=void 0){if(!this.checkInitialized())return!1;(0,_.$k)();const a=this.screenPpi,i=this.viewingDistanceCm;if(!a||!i)return!1;const s=Object.assign({backgroundColor:"#eee",thresholdDeg:10,decimalPlace:3},e);this._addBackground();const r=document.createElement("div");r.innerHTML='',this.background.appendChild(r);const o=document.querySelector("#gaze-accuracy-canvas"),l=o.getContext("2d"),u=()=>{o.width=window.innerWidth,o.height=window.innerHeight,o.style.width=`${o.width}px`,o.style.height=`${o.height}px`},c=new ResizeObserver((()=>{u()}));return c.observe(this.background),u(),vs().fire({...Ga(this,{showIcon:!0}),html:"We will measure your gaze accuracy. Please do not move the mouse and look at the fixation at the middle of the screen for the next 5 seconds."}).then((()=>{ks=!0,ws(o,l,s),this.gazeTracker.startStoringPoints(),(0,_.yy)(5e3).then((()=>{ks=!1,this.gazeTracker.stopStoringPoints();const e=this.gazeTracker.webgazer.getStoredPoints(),r=As({x:o.width/2,y:o.height/2},e,a.value,i.value);this.newGazeAccuracyData={value:(0,_.Nh)(r,s.decimalPlace),timestamp:performance.now()},r{const a=()=>{t.fillStyle=n.backgroundColor,t.fillRect(0,0,e.width,e.height),ja(t,e.width/2,e.height/2),ks&&requestAnimationFrame(a)};requestAnimationFrame(a)},As=(e,t,n,a)=>{let i=0;for(let s=0;s0;)n=Math.random()*t|0,t--,Is(e,t,n)}function _s(e,t,n){return Math.max(e,Math.min(t,n))}function Ts(e){return e%2==0?e:e+1}function Is(e,t,n){const a=e[t];e[t]=e[n],e[n]=a}function Ns(e,t){if(!e)throw new Error("string"==typeof t?t:t())}function Rs(e,t,n=""){Ns(Os(e,t),(()=>n+` Shapes ${e} and ${t} must match`))}function Ds(e){Ns(null!=e,(()=>"The input to the tensor constructor must be a non-null value."))}function zs(e){if(0===e.length)return 1;let t=e[0];for(let n=1;n0),n,a){return new Promise(((i,s)=>{let r=0;const o=()=>{if(e())return void i();r++;const l=t(r);null!=n&&r>=n?s():null!=a?a(o,l):setTimeout(o,l)};o()}))}function Ps(e,t){let n=1,a=-1;for(let t=0;t=0)n*=e[t];else if(-1===e[t]){if(-1!==a)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${a} and dim ${t}`);a=t}else if(e[t]<0)throw Error(`Shapes can not be < 0. Found ${e[t]} at dim ${t}`);if(-1===a){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(0===n)throw Error(`Cannot infer the missing size in [${e}] when there are 0 elements`);if(t%n!=0)throw Error(`The implicit shape can't be a fractional number. Got ${t} / ${n}`);const i=e.slice();return i[a]=t/n,i}function js(e,t){const n=t.length;return Ns((e=null==e?t.map(((e,t)=>t)):[].concat(e)).every((e=>e>=-n&&e`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`)),Ns(e.every((e=>Ms(e))),(()=>`All values in axis param must be integers but got axis ${e}`)),e.map((e=>e<0?n+e:e))}function Vs(e,t){const n=[],a=[],i=null!=t&&Array.isArray(t)&&0===t.length,s=null==t||i?null:js(t,e).sort();let r=0;for(let t=0;tt)&&1===e[t]&&(n.push(e[t]),a.push(t)),s[r]<=t&&r++}1!==e[t]&&(n.push(e[t]),a.push(t))}return{newShape:n,keptDims:a}}function Us(e,t){return Ws(e,t)}function Ws(e,t){let n=null;if(null==e||"float32"===e)n=new Float32Array(t);else if("int32"===e)n=new Int32Array(t);else if("bool"===e)n=new Uint8Array(t);else{if("string"!==e)throw new Error(`Unknown data type ${e}`);n=new Array(t)}return n}function Gs(e,t){return"complex64"!==t&&(("float32"!==t||"complex64"===e)&&(("int32"!==t||"float32"===e||"complex64"===e)&&("bool"!==t||"bool"!==e)))}function qs(e){if("float32"===e||"int32"===e)return 4;if("complex64"===e)return 8;if("bool"===e)return 1;throw new Error(`Unknown dtype ${e}`)}function Hs(e){return"string"==typeof e||e instanceof String}function Ks(e){return"number"==typeof e}function $s(e){return Array.isArray(e)?$s(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray?"int32":Ks(e)?"float32":Hs(e)?"string":"boolean"==typeof e?"bool":"float32"}function Zs(e){return!!(e&&e.constructor&&e.call&&e.apply)}function Xs(e,t){for(let n=t;n=0;--a)n[a]=n[a+1]*e[a+1];return n}function Qs(e,t,n,a=!1){const i=new Array;if(1===t.length){const s=t[0]*(a?2:1);for(let t=0;te*t))*(a?2:1);for(let t=0;te*t))*(n?2:1);if(0===a)return[];if(a!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}${n?" for a complex tensor":""}.`);return Qs(0,e,t,n)}function er(e,t){const n=tr(e,t);for(let e=0;ee*t),1);if(null==t||"float32"===t)return Js(e,new Float32Array(n));if("int32"===t)return Js(e,new Int32Array(n));if("bool"===t)return Js(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function ar(e){e.forEach((t=>{Ns(Number.isInteger(t)&&t>=0,(()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`))}))}function ir(e,t,n){if(0===t)return 0;if(1===t)return e[0];let a=e[e.length-1];for(let t=0;t{const[t,n]=e.split(":");this.urlFlags[t]=function(e,t){const n=t.toLowerCase();return"true"===n||"false"===n?"true"===n:""+ +n===n?+n:t}(0,n)}))}}}function ur(e){const t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,((e,...n)=>(function(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}(t,n[0],n[1]),n.join("=")))),t}function cr(){return dr}let hr,dr=null;function pr(){if(null==hr){let e;if("undefined"!=typeof window)e=window;else if(void 0!==__webpack_require__.g)e=__webpack_require__.g;else if("undefined"!=typeof process)e=process;else{if("undefined"==typeof self)throw new Error("Could not find a global object");e=self}hr=e}return hr}function mr(e,t){const n=function(){const e=pr();return null==e._tfGlobals&&(e._tfGlobals=new Map),e._tfGlobals}();if(n.has(e))return n.get(e);{const a=t();return n.set(e,a),n.get(e)}}const fr="Abs",gr="Acos",yr="Acosh",br="Add",vr="AddN",kr="All",wr="Any",Ar="ArgMax",xr="ArgMin",Cr="Asin",Sr="Asinh",Er="Atan",_r="Atanh",Tr="Atan2",Ir="AvgPool",Nr="AvgPoolGrad",Rr="AvgPool3D",Dr="AvgPool3DGrad",zr="BatchMatMul",Or="BatchToSpaceND",Mr="Bincount",Br="BitwiseAnd",Fr="BroadcastArgs",Lr="Cast",Pr="Ceil",jr="ClipByValue",Vr="Complex",Ur="ComplexAbs",Wr="Concat",Gr="Conv2D",qr="Conv2DBackpropFilter",Hr="Conv2DBackpropInput",Kr="Conv3D",$r="Conv3DBackpropFilterV2",Zr="Conv3DBackpropInputV2",Xr="Cos",Yr="Cosh",Qr="Cumprod",Jr="Cumsum",eo="CropAndResize",to="DenseBincount",no="DepthToSpace",ao="DepthwiseConv2dNative",io="DepthwiseConv2dNativeBackpropFilter",so="DepthwiseConv2dNativeBackpropInput",ro="Diag",oo="Dilation2D",lo="Dilation2DBackpropInput",uo="Dilation2DBackpropFilter",co="Draw",ho="RealDiv",po="Einsum",mo="Elu",fo="EluGrad",go="Erf",yo="Equal",bo="Exp",vo="ExpandDims",ko="Expm1",wo="FFT",Ao="Fill",xo="FlipLeftRight",Co="Floor",So="FloorDiv",Eo="FusedBatchNorm",_o="GatherV2",To="GatherNd",Io="Greater",No="GreaterEqual",Ro="Identity",Do="IFFT",zo="Imag",Oo="IsFinite",Mo="IsInf",Bo="IsNan",Fo="LeakyRelu",Lo="Less",Po="LessEqual",jo="LinSpace",Vo="Log",Uo="Log1p",Wo="LogicalAnd",Go="LogicalNot",qo="LogicalOr",Ho="LRN",Ko="LRNGrad",$o="Max",Zo="Maximum",Xo="MaxPool",Yo="MaxPoolGrad",Qo="MaxPool3D",Jo="MaxPool3DGrad",el="MaxPoolWithArgmax",tl="Mean",nl="Min",al="Minimum",il="MirrorPad",sl="Mod",rl="Multinomial",ol="Multiply",ll="Neg",ul="NotEqual",cl="NonMaxSuppressionV3",hl="NonMaxSuppressionV4",dl="NonMaxSuppressionV5",pl="OnesLike",ml="OneHot",fl="Pack",gl="PadV2",yl="Pow",bl="Prelu",vl="Prod",kl="RaggedGather",wl="RaggedRange",Al="RaggedTensorToTensor",xl="Range",Cl="Real",Sl="Reciprocal",El="Relu",_l="Reshape",Tl="ResizeNearestNeighbor",Il="ResizeNearestNeighborGrad",Nl="ResizeBilinear",Rl="ResizeBilinearGrad",Dl="Relu6",zl="Reverse",Ol="Round",Ml="Rsqrt",Bl="ScatterNd",Fl="TensorScatterUpdate",Ll="SearchSorted",Pl="Select",jl="Selu",Vl="Slice",Ul="Sin",Wl="Sinh",Gl="Sign",ql="Sigmoid",Hl="Softplus",Kl="Sqrt",$l="Sum",Zl="SpaceToBatchND",Xl="SplitV",Yl="Softmax",Ql="SparseFillEmptyRows",Jl="SparseReshape",eu="SparseSegmentMean",tu="SparseSegmentSum",nu="SparseToDense",au="SquaredDifference",iu="Square",su="StaticRegexReplace",ru="StridedSlice",ou="StringNGrams",lu="StringSplit",uu="StringToHashBucketFast",cu="Sub",hu="Tan",du="Tanh",pu="Tile",mu="TopK",fu="Transform",gu="Transpose",yu="Unique",bu="Unpack",vu="UnsortedSegmentSum",ku="ZerosLike",wu="Step",Au="FromPixels",xu="RotateWithOffset",Cu="_FusedMatMul",Su="FusedConv2D",Eu="FusedDepthwiseConv2D";function _u(...e){!cr().getBool("IS_TEST")&&cr().getBool("PROD")}function Tu(...e){!cr().getBool("IS_TEST")&&cr().getBool("PROD")}const Iu=mr("kernelRegistry",(()=>new Map)),Nu=mr("gradRegistry",(()=>new Map));function Ru(e,t){const n=Bu(e,t);return Iu.get(n)}function Du(e){return Nu.get(e)}function zu(e){const t=Iu.entries(),n=[];for(;;){const{done:a,value:i}=t.next();if(a)break;const[s,r]=i,[o]=s.split("_");o===e&&n.push(r)}return n}function Ou(e){const{kernelName:t,backendName:n}=e,a=Bu(t,n);Iu.has(a)&&_u(),Iu.set(a,e)}function Mu(e){const{kernelName:t}=e;Nu.has(t)&&cr().getBool("DEBUG")&&_u(),Nu.set(t,e)}function Bu(e,t){return`${t}_${e}`}function Fu(e){return e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray}var Lu=__webpack_require__(3122);const Pu=__webpack_require__.n(Lu)()||Lu;function ju(e){return Pu.fromString(e,!0,16)}const Vu=ju("c3a5c85c97cb3127"),Uu=ju("b492b66fbe98f273"),Wu=ju("9ae16a3b2f90404f");function Gu(e){return e.xor(e.shru(47))}function qu(e,t,n){const a=e.slice(t,t+n);return Pu.fromBytes(Array.from(a),!0,!0)}function Hu(e,t){return qu(e,t,8)}function Ku(e,t){return qu(e,t,4)}function $u(e,t){return 0===t?e:e.shru(t).or(e.shl(64-t))}function Zu(e,t,n=ju("9ddfea08eb382d69")){let a=e.xor(t).mul(n);a=a.xor(a.shru(47));let i=t.xor(a).mul(n);return i=i.xor(i.shru(47)),i=i.mul(n),i}function Xu(e,t,n,a){return function(e,t,n,a,i,s){i=i.add(e),s=$u(s.add(i).add(a),21);const r=i;return i=(i=i.add(t)).add(n),s=s.add($u(i,44)),[i.add(a),s.add(r)]}(Hu(e,t),Hu(e,t+8),Hu(e,t+16),Hu(e,t+24),n,a)}function Yu(e,t=e.length){const n=Pu.fromNumber(81,!0);if(t<=32)return t<=16?function(e,t=e.length){if(t>=8){const n=Wu.add(2*t),a=Hu(e,0).add(Wu),i=Hu(e,t-8);return Zu($u(i,37).mul(n).add(a),$u(a,25).add(i).mul(n),n)}if(t>=4){const n=Wu.add(2*t);return Zu(Ku(e,0).shl(3).add(t),Ku(e,t-4),n)}if(t>0){const n=e[0]+(e[t>>1]<<8),a=t+(e[t-1]<<2);return Gu(Wu.mul(n).xor(Vu.mul(a))).mul(Wu)}return Wu}(e,t):function(e,t=e.length){const n=Wu.add(2*t),a=Hu(e,0).mul(Uu),i=Hu(e,8),s=Hu(e,t-8).mul(n),r=Hu(e,t-16).mul(Wu);return Zu($u(a.add(i),43).add($u(s,30)).add(r),a.add($u(i.add(Wu),18)).add(s),n)}(e,t);if(t<=64)return function(e,t=e.length){const n=Wu.add(2*t),a=Hu(e,0).mul(Wu),i=Hu(e,8),s=Hu(e,t-8).mul(n),r=Hu(e,t-16).mul(Wu),o=$u(a.add(i),43).add($u(s,30)).add(r),l=Zu(o,a.add($u(i.add(Wu),18)).add(s),n),u=Hu(e,16).mul(n),c=Hu(e,24),h=o.add(Hu(e,t-32)).mul(n),d=l.add(Hu(e,t-24)).mul(n);return Zu($u(u.add(c),43).add($u(h,30)).add(d),u.add($u(c.add(a),18)).add(h),n)}(e,t);let a=n,i=n.mul(Uu).add(113),s=Gu(i.mul(Wu).add(113)).mul(Wu),r=[Pu.UZERO,Pu.UZERO],o=[Pu.UZERO,Pu.UZERO];a=a.mul(Wu).add(Hu(e,0));let l=0;const u=64*(t-1>>6),c=u+(t-1&63)-63;do{a=$u(a.add(i).add(r[0]).add(Hu(e,l+8)),37).mul(Uu),i=$u(i.add(r[1]).add(Hu(e,l+48)),42).mul(Uu),a=a.xor(o[1]),i=i.add(r[0]).add(Hu(e,l+40)),s=$u(s.add(o[0]),33).mul(Uu),r=Xu(e,l,r[1].mul(Uu),a.add(o[0])),o=Xu(e,l+32,s.add(o[1]),i.add(Hu(e,l+16))),[s,a]=[a,s],l+=64}while(l!==u);const h=Uu.add(s.and(255).shl(1));return l=c,o[0]=o[0].add(t-1&63),r[0]=r[0].add(o[0]),o[0]=o[0].add(r[0]),a=$u(a.add(i).add(r[0]).add(Hu(e,l+8)),37).mul(h),i=$u(i.add(r[1]).add(Hu(e,l+48)),42).mul(h),a=a.xor(o[1].mul(9)),i=i.add(r[0].mul(9).add(Hu(e,l+40))),s=$u(s.add(o[0]),33).mul(h),r=Xu(e,l,r[1].mul(h),a.add(o[0])),o=Xu(e,l+32,s.add(o[1]),i.add(Hu(e,l+16))),[s,a]=[a,s],Zu(Zu(r[0],o[0],h).add(Gu(i).mul(Vu)).add(s),Zu(r[1],o[1],h).add(a),h)}function Qu(e,t){return"string"===t?tc(e):Ju([e],t)}function Ju(e,t){if("string"===t)throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=ic(e)),cr().getBool("DEBUG")&&function(e,t){for(let n=0;n{a=n()};let s;const r=ec();if(this.backendTimer.timerAvailable())s=this.backendTimer.time(i);else{i();for(const e of a)e.dataSync();s=Promise.resolve({kernelMs:ec()-r})}if(cr().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let t=0;t{rc(t,n.dtype,e)}))}return{kernelName:e,outputs:a,inputs:t,timeMs:s.then((e=>e.kernelMs)),extraInfo:s.then((e=>null!=e.getExtraProfileInfo?e.getExtraProfileInfo():""))}}logKernelProfile(e){const{kernelName:t,outputs:n,timeMs:a,inputs:i,extraInfo:s}=e;n.forEach((e=>{Promise.all([e.data(),a,s]).then((n=>{this.logger.logKernelProfile(t,e,n[0],n[1],i,n[2])}))}))}}function rc(e,t,n){if("float32"!==t)return!1;for(let t=0;t0?a:""} `}}}}const lc=20,uc=3,cc=7;function hc(e,t,n,a){const i=Ys(t),s=function(e,t,n,a){const i=zs(t),s=a[a.length-1],r=new Array(s).fill(0),o=t.length,l="complex64"===n?fc(e):e;if(o>1)for(let e=0;e" "+e)).join("\n")),l.join("\n")}function dc(e,t,n){let a;return a=Array.isArray(e)?`${parseFloat(e[0].toFixed(cc))} + ${parseFloat(e[1].toFixed(cc))}j`:Hs(e)?`'${e}'`:"bool"===n?pc(e):parseFloat(e.toFixed(cc)).toString(),Fs(a,t)}function pc(e){return 0===e?"false":"true"}function mc(e,t,n,a,i,s=!0){const r="complex64"===n?2:1,o=t[0],l=t.length;if(0===l){if("complex64"===n){return[dc(fc(e)[0],0,n)]}return"bool"===n?[pc(e[0])]:[e[0].toString()]}if(1===l){if(o>lc){const t=uc*r;let a=Array.from(e.slice(0,t)),s=Array.from(e.slice((o-uc)*r,o*r));return"complex64"===n&&(a=fc(a),s=fc(s)),["["+a.map(((e,t)=>dc(e,i[t],n))).join(", ")+", ..., "+s.map(((e,t)=>dc(e,i[o-uc+t],n))).join(", ")+"]"]}return["["+("complex64"===n?fc(e):Array.from(e)).map(((e,t)=>dc(e,i[t],n))).join(", ")+"]"]}const u=t.slice(1),c=a.slice(1),h=a[0]*r,d=[];if(o>lc){for(let t=0;t0?d[0]+p:"");for(let e=1;e`Length of values '${e}' does not match the size inferred by the shape '${this.size}'.`))}if("complex64"===t)throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||Ws(t,this.size),this.strides=Ys(e)}set(e,...t){0===t.length&&(t=[0]),Ns(t.length===this.rank,(()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`));const n=this.locToIndex(t);this.values[n]=e}get(...e){0===e.length&&(e=[0]);let t=0;for(const n of e){if(n<0||n>=this.shape[t]){const t=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(t)}t++}let n=e[e.length-1];for(let t=0;tnc(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataToGPU(e){return this.throwIfDisposed(),yc().readToGPU(this.dataId,e)}dataSync(){this.throwIfDisposed();const e=yc().readSync(this.dataId);if("string"===this.dtype)try{return e.map((e=>nc(e)))}catch(e){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}return e}async bytes(){this.throwIfDisposed();const e=await yc().read(this.dataId);return"string"===this.dtype?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(this.kerasMask&&this.kerasMask.dispose(),yc().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return bc.print(this,e)}clone(){return this.throwIfDisposed(),bc.clone(this)}toString(e=!1){return hc(this.dataSync(),this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),bc.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),yc().makeVariable(this,e,t,n)}}function wc(){return mr("Tensor",(()=>kc))}Object.defineProperty(kc,Symbol.hasInstance,{value:e=>!!e&&null!=e.data&&null!=e.dataSync&&null!=e.throwIfDisposed}),wc();class Ac extends kc{constructor(e,t,n,a){super(e.shape,e.dtype,e.dataId,a),this.trainable=t,this.name=n}assign(e){if(e.dtype!==this.dtype)throw new Error(`dtype of the new value (${e.dtype}) and previous value (${this.dtype}) must match`);if(!Os(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);yc().disposeTensor(this),this.dataId=e.dataId,yc().incRef(this,null)}dispose(){yc().disposeVariable(this),this.isDisposedInternal=!0}}var xc,Cc,Sc,Ec,_c,Tc,Ic,Nc,Rc,Dc;Object.defineProperty(Ac,Symbol.hasInstance,{value:e=>e instanceof kc&&null!=e.assign&&e.assign instanceof Function}),(Cc=xc||(xc={})).R0="R0",Cc.R1="R1",Cc.R2="R2",Cc.R3="R3",Cc.R4="R4",Cc.R5="R5",Cc.R6="R6",(Ec=Sc||(Sc={})).float32="float32",Ec.int32="int32",Ec.bool="int32",Ec.complex64="complex64",(Tc=_c||(_c={})).float32="float32",Tc.int32="int32",Tc.bool="bool",Tc.complex64="complex64",(Nc=Ic||(Ic={})).float32="float32",Nc.int32="float32",Nc.bool="float32",Nc.complex64="complex64",(Dc=Rc||(Rc={})).float32="complex64",Dc.int32="complex64",Dc.bool="complex64",Dc.complex64="complex64";const zc={float32:Ic,int32:Sc,bool:_c,complex64:Rc};function Oc(e,t){if("string"===e||"string"===t){if("string"===e&&"string"===t)return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return zc[e][t]}function Mc(e){return Oc(e,"int32")}function Bc(e){return null!=e&&"object"==typeof e&&"texture"in e&&e.texture instanceof WebGLTexture}function Fc(e){return"undefined"!=typeof GPUBuffer&&null!=e&&"object"==typeof e&&"buffer"in e&&e.buffer instanceof GPUBuffer}function Lc(e,t){if(e.dtype===t.dtype)return[e,t];const n=Oc(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function Pc(e,t){return t.some((t=>t.id===e.id))}function jc(e){const t=[];return Vc(e,t,new Set),t}function Vc(e,t,n){if(null==e)return;if(e instanceof kc)return void t.push(e);if(a=e,!Array.isArray(a)&&"object"!=typeof a)return;var a;const i=e;for(const e in i){const a=i[e];n.has(a)||(n.add(a),Vc(a,t,n))}}function Uc(e){return null!=e.kernelName}class Wc{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!1,this.activeProfile={newBytes:0,newTensors:0,peakBytes:0,kernels:[],result:null,get kernelNames(){return Array.from(new Set(this.kernels.map((e=>e.name))))}}}dispose(){for(const e in this.registeredVariables)this.registeredVariables[e].dispose()}}class Gc{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new Wc}async ready(){if(null!=this.pendingBackendInit)return this.pendingBackendInit.then((()=>{}));if(null!=this.backendInstance)return;const e=this.getSortedBackends();for(let t=0;t{null!=e.setupFunc&&e.setupFunc(this.backendInstance)}))}disposeRegisteredKernels(e){zu(e).forEach((t=>{null!=t.disposeFunc&&t.disposeFunc(this.registry[e])}))}initializeBackend(e){const t=this.registryFactory[e];if(null==t)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{const n=t.factory();if(!n||n instanceof Cs||"function"!=typeof n.then)return this.registry[e]=n,{success:!0,asyncInit:!1};{const t=++this.pendingBackendInitId,a=n.then((n=>!(t(tthis.registryFactory[t].priority-this.registryFactory[e].priority))}initializeBackendsAndReturnBest(){const e=this.getSortedBackends();for(let t=0;tthis.startScope(a)),(()=>this.endScope(n)),(()=>(n=t(),n)))}scopedRun(e,t,n){e();try{const e=n();return t(),e}catch(e){throw t(),e}}nextTensorId(){return Gc.nextTensorId++}nextVariableId(){return Gc.nextVariableId++}clone(e){const t=Hc.runKernel(Ro,{x:e}),n={x:e};return this.addTapeNode(this.state.activeScope.name,n,[t],(e=>({x:()=>{const t={x:e},n={dtype:"float32"};return Hc.runKernel(Lr,t,n)}})),[],{}),t}runKernel(e,t,n){null==this.backendName&&this.backend;if(!(null!=Ru(e,this.backendName)))throw new Error(`Kernel '${e}' not registered for backend '${this.backendName}'`);return this.runKernelFunc({kernelName:e,inputs:t,attrs:n})}shouldCheckForMemLeaks(){return this.ENV.getBool("IS_TEST")}checkKernelForMemLeak(e,t,n){const a=this.backend.numDataIds();let i=0;n.forEach((e=>{i+="complex64"===e.dtype?3:1}));const s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],r=a-t-i-s;if(r>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${r} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[];const a=this.isTapeOn(),i=this.state.numBytes,s=this.state.numTensors;let r,o;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0),null==this.backendName&&this.backend;const l=Uc(e)?e.kernelName:null!=this.state.activeScope?this.state.activeScope.name:"";if(Uc(e)){const{kernelName:t,inputs:i,attrs:s}=e;null==this.backendName&&this.backend;const l=Ru(t,this.backendName);Ns(null!=l,(()=>`Cannot find registered kernel '${t}' for backend '${this.backendName}'`)),r=()=>{const e=this.backend.numDataIds();o=l.kernelFunc({inputs:i,attrs:s,backend:this.backend});const r=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(t,e,r);const u=r.map((e=>null!=e.rank?e:this.makeTensorFromTensorInfo(e)));if(a){const e=this.getTensorsForGradient(t,i,u);n=this.saveTensorsForBackwardMode(e)}return u}}else{const{forwardFunc:t}=e,i=e=>{a&&(n=e.map((e=>this.keep(this.clone(e)))))};r=()=>{const e=this.backend.numDataIds();o=this.tidy((()=>t(this.backend,i)));const n=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,e,n),n}}const{inputs:u,attrs:c}=e,h=Uc(e)?null:e.backwardsFunc;let d;return this.scopedRun((()=>this.state.kernelDepth++),(()=>this.state.kernelDepth--),(()=>{this.ENV.getBool("DEBUG")||this.state.profiling?(d=this.profiler.profileKernel(l,u,(()=>r())),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(d),t=d.outputs):t=r()})),a&&this.addTapeNode(l,u,t,h,n,c),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-i,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(u).map((e=>null!=u[e]?u[e].shape:null)),outputShapes:t.map((e=>e.shape)),kernelTimeMs:d.timeMs,extraInfo:d.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map((e=>this.keep(this.clone(e))))}getTensorsForGradient(e,t,n){const a=Du(e);if(null!=a){const e=a.inputsToSave||[],i=a.outputsToSave||[];let s;a.saveAllInputs?(Ns(Array.isArray(t),(()=>"saveAllInputs is true, expected inputs to be an array.")),s=Object.keys(t).map((e=>t[e]))):s=e.map((e=>t[e]));const r=n.filter(((e,t)=>i[t]));return s.concat(r)}return[]}makeTensor(e,t,n,a){if(null==e)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",a=a||this.backend;let i=e;"string"===n&&Hs(e[0])&&(i=e.map((e=>tc(e))));const s=a.write(i,t,n),r=new kc(t,n,s,this.nextTensorId());if(this.trackTensor(r,a),"string"===n){const e=this.state.tensorInfo.get(s),t=function(e){if(null==e)return 0;let t=0;return e.forEach((e=>t+=e.length)),t}(i);this.state.numBytes+=t-e.bytes,e.bytes=t}return r}makeTensorFromDataId(e,t,n,a){const i={dataId:e,shape:t,dtype:n=n||"float32"};return this.makeTensorFromTensorInfo(i,a)}makeTensorFromTensorInfo(e,t){const{dataId:n,shape:a,dtype:i}=e,s=new kc(a,i,n,this.nextTensorId());return this.trackTensor(s,t),s}makeVariable(e,t=!0,n,a){n=n||this.nextVariableId().toString(),null!=a&&a!==e.dtype&&(e=e.cast(a));const i=new Ac(e,t,n,this.nextTensorId());if(null!=this.state.registeredVariables[i.name])throw new Error(`Variable with name ${i.name} was already registered`);return this.state.registeredVariables[i.name]=i,this.incRef(i,this.backend),i}trackTensor(e,t){this.state.numTensors++,"string"===e.dtype&&this.state.numStringTensors++;let n=0;"complex64"!==e.dtype&&"string"!==e.dtype&&(n=e.size*qs(e.dtype)),this.state.numBytes+=n,this.state.tensorInfo.has(e.dataId)||(this.state.numDataBuffers++,this.state.tensorInfo.set(e.dataId,{backend:t||this.backend,dtype:e.dtype,shape:e.shape,bytes:n})),e instanceof Ac||this.track(e)}incRef(e,t){this.trackTensor(e,t),this.backend.incRef(e.dataId)}removeDataId(e,t){this.state.tensorInfo.has(e)&&this.state.tensorInfo.get(e).backend===t&&(this.state.tensorInfo.delete(e),this.state.numDataBuffers--)}disposeTensor(e){if(!this.state.tensorInfo.has(e.dataId))return;const t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,"string"===e.dtype&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),"complex64"!==e.dtype&&"string"!==e.dtype){const t=e.size*qs(e.dtype);this.state.numBytes-=t}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(const e in this.state.registeredVariables){const t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),null!=this.state.registeredVariables[e.name]&&delete this.state.registeredVariables[e.name]}memory(){const e=this.backend.memory();return e.numTensors=this.state.numTensors,e.numDataBuffers=this.state.numDataBuffers,e.numBytes=this.state.numBytes,this.state.numStringTensors>0&&(e.unreliable=!0,null==e.reasons&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;const t=this.state.numBytes,n=this.state.numTensors;this.state.activeProfile.kernels=[],this.state.activeProfile.result=await e(),this.state.profiling=!1,this.state.activeProfile.peakBytes=Math.max(...this.state.activeProfile.kernels.map((e=>e.totalBytesSnapshot))),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(const e of this.state.activeProfile.kernels)e.kernelTimeMs=await e.kernelTimeMs,e.extraInfo=await e.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&0===this.state.kernelDepth}addTapeNode(e,t,n,a,i,s){const r={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:i},o=Du(e);null!=o&&(a=o.gradFunc),null!=a&&(r.gradient=e=>(e=e.map(((e,t)=>{if(null==e){const e=n[t],a=tr(e.size,e.dtype);return this.makeTensor(a,e.shape,e.dtype)}return e})),a(e.length>1?e:e[0],i,s))),this.state.activeTape.push(r)}keep(e){return e.kept=!0,e}startTape(){0===this.state.gradientDepth&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){const t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){const t=jc(e),n=new Set(t.map((e=>e.id)));for(let e=0;e{e.kept||e.scopeId!==a.id||this.track(e)}))}gradients(e,t,n,a=!1){if(Ns(t.length>0,(()=>"gradients() received an empty list of xs.")),null!=n&&"float32"!==n.dtype)throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);const i=this.scopedRun((()=>this.startTape()),(()=>this.endTape()),(()=>this.tidy("forward",e)));Ns(i instanceof kc,(()=>"The result y returned by f() must be a tensor."));const s=function(e,t,n){const a={},i={};for(let e=0;ea[e.id]=!0)),o=!0,i[s.id]=!0;break}if(o)break}}const s={};s[n.id]=!0;const r={};for(let t=e.length-1;t>=0;t--){const n=e[t],a=n.inputs;for(let e=0;e0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",(()=>{const e={};e[i.id]=null==n?function(e){const t=er(zs(e),"float32");return Hc.makeTensor(t,e,"float32")}(i.shape):n,function(e,t,n,a){for(let i=t.length-1;i>=0;i--){const s=t[i],r=[];if(s.outputs.forEach((t=>{const n=e[t.id];null!=n?r.push(n):r.push(null)})),null==s.gradient)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);const o=s.gradient(r);for(const t in s.inputs){if(!(t in o))throw new Error(`Cannot backprop through input ${t}. Available gradients found: ${Object.keys(o)}.`);const i=n((()=>o[t]()));if("float32"!==i.dtype)throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${t} must have 'float32' dtype, but has '${i.dtype}'`);const r=s.inputs[t];if(!Os(i.shape,r.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${t}' has shape '${i.shape}', which does not match the shape of the input '${r.shape}'`);if(null==e[r.id])e[r.id]=i;else{const t=e[r.id];e[r.id]=a(t,i),t.dispose()}}}}(e,s,(e=>this.tidy(e)),Kc);const a=t.map((t=>e[t.id]));return 0===this.state.gradientDepth&&(this.state.activeTape.forEach((e=>{for(const t of e.saved)t.dispose()})),this.state.activeTape=null),{value:i,grads:a}}))}customGrad(e){return Ns(Zs(e),(()=>"The f passed in customGrad(f) must be a function.")),(...t)=>{let n;Ns(t.every((e=>e instanceof kc)),(()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors"));const a={};t.forEach(((e,t)=>{a[t]=e}));return this.runKernelFunc({forwardFunc:(a,i)=>(n=e(...t,i),Ns(n.value instanceof kc,(()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor")),Ns(Zs(n.gradFunc),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function.")),n.value),backwardsFunc:(e,a)=>{const i=n.gradFunc(e,a),s=Array.isArray(i)?i:[i];Ns(s.length===t.length,(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...).")),Ns(s.every((e=>e instanceof kc)),(()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."));const r={};return s.forEach(((e,t)=>{r[t]=()=>e})),r},inputs:a})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}readToGPU(e,t){return this.state.tensorInfo.get(e).backend.readToGPU(e,t)}async time(e){const t=ec(),n=await this.backend.time(e);return n.wallMs=ec()-t,n}track(e){return null!=this.state.activeScope&&(e.scopeId=this.state.activeScope.id,this.state.activeScope.track.push(e)),e}get registeredVariables(){return this.state.registeredVariables}reset(){this.pendingBackendInitId++,this.state.dispose(),this.ENV.reset(),this.state=new Wc;for(const e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}}function qc(){const e=pr();if(null==e._tfengine){const t=new lr(e);e._tfengine=new Gc(t)}var t;return t=e._tfengine.ENV,dr=t,yc=()=>e._tfengine,e._tfengine}Gc.nextTensorId=0,Gc.nextVariableId=0;const Hc=qc();function Kc(e,t){const n={a:e,b:t};return Hc.runKernel(br,n)}let $c;function Zc(e){if(void 0!==$c)return $c;if(e||"undefined"!=typeof navigator&&null!=navigator){if(e||(e=navigator),"ReactNative"===e.product)return!0;const t=e.userAgent||e.vendor||("undefined"!=typeof window?window.opera:"");if(!t){const t=e;return t.userAgentData&&t.userAgentData.mobile}return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4))}return!1}function Xc(){return"undefined"!=typeof window&&null!=window.document||"undefined"!=typeof WorkerGlobalScope}const Yc=cr();function Qc(e,t){let n=e;if(ac(e))return"string"===t?[]:[e.length];if(Bc(e)){const t=e.channels||"RGBA";return[e.height,e.width*t.length]}if(Fc(e))return[e.buffer.size/(null==t?4:qs(t))];if(!Array.isArray(e))return[];const a=[];for(;Array.isArray(n)||ac(n)&&"string"!==t;)a.push(n.length),n=n[0];return Array.isArray(e)&&cr().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&Jc(e,a,[]),a}function Jc(e,t,n){if(n=n||[],!Array.isArray(e)&&!ac(e))return void Ns(0===t.length,(()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`));Ns(t.length>0,(()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`)),Ns(e.length===t[0],(()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`));const a=t.slice(1);for(let t=0;t=0&&(i=a),eh(a,i,t,n),null==e||!ac(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e){const a=null==e?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${a}'`)}const s=Qc(e,i);ac(e)||Array.isArray(e)||(e=[e]);const r="string"!==i?Ju(e,i):ic(e,[],!0);return Hc.makeTensor(r,s,i)}function nh(e,t,n,a="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map(((e,i)=>th(e,`${t}[${i}]`,n,a)))}Yc.registerFlag("DEBUG",(()=>!1),(e=>{})),Yc.registerFlag("IS_BROWSER",(()=>Xc())),Yc.registerFlag("IS_NODE",(()=>"undefined"!=typeof process&&void 0!==process.versions&&void 0!==process.versions.node)),Yc.registerFlag("IS_CHROME",(()=>"undefined"!=typeof navigator&&null!=navigator&&null!=navigator.userAgent&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor))),Yc.registerFlag("IS_SAFARI",(()=>"undefined"!=typeof navigator&&null!=navigator&&null!=navigator.userAgent&&/Safari/.test(navigator.userAgent)&&/Apple/.test(navigator.vendor))),Yc.registerFlag("PROD",(()=>!1)),Yc.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",(()=>Yc.getBool("DEBUG"))),Yc.registerFlag("DEPRECATION_WARNINGS_ENABLED",(()=>!0)),Yc.registerFlag("IS_TEST",(()=>!1)),Yc.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",(()=>Yc.getBool("DEBUG"))),Yc.registerFlag("WRAP_TO_IMAGEBITMAP",(()=>!1)),Yc.registerFlag("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU",(()=>!1)),Yc.registerFlag("USE_SETTIMEOUTCUSTOM",(()=>!1));const ah="__op";function ih(e){const t=Object.keys(e);if(1!==t.length)throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${t.length} keys.`);let n=t[0];const a=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n+=ah;const i=(...e)=>{Hc.startScope(n);try{const t=a(...e);return rr(t),Hc.endScope(t),t}catch(e){throw Hc.endScope(null),e}};return Object.defineProperty(i,"name",{value:n,configurable:!0}),i}const sh=ih({complex_:function(e,t){const n=th(e,"real","complex"),a=th(t,"imag","complex");Rs(n.shape,a.shape,`real and imag shapes, ${n.shape} and ${a.shape}, must match in call to tf.complex().`);const i={real:n,imag:a};return Hc.runKernel(Vr,i)}});function rh(e,t,n,a){if(null==a)a=$s(e);else if("complex64"===a)throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(Fc(e)||Bc(e)){if("float32"!==a&&"int32"!==a)throw new Error(`Creating tensor from GPU data only supports 'float32'|'int32' dtype, while the dtype is ${a}.`);return Hc.backend.createTensorFromGPUData(e,t||n,a)}if(!ac(e)&&!Array.isArray(e)&&"number"!=typeof e&&"boolean"!=typeof e&&"string"!=typeof e)throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(null!=t){ar(t);const e=zs(t),a=zs(n);Ns(e===a,(()=>`Based on the provided shape, [${t}], the tensor should have ${e} values but has ${a}`));for(let e=0;e`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `))}}return ac(e)||Array.isArray(e)||(e=[e]),t=t||n,e="string"!==a?Ju(e,a):ic(e,[],!0),Hc.makeTensor(e,t,a)}function oh(e,t,n){return rh(e,t,Qc(e,n),n)}const lh={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8};class uh{static join(e){return new uh(e).slice()}constructor(e){if(this.shards=[],this.previousShardIndex=0,null==e)return;if(e instanceof Array||(e=[e]),0===(e=e.map((e=>ac(e)?e.buffer:e))).length)return;this.bufferUniformSize=e[0].byteLength;let t=0;for(let n=0;n=this.byteLength)return-1;if(null!=this.bufferUniformSize)return this.previousShardIndex=Math.floor(e/this.bufferUniformSize),this.previousShardIndex;function t(t){return e=t.end?1:0}if(0===t(this.shards[this.previousShardIndex]))return this.previousShardIndex;const n=function(e,t){let n=0,a=e.length;for(;n<=a;){const i=Math.floor((a-n)/2)+n,s=t(e[i]);if(0===s)return i;s<0?a=i:n=i+1}return-1}(this.shards,t);return-1===n?-1:(this.previousShardIndex=n,this.previousShardIndex)}}function ch(){return Hc}function hh(){return Hc.memory()}function dh(e,t){return Hc.tidy(e,t)}function ph(e){jc(e).forEach((e=>e.dispose()))}function mh(e){return Hc.keep(e)}function fh(e,t,n=1){return Hc.registerBackend(e,t,n)}function gh(){return Hc.backend}vc=function(e){cr().getBool("DEPRECATION_WARNINGS_ENABLED")};const yh=4;async function bh(e,t){const n=[],a=[],i=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);for(let s=0;s{const t=await o.bytes(),n=t.reduce(((e,t)=>e+t.length),0)+yh*t.length,a=new Uint8Array(n);let i=0;for(let e=0;en.slice(i+e,i+t)));a[e.name]=Ah(e,n.slice(i,i+t)),i+=t}return a}function kh(e,t){const n=zs(e.shape);let a;if("quantization"in e){const t=e.quantization;a=lh[t.dtype]}else{if("string"===e.dtype){let e=0;for(let a=0;a{let t=e<<13,n=0;for(;!(8388608&t);)n-=8388608,t<<=1;return t&=-8388609,n+=947912704,t|n},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let e=1024;e<2048;e++)t[e]=939524096+(e-1024<<13);return t}(),t=function(){const e=new Uint32Array(64);e[0]=0,e[31]=1199570944,e[32]=2147483648,e[63]=3347054592;for(let t=1;t<31;t++)e[t]=t<<23;for(let t=33;t<63;t++)e[t]=2147483648+(t-32<<23);return e}(),n=function(){const e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}();return a=>{const i=new ArrayBuffer(4*a.length),s=new Uint32Array(i);for(let i=0;i>10]+(1023&r)]+t[r>>10];s[i]=o}return new Float32Array(i)}}();r=e(u)}}else{if("int32"!==a)throw new Error(`Unsupported dtype in weight '${n}': ${a}`);if("uint8"!==i.dtype&&"uint16"!==i.dtype)throw new Error(`Unsupported quantization type ${i.dtype} for weight type int32.`);r=new Int32Array(u.length);for(let e=0;e(i=await xh(a,i,t),i.slice(e,t))));i=await xh(a,i,t);const s=i.slice(0,t);i=i.slice(t);const r=Ah(e,s);if(n[e.name]=r,"webgpu"===Hc.backendName){const e=gh();"uploadToGPU"in e&&zs(r.shape)>=cr().get("WEBGPU_CPU_HANDOFF_SIZE_THRESHOLD")&&e.uploadToGPU(r.dataId)}}return n}function Sh(e){if(null===e)throw new Error(`Invalid input value: ${JSON.stringify(e)}`);let t=0;const n=[];e.forEach((e=>{if(t+=e.byteLength,n.push(e.byteLength===e.buffer.byteLength?e:new e.constructor(e)),!(e instanceof Float32Array||e instanceof Int32Array||e instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${e.constructor.name}`)}));const a=new Uint8Array(t);let i=0;return n.forEach((e=>{a.set(new Uint8Array(e.buffer),i),i+=e.byteLength})),a.buffer}const Eh="undefined"!=typeof Buffer&&("undefined"==typeof Blob||"undefined"==typeof atob||"undefined"==typeof btoa);function _h(e){return Eh?Buffer.byteLength(e,"utf8"):new Blob([e]).size}function Th(e){return uh.join(e)}function Ih(e){for(e=e.trim();e.endsWith("/");)e=e.slice(0,e.length-1);const t=e.split("/");return t[t.length-1]}function Nh(e,t){const n={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:t};return null!=e.signature&&(n.signature=e.signature),null!=e.userDefinedMetadata&&(n.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(n.modelInitializer=e.modelInitializer),null!=e.initializerSignature&&(n.initializerSignature=e.initializerSignature),null!=e.trainingConfig&&(n.trainingConfig=e.trainingConfig),n}function Rh(e,t,n){const a={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};if(null!=e.trainingConfig&&(a.trainingConfig=e.trainingConfig),null!=e.weightsManifest){if(!t)throw new Error("modelJSON has weightsManifest but weightSpecs is null");if(!n)throw new Error("modelJSON has weightsManifest but weightData is null");a.weightSpecs=t,a.weightData=n}return null!=e.signature&&(a.signature=e.signature),null!=e.userDefinedMetadata&&(a.userDefinedMetadata=e.userDefinedMetadata),null!=e.modelInitializer&&(a.modelInitializer=e.modelInitializer),null!=e.initializerSignature&&(a.initializerSignature=e.initializerSignature),a}async function Dh(e,t){let n,a;return null!=e.weightsManifest&&([n,a]=await t(e.weightsManifest)),Rh(e,n,a)}function zh(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:null==e.modelTopology?0:_h(JSON.stringify(e.modelTopology)),weightSpecsBytes:null==e.weightSpecs?0:_h(JSON.stringify(e.weightSpecs)),weightDataBytes:null==e.weightData?0:new uh(e.weightData).byteLength}}function Oh(e){const t=[];for(const n of e)t.push(...n.weights);return t}class Mh{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return null==Mh.instance&&(Mh.instance=new Mh),Mh.instance}static registerSaveRouter(e){Mh.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Mh.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Mh.getHandlers(e,"save")}static getLoadHandlers(e,t){return Mh.getHandlers(e,"load",t)}static getHandlers(e,t,n){const a=[];return("load"===t?Mh.getInstance().loadRouters:Mh.getInstance().saveRouters).forEach((t=>{const i=t(e,n);null!==i&&a.push(i)})),a}}const Bh=e=>Mh.registerSaveRouter(e),Fh=e=>Mh.registerLoadRouter(e),Lh=e=>Mh.getSaveHandlers(e),Ph=(e,t)=>Mh.getLoadHandlers(e,t),jh="tensorflowjs",Vh="models_store",Uh="model_info_store";function Wh(){if(!cr().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");const e="undefined"==typeof window?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(null==t)throw new Error("The current browser does not appear to support IndexedDB.");return t}function Gh(e){const t=e.result;t.createObjectStore(Vh,{keyPath:"modelPath"}),t.createObjectStore(Uh,{keyPath:"modelPath"})}class qh{constructor(e){if(this.indexedDB=Wh(),null==e||!e)throw new Error("For IndexedDB, modelPath must not be null, undefined or empty.");this.modelPath=e}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");return this.databaseAction(this.modelPath,e)}async load(){return this.databaseAction(this.modelPath)}databaseAction(e,t){return new Promise(((e,n)=>{const a=this.indexedDB.open(jh,1);a.onupgradeneeded=()=>Gh(a),a.onsuccess=()=>{const i=a.result;if(null==t){const t=i.transaction(Vh,"readonly"),a=t.objectStore(Vh).get(this.modelPath);a.onsuccess=()=>{if(null==a.result)return i.close(),n(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));e(a.result.modelArtifacts)},a.onerror=e=>(i.close(),n(a.error)),t.oncomplete=()=>i.close()}else{t.weightData=uh.join(t.weightData);const a=zh(t),s=i.transaction(Uh,"readwrite");let r,o,l=s.objectStore(Uh);try{r=l.put({modelPath:this.modelPath,modelArtifactsInfo:a})}catch(e){return n(e)}r.onsuccess=()=>{o=i.transaction(Vh,"readwrite");const r=o.objectStore(Vh);let u;try{u=r.put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:a})}catch(e){return n(e)}u.onsuccess=()=>e({modelArtifactsInfo:a}),u.onerror=e=>{l=s.objectStore(Uh);const t=l.delete(this.modelPath);t.onsuccess=()=>(i.close(),n(u.error)),t.onerror=e=>(i.close(),n(u.error))}},r.onerror=e=>(i.close(),n(r.error)),s.oncomplete=()=>{null==o?i.close():o.oncomplete=()=>i.close()}}},a.onerror=e=>n(a.error)}))}}qh.URL_SCHEME="indexeddb://";const Hh=e=>{return cr().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(qh.URL_SCHEME)?(t=e.slice(qh.URL_SCHEME.length),new qh(t)):null;var t};Mh.registerSaveRouter(Hh),Mh.registerLoadRouter(Hh);class Kh{constructor(){this.indexedDB=Wh()}async listModels(){return new Promise(((e,t)=>{const n=this.indexedDB.open(jh,1);n.onupgradeneeded=()=>Gh(n),n.onsuccess=()=>{const a=n.result,i=a.transaction(Uh,"readonly"),s=i.objectStore(Uh).getAll();s.onsuccess=()=>{const t={};for(const e of s.result)t[e.modelPath]=e.modelArtifactsInfo;e(t)},s.onerror=e=>(a.close(),t(s.error)),i.oncomplete=()=>a.close()},n.onerror=e=>t(n.error)}))}async removeModel(e){var t;return e=(t=e).startsWith(qh.URL_SCHEME)?t.slice(qh.URL_SCHEME.length):t,new Promise(((t,n)=>{const a=this.indexedDB.open(jh,1);a.onupgradeneeded=()=>Gh(a),a.onsuccess=()=>{const i=a.result,s=i.transaction(Uh,"readwrite"),r=s.objectStore(Uh),o=r.get(e);let l;o.onsuccess=()=>{if(null==o.result)return i.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{const a=r.delete(e),s=()=>{l=i.transaction(Vh,"readwrite");const a=l.objectStore(Vh).delete(e);a.onsuccess=()=>t(o.result.modelArtifactsInfo),a.onerror=e=>n(o.error)};a.onsuccess=s,a.onerror=e=>(s(),i.close(),n(o.error))}},o.onerror=e=>(i.close(),n(o.error)),s.oncomplete=()=>{null==l?i.close():l.oncomplete=()=>i.close()}},a.onerror=e=>n(a.error)}))}}const $h="/",Zh="tensorflowjs_models",Xh="info",Yh="model_topology",Qh="weight_specs",Jh="weight_data",ed="model_metadata";function td(e){return{info:[Zh,e,Xh].join($h),topology:[Zh,e,Yh].join($h),weightSpecs:[Zh,e,Qh].join($h),weightData:[Zh,e,Jh].join($h),modelMetadata:[Zh,e,ed].join($h)}}function nd(e){for(const t of Object.values(e))window.localStorage.removeItem(t)}function ad(e){const t=e.split($h);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join($h)}class id{constructor(e){if(!cr().getBool("IS_BROWSER")||"undefined"==typeof window||void 0===window.localStorage)throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,null==e||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=td(this.modelPath)}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet.");{const t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),a=zh(e),i=uh.join(e.weightData);try{this.LS.setItem(this.keys.info,JSON.stringify(a)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,function(e){if(Eh)return Buffer.from(e).toString("base64");const t=new Uint8Array(e);let n="";for(let e=0,a=t.length;e{return cr().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(id.URL_SCHEME)?(t=e.slice(id.URL_SCHEME.length),new id(t)):null;var t};Mh.registerSaveRouter(sd),Mh.registerLoadRouter(sd);class rd{constructor(){Ns(cr().getBool("IS_BROWSER"),(()=>"Current environment is not a web browser")),Ns("undefined"==typeof window||void 0!==window.localStorage,(()=>"Current browser does not appear to support localStorage")),this.LS=window.localStorage}async listModels(){const e={},t=Zh+$h,n=$h+Xh;for(let a=0;a"scheme must not be undefined or null.")),e.endsWith(od)&&(e=e.slice(0,e.indexOf(od))),Ns(e.length>0,(()=>"scheme must not be an empty string."));const n=ld.getInstance();Ns(null==n.managers[e],(()=>`A model store manager is already registered for scheme '${e}'.`)),n.managers[e]=t}static getManager(e){const t=ld.getInstance().managers[e];if(null==t)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(ld.getInstance().managers)}}function ud(e){if(-1===e.indexOf(od))throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ld.getSchemes().join(",")}`);return{scheme:e.split(od)[0],path:e.split(od)[1]}}async function cd(e,t,n=!1){Ns(e!==t,(()=>`Old path and new path are the same: '${e}'`));const a=Mh.getLoadHandlers(e);Ns(a.length>0,(()=>`Copying failed because no load handler is found for source URL ${e}.`)),Ns(a.length<2,(()=>`Copying failed because more than one (${a.length}) load handlers for source URL ${e}.`));const i=a[0],s=Mh.getSaveHandlers(t);Ns(s.length>0,(()=>`Copying failed because no save handler is found for destination URL ${t}.`)),Ns(s.length<2,(()=>`Copying failed because more than one (${a.length}) save handlers for destination URL ${t}.`));const r=s[0],o=ud(e).scheme,l=ud(e).path,u=o===ud(e).scheme,c=await i.load();n&&u&&await ld.getManager(o).removeModel(l);const h=await r.save(c);return n&&!u&&await ld.getManager(o).removeModel(l),h.modelArtifactsInfo}async function hd(){const e=ld.getSchemes(),t={};for(const n of e){const e=await ld.getManager(n).listModels();for(const a in e){t[n+od+a]=e[a]}}return t}async function dd(e){const t=ud(e);return ld.getManager(t.scheme).removeModel(t.path)}async function pd(e,t){return cd(e,t,!1)}async function md(e,t){return cd(e,t,!0)}class fd{constructor(){this.messageName="setTimeoutCustom",this.functionRefs=[],this.handledMessageCount=0,this.hasEventListener=!1}fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return null==this.textEncoder&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}setTimeoutCustom(e,t){"undefined"!=typeof window&&cr().getBool("USE_SETTIMEOUTCUSTOM")?(this.functionRefs.push(e),setTimeout((()=>{window.postMessage({name:this.messageName,index:this.functionRefs.length-1},"*")}),t),this.hasEventListener||(this.hasEventListener=!0,window.addEventListener("message",(e=>{if(e.source===window&&e.data.name===this.messageName){e.stopPropagation();(0,this.functionRefs[e.data.index])(),this.handledMessageCount++,this.handledMessageCount===this.functionRefs.length&&(this.functionRefs=[],this.handledMessageCount=0)}}),!0))):setTimeout(e,t)}isTypedArray(e){return Fu(e)}}if(cr().get("IS_BROWSER")){cr().setPlatform("browser",new fd);try{ld.registerManager(id.URL_SCHEME,new rd)}catch(e){}try{ld.registerManager(qh.URL_SCHEME,new Kh)}catch(e){}}const gd=()=>__webpack_require__(8273);let yd;class bd{constructor(){this.util=__webpack_require__(9830),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return null!=cr().global.fetch?cr().global.fetch(e,t):(null==yd&&(yd=gd()),yd(e,t))}now(){const e=process.hrtime();return 1e3*e[0]+e[1]/1e6}encode(e,t){if("utf-8"!==t&&"utf8"!==t)throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return 0===e.length?"":new this.util.TextDecoder(t).decode(e)}isTypedArray(e){return this.util.types.isFloat32Array(e)||this.util.types.isInt32Array(e)||this.util.types.isUint8Array(e)||this.util.types.isUint8ClampedArray(e)}}function vd(e,t="float32",n){return t=t||"float32",ar(e),new gc(e,t,n)}cr().get("IS_NODE")&&!cr().get("IS_BROWSER")&&cr().setPlatform("node",new bd);const kd=ih({cast_:function(e,t){const n=th(e,"x","cast");if(!function(e){return"bool"===e||"complex64"===e||"float32"===e||"int32"===e||"string"===e}(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if("string"===t&&"string"!==n.dtype||"string"!==t&&"string"===n.dtype)throw new Error("Only strings can be casted to strings");const a={x:n},i={dtype:t};return Hc.runKernel(Lr,a,i)}});const wd=ih({clone_:function(e){const t={x:th(e,"x","clone","string_or_numeric")};return Hc.runKernel(Ro,t)}});function Ad(e,t=!1){}qc();bc={buffer:vd,cast:kd,clone:wd,print:Ad};const xd=ih({add_:function(e,t){let n=th(e,"a","add"),a=th(t,"b","add");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(br,i)}});const Cd=ih({floorDiv_:function(e,t){let n=th(e,"a","floorDiv"),a=th(t,"b","floorDiv");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(So,i)}});const Sd=ih({div_:function(e,t){let n=th(e,"a","div"),a=th(t,"b","div");if([n,a]=Lc(n,a),"int32"===n.dtype&&"int32"===a.dtype)return Cd(n,a);const i={a:n,b:a};return Hc.runKernel(ho,i,{})}});const Ed=ih({mul_:function(e,t){let n=th(e,"a","mul"),a=th(t,"b","mul");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(ol,i)}});const _d=ih({sqrt_:function(e){const t={x:th(e,"x","sqrt","float32")};return Hc.runKernel(Kl,t)}});const Td=ih({square_:function(e){const t=th(e,"x","square");return Hc.runKernel("Square",{x:t},{})}});const Id=ih({zerosLike_:function(e){const t={x:th(e,"x","zerosLike")};return Hc.runKernel(ku,t)}});function Nd(e){return Hc.customGrad(e)}function Rd(e,t){if((ac(e)&&"string"!==t||Array.isArray(e))&&"complex64"!==t)throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if("string"===t&&ac(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return rh(e,[],[],t)}const Dd=new Map,zd=new Map;class Od{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}}class Md{constructor(){this.classNameMap={}}static getMap(){return null==Md.instance&&(Md.instance=new Md),Md.instance}static register(e){Md.getMap().classNameMap[e.className]=[e,e.fromConfig]}}function Bd(e,t,n){Ns(null!=e.className,(()=>"Class being registered does not have the static className property defined.")),Ns("string"==typeof e.className,(()=>"className is required to be a string, but got type "+typeof e.className)),Ns(e.className.length>0,(()=>"Class being registered has an empty-string as its className, which is disallowed.")),void 0===t&&(t="Custom"),void 0===n&&(n=e.className);const a=t+">"+n;return Md.register(e),Dd.set(a,e),zd.set(e,a),e}class Fd extends Od{minimize(e,t=!1,n){const{value:a,grads:i}=this.computeGradients(e,n);if(null!=n){const e=n.map((e=>({name:e.name,tensor:i[e.name]})));this.applyGradients(e)}else this.applyGradients(i);return ph(i),t?a:(a.dispose(),null)}get iterations(){return null==this.iterations_&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return function(e,t){Ns(Zs(e),(()=>"The f passed in variableGrads(f) must be a function")),Ns(null==t||Array.isArray(t)&&t.every((e=>e instanceof Ac)),(()=>"The varList passed in variableGrads(f, varList) must be an array of variables"));const n=null!=t;if(!n){t=[];for(const e in Hc.registeredVariables)t.push(Hc.registeredVariables[e])}const a=n?t.filter((e=>!e.trainable)):null,i=t.length;Ns((t=t.filter((e=>e.trainable))).length>0,(()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${i} variables is trainable.`));const{value:s,grads:r}=Hc.gradients(e,t,null,!0);Ns(r.some((e=>null!=e)),(()=>"Cannot find a connection between any variable and the result of the loss function y=f(x). Please make sure the operations that use variables are inside the function f passed to minimize().")),Ns(0===s.rank,(()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${s.rank} tensor`));const o={};return t.forEach(((e,t)=>{null!=r[t]&&(o[e.name]=r[t])})),null!=a&&a.forEach((e=>o[e.name]=null)),{value:s,grads:o}}(e,t)}dispose(){null!=this.iterations_&&ph(this.iterations_)}async saveIterations(){return null==this.iterations_&&(this.iterations_=0),{name:"iter",tensor:Rd(this.iterations_,"int32")}}async getWeights(){throw new Error("getWeights() is not implemented for this optimizer yet.")}async setWeights(e){throw new Error(`setWeights() is not implemented for this optimizer class ${this.getClassName()}`)}async extractIterations(e){return this.iterations_=(await e[0].tensor.data())[0],e.slice(1)}}Object.defineProperty(Fd,Symbol.hasInstance,{value:e=>null!=e.minimize&&null!=e.computeGradients&&null!=e.applyGradients});class Ld extends Fd{static get className(){return"Adadelta"}constructor(e,t,n=null){super(),this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],null==n&&(this.epsilon=Hc.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t],i=!1;null==this.accumulatedGrads[n]&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:dh((()=>Id(a).variable(i)))}),null==this.accumulatedUpdates[n]&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:dh((()=>Id(a).variable(i)))});const s=Array.isArray(e)?e[n].tensor:e[t];if(null==s)return;const r=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;dh((()=>{const e=xd(Ed(r,this.rho),Ed(Td(s),1-this.rho)),t=Ed(Sd(_d(xd(o,this.epsilon)),_d(xd(r,this.epsilon))),s),n=xd(Ed(o,this.rho),Ed(Td(t),1-this.rho));r.assign(e),o.assign(n);const i=xd(Ed(t,-this.learningRate),a);a.assign(i)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedUpdates&&(ph(this.accumulatedGrads.map((e=>e.variable))),ph(this.accumulatedUpdates.map((e=>e.variable))))}async getWeights(){const e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){const t=(e=await this.extractIterations(e)).length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedUpdates=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,rho:this.rho,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.rho,t.epsilon)}}function Pd(e,t,n){ar(e);const a={shape:e,value:t,dtype:n=n||$s(t)};return Hc.runKernel(Ao,{},a)}class jd extends Fd{static get className(){return"Adagrad"}constructor(e,t=.1){super(),this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t];if(null==this.accumulatedGrads[n]){const e=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:dh((()=>Pd(a.shape,this.initialAccumulatorValue).variable(e)))}}const i=Array.isArray(e)?e[n].tensor:e[t];if(null==i)return;const s=this.accumulatedGrads[n].variable;dh((()=>{const e=xd(s,Td(i));s.assign(e);const t=xd(Ed(Sd(i,_d(xd(e,Hc.backend.epsilon()))),-this.learningRate),a);a.assign(t)}))})),this.incrementIterations()}dispose(){null!=this.accumulatedGrads&&ph(this.accumulatedGrads.map((e=>e.variable)))}async getWeights(){return[await this.saveIterations()].concat(this.accumulatedGrads.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulatedGrads=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}}const Vd=ih({pow_:function(e,t){let n=th(e,"base","pow"),a=th(t,"exp","pow");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(yl,i)}});const Ud=ih({sub_:function(e,t){let n=th(e,"a","sub"),a=th(t,"b","sub");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(cu,i)}});class Wd extends Fd{static get className(){return"Adam"}constructor(e,t,n,a=null){super(),this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=a,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],dh((()=>{this.accBeta1=Rd(t).variable(),this.accBeta2=Rd(n).variable()})),null==a&&(this.epsilon=Hc.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);dh((()=>{const n=Ud(1,this.accBeta1),a=Ud(1,this.accBeta2);t.forEach(((t,i)=>{const s=Hc.registeredVariables[t],r=!1;null==this.accumulatedFirstMoment[i]&&(this.accumulatedFirstMoment[i]={originalName:`${t}/m`,variable:dh((()=>Id(s).variable(r)))}),null==this.accumulatedSecondMoment[i]&&(this.accumulatedSecondMoment[i]={originalName:`${t}/v`,variable:dh((()=>Id(s).variable(r)))});const o=Array.isArray(e)?e[i].tensor:e[t];if(null==o)return;const l=this.accumulatedFirstMoment[i].variable,u=this.accumulatedSecondMoment[i].variable,c=xd(Ed(l,this.beta1),Ed(o,1-this.beta1)),h=xd(Ed(u,this.beta2),Ed(Td(o),1-this.beta2)),d=Sd(c,n),p=Sd(h,a);l.assign(c),u.assign(h);const m=xd(Ed(Sd(d,xd(_d(p),this.epsilon)),-this.learningRate),s);s.assign(m)})),this.accBeta1.assign(Ed(this.accBeta1,this.beta1)),this.accBeta2.assign(Ed(this.accBeta2,this.beta2))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),null!=this.accumulatedFirstMoment&&ph(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedSecondMoment&&ph(this.accumulatedSecondMoment.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e),dh((()=>{this.accBeta1.assign(Vd(this.beta1,this.iterations_+1)),this.accBeta2.assign(Vd(this.beta2,this.iterations_+1))}));const t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedSecondMoment=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)})))}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon)}}const Gd=ih({abs_:function(e){const t=th(e,"x","abs");if("complex64"===t.dtype){const e={x:t};return Hc.runKernel(Ur,e)}{const e={x:t};return Hc.runKernel(fr,e)}}});function qd(e,t){const n=e.length,a=[];for(let i=0;i1&&1===r&&a.unshift(s)}return a}function Hd(e,t){const n=[];for(let a=0;a1)&&n.unshift(s)}return n}function Kd(e,t){const n=Math.max(e.length,t.length),a=new Array(n);for(let i=0;i{this.iteration=Rd(0).variable(),this.accBeta1=Rd(t).variable()})),null==a&&(this.epsilon=Hc.backend.epsilon())}applyGradients(e){const t=Array.isArray(e)?e.map((e=>e.name)):Object.keys(e);dh((()=>{const n=Ud(1,this.accBeta1),a=Sd(-this.learningRate,xd(Ed(this.iteration,this.decay),1));t.forEach(((t,i)=>{const s=Hc.registeredVariables[t],r=!1;null==this.accumulatedFirstMoment[i]&&(this.accumulatedFirstMoment[i]={originalName:`${t}/m`,variable:Id(s).variable(r)}),null==this.accumulatedWeightedInfNorm[i]&&(this.accumulatedWeightedInfNorm[i]={originalName:`${t}/v`,variable:Id(s).variable(r)});const o=Array.isArray(e)?e[i].tensor:e[t];if(null==o)return;const l=this.accumulatedFirstMoment[i].variable,u=this.accumulatedWeightedInfNorm[i].variable,c=xd(Ed(l,this.beta1),Ed(o,1-this.beta1)),h=Ed(u,this.beta2),d=Gd(o),p=$d(h,d);l.assign(c),u.assign(p);const m=xd(Ed(Sd(a,n),Sd(c,xd(p,this.epsilon))),s);s.assign(m)})),this.iteration.assign(xd(this.iteration,1)),this.accBeta1.assign(Ed(this.accBeta1,this.beta1))})),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),null!=this.accumulatedFirstMoment&&ph(this.accumulatedFirstMoment.map((e=>e.variable))),null!=this.accumulatedWeightedInfNorm&&ph(this.accumulatedWeightedInfNorm.map((e=>e.variable)))}async getWeights(){throw new Error("getWeights() is not implemented for Adamax yet.")}async setWeights(e){throw new Error("setWeights() is not implemented for Adamax yet.")}getConfig(){return{learningRate:this.learningRate,beta1:this.beta1,beta2:this.beta2,epsilon:this.epsilon,decay:this.decay}}static fromConfig(e,t){return new e(t.learningRate,t.beta1,t.beta2,t.epsilon,t.decay)}}class Xd extends Fd{static get className(){return"SGD"}constructor(e){super(),this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Array.isArray(e)?e[n].tensor:e[t];if(null==a)return;const i=Hc.registeredVariables[t];dh((()=>{const e=xd(Ed(this.c,a),i);i.assign(e)}))})),this.incrementIterations()}setLearningRate(e){this.learningRate=e,null!=this.c&&this.c.dispose(),this.c=mh(Rd(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(0!==(e=await this.extractIterations(e)).length)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}}class Yd extends Xd{static get className(){return"Momentum"}constructor(e,t,n=!1){super(e),this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=Rd(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t];if(null==this.accumulations[n]){const e=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:dh((()=>Id(a).variable(e)))}}const i=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];null!=s&&dh((()=>{let e;const t=xd(Ed(this.m,i),s);e=this.useNesterov?xd(Ed(this.c,xd(s,Ed(t,this.m))),a):xd(Ed(this.c,t),a),i.assign(t),a.assign(e)}))})),this.incrementIterations()}dispose(){this.m.dispose(),null!=this.accumulations&&ph(this.accumulations.map((e=>e.variable)))}setMomentum(e){this.momentum=e}async getWeights(){return[await this.saveIterations()].concat(this.accumulations.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);this.accumulations=e.map((e=>({originalName:e.name,variable:e.tensor.variable(false)})))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}}class Qd extends Fd{static get className(){return"RMSProp"}constructor(e,t=.9,n=0,a=null,i=!1){if(super(),this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=a,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=i,null==a&&(this.epsilon=Hc.backend.epsilon()),null==e)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map((e=>e.name)):Object.keys(e)).forEach(((t,n)=>{const a=Hc.registeredVariables[t],i=!1;null==this.accumulatedMeanSquares[n]&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:dh((()=>Id(a).variable(i)))}),null==this.accumulatedMoments[n]&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:dh((()=>Id(a).variable(i)))}),null==this.accumulatedMeanGrads[n]&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:dh((()=>Id(a).variable(i)))});const s=Array.isArray(e)?e[n].tensor:e[t];if(null==s)return;const r=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;dh((()=>{const e=xd(Ed(r,this.decay),Ed(Td(s),1-this.decay));if(this.centered){const t=this.accumulatedMeanGrads[n].variable,i=xd(Ed(t,this.decay),Ed(s,1-this.decay)),l=Sd(Ed(s,this.learningRate),_d(Ud(e,xd(Td(i),this.epsilon)))),u=xd(Ed(o,this.momentum),l);r.assign(e),t.assign(i),o.assign(u);const c=Ud(a,u);a.assign(c)}else{const e=xd(Ed(r,this.decay),Ed(Td(s),1-this.decay)),t=xd(Ed(o,this.momentum),Sd(Ed(s,this.learningRate),_d(xd(e,this.epsilon))));r.assign(e),o.assign(t);const n=Ud(a,t);a.assign(n)}}))})),this.incrementIterations()}dispose(){null!=this.accumulatedMeanSquares&&ph(this.accumulatedMeanSquares.map((e=>e.variable))),null!=this.accumulatedMeanGrads&&this.centered&&ph(this.accumulatedMeanGrads.map((e=>e.variable))),null!=this.accumulatedMoments&&ph(this.accumulatedMoments.map((e=>e.variable)))}async getWeights(){const e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map((e=>({name:e.originalName,tensor:e.variable}))))}async setWeights(e){e=await this.extractIterations(e);const t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.accumulatedMoments=e.slice(t,2*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))),this.centered&&(this.accumulatedMeanGrads=e.slice(2*t,3*t).map((e=>({originalName:e.name,variable:e.tensor.variable(n)}))))}getConfig(){return{learningRate:this.learningRate,decay:this.decay,momentum:this.momentum,epsilon:this.epsilon,centered:this.centered}}static fromConfig(e,t){return new e(t.learningRate,t.decay,t.momentum,t.epsilon,t.centered)}}const Jd=[Ld,jd,Wd,Zd,Yd,Qd,Xd];function ep(e){return new Promise((e=>setTimeout(e))).then(e)}class tp{constructor(e){if(!cr().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(tp.URL_SCHEME)&&(e=e.slice(tp.URL_SCHEME.length)),null!=e&&0!==e.length||(e="model"),this.modelJsonFileName=e+".json",this.weightDataFileName=e+".weights.bin"}async save(e){if("undefined"==typeof document)throw new Error("Browser downloads are not supported in this environment since `document` is not present");const t=uh.join(e.weightData),n=window.URL.createObjectURL(new Blob([t],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{const t=Nh(e,[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}]),a=window.URL.createObjectURL(new Blob([JSON.stringify(t)],{type:"application/json"})),i=null==this.modelJsonAnchor?document.createElement("a"):this.modelJsonAnchor;if(i.download=this.modelJsonFileName,i.href=a,await ep((()=>i.dispatchEvent(new MouseEvent("click")))),null!=e.weightData){const e=null==this.weightDataAnchor?document.createElement("a"):this.weightDataAnchor;e.download=this.weightDataFileName,e.href=n,await ep((()=>e.dispatchEvent(new MouseEvent("click"))))}return{modelArtifactsInfo:zh(e)}}}}tp.URL_SCHEME="downloads://";class np{constructor(e){if(null==e||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.jsonFile=e[0],this.weightsFiles=e.slice(1)}async load(){return new Promise(((e,t)=>{const n=new FileReader;n.onload=n=>{const a=JSON.parse(n.target.result),i=a.modelTopology;if(null==i)return void t(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));if(null==a.weightsManifest)return void t(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));if(0===this.weightsFiles.length)return void e({modelTopology:i});const s=Dh(a,(e=>this.loadWeights(e)));e(s)},n.onerror=e=>t(`Failed to read model topology and weights manifest JSON from file '${this.jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),n.readAsText(this.jsonFile)}))}loadWeights(e){const t=[],n=[];for(const a of e)t.push(...a.weights),n.push(...a.paths);const a=this.checkManifestAndWeightFiles(e),i=n.map((e=>this.loadWeightsFile(e,a[e])));return Promise.all(i).then((e=>[t,e]))}loadWeightsFile(e,t){return new Promise(((n,a)=>{const i=new FileReader;i.onload=e=>{const t=e.target.result;n(t)},i.onerror=t=>a(`Failed to weights data from file of path '${e}'.`),i.readAsArrayBuffer(t)}))}checkManifestAndWeightFiles(e){const t=[],n=this.weightsFiles.map((e=>Ih(e.name))),a={};for(const i of e)i.paths.forEach((e=>{const i=Ih(e);if(-1!==t.indexOf(i))throw new Error(`Duplicate file basename found in weights manifest: '${i}'`);if(t.push(i),-1===n.indexOf(i))throw new Error(`Weight file with basename '${i}' is not provided.`);a[e]=this.weightsFiles[n.indexOf(i)]}));if(t.length!==this.weightsFiles.length)throw new Error(`Mismatch in the number of files in weights manifest (${t.length}) and the number of weight files provided (${this.weightsFiles.length}).`);return a}}function ap(e){return new np(e)}function ip(e,t,n,a){!function(e){Ns(null!=e&&Array.isArray(e)&&e.length>0,(()=>"promises must be a none empty array"))}(e),function(e,t){Ns(e>=0&&e<=1,(()=>`Progress fraction must be in range [0, 1], but got startFraction ${e}`)),Ns(t>=0&&t<=1,(()=>`Progress fraction must be in range [0, 1], but got endFraction ${t}`)),Ns(t>=e,(()=>`startFraction must be no more than endFraction, but got startFraction ${e} and endFraction ${t}`))}(n=null==n?0:n,a=null==a?1:a);let i=0;return Promise.all(e.map((s=>(s.then((s=>{const r=n+ ++i/e.length*(a-n);return t(r),s})),s))))}async function sp(e,t){null==t&&(t={});const n=null==t.fetchFunc?cr().platform.fetch:t.fetchFunc,a=e.map((e=>n(e,t.requestInit,{isBinary:!0}))),i=(null==t.onProgress?await Promise.all(a):await ip(a,t.onProgress,0,.5)).map((e=>e.arrayBuffer()));return null==t.onProgress?await Promise.all(i):await ip(i,t.onProgress,.5,1)}async function rp(e,t="",n,a){return op((e=>sp(e,{requestInit:a})))(e,t,n)}function op(e){return async(t,n="",a)=>{const i=t.map((()=>!1)),s={},r=null!=a?a.map((()=>!1)):[],o=[];if(t.forEach(((e,t)=>{let n=0;e.weights.forEach((e=>{const l="quantization"in e?e.quantization.dtype:e.dtype,u=lh[l]*zs(e.shape),c=()=>{i[t]=!0,null==s[t]&&(s[t]=[]),s[t].push({manifestEntry:e,groupOffset:n,sizeBytes:u})};null!=a?a.forEach(((t,n)=>{t===e.name&&(c(),r[n]=!0)})):c(),o.push(e.name),n+=u}))})),!r.every((e=>e))){const e=a.filter(((e,t)=>!r[t]));throw new Error(`Could not find weights in manifest with names: ${e.join(", ")}. \nManifest JSON has weights with names: ${o.join(", ")}.`)}const l=i.reduce(((e,t,n)=>(t&&e.push(n),e)),[]),u=[];l.forEach((e=>{t[e].paths.forEach((e=>{const t=n+(n.endsWith("/")?"":"/")+e;u.push(t)}))}));const c=await e(u),h={};let d=0;return l.forEach((e=>{const n=t[e].paths.length,a=new uh(c.slice(d,d+n));s[e].forEach((e=>{const t=vh(a.slice(e.groupOffset,e.groupOffset+e.sizeBytes),[e.manifestEntry]);for(const e in t)h[e]=t[e]})),d+=n})),h}}Mh.registerSaveRouter((e=>cr().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(tp.URL_SCHEME)?function(e="model"){return new tp(e)}(e.slice(tp.URL_SCHEME.length)):null));class lp{constructor(e,t){if(this.DEFAULT_METHOD="POST",null==t&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.weightUrlConverter=t.weightUrlConverter,null!=t.fetchFunc?(Ns("function"==typeof t.fetchFunc,(()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)")),this.fetch=t.fetchFunc):this.fetch=cr().platform.fetch,Ns(null!=e&&e.length>0,(()=>"URL path for http must not be null, undefined or empty.")),Array.isArray(e)&&Ns(2===e.length,(()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`)),this.path=e,null!=t.requestInit&&null!=t.requestInit.body)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{},this.loadOptions=t}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");const t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;const n=Nh(e,[{paths:["./model.weights.bin"],weights:e.weightSpecs}]);if(t.body.append("model.json",new Blob([JSON.stringify(n)],{type:"application/json"}),"model.json"),null!=e.weightData){const n=uh.join(e.weightData);t.body.append("model.weights.bin",new Blob([n],{type:"application/octet-stream"}),"model.weights.bin")}const a=await this.fetch(this.path,t);if(a.ok)return{modelArtifactsInfo:zh(e),responses:[a]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${a.status}.`)}async loadModelJSON(){const e=await this.fetch(this.path,this.requestInit);if(!e.ok)throw new Error(`Request to ${this.path} failed with status code ${e.status}. Please verify this URL points to the model JSON of the model to load.`);let t;try{t=await e.json()}catch(e){let t=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?t+=" Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository.":t+=" Please make sure the server is serving valid JSON for this request.",new Error(t)}const n=t.modelTopology,a=t.weightsManifest;if(null==n&&null==a)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);return t}async load(){if(this.loadOptions.streamWeights)return this.loadStream();return Dh(await this.loadModelJSON(),(e=>this.loadWeights(e)))}async loadStream(){const e=await this.loadModelJSON(),t=await this.getWeightUrls(e.weightsManifest),n=Oh(e.weightsManifest);return Object.assign(Object.assign({},e),{weightSpecs:n,getWeightStream:()=>function(e,t){var n;const a=null==t.fetchFunc?cr().platform.fetch:t.fetchFunc;let i,s=0;return null===(n=t.onProgress)||void 0===n||n.call(t,0),new ReadableStream({pull:async n=>{for(var r;st?e.substring(n):"";return[a+"/",i]}(t),i=this.weightPathPrefix||n,s=[],r=[];for(const t of e)for(const e of t.paths)null!=this.weightUrlConverter?r.push(this.weightUrlConverter(e)):s.push(i+e+a);return this.weightUrlConverter&&s.push(...await Promise.all(r)),s}async loadWeights(e){const t=await this.getWeightUrls(e);return[Oh(e),await sp(t,this.loadOptions)]}}function up(e){return null!=e.match(lp.URL_SCHEME_REGEX)}lp.URL_SCHEME_REGEX=/^https?:\/\//;const cp=(e,t)=>{if("undefined"==typeof fetch&&(null==t||null==t.fetchFunc))return null;{let n=!0;if(n=Array.isArray(e)?e.every((e=>up(e))):up(e),n)return hp(e,t)}return null};function hp(e,t){return new lp(e,t)}function dp(e,t){return hp(e,t)}Mh.registerSaveRouter(cp),Mh.registerLoadRouter(cp);class pp{constructor(e){this.modelArtifacts=e}load(){return this.modelArtifacts}}class mp{constructor(e){this.saveHandler=e}save(e){return this.saveHandler(e)}}class fp{constructor(e){e.load&&(this.load=()=>Promise.resolve(e.load())),e.save&&(this.save=t=>Promise.resolve(e.save(t)))}}function gp(e,t,n,a){return new fp(yp(...arguments))}function yp(e,t,n,a){if(1===arguments.length){const t=null!=e.modelTopology||null!=e.weightSpecs;return new pp(t?e:{modelTopology:e})}return new pp({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:a})}function bp(e){return new mp(e)}function vp(e){return new mp(e)}function kp(e,t,n){if(Ds(e),null!=t&&3!==t.length)throw new Error("tensor3d() requires shape to have three numbers");const a=Qc(e,n);if(3!==a.length&&1!==a.length)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return rh(e,t,a,n)}let wp,Ap=!1;function xp(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(null==e)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,a=!1,i=!1,s=!1,r=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if("undefined"!=typeof ImageData&&e instanceof ImageData)a=!0;else if("undefined"!=typeof HTMLVideoElement&&e instanceof HTMLVideoElement)i=!0;else if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)s=!0;else if(null!=e.getContext)r=!0;else{if(!("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap))throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);o=!0}if(null!=Ru(Au,Hc.backendName)){const n={pixels:e},a={numChannels:t};return Hc.runKernel(Au,n,a)}const[l,u]=i?[e.videoWidth,e.videoHeight]:[e.width,e.height];let c,h;if(r)c=e.getContext("2d").getImageData(0,0,l,u).data;else if(a||n)c=e.data;else if(s||i||o){if(null==wp)if("undefined"==typeof document){if("undefined"==typeof OffscreenCanvas||"undefined"==typeof OffscreenCanvasRenderingContext2D)throw new Error("Cannot parse input in current context. Reason: OffscreenCanvas Context2D rendering is not supported.");wp=new OffscreenCanvas(1,1).getContext("2d")}else wp=document.createElement("canvas").getContext("2d",{willReadFrequently:!0});wp.canvas.width=l,wp.canvas.height=u,wp.drawImage(e,0,0,l,u),c=wp.getImageData(0,0,l,u).data}if(4===t)h=new Int32Array(c);else{const e=l*u;h=new Int32Array(e*t);for(let n=0;n4||2===t)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${t}`);if("float32"!==e.dtype&&"int32"!==e.dtype)throw new Error(`Unsupported type for toPixels: ${e.dtype}. Please use float32 or int32 tensors.`)}async function Sp(e,t){let n=th(e,"img","toPixels");if(!(e instanceof kc)){const e=n;n=kd(e,"int32"),e.dispose()}Cp(n);const[a,i]=n.shape.slice(0,2),s=2===n.rank?1:n.shape[2],r=await n.data(),o="float32"===n.dtype?255:1,l=new Uint8ClampedArray(i*a*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${i}.`)}else if("int32"===n.dtype&&(i<0||i>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${i}.`);1===s?(t[0]=i*o,t[1]=i*o,t[2]=i*o):t[a]=i*o}const a=4*e;l[a+0]=Math.round(t[0]),l[a+1]=Math.round(t[1]),l[a+2]=Math.round(t[2]),l[a+3]=Math.round(t[3])}if(null!=t){if(!Ap){null!=Ru(co,Hc.backendName)&&(Ap=!0)}t.width=i,t.height=a;const e=t.getContext("2d"),n=new ImageData(l,i,a);e.putImageData(n,0,0)}return n!==e&&n.dispose(),l}const Ep=ih({fromPixels_:xp}),_p=-2,Tp=-1;function Ip(e,t,n){const a=e.shape.length;Ns(a===t.length,(()=>`Error in slice${a}D: Length of begin ${t} must match the rank of the array (${a}).`)),Ns(a===n.length,(()=>`Error in slice${a}D: Length of size ${n} must match the rank of the array (${a}).`));for(let i=0;i`Error in slice${a}D: begin[${i}] + size[${i}] (${t[i]+n[i]}) would overflow input.shape[${i}] (${e.shape[i]})`))}function Np(e){const t=[];let n=0;for(;e>0;)1&e&&t.push(n),e/=2,n++;return t}function Rp(e,t,n){const a=[];for(let i=0;i0){const l=t[0],u=n+1;c=Bp(r,l,u,a,e),h=Fp(o,l,u,i,e),d=Dp(s,l,u,e)}else for(let t=0;t-1)s[i]=0;else{const r=zp(t,n,i);let o=a[r];e&1<-1)s[i]=Number.MAX_SAFE_INTEGER;else{const r=zp(t,n,i);let o=a[r];e&1<0?Number.MIN_SAFE_INTEGER:Number.MAX_SAFE_INTEGER);const l=a[i];return r<0&&(r+=l),r=_s(0,r,l-1),r}function jp(e,t,n,a,i,s){let r=t[i];const o=n[i]||1;(e&1<0?Number.MAX_SAFE_INTEGER:Number.MIN_SAFE_INTEGER);const l=a[i];return r<0&&(r+=l),r=o>0?_s(0,r,l):_s(-1,r,l-1),r}function Vp(e,t,n){let a=n.length;for(let e=0;e1){a=e;break}for(let i=a+1;i0||n[i]!==e[i])return!1;return!0}function Up(e,t){let n=e.length>0?e[e.length-1]:1;for(let a=0;a{Ns(-1!==e,(()=>"slice() does not support negative begin indexing."))})),s=null==n?new Array(i).fill(-1):"number"==typeof n?[n,...new Array(i-1).fill(-1)]:n.lengtht>=0?t:(Ns(-1===t,(()=>`Negative size values should be exactly -1 but got ${t} for the slice() size at index ${n}.`)),e.shape[n]-a[n]))),[a,s]}function Gp(e,t,n,a,i,s,r,o,l){let u;if(null==a?(u=new Array(t.length),u.fill(1)):u=a,null!=r&&r&r-1)throw new Error("Multiple ellipses in slice is not allowed.");let c=!1;const h={dims:u.length,numAddAxisAfterEllipsis:0,begin:t.slice(),end:n.slice(),strides:u.slice(),beginMask:i,endMask:s,ellipsisMask:r,newAxisMask:o,shrinkAxisMask:l};for(let e=0;e0?0:-1,d.strides[t]>0?a:a-1];if(n&&d.strides[t]<=0)throw Error("only stride 1 allowed on non-range indexing.");f=f&&1===d.strides[t];const r=!!(d.beginMask&1<=a)throw Error(`slice index ${d.begin[t]} of dimension ${t} out of bounds.`)}else d.begin[t]=qp(d.begin[t],0,d.strides[t],a,i,s),d.end[t]=qp(d.end[t],1,d.strides[t],a,i,s);const e=1===d.strides[t]&&0===d.begin[t]&&d.end[t]===a;p=p&&e,m=m&&(0===t&&1===d.strides[t]||e)}else p=p&&1===d.strides[t]&&r,m=m&&(0===t&&1===d.strides[t]||r);let o,l=!1;if(d.beginValid&&d.endValid?(o=d.end[t]-d.begin[t],l=!0):n?(o=1,l=!0):r&&a>=0&&(o=d.strides[t]<0?-a:a,l=!0),l){let e;e=0===o||o<0!=d.strides[t]<0?0:Math.trunc(o/d.strides[t])+(o%d.strides[t]!=0?1:0),g.push(e)}else g.push(-1)}for(let e=0;e=0?y.push(g[t]):t===_p&&y.push(1)}return{finalShapeSparse:y.filter(((e,t)=>d.finalShapeGatherIndices[t]!==_p)),finalShape:y,isIdentity:p,sliceDim0:m,isSimpleSlice:f,begin:d.begin,end:d.end,strides:d.strides}}function qp(e,t,n,a,i,s){if(i[t])return n>0?s[t]:s[t+1&1];{const t=e<0?a+e:e;return ts[1]?s[1]:t}}const Hp=ih({acos_:function(e){const t={x:th(e,"x","acos")};return Hc.runKernel(gr,t)}});const Kp=ih({acosh_:function(e){const t={x:th(e,"x","acosh")};return Hc.runKernel(yr,t)}});const $p=ih({addN_:function(e){Ns(Array.isArray(e),(()=>"The argument passed to tf.addN() must be a list of tensors")),Ns(e.length>=1,(()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`));const t=e.map(((e,t)=>th(e,`tensors${t}`,"addN"))),n=t[0];t.forEach((e=>{if(e.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")})),t.forEach((e=>{if(!Os(e.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")}));const a=t;return Hc.runKernel(vr,a)}});const Zp=ih({all_:function(e,t=null,n=!1){const a={x:th(e,"x","all","bool")},i={axis:t,keepDims:n};return Hc.runKernel(kr,a,i)}});const Xp=ih({any_:function(e,t=null,n=!1){const a={x:th(e,"x","any","bool")},i={axis:t,keepDims:n};return Hc.runKernel(wr,a,i)}});const Yp=ih({argMax_:function(e,t=0){const n={x:th(e,"x","argMax")},a={axis:t};return Hc.runKernel(Ar,n,a)}});const Qp=ih({argMin_:function(e,t=0){const n={x:th(e,"x","argMin")},a={axis:t};return Hc.runKernel(xr,n,a)}});const Jp=ih({asin_:function(e){const t={x:th(e,"x","asin")};return Hc.runKernel(Cr,t)}});const em=ih({asinh_:function(e){const t={x:th(e,"x","asinh")};return Hc.runKernel(Sr,t)}});const tm=ih({atan_:function(e){const t={x:th(e,"x","atan")};return Hc.runKernel(Er,t)}});const nm=ih({atan2_:function(e,t){let n=th(e,"a","atan2"),a=th(t,"b","atan2");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(Tr,i)}});const am=ih({atanh_:function(e){const t={x:th(e,"x","atanh")};return Hc.runKernel(_r,t)}});function im(e,t,n,a,i="NHWC",s){return om(e,[...t,e[3]],n,s,a,null,null,ym(i))}function sm(e,t,n,a,i,s,r="channelsLast"){const[o,l]=cm(t);let u;if("channelsLast"===r)u=[o,l,e[3],e[3]];else{if("channelsFirst"!==r)throw new Error(`Unknown dataFormat ${r}`);u=[o,l,e[1],e[1]]}return om(e,u,n,a,i,s,!1,r)}function rm(e,t,n,a,i,s,r="NDHWC"){const[o,l,u]=hm(t);let c,h;if("NDHWC"===r)h="channelsLast",c=[o,l,u,e[4],e[4]];else{if("NCDHW"!==r)throw new Error(`Unknown dataFormat ${r}`);h="channelsFirst",c=[o,l,u,e[1],e[1]]}return lm(e,c,n,a,i,!1,h,s)}function om(e,t,n,a,i,s,r=!1,o="channelsLast"){let[l,u,c,h]=[-1,-1,-1,-1];if("channelsLast"===o)[l,u,c,h]=e;else{if("channelsFirst"!==o)throw new Error(`Unknown dataFormat ${o}`);[l,h,u,c]=e}const[d,p,,m]=t,[f,g]=cm(n),[y,b]=cm(a),v=dm(d,y),k=dm(p,b),{padInfo:w,outHeight:A,outWidth:x}=function(e,t,n,a,i,s,r,o,l){let u,c,h;if("number"==typeof e){u={top:e,bottom:e,left:e,right:e,type:0===e?"VALID":"NUMBER"};const i=function(e,t,n,a,i){null==a&&(a=um(e,t,n));const s=e[0],r=e[1],o=pm((s-t+2*a)/n+1,i),l=pm((r-t+2*a)/n+1,i);return[o,l]}([t,n],s,a,e,o);c=i[0],h=i[1]}else if("same"===e){c=Math.ceil(t/a),h=Math.ceil(n/i);const e=Math.max(0,(c-1)*a+s-t),o=Math.max(0,(h-1)*i+r-n),l=Math.floor(e/2),d=e-l,p=Math.floor(o/2);u={top:l,bottom:d,left:p,right:o-p,type:"SAME"}}else if("valid"===e)u={top:0,bottom:0,left:0,right:0,type:"VALID"},c=Math.ceil((t-s+1)/a),h=Math.ceil((n-r+1)/i);else{if("object"!=typeof e)throw Error(`Unknown padding parameter: ${e}`);{const d="channelsLast"===l?e[1][0]:e[2][0],p="channelsLast"===l?e[1][1]:e[2][1],m="channelsLast"===l?e[2][0]:e[3][0],f="channelsLast"===l?e[2][1]:e[3][1];u={top:d,bottom:p,left:m,right:f,type:0===d&&0===p&&0===m&&0===f?"VALID":"EXPLICIT"},c=pm((t-s+d+p)/a+1,o),h=pm((n-r+m+f)/i+1,o)}}return{padInfo:u,outHeight:c,outWidth:h}}(i,u,c,f,g,v,k,s,o),C=r?m*h:m;let S;return"channelsFirst"===o?S=[l,C,A,x]:"channelsLast"===o&&(S=[l,A,x,C]),{batchSize:l,dataFormat:o,inHeight:u,inWidth:c,inChannels:h,outHeight:A,outWidth:x,outChannels:C,padInfo:w,strideHeight:f,strideWidth:g,filterHeight:d,filterWidth:p,effectiveFilterHeight:v,effectiveFilterWidth:k,dilationHeight:y,dilationWidth:b,inShape:e,outShape:S,filterShape:t}}function lm(e,t,n,a,i,s=!1,r="channelsLast",o){let[l,u,c,h,d]=[-1,-1,-1,-1,-1];if("channelsLast"===r)[l,u,c,h,d]=e;else{if("channelsFirst"!==r)throw new Error(`Unknown dataFormat ${r}`);[l,d,u,c,h]=e}const[p,m,f,,g]=t,[y,b,v]=hm(n),[k,w,A]=hm(a),x=dm(p,k),C=dm(m,w),S=dm(f,A),{padInfo:E,outDepth:_,outHeight:T,outWidth:I}=function(e,t,n,a,i,s,r,o,l,u,c){let h,d,p,m;"valid"===e&&(e=0);if("number"==typeof e){h={top:e,bottom:e,left:e,right:e,front:e,back:e,type:0===e?"VALID":"NUMBER"};const f=function(e,t,n,a,i,s){null==i&&(i=um(e,t[0],a[0]));const r=[0,0,0,n];for(let n=0;n<3;n++)e[n]+2*i>=t[n]&&(r[n]=pm((e[n]-t[n]+2*i)/a[n]+1,s));return r}([t,n,a,1],[o,l,u],1,[i,s,r],e,c);d=f[0],p=f[1],m=f[2]}else{if("same"!==e)throw Error(`Unknown padding parameter: ${e}`);{d=Math.ceil(t/i),p=Math.ceil(n/s),m=Math.ceil(a/r);const e=(d-1)*i+o-t,c=(p-1)*s+l-n,f=(m-1)*r+u-a,g=Math.floor(e/2),y=e-g,b=Math.floor(c/2),v=c-b,k=Math.floor(f/2);h={top:b,bottom:v,left:k,right:f-k,front:g,back:y,type:"SAME"}}}return{padInfo:h,outDepth:d,outHeight:p,outWidth:m}}(i,u,c,h,y,b,v,x,C,S,o),N=s?g*d:g;let R;return"channelsFirst"===r?R=[l,N,_,T,I]:"channelsLast"===r&&(R=[l,_,T,I,N]),{batchSize:l,dataFormat:r,inDepth:u,inHeight:c,inWidth:h,inChannels:d,outDepth:_,outHeight:T,outWidth:I,outChannels:N,padInfo:E,strideDepth:y,strideHeight:b,strideWidth:v,filterDepth:p,filterHeight:m,filterWidth:f,effectiveFilterDepth:x,effectiveFilterHeight:C,effectiveFilterWidth:S,dilationDepth:k,dilationHeight:w,dilationWidth:A,inShape:e,outShape:R,filterShape:t}}function um(e,t,n,a=1){const i=dm(t,a);return Math.floor((e[0]*(n-1)-n+i)/2)}function cm(e){return"number"==typeof e?[e,e,e]:2===e.length?[e[0],e[1],1]:e}function hm(e){return"number"==typeof e?[e,e,e]:e}function dm(e,t){return t<=1?e:e+(e-1)*(t-1)}function pm(e,t){if(!t)return Math.trunc(e);switch(t){case"round":return Math.round(e);case"ceil":return Math.ceil(e);case"floor":return Math.floor(e);default:throw new Error(`Unknown roundingMode ${t}`)}}function mm(e){const[t,n,a]=cm(e);return 1===t&&1===n&&1===a}function fm(e,t){return mm(e)||mm(t)}function gm(e){return cm(e).every((e=>e>0))}function ym(e){if("NHWC"===e)return"channelsLast";if("NCHW"===e)return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function bm(e,t,n){if(null!=n){if("string"==typeof t)throw Error(`Error in ${e}: pad must be an integer when using dimRoundingMode ${n} but got pad ${t}.`);if("number"==typeof t)Ns(Ms(t),(()=>`Error in ${e}: pad must be an integer when using dimRoundingMode ${n} but got pad ${t}.`));else{if("object"!=typeof t)throw Error(`Error in ${e}: Unknown padding parameter: ${t}`);t.forEach((t=>{t.forEach((t=>{Ns(Ms(t),(()=>`Error in ${e}: pad must be an integer when using dimRoundingMode ${n} but got pad ${t}.`))}))}))}}}const vm=ih({reshape_:function(e,t){const n={x:th(e,"x","reshape","string_or_numeric")},a={shape:t};return Hc.runKernel(_l,n,a)}});const km=ih({avgPool_:function(e,t,n,a,i){const s=th(e,"x","avgPool","float32");Ns(fm(n,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`));let r=s,o=!1;3===s.rank&&(o=!0,r=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]])),Ns(4===r.rank,(()=>`Error in avgPool: x must be rank 4 but got rank ${r.rank}.`)),bm("avgPool",a,i);const l={x:r},u={filterSize:t,strides:n,pad:a,dimRoundingMode:i};let c=Hc.runKernel(Ir,l,u);return c=kd(c,s.dtype),o?vm(c,[c.shape[1],c.shape[2],c.shape[3]]):c}});const wm=ih({avgPool3d_:function(e,t,n,a,i,s="NDHWC"){const r=th(e,"x","avgPool3d","float32");let o=r,l=!1;4===r.rank&&(l=!0,o=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]])),Ns(5===o.rank,(()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`)),Ns("NDHWC"===s,(()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`)),Ns("number"==typeof n&&n>0||Array.isArray(n)&&n[0]>0&&n[1]>0&&n[2]>0,(()=>`Error in avgPool3d: Stride must be > 0, but got '${n}'`)),bm("avgPool3d",a,i);const u={x:o},c={filterSize:t,strides:n,pad:a,dimRoundingMode:i,dataFormat:s};let h=Hc.runKernel(Rr,u,c);return h=kd(h,o.dtype),l?vm(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}});const Am=ih({concat_:function(e,t=0){Ns(e.length>=1,(()=>"Pass at least one tensor to concat"));const n=nh(e,"tensors","concat","string_or_numeric");if("complex64"===n[0].dtype&&n.forEach((e=>{if("complex64"!==e.dtype)throw new Error(`Cannot concatenate complex64 tensors with a tensor\n with dtype ${e.dtype}. `)})),1===n.length)return wd(n[0]);const a=n,i={axis:t};return Hc.runKernel(Wr,a,i)}});const xm=ih({matMul_:function(e,t,n=!1,a=!1){let i=th(e,"a","matMul"),s=th(t,"b","matMul");[i,s]=Lc(i,s);const r={a:i,b:s},o={transposeA:n,transposeB:a};return Hc.runKernel(zr,r,o)}});const Cm=ih({sigmoid_:function(e){const t={x:th(e,"x","sigmoid","float32")};return Hc.runKernel(ql,t)}});const Sm=ih({slice_:function(e,t,n){const a=th(e,"x","slice","string_or_numeric");if(0===a.rank)throw new Error("Slicing scalar is not possible");const i={x:a},s={begin:t,size:n};return Hc.runKernel(Vl,i,s)}});const Em=ih({tanh_:function(e){const t={x:th(e,"x","tanh","float32")};return Hc.runKernel(du,t)}});const _m=ih({basicLSTMCell_:function(e,t,n,a,i,s){const r=th(e,"forgetBias","basicLSTMCell"),o=th(t,"lstmKernel","basicLSTMCell"),l=th(n,"lstmBias","basicLSTMCell"),u=th(a,"data","basicLSTMCell"),c=th(i,"c","basicLSTMCell"),h=th(s,"h","basicLSTMCell"),d=Am([u,h],1),p=xm(d,o),m=xd(p,l),f=m.shape[0],g=m.shape[1]/4,y=[f,g],b=Sm(m,[0,0],y),v=Sm(m,[0,g],y),k=Sm(m,[0,2*g],y),w=Sm(m,[0,3*g],y),A=xd(Ed(Cm(b),Em(v)),Ed(c,Cm(xd(r,k))));return[A,Ed(Em(A),Cm(w))]}});const Tm=ih({batchToSpaceND_:function(e,t,n){const a=th(e,"x","batchToSpaceND"),i=t.reduce(((e,t)=>e*t));Ns(a.rank>=1+t.length,(()=>`input rank is ${a.rank} but should be > than blockShape.length ${t.length}`)),Ns(n.length===t.length,(()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`)),Ns(a.shape[0]%i==0,(()=>`input tensor batch is ${a.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${i}`));const s={x:a},r={blockShape:t,crops:n};return Hc.runKernel(Or,s,r)}});const Im=ih({batchNorm_:function(e,t,n,a,i,s){null==s&&(s=.001);const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(o.rank===l.rank,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),Ns(null==c||o.rank===c.rank,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),Ns(null==u||o.rank===u.rank,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));const h={x:function(e){let t;return t=0===e.rank||1===e.rank?vm(e,[1,1,1,e.size]):2===e.rank?vm(e,[1,1,e.shape[0],e.shape[1]]):3===e.rank?vm(e,[1,e.shape[0],e.shape[1],e.shape[2]]):e,t}(r),scale:u,offset:c,mean:o,variance:l},d={varianceEpsilon:s},p=Hc.runKernel(Eo,h,d);return vm(p,r.shape)}});const Nm=ih({batchNorm2d_:function(e,t,n,a,i,s){const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;return null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(2===r.rank,(()=>`Error in batchNorm2D: x must be rank 2 but got rank ${r.rank}.`)),Ns(2===o.rank||1===o.rank,(()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`)),Ns(2===l.rank||1===l.rank,(()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`)),null!=u&&Ns(2===u.rank||1===u.rank,(()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${u.rank}.`)),null!=c&&Ns(2===c.rank||1===c.rank,(()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${c.rank}.`)),Im(r,o,l,c,u,s)}});const Rm=ih({batchNorm3d_:function(e,t,n,a,i,s){const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;return null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(3===r.rank,(()=>`Error in batchNorm3D: x must be rank 3 but got rank ${r.rank}.`)),Ns(3===o.rank||1===o.rank,(()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`)),Ns(3===l.rank||1===l.rank,(()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`)),null!=u&&Ns(3===u.rank||1===u.rank,(()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${u.rank}.`)),null!=c&&Ns(3===c.rank||1===c.rank,(()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${c.rank}.`)),Im(r,o,l,c,u,s)}});const Dm=ih({batchNorm4d_:function(e,t,n,a,i,s){const r=th(e,"x","batchNorm"),o=th(t,"mean","batchNorm"),l=th(n,"variance","batchNorm");let u,c;return null!=i&&(u=th(i,"scale","batchNorm")),null!=a&&(c=th(a,"offset","batchNorm")),Ns(4===r.rank,(()=>`Error in batchNorm4D: x must be rank 4 but got rank ${r.rank}.`)),Ns(4===o.rank||1===o.rank,(()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`)),Ns(4===l.rank||1===l.rank,(()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`)),null!=u&&Ns(4===u.rank||1===u.rank,(()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${u.rank}.`)),null!=c&&Ns(4===c.rank||1===c.rank,(()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${c.rank}.`)),Im(r,o,l,c,u,s)}});const zm=ih({bincount_:function(e,t,n){const a=th(e,"x","bincount"),i=th(t,"weights","bincount");Ns("int32"===a.dtype,(()=>`Error in bincount: input dtype must be int32, but got ${a.dtype}`)),Ns(n>=0,(()=>`size must be non-negative, but got ${n}.`)),Ns(i.size===a.size||0===i.size,(()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${a.shape}, weights shape: ${i.shape}.`));const s={x:a,weights:i},r={size:n};return Hc.runKernel(Mr,s,r)}});const Om=ih({bitwiseAnd_:function(e,t){const n=th(e,"x","bitwiseAnd"),a=th(t,"y","bitwiseAnd");if(!Os(n.shape,a.shape))throw new Error(`BitwiseAnd: Tensors must have the same shape. x: ${n.shape}, y: ${a.shape}`);if("int32"!==n.dtype||"int32"!==a.dtype)throw new Error(`BitwiseAnd: Only supports 'int32' values in tensor, found type of x: ${n.dtype} and type of y: ${a.dtype}`);const i={a:n,b:a};return Hc.runKernel(Br,i)}});const Mm=ih({broadcastArgs_:function(e,t){const n=th(e,"s0","broadcastArgs","int32"),a=th(t,"s1","broadcastArgs","int32");if(1!==n.rank)throw new Error(`broadcastArgs(): first input must be a vector (rank=1). Has rank ${n.rank}`);if(1!==a.rank)throw new Error(`broadcastArgs(): second input must be a vector (rank=1). Has rank ${a.rank}`);const i={s0:n,s1:a};return Hc.runKernel(Fr,i)}});const Bm=ih({broadcastTo_:function(e,t){let n=th(e,"broadcastTo","x");const a=n.shape;if(ar(t),t.lengthn.rank){const e=n.shape.slice();for(;e.length=0;e--)if(i[e]===t[e])s[e]=1;else if(1!==n.shape[e])throw new Error(`broadcastTo(): [${a}] cannot be broadcast to [${t}].`);if(0===s.map(((e,t)=>e>1?t:-1)).filter((e=>e>=0)).length)return wd(n);const r={x:n},o={reps:s};return Hc.runKernel(pu,r,o)}});const Fm=ih({ceil_:function(e){const t={x:th(e,"x","ceil","float32")};return Hc.runKernel(Pr,t)}});const Lm=ih({clipByValue_:function(e,t,n){const a=th(e,"x","clipByValue");if(Ns(t<=n,(()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`)),t===n)return Pd(a.shape,t,a.dtype);const i={x:a},s={clipValueMin:t,clipValueMax:n};return Hc.runKernel(jr,i,s)}});const Pm=ih({concat1d_:function(e){return Am(e,0)}});const jm=ih({concat2d_:function(e,t){return Am(e,t)}});const Vm=ih({concat3d_:function(e,t){return Am(e,t)}});const Um=ih({concat4d_:function(e,t){return Am(e,t)}});const Wm=ih({conv2d_:function(e,t,n,a,i="NHWC",s=[1,1],r){const o=th(e,"x","conv2d","float32"),l=th(t,"filter","conv2d","float32");let u=o,c=!1;3===o.rank&&(c=!0,u=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),Ns(4===u.rank,(()=>`Error in conv2d: input must be rank 4, but got rank ${u.rank}.`)),Ns(4===l.rank,(()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`)),bm("conv2d",a,r);const h="NHWC"===i?u.shape[3]:u.shape[1];Ns(h===l.shape[2],(()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${l.shape[2]}.`)),Ns(fm(n,s),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`)),Ns(gm(s),(()=>"Error in conv2D: Dilated rates should be larger than 0.")),Ns(gm(n),(()=>"Error in conv2D: Strides should be larger than 0."));const d={x:u,filter:l},p={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r},m=Hc.runKernel(Gr,d,p);return c?vm(m,[m.shape[1],m.shape[2],m.shape[3]]):m}});const Gm=ih({conv1d_:function(e,t,n,a,i="NWC",s=1,r){const o=th(e,"x","conv1d"),l=th(t,"filter","conv1d");let u=o,c=!1;2===o.rank&&(c=!0,u=vm(o,[1,o.shape[0],o.shape[1]])),Ns(3===u.rank,(()=>`Error in conv1d: input must be rank 3, but got rank ${u.rank}.`)),Ns(3===l.rank,(()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`)),bm("conv1d",a,r),Ns(u.shape[2]===l.shape[1],(()=>`Error in conv1d: depth of input (${u.shape[2]}) must match input depth for filter ${l.shape[1]}.`)),Ns(fm(n,s),(()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`)),Ns(gm(s),(()=>"Error in conv1D: Dilated rates should be larger than 0.")),Ns(gm(n),(()=>"Error in conv1D: Stride should be larger than 0.")),Ns("NWC"===i,(()=>`Error in conv1d: got dataFormat of ${i} but only NWC is currently supported.`));const h=vm(l,[1,l.shape[0],l.shape[1],l.shape[2]]),d=vm(u,[u.shape[0],1,u.shape[1],u.shape[2]]),p=Wm(d,h,[1,n],a,"NHWC",[1,s],r);return vm(p,c?[p.shape[2],p.shape[3]]:[p.shape[0],p.shape[2],p.shape[3]])}});const qm=ih({conv2DBackpropInput_:function(e,t,n,a,i,s="NHWC",r){Ns(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let o=e,l=t,u=!1;3===t.rank&&(u=!0,l=vm(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),Ns(4===o.length,(()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`)),Ns(4===l.rank,(()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`)),Ns(4===n.rank,(()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`));const c="NHWC"===s?o[3]:o[1],h="NHWC"===s?l.shape[3]:l.shape[1];Ns(c===n.shape[2],(()=>`Error in conv2dDerInput: depth of input (${c}) must match input depth for filter ${n.shape[2]}.`)),Ns(h===n.shape[3],(()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`)),bm("conv2dDerInput",i,r);const d={dy:l,filter:n},p={strides:a,pad:i,dataFormat:s,dimRoundingMode:r,inputShape:o},m=Hc.runKernel(Hr,d,p);return u?vm(m,[m.shape[1],m.shape[2],m.shape[3]]):m}});const Hm=ih({conv2dTranspose_:function(e,t,n,a,i,s){const r=th(e,"x","conv2dTranspose"),o=th(t,"filter","conv2dTranspose");return qm(n,r,o,a,i,"NHWC",s)}});const Km=ih({conv3d_:function(e,t,n,a,i="NDHWC",s=[1,1,1]){const r=th(e,"x","conv3d"),o=th(t,"filter","conv3d");let l=r,u=!1;4===r.rank&&(u=!0,l=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]])),Ns(5===l.rank,(()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`)),Ns(5===o.rank,(()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`)),Ns(l.shape[4]===o.shape[3],(()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`)),Ns(fm(n,s),(()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`)),Ns("NDHWC"===i,(()=>`Error in conv3d: got dataFormat of ${i} but only NDHWC is currently supported.`)),Ns(gm(s),(()=>"Error in conv3D: Dilated rates should be larger than 0.")),Ns(gm(n),(()=>"Error in conv3D: Strides should be larger than 0."));const c={x:l,filter:o},h={strides:n,pad:a,dataFormat:i,dilations:s},d=Hc.runKernel(Kr,c,h);return u?vm(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}});const $m=ih({conv3DBackpropInput_:function(e,t,n,a,i){Ns(e.length===t.rank,(()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`));let s=e,r=t,o=!1;4===t.rank&&(o=!0,r=vm(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);const l=s[4],u=r.shape[4];Ns(5===s.length,(()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`)),Ns(5===r.rank,(()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${r.rank}`)),Ns(5===n.rank,(()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`)),Ns(l===n.shape[3],(()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`)),Ns(u===n.shape[4],(()=>`Error in conv3dDerInput: depth of output (${u}) must match output depth for filter ${n.shape[4]}.`));const c={dy:r,filter:n},h={pad:i,strides:a,inputShape:s},d=Hc.runKernel(Zr,c,h);return o?vm(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}});const Zm=ih({conv3dTranspose_:function(e,t,n,a,i){const s=th(e,"x","conv3dTranspose"),r=th(t,"filter","conv3dTranspose");return $m(n,s,r,a,i)}});const Xm=ih({cos_:function(e){const t={x:th(e,"x","cos","float32")};return Hc.runKernel(Xr,t)}});const Ym=ih({cosh_:function(e){const t={x:th(e,"x","cosh","float32")};return Hc.runKernel(Yr,t)}});const Qm=ih({cumprod_:function(e,t=0,n=!1,a=!1){const i={x:th(e,"x","cumprod")},s={axis:t,exclusive:n,reverse:a};return Hc.runKernel(Qr,i,s)}});const Jm=ih({cumsum_:function(e,t=0,n=!1,a=!1){const i={x:th(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:a};return Hc.runKernel(Jr,i,s)}});const ef=ih({denseBincount_:function(e,t,n,a=!1){const i=th(e,"x","denseBincount"),s=th(t,"weights","denseBincount");Ns("int32"===i.dtype,(()=>`Error in denseBincount: input dtype must be int32, but got ${i.dtype}`)),Ns(i.rank<=2,(()=>`Error in denseBincount: input must be at most rank 2, but got rank ${i.rank}.`)),Ns(n>=0,(()=>`size must be non-negative, but got ${n}.`)),Ns(s.size===i.size||0===s.size,(()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${i.shape}, weights shape: ${s.shape}.`));const r={x:i,weights:s},o={size:n,binaryOutput:a};return Hc.runKernel(to,r,o)}});const tf=ih({depthToSpace_:function(e,t,n="NHWC"){const a=th(e,"x","depthToSpace","float32"),i="NHWC"===n?a.shape[1]:a.shape[2],s="NHWC"===n?a.shape[2]:a.shape[3],r="NHWC"===n?a.shape[3]:a.shape[1];Ns(t>1,(()=>`blockSize should be > 1 for depthToSpace, but was: ${t}`)),Ns(i*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${i} and ${t} for depthToSpace with input shape\n ${a.shape}`)),Ns(s*t>=0,(()=>`Negative dimension size caused by overflow when multiplying\n ${s} and ${t} for depthToSpace with input shape\n ${a.shape}`)),Ns(r%(t*t)==0,(()=>`Dimension size must be evenly divisible by ${t*t} but is ${r} for depthToSpace with input shape ${a.shape}`));const o={x:a},l={blockSize:t,dataFormat:n};return Hc.runKernel(no,o,l)}});const nf=ih({depthwiseConv2d_:function(e,t,n,a,i="NHWC",s=[1,1],r){const o=th(e,"x","depthwiseConv2d","float32"),l=th(t,"filter","depthwiseConv2d","float32");let u=o,c=!1;3===o.rank&&(c=!0,u=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),Ns(4===u.rank,(()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${u.rank}.`)),Ns(4===l.rank,(()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`));const h="NHWC"===i?u.shape[3]:u.shape[1];Ns(h===l.shape[2],(()=>`Error in depthwiseConv2d: number of input channels (${h}) must match the inChannels dimension in filter ${l.shape[2]}.`)),bm("depthwiseConv2d",a,r);const d={x:u,filter:l},p={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r},m=Hc.runKernel(ao,d,p);return c?vm(m,[m.shape[1],m.shape[2],m.shape[3]]):m}});const af=ih({diag_:function(e){const t={x:th(e,"x","diag")};return Hc.runKernel(ro,t)}});const sf=ih({dilation2d_:function(e,t,n,a,i=[1,1],s="NHWC"){const r=th(e,"x","dilation2d"),o=th(t,"filter","dilation2d");Ns(3===r.rank||4===r.rank,(()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${r.rank}.`)),Ns(3===o.rank,(()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`)),Ns("NHWC"===s,(()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`));let l=r,u=!1;3===r.rank&&(l=vm(r,[1,r.shape[0],r.shape[1],r.shape[2]]),u=!0),Ns(l.shape[3]===o.shape[2],(()=>`Error in dilation2d: input and filter must have the same depth: ${l.shape[3]} vs ${o.shape[2]}`));const c={x:l,filter:o},h={strides:n,pad:a,dilations:i},d=Hc.runKernel(oo,c,h);return u?vm(d,[d.shape[1],d.shape[2],d.shape[3]]):d}});const rf=ih({equal_:function(e,t){let n=th(e,"a","equal","string_or_numeric"),a=th(t,"b","equal","string_or_numeric");[n,a]=Lc(n,a),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(yo,i)}});const of=ih({where_:function(e,t,n){const a=th(t,"a","where"),i=th(n,"b","where"),s=th(e,"condition","where","bool"),r=Kd(Kd(s.shape,a.shape),i.shape),o={condition:Bm(s,r),t:Bm(a,r),e:Bm(i,r)};return Hc.runKernel(Pl,o)}});const lf=ih({divNoNan_:function(e,t){let n=th(e,"a","div"),a=th(t,"b","div");[n,a]=Lc(n,a);const i=Sd(n,a),s=Id(i),r=rf(a,s);return of(r,s,i)}});const uf=ih({dot_:function(e,t){const n=th(e,"t1","dot"),a=th(t,"t2","dot");Ns(!(1!==n.rank&&2!==n.rank||1!==a.rank&&2!==a.rank),(()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${a.rank}.`));const i=1===n.rank?n.size:n.shape[1],s=1===a.rank?a.size:a.shape[0];if(Ns(i===s,(()=>`Error in dot: inner dimensions of inputs must match, but got ${i} and ${s}.`)),1===n.rank&&1===a.rank){const e=vm(n,[1,-1]),t=vm(a,[-1,1]),i=xm(e,t);return vm(i,[])}if(1===n.rank&&2===a.rank){const e=vm(n,[1,-1]),t=vm(a,[a.shape[0],a.shape[1]]),i=xm(e,t);return vm(i,[i.size])}if(2===n.rank&&1===a.rank){const e=vm(a,[-1,1]),t=xm(n,e);return vm(t,[t.size])}{const e=vm(a,[a.shape[0],a.shape[1]]);return xm(n,e)}}});const cf=ih({einsum_:function(e,...t){const n=t.map(((e,t)=>th(e,`tensors${t}`,"einsum"))),a={equation:e};return Hc.runKernel(po,n,a)}});const hf=ih({elu_:function(e){const t={x:th(e,"x","elu","float32")};return Hc.runKernel(mo,t)}});const df=ih({ensureShape_:function(e,t){const n=th(e,"x","ensureShape","string_or_numeric");if(!function(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(e.length!==t.length)return!1;for(let n=0;n"Input dtype must be `int32` or `float32`.")),"int32"===t.dtype&&(t=kd(t,"float32"));const n={x:t};return Hc.runKernel(go,n)}});function mf(e,t){for(let n=0;ne[t]))]}function yf(e,t){return ff(e,t.map((e=>1)),t)}function bf(e,t,n){Ns(mf(t,n),(()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`))}function vf(e,t){if(mf(e,t))return null;const n=[];for(let a=0;an.push(e))),n}function kf(e){return e.map(((e,t)=>[t,e])).sort(((e,t)=>e[1]-t[1])).map((e=>e[0]))}function wf(e,t){const n=[];for(let a=t-e;a"Axis must be <= rank of the tensor"));const a={input:n},i={dim:t};return Hc.runKernel(vo,a,i)}});const Nf=ih({expm1_:function(e){const t={x:th(e,"x","expm1")};return Hc.runKernel(ko,t)}});const Rf=ih({tile_:function(e,t){const n=th(e,"x","tile","string_or_numeric");Ns(n.rank===t.length,(()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`));const a={x:n},i={reps:t};return Hc.runKernel(pu,a,i)}});const Df=ih({eye_:function(e,t,n,a="float32"){null==t&&(t=e);const i=vd([e,t],a),s=e<=t?e:t;for(let e=0;e`Error in localResponseNormalization: x must be rank 3 or 4 but got\n rank ${s.rank}.`)),Ns(Ms(t),(()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`));let r=s,o=!1;3===s.rank&&(o=!0,r=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]]));const l={x:r},u={depthRadius:t,bias:n,alpha:a,beta:i},c=Hc.runKernel(Ho,l,u);return o?vm(c,[c.shape[1],c.shape[2],c.shape[3]]):c}});const Hf=ih({log_:function(e){const t={x:th(e,"x","log","float32")};return Hc.runKernel(Vo,t)}});const Kf=ih({log1p_:function(e){const t={x:th(e,"x","log1p")};return Hc.runKernel(Uo,t)}});const $f=ih({neg_:function(e){const t={x:th(e,"x","neg")};return Hc.runKernel(ll,t)}});const Zf=ih({softplus_:function(e){const t={x:th(e,"x","softplus")};return Hc.runKernel(Hl,t)}});const Xf=ih({logSigmoid_:function(e){const t=th(e,"x","logSigmoid");return Nd((e=>({value:$f(Zf($f(e))),gradFunc:t=>Ed(t,Cm($f(e)))})))(t)}});const Yf=ih({logSoftmax_:function(e,t=-1){const n=th(e,"logits","logSoftmax");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Log Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and axis was ${t}`);return Nd(((e,n)=>{const a=Af(e,t,!0),i=Ud(e,a),s=Ud(kd(i,"float32"),Hf(Cf(Tf(i),t,!0)));n([s]);return{value:s,gradFunc:(e,n)=>{const[a]=n,i=Tf(a);return Ud(e,Ed(Cf(e,t,!0),i))}}}))(n)}});const Qf=ih({logSumExp_:function(e,t=null,n=!1){const a=th(e,"x","logSumExp"),i=js(t,a.shape),s=Af(a,i,!0),r=Ud(a,s),o=Tf(r),l=Cf(o,i),u=Hf(l),c=xd(vm(s,u.shape),u);if(n){const e=yf(c.shape,i);return vm(c,e)}return c}});const Jf=ih({logicalAnd_:function(e,t){const n=th(e,"a","logicalAnd","bool"),a=th(t,"b","logicalAnd","bool");Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(Wo,i)}});const eg=ih({logicalNot_:function(e){const t={x:th(e,"x","logicalNot","bool")};return Hc.runKernel(Go,t)}});const tg=ih({logicalOr_:function(e,t){const n=th(e,"a","logicalOr","bool"),a=th(t,"b","logicalOr","bool");Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(qo,i)}});const ng=ih({logicalXor_:function(e,t){const n=th(e,"a","logicalXor","bool"),a=th(t,"b","logicalXor","bool");return Kd(n.shape,a.shape),Jf(tg(e,t),eg(Jf(e,t)))}}),ag=2147483648;const ig=ih({searchSorted_:function(e,t,n="left"){const a=th(e,"sortedSequence","searchSorted"),i=th(t,"values","searchSorted"),s=a.shape[a.shape.length-1],r=i.shape[i.shape.length-1],o=vm(a,[-1,s]),l=vm(i,[-1,r]);if(o.rank<2)throw new Error("Sorted input argument must be at least 2-dimensional");if(o.shape[0]!==l.shape[0])throw new Error("Leading dimension of 'sortedSequence' and 'values' must match.");if(zs(l.shape)>=ag)throw new Error("values tensor size must less than 2147483648");if(o.shape[1]>=ag)throw new Error(`trailing dim_size must less than 2147483648 for int32 output type, was ${o.shape[1]}`);const u={sortedSequence:o,values:l},c={side:n};return Hc.runKernel(Ll,u,c)}});function sg(e,t){return ig(e,t,"left")}const rg=ih({maxPool_:function(e,t,n,a,i){const s=th(e,"x","maxPool");let r=s,o=!1;3===s.rank&&(o=!0,r=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]])),Ns(4===r.rank,(()=>`Error in maxPool: input must be rank 4 but got rank ${r.rank}.`)),Ns(fm(n,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '1'`)),bm("maxPool",a,i);const l={x:r},u={filterSize:t,strides:n,pad:a,dimRoundingMode:i},c=Hc.runKernel(Xo,l,u);return o?vm(c,[c.shape[1],c.shape[2],c.shape[3]]):c}});const og=ih({maxPool3d_:function(e,t=[1,1,1],n,a,i,s="NDHWC"){const r=th(e,"x","maxPool3d");let o=r,l=!1;4===r.rank&&(l=!0,o=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]])),Ns(5===o.rank,(()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`)),Ns("NDHWC"===s,(()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`)),bm("maxPool3d",a,i);const u={x:o},c={filterSize:t,strides:n,pad:a,dimRoundingMode:i,dataFormat:s},h=Hc.runKernel(Qo,u,c);return l?vm(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}});const lg=ih({maxPoolWithArgmax_:function(e,t,n,a,i=!1){const s={x:th(e,"x","maxPoolWithArgmax")},r={filterSize:t,strides:n,pad:a,includeBatchInIndex:i},o=Hc.runKernel(el,s,r);return{result:o[0],indexes:o[1]}}});const ug=ih({mean_:function(e,t=null,n=!1){const a={x:th(e,"x","mean")},i={axis:t,keepDims:n};return Hc.runKernel(tl,a,i)}});function cg(e,t="float32"){if(ar(e),"complex64"===t){const t=cg(e,"float32"),n=cg(e,"float32");return sh(t,n)}const n=tr(zs(e),t);return Hc.makeTensor(n,e,t)}function hg(e,t="float32"){if(ar(e),"complex64"===t){const t=hg(e,"float32"),n=cg(e,"float32");return sh(t,n)}const n=er(zs(e),t);return Hc.makeTensor(n,e,t)}function dg(e,t,{indexing:n="xy"}={}){if("xy"!==n&&"ij"!==n)throw new TypeError(`${n} is not a valid third argument to meshgrid`);if(void 0===e)return[];let a=th(e,"x","meshgrid",e instanceof kc?e.dtype:"float32");if(void 0===t)return[a];let i=th(t,"y","meshgrid",t instanceof kc?t.dtype:"float32");const s=zs(a.shape),r=zs(i.shape);return"xy"===n?(a=vm(a,[1,-1]),i=vm(i,[-1,1]),[xm(hg([r,1],a.dtype),a),xm(i,hg([1,s],i.dtype))]):(a=vm(a,[-1,1]),i=vm(i,[1,-1]),[xm(a,hg([1,r],a.dtype)),xm(hg([s,1],i.dtype),i)])}const pg=ih({minimum_:function(e,t){let n=th(e,"a","minimum"),a=th(t,"b","minimum");[n,a]=Lc(n,a),"bool"===n.dtype&&(n=kd(n,"int32"),a=kd(a,"int32")),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(al,i)}});const mg=ih({mirrorPad_:function(e,t,n){Ns("reflect"===n||"symmetric"===n,(()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`));const a=th(e,"x","mirrorPad");if(0===a.rank)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");Ns(t.length===a.rank,(()=>`Padding doesn't match input. Must be ${a.rank}. Got ${t.length}.`));const i="reflect"===n?1:0;for(let e=0;e"Invalid number of paddings. Must be length of 2 each.")),Ns(t[e][0]>=0&&t[e][0]<=a.shape[e]-i&&t[e][1]>=0&&t[e][1]<=a.shape[e]-i,(()=>`Padding in dimension ${e} cannot be greater than or equal to ${a.shape[e]-i} or less than 0 for input of shape ${a.shape}`));const s={paddings:t,mode:n},r={x:a};return Hc.runKernel(il,r,s)}});const fg=ih({mod_:function(e,t){let n=th(e,"a","mod"),a=th(t,"b","mod");[n,a]=Lc(n,a);const i={a:n,b:a};return Hc.runKernel(sl,i)}});const gg=ih({moments_:function(e,t=null,n=!1){const a=js(t,(e=th(e,"x","moments")).shape),i=ug(e,a,n);let s=i.shape;n||(s=yf(i.shape,a));const r=Td(Ud(kd(e,"float32"),vm(i,s)));return{mean:i,variance:ug(r,a,n)}}});const yg=ih({multiRNNCell_:function(e,t,n,a){const i=th(t,"data","multiRNNCell"),s=nh(n,"c","multiRNNCell"),r=nh(a,"h","multiRNNCell");let o=i;const l=[];for(let t=0;t2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${r}`);n=n||Math.random();const o={logits:1===r?vm(i,[1,-1]):i},l={numSamples:t,seed:n,normalized:a},u=Hc.runKernel(rl,o,l);return 1===r?vm(u,[u.size]):u}});const vg=ih({notEqual_:function(e,t){let n=th(e,"a","notEqual","string_or_numeric"),a=th(t,"b","notEqual","string_or_numeric");[n,a]=Lc(n,a),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(ul,i)}});const kg=ih({oneHot_:function(e,t,n=1,a=0,i="int32"){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);const s={indices:th(e,"indices","oneHot","int32")},r={dtype:i,depth:t,onValue:n,offValue:a};return Hc.runKernel(ml,s,r)}});const wg=ih({onesLike_:function(e){const t={x:th(e,"x","onesLike")};return Hc.runKernel(pl,t)}});const Ag=ih({outerProduct_:function(e,t){const n=th(e,"v1","outerProduct"),a=th(t,"v2","outerProduct");Ns(1===n.rank&&1===a.rank,(()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${a.rank}.`));const i=vm(n,[-1,1]),s=vm(a,[1,-1]);return xm(i,s)}});const xg=ih({pad_:function(e,t,n=0){const a=th(e,"x","pad");if(0===a.rank)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");const i={paddings:t,constantValue:n},s={x:a};return Hc.runKernel(gl,s,i)}});const Cg=ih({pad1d_:function(e,t,n=0){return Ns(2===t.length,(()=>"Invalid number of paddings. Must be length of 2.")),xg(e,[t],n)}});const Sg=ih({pad2d_:function(e,t,n=0){return Ns(2===t.length&&2===t[0].length&&2===t[1].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),xg(e,t,n)}});const Eg=ih({pad3d_:function(e,t,n=0){return Ns(3===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),xg(e,t,n)}});const _g=ih({pad4d_:function(e,t,n=0){return Ns(4===t.length&&2===t[0].length&&2===t[1].length&&2===t[2].length&&2===t[3].length,(()=>"Invalid number of paddings. Must be length of 2 each.")),xg(e,t,n)}});const Tg=ih({spaceToBatchND_:function(e,t,n){const a=th(e,"x","spaceToBatchND");Ns(a.rank>=1+t.length,(()=>`input rank ${a.rank} should be > than [blockShape] ${t.length}`)),Ns(n.length===t.length,(()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`)),Ns(a.shape.reduce(((e,a,i)=>i>0&&i<=t.length?e&&(a+n[i-1][0]+n[i-1][1])%t[i-1]==0:e),!0),(()=>`input spatial dimensions ${a.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`));const i={x:a},s={blockShape:t,paddings:n};return Hc.runKernel(Zl,i,s)}});const Ig=ih({pool_:function(e,t,n,a,i,s,r){null==i&&(i=[1,1]),null==s&&(s=1),0===a&&(a="valid");const o=th(e,"x","maxPool");let l=o,u=!1;3===o.rank&&(u=!0,l=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),Ns(fm(s,i),(()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${i}'`));const c=sm(l.shape,t,s,i,a),h=[c.dilationHeight,c.dilationWidth];let d;d="same"===a?function(e,t){const n=e.map(((e,n)=>e+(e-1)*(t[n]-1))),a=n.map((e=>e-1)),i=a.map((e=>Math.floor(e/2))),s=a.map(((e,t)=>e-i[t]));return a.map(((e,t)=>[i[t],s[t]]))}([c.filterHeight,c.filterWidth],h):[[0,0],[0,0]];const p=1===h[0]&&1===h[1],[m,f]=function(e,t,n){const a=n.map((e=>e[0])),i=n.map((e=>e[1])),s=e.concat(a,i),r=t.map(((e,t)=>(e-s[t]%e)%e)),o=i.map(((e,t)=>e+r[t])),l=t.map(((e,t)=>[a[t],o[t]])),u=t.map(((e,t)=>[0,r[t]]));return[l,u]}([c.inHeight,c.inWidth],h,d),g=p?a:"valid",y=p?l:Tg(l,h,m),b=("avg"===n?()=>km(y,t,s,g,r):()=>rg(y,t,s,g,r))(),v=p?b:Tm(b,h,f);return u?vm(v,[v.shape[1],v.shape[2],v.shape[3]]):v}});const Ng=ih({prelu_:function(e,t){const n={x:th(e,"x","prelu"),alpha:th(t,"alpha","prelu")};return Hc.runKernel(bl,n)}});const Rg=ih({prod_:function(e,t=null,n=!1){let a=th(e,"x","prod");"bool"===a.dtype&&(a=kd(a,"int32"));const i={x:a},s={axis:t,keepDims:n};return Hc.runKernel(vl,i,s)}});const Dg=ih({raggedGather_:function(e,t,n,a){const i={paramsNestedSplits:e.map(((e,t)=>th(e,`tensors${t}`,"raggedGather","int32"))),paramsDenseValues:th(t,"paramsDenseValues","raggedGather"),indices:th(n,"indices","raggedGather","int32")},s={outputRaggedRank:a},r=Hc.runKernel(kl,i,s);return{outputNestedSplits:r.slice(0,r.length-1),outputDenseValues:r[r.length-1]}}});const zg=ih({raggedRange_:function(e,t,n){const a=th(e,"starts","raggedRange"),i={starts:a,limits:th(t,"limits","raggedRange",a.dtype),deltas:th(n,"deltas","raggedRange",a.dtype)},s=Hc.runKernel(wl,i);return{rtNestedSplits:s[0],rtDenseValues:s[1]}}});const Og=ih({raggedTensorToTensor_:function(e,t,n,a,i){const s=th(e,"shape","raggedTensorToTensor","int32"),r=th(t,"values","raggedTensorToTensor"),o={shape:s,values:r,defaultValue:th(n,"defaultValue","raggedTensorToTensor",r.dtype),rowPartitionTensors:a.map(((e,t)=>th(e,`tensors${t}`,"raggedTensorToTensor","int32")))},l={rowPartitionTypes:i};return Hc.runKernel(Al,o,l)}});const Mg=ih({rand_:function(e,t,n){ar(e);const a=zs(e);let i=null;if(null==n||"float32"===n)i=new Float32Array(a);else if("int32"===n)i=new Int32Array(a);else{if("bool"!==n)throw new Error(`Unknown data type ${n}`);i=new Uint8Array(a)}for(let e=0;e=1||0===s);const r=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*a*r,t=this.mean+this.stdDev*i*r,this.truncated&&!this.isValidTruncated(e)||(n=!0)}return this.truncated&&!this.isValidTruncated(t)||(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return null==this.dtype||"float32"===this.dtype?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}}class Lg{constructor(e,t,n,a){this.alpha=e,this.beta=1/t,this.dtype=n;const i=a||Math.random();this.randu=Bg.alea(i.toString()),this.randn=new Fg(0,1,n,!1,this.randu()),this.d=e<1?e+2/3:e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,a,i,s;for(;;){do{a=this.randn.nextValue(),s=1+this.c*a}while(s<=0);if(s*=s*s,e=a*a,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),i=this.randu(),inull==this.dtype||"float32"===this.dtype,this.min=e,this.range=t-e,this.dtype=n,null==a&&(a=Math.random()),"number"==typeof a&&(a=a.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=Bg.alea(a)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}}const jg=ih({randomGamma_:function(e,t,n=1,a="float32",i){if(ar(e),null==n&&(n=1),null==a&&(a="float32"),"float32"!==a&&"int32"!==a)throw new Error(`Unsupported data type ${a}`);const s=new Lg(t,n,a,i),r=vd(e,a);for(let e=0;e`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`)),Xg(t,0)}});const Qg=ih({reverse2d_:function(e,t){const n=th(e,"x","reverse");return Ns(2===n.rank,(()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`)),Xg(n,t)}});const Jg=ih({reverse3d_:function(e,t){const n=th(e,"x","reverse");return Ns(3===n.rank,(()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`)),Xg(n,t)}});const ey=ih({reverse4d_:function(e,t){const n=th(e,"x","reverse");return Ns(4===n.rank,(()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`)),Xg(n,t)}});const ty=ih({round_:function(e){const t={x:th(e,"x","round")};return Hc.runKernel(Ol,t)}});const ny=ih({rsqrt_:function(e){const t={x:th(e,"x","rsqrt","float32")};return Hc.runKernel(Ml,t)}});const ay=ih({selu_:function(e){const t={x:th(e,"x","selu")};return Hc.runKernel(jl,t)}});const iy=ih({separableConv2d_:function(e,t,n,a,i,s=[1,1],r="NHWC"){const o=th(e,"x","separableConv2d"),l=th(t,"depthwiseFilter","separableConv2d"),u=th(n,"pointwiseFilter","separableConv2d");let c=o,h=!1;if(3===o.rank&&(h=!0,c=vm(o,[1,o.shape[0],o.shape[1],o.shape[2]])),"NCHW"===r)throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");Ns(4===c.rank,(()=>`Error in separableConv2d: input must be rank 4, but got rank ${c.rank}.`)),Ns(4===l.rank,(()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`)),Ns(4===u.rank,(()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`)),Ns(1===u.shape[0],(()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${u.shape[0]}.`)),Ns(1===u.shape[1],(()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${u.shape[1]}.`));const d=l.shape[2],p=l.shape[3];Ns(u.shape[2]===d*p,(()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${d*p}, but got ${u.shape[2]}.`));const m=nf(c,l,a,i,r,s),f=Wm(m,u,1,"valid",r);return h?vm(f,[f.shape[1],f.shape[2],f.shape[3]]):f}});const sy=async function(e,t){const n=th(e,"x","setdiff1d"),a=th(t,"y","setdiff1d");Ns(n.dtype===a.dtype,(()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${a.dtype}).`)),Ns(1===n.rank,(()=>`x should be 1D tensor, but got x (${n.shape}).`)),Ns(1===a.rank,(()=>`y should be 1D tensor, but got y (${a.shape}).`));const i=await n.data(),s=await a.data(),r=new Set(s);let o=0;for(let e=0;e`slice1d expects a rank-1 tensor, but got a rank-${a.rank} tensor`)),Sm(a,[t],[n])}});const cy=ih({slice2d_:function(e,t,n){const a=th(e,"x","slice2d");return Ns(2===a.rank,(()=>`slice2d expects a rank-2 tensor, but got a rank-${a.rank} tensor`)),Sm(a,t,n)}});const hy=ih({slice3d_:function(e,t,n){const a=th(e,"x","slice3d");return Ns(3===a.rank,(()=>`slice3d expects a rank-3 tensor, but got a rank-${a.rank} tensor`)),Sm(a,t,n)}});const dy=ih({slice4d_:function(e,t,n){const a=th(e,"x","slice4d");return Ns(4===a.rank,(()=>`slice4d expects a rank-4 tensor, but got a rank-${a.rank} tensor`)),Sm(a,t,n)}});const py=ih({softmax_:function(e,t=-1){const n=th(e,"logits","softmax","float32");if(-1===t&&(t=n.rank-1),t!==n.rank-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${n.rank} and dim was ${t}`);const a={logits:n},i={dim:t};return Hc.runKernel(Yl,a,i)}});const my=ih({fft_:function(e){Ns("complex64"===e.dtype,(()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`));const t={input:e};return Hc.runKernel(wo,t)}});const fy=ih({ifft_:function(e){Ns("complex64"===e.dtype,(()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`));const t={input:e};return Hc.runKernel(Do,t)}});const gy=ih({irfft_:function(e){const t=e.shape[e.shape.length-1],n=e.size/t;let a;if(t<=2){const i=vm(e,[n,t]);a=fy(i)}else{const i=[n,2*(t-1)],s=vm(Hg(e),[n,t]),r=vm(Ff(e),[n,t]),o=Xg(Sm(s,[0,1],[n,t-2]),1),l=Ed(Xg(Sm(r,[0,1],[n,t-2]),1),Rd(-1)),u=Am([s,o],1),c=Am([r,l],1),h=vm(sh(u,c),[i[0],i[1]]);a=fy(h)}if(a=Hg(a),3===e.rank&&0!==e.shape[0]){const t=a,n=e.shape[0];a=vm(a,[n,a.shape[0]/n,a.shape[1]]),t.dispose()}return a}});const yy=ih({split_:function(e,t,n=0){const a={x:th(e,"x","split")},i={numOrSizeSplits:t,axis:n};return Hc.runKernel(Xl,a,i)}});const by=ih({rfft_:function(e,t){Ns("float32"===e.dtype,(()=>`The dtype for rfft() must be real value but got ${e.dtype}`));let n=e.shape[e.shape.length-1];const a=e.size/n;let i;if(null!=t&&t0)),s=e.shape.map((e=>e));s[e.shape.length-1]=t,i=Sm(e,a,s),n=t}else if(null!=t&&t>n){const a=e.shape.map((e=>e));a[e.shape.length-1]=t-n,i=Am([e,cg(a)],e.shape.length-1),n=t}else i=e;const s=Id(i),r=vm(sh(i,s),[a,n]),o=my(r),l=Math.floor(n/2)+1,u=Hg(o),c=Ff(o),h=yy(u,[l,n-l],u.shape.length-1),d=yy(c,[l,n-l],c.shape.length-1),p=i.shape.slice();return p[i.shape.length-1]=l,vm(sh(h[0],d[0]),p)}});const vy=ih({squaredDifference_:function(e,t){let n=th(e,"a","squaredDifference"),a=th(t,"b","squaredDifference");[n,a]=Lc(n,a),Kd(n.shape,a.shape);const i={a:n,b:a};return Hc.runKernel(au,i,{})}});const ky=ih({squeeze_:function(e,t){const n=th(e,"x","squeeze","string_or_numeric");return vm(n,Vs(n.shape,t).newShape)}});const wy=ih({stack_:function(e,t=0){const n=nh(e,"tensors","stack","string_or_numeric");Ns(n.length>=1,(()=>"Pass at least one tensor to tf.stack")),n.length>0&&Ns(t<=n[0].rank,(()=>"Axis must be <= rank of the tensor"));const a=n,i={axis:t};return Hc.runKernel(fl,a,i)}});const Ay=ih({step_:function(e,t=0){const n={x:th(e,"x","step")},a={alpha:t};return Hc.runKernel(wu,n,a)}});const xy=ih({stridedSlice_:function(e,t,n,a,i=0,s=0,r=0,o=0,l=0){const u={x:th(e,"x","stridedSlice","string_or_numeric")},c={begin:t,end:n,strides:a,beginMask:i,endMask:s,ellipsisMask:r,newAxisMask:o,shrinkAxisMask:l};return Hc.runKernel(ru,u,c)}});const Cy=ih({tan_:function(e){const t={x:th(e,"x","tan","float32")};return Hc.runKernel(hu,t)}});function Sy(e,t){Ds(e);const n=Qc(e,t);if(1!==n.length)throw new Error("tensor1d() requires values to be a flat/TypedArray");return rh(e,null,n,t)}function Ey(e,t,n){if(Ds(e),null!=t&&2!==t.length)throw new Error("tensor2d() requires shape to have two numbers");const a=Qc(e,n);if(2!==a.length&&1!==a.length)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return rh(e,t,a,n)}function _y(e,t,n){if(Ds(e),null!=t&&4!==t.length)throw new Error("tensor4d() requires shape to have four numbers");const a=Qc(e,n);if(4!==a.length&&1!==a.length)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return rh(e,t,a,n)}function Ty(e,t,n){if(Ds(e),null!=t&&5!==t.length)throw new Error("tensor5d() requires shape to have five numbers");const a=Qc(e,n);if(5!==a.length&&1!==a.length)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return rh(e,t,a,n)}function Iy(e,t,n){if(Ds(e),null!=t&&6!==t.length)throw new Error("tensor6d() requires shape to have six numbers");const a=Qc(e,n);if(6!==a.length&&1!==a.length)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(1===a.length&&null==t)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return rh(e,t=t||a,a,n)}function Ny(e,t,n){const a=t.rank>1?t.shape[t.rank-1]:1,i=t.rank>1?t.rank-1:1,s=`Must have updates.shape = indices.shape[:batchDim] + shape[sliceDim:], got updates.shape: ${n.shape}, indices.shape: ${t.shape}, shape: ${e}, sliceDim: ${a}, and batchDim: ${i}.`;if(n.rank1?t.shape[a-1]:1,s=n.length;let r=1;for(let e=i;e= 0 but got ${t}`);if(t>i)throw new Error(`'k' passed to topk() must be <= the last dimension (${i}) but got ${t}`);const s={x:a},r={k:t,sorted:n},[o,l]=Hc.runKernel(mu,s,r);return{values:o,indices:l}}});const My=ih({truncatedNormal_:function(e,t=0,n=1,a,i){if(ar(e),null!=a&&"bool"===a)throw new Error("Unsupported data type $ { dtype }");const s=new Fg(t,n,a,!0,i),r=vd(e,a);for(let e=0;e0,(()=>"The input tensor must be at least 1D"));const a={x:n},i={axis:t},[s,r]=Hc.runKernel(yu,a,i);return{values:s,indices:r}}});const Fy=ih({unsortedSegmentSum_:function(e,t,n){const a=th(e,"x","unsortedSegmentSum"),i=th(t,"segmentIds","unsortedSegmentSum","int32");Ns(Ms(n),(()=>"numSegments must be of dtype int"));const s={x:a,segmentIds:i},r={numSegments:n};return Hc.runKernel(vu,s,r)}});const Ly=ih({unstack_:function(e,t=0){const n=th(e,"x","unstack","string_or_numeric");Ns(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`));const a={value:n},i={axis:t};return Hc.runKernel(bu,a,i)}});function Py(e,t){return ig(e,t,"right")}function jy(e,t=!0,n,a){return Hc.makeVariable(e,t,n,a)}function Vy(e,t){const n=[];for(let e=0;e0,(()=>"mask cannot be scalar")),Rs(o.slice(s,s+r),i.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let e=s;et)).reverse()),Ns(a.rank===t.length,(()=>`Error in transpose: rank of input ${a.rank} must match length of perm ${t}.`)),t.forEach((e=>{Ns(e>=0&&e"All entries in 'perm' must be between 0 and "+(a.rank-1)+` but got ${t}`))})),a.rank<=1)return a.clone();const i={x:a},s={perm:t};return"complex64"===a.dtype?dh((()=>{let e=Hg(a),t=Ff(a);return e=Hc.runKernel(gu,{x:e},s),t=Hc.runKernel(gu,{x:t},s),n&&(t=$f(t)),sh(e,t)})):Hc.runKernel(gu,i,s)}});const qy=ih({movingAverage_:function(e,t,n,a,i=!0){const s=th(e,"v","movingAverage"),r=th(t,"x","movingAverage"),o=th(n,"decay","movingAverage");var l,u;u=r,Ns((l=s).dtype===u.dtype,(()=>`The dtypes of the first(${l.dtype}) and second(${u.dtype}) input must match`)),Ns(Os(s.shape,r.shape),(()=>"Shape mismatch in v and x"));const c=Rd(1),h=Ud(c,o);let d=Ed(Ud(r,s),h);if(i){Ns(null!=a,(()=>"When using zeroDebias: true, step is required."));const e=th(a,"step","movingAverage");d=Sd(d,Ud(c,Vd(o,e)))}return xd(s,d)}});const Hy=ih({scatterND_:function(e,t,n){ar(n);const a=th(e,"indices","scatterND","int32"),i=th(t,"updates","scatterND");Ry(i,a,n);const s={indices:a,updates:i},r={shape:n};return Hc.runKernel(Bl,s,r)}});const Ky=ih({sparseToDense_:function(e,t,n,a=0){ar(n);const i=th(e,"sparseIndices","sparseToDense","int32"),s=th(t,"sparseValues","sparseToDense","string_or_numeric"),r=th(a,"defaultValue","sparseToDense",s.dtype);!function(e,t,n,a){if("int32"!==e.dtype)throw new Error(`tf.sparseToDense() expects the indices to be int32 type, but the dtype was ${e.dtype}.`);if(e.rank>2)throw new Error(`sparseIndices should be a scalar, vector, or matrix, but got shape ${e.shape}.`);const i=e.rank>0?e.shape[0]:1,s=e.rank>1?e.shape[1]:1;if(n.length!==s)throw new Error(`outputShape has incorrect number of elements:, ${n.length}, should be: ${s}.`);const r=t.size;if(0!==t.rank&&(1!==t.rank||r!==i))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${i}]`);if(t.dtype!==a.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}(i,s,n,r);const o={sparseIndices:i,sparseValues:s,defaultValue:r},l={outputShape:n};return Hc.runKernel(nu,o,l)}});const $y=ih({gatherND_:function(e,t){const n=th(t,"indices","gatherND","int32"),a={params:th(e,"x","gatherND","string_or_numeric"),indices:n};return Hc.runKernel(To,a)}});const Zy=ih({dropout_:function(e,t,n,a){const i=th(e,"x","dropout");if(Ns("float32"===i.dtype,(()=>`x has to be a floating point tensor since it's going to be scaled, but got a ${i.dtype} tensor instead.`)),Ns(t>=0&&t<1,(()=>`rate must be a float in the range [0, 1), but got ${t}.`)),0===t)return e instanceof kc?i.clone():i;const s=function(e,t){if(null==t)return e.shape.slice();if(Os(e.shape,t))return t;if(e.shape.length===t.length){const n=[];for(let a=0;a1,(()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${a.rank}`)),Ns(a.rank-1===i.rank,(()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${a.rank} and targets rank ${i.rank}`)),Rs(a.shape.slice(0,a.shape.length-1),i.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");const s=a.shape[a.shape.length-1];Ns(n>0&&n<=s,(()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`));const r=await a.data(),o=await i.data(),[l,u]=[r.length/s,s],c=Us("bool",l);for(let e=0;et.value-e.value)),c[e]=0;for(let t=0;t`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`)),Ns(4===l.rank,(()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`)),Ns(4===n.length,(()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`));const u="NHWC"===s?o.shape[3]:o.shape[1],c="NHWC"===s?l.shape[3]:l.shape[1];Ns(u===n[2],(()=>`Error in conv2dDerFilter: depth of input ${u}) must match input depth in filter (${n[2]}.`)),Ns(c===n[3],(()=>`Error in conv2dDerFilter: depth of dy (${c}) must match output depth for filter (${n[3]}).`)),bm("conv2dDerFilter",i,r);const h={x:o,dy:l},d={strides:a,pad:i,dataFormat:s,dimRoundingMode:r,filterShape:n};return Hc.runKernel(qr,h,d)}});function eb(e,t,n){if(null==n||"linear"===n)return e;if("relu"===n)return Ed(e,Ay(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function tb(e,t){let n=t;const a=Hd(e.shape,t.shape);return a.length>0&&(n=Cf(n,a)),vm(n,e.shape)}function nb(e,t,n,a){if("linear"===t)return e;if("relu"===t)return $g(e);if("elu"===t)return hf(e);if("relu6"===t)return Zg(e);if("prelu"===t)return Ng(e,n);if("leakyrelu"===t)return Vf(e,a);if("sigmoid"===t)return Cm(e);throw new Error(`Unknown fused activation ${t}.`)}const ab=(e,t)=>!(e>0)||"linear"===t;const ib=ih({fusedConv2d_:function({x:e,filter:t,strides:n,pad:a,dataFormat:i="NHWC",dilations:s=[1,1],dimRoundingMode:r,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(l=l||"linear",!1===ab(Hc.state.gradientDepth,l)){Ns("NHWC"===i,(()=>`Error in fused conv2d: got dataFormat of ${i} but only NHWC is currently supported for the case of gradient depth is 0 and the activation is not linear.`));let h=Wm(e,t,n,a,i,s,r);return null!=o&&(h=xd(h,o)),nb(h,l,u,c)}const h=th(e,"x","conv2d","float32"),d=th(t,"filter","conv2d","float32");let p=h,m=!1;3===h.rank&&(m=!0,p=vm(h,[1,h.shape[0],h.shape[1],h.shape[2]])),Ns(4===p.rank,(()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`)),Ns(4===d.rank,(()=>`Error in fused conv2d: filter must be rank 4, but got rank ${d.rank}.`)),bm("fused conv2d",a,r);const f="NHWC"===i?p.shape[3]:p.shape[1];Ns(d.shape[2]===f,(()=>`Error in conv2d: depth of input (${f}) must match input depth for filter ${d.shape[2]}.`)),Ns(fm(n,s),(()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`));const g=om(p.shape,d.shape,n,s,a,r);let y,b;if(null!=o&&(y=th(o,"bias","fused conv2d"),[y]=Lc(y,h),"NHWC"===i?Kd(g.outShape,y.shape):(Ns(y.shape.length<=1,(()=>`Error in fused conv2d: only supports scalar or 1-D Tensor bias for NCHW format but got the bias of rank-${y.shape.length}.`)),Ns(0===y.shape.length||y.shape[0]===g.outChannels||1===y.shape[0],(()=>`Error in fused conv2d: bias shape (${y.shape}) is not compatible with the number of output channels (${g.outChannels})`)))),null!=u){const e=u.shape;if(Ns(e.length<=1||3===e.length,(()=>`Error in fused conv2d: only supports scalar, 1-D Tensor or 3-D Tensor PReLU activation weights but got a tensor of rank-${e.length}.`)),1===e.length)Ns(1===e[0]||e[0]===g.outChannels,(()=>`Error in fused conv2d: PReLU activation weights (${e}) is not compatible with the number of output channels (${g.outChannels}).`));else if(3===e.length)try{Kd(e,g.outShape)}catch(t){const n=`Error in fused conv2d: PReLU activation weights (${e}) is not compatible with the output shape of the conv2d (${g.outShape}).`;throw Error(n)}b=th(u,"prelu weights","fused conv2d")}const v=(e,t)=>{Ns("NHWC"===i,(()=>`Error in gradient of fused conv2D: got dataFormat of ${i} but only NHWC is currently supported.`));const[r,o,u,c]=t,h=eb(e,u,l);Ns(mm(s),(()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`));const d=[qm(o.shape,h,r,n,a),Jy(o,h,r.shape,n,a)];if(null!=c){const e=tb(c,h);d.push(e)}return d},k={x:p,filter:d,bias:y,preluActivationWeights:b},w={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r,activation:l,leakyreluAlpha:c};if(null==o){const e=Nd(((e,t,n)=>{let a=Hc.runKernel(Su,k,w);return n([t,e,a]),m&&(a=vm(a,[a.shape[1],a.shape[2],a.shape[3]])),{value:a,gradFunc:v}}));return e(p,d)}{const e=Nd(((e,t,n,a)=>{let i=Hc.runKernel(Su,k,w);return a([t,e,i,n]),m&&(i=vm(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:v}}));return e(p,d,y)}}});const sb=ih({depthwiseConv2dNativeBackpropFilter_:function(e,t,n,a,i,s=[1,1],r){let o=e;3===e.rank&&(o=vm(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;3===l.rank&&(l=vm(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const u={x:o,dy:l},c={strides:a,pad:i,dimRoundingMode:r,dilations:s,filterShape:n};return Hc.runKernel(io,u,c)}});const rb=ih({depthwiseConv2dNativeBackpropInput_:function(e,t,n,a,i,s=[1,1],r){let o=t,l=!1;3===t.rank&&(l=!0,o=vm(t,[1,t.shape[0],t.shape[1],t.shape[2]]));const u={dy:o,filter:n},c={strides:a,pad:i,dimRoundingMode:r,dilations:s,inputShape:e},h=Hc.runKernel(so,u,c);return l?vm(h,[h.shape[1],h.shape[2],h.shape[3]]):h}});const ob=ih({fusedDepthwiseConv2d_:function({x:e,filter:t,strides:n,pad:a,dataFormat:i="NHWC",dilations:s=[1,1],dimRoundingMode:r,bias:o,activation:l="linear",preluActivationWeights:u,leakyreluAlpha:c}){if(!1===ab(Hc.state.gradientDepth,l)){let h=nf(e,t,n,a,i,s,r);return null!=o&&(h=xd(h,o)),nb(h,l,u,c)}const h=th(e,"x","depthwiseConv2d","float32"),d=th(t,"filter","depthwiseConv2d","float32");let p=h,m=!1;3===h.rank&&(m=!0,p=vm(h,[1,h.shape[0],h.shape[1],h.shape[2]])),Ns(4===p.rank,(()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`)),Ns(4===d.rank,(()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${d.rank}.`)),Ns(p.shape[3]===d.shape[2],(()=>`Error in fused depthwiseConv2d: number of input channels (${p.shape[3]}) must match the inChannels dimension in filter ${d.shape[2]}.`)),null==s&&(s=[1,1]),Ns(fm(n,s),(()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`)),bm("fused depthwiseConv2d",a,r);const f=om(p.shape,d.shape,n,s,a,r,!0);let g,y;null!=o&&(g=th(o,"bias","fused conv2d"),[g]=Lc(g,h),Kd(f.outShape,g.shape)),null!=u&&(y=th(u,"prelu weights","fused depthwiseConv2d"));const b=(e,t)=>{Ns(mm(s),(()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`));const[i,o,u,c]=t,h=eb(e,u,l),d=rb(o.shape,h,i,n,a,s,r),p=sb(o,h,i.shape,n,a,s,r);if(null!=c){return[d,p,tb(g,h)]}return[d,p]},v={x:p,filter:d,bias:g,preluActivationWeights:y},k={strides:n,pad:a,dataFormat:i,dilations:s,dimRoundingMode:r,activation:l,leakyreluAlpha:c};if(null==o){const e=Nd(((e,t,n)=>{let a=Hc.runKernel(Eu,v,k);return n([t,e,a]),m&&(a=vm(a,[a.shape[1],a.shape[2],a.shape[3]])),{value:a,gradFunc:b}}));return e(p,d)}{const e=Nd(((e,t,n,a)=>{let i=Hc.runKernel(Eu,v,k);return a([t,e,i,n]),m&&(i=vm(i,[i.shape[1],i.shape[2],i.shape[3]])),{value:i,gradFunc:b}}));return e(p,d,g)}}});const lb=ih({fusedMatMul_:function({a:e,b:t,transposeA:n=!1,transposeB:a=!1,bias:i,activation:s="linear",preluActivationWeights:r,leakyreluAlpha:o=.2}){if(!1===ab(Hc.state.gradientDepth,s)){let l=xm(e,t,n,a);return null!=i&&(l=xd(l,i)),nb(l,s,r,o)}let l=th(e,"a","fused matMul"),u=th(t,"b","fused matMul");[l,u]=Lc(l,u);const c=n?l.shape[l.rank-2]:l.shape[l.rank-1],h=a?u.shape[u.rank-1]:u.shape[u.rank-2],d=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=a?u.shape[u.rank-2]:u.shape[u.rank-1],m=l.shape.slice(0,-2),f=u.shape.slice(0,-2),g=zs(m),y=zs(f);Ns(c===h,(()=>`Error in fused matMul: inner shapes (${c}) and (${h}) of Tensors with shapes ${l.shape} and ${u.shape} and transposeA=${n} and transposeB=${a} must match.`));const b=Kd(l.shape.slice(0,-2),u.shape.slice(0,-2)).concat([d,p]),v=vm(l,n?[g,c,d]:[g,d,c]),k=vm(u,a?[y,p,h]:[y,h,p]);let w,A;null!=i&&(w=th(i,"bias","fused matMul"),[w]=Lc(w,l),Kd(b,w.shape)),null!=r&&(A=th(r,"prelu weights","fused matMul"));const x=(e,t)=>{const[r,o,l,u]=t,c=eb(vm(e,l.shape),l,s);let h,d;if(n||a?!n&&a?(h=xm(c,o,!1,!1),d=xm(c,r,!0,!1)):n&&!a?(h=xm(o,c,!1,!0),d=xm(r,c,!1,!1)):(h=xm(o,c,!0,!0),d=xm(c,r,!0,!0)):(h=xm(c,o,!1,!0),d=xm(r,c,!0,!1)),null!=i){return[h,d,tb(u,c)]}return[h,d]},C={a:v,b:k,bias:w,preluActivationWeights:A},S={transposeA:n,transposeB:a,activation:s,leakyreluAlpha:o};if(null==i){const e=Nd(((e,t,n)=>{const a=Hc.runKernel(Cu,C,S);return n([e,t,a]),{value:vm(a,b),gradFunc:x}}));return e(v,k)}{const e=Nd(((e,t,n,a)=>{const i=Hc.runKernel(Cu,C,S);return a([e,t,i,n]),{value:vm(i,b),gradFunc:x}}));return e(v,k,w)}}});const ub=ih({hammingWindow_:function(e){return Yy(e,.54,.46)}});const cb=ih({hannWindow_:function(e){return Yy(e,.5,.5)}});const hb=ih({frame_:function(e,t,n,a=!1,i=0){let s=0;const r=[];for(;s+t<=e.size;)r.push(Sm(e,s,t)),s+=n;if(a)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${r.rank}.`)),Ns(2===o.rank&&4===o.shape[1],(()=>`Error in cropAndResize: boxes must be have size [${u},4] but had shape ${o.shape}.`)),Ns(1===l.rank&&l.shape[0]===u,(()=>`Error in cropAndResize: boxInd must be have size [${u}] but had shape ${o.shape}.`)),Ns(2===a.length,(()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${a.length}.`)),Ns(a[0]>=1&&a[1]>=1,(()=>`cropSize must be atleast [1,1], but was ${a}`)),Ns("bilinear"===i||"nearest"===i,(()=>`method must be bilinear or nearest, but was ${i}`));const c={image:r,boxes:o,boxInd:l},h={method:i,extrapolationValue:s,cropSize:a};return Hc.runKernel(eo,c,h)}});const mb=ih({flipLeftRight_:function(e){const t=th(e,"image","flipLeftRight","float32");Ns(4===t.rank,(()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`));const n={image:t};return Hc.runKernel(xo,n,{})}});const fb=ih({grayscaleToRGB_:function(e){const t=th(e,"image","grayscaleToRGB"),n=t.rank-1,a=t.shape[n];Ns(t.rank>=2,(()=>`Error in grayscaleToRGB: images must be at least rank 2, but got rank ${t.rank}.`)),Ns(1===a,(()=>`Error in grayscaleToRGB: last dimension of a grayscale image should be size 1, but got size ${a}.`));const i=new Array(t.rank);return i.fill(1,0,n),i[n]=3,Rf(t,i)}});const gb=ih({rgbToGrayscale_:function(e){const t=th(e,"image","RGBToGrayscale"),n=t.rank-1,a=t.shape[n];Ns(t.rank>=2,(()=>`Error in RGBToGrayscale: images must be at least rank 2, but got rank ${t.rank}.`)),Ns(3===a,(()=>`Error in RGBToGrayscale: last dimension of an RGB image should be size 3, but got size ${a}.`));const i=t.dtype,s=kd(t,"float32"),r=Sy([.2989,.587,.114]);let o;switch(t.rank){case 2:o=cf("ij,j->i",s,r);break;case 3:o=cf("ijk,k->ij",s,r);break;case 4:o=cf("ijkl,l->ijk",s,r);break;case 5:o=cf("ijklm,m->ijkl",s,r);break;case 6:o=cf("ijklmn,n->ijklm",s,r);break;default:throw new Error("Not a valid tensor rank.")}return o=If(o,-1),kd(o,i)}});const yb=ih({rotateWithOffset_:function(e,t,n=0,a=.5){const i=th(e,"image","rotateWithOffset","float32");Ns(4===i.rank,(()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${i.rank}.`));const s={image:i},r={radians:t,fillValue:n,center:a};return Hc.runKernel(xu,s,r)}});function bb(e,t,n,a,i,s){null==a&&(a=.5),null==i&&(i=Number.NEGATIVE_INFINITY),null==s&&(s=0);const r=e.shape[0];return n=Math.min(n,r),Ns(0<=a&&a<=1,(()=>`iouThreshold must be in [0, 1], but was '${a}'`)),Ns(2===e.rank,(()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`)),Ns(4===e.shape[1],(()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`)),Ns(1===t.rank,(()=>"scores must be a 1D tensor")),Ns(t.shape[0]===r,(()=>`scores has incompatible shape with boxes. Expected ${r}, but was ${t.shape[0]}`)),Ns(0<=s&&s<=1,(()=>`softNmsSigma must be in [0, 1], but was '${s}'`)),{maxOutputSize:n,iouThreshold:a,scoreThreshold:i,softNmsSigma:s}}const vb=ih({nonMaxSuppression_:function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY){const s=th(e,"boxes","nonMaxSuppression","float32"),r=th(t,"scores","nonMaxSuppression","float32"),o=bb(s,r,n,a,i),l={maxOutputSize:n=o.maxOutputSize,iouThreshold:a=o.iouThreshold,scoreThreshold:i=o.scoreThreshold};return Hc.runKernel(cl,{boxes:s,scores:r},l)}});function kb(e,t,n){const a=function(e,t,n){return function(e,t,n){let a=0,i=e.length,s=0,r=!1;for(;a>>1);const o=n(t,e[s]);o>0?a=s+1:(i=s,r=!o)}return r?a:-a-1}(e,t,n||wb)}(e,t,n),i=a<0?-(a+1):a;e.splice(i,0,t)}function wb(e,t){return e>t?1:ei&&u.push({score:t[e],boxIndex:e,suppressBeginIndex:0});u.sort(Tb);const c=s>0?-.5/s:0,h=[],d=[];for(;h.length0;){const t=u.pop(),{score:n,boxIndex:s,suppressBeginIndex:r}=t;if(n=r;--n){const r=Eb(e,s,h[n]);if(r>=a){o=!0;break}if(t.score=t.score*_b(a,c,r),t.score<=i)break}t.suppressBeginIndex=h.length,o||(t.score===n?(h.push(s),d.push(t.score)):t.score>i&&kb(u,t,Tb))}const p=h.length,m=n-p;o&&m>0&&(h.push(...new Array(m).fill(0)),d.push(...new Array(m).fill(0)));const f={selectedIndices:h};return r&&(f.selectedScores=d),l&&(f.validOutputs=p),f}function Eb(e,t,n){const a=e.subarray(4*t,4*t+4),i=e.subarray(4*n,4*n+4),s=Math.min(a[0],a[2]),r=Math.min(a[1],a[3]),o=Math.max(a[0],a[2]),l=Math.max(a[1],a[3]),u=Math.min(i[0],i[2]),c=Math.min(i[1],i[3]),h=Math.max(i[0],i[2]),d=Math.max(i[1],i[3]),p=(o-s)*(l-r),m=(h-u)*(d-c);if(p<=0||m<=0)return 0;const f=Math.max(s,u),g=Math.max(r,c),y=Math.min(o,h),b=Math.min(l,d),v=Math.max(y-f,0)*Math.max(b-g,0);return v/(p+m-v)}function _b(e,t,n){const a=Math.exp(t*n*n);return n<=e?a:0}function Tb(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}const Ib=async function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY){const s=th(e,"boxes","nonMaxSuppressionAsync"),r=th(t,"scores","nonMaxSuppressionAsync"),o=bb(s,r,n,a,i);n=o.maxOutputSize,a=o.iouThreshold,i=o.scoreThreshold;const l=await Promise.all([s.data(),r.data()]),u=l[0],c=l[1],{selectedIndices:h}=Ab(u,c,n,a,i);return s!==e&&s.dispose(),r!==t&&r.dispose(),Sy(h,"int32")};const Nb=ih({nonMaxSuppressionWithScore_:function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=0){const r=th(e,"boxes","nonMaxSuppression"),o=th(t,"scores","nonMaxSuppression"),l=bb(r,o,n,a,i,s),u={boxes:r,scores:o},c={maxOutputSize:n=l.maxOutputSize,iouThreshold:a=l.iouThreshold,scoreThreshold:i=l.scoreThreshold,softNmsSigma:s=l.softNmsSigma},h=Hc.runKernel(dl,u,c);return{selectedIndices:h[0],selectedScores:h[1]}}});const Rb=async function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=0){const r=th(e,"boxes","nonMaxSuppressionAsync"),o=th(t,"scores","nonMaxSuppressionAsync"),l=bb(r,o,n,a,i,s);n=l.maxOutputSize,a=l.iouThreshold,i=l.scoreThreshold,s=l.softNmsSigma;const u=await Promise.all([r.data(),o.data()]),c=u[0],h=u[1],{selectedIndices:d,selectedScores:p}=Cb(c,h,n,a,i,s);return r!==e&&r.dispose(),o!==t&&o.dispose(),{selectedIndices:Sy(d,"int32"),selectedScores:Sy(p)}};const Db=ih({nonMaxSuppressionPadded_:function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=!1){const r=th(e,"boxes","nonMaxSuppression"),o=th(t,"scores","nonMaxSuppression"),l=bb(r,o,n,a,i,null),u={boxes:r,scores:o},c={maxOutputSize:l.maxOutputSize,iouThreshold:l.iouThreshold,scoreThreshold:l.scoreThreshold,padToMaxOutputSize:s},h=Hc.runKernel(hl,u,c);return{selectedIndices:h[0],validOutputs:h[1]}}});const zb=async function(e,t,n,a=.5,i=Number.NEGATIVE_INFINITY,s=!1){const r=th(e,"boxes","nonMaxSuppressionAsync"),o=th(t,"scores","nonMaxSuppressionAsync"),l=bb(r,o,n,a,i,null),u=l.maxOutputSize,c=l.iouThreshold,h=l.scoreThreshold,[d,p]=await Promise.all([r.data(),o.data()]),{selectedIndices:m,validOutputs:f}=xb(d,p,u,c,h,s);return r!==e&&r.dispose(),o!==t&&o.dispose(),{selectedIndices:Sy(m,"int32"),validOutputs:Rd(f,"int32")}};const Ob=ih({resizeBilinear_:function(e,t,n=!1,a=!1){const i=th(e,"images","resizeBilinear");Ns(3===i.rank||4===i.rank,(()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${i.rank}.`)),Ns(2===t.length,(()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`)),Ns(!1===a||!1===n,(()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false."));let s=i,r=!1;3===i.rank&&(r=!0,s=vm(i,[1,i.shape[0],i.shape[1],i.shape[2]]));const[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:a,size:t},u=Hc.runKernel(Nl,o,l);return r?vm(u,[u.shape[1],u.shape[2],u.shape[3]]):u}});const Mb=ih({resizeNearestNeighbor_:function(e,t,n=!1,a=!1){const i=th(e,"images","resizeNearestNeighbor");Ns(3===i.rank||4===i.rank,(()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${i.rank}.`)),Ns(2===t.length,(()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`)),Ns("float32"===i.dtype||"int32"===i.dtype,(()=>"`images` must have `int32` or `float32` as dtype")),Ns(!1===a||!1===n,(()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false."));let s=i,r=!1;3===i.rank&&(r=!0,s=vm(i,[1,i.shape[0],i.shape[1],i.shape[2]]));const[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:a,size:t},u=Hc.runKernel(Tl,o,l);return r?vm(u,[u.shape[1],u.shape[2],u.shape[3]]):u}});const Bb=ih({threshold_:function(e,t="binary",n=!1,a=.5){const i=th(e,"image","threshold"),s=i.shape[0]*i.shape[1];let r,o,l,u,c=Ed(Sy([a]),255);if(Ns(3===i.rank,(()=>`Error in threshold: image must be rank 3,but got rank ${i.rank}.`)),Ns(3===i.shape[2]||1===i.shape[2],(()=>`Error in threshold: image color channel must be equal to 3 or 1but got ${i.shape[2]}.`)),Ns("int32"===i.dtype||"float32"===i.dtype,(()=>`Error in dtype: image dtype must be int32 or float32,but got dtype ${i.dtype}.`)),Ns("otsu"===t||"binary"===t,(()=>`Method must be binary or otsu, but was ${t}`)),3===i.shape[2]){[r,o,l]=yy(i,[1,1,1],-1);const e=Ed(r,.2989),t=Ed(o,.587),n=Ed(l,.114);u=xd(xd(e,t),n)}else u=e;if("otsu"===t){c=function(e,t){let n,a,i,s,r,o,l=Sy([-1]),u=Sy([0]),c=Sy([0]);for(let h=0;h`Error in transform: image must be rank 4,but got rank ${r.rank}.`)),Ns(2===o.rank&&(o.shape[0]===r.shape[0]||1===o.shape[0])&&8===o.shape[1],(()=>"Error in transform: Input transform should be batch x 8 or 1 x 8")),Ns(null==s||2===s.length,(()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`));const l={image:r,transforms:o},u={interpolation:n,fillMode:a,fillValue:i,outputShape:s};return Hc.runKernel(fu,l,u)}});const Lb=ih({bandPart_:function(e,t,n){const a=th(e,"a","bandPart");Ns(a.rank>=2,(()=>`bandPart(): Rank must be at least 2, got ${a.rank}.`));const i=a.shape,[s,r]=a.shape.slice(-2);let o,l;"number"==typeof t?(Ns(t%1==0,(()=>`bandPart(): numLower must be an integer, got ${t}.`)),Ns(t<=s,(()=>`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`)),o=th(t<0?s:t,"numLower","bandPart")):(Ns("int32"===t.dtype,(()=>"bandPart(): numLower's dtype must be an int32.")),o=of(Uf(t,0),s,pg(t,s))),"number"==typeof n?(Ns(n%1==0,(()=>`bandPart(): numUpper must be an integer, got ${n}.`)),Ns(n<=r,(()=>`bandPart(): numUpper (${n}) must not be greater than the number of columns (${r}).`)),l=th(n<0?r:n,"numUpper","bandPart")):(Ns("int32"===n.dtype,(()=>"bandPart(): numUpper's dtype must be an int32.")),l=of(Uf(n,0),r,pg(n,r)));const u=vm(qg(0,s,1,"int32"),[-1,1]),c=qg(0,r,1,"int32"),h=Ud(u,c),d=Jf(Wf(h,o),Bf(h,$f(l))),p=cg([s,r],a.dtype);return vm(wy(Ly(vm(a,[-1,s,r])).map((e=>of(d,e,p)))),i)}});const Pb=ih({gramSchmidt_:function(e){let t;if(Array.isArray(e)){t=!1,Ns(null!=e&&e.length>0,(()=>"Gram-Schmidt process: input must not be null, undefined, or empty"));const n=e[0].shape[0];for(let t=1;t`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[t].shape[0]} vs. ${n})`))}else t=!0,e=yy(e,e.shape[0],0).map((e=>ky(e,[0])));Ns(e.length<=e[0].shape[0],(()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`));const n=[],a=e;for(let t=0;t{let e=a[t];if(t>0)for(let a=0;a{Ns(2===e.shape.length,(()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`));const n=e.shape[0],a=e.shape[1];let i=Df(n),s=wd(e);const r=Ey([[1]],[1,1]);let o=wd(r);const l=n>=a?a:n;for(let e=0;e{const t=Sm(s,[e,e],[n-e,1]),l=Ef(t),u=Sm(s,[e,e],[1,1]),c=of(Mf(u,0),Ey([[-1]]),Ey([[1]])),h=Ud(u,Ed(c,l)),d=Sd(t,h);o=1===d.shape[0]?wd(r):Am([r,Sm(d,[1,0],[d.shape[0]-1,d.shape[1]])],0);const p=$f(Sd(xm(c,h),l)),m=Sm(s,[e,0],[n-e,a]),f=Ed(p,o),g=Gy(o);if(0===e)s=Ud(m,xm(f,xm(g,m)));else{const t=Ud(m,xm(f,xm(g,m)));s=Am([Sm(s,[0,0],[e,a]),t],0)}const y=Gy(f),b=Sm(i,[0,e],[n,i.shape[1]-e]);if(0===e)i=Ud(b,xm(xm(b,o),y));else{const t=Ud(b,xm(xm(b,o),y));i=Am([Sm(i,[0,0],[n,e]),t],1)}return[o,s,i]})),ph([t,l,u])}return!t&&n>a&&(i=Sm(i,[0,0],[n,a]),s=Sm(s,[0,0],[a,a])),[i,s]}))}const Vb=ih({qr_:function(e,t=!1){if(Ns(e.rank>=2,(()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`)),2===e.rank)return jb(e,t);{const n=e.shape.slice(0,e.shape.length-2).reduce(((e,t)=>e*t)),a=Ly(vm(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),i=[],s=[];a.forEach((e=>{const[n,a]=jb(e,t);i.push(n),s.push(a)}));return[vm(wy(i,0),e.shape),vm(wy(s,0),e.shape)]}}});var Ub,Wb;(Wb=Ub||(Ub={}))[Wb.NONE=0]="NONE",Wb[Wb.MEAN=1]="MEAN",Wb[Wb.SUM=2]="SUM",Wb[Wb.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS";const Gb=ih({computeWeightedLoss_:function(e,t,n=Ub.SUM_BY_NONZERO_WEIGHTS){const a=th(e,"losses","computeWeightedLoss");let i=null;null!=t&&(i=th(t,"weights","computeWeightedLoss"));const s=null==i?a:Ed(a,i);if(n===Ub.NONE)return s;if(n===Ub.SUM)return Cf(s);if(n===Ub.MEAN){if(null==i)return ug(s);{const e=a.size/i.size,t=Sd(Cf(s),Cf(i));return e>1?Sd(t,Rd(e)):t}}if(n===Ub.SUM_BY_NONZERO_WEIGHTS){if(null==i)return Sd(Cf(s),Rd(a.size));{const e=Ed(i,hg(a.shape)),t=kd(Cf(vg(e,Rd(0))),"float32");return Sd(Cf(s),t)}}throw Error(`Unknown reduction: ${n}`)}});const qb=ih({absoluteDifference_:function(e,t,n,a=Ub.SUM_BY_NONZERO_WEIGHTS){const i=th(e,"labels","absoluteDifference"),s=th(t,"predictions","absoluteDifference");let r=null;null!=n&&(r=th(n,"weights","absoluteDifference")),Rs(i.shape,s.shape,"Error in absoluteDifference: ");const o=Gd(Ud(i,s));return Gb(o,r,a)}});const Hb=ih({cosineDistance_:function(e,t,n,a,i=Ub.SUM_BY_NONZERO_WEIGHTS){const s=th(e,"labels","cosineDistance"),r=th(t,"predictions","cosineDistance");let o=null;null!=a&&(o=th(a,"weights","cosineDistance")),Rs(s.shape,r.shape,"Error in cosineDistance: ");const l=Rd(1),u=Ud(l,Cf(Ed(s,r),n,!0));return Gb(u,o,i)}});const Kb=ih({hingeLoss_:function(e,t,n,a=Ub.SUM_BY_NONZERO_WEIGHTS){let i=th(e,"labels","hingeLoss");const s=th(t,"predictions","hingeLoss");let r=null;null!=n&&(r=th(n,"weights","hingeLoss")),Rs(i.shape,s.shape,"Error in hingeLoss: ");const o=Rd(1);i=Ud(Ed(Rd(2),i),o);const l=$g(Ud(o,Ed(i,s)));return Gb(l,r,a)}});const $b=ih({huberLoss_:function(e,t,n,a=1,i=Ub.SUM_BY_NONZERO_WEIGHTS){const s=th(e,"labels","huberLoss"),r=th(t,"predictions","huberLoss");let o=null;null!=n&&(o=th(n,"weights","huberLoss")),Rs(s.shape,r.shape,"Error in huberLoss: ");const l=Rd(a),u=Gd(Ud(r,s)),c=pg(u,l),h=Ud(u,c),d=xd(Ed(Rd(.5),Td(c)),Ed(l,h));return Gb(d,o,i)}});const Zb=ih({logLoss_:function(e,t,n,a=1e-7,i=Ub.SUM_BY_NONZERO_WEIGHTS){const s=th(e,"labels","logLoss"),r=th(t,"predictions","logLoss");let o=null;null!=n&&(o=th(n,"weights","logLoss")),Rs(s.shape,r.shape,"Error in logLoss: ");const l=Rd(1),u=Rd(a),c=$f(Ed(s,Hf(xd(r,u)))),h=Ed(Ud(l,s),Hf(xd(Ud(l,r),u))),d=Ud(c,h);return Gb(d,o,i)}});const Xb=ih({meanSquaredError_:function(e,t,n,a=Ub.SUM_BY_NONZERO_WEIGHTS){const i=th(e,"labels","meanSquaredError"),s=th(t,"predictions","meanSquaredError");let r=null;null!=n&&(r=th(n,"weights","meanSquaredError")),Rs(i.shape,s.shape,"Error in meanSquaredError: ");const o=vy(i,s);return Gb(o,r,a)}});const Yb=ih({sigmoidCrossEntropy_:function(e,t,n,a=0,i=Ub.SUM_BY_NONZERO_WEIGHTS){let s=th(e,"multiClassLabels","sigmoidCrossEntropy");const r=th(t,"logits","sigmoidCrossEntropy");let o=null;if(null!=n&&(o=th(n,"weights","sigmoidCrossEntropy")),Rs(s.shape,r.shape,"Error in sigmoidCrossEntropy: "),a>0){const e=Rd(a),t=Rd(1),n=Rd(.5);s=xd(Ed(s,Ud(t,e)),Ed(n,e))}const l=function(e,t){const n=th(e,"labels","sigmoidCrossEntropyWithLogits"),a=th(t,"logits","sigmoidCrossEntropyWithLogits");Rs(n.shape,a.shape,"Error in sigmoidCrossEntropyWithLogits: ");const i=$g(a),s=Ed(a,n),r=Kf(Tf($f(Gd(a))));return xd(Ud(i,s),r)}(s,r);return Gb(l,o,i)}});const Qb=ih({softmaxCrossEntropy_:function(e,t,n,a=0,i=Ub.SUM_BY_NONZERO_WEIGHTS){let s=th(e,"onehotLabels","softmaxCrossEntropy");const r=th(t,"logits","softmaxCrossEntropy");let o=null;if(null!=n&&(o=th(n,"weights","softmaxCrossEntropy")),Rs(s.shape,r.shape,"Error in softmaxCrossEntropy: "),a>0){const e=Rd(a),t=Rd(1),n=Rd(s.shape[1]);s=xd(Ed(s,Ud(t,e)),Sd(e,n))}const l=function(e,t,n=-1){if(-1===n&&(n=t.rank-1),n!==t.rank-1)throw Error(`Softmax cross entropy along a non-last dimension is not yet supported. Labels / logits was rank ${t.rank} and dim was ${n}`);const a=Nd(((e,t,a)=>{const i=Qf(t,[n],!0),s=Ud(kd(t,"float32"),i);a([e,s]);const r=$f(Ed(s,e));return{value:Cf(r,[n]),gradFunc:(e,t)=>{const[a,i]=t,s=yf(e.shape,[n]);return[Ed(vm(e,s),Ud(kd(a,"float32"),Tf(i))),Ed(vm(e,s),Ud(Tf(i),kd(a,"float32")))]}}}));return a(e,t)}(s,r);return Gb(l,o,i)}});const Jb={fft:my,ifft:fy,rfft:by,irfft:gy},ev={hammingWindow:ub,hannWindow:cb,frame:hb,stft:db},tv={flipLeftRight:mb,grayscaleToRGB:fb,resizeNearestNeighbor:Mb,resizeBilinear:Ob,rgbToGrayscale:gb,rotateWithOffset:yb,cropAndResize:pb,nonMaxSuppression:vb,nonMaxSuppressionAsync:Ib,nonMaxSuppressionWithScore:Nb,nonMaxSuppressionWithScoreAsync:Rb,nonMaxSuppressionPadded:Db,nonMaxSuppressionPaddedAsync:zb,threshold:Bb,transform:Fb},nv={bandPart:Lb,gramSchmidt:Pb,qr:Vb},av={absoluteDifference:qb,computeWeightedLoss:Gb,cosineDistance:Hb,hingeLoss:Kb,huberLoss:$b,logLoss:Zb,meanSquaredError:Xb,sigmoidCrossEntropy:Yb,softmaxCrossEntropy:Qb},iv={sparseFillEmptyRows:ih({sparseFillEmptyRows_:function(e,t,n,a){const i=th(e,"indices","sparseFillEmptyRows","int32"),s=th(t,"values","sparseFillEmptyRows"),r=th(n,"denseShape","sparseFillEmptyRows","int32"),o=th(a,"defaultValue","sparseFillEmptyRows",s.dtype);if(2!==i.rank)throw new Error(`Indices should be Tensor2D but received shape\n ${i.shape}`);if(1!==s.rank)throw new Error(`Values should be Tensor1D but received shape ${s.shape}`);if(1!==r.rank)throw new Error(`Dense shape should be Tensor1D but received shape ${r.shape}`);if(0!==o.rank)throw new Error(`Default value should be a scalar but received shape ${o.shape}`);const l={indices:i,values:s,denseShape:r,defaultValue:o},u=Hc.runKernel(Ql,l);return{outputIndices:u[0],outputValues:u[1],emptyRowIndicator:u[2],reverseIndexMap:u[3]}}}),sparseReshape:ih({sparseReshape_:function(e,t,n){const a=th(e,"inputIndices","sparseReshape","int32"),i=th(t,"inputShape","sparseReshape","int32"),s=th(n,"newShape","sparseReshape","int32");if(2!==a.rank)throw new Error(`Input indices should be Tensor2D but received shape\n ${a.shape}`);if(1!==i.rank)throw new Error(`Input shape should be Tensor1D but received shape ${i.shape}`);if(1!==s.rank)throw new Error(`New shape should be Tensor1D but received shape ${s.shape}`);const r={inputIndices:a,inputShape:i,newShape:s},o=Hc.runKernel(Jl,r);return{outputIndices:o[0],outputShape:o[1]}}}),sparseSegmentMean:ih({sparseSegmentMean_:function(e,t,n){const a=th(e,"data","sparseSegmentMean"),i=th(t,"indices","sparseSegmentMean","int32"),s=th(n,"segmentIds","sparseSegmentMean","int32");if(a.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${i.shape}`);if(1!==s.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${s.shape}`);const r={data:a,indices:i,segmentIds:s};return Hc.runKernel(eu,r)}}),sparseSegmentSum:ih({sparseSegmentSum_:function(e,t,n){const a=th(e,"data","sparseSegmentSum"),i=th(t,"indices","sparseSegmentSum","int32"),s=th(n,"segmentIds","sparseSegmentSum","int32");if(a.rank<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.rank)throw new Error(`Indices should be Tensor1D but received shape\n ${i.shape}`);if(1!==s.rank)throw new Error(`Segment ids should be Tensor1D but received shape\n ${s.shape}`);const r={data:a,indices:i,segmentIds:s};return Hc.runKernel(tu,r)}})},sv={stringNGrams:ih({stringNGrams_:function(e,t,n,a,i,s,r,o){const l=th(e,"data","stringNGrams","string");if("string"!==l.dtype)throw new Error("Data must be of datatype string");if(1!==l.shape.length)throw new Error(`Data must be a vector, saw: ${l.shape}`);const u=th(t,"dataSplits","stringNGrams");if("int32"!==u.dtype)throw new Error("Data splits must be of datatype int32");const c={separator:n,nGramWidths:a,leftPad:i,rightPad:s,padWidth:r,preserveShortSequences:o},h={data:l,dataSplits:u},d=Hc.runKernel(ou,h,c);return{nGrams:d[0],nGramsSplits:d[1]}}}),stringSplit:ih({stringSplit_:function(e,t,n=!0){const a=th(e,"input","stringSplit","string"),i=th(t,"delimiter","stringSplit","string");if(1!==a.rank)throw new Error(`Input should be Tensor1D but received shape ${a.shape}`);if(0!==i.rank)throw new Error(`Delimiter should be a scalar but received shape ${i.shape}`);const s={skipEmpty:n},r={input:a,delimiter:i},o=Hc.runKernel(lu,r,s);return{indices:o[0],values:o[1],shape:o[2]}}}),stringToHashBucketFast:ih({stringToHashBucketFast_:function(e,t){const n=th(e,"input","stringToHashBucketFast","string"),a={numBuckets:t};if(t<=0)throw new Error("Number of buckets must be at least 1");const i={input:n};return Hc.runKernel(uu,i,a)}}),staticRegexReplace:ih({staticRegexReplace_:function(e,t,n,a=!0){const i=th(e,"input","staticRegexReplace","string"),s={pattern:t,rewrite:n,replaceGlobal:a};return Hc.runKernel(su,{x:i},s)}})};const rv=class{static sgd(e){return new Xd(e)}static momentum(e,t,n=!1){return new Yd(e,t,n)}static rmsprop(e,t=.9,n=0,a=null,i=!1){return new Qd(e,t,n,a,i)}static adam(e=.001,t=.9,n=.999,a=null){return new Wd(e,t,n,a)}static adadelta(e=.001,t=.95,n=null){return new Ld(e,t,n)}static adamax(e=.002,t=.9,n=.999,a=null,i=0){return new Zd(e,t,n,a,i)}static adagrad(e,t=.1){return new jd(e,t)}},ov="undefined"!=typeof requestAnimationFrame?requestAnimationFrame:"undefined"!=typeof setImmediate?setImmediate:e=>e();function lv(){return new Promise((e=>ov((()=>e()))))}function uv(e,t){const n=e[0].length;e.forEach(((e,t)=>{Ns(e.length===n,(()=>`Error in concat${n}D: rank of tensors[${t}] must be the same as the rank of the rest (${n})`))})),Ns(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`));const a=e[0];e.forEach(((e,i)=>{for(let s=0;s`Error in concat${n}D: Shape of tensors[${i}] (${e}) does not match the shape of the rest (${a}) along the non-concatenated axis ${i}.`))}))}function cv(e,t){const n=e[0].slice();for(let a=1;a=0)if(o>=0){if(o!==s)throw new Error(`rt input.shape and shape=${t} are incompatible: rt input.shape[${i+e}] = ${s} but shape[${i+e}] = ${o}`)}else a[r]=s}return a}function mv(e){const t={FIRST_DIM_SIZE:hv.FIRST_DIM_SIZE,VALUE_ROWIDS:hv.VALUE_ROWIDS,ROW_LENGTHS:hv.ROW_LENGTHS,ROW_SPLITS:hv.ROW_SPLITS,ROW_LIMITS:hv.ROW_LIMITS,ROW_STARTS:hv.ROW_STARTS},n=[];for(const a of e){if(!(a in t))break;n.push(t[a])}return n}function fv(e){return 0===e.length?0:e[0]===hv.FIRST_DIM_SIZE?e.length-1:e.length}function gv(e,t){if(null==e||null==t)return;const n=e.length,a=t.length;if(n>=a)throw new Error(`defaultValue.shape=${e} and ragged tensor flatValues.shape=${t}, are incompatible: defaultValue.rank = ${n} must be less than ragged tensor input flatValues.rank = ${a})`);for(let i=0;i=0&&a>=0&&1!==n&&n!==a)throw new Error(`defaultValue.shape=${e}, and ragged tensor input flatValues.shape=${t} are incompatible: defaultValue.shape[${i-e.length}] = ${n} but ragged tensor input.flatValues.shape[${i-e.length}] = ${a}`)}}(dv=hv||(hv={}))[dv.FIRST_DIM_SIZE=0]="FIRST_DIM_SIZE",dv[dv.VALUE_ROWIDS=1]="VALUE_ROWIDS",dv[dv.ROW_LENGTHS=2]="ROW_LENGTHS",dv[dv.ROW_SPLITS=3]="ROW_SPLITS",dv[dv.ROW_LIMITS=4]="ROW_LIMITS",dv[dv.ROW_STARTS=5]="ROW_STARTS";const yv=30;function bv(e){return e<=yv?e:Xs(e,Math.floor(Math.sqrt(e)))}function vv(e,t,n){return[n*("number"==typeof e?e:e[0]),t*("number"==typeof e?e:e[1])]}function kv(e,t,n,a=!0){let i=[];if(a)i=i.concat(t.slice(0)),i.push(e[0]/n),i=i.concat(e.slice(1));else{i=i.concat(e[0]);const n=t.length;for(let a=0;a=2*t+1||a%2==1?i.push(a):n.push(a);a.push(...n),a.push(0),a.push(...i)}return a}function Av(e,t,n,a=!0){const i=[];a?i.push(e[0]/n):i.push(e[0]*n);for(let n=1;nn)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[a-1]} vs. ${n}`);if(0===zs(e.shape))throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);const i=t.shape,s=i[i.length-1];let r=1;for(let e=0;ee/u)),1].slice(0,s);return[l,r,u,c]}const Ev=1.7580993408473768,_v=1.0507009873554805,Tv=.3275911,Iv=.254829592,Nv=-.284496736,Rv=1.421413741,Dv=-1.453152027,zv=1.061405429;function Ov(e,t){if(e.length!==t.length)throw new Error(`Cannot merge real and imag arrays of different lengths. real:${e.length}, imag: ${t.length}.`);const n=new Float32Array(2*e.length);for(let a=0;a/g,Gv=",",qv="...";function Hv(e,t){const n=((e=e.replace(/\s/g,"")).length-e.replace(Wv,"").length)/Uv.length;if(n<1)throw new Error("Equations without an arrow are not supported.");if(n>1)throw new Error(`Equation must contain exactly one arrow ("${Uv}").`);const[a,i]=e.split(Uv);Ns(-1===a.indexOf(qv),(()=>`The ellipsis notation ("${qv}") is not supported yet.`));const s=a.split(Gv),r=s.length;if(t!==r)throw new Error(`Expected ${r} input tensors, received ${t}`);if(r>2)throw new Error("Support for more than 2 input tensors is not implemented yet.");const o=[];for(let e=0;e-1!==e.indexOf(t))))throw new Error(`Output subscripts contain the label ${t} not present in the input subscripts.`);-1===o.indexOf(t)&&o.push(t)}for(let e=0;e-1!==e)),{permutationIndices:n,expandDims:a}}function $v(e,t,n){const a=new Array(e);for(let e=0;e`Expected dimension ${a[t[e][n]]} at axis ${n} of input shaped ${JSON.stringify(i)}, but got dimension ${i[n]}`))}}function Zv(e,t){const n=e,a=[];let i=0;0===e.length&&n.push(-1),i=e.length+1;for(let e=0;ee===t))}function Yv(e,t){const n=[];for(let a=0;a"Number of splits must evenly divide the axis.")),a=new Array(t).fill(e.shape[n]/t);else{Ns(t.reduce(((e,t)=>(-1===t&&(e+=1),e)),0)<=1,(()=>"There should be only one negative value in split array."));const i=t.indexOf(-1);if(-1!==i){const a=t.reduce(((e,t)=>t>0?e+t:e));t[i]=e.shape[n]-a}Ns(e.shape[n]===t.reduce(((e,t)=>e+t)),(()=>"The sum of sizes must match the size of the axis dimension.")),a=t}return a}function Jv(e){return`Received SparseTensor with denseShape[0] = 0 but\n indices.shape[0] = ${e}`}function ek(e,t){return`indices(${e}, 0) is invalid: ${t} < 0`}function tk(e,t,n){return`indices(${e}, 0) is invalid: ${t} >= ${n}`}function nk(e,t){return`only one output dimension may be -1, not both ${e} and ${t}`}function ak(e,t){return`size ${e} must be non-negative, not ${t}`}function ik(){return"reshape cannot infer the missing input size for an empty tensor unless all specified input sizes are non-zero"}function sk(e,t){return`Input to reshape is a SparseTensor with ${zs(e)}\n dense values, but the requested shape requires a multiple of ${zs(t)}. inputShape=${e} outputShape= ${t}`}function rk(e,t){return`Input to reshape is a tensor with ${zs(e)} dense values, but the requested shape has ${zs(t)}. inputShape=${e} outputShape=${t}`}function ok(){return"segment ids must be >= 0"}function lk(){return"segment ids are not increasing"}function uk(e,t){return`Segment id ${e} out of range [0, ${t}), possibly because segmentIds input is not sorted.`}function ck(e,t,n){return`Bad: indices[${e}] == ${t} out of range [0, ${n})`}function hk(e,t){let n,a=!1;for(e<=yv?(n=e,a=!0):n=Xs(e,Math.floor(Math.sqrt(e)));!a;)n>t||n===e?a=!0:n=Xs(e,n+1);return n}function dk(e,t,n){const a=[],i=e.length;for(let s=0;si))throw new Error(`Expect batchDims in the range of [-${i}, ${i}], but got ${a}`);if(a<0&&(a+=i),a>s)throw new Error(`batchDims (${a}) must be less than rank(x) (\n ${s}).`);if(nnc(e)))}catch(e){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${e}`)}}function fk(e){return e.map((e=>tc(e)))}!function(){for(const e of Jd)Bd(e)}();const gk={kernelName:fr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Ay(kd(n,"float32"),-1))}}},yk={kernelName:gr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=Td(kd(n,"float32")),a=_d(Ud(Rd(1),t));return $f(Sd(e,a))}}}},bk={kernelName:yr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=_d(Ud(Td(kd(n,"float32")),1));return Sd(e,t)}}}},vk={kernelName:br,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{let t=e;const a=Hd(n.shape,i);return a.length>0&&(t=Cf(t,a)),vm(t,n.shape)},b:()=>{let t=e;const n=Hd(a.shape,i);return n.length>0&&(t=Cf(t,n)),vm(t,a.shape)}}}},kk={kernelName:vr,saveAllInputs:!0,gradFunc:(e,t)=>{const n={};return t.forEach(((t,a)=>{n[a]=()=>e.clone()})),n}},wk={kernelName:Ar,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Id(n)}}},Ak={kernelName:xr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Id(n)}}},xk={kernelName:Cr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,_d(Ud(Rd(1),Td(kd(n,"float32")))))}}},Ck={kernelName:Sr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=_d(xd(Rd(1),Td(kd(n,"float32"))));return Sd(e,t)}}}},Sk={kernelName:Tr,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=xd(Td(n),Td(a));let s=Ed(e,Sd(a,t));const r=Hd(n.shape,i);return r.length>0&&(s=Cf(s,r)),vm(s,n.shape)},b:()=>{const t=xd(Td(n),Td(a));let s=$f(Ed(e,Sd(n,t)));const r=Hd(a.shape,i);return r.length>0&&(s=Cf(s,r)),vm(s,a.shape)}}}},Ek={kernelName:Er,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,xd(Td(kd(n,"float32")),1))}}},_k={kernelName:_r,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,Ud(Rd(1),Td(kd(n,"float32"))))}}};const Tk=ih({avgPool3dGrad_:function(e,t,n,a,i,s){const r=th(e,"dy","avgPool3dGrad"),o=th(t,"input","avgPool3dGrad");let l=r,u=o,c=!1;4===o.rank&&(c=!0,l=vm(r,[1,r.shape[0],r.shape[1],r.shape[2],r.shape[3]]),u=vm(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]])),Ns(5===l.rank,(()=>`Error in avgPool3dGrad: dy must be rank 5 but got rank ${l.rank}.`)),Ns(5===u.rank,(()=>`Error in avgPool3dGrad: input must be rank 5 but got rank ${u.rank}.`)),bm("avgPool3dGrad",i,s);const h={dy:l,input:u},d={filterSize:n,strides:a,pad:i,dimRoundingMode:s},p=Hc.runKernel(Dr,h,d);return c?vm(p,[p.shape[1],p.shape[2],p.shape[3],p.shape[4]]):p}}),Ik={kernelName:Rr,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{filterSize:i,strides:s,pad:r,dimRoundingMode:o}=n;return{x:()=>Tk(e,a,i,s,r,o)}}};const Nk=ih({avgPoolGrad_:function(e,t,n,a,i){const s=th(e,"dy","avgPoolGrad"),r=th(t,"input","avgPoolGrad");Ns(r.rank===s.rank,(()=>`Rank of input (${r.rank}) does not match rank of dy (${s.rank})`));let o=r,l=s,u=!1;3===r.rank&&(u=!0,o=vm(r,[1,r.shape[0],r.shape[1],r.shape[2]]),l=vm(s,[1,s.shape[0],s.shape[1],s.shape[2]])),Ns(4===l.rank,(()=>`Error in avgPoolGrad: dy must be rank 4 but got rank ${l.rank}.`)),Ns(4===o.rank,(()=>`Error in avgPoolGrad: input must be rank 4 but got rank ${o.rank}.`));const c={dy:l,input:o},h={filterSize:n,strides:a,pad:i},d=Hc.runKernel(Nr,c,h);return u?vm(d,[d.shape[1],d.shape[2],d.shape[3]]):d}}),Rk={kernelName:Ir,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{filterSize:i,strides:s,pad:r}=n;return{x:()=>Nk(e,a,i,s,r)}}},Dk={kernelName:zr,inputsToSave:["a","b"],gradFunc:(e,t,n)=>{const[a,i]=t,{transposeA:s,transposeB:r}=n;return s||r?!s&&r?{a:()=>xm(e,i,!1,!1),b:()=>xm(e,a,!0,!1)}:s&&!r?{a:()=>xm(i,e,!1,!0),b:()=>xm(a,e,!1,!1)}:{a:()=>xm(i,e,!0,!0),b:()=>xm(e,a,!0,!0)}:{a:()=>xm(e,i,!1,!0),b:()=>xm(a,e,!0,!1)}}},zk={kernelName:Or,gradFunc:(e,t,n)=>{const{blockShape:a,crops:i}=n;return{x:()=>Tg(e,a,i)}}},Ok={kernelName:"BroadcastTo",gradFunc:(e,t,n)=>{const a=n,i=a.inputShape,s=a.shape,r=Array.from(s);for(let e=i.length-1;e>=0;e--)if(i[e]===s[e])r[e]=1;else if(1!==i[e])throw new Error(`broadcastTo(): [${i}] cannot be broadcast to [${s}].`);const o=[];for(let e=0;e1&&o.push(e);return{x:()=>Cf(e,o,!0)}}},Mk={kernelName:Lr,gradFunc:e=>({x:()=>e.clone()})},Bk={kernelName:Pr,gradFunc:e=>({x:()=>Id(e)})},Fk={kernelName:jr,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{clipValueMin:i,clipValueMax:s}=n;return{x:()=>of(Jf(Bf(a,i),Wf(a,s)),e,Id(e))}}},Lk={kernelName:Ur,inputsToSave:["x"],gradFunc:gk.gradFunc},Pk={kernelName:Wr,saveAllInputs:!0,gradFunc:(e,t,n)=>{const a=t.map((e=>e.shape)),{axis:i}=n,s=js(i,t[0].shape)[0],r=a.map((e=>e[s]));return yy(e,r,s).map((e=>()=>e))}},jk={kernelName:Gr,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const[a,i]=t,{dilations:s,strides:r,pad:o,dataFormat:l}=n;return Ns(mm(s),(()=>`Error in gradient of conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`)),{x:()=>qm(a.shape,e,i,r,o,l),filter:()=>Jy(a,e,i.shape,r,o,l)}}},Vk={kernelName:Hr,inputsToSave:["dy","filter"],gradFunc:(e,t,n)=>{const[a,i]=t,{strides:s,pad:r,dataFormat:o,dimRoundingMode:l}=n;return{dy:()=>Wm(e,i,s,r,o,1,l),filter:()=>Jy(e,a,i.shape,s,r,o,l)}}};const Uk=ih({conv3DBackpropFilter_:function(e,t,n,a,i){let s=e;4===e.rank&&(s=vm(e,[1,e.shape[0],e.shape[1],e.shape[2],e.shape[3]]));let r=t;4===r.rank&&(r=vm(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]])),Ns(5===s.rank,(()=>`Error in conv3dDerFilter: input must be rank 5, but got shape ${s.shape}.`)),Ns(5===r.rank,(()=>`Error in conv3dDerFilter: dy must be rank 5, but got shape ${r.shape}.`)),Ns(5===n.length,(()=>`Error in conv3dDerFilter: filterShape must be length 5, but got ${n}.`)),Ns(s.shape[4]===n[3],(()=>`Error in conv3dDerFilter: depth of input ${s.shape[4]}) must match input depth in filter (${n[3]}.`)),Ns(r.shape[4]===n[4],(()=>`Error in conv3dDerFilter: depth of dy (${r.shape[4]}) must match output depth for filter (${n[4]}).`));const o={x:s,dy:r},l={strides:a,pad:i,filterShape:n};return Hc.runKernel($r,o,l)}}),Wk={kernelName:Kr,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const{dilations:a,strides:i,pad:s}=n;Ns(mm(a),(()=>`Error in gradient of conv3D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${a}'`));const[r,o]=t;return{x:()=>$m(r.shape,e,o,i,s),filter:()=>Uk(r,e,o.shape,i,s)}}},Gk={kernelName:Xr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed($f(oy(kd(n,"float32"))),e)}}},qk={kernelName:Yr,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(ly(kd(n,"float32")),e)}}},Hk={kernelName:Jr,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{axis:i,exclusive:s,reverse:r}=n;return{x:()=>{const t=vf([i],a.rank);let n=Jm(e,i,s,!r);return null!=t&&(n=Gy(n,t)),n}}}},Kk={kernelName:ao,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const{dilations:a,strides:i,pad:s,dimRoundingMode:r}=n,o=null==a?[1,1]:a;Ns(mm(o),(()=>`Error in gradient of depthwiseConv2dNative: dilation rates greater than 1 are not yet supported. Got dilations '${o}'`));const[l,u]=t;return Ns(4===l.rank,(()=>`Error in gradient of depthwiseConv2dNative: input must be rank 4, but got rank ${l.rank}.`)),Ns(4===u.rank,(()=>`Error in gradient of depthwiseConv2dNative: filter must be rank 4, but got rank ${u.rank}.`)),Ns(l.shape[3]===u.shape[2],(()=>`Error in gradient of depthwiseConv2d: number of input channels (${l.shape[3]}) must match the inChannels dimension in filter ${u.shape[2]}.`)),Ns(fm(i,o),(()=>`Error in gradient of depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${o}'.`)),bm("depthwiseConv2d",s,r),{x:()=>rb(l.shape,e,u,i,s,o,r),filter:()=>sb(l,e,u.shape,i,s,o,r)}}},$k={kernelName:oo,inputsToSave:["x","filter"],gradFunc:(e,t,n)=>{const[a,i]=t,s={x:a,filter:i,dy:e},r={x:a,filter:i,dy:e};return{x:()=>Hc.runKernel(lo,s,n),filter:()=>Hc.runKernel(uo,r,n)}}},Zk={kernelName:mo,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t,a={dy:e,y:n};return{x:()=>Hc.runKernel(fo,a)}}},Xk={kernelName:go,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t,a=Ed(Tf($f(Td(n))),2/Math.sqrt(Math.PI));return{x:()=>Ed(e,a)}}},Yk={kernelName:bo,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,n)}}},Qk={kernelName:vo,inputsToSave:["input"],gradFunc:(e,t)=>{const[n]=t;return{input:()=>vm(e,n.shape)}}},Jk={kernelName:ko,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Tf(n))}}},ew={kernelName:Co,gradFunc:e=>({x:()=>Id(e)})},tw={kernelName:So,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Sd(e,kd(a,"float32")),s=Hd(n.shape,i);return s.length>0?vm(Cf(t,s),n.shape):t},b:()=>{let t=Ed(e,kd(n,"float32"));const s=Hd(a.shape,i);s.length>0&&(t=vm(Cf(t,s),a.shape));const r=Td(a);return $f(Sd(t,kd(r,"float32")))}}}},nw={kernelName:Eo,inputsToSave:["x","mean","variance","scale"],gradFunc:(e,t,n)=>{const{varianceEpsilon:a}=n,[i,s,r,o]=t,l=null==o?Rd(1):o,u=Hd(s.shape,i.shape),c=[];if(1===s.rank){for(let e=0;e1===s.rank?vm(Ed(Ed(e,Rf(vm(p,[1,1,1,s.shape[0]]),c)),l),i.shape):vm(Ed(Ed(e,p),l),i.shape),mean:()=>{let e=Ed(Ed(p,Rd(-1)),d);return 1===s.rank&&(e=Cf(e,u)),vm(e,s.shape)},variance:()=>{let e=Ed(Ed(m,h),d);return 1===s.rank&&(e=Cf(e,u)),vm(e,s.shape)},scale:()=>{const t=Ed(h,p);let n=Ed(e,t);return 1===s.rank&&(n=Cf(n,u)),vm(n,s.shape)},offset:()=>{let t=e;return 1===s.rank&&(t=Cf(t,u)),vm(t,s.shape)}}}},aw={kernelName:_o,inputsToSave:["x","indices"],gradFunc:(e,t,n)=>{const[a,i]=t,{axis:s,batchDims:r}=n,o=js(s,a.shape)[0],l=(e,t,n)=>()=>{const a=e.shape,i=t.size,r=a.slice(0,o),l=r.length,u=a.slice(s,a.length).slice(1),c=u.length,h=iw(0,l),d=iw(l+1,l+1+c),p=sw([r,[i],u]),m=vm(n,p),f=vm(t,[i]),g=sw([[l],h,d]),y=Gy(m,g);let b=Fy(y,f,e.shape[o]);const v=kf(g);return b=Gy(b,v),b};if(1===r){const t=a.shape[0],n=a.split(t,0);return{x:()=>{const t=wy(n.map(((t,n)=>l(t,i.slice(n,1),e.slice(n,1))())));return t.reshape(a.shape)},indices:()=>i}}return{x:l(a,i,e),indices:()=>i}}};function iw(e,t){const n=[];for(let a=e;a{const[n,a]=t;return{a:()=>Id(n),b:()=>Id(a)}}},ow={kernelName:Ro,gradFunc:e=>({x:()=>kd(e,"float32")})},lw={kernelName:Oo,gradFunc:e=>({x:()=>Id(e)})},uw={kernelName:Mo,gradFunc:e=>({x:()=>Id(e)})},cw={kernelName:Bo,gradFunc:e=>({x:()=>Id(e)})},hw={kernelName:Fo,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{alpha:i}=n,s=Mf(a,0);return{x:()=>of(s,e,Ed(e,i))}}},dw={kernelName:Uo,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,xd(n,1))}}},pw={kernelName:Vo,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,kd(n,"float32"))}}},mw={kernelName:"LogSoftmax",inputsToSave:[],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a]=t,{axis:i}=n;return{logits:()=>{const t=Tf(a);return Ud(e,Ed(Cf(e,i,!0),t))}}}};const fw=ih({localResponseNormalizationBackprop_:function(e,t,n,a=5,i=1,s=1,r=.5){const o={x:e,y:t,dy:n},l={depthRadius:a,bias:i,alpha:s,beta:r};return Hc.runKernel(Ko,o,l)}}),gw={kernelName:Ho,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a,i]=t,{depthRadius:s,bias:r,alpha:o,beta:l}=n;return{x:()=>fw(a,i,e,s,r,o,l)}}};function yw(e,t,n,a){return t.rankEd(e,kd(rf(n,t),e.dtype))}}const bw={kernelName:$o,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const a=n,{reductionIndices:i}=a,s=t[0],r=yw(e,t[1],s,js(i,s.shape));return{x:()=>r.x()}}},vw={kernelName:Zo,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t;return{a:()=>Ed(e,kd(Bf(n,a),"float32")),b:()=>Ed(e,kd(Uf(n,a),"float32"))}}};const kw=ih({maxPool3dGrad_:function(e,t,n,a,i,s,r){const o=th(e,"dy","maxPool3dGrad"),l=th(t,"input","maxPool3dGrad"),u=th(n,"output","maxPool3dGrad");let c=o,h=l,d=u,p=!1;4===l.rank&&(p=!0,c=vm(o,[1,o.shape[0],o.shape[1],o.shape[2],o.shape[3]]),h=vm(l,[1,l.shape[0],l.shape[1],l.shape[2],l.shape[3]]),d=vm(u,[1,u.shape[0],u.shape[1],u.shape[2],u.shape[3]])),Ns(5===c.rank,(()=>`Error in maxPool3dGrad: dy must be rank 5 but got rank ${c.rank}.`)),Ns(5===h.rank,(()=>`Error in maxPool3dGrad: input must be rank 5 but got rank ${h.rank}.`)),Ns(5===d.rank,(()=>`Error in maxPool3dGrad: output must be rank 5 but got rank ${d.rank}.`)),bm("maxPool3dGrad",s,r);const m={dy:c,input:h,output:d},f={filterSize:a,strides:i,pad:s,dimRoundingMode:r},g=Hc.runKernel(Jo,m,f);return p?vm(g,[g.shape[1],g.shape[2],g.shape[3],g.shape[4]]):g}}),ww={kernelName:Qo,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a,i]=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=n;return{x:()=>kw(e,a,i,s,r,o,l)}}};const Aw=ih({maxPoolGrad_:function(e,t,n,a,i,s,r){const o=th(e,"dy","maxPoolGrad"),l=th(t,"input","maxPoolGrad"),u=th(n,"output","maxPoolGrad");Ns(l.rank===o.rank,(()=>`Rank of input (${l.rank}) does not match rank of dy (${o.rank})`)),Ns(4===o.rank,(()=>`Error in maxPoolGrad: dy must be rank 4 but got rank ${o.rank}.`)),Ns(4===l.rank,(()=>`Error in maxPoolGrad: input must be rank 4 but got rank ${l.rank}.`)),bm("maxPoolGrad",s,r);const c={dy:o,input:l,output:u},h={filterSize:a,strides:i,pad:s,dimRoundingMode:r};return Hc.runKernel(Yo,c,h)}}),xw={kernelName:fl,saveAllInputs:!0,gradFunc:(e,t,n)=>{const{axis:a}=n;return Ly(e,a).map((e=>()=>e))}},Cw={kernelName:gl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const a=t[0],{paddings:i}=n,s=i.map((e=>e[0]));return{x:()=>Sm(e,s,a.shape)}}};function Sw(e,t,n){const a=e.shape.length,i=a-n.length,s=vf(n,a);let r=e;null!=s&&(r=Gy(e,s));const o=r.shape.slice(),l=o.splice(a-n.length,n.length).reduce(((e,t)=>e*t),1);o.push(l);let u=function(e,t,n){const a=e.shape.slice();a[n]=1;const i=vm(t,a),s=Qm(e,n,!0,!1),r=Qm(e,n,!0,!0),o=Ed(s,r);return Ed(i,o)}(r.reshape(o),t,i);if(u=u.reshape(r.shape),null!=s){const e=kf(s);u=Gy(u,e)}return u}const Ew={kernelName:Zl,gradFunc:(e,t,n)=>{const{blockShape:a,paddings:i}=n;return{x:()=>Tm(e,a,i)}}},_w={kernelName:Xl,gradFunc:(e,t,n)=>{const{axis:a}=n;return{x:()=>Am(e,a)}}};const Tw=[gk,yk,bk,vk,kk,wk,Ak,xk,Ck,Sk,Ek,_k,Ik,Rk,Dk,zk,Ok,Mk,Bk,Fk,Lk,Pk,Vk,jk,Wk,Gk,qk,Hk,Kk,$k,{kernelName:ho,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Sd(e,kd(a,"float32")),s=Hd(n.shape,i);return s.length>0?vm(Cf(t,s),n.shape):t},b:()=>{let t=Ed(e,kd(n,"float32"));const s=Hd(a.shape,i);s.length>0&&(t=vm(Cf(t,s),a.shape));const r=Td(a);return $f(Sd(t,kd(r,"float32")))}}}},Zk,Xk,Yk,Qk,Jk,tw,ew,nw,aw,rw,ow,lw,uw,cw,hw,dw,pw,mw,gw,bw,bw,vw,ww,{kernelName:Xo,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a,i]=t,{filterSize:s,strides:r,pad:o}=n;return{x:()=>Aw(e,a,i,s,r,o)}}},{kernelName:tl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{axis:i}=n,s=js(i,a.shape),r=zs(gf(a.shape,s)[1]);return{x:()=>{const t=a.shape.slice();s.forEach((e=>{t[e]=1}));const n=vm(e,t);return Sd(Ed(n,hg(a.shape,"float32")),r)}}}},{kernelName:nl,inputsToSave:["x"],outputsToSave:[!0],gradFunc:(e,t,n)=>{const a=n,{axis:i}=a,[s,r]=t,o=yw(e,r,s,js(i,s.shape));return{x:()=>o.x()}}},{kernelName:al,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t;return{a:()=>Ed(e,kd(Wf(n,a),"float32")),b:()=>Ed(e,kd(Mf(n,a),"float32"))}}},{kernelName:il,inputsToSave:["x"],gradFunc:(e,t,n)=>{const a=t[0],{paddings:i}=n,s=i.map((e=>e[0]));return{x:()=>Sm(e,s,a.shape)}}},{kernelName:sl,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Hd(n.shape,i);return t.length>0?vm(Cf(e,t),n.shape):e},b:()=>{const t=Ed(e,$f(zf(Sd(n,a)))),s=Hd(a.shape,i);return s.length>0?vm(Cf(t,s),a.shape):t}}}},{kernelName:ol,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{const t=Ed(e,kd(a,"float32")),s=Hd(n.shape,i);return s.length>0?vm(Cf(t,s),n.shape):t},b:()=>{const t=Ed(e,kd(n,"float32")),s=Hd(a.shape,i);return s.length>0?vm(Cf(t,s),a.shape):t}}}},{kernelName:ll,gradFunc:e=>({x:()=>$f(e)})},{kernelName:ml,inputsToSave:["indices"],gradFunc:(e,t)=>{const n=t[0];return{indices:()=>cg(n.shape,"float32")}}},{kernelName:pl,gradFunc:e=>({x:()=>Id(e)})},xw,Cw,Cw,{kernelName:yl,inputsToSave:["a","b"],outputsToSave:[!0],gradFunc:(e,t)=>{const[n,a,i]=t,s=n,r=a,o=Kd(s.shape,r.shape);return{a:()=>{const t=kd(r,"float32");let n=Ed(e,Ed(t,Vd(s,Ud(t,Rd(1)))));const a=Hd(s.shape,o);return a.length>0&&(n=Cf(n,a)),vm(n,s.shape)},b:()=>{const t=Mf(s,0),n=of(t,Hf(s),Id(s));let a=Ed(e,Ed(i,n));const l=Hd(r.shape,o);return l.length>0&&(a=Cf(a,l)),vm(a,r.shape)}}}},{kernelName:bl,inputsToSave:["x","alpha"],gradFunc:(e,t)=>{const[n,a]=t,i=Mf(n,0);return{x:()=>of(i,e,Ed(e,a)),alpha:()=>{let t=of(i,Id(e),Ed(e,n));const s=Hd(a.shape,e.shape);return s.length>0&&(t=Cf(t,s)),vm(t,a.shape)}}}},{kernelName:vl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{axis:i}=n;let s=[];return s=null==i?a.shape.map(((e,t)=>t)):"number"==typeof i?[i]:i,{x:()=>Sw(a,e,s)}}},{kernelName:Sl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,$f(Td(n)))}}},{kernelName:Dl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t,a=Ed(Wf(n,6),Ay(n));return{x:()=>Ed(e,kd(a,"float32"))}}},{kernelName:El,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,kd(Ay(n),"float32"))}}},{kernelName:_l,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>vm(e,n.shape)}}},{kernelName:Nl,inputsToSave:["images"],gradFunc:(e,t,n)=>{const[a]=t,i={dy:e,images:a};return{images:()=>Hc.runKernel(Rl,i,n)}}},{kernelName:Tl,inputsToSave:["images"],gradFunc:(e,t,n)=>{const[a]=t,i={dy:e,images:a};return{images:()=>Hc.runKernel(Il,i,n)}}},{kernelName:zl,gradFunc:(e,t,n)=>{const{dims:a}=n,i=js(a,e.shape);return{x:()=>Xg(e,i)}}},{kernelName:Ol,gradFunc:e=>({x:()=>Id(e)})},{kernelName:Ml,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>$f(Sd(e,Ed(Vd(n,1.5),2)))}}},{kernelName:Pl,inputsToSave:["condition"],gradFunc:(e,t)=>{const[n]=t;return{condition:()=>kd(Id(n),"float32"),t:()=>Ed(e,kd(n,e.dtype)),e:()=>Ed(e,kd(eg(n),e.dtype))}}},{kernelName:jl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>{const t=Mf(n,Rd(0)),a=Rd(Ev),i=Rd(_v),s=Ed(e,i),r=Ed(Ed(e,a),Tf(kd(n,"float32")));return of(t,s,r)}}}},{kernelName:ql,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Ed(n,Ud(Rd(1),n)))}}},{kernelName:Gl,gradFunc:e=>({x:()=>Id(e)})},{kernelName:Ul,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(Xm(kd(n,"float32")),e)}}},{kernelName:Wl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(Ym(kd(n,"float32")),e)}}},{kernelName:Vl,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{begin:i,size:s}=n,r=a.shape,[o,l]=Wp(a,i,s),u=[];for(let t=0;txg(e,u)}}},{kernelName:Yl,outputsToSave:[!0],gradFunc:(e,t,n)=>{const[a]=t,{dim:i}=n,s=Ed(e,a);return{logits:()=>Ud(s,Ed(Cf(s,[i],true),a))}}},{kernelName:Hl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Cm(n))}}},Ew,Ew,_w,_w,{kernelName:Kl,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,Ed(_d(kd(n,"float32")),2))}}},{kernelName:au,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Rd(2);return{a:()=>Ed(e,Ed(i,Ud(n,a))),b:()=>Ed(e,Ed(i,Ud(a,n)))}}},{kernelName:iu,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(e,Ed(kd(n,"float32"),2))}}},{kernelName:wu,gradFunc:e=>({x:()=>Id(e)})},{kernelName:cu,inputsToSave:["a","b"],gradFunc:(e,t)=>{const[n,a]=t,i=Kd(n.shape,a.shape);return{a:()=>{let t=e;const a=Hd(n.shape,i);return a.length>0&&(t=Cf(t,a)),vm(t,n.shape)},b:()=>{let t=e;const n=Hd(a.shape,i);return n.length>0&&(t=Cf(t,n)),vm($f(t),a.shape)}}}},{kernelName:$l,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,i=a.shape.slice(),{axis:s}=n;js(s,a.shape).forEach((e=>{i[e]=1}));const r=vm(e,i),o=Ed(r,hg(a.shape,"float32"));return{x:()=>o}}},{kernelName:hu,inputsToSave:["x"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Sd(e,Td(Xm(n)))}}},{kernelName:du,outputsToSave:[!0],gradFunc:(e,t)=>{const[n]=t;return{x:()=>Ed(Ud(Rd(1),Td(n)),e)}}},{kernelName:pu,inputsToSave:["x"],gradFunc:(e,t,n)=>{const[a]=t,{reps:i}=n;return{x:()=>{let t=Id(a);if(1===a.rank)for(let n=0;n{const a=n,{perm:i}=a,s=kf(i);return{x:()=>Gy(e,s)}}},{kernelName:bu,gradFunc:(e,t,n)=>{const a=n,{axis:i}=a;return{value:()=>wy(e,i)}}},{kernelName:vu,inputsToSave:["segmentIds"],gradFunc:(e,t)=>{const[n]=t;return{x:()=>function(e,t){const n=$d(t,Id(t)),a=Of(e,n);let i=Bf(t,Rd(0,"int32"));const s=a.rank-i.rank;for(let e=0;e({x:()=>Id(e)})}];for(const e of Tw)Mu(e);wc().prototype.abs=function(){return this.throwIfDisposed(),Gd(this)},wc().prototype.acos=function(){return this.throwIfDisposed(),Hp(this)},wc().prototype.acosh=function(){return this.throwIfDisposed(),Kp(this)},wc().prototype.add=function(e){return this.throwIfDisposed(),xd(this,e)},wc().prototype.all=function(e,t){return this.throwIfDisposed(),Zp(this,e,t)},wc().prototype.any=function(e,t){return this.throwIfDisposed(),Xp(this,e,t)},wc().prototype.argMax=function(e){return this.throwIfDisposed(),Yp(this,e)},wc().prototype.argMin=function(e){return this.throwIfDisposed(),Qp(this,e)},wc().prototype.asScalar=function(){return this.throwIfDisposed(),Ns(1===this.size,(()=>"The array must have only 1 element.")),vm(this,[])},wc().prototype.asType=function(e){return this.throwIfDisposed(),kd(this,e)},wc().prototype.as1D=function(){return this.throwIfDisposed(),vm(this,[this.size])},wc().prototype.as2D=function(e,t){return this.throwIfDisposed(),vm(this,[e,t])},wc().prototype.as3D=function(e,t,n){return this.throwIfDisposed(),vm(this,[e,t,n])},wc().prototype.as4D=function(e,t,n,a){return this.throwIfDisposed(),vm(this,[e,t,n,a])},wc().prototype.as5D=function(e,t,n,a,i){return this.throwIfDisposed(),vm(this,[e,t,n,a,i])},wc().prototype.asin=function(){return this.throwIfDisposed(),Jp(this)},wc().prototype.asinh=function(){return this.throwIfDisposed(),em(this)},wc().prototype.atan=function(){return this.throwIfDisposed(),tm(this)},wc().prototype.atan2=function(e){return this.throwIfDisposed(),nm(this,e)},wc().prototype.atanh=function(){return this.throwIfDisposed(),am(this)},wc().prototype.avgPool=function(e,t,n,a){return this.throwIfDisposed(),km(this,e,t,n,a)},wc().prototype.batchToSpaceND=function(e,t){return this.throwIfDisposed(),Tm(this,e,t)},wc().prototype.batchNorm=function(e,t,n,a,i){return this.throwIfDisposed(),Im(this,e,t,n,a,i)},wc().prototype.broadcastTo=function(e){return this.throwIfDisposed(),Bm(this,e)},wc().prototype.cast=function(e){return this.throwIfDisposed(),kd(this,e)},wc().prototype.ceil=function(){return this.throwIfDisposed(),Fm(this)},wc().prototype.clipByValue=function(e,t){return this.throwIfDisposed(),Lm(this,e,t)},wc().prototype.concat=function(e,t){return this.throwIfDisposed(),e instanceof kc&&(e=[e]),Am([this,...e],t)},wc().prototype.conv1d=function(e,t,n,a,i,s){return this.throwIfDisposed(),Gm(this,e,t,n,a,i,s)},wc().prototype.conv2dTranspose=function(e,t,n,a,i){return this.throwIfDisposed(),Hm(this,e,t,n,a,i)},wc().prototype.conv2d=function(e,t,n,a,i,s){return this.throwIfDisposed(),Wm(this,e,t,n,a,i,s)},wc().prototype.cos=function(){return this.throwIfDisposed(),Xm(this)},wc().prototype.cosh=function(){return this.throwIfDisposed(),Ym(this)},wc().prototype.cumprod=function(e,t,n){return this.throwIfDisposed(),Qm(this,e,t,n)},wc().prototype.cumsum=function(e,t,n){return this.throwIfDisposed(),Jm(this,e,t,n)},wc().prototype.depthToSpace=function(e,t){return this.throwIfDisposed(),tf(this,e,t)},wc().prototype.depthwiseConv2d=function(e,t,n,a,i,s){return this.throwIfDisposed(),nf(this,e,t,n,a,i,s)},wc().prototype.dilation2d=function(e,t,n,a,i){return this.throwIfDisposed(),sf(this,e,t,n,a,i)},wc().prototype.divNoNan=function(e){return this.throwIfDisposed(),lf(this,e)},wc().prototype.div=function(e){return this.throwIfDisposed(),Sd(this,e)},wc().prototype.dot=function(e){return this.throwIfDisposed(),uf(this,e)},wc().prototype.elu=function(){return this.throwIfDisposed(),hf(this)},wc().prototype.equal=function(e){return this.throwIfDisposed(),rf(this,e)},wc().prototype.erf=function(){return this.throwIfDisposed(),pf(this)},wc().prototype.euclideanNorm=function(e,t){return this.throwIfDisposed(),_f(this,e,t)},wc().prototype.exp=function(){return this.throwIfDisposed(),Tf(this)},wc().prototype.expandDims=function(e){return this.throwIfDisposed(),If(this,e)},wc().prototype.expm1=function(){return this.throwIfDisposed(),Nf(this)},wc().prototype.fft=function(){return this.throwIfDisposed(),my(this)},wc().prototype.flatten=function(){return this.throwIfDisposed(),vm(this,[this.size])},wc().prototype.floor=function(){return this.throwIfDisposed(),zf(this)},wc().prototype.floorDiv=function(e){return this.throwIfDisposed(),Cd(this,e)},wc().prototype.gather=function(e,t,n){return this.throwIfDisposed(),Of(this,e,t,n)},wc().prototype.greaterEqual=function(e){return this.throwIfDisposed(),Bf(this,e)},wc().prototype.greater=function(e){return this.throwIfDisposed(),Mf(this,e)},wc().prototype.ifft=function(){return this.throwIfDisposed(),fy(this)},wc().prototype.irfft=function(){return this.throwIfDisposed(),gy(this)},wc().prototype.isFinite=function(){return this.throwIfDisposed(),Lf(this)},wc().prototype.isInf=function(){return this.throwIfDisposed(),Pf(this)},wc().prototype.isNaN=function(){return this.throwIfDisposed(),jf(this)},wc().prototype.leakyRelu=function(e){return this.throwIfDisposed(),Vf(this,e)},wc().prototype.lessEqual=function(e){return this.throwIfDisposed(),Wf(this,e)},wc().prototype.less=function(e){return this.throwIfDisposed(),Uf(this,e)},wc().prototype.localResponseNormalization=function(e,t,n,a){return this.throwIfDisposed(),qf(this,e,t,n,a)},wc().prototype.logSigmoid=function(){return this.throwIfDisposed(),Xf(this)},wc().prototype.logSoftmax=function(e){return this.throwIfDisposed(),Yf(this,e)},wc().prototype.logSumExp=function(e,t){return this.throwIfDisposed(),Qf(this,e,t)},wc().prototype.log=function(){return this.throwIfDisposed(),Hf(this)},wc().prototype.log1p=function(){return this.throwIfDisposed(),Kf(this)},wc().prototype.logicalAnd=function(e){return this.throwIfDisposed(),Jf(this,e)},wc().prototype.logicalNot=function(){return this.throwIfDisposed(),eg(this)},wc().prototype.logicalOr=function(e){return this.throwIfDisposed(),tg(this,e)},wc().prototype.logicalXor=function(e){return this.throwIfDisposed(),ng(this,e)},wc().prototype.matMul=function(e,t,n){return this.throwIfDisposed(),xm(this,e,t,n)},wc().prototype.maxPool=function(e,t,n,a){return this.throwIfDisposed(),rg(this,e,t,n,a)},wc().prototype.max=function(e,t){return this.throwIfDisposed(),Af(this,e,t)},wc().prototype.maximum=function(e){return this.throwIfDisposed(),$d(this,e)},wc().prototype.mean=function(e,t){return this.throwIfDisposed(),ug(this,e,t)},wc().prototype.min=function(e,t){return this.throwIfDisposed(),xf(this,e,t)},wc().prototype.minimum=function(e){return this.throwIfDisposed(),pg(this,e)},wc().prototype.mirrorPad=function(e,t){return this.throwIfDisposed(),mg(this,e,t)},wc().prototype.mod=function(e){return this.throwIfDisposed(),fg(this,e)},wc().prototype.mul=function(e){return this.throwIfDisposed(),Ed(this,e)},wc().prototype.neg=function(){return this.throwIfDisposed(),$f(this)},wc().prototype.norm=function(e,t,n){return this.throwIfDisposed(),Ef(this,e,t,n)},wc().prototype.notEqual=function(e){return this.throwIfDisposed(),vg(this,e)},wc().prototype.oneHot=function(e,t=1,n=0){return this.throwIfDisposed(),kg(this,e,t,n)},wc().prototype.onesLike=function(){return this.throwIfDisposed(),wg(this)},wc().prototype.pad=function(e,t){return this.throwIfDisposed(),xg(this,e,t)},wc().prototype.pool=function(e,t,n,a,i,s){return this.throwIfDisposed(),Ig(this,e,t,n,a,i,s)},wc().prototype.pow=function(e){return this.throwIfDisposed(),Vd(this,e)},wc().prototype.prelu=function(e){return this.throwIfDisposed(),Ng(this,e)},wc().prototype.prod=function(e,t){return this.throwIfDisposed(),Rg(this,e,t)},wc().prototype.reciprocal=function(){return this.throwIfDisposed(),Kg(this)},wc().prototype.relu=function(){return this.throwIfDisposed(),$g(this)},wc().prototype.relu6=function(){return this.throwIfDisposed(),Zg(this)},wc().prototype.reshapeAs=function(e){return this.throwIfDisposed(),vm(this,e.shape)},wc().prototype.reshape=function(e){return this.throwIfDisposed(),vm(this,e)},wc().prototype.resizeBilinear=function(e,t,n){return this.throwIfDisposed(),Ob(this,e,t,n)},wc().prototype.resizeNearestNeighbor=function(e,t,n){return this.throwIfDisposed(),Mb(this,e,t,n)},wc().prototype.reverse=function(e){return this.throwIfDisposed(),Xg(this,e)},wc().prototype.rfft=function(){return this.throwIfDisposed(),by(this)},wc().prototype.round=function(){return this.throwIfDisposed(),ty(this)},wc().prototype.rsqrt=function(){return this.throwIfDisposed(),ny(this)},wc().prototype.selu=function(){return this.throwIfDisposed(),ay(this)},wc().prototype.separableConv2d=function(e,t,n,a,i,s){return this.throwIfDisposed(),iy(this,e,t,n,a,i,s)},wc().prototype.sigmoid=function(){return this.throwIfDisposed(),Cm(this)},wc().prototype.sign=function(){return this.throwIfDisposed(),ry(this)},wc().prototype.sin=function(){return this.throwIfDisposed(),oy(this)},wc().prototype.sinh=function(){return this.throwIfDisposed(),ly(this)},wc().prototype.slice=function(e,t){return this.throwIfDisposed(),Sm(this,e,t)},wc().prototype.softmax=function(e){return this.throwIfDisposed(),py(this,e)},wc().prototype.softplus=function(){return this.throwIfDisposed(),Zf(this)},wc().prototype.spaceToBatchND=function(e,t){return this.throwIfDisposed(),Tg(this,e,t)},wc().prototype.split=function(e,t){return this.throwIfDisposed(),yy(this,e,t)},wc().prototype.sqrt=function(){return this.throwIfDisposed(),_d(this)},wc().prototype.square=function(){return this.throwIfDisposed(),Td(this)},wc().prototype.squaredDifference=function(e){return this.throwIfDisposed(),vy(this,e)},wc().prototype.squeeze=function(e){return this.throwIfDisposed(),ky(this,e)},wc().prototype.stack=function(e,t){this.throwIfDisposed();const n=e instanceof kc?[this,e]:[this,...e];return wy(n,t)},wc().prototype.step=function(e){return this.throwIfDisposed(),Ay(this,e)},wc().prototype.stridedSlice=function(e,t,n,a,i,s,r,o){return this.throwIfDisposed(),xy(this,e,t,n,a,i,s,r,o)},wc().prototype.sub=function(e){return this.throwIfDisposed(),Ud(this,e)},wc().prototype.sum=function(e,t){return this.throwIfDisposed(),Cf(this,e,t)},wc().prototype.tan=function(){return this.throwIfDisposed(),Cy(this)},wc().prototype.tanh=function(){return this.throwIfDisposed(),Em(this)},wc().prototype.tile=function(e){return this.throwIfDisposed(),Rf(this,e)},wc().prototype.toBool=function(){return this.throwIfDisposed(),kd(this,"bool")},wc().prototype.toFloat=function(){return this.throwIfDisposed(),kd(this,"float32")},wc().prototype.toInt=function(){return this.throwIfDisposed(),kd(this,"int32")},wc().prototype.topk=function(e,t){return this.throwIfDisposed(),Oy(this,e,t)},wc().prototype.transpose=function(e){return this.throwIfDisposed(),Gy(this,e)},wc().prototype.unique=function(e){return this.throwIfDisposed(),By(this,e)},wc().prototype.unsortedSegmentSum=function(e,t){return this.throwIfDisposed(),Fy(this,e,t)},wc().prototype.unstack=function(e){return this.throwIfDisposed(),Ly(this,e)},wc().prototype.where=function(e,t){return this.throwIfDisposed(),of(e,this,t)},wc().prototype.zerosLike=function(){return this.throwIfDisposed(),Id(this)};class Iw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Iw.prototype)}}class Nw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Nw.prototype)}}class Rw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Rw.prototype)}}class Dw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Dw.prototype)}}class zw extends Error{constructor(e){super(e),Object.setPrototypeOf(this,zw.prototype)}}Error;class Ow{constructor(e){this.maxEntries=e||100,this.cache=new Map}get(e){let t;return this.cache.has(e)&&(t=this.cache.get(e),this.cache.delete(e),this.cache.set(e,t)),t}put(e,t){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.maxEntries){const e=this.cache.keys().next().value;this.cache.delete(e)}this.cache.set(e,t)}getMaxEntries(){return this.maxEntries}setMaxEntries(e){if(e<0)throw new Error(`The maxEntries of LRU caches must be at least 0, but got ${e}.`);if(this.maxEntries>e)for(let t=0;tt.toUpperCase()))}let Uw={};function Ww(e){if(null==e)return null;const t={};return t.className=e.getClassName(),t.config=e.getConfig(),t}function Gw(e){if(null!=e&&"object"==typeof e)if(Array.isArray(e))e.forEach((e=>Gw(e)));else{const t=Object.keys(e);for(const n of t){const t=e[n];null!=t&&"object"==typeof t&&(Array.isArray(t)||"ndarray"!==t.type||"number"!=typeof t.value?Gw(t):e[n]=t.value)}}}function qw(e,t={},n={},a="object",i=!1){if("string"==typeof e){const i=e;let s;if(i in n)s=n[i];else if(i in Uw)s=Uw[i];else if(s=t[i],null==s)throw new Rw(`Unknown ${a}: ${e}. This may be due to one of the following reasons:\n1. The ${a} is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code.\n2. The custom ${a} is defined in JavaScript, but is not registered properly with tf.serialization.registerClass().`);return s}{const s=e;if(null==s.className||null==s.config)throw new Rw(`${a}: Improper config format: ${JSON.stringify(s)}.\n'className' and 'config' must set.`);const r=s.className;let o,l;if(r in n?[o,l]=n[r]:r in Uw?[o,l]=Uw.className:r in t&&([o,l]=t[r]),null==o)throw new Rw(`Unknown ${a}: ${r}. This may be due to one of the following reasons:\n1. The ${a} is defined in Python, in which case it needs to be ported to TensorFlow.js or your JavaScript code.\n2. The custom ${a} is defined in JavaScript, but is not registered properly with tf.serialization.registerClass().`);if(null!=l){const e={};for(const t of Object.keys(Uw))e[t]=Uw[t];for(const t of Object.keys(n))e[t]=n[t];s.config.customObjects=e;const t=Object.assign({},Uw);for(const e of Object.keys(n))Uw[e]=n[e];Gw(s.config);const a=l(o,s.config,n,i);return Uw=Object.assign({},t),a}{const e=Object.assign({},Uw);for(const e of Object.keys(n))Uw[e]=n[e];const t=new o(s.config);return Uw=Object.assign({},e),t}}}function Hw(e,t){return-1*function(e,t){return et?1:0}(e,t)}function Kw(e){if(null==e)return e;const t=[];for(const n of e)-1===t.indexOf(n)&&t.push(n);return t}function $w(e){if(null==e)throw new Rw(`Invalid value in obj: ${JSON.stringify(e)}`);for(const t in e)if(e.hasOwnProperty(t))return!1;return!0}function Zw(e,t,n){if(null!=n&&e.indexOf(n)<0)throw new Rw(`${n} is not a valid ${t}. Valid values are ${e} or null/undefined.`)}function Xw(e,t,n=0,a=1/0){return Bw(n>=0),Bw(a>=n),Array.isArray(e)&&e.length>=n&&e.length<=a&&e.every((e=>typeof e===t))}function Yw(e,t){Array.isArray(e)?(Ns(e.length>0,(()=>`${t} is unexpectedly an empty array.`)),e.forEach(((e,n)=>Yw(e,`element ${n+1} of ${t}`)))):Ns(Number.isInteger(e)&&e>0,(()=>`Expected ${t} to be a positive integer, but got ${Qw(e)}.`))}function Qw(e){return null===e?"null":Array.isArray(e)?"["+e.map((e=>Qw(e))).join(",")+"]":"string"==typeof e?`"${e}"`:`${e}`}function Jw(e){return"relu"===e?"relu":"linear"===e?"linear":"elu"===e?"elu":null}let eA=0;function tA(){return eA++}const nA={};function aA(e=""){return e in nA||(nA[e]=0),nA[e]+=1,e+nA[e].toString()}const iA=["channelsFirst","channelsLast"],sA=["nearest","bilinear"],rA=["valid","same","causal"],oA=["max","avg"],lA=["sum","mul","concat","ave"],uA=new Map;function cA(e){Zw(iA,"DataFormat",e)}function hA(e){Zw(rA,"PaddingMode",e)}function dA(e){Zw(oA,"PoolMode",e)}const pA=[],mA="/";function fA(e,t){pA.push(e);try{const e=t();return pA.pop(),e}catch(e){throw pA.pop(),e}}function gA(e){if(!vA(e))throw new Error("Not a valid tensor name: '"+e+"'");return(0===pA.length?"":pA.join(mA)+mA)+e}function yA(e){if(!vA(e))throw new Error("Not a valid tensor name: '"+e+"'");uA.has(e)||uA.set(e,0);const t=uA.get(e);if(uA.set(e,uA.get(e)+1),t>0){const n=`${e}_${t}`;return uA.set(n,1),n}return e}const bA=new RegExp(/^[A-Za-z0-9][-A-Za-z0-9\._\/]*$/);function vA(e){return!!e.match(bA)}function kA(e,t,n){null==t&&(t=0),null==n&&(n=e.length);let a=1;for(let i=t;it&&(t=a)}return t}function xA(e,t){if(t{switch(e.rank){case 1:return uy(e,t,n);case 2:return cy(e,[t,0],[n,e.shape[1]]);case 3:return hy(e,[t,0,0],[n,e.shape[1],e.shape[2]]);case 4:return dy(e,[t,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3]]);case 5:return Sm(e,[t,0,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3],e.shape[4]]);case 6:return Sm(e,[t,0,0,0,0,0],[n,e.shape[1],e.shape[2],e.shape[3],e.shape[4],e.shape[5]]);default:throw new Rw(`sliceAlongFirstAxis() received an unsupported tensor rank: ${e.rank}`)}}))}function IA(e,t,n){return dh((()=>{switch(e.rank){case 1:return uy(e,t,n);case 2:return cy(e,[0,t],[e.shape[0],n]);case 3:return hy(e,[0,0,t],[e.shape[0],e.shape[1],n]);case 4:return dy(e,[0,0,0,t],[e.shape[0],e.shape[1],e.shape[2],n]);default:throw new Rw(`sliceAlongLastAxis() received an unsupported tensor rank: ${e.rank}`)}}))}function NA(e,t,n,a){return dh((()=>{switch(e.rank){case 1:return uy(e,t,n);case 2:switch(a){case 1:return TA(e,t,n);case 2:return IA(e,t,n);default:throw new Rw(`The axis is not within the rank of the tensor ${a}`)}case 3:switch(a){case 1:return TA(e,t,n);case 2:return hy(e,[0,t,0],[e.shape[0],n,e.shape[2]]);case 3:return IA(e,t,n);default:throw new Rw(`The axis is not within the rank of the tensor ${a}`)}case 4:switch(a){case 1:return TA(e,t,n);case 2:return dy(e,[0,t,0,0],[e.shape[0],n,e.shape[2],e.shape[3]]);case 3:return dy(e,[0,0,t,0],[e.shape[0],e.shape[1],n,e.shape[3]]);case 4:return IA(e,t,n);default:throw new Rw(`The axis is not within the rank of the tensor ${a}`)}default:throw new Rw(`sliceAlongLastAxis() received an unsupported tensor rank: ${e.rank}`)}}))}function RA(e,t=-1){let n;return t<0&&(n=e[0].rank,t=0!==n?n:0),t===e[0].rank&&(t=-1),Am(e,t)}function DA(e,t){switch(e.rank){case 1:return Pm([e,t]);case 2:return jm([e,t],0);case 3:return Vm([e,t],0);case 4:return Um([e,t],0);default:throw new Rw(`concatAlongFirstAxis() received an unsupported tensor rank: ${e.rank}`)}}function zA(e,t){if(Array.isArray(t)||(t=[t]),e.rank!==t.length)throw new Rw(`The length of input n (${t.length}) does not match the number of dimensions in input x (${e.rank})`);return Rf(e,t)}function OA(e,t=0,n=1,a,i){return Vg(e,t,n,a,i)}function MA(e,t,n,a){if(e.rank<2||t.rank<2)throw new Dw(`dot requires both inputs to be rank >= 2 but got x shape = ${e.shape} and y shape = ${t.shape}`);if(t.rank>=3){if(e.shape.slice(-1)[0]!==t.shape.slice(-2)[0])throw new Dw(`If rank y >= 3, then the second last dim of y must equal the last dim of x but got x shape = ${e.shape} and y shape = ${t.shape}`)}if(2===e.rank&&2===t.rank){return lb({a:e,b:t,transposeA:!1,transposeB:!1,bias:a?LA(e.rank,a,"channelsLast"):null,activation:n})}{const i=e.shape.slice(),s=i.pop();e=vm(e,[-1,s]);const r=t.shape.slice(),o=r.pop(),l=r.pop(),u=[...r,o],c=Array.from({length:t.rank},((e,n)=>0===n?t.rank-2:n<=t.rank-2?n-1:n));t=vm(Gy(t,c),[l,-1]);const h=[...i,...u];return vm(lb({a:e,b:t,transposeA:!1,transposeB:!1,bias:a?LA(e.rank,a,"channelsLast"):null,activation:n}),h)}}function BA(e,t,n){return dh((()=>(t=Array.isArray(t)?Sy(t,"int32"):kd(t,"int32"),Of(e,t,n))))}function FA(e){return Ed(e,e)}function LA(e,t,n){const a=t.shape;if(1!==t.rank&&t.rank!==e)throw new Rw(`Unexpected bias dimensions: ${t.rank}; expected it to be 1 or ${e}`);if(5===e){if("channelsFirst"===n)return 1===a.length?vm(t,[1,a[0],1,1,1]):vm(t,[1,a[3],a[0],a[1],a[2]]);if("channelsLast"===n)return 1===a.length?vm(t,[1,1,1,1,a[0]]):vm(t,[1].concat(a))}else if(4===e){if("channelsFirst"===n)return 1===a.length?vm(t,[1,a[0],1,1]):vm(t,[1,a[2],a[0],a[1]]);if("channelsLast"===n)return 1===a.length?vm(t,[1,1,1,a[0]]):vm(t,[1].concat(a))}else if(3===e){if("channelsFirst"===n)return 1===a.length?vm(t,[1,a[0],1]):vm(t,[1,a[1],a[0]]);if("channelsLast"===n)return 1===a.length?vm(t,[1,1,a[0]]):vm(t,[1].concat(a))}else if(e<3)return t;throw new Rw(`Unsupported input rank by biasAdd: ${t.rank}`)}function PA(e,t,n){return dh((()=>(null==n&&(n="channelsLast"),cA(n),xd(e,LA(e.rank,t,n)))))}function jA(e,t,n,a){return dh((()=>Zy(e,t,n,a)))}function VA(e,t,n=!1){return n?e():t()}const UA=["fanIn","fanOut","fanAvg"],WA=["normal","uniform","truncatedNormal"];class GA extends Od{fromConfigUsesCustomObjects(){return!1}getConfig(){return{}}}class qA extends GA{apply(e,t){return cg(e,t)}}qA.className="Zeros",Bd(qA);class HA extends GA{apply(e,t){return hg(e,t)}}HA.className="Ones",Bd(HA);class KA extends GA{constructor(e){if(super(),"object"!=typeof e)throw new Rw(`Expected argument of type ConstantConfig but got ${e}`);if(void 0===e.value)throw new Rw(`config must have value set but got ${e}`);this.value=e.value}apply(e,t){return dh((()=>Ed(Rd(this.value),hg(e,t))))}getConfig(){return{value:this.value}}}KA.className="Constant",Bd(KA);class $A extends GA{constructor(e){super(),this.DEFAULT_MINVAL=-.05,this.DEFAULT_MAXVAL=.05,this.minval=e.minval||this.DEFAULT_MINVAL,this.maxval=e.maxval||this.DEFAULT_MAXVAL,this.seed=e.seed}apply(e,t){return Wg(e,this.minval,this.maxval,t,this.seed)}getConfig(){return{minval:this.minval,maxval:this.maxval,seed:this.seed}}}$A.className="RandomUniform",Bd($A);class ZA extends GA{constructor(e){super(),this.DEFAULT_MEAN=0,this.DEFAULT_STDDEV=.05,this.mean=e.mean||this.DEFAULT_MEAN,this.stddev=e.stddev||this.DEFAULT_STDDEV,this.seed=e.seed}apply(e,t){if("float32"!==(t=t||"float32")&&"int32"!==t)throw new Dw(`randomNormal does not support dType ${t}.`);return OA(e,this.mean,this.stddev,t,this.seed)}getConfig(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}}}ZA.className="RandomNormal",Bd(ZA);class XA extends GA{constructor(e){super(),this.DEFAULT_MEAN=0,this.DEFAULT_STDDEV=.05,this.mean=e.mean||this.DEFAULT_MEAN,this.stddev=e.stddev||this.DEFAULT_STDDEV,this.seed=e.seed}apply(e,t){if("float32"!==(t=t||"float32")&&"int32"!==t)throw new Dw(`truncatedNormal does not support dType ${t}.`);return My(e,this.mean,this.stddev,t,this.seed)}getConfig(){return{mean:this.mean,stddev:this.stddev,seed:this.seed}}}XA.className="TruncatedNormal",Bd(XA);class YA extends GA{constructor(e){super(),this.gain=null!=e.gain?e.gain:1}apply(e,t){return dh((()=>{if(2!==e.length||e[0]!==e[1])throw new Rw("Identity matrix initializer can only be used for 2D square matrices.");return Ed(this.gain,Df(e[0]))}))}getConfig(){return{gain:this.gain}}}YA.className="Identity",Bd(YA);class QA extends GA{constructor(e){if(super(),e.scale<0)throw new Rw(`scale must be a positive float. Got: ${e.scale}`);var t;this.scale=null==e.scale?1:e.scale,this.mode=null==e.mode?"fanIn":e.mode,t=this.mode,Zw(UA,"FanMode",t),this.distribution=null==e.distribution?"normal":e.distribution,function(e){Zw(WA,"Distribution",e)}(this.distribution),this.seed=e.seed}apply(e,t){const n=function(e,t="channelsLast"){let n,a;if(cA(t),2===e.length)n=e[0],a=e[1];else if(-1!==[3,4,5].indexOf(e.length)){if("channelsFirst"===t){const t=kA(e,2);n=e[1]*t,a=e[0]*t}else if("channelsLast"===t){const t=kA(e,0,e.length-2);n=e[e.length-2]*t,a=e[e.length-1]*t}}else{const t=kA(e);n=Math.sqrt(t),a=Math.sqrt(t)}return[n,a]}(e),a=n[0],i=n[1];let s=this.scale;if("fanIn"===this.mode?s/=Math.max(1,a):"fanOut"===this.mode?s/=Math.max(1,i):s/=Math.max(1,(a+i)/2),"normal"===this.distribution){const n=Math.sqrt(s);if("float32"!==(t=t||"float32")&&"int32"!==t)throw new Dw(`${this.getClassName()} does not support dType ${t}.`);return My(e,0,n,t,this.seed)}{const n=Math.sqrt(3*s);return Wg(e,-n,n,t,this.seed)}}getConfig(){return{scale:this.scale,mode:this.mode,distribution:this.distribution,seed:this.seed}}}QA.className="VarianceScaling",Bd(QA);class JA extends QA{constructor(e){super({scale:1,mode:"fanAvg",distribution:"uniform",seed:null==e?null:e.seed})}getClassName(){return QA.className}}JA.className="GlorotUniform",Bd(JA);class ex extends QA{constructor(e){super({scale:1,mode:"fanAvg",distribution:"normal",seed:null==e?null:e.seed})}getClassName(){return QA.className}}ex.className="GlorotNormal",Bd(ex);class tx extends QA{constructor(e){super({scale:2,mode:"fanIn",distribution:"normal",seed:null==e?null:e.seed})}getClassName(){return QA.className}}tx.className="HeNormal",Bd(tx);class nx extends QA{constructor(e){super({scale:2,mode:"fanIn",distribution:"uniform",seed:null==e?null:e.seed})}getClassName(){return QA.className}}nx.className="HeUniform",Bd(nx);class ax extends QA{constructor(e){super({scale:1,mode:"fanIn",distribution:"normal",seed:null==e?null:e.seed})}getClassName(){return QA.className}}ax.className="LeCunNormal",Bd(ax);class ix extends QA{constructor(e){super({scale:1,mode:"fanIn",distribution:"uniform",seed:null==e?null:e.seed})}getClassName(){return QA.className}}ix.className="LeCunUniform",Bd(ix);class sx extends GA{constructor(e){super(),this.DEFAULT_GAIN=1,this.ELEMENTS_WARN_SLOW=2e3,this.gain=null==e.gain?this.DEFAULT_GAIN:e.gain,this.seed=e.seed}apply(e,t){return dh((()=>{if(e.length<2)throw new Dw("Shape must be at least 2D.");if("int32"!==t&&"float32"!==t&&void 0!==t)throw new TypeError(`Unsupported data type ${t}.`);const n=zs(e.slice(0,-1)),a=e[e.length-1];this.ELEMENTS_WARN_SLOW;const i=OA([Math.max(a,n),Math.min(a,n)],0,1,t,this.seed),s=nv.qr(i,!1);let r=s[0];const o=s[1].flatten().stridedSlice([0],[Math.min(a,n)*Math.min(a,n)],[Math.min(a,n)+1]);return r=Ed(r,o.sign()),ne*t));return t}const fx="Variable";class gx{constructor(e,t="float32",n=fx,a=!0,i=null){this.dtype=null==t?"float32":t,this.shape=e.shape,this.id=tA(),n=null==n?fx:n,this.originalName=gA(n),this.name=yA(this.originalName),this.trainable_=a,this.constraint=i,this.val=jy(e,this.trainable_,this.name,this.dtype)}read(){return this.assertNotDisposed(),this.val}write(e){return this.assertNotDisposed(),function(e,t){if(e.shape.toString()!==t.shape.toString())throw new Error("Shape mismatch: "+JSON.stringify(e.shape)+" vs. "+JSON.stringify(t.shape))}(this.val,e),this.val.id!==e.id&&(this.val.assign(e),null!=this.constraint&&this.val.assign(this.constraint.apply(this.val))),this}dispose(){this.assertNotDisposed(),this.val.dispose()}assertNotDisposed(){if(this.val.isDisposed)throw new Error(`LayersVariable ${this.name} is already disposed.`)}get trainable(){return this.trainable_}set trainable(e){this.trainable_=e,this.val.trainable=e}}function yx(e){return e.map((e=>e.read()))}function bx(e){e.forEach((e=>{e[0].write(e[1])}))}class vx{constructor(e){this.dtype=e.dtype,this.shape=e.shape,null!=e.shape?this.ndim=e.shape.length:this.ndim=e.ndim,this.maxNDim=e.maxNDim,this.minNDim=e.minNDim,this.axes=e.axes||{}}}class kx{constructor(e,t,n,a,i,s,r){this.dtype=e,this.shape=t,this.sourceLayer=n,this.inputs=a,this.callArgs=i,this.outputTensorIndex=r,this.id=tA(),null!=s&&(this.originalName=gA(s),this.name=yA(this.originalName)),this.rank=t.length}}let wx=0;class Ax{constructor(e,t){this.callArgs=t,this.id=wx++,this.outboundLayer=e.outboundLayer,this.inboundLayers=e.inboundLayers,this.nodeIndices=e.nodeIndices,this.tensorIndices=e.tensorIndices,this.inputTensors=e.inputTensors,this.outputTensors=e.outputTensors,this.inputMasks=e.inputMasks,this.outputMasks=e.outputMasks,this.inputShapes=e.inputShapes,this.outputShapes=e.outputShapes;for(const t of e.inboundLayers)null!=t&&t.outboundNodes.push(this);e.outboundLayer.inboundNodes.push(this)}getConfig(){const e=[];for(const t of this.inboundLayers)null!=t?e.push(t.name):e.push(null);return{outboundLayer:this.outboundLayer?this.outboundLayer.name:null,inboundLayers:e,nodeIndices:this.nodeIndices,tensorIndices:this.tensorIndices}}}let xx=0;class Cx extends Od{constructor(e={}){super(),this._callHook=null,this._addedWeightNames=[],this._stateful=!1,this.id=xx++,this.activityRegularizer=null,this.inputSpec=null,this.supportsMasking=!1,this._trainableWeights=[],this._nonTrainableWeights=[],this._losses=[],this._updates=[],this._built=!1,this.inboundNodes=[],this.outboundNodes=[];let t=e.name;if(!t){const e=this.getClassName();t=jw(e)+"_"+aA(e)}if(this.name=t,this.trainable_=null==e.trainable||e.trainable,null!=e.inputShape||null!=e.batchInputShape){let t;if(null!=e.batchInputShape)t=e.batchInputShape;else if(null!=e.inputShape){let n=null;null!=e.batchSize&&(n=e.batchSize),t=[n].concat(e.inputShape)}this.batchInputShape=t;let n=e.dtype;null==n&&(n=e.inputDType),null==n&&(n="float32"),this.dtype=n}null!=e.weights?this.initialWeights=e.weights:this.initialWeights=null,this._refCount=null,this.fastWeightInitDuringBuild=!1}static nodeKey(e,t){return e.name+"_ib-"+t.toString()}getNodeAtIndex(e,t){if(0===this.inboundNodes.length)throw new Nw(`The layer has never been called and thus has no defined ${t}.`);if(this.inboundNodes.length<=e)throw new Rw(`Asked to get ${t} at node ${e}, but the layer has only ${this.inboundNodes.length} inbound nodes.`);return this.inboundNodes[e]}getInputAt(e){return Lw(this.getNodeAtIndex(e,"input").inputTensors)}getOutputAt(e){return Lw(this.getNodeAtIndex(e,"output").outputTensors)}get input(){if(this.inboundNodes.length>1)throw new Iw(`Layer ${this.name} has multiple inbound nodes, hence the notion of "layer input" is ill-defined. Use \`getInputAt(nodeIndex)\` instead.`);if(0===this.inboundNodes.length)throw new Iw(`Layer ${this.name} is not connected, no input to return.`);return Lw(this.getNodeAtIndex(0,"input").inputTensors)}get output(){if(0===this.inboundNodes.length)throw new Iw(`Layer ${this.name} has no inbound nodes.`);if(this.inboundNodes.length>1)throw new Iw(`Layer ${this.name} has multiple inbound nodes, hence the notion of "layer output" is ill-defined. Use \`getOutputAt(nodeIndex)\` instead.`);return Lw(this.getNodeAtIndex(0,"output").outputTensors)}get losses(){return this._losses}calculateLosses(){return this.losses.map((e=>e()))}get updates(){return this._updates}get built(){return this._built}set built(e){this._built=e}get trainable(){return this.trainable_}set trainable(e){this._trainableWeights.forEach((t=>t.trainable=e)),this.trainable_=e}get trainableWeights(){return this.trainable_?this._trainableWeights.filter((e=>e.trainable)):[]}set trainableWeights(e){this._trainableWeights=e}get nonTrainableWeights(){return this.trainable?this._trainableWeights.filter((e=>!e.trainable)).concat(this._nonTrainableWeights):this._trainableWeights.concat(this._nonTrainableWeights)}set nonTrainableWeights(e){this._nonTrainableWeights=e}get weights(){return this.trainableWeights.concat(this.nonTrainableWeights)}get stateful(){return this._stateful}resetStates(){if(!this.stateful)throw new Error("Cannot call the resetStates() method of a non-stateful Layer object.")}assertInputCompatibility(e){const t=Pw(e);if(null==this.inputSpec||0===this.inputSpec.length)return;const n=Pw(this.inputSpec);if(t.length!==n.length)throw new Rw(`Layer ${this.name} expects ${n.length} inputs, but it received ${t.length} input tensors. Input received: ${e}`);for(let e=0;ei.maxNDim)throw new Rw(`Input ${e} is incompatible with layer ${this.name}: expected max_ndim=${i.maxNDim}, found ndim=${s}`);if(null!=i.minNDim&&s=0?t[a]:t[t.length+a];if(null!=s&&-1===[s,null].indexOf(r))throw new Rw(`Input ${e} is incompatible with layer ${this.name}: expected axis ${a} of input shape to have value ${s} but got shape ${t}.`)}}if(null!=i.shape)for(let t=0;t{if(!this.built){this.assertInputCompatibility(e);const t=[];for(const n of Pw(e))t.push(n.shape);this.build(Lw(t)),this.built=!0,this.initialWeights&&this.setWeights(this.initialWeights),null===this._refCount&&i&&(this._refCount=1)}if(this.assertInputCompatibility(e),i){let a=this.call(e,t);this.supportsMasking&&this.setMaskMetadata(e,a);const i=Pw(a),s=[];for(let e of i)-1!==n.indexOf(e)&&(e=e.clone()),s.push(e);if(a=Lw(s),null!=this.activityRegularizer)throw new Dw("Layer invocation in the presence of activity regularizer(s) is not supported yet.");return a}{const n=function(e){e=Pw(e);const t=[];for(const n of e)t.push(n.shape);return Lw(t)}(e),a=this.computeOutputShape(n);let i;const s="float32";if(this.warnOnIncompatibleInputShape(Array.isArray(e)?n[0]:n),i=null!=a&&a.length>0&&Array.isArray(a[0])?a.map(((n,a)=>new kx(s,n,this,Pw(e),t,this.name,a))):new kx(s,a,this,Pw(e),t,this.name),this.addInboundNode(e,i,null,null,n,a,t),this._refCount++,null!=this.activityRegularizer)throw new Dw("Layer invocation in the presence of activity regularizer(s) is not supported yet.");return i}}))}warnOnIncompatibleInputShape(e){if(null!=this.batchInputShape)if(e.length!==this.batchInputShape.length);else{let t=!1;this.batchInputShape.forEach(((n,a)=>{null!=n&&null!=e[a]&&e[a]!==n&&(t=!0)}))}}get outputShape(){if(null==this.inboundNodes||0===this.inboundNodes.length)throw new Iw(`The layer ${this.name} has never been called and thus has no defined output shape.`);const e=[];for(const t of this.inboundNodes){const n=JSON.stringify(t.outputShapes);-1===e.indexOf(n)&&e.push(n)}if(1===e.length){const e=this.inboundNodes[0].outputShapes;return Array.isArray(e)&&Array.isArray(e[0])&&1===e.length?e[0]:e}throw new Iw(`The layer ${this.name} has multiple inbound nodes with different output shapes. Hence the notion of "output shape" is ill-defined for the layer.`)}countParams(){if(!this.built)throw new Nw(`You tried to call countParams() on ${this.name}, but the layer is not built yet. Build it first by calling build(batchInputShape).`);return mx(this.weights)}build(e){this.built=!0}getWeights(e=!1){return yx(e?this.trainableWeights:this.weights)}setWeights(e){dh((()=>{const t=this.weights;if(t.length!==e.length)throw new Rw(`You called setWeights(weights) on layer "${this.name}" with a weight list of length ${e.length}, but the layer was expecting ${t.length} weights. Provided weights: ${e}...`);if(0===t.length)return;const n=[],a=yx(t);for(let i=0;ii.apply(u.read()))),null==s&&(s=!0),s?this._trainableWeights.push(u):this._nonTrainableWeights.push(u),u}setFastWeightInitDuringBuild(e){this.fastWeightInitDuringBuild=e}addLoss(e){null==e||Array.isArray(e)&&0===e.length||(e=Pw(e),void 0!==this._losses&&null!==this._losses&&this.losses.push(...e))}computeOutputShape(e){return e}computeMask(e,t){if(!this.supportsMasking){if(null!=t){if(!Array.isArray(t))throw new TypeError(`Layer ${this.name} does not support masking, but was passed an inputMask.`);t.forEach((e=>{if(null!=e)throw new TypeError(`Layer ${this.name} does not support masking, but was passed an inputMask.`)}))}return null}return t}setMaskMetadata(e,t,n){if(!this.supportsMasking)return;const a=this.computeMask(e,n),i=Pw(t),s=Pw(a);if(i.length!==s.length)throw new Error(`${this.name} outputs ${i.length} tensors but ${i.length} masks for those tensors`);for(let e=0;ee.dispose())),this.weights.length}assertNotDisposed(){if(0===this._refCount)throw new Error(`Layer '${this.name}' is already disposed.`)}dispose(){if(!this.built)throw new Error(`Cannot dispose Layer ${this.name} because it has not been built yet.`);if(null===this._refCount)throw new Error(`Cannot dispose Layer ${this.name} because it has not been used yet.`);this.assertNotDisposed();let e=0;return 0==--this._refCount&&(e=this.disposeWeights()),{refCountAfterDispose:this._refCount,numDisposedVariables:e}}}function Sx(e,t,n){if((null==t||null!=n&&n>0)&&(t=e.sourceLayer,n=e.nodeIndex),0===t.inboundNodes.length)return[e];{const e=t.inboundNodes[n];if(0===e.inboundLayers.length)return e.inputTensors;{const t=[];for(let n=0;ne.name)),l=[],u=t.names();for(const e of o)-1!==u.indexOf(e)?l.push(t.getValue(e)):l.push(null);null!=a&&(a.maxNumTensors=-1/0,a.minNumTensors=1/0);const c=o.join(",")+"|"+t.names().sort().join(",");let h,d=Tx.get(c);if(null==d){const e=function(e,t){Ns(null!=e&&e.length>0,(()=>"Expected at least one fetch, got none"));let n=[],a={};if(1===e.length){const i=Dx(e[0],t);n=i.sorted,a=i.recipientMap}else{const i=new Set;for(const s of e){const{sorted:e,recipientMap:r}=Dx(s,t);for(const t of e)i.has(t.name)||(n.push(t),i.add(t.name));for(const e in r)null==a[e]&&(a[e]=new Set),r[e].forEach((t=>a[e].add(t)))}}return{sorted:n,recipientCounts:Rx(a)}}(r,t);d=e.sorted,h=e.recipientCounts,Tx.put(c,d),Ix.put(c,h)}h={},i||Object.assign(h,Ix.get(c));const p=new _x(t);for(let e=0;ea.maxNumTensors&&(a.maxNumTensors=e),e0;){const e=s[s.length-1];if(n.has(e.name)){s.pop();continue}const t=r[r.length-1]===s.length-1;if(0===e.inputs.length||t)s.pop(),a.push(e),n.add(e.name),t&&r.pop();else{r.push(s.length-1);for(const t of e.inputs)null==i[t.name]&&(i[t.name]=new Set),i[t.name].add(e.name),n.has(t.name)||s.push(t)}}return{sorted:a,recipientMap:i}}function zx(e){let t;if(1===e.sourceLayer.inboundNodes.length)t=e.sourceLayer.output;else{let n=null;for(let t=0;t_d(Cf(Ed(e,e),t,!0))))}cr().registerFlag("TOPOLOGICAL_SORT_CACHE_MAX_ENTRIES",(()=>100),(function(e){null!=Tx&&Tx.setMaxEntries(e),null!=Ix&&Ix.setMaxEntries(e)}));class Mx extends Od{getConfig(){return{}}}class Bx extends Mx{constructor(e){super(),this.defaultMaxValue=2,this.defaultAxis=0,this.maxValue=null!=e.maxValue?e.maxValue:this.defaultMaxValue,this.axis=null!=e.axis?e.axis:this.defaultAxis}apply(e){return dh((()=>{const t=Ox(e,this.axis),n=Lm(t,0,this.maxValue);return Ed(e,Sd(n,xd(SA(),t)))}))}getConfig(){return{maxValue:this.maxValue,axis:this.axis}}}Bx.className="MaxNorm",Bd(Bx);class Fx extends Mx{constructor(e){super(),this.defaultAxis=0,this.axis=null!=e.axis?e.axis:this.defaultAxis}apply(e){return dh((()=>Sd(e,xd(SA(),Ox(e,this.axis)))))}getConfig(){return{axis:this.axis}}}Fx.className="UnitNorm",Bd(Fx);class Lx extends Mx{apply(e){return $g(e)}}Lx.className="NonNeg",Bd(Lx);class Px extends Mx{constructor(e){super(),this.defaultMinValue=0,this.defaultMaxValue=1,this.defaultRate=1,this.defaultAxis=0,this.minValue=null!=e.minValue?e.minValue:this.defaultMinValue,this.maxValue=null!=e.maxValue?e.maxValue:this.defaultMaxValue,this.rate=null!=e.rate?e.rate:this.defaultRate,this.axis=null!=e.axis?e.axis:this.defaultAxis}apply(e){return dh((()=>{const t=Ox(e,this.axis),n=xd(Ed(this.rate,Lm(t,this.minValue,this.maxValue)),Ed(1-this.rate,t));return Ed(e,Sd(n,xd(SA(),t)))}))}getConfig(){return{minValue:this.minValue,maxValue:this.maxValue,rate:this.rate,axis:this.axis}}}Px.className="MinMaxNorm",Bd(Px);const jx={maxNorm:"MaxNorm",minMaxNorm:"MinMaxNorm",nonNeg:"NonNeg",unitNorm:"UnitNorm"};function Vx(e){return Ww(e)}function Ux(e,t={}){return qw(e,Md.getMap().classNameMap,t,"constraint")}function Wx(e){if(null==e)return null;if("string"==typeof e){return Ux({className:e in jx?jx[e]:e,config:{}})}return e instanceof Mx?e:Ux(e)}async function Gx(e){if(null==e)return;const t=[],n=[],a=[];for(const i in e){const s=e[i];if("number"!=typeof s){const e=s;t.push(e.data()),n.push(i),a.push(e)}}if(t.length>0){const i=await Promise.all(t);for(let t=0;txd(this.totals[e],Ed(a,n))));this.totals[e]=i,null!=t&&t.dispose()}}}async onEpochEnd(e,t){if(null!=t)for(const e of this.params.metrics)null!=this.totals[e]&&("number"==typeof this.totals[e]?t[e]=this.totals[e]/this.seen:dh((()=>{const n=Ed(Sd(1,this.seen),this.totals[e]);t[e]=n,this.totals[e].dispose(),mh(t[e])})))}}class Yx extends $x{async onTrainBegin(e){this.epoch=[],this.history={}}async onEpochEnd(e,t){null==t&&(t={}),this.epoch.push(e);for(const e in t)null==this.history[e]&&(this.history[e]=[]),this.history[e].push(t[e])}async syncData(){const e=[],t=[],n=[];for(const a in this.history){const i=this.history[a];for(let s=0;s{const r=null!=n?n():ec();return r-inew Qx(e,t)))}class eC{constructor(){}static registerCallbackConstructor(e,t){Ns(e>=0&&Number.isInteger(e),(()=>`Verbosity level is expected to be an integer >= 0, but got ${e}`)),eC.checkForDuplicate(t),null==eC.constructors[e]&&(eC.constructors[e]=[]),eC.constructors[e].push(t)}static checkForDuplicate(e){for(const t in eC.constructors){eC.constructors[+t].forEach((t=>{if(t===e)throw new Rw("Duplicate callback constructor.")}))}}static clear(){eC.constructors={}}static createCallbacks(e){const t=[];for(const n in eC.constructors){const a=+n;e>=a&&t.push(...eC.constructors[a])}return t.map((e=>new e))}}function tC(e,t,n,a,i,s,r,o,l){const u=new Yx,c=[new Xx,...eC.createCallbacks(t)];null!=e&&c.push(...e),c.push(u);const h=new Zx(c);return h.setParams({epochs:n,initialEpoch:a,samples:i,steps:s,batchSize:r,verbose:t,doValidation:o,metrics:l}),{callbackList:h,history:u}}function nC(e,t={},n=!1){return qw(e,Md.getMap().classNameMap,t,"layer",n)}function aC(e,t){return dh((()=>{"float32"!==e.dtype&&(e=kd(e,"float32"));const n=Cf(FA(e),t,!0),a=Pd(n.shape,SA()),i=_d($d(n,a));return Sd(e,i)}))}function iC(e,t){return dh((()=>ug(FA(Ud(t,e)),-1)))}function sC(e,t){return dh((()=>ug(Gd(Ud(t,e)),-1)))}function rC(e,t){return dh((()=>{const n=Ud(e,t),a=Lm(Gd(e),SA(),Number.MAX_VALUE),i=Gd(Sd(n,a));return Ed(100,ug(i,-1))}))}function oC(e,t){return dh((()=>{const n=Lm(t,SA(),Number.MAX_VALUE),a=Hf(xd(1,n)),i=Lm(e,SA(),Number.MAX_VALUE),s=Hf(xd(1,i));return ug(FA(Ud(a,s)),-1)}))}function lC(e,t,n=!1){return dh((()=>{if(n)t=py(t);else{const e=Cf(t,t.shape.length-1,!0);t=Sd(t,e)}return t=Lm(t,SA(),1-SA()),$f(Cf(Ed(kd(e,"float32"),Hf(t)),t.shape.length-1))}))}function uC(e,t,n=!1){return dh((()=>{const a=kd(zf(function(e){const t=[kA(e.shape)];return vm(e,t)}(e)),"int32"),i=(t=Lm(t,SA(),1-SA())).shape;return lC(vm(kg(a,i[i.length-1]),i),t,n)}))}function cC(e,t){return dh((()=>{let n;return n=Lm(t,SA(),1-SA()),n=Hf(Sd(n,Ud(1,n))),ug(function(e,t){if(!Os(e.shape,t.shape))throw new Rw(`logits and labels must have the same shape, but got shapes ${JSON.stringify(e.shape)} and ${JSON.stringify(t.shape)}`);return dh((()=>{const n=$g(t),a=$f(Gd(t));return xd(Ud(n,Ed(t,e)),Kf(Tf(a)))}))}(e,n),-1)}))}function hC(e,t){return dh((()=>{const n=Lm(e,SA(),1),a=Lm(t,SA(),1);return Cf(Ed(e,Hf(Sd(n,a))),-1)}))}function dC(e,t){return dh((()=>{const n=aC(e,-1),a=aC(t,-1),i=Ed(n,a);return $f(Cf(i,-1))}))}eC.constructors={};const pC={meanSquaredError:iC,meanAbsoluteError:sC,meanAbsolutePercentageError:rC,meanSquaredLogarithmicError:oC,squaredHinge:function(e,t){return dh((()=>{const n=$d(0,Ud(1,Ed(e,t)));return ug(FA(n),-1)}))},hinge:function(e,t){return dh((()=>{const n=$d(0,Ud(1,Ed(e,t)));return ug(n,-1)}))},categoricalHinge:function(e,t){return dh((()=>{const n=Cf(Ed(e,t),-1),a=Af(Ed(Ud(1,e),t),-1);return $d(0,xd(1,Ud(a,n)))}))},logcosh:function(e,t){return dh((()=>{const n=Math.log(2),a=Ud(t,e),i=Ud(xd(a,Zf(Ed(-2,a))),n);return ug(i,-1)}))},categoricalCrossentropy:lC,sparseCategoricalCrossentropy:uC,binaryCrossentropy:cC,kullbackLeiblerDivergence:hC,poisson:function(e,t){return dh((()=>{const n=Hf(xd(SA(),t));return ug(Ud(t,Ed(e,n)),-1)}))},cosineProximity:dC};function mC(e){if("string"==typeof e){if(e in pC)return pC[e];let t=`Unknown loss ${e}`;throw e.toLowerCase().includes("softmaxcrossentropy")&&(t=`Unknown loss ${e}. Use "categoricalCrossentropy" as the string name for tf.losses.softmaxCrossEntropy`),new Rw(t)}return e}function fC(e,t){return dh((()=>{const n=Ed(.5,wg(t)),a=EA(Mf(t,n),e.dtype);return ug(rf(e,a),-1)}))}function gC(e,t){return dh((()=>EA(rf(Yp(e,-1),Yp(t,-1)),"float32")))}function yC(e,t){return dh((()=>kd(Cf(Jf(rf(e,1),rf(t,1))),"float32")))}function bC(e,t){return cC(e,t)}function vC(e,t){return e.rank===t.rank&&(e=ky(e,[e.rank-1])),(t=Yp(t,-1)).dtype!==e.dtype&&(t=kd(t,e.dtype)),kd(rf(e,t),"float32")}const kC=lC,wC=uC,AC={binaryAccuracy:fC,categoricalAccuracy:gC,precision:function(e,t){return dh((()=>{const n=yC(e,t),a=function(e,t){return dh((()=>kd(Cf(Jf(rf(e,0),rf(t,1))),"float32")))}(e,t),i=xd(n,a);return kd(of(Mf(i,0),Sd(n,i),0),"float32")}))},categoricalCrossentropy:kC,sparseCategoricalCrossentropy:wC,mse:iC,MSE:iC,mae:sC,MAE:sC,mape:rC,MAPE:rC,cosine:dC};function xC(e){if("string"==typeof e&&e in AC)return AC[e];if("string"!=typeof e&&null!=e)return e;throw new Rw(`Unknown metric ${e}`)}function CC(e){if(Bw(null!==e,`Unknown LossOrMetricFn ${e}`),"string"==typeof e)return e;{let t;for(const n of Object.keys(pC))if(pC[n]===e){t=n;break}if(void 0!==t)return t;for(const n of Object.keys(AC))if(AC[n]===e){t=n;break}return void 0!==t?t:e.name}}function SC(e,t,n=!1){if(null==e||"object"!=typeof e||Object.getPrototypeOf(e)!==Object.prototype||!EC(e))throw new Error("User-defined metadata is expected to be a JSON object, but is not.");if(n){JSON.stringify(e).length}}function EC(e){if(null===e)return!0;if("object"==typeof e){if(Object.getPrototypeOf(e)===Object.prototype){const t=Object.keys(e);for(const n of t){if("string"!=typeof n)return!1;if(!EC(e[n]))return!1}return!0}if(Array.isArray(e)){for(const t of e)if(!EC(t))return!1;return!0}return!1}{const t=typeof e;return"string"===t||"number"===t||"boolean"===t}}function _C(e,t,n,a=console.log){const i=function(e){let t=!0;const n=[],a=[];for(const t in e.nodesByDepth)n.push(e.nodesByDepth[t]);for(const e of n){if(e.length>1||1===e.length&&e[0].inboundLayers.length>1){t=!1;break}a.push(...e)}if(t)for(const n of e.layers){let e=!1;for(const i of n.inboundNodes)if(-1!==a.indexOf(i)){if(e){t=!1;break}e=!0}if(!t)break}return t}(e),s=["Layer (type)","Input Shape","Output shape","Param #"];let r;if(i?(t=t||90,n=n||[.32,.61,.89,1]):(t=t||115,n=n||[.24,.48,.7,.8,1]),n[n.length-1]<=1&&(n=n.map((e=>Math.floor(t*e)))),!i){s.push("Receives inputs"),r=[];for(const t in e.nodesByDepth)r.push(...e.nodesByDepth[t])}a("_".repeat(t)),TC(s,n,a),a("=".repeat(t));const o=e.layers;for(let e=0;e0&&(a=a.slice(0,a.length-1)+" "),a+=e[n],a=a.slice(0,t[n]),a+=" ".repeat(t[n]-a.length);n(a)}function IC(e,t,n){let a,i;try{i=e.inboundNodes.map((e=>JSON.stringify(e.inputShapes))).join(",")}catch(e){i="multiple"}try{a=JSON.stringify(e.outputShape)}catch(e){a="multiple"}TC([`${e.name} (${e.getClassName()})`,i,a,e.countParams().toString()],t,n)}function NC(e,t,n,a){let i,s;try{s=e.inboundNodes.map((e=>JSON.stringify(e.inputShapes))).join(",")}catch(e){s="multiple"}try{i=JSON.stringify(e.outputShape)}catch(e){i="multiple"}const r=[];for(const t of e.inboundNodes)if(!(null!=n&&n.length>0&&-1===n.indexOf(t)))for(let e=0;ee.name))}`);Kw(this.outputs).length,this.outputs.length,this.inputLayers=[],this.inputLayersNodeIndices=[],this.inputLayersTensorIndices=[],this.outputLayers=[],this.outputLayersNodeIndices=[],this.outputLayersTensorIndices=[],this.layers=[],this.internalContainerRefs=[];for(const e of this.outputs){const t=e.sourceLayer,n=e.nodeIndex,a=e.tensorIndex;this.outputLayers.push(t),this.outputLayersNodeIndices.push(n),this.outputLayersTensorIndices.push(a)}for(const e of this.inputs){const t=e.sourceLayer,n=e.nodeIndex,a=e.tensorIndex;Bw(0===n,"input layer has >1 nodes"),Bw(0===a,"input layer has >1 tensors"),this.inputLayers.push(t),this.inputLayersNodeIndices.push(n),this.inputLayersTensorIndices.push(a)}this.inputNames=[],this.outputNames=[],this.feedInputShapes=[],this.feedInputNames=[],this.feedOutputNames=[];for(let t=0;te.shape)),this.internalOutputShapes=this.outputs.map((e=>e.shape));const t={},n={},a={},i={},s={},r=[],o=(e,t,n,a,i,l)=>{null!=a&&null!=i&&null!=l||(a=e.sourceLayer,i=e.nodeIndex,l=e.tensorIndex);const u=a.inboundNodes[i];if(-1!==n.indexOf(u))throw new Nw(`The tensor ${e.name} at layer "${a.name}" is part of a cycle.`);if(-1!==t.indexOf(u))return;this.containerNodes.add(MC.nodeKey(a,i)),a.id in s||(s[a.id]=Object.keys(s).length),-1===n.indexOf(u)&&n.push(u);const c=u.inboundLayers.length;for(let e=0;e=0;)n.splice(n.indexOf(u),1);r.push(u)},l=[],u=[];for(const e of this.outputs)o(e,l,u);const c=r.slice().reverse();for(const e of c){n[e.id]=e,e.id in t||(t[e.id]=0);let s=t[e.id];const r=null==a[e.outboundLayer.id]?0:a[e.outboundLayer.id];s=Math.max(s,r),a[e.outboundLayer.id]=s,i[e.outboundLayer.id]=e.outboundLayer,t[e.id]=s;for(let a=0;aparseInt(e,10))).sort(Hw);this.layers=[];for(const e of p){const t=d[e];t.sort(((e,t)=>{const n=s[e.id],a=s[t.id];return na?1:0}));for(const e of t)e instanceof MC&&this.internalContainerRefs.push(e),this.layers.push(e)}this.layersByDepth=d,p=Object.keys(h).map((e=>parseInt(e,10))).sort(Hw);const m=this.inputs.slice(),f=[];for(const e of p)for(const t of h[e]){const e=t.outboundLayer;if(null!=e){for(const n of t.inputTensors)if(-1===m.indexOf(n))throw new Nw(`Graph disconnected: cannot obtain value for tensor ${n} at layer "${e.name}". The following previous layers were accessed without issue: ${f}`);for(const e of t.outputTensors)m.push(e);f.push(e.name)}}this.nodesByDepth=h;const g=this.layers.map((e=>e.name));for(const e of g){const t=g.filter((t=>t===e)).length;if(1!==t)throw new Nw(`The name "${e}" is used ${t} times in the model. All layer names should be unique. Layer names: `+JSON.stringify(g))}this.outboundNodes=[],this.inboundNodes=[],new Ax({outboundLayer:this,inboundLayers:[],nodeIndices:[],tensorIndices:[],inputTensors:this.inputs,outputTensors:this.outputs,inputMasks:this.inputs.map((e=>null)),outputMasks:this.outputs.map((e=>null)),inputShapes:this.inputs.map((e=>e.shape)),outputShapes:this.outputs.map((e=>e.shape))}),this.built=!0,this._refCount=1}assertNotDisposed(){if(0===this._refCount)throw new Error(`Container '${this.name}' is already disposed.`)}dispose(){this.assertNotDisposed();const e={refCountAfterDispose:null,numDisposedVariables:0};if(0==--this._refCount){for(const t of this.layers)e.numDisposedVariables+=t.dispose().numDisposedVariables;for(const t of this.internalContainerRefs)e.numDisposedVariables+=t.dispose().numDisposedVariables}return e.refCountAfterDispose=this._refCount,e}get trainable(){return this.trainable_}set trainable(e){this.layers.forEach((t=>{t._trainableWeights.forEach((t=>t.trainable=e))})),this.trainable_=e}get trainableWeights(){if(this._trainableWeights.length>0)throw new Rw("Container instance unexpectedly contains _trainableWeights.The trainable weights of a Container are a union of the trainable weights of its consituent Layers. Its own _trainableWeights must remain an empty Array.");if(!this.trainable)return[];let e=[];for(const t of this.layers)e=e.concat(t.trainableWeights);return e}get nonTrainableWeights(){const e=[];for(const t of this.layers)e.push(...t.nonTrainableWeights);if(!this.trainable){const t=[];for(const e of this.layers)t.push(...e.trainableWeights);return t.concat(e)}return e}get weights(){return this.trainableWeights.concat(this.nonTrainableWeights)}loadWeights(e,t=!0){const n={};let a=0;const i=(e=>{const t=Object.keys(e);if(0===t.length)return!1;const n=t[0].split("/");return!isNaN(parseInt(n[n.length-1],10))})(e);i&&this.parseWeights(e);for(const e of this.layers)for(const[t,s]of e.weights.entries()){const e=i?`${s.name.split("/").slice(0,-1).join("/")+"/"}${t}`:s.originalName;if(null!=n[e])throw new Rw(`Duplicate weight name: ${e}`);n[e]=s,a++}const s=[];for(const a in e){let i=a;if(null==n[a]){const e=a.split("/");i=e.slice(0,-2).concat([e[e.length-1]]).join("/")}if(null!=n[i])s.push([n[i],e[a]]);else if(t)throw new Rw(`Provided weight data has no target variable: ${a}`);delete n[i]}if(t){const e=[];for(const t in n)e.push(t);if(e.length>0)throw new Rw(`${e.length} of ${a} weights are not set: ${e}`)}bx(s)}parseWeights(e){for(const t in Object.keys(e)){const n=t.split("/"),a=["vars","layer_checkpoint_dependencies"],i=n.map((e=>e.startsWith("_")?e.slice(1):e)).filter((e=>!a.includes(e))).join("/");i!==t&&(e[i]=e[t],delete e[t])}}updatedConfig(){const e=this.getConfig(),t={};return t.className=this.getClassName(),t.config=e,t.kerasVersion=`tfjs-layers ${OC}`,t.backend="TensorFlow.js",t}toJSON(e,t=!0){const n=zC(this.updatedConfig());return t?JSON.stringify(n):n}call(e,t){return dh((()=>{e=Pw(e);const n=new _x;for(let t=0;t{let n;return e=Pw(e),n=null==t?Mw(null,e.length):Pw(t),this.runInternalGraph(e,n)[1]}))}computeOutputShape(e){const t=hx(e);if(t.length!==this.inputLayers.length)throw new Rw(`Invalid inputShape argument ${e}: model has ${this.inputLayers.length} tensor inputs.`);const n={};for(let e=0;eparseInt(e,10))).sort(Hw);if(a.length>1)for(const e of a){const t=this.nodesByDepth[e];for(const e of t){const t=e.outboundLayer;if(-1!==this.inputLayers.map((e=>e.id)).indexOf(t.id))continue;const a=[];for(let t=0;tparseInt(e,10))).sort(Hw);for(const e of a){const t=this.nodesByDepth[e];for(const e of t){const t=e.outboundLayer,a=e.inputTensors,i=e.outputTensors,s=new Array;for(const e of a)e.id in n&&s.push(n[e.id]);if(s.length===a.length){let a,r,o,l,u={};if(null!=e.callArgs&&(u=e.callArgs),1===s.length){const[e,n]=s[0];null==u.mask&&(u.mask=n),o=Pw(t.call(e,u)),l=Pw(t.computeMask(e,n)),a=[e],r=[n]}else a=s.map((e=>e[0])),r=s.map((e=>e[1])),null==u.mask&&(u.mask=r),o=Pw(t.call(a,u)),l=Pw(t.computeMask(a,r));if(t.activityRegularizer)throw new Dw("LayersModel invocation with concrete Tensor value(s) in the presence of activity regularizer(s) is not supported yet.");for(let e=0;e{const e=[];for(const t of this.layers)for(let n=0;n0){const e=[];for(let n=0;n0&&e.apply(Lw(n),a)}function l(e){const n=e.name,s=nC(e,null!=t.customObjects?t.customObjects:{});s.setFastWeightInitDuringBuild(a),i[n]=s;e.inboundNodes.forEach((e=>{if(!(e instanceof Array))throw new Rw(`Corrupted configuration, expected array for nodeData: ${e}`);r(s,e)}))}const u=t.name,c=t.layers;for(const e of c)l(e);for(;!$w(s);)for(const e of c){const t=i[e.name];if(t.name in s){const e=s[t.name];delete s[t.name];for(const n of e)o(t,n)}}const h=[],d=[],p=t.inputLayers;for(const e of p){const t=e[0],n=e[1],a=e[2];Bw(t in i);const s=i[t].inboundNodes[n].outputTensors;h.push(s[a])}const m=t.outputLayers;for(const e of m){const t=e[0],n=e[1],a=e[2];Bw(t in i);const s=i[t].inboundNodes[n].outputTensors;d.push(s[a])}return new e({inputs:h,outputs:d,name:u})}get stateful(){if(this._stateful)throw new Rw("Container instance unexpectedly has _stateful = true. The statefulness of a Container is determined by the Layers it contains. Its _stateful property must remain the default false.");for(const e of this.layers)if(e.stateful)return!0;return!1}resetStates(){dh((()=>{this.layers.forEach((e=>{e.stateful&&e.resetStates()}))}))}}function BC(e,t,n){const a=t.length;if(null==e||Array.isArray(e)&&0===e.length)return t.map((e=>null));if(1===a)return Array.isArray(e)&&1===e.length?e:"object"==typeof e&&t[0]in e?[e[t[0]]]:[e];if(Array.isArray(e)){if(e.length!==a)throw new Error(`Provided ${n} is an array of ${e.length} element(s), but the model has ${a} outputs. Make sure a set of weights is provided for each model output.`);return e}if("object"==typeof e&&Object.keys(e).length>0&&"object"==typeof e[Object.keys(e)[0]]){const n=[];return t.forEach((t=>{t in e?n.push(e[t]):n.push(null)})),n}throw new Error(`The model has multiple (${a}) outputs, so ${n} must be either an array with ${a} elements or an object with ${t} keys. Provided ${n} not understood: ${JSON.stringify(e)}`)}function FC(e,t){return BC(e,t,"classWeight")}async function LC(e,t,n,a){if(null!=t||null!=a)throw new Error("Support sampleWeight is not implemented yet");if(null!=n){const t=dh((()=>{if(1===e.shape.length)return wd(e);if(2===e.shape.length){if(e.shape[1]>1){return Yp(e,1)}if(1===e.shape[1])return vm(e,[e.shape[0]]);throw new Error(`Encountered unexpected last-dimension size (${e.shape[1]}) during handling of class weights. The size is expected to be >= 1.`)}throw new Error(`Unexpected rank of target (y) tensor (${e.rank}) during handling of class weights. The rank is expected to be 1 or 2.`)})),a=Array.from(await t.data());ph(t);const i=[];return a.forEach((e=>{if(null==n[e])throw new Error(`classWeight must contain all classes in the training data. The class ${e} exists in the data but not in classWeight`);i.push(n[e])})),Sy(i,"float32")}return null}function PC(e,t){return Ed(e,t)}function jC(e,t){let n,a;const i=t;n=i.xs,a=i.ys,Ns(null!=n&&null!=a,(()=>`A Dataset iterator for fitDataset() is expected to generate objects of the form \`{xs: xVal, ys: yVal}\`, where the two values may be \`tf.Tensor\`, an array of Tensors, or a map of string to Tensor. The provided Dataset instead generates ${t}`));const s=VC("input",e.inputNames,n),r=VC("output",e.outputNames,a),o=s[0].shape[0];Ns(s.length===e.inputs.length,(()=>`LayersModel has ${e.inputs.length} inputs, but the dataset provides ${s.length} inputs. (Expected input keys: ${JSON.stringify(e.inputNames)})`)),Ns(r.length===e.outputs.length,(()=>`LayersModel has ${e.outputs.length} outputs, but the dataset provides ${r.length} outputs. (Expected output keys: ${JSON.stringify(e.outputNames)})`));for(let t=0;t`Batch size mismatch: input ${e.inputNames[t]} has ${s[t].shape[0]}; expected ${o} based on input ${e.inputNames[0]}.`));for(let t=0;t`Batch size mismatch: output ${e.outputNames[t]} has ${r[t].shape[0]}; expected ${o} based on input ${e.inputNames[0]}.`));return{xs:s,ys:r}}function VC(e,t,n){if(n instanceof kc)return[n];if(Array.isArray(n))return Ns(n.length===t.length,(()=>`Received an array of ${n.length} Tensors, but expected ${t.length} to match the ${e} keys ${t}.`)),n;{const a=[];for(const i of t){if(null==n[i])throw new Rw(`The feature data generated by the dataset lacks the required ${e} key '${i}'.`);a.push(n[i])}return a}}async function UC(e,t,n){const a=null!=n.batchesPerEpoch;if(Ns(null!=e.optimizer,(()=>"You must compile a model before training/testing. Use LayersModel.compile(modelCompileConfig).")),Ns(null!=n,(()=>"For fitDataset(), the 2nd argument (config) is required, but it is not provided in this call.")),Ns(null!=n.epochs&&n.epochs>0&&Number.isInteger(n.epochs),(()=>`For fitDataset(), config.epochs is expected to be a positive integer, but got ${n.epochs}`)),Ns(!a||n.batchesPerEpoch>0&&Number.isInteger(n.batchesPerEpoch),(()=>`For fitDataset(), config.batchesPerEpoch is expected to be a positive integer if specified, but got ${n.batchesPerEpoch}`)),Ns(null==n.validationSplit,(()=>"`validationSplit` is not supported by `fitDataset()`. Use validationData instead.")),e.isTraining)throw new Error("Cannot start training because another fit() call is ongoing.");e.isTraining=!0;try{const i=null!=n.validationData;let s,r;if(i)if(WC(n.validationData))Ns(null==n.validationBatches||n.validationBatches>0&&Number.isInteger(n.validationBatches),(()=>`For fitDataset() with dataset-based validation, config.validationBatches is expected not to be provided, or to be a positive integer, but got ${n.validationBatches}`));else{const e=function(e){if(3===e.length)throw new Dw("Validation with sample weights is not implemented yet.");return{xs:e[0],ys:e[1]}}(n.validationData);s=e.xs,r=e.ys}const o=e.makeTrainFunction(),l=e.getDedupedMetricsNames();let u;u=i?l.slice().concat(l.map((e=>"val_"+e))):l.slice();const c=Jx(n.callbacks,n.yieldEvery),h=null==n.verbose?1:n.verbose,{callbackList:d,history:p}=tC(c,h,n.epochs,null,null,function(e,t){let n=null;null!=t.batchesPerEpoch?n=t.batchesPerEpoch:Number.isFinite(e.size)&&(n=e.size);return n}(t,n),null,i,u);d.setModel(e),e.history=p,await d.onTrainBegin(),e.stopTraining_=!1;let m=null==n.initialEpoch?0:n.initialEpoch,f=await t.iterator();for(;m=n.batchesPerEpoch:t.done){if(i){let t;t=WC(n.validationData)?Pw(await e.evaluateDataset(n.validationData,{batches:n.validationBatches})):Pw(e.evaluate(s,r,{batchSize:null==n.validationBatchSize?32:n.validationBatchSize,verbose:0}));for(let n=0;n0&&Number.isInteger(e),(()=>`batchSize is required to be a positive integer, but got ${e}`))}function qC(e,t,n){return null==e?[null]:Array.isArray(e)?e.map((e=>TA(e,t,n-t))):TA(e,t,n-t)}function HC(e,t){return dh((()=>null==e?null:Array.isArray(e)?e.map((e=>HC(e,t))):BA(e,"int32"===t.dtype?t:kd(t,"int32"))))}function KC(e,t){const n=[];let a=0,i=null;for(;a=e&&(i=e),n.push([a,i]),a=i;return n}function $C(e){const t=[];e instanceof kc&&(e=[e]);for(let n=0;nn.push(e.id)));else if(null!=t)for(const e in t){const a=t[e];n.push(a.id)}const a=[];if(e instanceof kc)-1===n.indexOf(e.id)&&a.push(e);else if(Array.isArray(e))e.forEach((e=>{-1===n.indexOf(e.id)&&a.push(e)}));else if(null!=e)for(const t in e){const i=e[t];-1===n.indexOf(i.id)&&a.push(i)}a.forEach((e=>{e.isDisposed||e.dispose()}))}function XC(e){return Array.isArray(e)}function YC(e){return!function(e){return e instanceof kc}(e)&&!XC(e)}function QC(e,t,n,a=!0,i=""){if(null==t||0===t.length){if(null!=e){let t=!1;if(XC(e)&&e.length>0)t=!0;else if(YC(e)){for(const n in e)if(e.hasOwnProperty(n)){t=!0;break}}else t=!0;if(t)throw new Rw(`Error when checking model ${i} expected no data, but got ${e}`)}return[]}if(null==e)return t.map((e=>null));let s;if(YC(e)){s=[];for(const n of t){if(null==e[n])throw new Rw(`No data provided for "${n}". Need data for each key in: ${t}`);s.push(e[n])}}else if(XC(e)){if(e.length!==t.length)throw new Rw(`Error when checking model ${i}: the Array of Tensors that you are passing to your model is not the size the model expected. Expected to see ${t.length} Tensor(s), but instead got the following list of Tensor(s): ${e}`);s=e}else{if(t.length>1)throw new Rw(`The model ${i} expects ${t.length} Tensor(s), but only received one Tensor. Found: Tensor with shape ${e.shape}`);s=[e]}if(s=$C(s),null!=n)for(let e=0;e=0&&s!==o)throw new Rw(`${i} expected a batch of elements where each example has shape [${n[e].slice(1,n[e].length)}] (i.e.,tensor shape [*,${n[e].slice(1,n[e].length)}]) but the ${i} received an input with ${r.shape[0]} examples, each with shape [${r.shape.slice(1,r.shape.length)}] (tensor shape [${r.shape}])`)}}return s}function JC(e,t,n,a=!0,i=""){let s;if(Array.isArray(e)){if(e.length!==t.length)throw new Rw(`Error when checking model ${i}: the Array of Tensors that you are passing to your model is not the size the the model expected. Expected to see ${t.length} Tensor(s), but instead got ${e.length} Tensors(s).`);s=e}else{if(t.length>1)throw new Rw(`The model expects ${t.length} ${i} Tensors, but only received one Tensor. Found: array with shape ${JSON.stringify(e.shape)}.`);s=[e]}if(null!=n)for(let e=0;erv.adagrad(.01),Adadelta:()=>rv.adadelta(1,.95,SA()),Adam:()=>rv.adam(.001,.9,.999,SA()),Adamax:()=>rv.adamax(.002,.9,.999,SA(),0),RMSProp:()=>rv.rmsprop(.001,.9,0,SA()),SGD:()=>rv.sgd(.01)};if(t.adagrad=t.Adagrad,t.adadelta=t.Adadelta,t.adam=t.Adam,t.adamax=t.Adamax,t.rmsprop=t.RMSProp,t.sgd=t.SGD,e in t)return t[e]();throw new Rw(`Unknown Optimizer ${e}`)}(e.optimizer),this.isOptimizerOwned=!0;else{if(!(e.optimizer instanceof Fd))throw new Rw("User-defined optimizer must be an instance of tf.Optimizer.");this.optimizer_=e.optimizer,this.isOptimizerOwned=!1}let t=[];if(Array.isArray(e.loss)||"string"==typeof e.loss||"function"==typeof e.loss)if(Array.isArray(e.loss)){if(e.loss.length!==this.outputs.length)throw new Rw(`When passing an Array as loss, it should have one entry per model output. The model has ${this.outputs.length} output(s), but you passed loss=${e.loss}.`);const n=e.loss;t=n.map((e=>mC(e)))}else{const n=mC(e.loss);this.outputs.forEach((e=>{t.push(n)}))}else{e.loss=e.loss;for(const t in e.loss)if(-1===this.outputNames.indexOf(t))throw new Rw(`Unknown entry in loss dictionary: "${t}". Only expected the following keys: ${this.outputNames}`);for(const n of this.outputNames)e.loss[n],t.push(mC(e.loss[n]))}this.lossFunctions=t,this.feedOutputNames=[],this.feedOutputShapes=[],this.feedLossFns=[];for(let e=0;e{for(let e=0;e1&&(this.metricsTensors.push([t,e]),this.metricsNames.push(this.outputNames[e]+"_loss"))}}));const a=function(e,t){if(null==e||Array.isArray(e)&&0===e.length)return t.map((e=>[]));let n;if("string"==typeof e||"function"==typeof e)n=[e];else{if(!Array.isArray(e)&&"object"!=typeof e)throw new TypeError(`Type of metrics argument not understood. Expected an string,function, Array, or Object, found: ${e}`);n=e}if(Array.isArray(n))return t.map((e=>n));{const e=[];for(const a of t){let t=n.hasOwnProperty(a)?n[a]:[];Array.isArray(t)||(t=[t]),e.push(t)}return e}}(e.metrics,this.outputNames),i=(e,t,n)=>{this.outputNames.length>1&&(t=this.outputNames[e]+"_"+t),this.metricsNames.push(t),this.metricsTensors.push([n,e])};fA("metric",(()=>{for(let e=0;e{let n,a,s;for(const r of t){if("string"==typeof r&&-1!==["accuracy","acc","crossentropy","ce"].indexOf(r)){const t=this.internalOutputShapes[e];let i;1===t[t.length-1]||this.lossFunctions[e]===cC?-1!==["accuracy","acc"].indexOf(r)?a=fC:-1!==["crossentropy","ce"].indexOf(r)&&(a=bC):this.lossFunctions[e]===uC?-1!==["accuracy","acc"].indexOf(r)?a=vC:-1!==["crossentropy","ce"].indexOf(r)&&(a=wC):-1!==["accuracy","acc"].indexOf(r)?a=gC:-1!==["crossentropy","ce"].indexOf(r)&&(a=kC),-1!==["accuracy","acc"].indexOf(r)?i="acc":-1!==["crossentropy","ce"].indexOf(r)&&(i="ce"),s=a,n=""+i}else{const e=xC(r);s=e,n=""+CC(r)}let t;fA(n,(()=>{t=s})),i(e,n,t)}})(a[e])}})),this.collectedTrainableWeights=this.trainableWeights}checkTrainableWeightsConsistency(){null!=this.collectedTrainableWeights&&(this.trainableWeights.length,this.collectedTrainableWeights.length)}evaluate(e,t,n={}){const a=null==n.batchSize?32:n.batchSize;GC(a);const i=this.standardizeUserDataXY(e,t,!0,a);try{const e=i[0].concat(i[1]);this.makeTestFunction();const t=this.testFunction;return Lw(this.testLoop(t,e,a,n.verbose,n.steps))}finally{ZC(i[0],e),ZC(i[1],t)}}async evaluateDataset(e,t){return this.makeTestFunction(),async function(e,t,n){const a=null!=(n=n||{}).batches,i=e.testFunction;let s=[];if(n.verbose>0)throw new Dw("Verbose mode is not implemented yet.");Ns(!a||n.batches>0&&Number.isInteger(n.batches),(()=>`Test loop expects \`batches\` to be a positive integer, but received ${JSON.stringify(n.batches)}`));const r="function"==typeof t.next?t:await t.iterator();let o=0,l=0;for(;!a||l{if(t.value){const{xs:n,ys:a}=jC(e,t.value),r=n.concat(a),u=dh((()=>i(r)));if(ph(r),0===l)for(let e=0;exd(s[e],Ed(c,t)))),l>0&&ph(n)}ph(u),o+=c,++l}return s})),t.done)break}for(let e=0;ee.name));for(let a=0;a0){const n=[];throw t.forEach(((t,a)=>{null==t&&n.push(e[a])})),new Rw(`Cannot find SymbolicTensors for output name(s): ${JSON.stringify(n)}`)}return t}predictLoop(e,t=32,n=!1){return dh((()=>{const a=this.checkNumSamples(e);if(n)throw new Dw("Verbose predictLoop() is not implemented yet.");const i=KC(a,t),s=this.outputs.map((e=>[]));for(let t=0;t{const n=i[t][0],a=i[t][1],s=qC(e,n,a),r=[];if(Array.isArray(s))for(let e=0;es[t].push(e)))}return Lw(s.map((e=>Am(e,0))))}))}predict(e,t={}){const n=$C(e);JC(n,this.inputNames,this.feedInputShapes,!1);try{const e=null==t.batchSize?32:t.batchSize;return GC(e),this.predictLoop(n,e)}finally{ZC(n,e)}}predictOnBatch(e){JC(e,this.inputNames,this.feedInputShapes,!0);const t=(Array.isArray(e)?e[0]:e).shape[0];return this.predictLoop(e,t)}standardizeUserDataXY(e,t,n=!0,a){if(null==this.optimizer_)throw new Nw("You must compile a model before training/testing. Use LayersModel.compile(modelCompileArgs).");const i=[];for(let e=0;ee.shape[0])));a.sort();const i=Kw(t.map((e=>e.shape[0])));if(i.sort(),a.length>1)throw new Rw(`All input Tensors (x) should have the same number of samples. Got array shapes: ${JSON.stringify(e.map((e=>e.shape)))}`);if(i.length>1)throw new Rw(`All target Tensors (y) should have the same number of samples. Got array shapes: ${JSON.stringify(t.map((e=>e.shape)))}`);if(a.length>0&&i.length>0&&!Os(a,i))throw new Rw(`Input Tensors should have the same number of samples as target Tensors. Found ${a[0]} input sample(s) and ${i[0]} target sample(s).`)}(e=QC(e,this.feedInputNames,this.feedInputShapes,!1,"input"),t=QC(t,this.feedOutputNames,i,!1,"target")),function(e,t,n){const a=[iC,cC,lC];for(let i=0;i0&&e[0].shape[0]%a!=0)throw new Rw(`In a stateful network, you should only pass inputs with a number of samples that is divisible by the batch size ${a}. Found: ${e[0].shape[0]} sample(s).`);return[e,t]}async standardizeUserData(e,t,n,a,i=!0,s){const[r,o]=this.standardizeUserDataXY(e,t,i,s);if(null!=n)throw new Error("sample weight is not supported yet.");let l=null;if(null!=a){const e=FC(a,this.outputNames);l=[];for(let t=0;t{const s=this.checkNumSamples(t,n,i,"steps"),r=[];if(a>0)throw new Dw("Verbose mode is not implemented yet.");if(null!=i)throw new Dw("steps mode in testLoop() is not implemented yet");{const a=KC(s,n),i=Sy(xA(0,s));for(let n=0;n1){i+=`_${Fw(e.slice(0,n),a)}`}t.push(i)}return t}makeTrainFunction(){return e=>{const t=[],n=e.slice(0,this.inputs.length),a=e.slice(this.inputs.length,this.inputs.length+this.outputs.length),i=e.slice(this.inputs.length+this.outputs.length,this.inputs.length+2*this.outputs.length),s=[],r=this.collectedTrainableWeights.map((e=>e.read()));return[this.optimizer_.minimize((()=>{const e=[];for(let t=0;t1&&e{l=xd(l,e)})),l}),!0,r)].concat(s)}}makeTestFunction(){this.testFunction=e=>dh((()=>{const t=[];let n;const a=e.slice(0,this.inputs.length),i=e.slice(this.inputs.length,this.inputs.length+this.outputs.length),s=[];for(let e=0;e0){if(g=!0,2!==n.validationData.length)throw 3===n.validationData.length?new Dw("validationData including sample weights is not supported yet."):new Rw(`When passing validation data, it must contain 2 (valX, valY) or 3 (valX, valY, valSampleWeight) items; ${n.validationData} is invalid.`);o=n.validationData[0],l=n.validationData[1];const e=!0,t=await this.standardizeUserData(o,l,null,null,e,d);u=t[0],c=t[1],f=u.concat(c)}else if(null!=n.validationSplit&&n.validationSplit>0&&n.validationSplit<1){g=!0;const e=Math.floor(a[0].shape[0]*(1-n.validationSplit)),t=a[0].shape[0];u=qC(a,e,t),s=a,a=qC(a,0,e),c=qC(i,e,t),r=i,i=qC(i,0,e),f=u.concat(c)}else null!=n.validationSteps&&(g=!0);const y=a.concat(i).concat(h);this.checkTrainableWeightsConsistency();const b=this.makeTrainFunction(),v=this.getDedupedMetricsNames();let k,w;g?(this.makeTestFunction(),k=this.testFunction,w=v.slice().concat(v.map((e=>"val_"+e)))):(k=null,f=[],w=v.slice());const A=Jx(n.callbacks,n.yieldEvery);return await this.fitLoop(b,y,v,d,n.epochs,n.verbose,A,k,f,n.shuffle,w,n.initialEpoch,null,null)}finally{this.isTraining=!1,ZC(a,e),ZC(i,t),ZC(s,e),ZC(r,t),ZC(u,o),ZC(c,l),null!=h&&ph(h)}}async fitLoop(e,t,n,a,i,s,r,o,l,u,c,h,d,p){null==a&&(a=32),null==i&&(i=1),null==u&&(u=!0),null==h&&(h=0);let m=!1;if(null!=o&&null!=l&&(m=!0),null!=p&&(m=!0,null==d))throw new Rw("Can only use `validationSteps` when doing step-wise training, i.e., `stepsPerEpoch` must be set.");const f=this.checkNumSamples(t,a,d,"steps_per_epoch");let g;null!=f&&(g=xA(0,f)),null==s&&(s=1);const{callbackList:y,history:b}=tC(r,s,i,h,f,d,a,m,c);y.setModel(this),this.history=b,await y.onTrainBegin(),this.stopTraining_=!1;for(let s=h;s{const h=r[u][0],d=r[u][1],p=TA(s,h,d-h);c.batch=u,c.size=d-h;const f=HC(t,p),g=e(f);for(let e=0;ejw(e)))}else{const t=Object.keys(this.loss);e={};const n=this.loss;for(const a of t){if("string"!=typeof n[a])throw new Error("Serialization of non-string loss is not supported.");e[a]=jw(n[a])}}return e}getMetricIdentifiers(){if("string"==typeof this.metrics||"function"==typeof this.metrics)return[jw(CC(this.metrics))];if(Array.isArray(this.metrics))return this.metrics.map((e=>jw(CC(e))));{const e={};for(const t in this.metrics)e[t]=jw(CC(this.metrics[t]));return e}}getTrainingConfig(){return{loss:this.getLossIdentifiers(),metrics:this.getMetricIdentifiers(),optimizer_config:{class_name:this.optimizer.getClassName(),config:this.optimizer.getConfig()}}}loadTrainingConfig(e){if(null!=e.weighted_metrics)throw new Error("Loading weight_metrics is not supported yet.");if(null!=e.loss_weights)throw new Error("Loading loss_weights is not supported yet.");if(null!=e.sample_weight_mode)throw new Error("Loading sample_weight_mode is not supported yet.");const t=nC(DC(e.optimizer_config));let n,a;if("string"==typeof e.loss)n=Vw(e.loss);else if(Array.isArray(e.loss))n=e.loss.map((e=>Vw(e)));else if(null!=e.loss){n={};for(const t in e.loss)n[t]=Vw(e.loss[t])}if(Array.isArray(e.metrics))a=e.metrics.map((e=>Vw(e)));else if(null!=e.metrics){a={};for(const t in e.metrics)a[t]=Vw(e.metrics[t])}this.compile({loss:n,metrics:a,optimizer:t})}async save(e,t){if("string"==typeof e){const t=Lh(e);if(0===t.length)throw new Rw(`Cannot find any save handlers for URL '${e}'`);if(t.length>1)throw new Rw(`Found more than one (${t.length}) save handlers for URL '${e}'`);e=t[0]}if(null==e.save)throw new Rw("LayersModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");const n=await bh(this.getNamedWeights(t)),a={modelTopology:this.toJSON(null,!1),format:"layers-model",generatedBy:`TensorFlow.js tfjs-layers v${OC}`,convertedBy:null};if(null!=t&&t.includeOptimizer&&null!=this.optimizer){a.trainingConfig=this.getTrainingConfig();const e="optimizer",{data:t,specs:i}=await bh(await this.optimizer.getWeights(),e);n.specs.push(...i),n.data=Th([n.data,t])}if(null!=this.userDefinedMetadata){const e=!0;SC(this.userDefinedMetadata,this.name,e),a.userDefinedMetadata=this.userDefinedMetadata}return a.weightData=n.data,a.weightSpecs=n.specs,e.save(a)}setUserDefinedMetadata(e){SC(e,this.name),this.userDefinedMetadata=e}getUserDefinedMetadata(){return this.userDefinedMetadata}}eS.className="Model",Bd(eS);class tS extends eS{}tS.className="Functional",Bd(tS);class nS extends eS{constructor(e){if(super({inputs:[],outputs:[]}),e=e||{},this.trainable=!0,this.built=!1,this.name=null!=e.name?e.name:aA("sequential_"),null!=e.layers)for(const t of e.layers)this.add(t)}checkShape(e){if(e.inboundNodes[0].outputTensors[0].shape.some((e=>e<0)))throw new Rw(`Negative dimension size caused by adding layer ${e.name} with input shape [${e.inboundNodes[0].inputTensors[0].shape}]`)}add(e){const t=e instanceof nS||e instanceof eS;let n;if(t){if(n=e,1!==n.outputs.length)throw new Rw("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");if(1!==n.inputs.length)throw new Rw("All layers in a Sequential model should have a single input tensor. For multi-input layers, use the functional API.")}if(0===this.outputs.length){if(0===e.inboundNodes.length){if(null==e.batchInputShape)throw new Rw("The first layer in a Sequential model must get an `inputShape` or `batchInputShape` argument.");const t=function(e){if(null==e.batchShape&&null==e.shape)throw new Error("Please provide to Input either a `shape` or a `batchShape` argument. Note that `shape` does not include the batch dimension.");if(null!=e.batchShape&&null!=e.shape)throw new Rw("Please provide either a `shape` or `batchShape` argument to Input, but not both.");let t=e.batchShape;null!=e.shape&&null==t&&(t=[null].concat(e.shape));let n=e.dtype;return null==n&&(n="float32"),new Ex({batchInputShape:t,name:e.name,dtype:n,sparse:e.sparse}).inboundNodes[0].outputTensors[0]}({batchShape:e.batchInputShape,dtype:e.dtype,name:e.name+"_input"});e.apply(t)}if(t)this.outputs=n.outputs,this.inputs=n.inputs;else{if(1!==e.inboundNodes.length)throw new Rw(`A layer added to a Sequential model must not already be connected somewhere else. LayersModel received layer ${e.name} which has ${e.inboundNodes.length} pre-existing inbound connections.`);if(1!==e.inboundNodes[0].outputTensors.length)throw new Rw("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");this.checkShape(e),this.outputs=[e.inboundNodes[0].outputTensors[0]],this.inputs=Sx(this.outputs[0])}this.inboundNodes=[],new Ax({outboundLayer:this,inboundLayers:[],nodeIndices:[],tensorIndices:[],inputTensors:this.inputs,outputTensors:this.outputs,inputMasks:Mw(null,this.inputs.length),outputMasks:[null],inputShapes:this.inputs.map((e=>e.shape)),outputShapes:this.outputs[0].shape})}else{const t=e.apply(this.outputs[0]);if(Array.isArray(t))throw new TypeError("All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.");this.checkShape(e),this.outputs=[t],this.inboundNodes[0].outputTensors=this.outputs,this.inboundNodes[0].outputShapes=[this.outputs[0].shape]}this.layers.push(e),this.built=!1}pop(){if(0===this.layers.length)throw new TypeError("There are no layers in the model.");if(this.layers.pop(),0===this.layers.length)this.outputs=[],this.inboundNodes=[],this.outboundNodes=[];else{const e=this.layers.length-1;this.layers[e].outboundNodes=[],this.outputs=[this.layers[e].output],this.inboundNodes[0].outputTensors=this.outputs,this.inboundNodes[0].outputShapes=[this.outputs[0].shape]}}call(e,t){return null==this.model&&this.build(),this.model.call(e,t)}build(e){if(px(e),0===this.inputs.length||0===this.outputs.length)throw new TypeError("Sequential model cannot be built: model is empty. Add some layers first.");this.model=new eS({inputs:this.inputs,outputs:this.outputs[0],name:this.name+"_model"}),this.model.trainable=this.trainable,this.supportsMasking=this.model.supportsMasking,this.inputLayers=this.model.inputLayers,this.inputLayersNodeIndices=this.model.inputLayersNodeIndices,this.inputLayersTensorIndices=this.model.inputLayersTensorIndices,this.outputLayers=this.model.outputLayers,this.outputLayersNodeIndices=this.model.outputLayersNodeIndices,this.outputLayersTensorIndices=this.model.outputLayersTensorIndices,this.nodesByDepth=this.model.nodesByDepth,this.containerNodes=this.model.containerNodes,this.outputNames=this.model.outputNames,this.inputNames=this.model.inputNames,this.built=!0}countParams(){return this.built||this.build(),super.countParams()}summary(e,t,n=console.log){this.built||this.build(),super.summary(e,t,n)}setWeights(e){null==this.model&&this.build(),this.model.setWeights(e)}evaluate(e,t,n={}){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.evaluate(e,t,n)}async evaluateDataset(e,t){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.evaluateDataset(e,t)}predict(e,t={}){return null==this.model&&this.build(),this.model.predict(e,t)}predictOnBatch(e){return null==this.model&&this.build(),this.model.predictOnBatch(e)}compile(e){this.build(),this.model.compile(e),this.optimizer_=this.model.optimizer,this.isOptimizerOwned=this.model.isOptimizerOwned,this.loss=this.model.loss,this.metrics=this.model.metrics,this.metricsTensors=this.model.metricsTensors,this.metricsNames=this.model.metricsNames}get optimizer(){return null==this.model?void 0:this.model.optimizer}set optimizer(e){this.model.optimizer=e}async fit(e,t,n={}){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.fit(e,t,n)}async fitDataset(e,t){if(!this.built)throw new Nw("The model needs to be compiled before being used.");return this.model.fitDataset(e,t)}async trainOnBatch(e,t){return this.model.trainOnBatch(e,t)}static fromConfig(e,t,n={},a=!1){let i,s={};if(t instanceof Array){if(null==t[0].className||"Merge"===t[0].className)throw new Rw("Legacy serialization format not supported yet.");i=t}else Ns(null!=t.layers,(()=>"When the config data for a Sequential model is not an Array, it must be an Object that contains the 'layers' field.")),i=t.layers,delete t.layers,s=t;const r=new e(s);if(!(r instanceof nS))throw new Dw(`Sequential.fromConfig called on non-Sequential input: ${r}`);for(const e of i){const t=nC(e,void 0,a);a&&t.setFastWeightInitDuringBuild(!0),r.add(t)}return r}set stopTraining(e){if(null==this.model)throw new Rw("Cannot set the stopTraining property of a sequential model before it is compiled.");this.model.stopTraining=e}get stopTraining(){if(null==this.model)throw new Rw("Cannot get the stopTraining property of a sequential model before it is compiled.");return this.model.stopTraining}getConfig(){const e=[];for(const t of this.layers){const n={};n.className=t.getClassName(),n.config=t.getConfig(),e.push(n)}return{name:this.name,layers:e}}}nS.className="Sequential",Bd(nS);class aS extends Od{getConfig(){return{}}}class iS extends aS{apply(e,t=1){return function(e,t=1){if(1!==t)throw new Dw(`Support for alpha values other than 1 (${t}) is not implemented yet.`);return hf(e)}(e,t)}}iS.className="elu",Bd(iS);class sS extends aS{apply(e){return ay(e)}}sS.className="selu",Bd(sS);class rS extends aS{apply(e){return $g(e)}}rS.className="relu",Bd(rS);class oS extends aS{apply(e){return dh((()=>pg(6,$g(e))))}}oS.className="relu6",Bd(oS);class lS extends aS{apply(e){return e}}lS.className="linear",Bd(lS);class uS extends aS{apply(e){return Cm(e)}}uS.className="sigmoid",Bd(uS);class cS extends aS{apply(e){return function(e){return dh((()=>{const t=xd(.5,Ed(.2,e));return Lm(t,0,1)}))}(e)}}cS.className="hardSigmoid",Bd(cS);class hS extends aS{apply(e){return Zf(e)}}hS.className="softplus",Bd(hS);class dS extends aS{apply(e){return function(e){return dh((()=>Sd(e,xd(Gd(e),1))))}(e)}}dS.className="softsign",Bd(dS);class pS extends aS{apply(e){return Em(e)}}pS.className="tanh",Bd(pS);class mS extends aS{apply(e,t=-1){return py(e,t)}}mS.className="softmax",Bd(mS);class fS extends aS{apply(e,t=-1){return Yf(e,t)}}fS.className="logSoftmax",Bd(fS);class gS extends aS{apply(e){return dh((()=>dh((()=>{const t=Math.sqrt(2),n=Ed(.5,xd(1,pf(Sd(e,t))));return Ed(e,n)}))))}}gS.className="gelu",Bd(gS);class yS extends aS{apply(e){return dh((()=>Ed(.5,Ed(e,xd(1,Em(Ed(_d(Sd(2,Math.PI)),xd(e,Ed(.044715,Vd(e,3))))))))))}}yS.className="gelu_new",Bd(yS);class bS extends aS{apply(e){return dh((()=>Ed(e,Em(Zf(e)))))}}bS.className="mish",Bd(bS);class vS extends aS{apply(e,t=1){return dh((()=>Ed(Cm(Ed(e,t)),e)))}}function kS(e){return e.getClassName()}function wS(e,t={}){return qw(e,Md.getMap().classNameMap,t,"activation")}function AS(e){if(null==e){const e={className:"linear",config:{}};return wS(e)}if("string"==typeof e){const t={};return t.className=e,t.config={},wS(t)}return e instanceof aS?e:wS(e)}function xS(e){if(null!=e&&"object"!=typeof e)throw new Error(`Argument to L1L2 regularizer's constructor is expected to be an object, but received: ${e}`)}vS.className="swish",Bd(vS);class CS extends Od{}class SS extends CS{constructor(e){super(),xS(e),this.l1=null==e||null==e.l1?.01:e.l1,this.l2=null==e||null==e.l2?.01:e.l2,this.hasL1=0!==this.l1,this.hasL2=0!==this.l2}apply(e){return dh((()=>{let t=cg([1]);return this.hasL1&&(t=xd(t,Cf(Ed(this.l1,Gd(e))))),this.hasL2&&(t=xd(t,Cf(Ed(this.l2,FA(e))))),vm(t,[])}))}getConfig(){return{l1:this.l1,l2:this.l2}}static fromConfig(e,t){return new e({l1:t.l1,l2:t.l2})}}SS.className="L1L2",Bd(SS);const ES={l1l2:"L1L2"};function _S(e){return Ww(e)}function TS(e,t={}){return qw(e,Md.getMap().classNameMap,t,"regularizer")}function IS(e){if(null==e)return null;if("string"==typeof e){return TS({className:e in ES?ES[e]:e,config:{}})}return e instanceof CS?e:TS(e)}class NS extends Cx{constructor(e){super(null==e?{}:e),this.supportsMasking=!0,null!=e&&(this.maxValue=e.maxValue)}call(e,t){e=dx(e);let n=$g(e);return null!=this.maxValue&&(n=Lm(n,0,this.maxValue)),n}computeOutputShape(e){return e}getConfig(){const e={maxValue:this.maxValue},t=super.getConfig();return Object.assign(e,t),e}}NS.className="ReLU",Bd(NS);class RS extends Cx{constructor(e){super(null==e?{}:e),this.DEFAULT_ALPHA=.3,null==e&&(e={}),this.alpha=null==e.alpha?this.DEFAULT_ALPHA:e.alpha}call(e,t){const n=dx(e);return Vf(n,this.alpha)}computeOutputShape(e){return e}getConfig(){const e={alpha:this.alpha},t=super.getConfig();return Object.assign(e,t),e}}RS.className="LeakyReLU",Bd(RS);class DS extends Cx{constructor(e){if(super(null==e?{}:e),this.DEFAULT_ALPHA_INITIALIZER="zeros",null==e&&(e={}),this.supportsMasking=!0,this.alphaInitializer=ux(e.alphaInitializer||this.DEFAULT_ALPHA_INITIALIZER),this.alphaRegularizer=IS(e.alphaRegularizer),this.alphaConstraint=Wx(e.alphaConstraint),null==e.sharedAxes)this.sharedAxes=null;else if(Array.isArray(e.sharedAxes))this.sharedAxes=e.sharedAxes;else{if("number"!=typeof e.sharedAxes)throw new Rw(`Expected sharedAxes to be a number or an array of numbers, but got ${e.sharedAxes}`);this.sharedAxes=[e.sharedAxes]}}build(e){const t=(e=px(e)).slice(1);if(null!=this.sharedAxes)for(const e of this.sharedAxes)t[e-1]=1;this.alpha=this.addWeight("alpha",t,"float32",this.alphaInitializer,this.alphaRegularizer,!0,this.alphaConstraint);const n={};if(null!=this.sharedAxes)for(let t=1;t{let n=dx(e);const a=t.mask;if(null!=a){const e=Ed(Ud(hg(n.shape),kd(a,n.dtype)),Rd(-1e9));n=xd(n,e)}return this.axis instanceof Array?this.axis.length>1?Tf(Ud(n,Qf(n,this.axis,!0))):this.softmax(n,this.axis[0]):this.softmax(n,this.axis)}))}computeOutputShape(e){return e}getConfig(){const e={axis:this.axis},t=super.getConfig();return Object.assign(e,t),e}}function BS(e,t,n){if("number"==typeof e)return Mw(e,t);if(e.length!==t)throw new Rw(`The ${n} argument must be an integer or tuple of ${t} integers. Received: ${e.length} elements.`);for(let i=0;i(cA(t),"channelsFirst"===t?Gy(e,[0,2,3,1]):e)))}function jS(e,t){return dh((()=>(cA(t),"channelsFirst"===t?Gy(e,[0,2,3,4,1]):e)))}function VS(e,t,n,a=1,i="valid",s,r=1){return dh((()=>{if(null==s&&(s="channelsLast"),cA(s),3!==e.shape.length)throw new Rw(`The input of a conv1dWithBias operation should be 3, but is ${e.shape.length} instead.`);if(3!==t.shape.length)throw new Rw(`The kernel for a conv1dWithBias operation should be 3, but is ${t.shape.length} instead`);if(null!=n&&1!==n.shape.length)throw new Rw(`The bias for a conv1dWithBias operation should be 1, but is ${n.shape.length} instead`);if("channelsFirst"===s&&(e=Gy(e,[0,2,1])),"causal"===i)throw new Dw("The support for CAUSAL padding mode in conv1dWithBias is not implemented yet.");let o=Gm(e,t,a,"same"===i?"same":"valid","NWC",r);return null!=n&&(o=PA(o,n)),o}))}function US(e,t,n,a=[1,1],i="valid",s,r,o=null){return dh((()=>{if(null==s&&(s="channelsLast"),cA(s),3!==e.rank&&4!==e.rank)throw new Rw(`conv2dWithBiasActivation expects input to be of rank 3 or 4, but received ${e.rank}.`);if(3!==t.rank&&4!==t.rank)throw new Rw(`conv2dWithBiasActivation expects kernel to be of rank 3 or 4, but received ${e.rank}.`);let l=PS(e,s);if("causal"===i)throw new Dw("The support for CAUSAL padding mode in conv1dWithBias is not implemented yet.");return l=ib({x:l,filter:t,strides:a,pad:"same"===i?"same":"valid",dilations:r,dataFormat:"NHWC",bias:n,activation:o}),"channelsFirst"===s&&(l=Gy(l,[0,3,1,2])),l}))}function WS(e,t,n,a=[1,1,1],i="valid",s,r){return dh((()=>{if(null==s&&(s="channelsLast"),cA(s),4!==e.rank&&5!==e.rank)throw new Rw(`conv3dWithBias expects input to be of rank 4 or 5, but received ${e.rank}.`);if(4!==t.rank&&5!==t.rank)throw new Rw(`conv3dWithBias expects kernel to be of rank 4 or 5, but received ${e.rank}.`);let o=jS(e,s);if("causal"===i)throw new Dw("The support for CAUSAL padding mode in conv3dWithBias is not implemented yet.");return o=Km(o,t,a,"same"===i?"same":"valid","NDHWC",r),null!=n&&(o=PA(o,n)),"channelsFirst"===s&&(o=Gy(o,[0,4,1,2,3])),o}))}MS.className="Softmax",Bd(MS);class GS extends Cx{constructor(e,t){if(super(t),this.bias=null,this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_BIAS_INITIALIZER="zeros",GS.verifyArgs(t),this.rank=e,Yw(this.rank,"rank"),1!==this.rank&&2!==this.rank&&3!==this.rank)throw new Dw(`Convolution layer for rank other than 1, 2, or 3 (${this.rank}) is not implemented yet.`);if(this.kernelSize=BS(t.kernelSize,e,"kernelSize"),this.strides=BS(null==t.strides?1:t.strides,e,"strides"),this.padding=null==t.padding?"valid":t.padding,hA(this.padding),this.dataFormat=null==t.dataFormat?"channelsLast":t.dataFormat,cA(this.dataFormat),this.activation=AS(t.activation),this.useBias=null==t.useBias||t.useBias,this.biasInitializer=ux(t.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.biasConstraint=Wx(t.biasConstraint),this.biasRegularizer=IS(t.biasRegularizer),this.activityRegularizer=IS(t.activityRegularizer),this.dilationRate=BS(null==t.dilationRate?1:t.dilationRate,e,"dilationRate"),1===this.rank&&Array.isArray(this.dilationRate)&&1!==this.dilationRate.length)throw new Rw(`dilationRate must be a number or an array of a single number for 1D convolution, but received ${JSON.stringify(this.dilationRate)}`);if(2===this.rank){if("number"==typeof this.dilationRate)this.dilationRate=[this.dilationRate,this.dilationRate];else if(2!==this.dilationRate.length)throw new Rw(`dilationRate must be a number or array of two numbers for 2D convolution, but received ${JSON.stringify(this.dilationRate)}`)}else if(3===this.rank)if("number"==typeof this.dilationRate)this.dilationRate=[this.dilationRate,this.dilationRate,this.dilationRate];else if(3!==this.dilationRate.length)throw new Rw(`dilationRate must be a number or array of three numbers for 3D convolution, but received ${JSON.stringify(this.dilationRate)}`)}static verifyArgs(e){if(Bw("kernelSize"in e,"required key 'kernelSize' not in config"),"number"!=typeof e.kernelSize&&!Xw(e.kernelSize,"number",1,3))throw new Rw(`BaseConv expects config.kernelSize to be number or number[] with length 1, 2, or 3, but received ${JSON.stringify(e.kernelSize)}.`)}getConfig(){const e={kernelSize:this.kernelSize,strides:this.strides,padding:this.padding,dataFormat:this.dataFormat,dilationRate:this.dilationRate,activation:kS(this.activation),useBias:this.useBias,biasInitializer:lx(this.biasInitializer),biasRegularizer:_S(this.biasRegularizer),activityRegularizer:_S(this.activityRegularizer),biasConstraint:Vx(this.biasConstraint)},t=super.getConfig();return Object.assign(e,t),e}}class qS extends GS{constructor(e,t){super(e,t),this.kernel=null,qS.verifyArgs(t),this.filters=t.filters,Yw(this.filters,"filters"),this.kernelInitializer=ux(t.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.kernelConstraint=Wx(t.kernelConstraint),this.kernelRegularizer=IS(t.kernelRegularizer)}build(e){e=px(e);const t="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[t])throw new Rw(`The channel dimension of the input should be defined. Found ${e[t]}`);const n=e[t],a=this.kernelSize.concat([n,this.filters]);this.kernel=this.addWeight("kernel",a,null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[{ndim:this.rank+2,axes:{[t]:n}}],this.built=!0}call(e,t){return dh((()=>{let t;e=dx(e);const n=null==this.bias?null:this.bias.read(),a=Jw(this.activation.getClassName());if(null!=a&&2===this.rank)t=US(e,this.kernel.read(),n,this.strides,this.padding,this.dataFormat,this.dilationRate,a);else{if(1===this.rank)t=VS(e,this.kernel.read(),n,this.strides[0],this.padding,this.dataFormat,this.dilationRate[0]);else if(2===this.rank)t=US(e,this.kernel.read(),n,this.strides,this.padding,this.dataFormat,this.dilationRate);else{if(3!==this.rank)throw new Dw("convolutions greater than 3D are not implemented yet.");t=WS(e,this.kernel.read(),n,this.strides,this.padding,this.dataFormat,this.dilationRate)}null!=this.activation&&(t=this.activation.apply(t))}return t}))}computeOutputShape(e){e=px(e);const t=[],n="channelsLast"===this.dataFormat?e.slice(1,e.length-1):e.slice(2);for(let e=0;e 0 but got ${JSON.stringify(e.filters)}`)}}class HS extends qS{constructor(e){super(2,e),HS.verifyArgs(e)}getConfig(){const e=super.getConfig();return delete e.rank,e}static verifyArgs(e){if("number"!=typeof e.kernelSize&&!Xw(e.kernelSize,"number",1,2))throw new Rw(`Conv2D expects config.kernelSize to be number or number[] with length 1 or 2, but received ${JSON.stringify(e.kernelSize)}.`)}}HS.className="Conv2D",Bd(HS);class KS extends qS{constructor(e){super(3,e),KS.verifyArgs(e)}getConfig(){const e=super.getConfig();return delete e.rank,e}static verifyArgs(e){if("number"!=typeof e.kernelSize&&(!Array.isArray(e.kernelSize)||1!==e.kernelSize.length&&3!==e.kernelSize.length))throw new Rw(`Conv3D expects config.kernelSize to be number or [number, number, number], but received ${JSON.stringify(e.kernelSize)}.`)}}KS.className="Conv3D",Bd(KS);class $S extends HS{constructor(e){if(super(e),this.inputSpec=[new vx({ndim:4})],"same"!==this.padding&&"valid"!==this.padding)throw new Rw(`Conv2DTranspose currently supports only padding modes 'same' and 'valid', but received padding mode ${this.padding}`)}build(e){if(4!==(e=px(e)).length)throw new Rw("Input should have rank 4; Received input shape: "+JSON.stringify(e));const t="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[t])throw new Rw("The channel dimension of the inputs should be defined. Found `None`.");const n=e[t],a=this.kernelSize.concat([this.filters,n]);this.kernel=this.addWeight("kernel",a,"float32",this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],"float32",this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[new vx({ndim:4,axes:{[t]:n}})],this.built=!0}call(e,t){return dh((()=>{let t=dx(e);if(4!==t.shape.length)throw new Rw(`Conv2DTranspose.call() expects input tensor to be rank-4, but received a tensor of rank-${t.shape.length}`);const n=t.shape,a=n[0];let i,s;"channelsFirst"===this.dataFormat?(i=2,s=3):(i=1,s=2);const r=n[i],o=n[s],l=this.kernelSize[0],u=this.kernelSize[1],c=this.strides[0],h=this.strides[1],d=[a,LS(r,c,l,this.padding),LS(o,h,u,this.padding),this.filters];"channelsLast"!==this.dataFormat&&(t=Gy(t,[0,2,3,1]));let p=Hm(t,this.kernel.read(),d,this.strides,this.padding);return"channelsLast"!==this.dataFormat&&(p=Gy(p,[0,3,1,2])),null!=this.bias&&(p=PA(p,this.bias.read(),this.dataFormat)),null!=this.activation&&(p=this.activation.apply(p)),p}))}computeOutputShape(e){const t=(e=px(e)).slice();let n,a,i;"channelsFirst"===this.dataFormat?(n=1,a=2,i=3):(n=3,a=1,i=2);const s=this.kernelSize[0],r=this.kernelSize[1],o=this.strides[0],l=this.strides[1];return t[n]=this.filters,t[a]=LS(t[a],o,s,this.padding),t[i]=LS(t[i],l,r,this.padding),t}getConfig(){const e=super.getConfig();return delete e.dilationRate,e}}$S.className="Conv2DTranspose",Bd($S);class ZS extends KS{constructor(e){if(super(e),this.inputSpec=[new vx({ndim:5})],"same"!==this.padding&&"valid"!==this.padding)throw new Rw(`Conv3DTranspose currently supports only padding modes 'same' and 'valid', but received padding mode ${this.padding}`)}build(e){if(5!==(e=px(e)).length)throw new Rw("Input should have rank 5; Received input shape: "+JSON.stringify(e));const t="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[t])throw new Rw("The channel dimension of the inputs should be defined. Found `None`.");const n=e[t],a=this.kernelSize.concat([this.filters,n]);this.kernel=this.addWeight("kernel",a,"float32",this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.filters],"float32",this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint)),this.inputSpec=[new vx({ndim:5,axes:{[t]:n}})],this.built=!0}call(e,t){return dh((()=>{let t=dx(e);if(5!==t.shape.length)throw new Rw(`Conv3DTranspose.call() expects input tensor to be rank-4, but received a tensor of rank-${t.shape.length}`);const n=t.shape,a=n[0];let i,s,r;"channelsFirst"===this.dataFormat?(r=2,i=3,s=4):(r=1,i=2,s=3);const o=n[r],l=n[i],u=n[s],c=this.kernelSize[0],h=this.kernelSize[1],d=this.kernelSize[2],p=this.strides[0],m=this.strides[1],f=this.strides[2],g=[a,LS(o,p,c,this.padding),LS(l,m,h,this.padding),LS(u,f,d,this.padding),this.filters];"channelsLast"!==this.dataFormat&&(t=Gy(t,[0,2,3,4,1]));let y=Zm(t,this.kernel.read(),g,this.strides,this.padding);return"channelsLast"!==this.dataFormat&&(y=Gy(y,[0,4,1,2,3])),null!==this.bias&&(y=PA(y,this.bias.read(),this.dataFormat)),null!==this.activation&&(y=this.activation.apply(y)),y}))}computeOutputShape(e){const t=(e=px(e)).slice();let n,a,i,s;"channelsFirst"===this.dataFormat?(n=1,a=2,i=3,s=4):(n=4,a=1,i=2,s=3);const r=this.kernelSize[0],o=this.kernelSize[1],l=this.kernelSize[2],u=this.strides[0],c=this.strides[1],h=this.strides[2];return t[n]=this.filters,t[a]=LS(t[a],u,r,this.padding),t[i]=LS(t[i],c,o,this.padding),t[s]=LS(t[s],h,l,this.padding),t}getConfig(){const e=super.getConfig();return delete e.dilationRate,e}}ZS.className="Conv3DTranspose",Bd(ZS);class XS extends qS{constructor(e,t){if(super(e,t),this.DEFAULT_DEPTHWISE_INITIALIZER="glorotUniform",this.DEFAULT_POINTWISE_INITIALIZER="glorotUniform",this.depthwiseKernel=null,this.pointwiseKernel=null,null==t.filters)throw new Rw("The `filters` configuration field is required by SeparableConv, but is unspecified.");if(null!=t.kernelInitializer||null!=t.kernelRegularizer||null!=t.kernelConstraint)throw new Rw("Fields kernelInitializer, kernelRegularizer and kernelConstraint are invalid for SeparableConv2D. Use depthwiseInitializer, depthwiseRegularizer, depthwiseConstraint, pointwiseInitializer, pointwiseRegularizer and pointwiseConstraint instead.");if(null!=t.padding&&"same"!==t.padding&&"valid"!==t.padding)throw new Rw(`SeparableConv${this.rank}D supports only padding modes: 'same' and 'valid', but received ${JSON.stringify(t.padding)}`);this.depthMultiplier=null==t.depthMultiplier?1:t.depthMultiplier,this.depthwiseInitializer=ux(t.depthwiseInitializer||this.DEFAULT_DEPTHWISE_INITIALIZER),this.depthwiseRegularizer=IS(t.depthwiseRegularizer),this.depthwiseConstraint=Wx(t.depthwiseConstraint),this.pointwiseInitializer=ux(t.depthwiseInitializer||this.DEFAULT_POINTWISE_INITIALIZER),this.pointwiseRegularizer=IS(t.pointwiseRegularizer),this.pointwiseConstraint=Wx(t.pointwiseConstraint)}build(e){if((e=px(e)).length{let t;if(e=dx(e),1===this.rank)throw new Dw("1D separable convolution is not implemented yet.");return 2===this.rank&&("channelsFirst"===this.dataFormat&&(e=Gy(e,[0,2,3,1])),t=iy(e,this.depthwiseKernel.read(),this.pointwiseKernel.read(),this.strides,this.padding,this.dilationRate,"NHWC")),this.useBias&&(t=PA(t,this.bias.read(),this.dataFormat)),null!=this.activation&&(t=this.activation.apply(t)),"channelsFirst"===this.dataFormat&&(t=Gy(t,[0,3,1,2])),t}))}getConfig(){const e=super.getConfig();return delete e.rank,delete e.kernelInitializer,delete e.kernelRegularizer,delete e.kernelConstraint,e.depthwiseInitializer=lx(this.depthwiseInitializer),e.pointwiseInitializer=lx(this.pointwiseInitializer),e.depthwiseRegularizer=_S(this.depthwiseRegularizer),e.pointwiseRegularizer=_S(this.pointwiseRegularizer),e.depthwiseConstraint=Vx(this.depthwiseConstraint),e.pointwiseConstraint=Vx(this.pointwiseConstraint),e}}XS.className="SeparableConv";class YS extends XS{constructor(e){super(2,e)}}YS.className="SeparableConv2D",Bd(YS);class QS extends qS{constructor(e){super(1,e),QS.verifyArgs(e),this.inputSpec=[{ndim:3}]}getConfig(){const e=super.getConfig();return delete e.rank,delete e.dataFormat,e}static verifyArgs(e){if("number"!=typeof e.kernelSize&&!Xw(e.kernelSize,"number",1,1))throw new Rw(`Conv1D expects config.kernelSize to be number or number[] with length 1, but received ${JSON.stringify(e.kernelSize)}.`)}}QS.className="Conv1D",Bd(QS);class JS extends Cx{constructor(e){super(e),"number"==typeof e.cropping?this.cropping=[[e.cropping,e.cropping],[e.cropping,e.cropping]]:"number"==typeof e.cropping[0]?this.cropping=[[e.cropping[0],e.cropping[0]],[e.cropping[1],e.cropping[1]]]:this.cropping=e.cropping,this.dataFormat=void 0===e.dataFormat?"channelsLast":e.dataFormat,this.inputSpec=[{ndim:4}]}computeOutputShape(e){return"channelsFirst"===this.dataFormat?[e[0],e[1],e[2]-this.cropping[0][0]-this.cropping[0][1],e[3]-this.cropping[1][0]-this.cropping[1][1]]:[e[0],e[1]-this.cropping[0][0]-this.cropping[0][1],e[2]-this.cropping[1][0]-this.cropping[1][1],e[3]]}call(e,t){return dh((()=>{if(e=dx(e),"channelsLast"===this.dataFormat){const t=NA(e,this.cropping[0][0],e.shape[1]-this.cropping[0][0]-this.cropping[0][1],2);return NA(t,this.cropping[1][0],e.shape[2]-this.cropping[1][1]-this.cropping[1][0],3)}{const t=NA(e,this.cropping[0][0],e.shape[2]-this.cropping[0][0]-this.cropping[0][1],3);return NA(t,this.cropping[1][0],e.shape[3]-this.cropping[1][1]-this.cropping[1][0],4)}}))}getConfig(){const e={cropping:this.cropping,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}JS.className="Cropping2D",Bd(JS);class eE extends Cx{constructor(e){var t;super(e),this.DEFAULT_SIZE=[2,2],this.inputSpec=[{ndim:4}],this.size=null==e.size?this.DEFAULT_SIZE:e.size,this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),this.interpolation=null==e.interpolation?"nearest":e.interpolation,t=this.interpolation,Zw(sA,"InterpolationFormat",t)}computeOutputShape(e){if("channelsFirst"===this.dataFormat){const t=null==e[2]?null:this.size[0]*e[2],n=null==e[3]?null:this.size[1]*e[3];return[e[0],e[1],t,n]}{const t=null==e[1]?null:this.size[0]*e[1],n=null==e[2]?null:this.size[1]*e[2];return[e[0],t,n,e[3]]}}call(e,t){return dh((()=>{let t=dx(e);const n=t.shape;if("channelsFirst"===this.dataFormat){t=Gy(t,[0,2,3,1]);const e=this.size[0]*n[2],a=this.size[1]*n[3],i="nearest"===this.interpolation?tv.resizeNearestNeighbor(t,[e,a]):tv.resizeBilinear(t,[e,a]);return Gy(i,[0,3,1,2])}{const e=this.size[0]*n[1],a=this.size[1]*n[2];return"nearest"===this.interpolation?tv.resizeNearestNeighbor(t,[e,a]):tv.resizeBilinear(t,[e,a])}}))}getConfig(){const e={size:this.size,dataFormat:this.dataFormat,interpolation:this.interpolation},t=super.getConfig();return Object.assign(e,t),e}}eE.className="UpSampling2D",Bd(eE);class tE extends GS{constructor(e){super(2,e),this.depthwiseKernel=null,this.depthMultiplier=null==e.depthMultiplier?1:e.depthMultiplier,this.depthwiseInitializer=ux(e.depthwiseInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.depthwiseConstraint=Wx(e.depthwiseConstraint),this.depthwiseRegularizer=IS(e.depthwiseRegularizer)}build(e){if((e=px(e)).length<4)throw new Rw(`Inputs to DepthwiseConv2D should have rank 4. Received input shape: ${JSON.stringify(e)}.`);const t="channelsFirst"===this.dataFormat?1:3;if(null==e[t]||e[t]<0)throw new Rw(`The channel dimension of the inputs to DepthwiseConv2D should be defined, but is not (${e[t]}).`);const n=e[t],a=[this.kernelSize[0],this.kernelSize[1],n,this.depthMultiplier];this.depthwiseKernel=this.addWeight("depthwise_kernel",a,null,this.depthwiseInitializer,this.depthwiseRegularizer,!0,this.depthwiseConstraint),this.useBias?this.bias=this.addWeight("bias",[n*this.depthMultiplier],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return dh((()=>{let t=function(e,t,n=[1,1],a="valid",i,s){return dh((()=>{null==i&&(i="channelsLast"),cA(i);let r=PS(e,i);if(4!==e.rank)throw new Rw(`Input for depthwiseConv2d is required to be 4-D, but is instead ${e.rank}-D`);if(4!==t.rank)throw new Rw(`depthwiseKernel is required to be 4-D, but is instead ${t.rank}-D`);return r=nf(r,t,n,"same"===a?"same":"valid","NHWC",s),"channelsFirst"===i&&(r=Gy(r,[0,3,1,2])),r}))}(e=dx(e),this.depthwiseKernel.read(),this.strides,this.padding,this.dataFormat,null);return this.useBias&&(t=PA(t,this.bias.read(),this.dataFormat)),null!=this.activation&&(t=this.activation.apply(t)),t}))}computeOutputShape(e){e=px(e);const t="channelsFirst"===this.dataFormat?e[2]:e[1],n="channelsFirst"===this.dataFormat?e[3]:e[2],a="channelsFirst"===this.dataFormat?e[1]*this.depthMultiplier:e[3]*this.depthMultiplier,i=FS(t,this.kernelSize[0],this.padding,this.strides[0]),s=FS(n,this.kernelSize[1],this.padding,this.strides[1]);return"channelsFirst"===this.dataFormat?[e[0],a,i,s]:[e[0],i,s,a]}getConfig(){const e=super.getConfig();return e.depthMultiplier=this.depthMultiplier,e.depthwiseInitializer=lx(this.depthwiseInitializer),e.depthwiseRegularizer=_S(this.depthwiseRegularizer),e.depthwiseConstraint=Vx(this.depthwiseRegularizer),e}}function nE(e,t,n,a){if(Array.isArray(e)){if(null!=t||null!=n)throw new Rw("When inputs is an array, neither initialState or constants should be provided");null!=a&&(n=e.slice(e.length-a,e.length),e=e.slice(0,e.length-a)),e.length>1&&(t=e.slice(1,e.length)),e=e[0]}function i(e){return null==e||Array.isArray(e)?e:[e]}return{inputs:e,initialState:t=i(t),constants:n=i(n)}}function aE(e,t,n,a=!1,i,s,r=!1,o=!1){return dh((()=>{const r=t.shape.length;if(r<3)throw new Rw(`Input should be at least 3D, but is ${r}D.`);const l=[1,0].concat(xA(2,r));if(t=Gy(t,l),null!=s)throw new Dw("The rnn() functoin of the deeplearn.js backend does not support constants yet.");null!=i&&((i=kd(kd(i,"bool"),"float32")).rank===r-1&&(i=If(i,-1)),i=Gy(i,l)),a&&(t=Xg(t,0),null!=i&&(i=Xg(i,0)));const u=[];let c,h=n;const d=t.shape[0],p=Ly(t);let m,f;null!=i&&(m=Ly(i));for(let t=0;te(n,h)));if(null==i)c=a[0],h=a[1];else{const e=dh((()=>{const e=m[t],n=Ud(wg(e),e);return{output:xd(Ed(a[0],e),Ed(h[0],n)),newStates:h.map(((t,i)=>xd(Ed(a[1][i],e),Ed(t,n))))}}));c=e.output,h=e.newStates}o&&u.push(c)}if(o){f=wy(u,1)}return[c,f,h]}))}tE.className="DepthwiseConv2D",Bd(tE);class iE extends Cx{constructor(e){let t;if(super(e),null==e.cell)throw new Rw("cell property is missing for the constructor of RNN.");if(t=Array.isArray(e.cell)?new dE({cells:e.cell}):e.cell,null==t.stateSize)throw new Rw("The RNN cell should have an attribute `stateSize` (tuple of integers, one integer per RNN state).");this.cell=t,this.returnSequences=null!=e.returnSequences&&e.returnSequences,this.returnState=null!=e.returnState&&e.returnState,this.goBackwards=null!=e.goBackwards&&e.goBackwards,this._stateful=null!=e.stateful&&e.stateful,this.unroll=null!=e.unroll&&e.unroll,this.supportsMasking=!0,this.inputSpec=[new vx({ndim:3})],this.stateSpec=null,this.states_=null,this.numConstants=null,this.keptStates=[]}getStates(){if(null==this.states_){return xA(0,Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1).map((e=>null))}return this.states_}setStates(e){this.states_=e}computeOutputShape(e){cx(e)&&(e=e[0]);let t=this.cell.stateSize;Array.isArray(t)||(t=[t]);const n=t[0];let a;if(a=this.returnSequences?[e[0],e[1],n]:[e[0],n],this.returnState){const n=[];for(const a of t)n.push([e[0],a]);return[a].concat(n)}return a}computeMask(e,t){return dh((()=>{Array.isArray(t)&&(t=t[0]);const e=this.returnSequences?t:null;if(this.returnState){const t=this.states.map((e=>null));return[e].concat(t)}return e}))}get states(){if(null==this.states_){const e=Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1,t=[];for(let n=0;ne.shape[e.shape.length-1])),i))throw new Rw(`An initialState was passed that is not compatible with cell.stateSize. Received stateSpec=${this.stateSpec}; However cell.stateSize is ${this.cell.stateSize}`)}else this.stateSpec=i.map((e=>new vx({shape:[null,e]})));this.stateful&&this.resetStates()}resetStates(e,t=!1){dh((()=>{if(!this.stateful)throw new Iw("Cannot call resetStates() on an RNN Layer that is not stateful.");const n=this.inputSpec[0].shape[0];if(null==n)throw new Rw("If an RNN is stateful, it needs to know its batch size. Specify the batch size of your input tensors: \n- If using a Sequential model, specify the batch size by passing a `batchInputShape` option to your first layer.\n- If using the functional API, specify the batch size by passing a `batchShape` option to your Input layer.");if(null==this.states_)Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((e=>cg([n,e]))):this.states_=[cg([n,this.cell.stateSize])];else if(null==e)ph(this.states_),null!=this.keptStates&&(ph(this.keptStates),this.keptStates=[]),Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((e=>cg([n,e]))):this.states_[0]=cg([n,this.cell.stateSize]);else{if(Array.isArray(e)||(e=[e]),e.length!==this.states_.length)throw new Rw(`Layer ${this.name} expects ${this.states_.length} state(s), but it received ${e.length} state value(s). Input received: ${e}`);!0===t?this.keptStates.push(this.states_.slice()):ph(this.states_);for(let t=0;tmh(e.clone())))}))}apply(e,t){let n=null==t?null:t.initialState,a=null==t?null:t.constants;null==t&&(t={});const i=nE(e,n,a,this.numConstants);e=i.inputs,n=i.initialState,a=i.constants;let s=[],r=[];if(null!=n){t.initialState=n,s=s.concat(n),this.stateSpec=[];for(const e of n)this.stateSpec.push(new vx({shape:e.shape}));r=r.concat(this.stateSpec)}null!=a&&(t.constants=a,s=s.concat(a),this.numConstants=a.length);if(s[0]instanceof kx){const n=[e].concat(s),a=this.inputSpec.concat(r),i=this.inputSpec;this.inputSpec=a;const o=super.apply(n,t);return this.inputSpec=i,o}return super.apply(e,t)}call(e,t){return dh((()=>{const n=null==t?null:t.mask,a=null==t?null:t.training;let i=null==t?null:t.initialState;e=dx(e),null==i&&(i=this.stateful?this.states_:this.getInitialState(e));const s=Array.isArray(this.cell.stateSize)?this.cell.stateSize.length:1;if(i.length!==s)throw new Rw(`RNN Layer has ${s} state(s) but was passed ${i.length} initial state(s).`);this.unroll;const r={training:a},o=aE(((e,t)=>{const n=this.cell.call([e].concat(t),r);return[n[0],n.slice(1)]}),e,i,this.goBackwards,n,null,this.unroll,this.returnSequences),l=o[0],u=o[1],c=o[2];this.stateful&&this.resetStates(c,a);const h=this.returnSequences?u:l;return this.returnState?[h].concat(c):h}))}getInitialState(e){return dh((()=>{let t=cg(e.shape);return t=Cf(t,[1,2]),t=_A(t),Array.isArray(this.cell.stateSize)?this.cell.stateSize.map((e=>e>1?zA(t,[1,e]):t)):this.cell.stateSize>1?[zA(t,[1,this.cell.stateSize])]:[t]}))}get trainableWeights(){return this.trainable?this.cell.trainableWeights:[]}get nonTrainableWeights(){return this.trainable?this.cell.nonTrainableWeights:this.cell.weights}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),null!=this.cell&&this.cell.setFastWeightInitDuringBuild(e)}getConfig(){const e=super.getConfig(),t={returnSequences:this.returnSequences,returnState:this.returnState,goBackwards:this.goBackwards,stateful:this.stateful,unroll:this.unroll};null!=this.numConstants&&(t.numConstants=this.numConstants);const n=this.cell.getConfig();return this.getClassName()===iE.className&&(t.cell={className:this.cell.getClassName(),config:n}),Object.assign(Object.assign(Object.assign({},n),e),t)}static fromConfig(e,t,n={}){const a=nC(t.cell,n);return new e(Object.assign(t,{cell:a}))}}iE.className="RNN",Bd(iE);class sE extends Cx{}class rE extends sE{constructor(e){super(e),this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",this.units=e.units,Yw(this.units,"units"),this.activation=AS(null==e.activation?this.DEFAULT_ACTIVATION:e.activation),this.useBias=null==e.useBias||e.useBias,this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=ux(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelRegularizer=IS(e.kernelRegularizer),this.recurrentRegularizer=IS(e.recurrentRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.kernelConstraint=Wx(e.kernelConstraint),this.recurrentConstraint=Wx(e.recurrentConstraint),this.biasConstraint=Wx(e.biasConstraint),this.dropout=wA([1,AA([0,null==e.dropout?0:e.dropout])]),this.recurrentDropout=wA([1,AA([0,null==e.recurrentDropout?0:e.recurrentDropout])]),this.dropoutFunc=e.dropoutFunc,this.stateSize=this.units,this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){e=px(e),this.kernel=this.addWeight("kernel",[e[e.length-1],this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias?this.bias=this.addWeight("bias",[this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return dh((()=>{if(2!==e.length)throw new Rw(`SimpleRNNCell expects 2 input Tensors, got ${e.length}.`);let n=e[1];e=e[0];const a=null!=t.training&&t.training;let i;0wg(e),rate:this.dropout,training:a,dropoutFunc:this.dropoutFunc})),0wg(n),rate:this.recurrentDropout,training:a,dropoutFunc:this.dropoutFunc}));const s=this.dropoutMask,r=this.recurrentDropoutMask;i=MA(null!=s?Ed(e,s):e,this.kernel.read()),null!=this.bias&&(i=PA(i,this.bias.read())),null!=r&&(n=Ed(n,r));let o=xd(i,MA(n,this.recurrentKernel.read()));return null!=this.activation&&(o=this.activation.apply(o)),[o,o]}))}getConfig(){const e=super.getConfig(),t={units:this.units,activation:kS(this.activation),useBias:this.useBias,kernelInitializer:lx(this.kernelInitializer),recurrentInitializer:lx(this.recurrentInitializer),biasInitializer:lx(this.biasInitializer),kernelRegularizer:_S(this.kernelRegularizer),recurrentRegularizer:_S(this.recurrentRegularizer),biasRegularizer:_S(this.biasRegularizer),activityRegularizer:_S(this.activityRegularizer),kernelConstraint:Vx(this.kernelConstraint),recurrentConstraint:Vx(this.recurrentConstraint),biasConstraint:Vx(this.biasConstraint),dropout:this.dropout,recurrentDropout:this.recurrentDropout};return Object.assign(Object.assign({},e),t)}}rE.className="SimpleRNNCell",Bd(rE);class oE extends iE{constructor(e){e.cell=new rE(e),super(e)}call(e,t){return dh((()=>{null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}static fromConfig(e,t){return new e(t)}}oE.className="SimpleRNN",Bd(oE);class lE extends sE{constructor(e){if(super(e),this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_RECURRENT_ACTIVATION="hardSigmoid",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",e.resetAfter)throw new Rw("GRUCell does not support reset_after parameter set to true.");this.units=e.units,Yw(this.units,"units"),this.activation=AS(void 0===e.activation?this.DEFAULT_ACTIVATION:e.activation),this.recurrentActivation=AS(void 0===e.recurrentActivation?this.DEFAULT_RECURRENT_ACTIVATION:e.recurrentActivation),this.useBias=null==e.useBias||e.useBias,this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=ux(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelRegularizer=IS(e.kernelRegularizer),this.recurrentRegularizer=IS(e.recurrentRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.kernelConstraint=Wx(e.kernelConstraint),this.recurrentConstraint=Wx(e.recurrentConstraint),this.biasConstraint=Wx(e.biasConstraint),this.dropout=wA([1,AA([0,null==e.dropout?0:e.dropout])]),this.recurrentDropout=wA([1,AA([0,null==e.recurrentDropout?0:e.recurrentDropout])]),this.dropoutFunc=e.dropoutFunc,this.implementation=e.implementation,this.stateSize=this.units,this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){const t=(e=px(e))[e.length-1];this.kernel=this.addWeight("kernel",[t,3*this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,3*this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias?this.bias=this.addWeight("bias",[3*this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint):this.bias=null,this.built=!0}call(e,t){return dh((()=>{if(2!==e.length)throw new Rw(`GRUCell expects 2 input Tensors (inputs, h, c), got ${e.length}.`);const n=null!=t.training&&t.training;let a=e[1];e=e[0],0wg(e),rate:this.dropout,training:n,count:3,dropoutFunc:this.dropoutFunc})),0wg(a),rate:this.recurrentDropout,training:n,count:3,dropoutFunc:this.dropoutFunc}));const i=this.dropoutMask,s=this.recurrentDropoutMask;let r,o,l;0{null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}static fromConfig(e,t){return 0===t.implmentation&&(t.implementation=1),new e(t)}}uE.className="GRU",Bd(uE);class cE extends sE{constructor(e){super(e),this.DEFAULT_ACTIVATION="tanh",this.DEFAULT_RECURRENT_ACTIVATION="hardSigmoid",this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_RECURRENT_INITIALIZER="orthogonal",this.DEFAULT_BIAS_INITIALIZER="zeros",this.units=e.units,Yw(this.units,"units"),this.activation=AS(void 0===e.activation?this.DEFAULT_ACTIVATION:e.activation),this.recurrentActivation=AS(void 0===e.recurrentActivation?this.DEFAULT_RECURRENT_ACTIVATION:e.recurrentActivation),this.useBias=null==e.useBias||e.useBias,this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.recurrentInitializer=ux(e.recurrentInitializer||this.DEFAULT_RECURRENT_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.unitForgetBias=e.unitForgetBias,this.kernelRegularizer=IS(e.kernelRegularizer),this.recurrentRegularizer=IS(e.recurrentRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.kernelConstraint=Wx(e.kernelConstraint),this.recurrentConstraint=Wx(e.recurrentConstraint),this.biasConstraint=Wx(e.biasConstraint),this.dropout=wA([1,AA([0,null==e.dropout?0:e.dropout])]),this.recurrentDropout=wA([1,AA([0,null==e.recurrentDropout?0:e.recurrentDropout])]),this.dropoutFunc=e.dropoutFunc,this.implementation=e.implementation,this.stateSize=[this.units,this.units],this.dropoutMask=null,this.recurrentDropoutMask=null}build(e){var t;const n=(e=px(e))[e.length-1];let a;if(this.kernel=this.addWeight("kernel",[n,4*this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.recurrentKernel=this.addWeight("recurrent_kernel",[this.units,4*this.units],null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias){if(this.unitForgetBias){const e=this.biasInitializer,n=this.units;a=new((t=class extends GA{apply(t,a){const i=e.apply([n]),s=(new HA).apply([n]),r=e.apply([2*n]);return DA(DA(i,s),r)}}).className="CustomInit",t)}else a=this.biasInitializer;this.bias=this.addWeight("bias",[4*this.units],null,a,this.biasRegularizer,!0,this.biasConstraint)}else this.bias=null;this.built=!0}call(e,t){return dh((()=>{const n=null!=t.training&&t.training;if(3!==e.length)throw new Rw(`LSTMCell expects 3 input Tensors (inputs, h, c), got ${e.length}.`);let a=e[1];const i=e[2];e=e[0],0wg(e),rate:this.dropout,training:n,count:4,dropoutFunc:this.dropoutFunc})),0wg(a),rate:this.recurrentDropout,training:n,count:4,dropoutFunc:this.dropoutFunc}));const s=this.dropoutMask,r=this.recurrentDropoutMask;let o,l,u,c;0{null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null);const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}static fromConfig(e,t){return 0===t.implmentation&&(t.implementation=1),new e(t)}}hE.className="LSTM",Bd(hE);class dE extends sE{constructor(e){super(e),this.cells=e.cells}get stateSize(){const e=[];for(const t of this.cells.slice().reverse())Array.isArray(t.stateSize)?e.push(...t.stateSize):e.push(t.stateSize);return e}call(e,t){return dh((()=>{let n=e.slice(1);const a=[];for(const e of this.cells.slice().reverse())Array.isArray(e.stateSize)?a.push(n.splice(0,e.stateSize.length)):a.push(n.splice(0,1));a.reverse();const i=[];let s;for(let r=0;r{fA(`RNNCell_${a}`,(()=>{n.build(e),t=Array.isArray(n.stateSize)?n.stateSize[0]:n.stateSize,e=[e[0],t]}))})),this.built=!0}getConfig(){const e=super.getConfig(),t={cells:this.cells.map((e=>({className:e.getClassName(),config:e.getConfig()})))};return Object.assign(Object.assign({},e),t)}static fromConfig(e,t,n={}){const a=[];for(const e of t.cells)a.push(nC(e,n));return new e({cells:a})}get trainableWeights(){if(!this.trainable)return[];const e=[];for(const t of this.cells)e.push(...t.trainableWeights);return e}get nonTrainableWeights(){const e=[];for(const t of this.cells)e.push(...t.nonTrainableWeights);if(!this.trainable){const t=[];for(const e of this.cells)t.push(...e.trainableWeights);return t.concat(e)}return e}getWeights(){const e=[];for(const t of this.cells)e.push(...t.weights);return yx(e)}setWeights(e){const t=[];for(const n of this.cells){const a=n.weights.length,i=e.splice(a);for(let e=0;enull!=s?s(t(),n):jA(t(),n),o=()=>VA(r,t,a);if(!i||i<=1)return mh(o().clone());return Array(i).fill(void 0).map(o).map((e=>mh(e.clone())))}dE.className="StackedRNNCells",Bd(dE);var mE=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(a=Object.getOwnPropertySymbols(e);i{if(null!=this.cell.dropoutMask&&(ph(this.cell.dropoutMask),this.cell.dropoutMask=null),null!=this.cell.recurrentDropoutMask&&(ph(this.cell.recurrentDropoutMask),this.cell.recurrentDropoutMask=null),t&&t.constants)throw new Rw("ConvRNN2D cell does not support constants");const n=null==t?null:t.mask,a=null==t?null:t.training,i=null==t?null:t.initialState;return super.call(e,{mask:n,training:a,initialState:i})}))}computeOutputShape(e){let t=this.computeSingleOutputShape(e);return this.returnSequences||(t=[t[0],...t.slice(2)]),this.returnState&&(t=[t,...Array(2).fill([e[0],...t.slice(-3)])]),t}getInitialState(e){return dh((()=>{const{stateSize:t}=this.cell,n=e.shape,a=this.computeSingleOutputShape(n),i=cg([a[0],...a.slice(2)]);return Array.isArray(t)?Array(t.length).fill(i):[i]}))}resetStates(e,t=!1){dh((()=>{if(!this.stateful)throw new Iw("Cannot call resetStates() on an RNN Layer that is not stateful.");const n=this.inputSpec[0].shape,a=this.computeSingleOutputShape(n),i=[a[0],...a.slice(2)];if(null==n[0])throw new Rw("If an RNN is stateful, it needs to know its batch size. Specify the batch size of your input tensors: \n- If using a Sequential model, specify the batch size by passing a `batchInputShape` option to your first layer.\n- If using the functional API, specify the batch size by passing a `batchShape` option to your Input layer.");if(null==this.getStates())Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((()=>cg(i))):this.states_=[cg(i)];else if(null==e)ph(this.states_),null!=this.keptStates&&(ph(this.keptStates),this.keptStates=[]),Array.isArray(this.cell.stateSize)?this.states_=this.cell.stateSize.map((()=>cg(i))):this.states_[0]=cg(i);else{if(Array.isArray(e)||(e=[e]),e.length!==this.states_.length)throw new Rw(`Layer ${this.name} expects ${this.states_.length} state(s), but it received ${e.length} state value(s). Input received: ${e}`);t?this.keptStates.push(this.states_.slice()):ph(this.states_);for(let t=0;tmh(e.clone())))}))}computeSingleOutputShape(e){const{dataFormat:t,filters:n,kernelSize:a,padding:i,strides:s,dilationRate:r}=this.cell,o="channelsFirst"===t,l=e[o?3:2],u=e[o?4:3],c=FS(l,a[0],i,s[0],r[0]),h=FS(u,a[1],i,s[1],r[1]);return[...e.slice(0,2),...o?[n,c,h]:[c,h,n]]}}fE.className="ConvRNN2D";class gE extends cE{constructor(e){const{filters:t,kernelSize:n,strides:a,padding:i,dataFormat:s,dilationRate:r}=e;super(Object.assign(Object.assign({},e),{units:t})),this.filters=t,Yw(this.filters,"filters"),this.kernelSize=BS(n,2,"kernelSize"),this.kernelSize.forEach((e=>Yw(e,"kernelSize"))),this.strides=BS(a||1,2,"strides"),this.strides.forEach((e=>Yw(e,"strides"))),this.padding=i||"valid",hA(this.padding),this.dataFormat=s||"channelsLast",cA(this.dataFormat),this.dilationRate=BS(r||1,2,"dilationRate"),this.dilationRate.forEach((e=>Yw(e,"dilationRate")))}build(e){var t;e=px(e);const n="channelsFirst"===this.dataFormat?1:e.length-1;if(null==e[n])throw new Rw(`The channel dimension of the input should be defined. Found ${e[n]}`);const a=e[n],i=this.kernelSize.concat([a,4*this.filters]);this.kernel=this.addWeight("kernel",i,null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint);const s=this.kernelSize.concat([this.filters,4*this.filters]);if(this.recurrentKernel=this.addWeight("recurrent_kernel",s,null,this.recurrentInitializer,this.recurrentRegularizer,!0,this.recurrentConstraint),this.useBias){let e;if(this.unitForgetBias){const n=this.biasInitializer,a=this.filters;e=new((t=class extends GA{apply(e,t){return RA([n.apply([a]),hg([a]),n.apply([2*a])])}}).className="CustomInit",t)}else e=this.biasInitializer;this.bias=this.addWeight("bias",[4*this.filters],null,e,this.biasRegularizer,!0,this.biasConstraint)}this.built=!0}call(e,t){return dh((()=>{if(3!==e.length)throw new Rw(`ConvLSTM2DCell expects 3 input Tensors (inputs, h, c), got ${e.length}.`);const n=t.training||!1,a=e[0],i=e[1],s=e[2];0wg(a),rate:this.dropout,training:n,count:4,dropoutFunc:this.dropoutFunc}));const r=this.dropoutMask,o=(e,t,n)=>t&&t[n]?Ed(t[n],e):e;let l=o(a,r,0),u=o(a,r,1),c=o(a,r,2),h=o(a,r,3);0wg(i),rate:this.recurrentDropout,training:n,count:4,dropoutFunc:this.dropoutFunc}));const d=this.recurrentDropoutMask;let p=o(i,d,0),m=o(i,d,1),f=o(i,d,2),g=o(i,d,3);const[y,b,v,k]=yy(this.kernel.read(),4,3),[w,A,x,C]=this.useBias?yy(this.bias.read(),4):[null,null,null,null];l=this.inputConv(l,y,w,this.padding),u=this.inputConv(u,b,A,this.padding),c=this.inputConv(c,v,x,this.padding),h=this.inputConv(h,k,C,this.padding);const[S,E,_,T]=yy(this.recurrentKernel.read(),4,3);p=this.recurrentConv(p,S),m=this.recurrentConv(m,E),f=this.recurrentConv(f,_),g=this.recurrentConv(g,T);const I=this.recurrentActivation.apply(xd(l,p)),N=this.recurrentActivation.apply(xd(u,m)),R=xd(Ed(N,s),Ed(I,this.activation.apply(xd(c,f)))),D=Ed(this.recurrentActivation.apply(xd(h,g)),this.activation.apply(R));return[D,D,R]}))}getConfig(){const e=super.getConfig(),{units:t}=e,n=mE(e,["units"]),a={filters:this.filters,kernelSize:this.kernelSize,padding:this.padding,dataFormat:this.dataFormat,dilationRate:this.dilationRate,strides:this.strides};return Object.assign(Object.assign({},n),a)}inputConv(e,t,n,a){const i=Wm(e,t,this.strides,a||"valid","channelsFirst"===this.dataFormat?"NCHW":"NHWC",this.dilationRate);return n?PA(i,n,this.dataFormat):i}recurrentConv(e,t){return Wm(e,t,1,"same","channelsFirst"===this.dataFormat?"NCHW":"NHWC")}}gE.className="ConvLSTM2DCell",Bd(gE);class yE extends fE{constructor(e){const t=new gE(e);super(Object.assign(Object.assign({},e),{cell:t}))}static fromConfig(e,t){return new e(t)}}yE.className="ConvLSTM2D",Bd(yE);class bE extends Cx{constructor(e){super(e),this.rate=Math.max(Math.min(e.rate,1),0),this.noiseShape=e.noiseShape,this.seed=e.seed,this.supportsMasking=!0}getNoiseShape(e){if(null==this.noiseShape)return this.noiseShape;const t=e.shape,n=[];for(let e=0;e{this.invokeCallHook(e,t);const n=dx(e);if(0jA(n,this.rate,a,this.seed)),(()=>n),e)}return e}))}getConfig(){const e={rate:this.rate,noiseShape:this.noiseShape,seed:this.seed},t=super.getConfig();return Object.assign(e,t),e}dispose(){return super.dispose()}}bE.className="Dropout",Bd(bE);class vE extends bE{constructor(e){super(e),this.inputSpec=[{ndim:3}]}getNoiseShape(e){const t=e.shape;return[t[0],1,t[2]]}}vE.className="SpatialDropout1D",Bd(vE);class kE extends Cx{constructor(e){if(super(e),this.activation=null,this.useBias=!0,this.kernel=null,this.bias=null,this.DEFAULT_KERNEL_INITIALIZER="glorotNormal",this.DEFAULT_BIAS_INITIALIZER="zeros",null==e.batchInputShape&&null==e.inputShape&&null!=e.inputDim){let t=null;null!=e.batchSize&&(t=e.batchSize),this.batchInputShape=[t,e.inputDim]}this.units=e.units,Yw(this.units,"units"),this.activation=AS(e.activation),null!=e.useBias&&(this.useBias=e.useBias),this.kernelInitializer=ux(e.kernelInitializer||this.DEFAULT_KERNEL_INITIALIZER),this.biasInitializer=ux(e.biasInitializer||this.DEFAULT_BIAS_INITIALIZER),this.kernelConstraint=Wx(e.kernelConstraint),this.biasConstraint=Wx(e.biasConstraint),this.kernelRegularizer=IS(e.kernelRegularizer),this.biasRegularizer=IS(e.biasRegularizer),this.activityRegularizer=IS(e.activityRegularizer),this.supportsMasking=!0,this.inputSpec=[{minNDim:2}]}build(e){const t=(e=px(e))[e.length-1];null==this.kernel&&(this.kernel=this.addWeight("kernel",[t,this.units],null,this.kernelInitializer,this.kernelRegularizer,!0,this.kernelConstraint),this.useBias&&(this.bias=this.addWeight("bias",[this.units],null,this.biasInitializer,this.biasRegularizer,!0,this.biasConstraint))),this.inputSpec=[{minNDim:2,axes:{[-1]:t}}],this.built=!0}computeOutputShape(e){const t=(e=px(e)).slice();return t[t.length-1]=this.units,t}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e),a=Jw(this.activation.getClassName());let i;return null!=a?i=MA(n,this.kernel.read(),a,this.bias?this.bias.read():null):(i=MA(n,this.kernel.read()),null!=this.bias&&(i=PA(i,this.bias.read())),null!=this.activation&&(i=this.activation.apply(i))),i}))}getConfig(){const e={units:this.units,activation:kS(this.activation),useBias:this.useBias,kernelInitializer:lx(this.kernelInitializer),biasInitializer:lx(this.biasInitializer),kernelRegularizer:_S(this.kernelRegularizer),biasRegularizer:_S(this.biasRegularizer),activityRegularizer:_S(this.activityRegularizer),kernelConstraint:Vx(this.kernelConstraint),biasConstraint:Vx(this.biasConstraint)},t=super.getConfig();return Object.assign(e,t),e}}kE.className="Dense",Bd(kE);class wE extends Cx{constructor(e){super(e=e||{}),this.inputSpec=[{minNDim:3}],this.dataFormat=e.dataFormat}computeOutputShape(e){e=px(e);for(const t of e.slice(1))if(null==t)throw new Rw(`The shape of the input to "Flatten" is not fully defined (got ${e.slice(1)}). Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model.`);return[e[0],kA(e,1)]}call(e,t){return dh((()=>{this.invokeCallHook(e,t);let n=dx(e);if("channelsFirst"===this.dataFormat&&n.rank>1){const e=[0];for(let t=2;t{this.invokeCallHook(e,t);const n=dx(e);return this.activation.apply(n)}))}getConfig(){const e={activation:kS(this.activation)},t=super.getConfig();return Object.assign(e,t),e}}AE.className="Activation",Bd(AE);class xE extends Cx{constructor(e){super(e),this.n=e.n,this.inputSpec=[{ndim:2}]}computeOutputShape(e){return[e[0],this.n,e[1]]}call(e,t){return dh((()=>{return e=dx(e),t=e,n=this.n,dh((()=>{if(2!==t.shape.length)throw new Rw(`repeat() expects a rank-2 tensor, but received a rank-${t.shape.length} tensor.`);return zA(_A(t,1),[1,n,1])}));var t,n}))}getConfig(){const e={n:this.n},t=super.getConfig();return Object.assign(e,t),e}}xE.className="RepeatVector",Bd(xE);class CE extends Cx{constructor(e){super(e),this.targetShape=e.targetShape;for(let e=0;e{this.invokeCallHook(e,t);const n=dx(e),a=n.shape,i=a.slice(0,1).concat(this.fixUnknownDimension(a.slice(1),this.targetShape));return vm(n,i)}))}getConfig(){const e={targetShape:this.targetShape},t=super.getConfig();return Object.assign(e,t),e}}CE.className="Reshape",Bd(CE);class SE extends Cx{constructor(e){if(super(e),null==e.dims)throw new Error("Required configuration field `dims` is missing during Permute constructor call.");if(!Array.isArray(e.dims))throw new Error(`Permute constructor requires \`dims\` to be an Array, but received ${e.dims} instead.`);const t=xA(1,e.dims.length+1);if(!Os(e.dims.slice().sort(),t))throw new Error("Invalid permutation `dims`: "+JSON.stringify(e.dims)+" `dims` must contain consecutive integers starting from 1.");this.dims=e.dims,this.dimsIncludingBatch=[0].concat(this.dims),this.inputSpec=[new vx({ndim:this.dims.length+1})]}computeOutputShape(e){const t=(e=px(e)).slice();return this.dims.forEach(((n,a)=>{t[a+1]=e[n]})),t}call(e,t){return Gy(dx(e),this.dimsIncludingBatch)}getConfig(){const e={dims:this.dims},t=super.getConfig();return Object.assign(e,t),e}}SE.className="Permute",Bd(SE);class EE extends Cx{constructor(e){super(null==e?{}:e),this.supportsMasking=!0,this.maskValue=null!=e?null==e.maskValue?0:e.maskValue:0}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={maskValue:this.maskValue};return Object.assign(t,e),t}computeMask(e,t){const n=dx(e);return Xp(vg(n,this.maskValue),-1)}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e),a=Xp(vg(n,this.maskValue),-1,!0);return Ed(n,kd(a,n.dtype))}))}}EE.className="Masking",Bd(EE);class _E extends Cx{constructor(e){if(super(e),this.embeddings=null,this.DEFAULT_EMBEDDINGS_INITIALIZER="randomUniform",null==e.batchInputShape&&null==e.inputShape){let t=null;null!=e.batchSize&&(t=e.batchSize),null==e.inputLength?this.batchInputShape=[t,null]:this.batchInputShape=[t].concat(Pw(e.inputLength))}this.inputDim=e.inputDim,Yw(this.inputDim,"inputDim"),this.outputDim=e.outputDim,Yw(this.outputDim,"outputDim"),this.embeddingsInitializer=ux(e.embeddingsInitializer||this.DEFAULT_EMBEDDINGS_INITIALIZER),this.embeddingsRegularizer=IS(e.embeddingsRegularizer),this.activityRegularizer=IS(e.activityRegularizer),this.embeddingsConstraint=Wx(e.embeddingsConstraint),this.maskZero=e.maskZero,this.supportsMasking=e.maskZero,this.inputLength=e.inputLength}build(e){this.embeddings=this.addWeight("embeddings",[this.inputDim,this.outputDim],this.dtype,this.embeddingsInitializer,this.embeddingsRegularizer,!0,this.embeddingsConstraint),this.built=!0}warnOnIncompatibleInputShape(e){}computeMask(e,t){return dh((()=>this.maskZero?(e=dx(e),vg(e,Id(e))):null))}computeOutputShape(e){if(e=px(e),null==this.inputLength)return[...e,this.outputDim];const t=Pw(this.inputLength);if(t.length!==e.length-1)throw new Rw(`"inputLength" is ${this.inputLength}, but received input shape has shape ${e}`);{let n=0;for(let a=0;a{this.invokeCallHook(e,t);let n=dx(e);"int32"!==n.dtype&&(n=EA(n,"int32"));const a=BA(this.embeddings.read(),vm(n,[n.size]));return vm(a,px(this.computeOutputShape(n.shape)))}))}getConfig(){const e={inputDim:this.inputDim,outputDim:this.outputDim,embeddingsInitializer:lx(this.embeddingsInitializer),embeddingsRegularizer:_S(this.embeddingsRegularizer),activityRegularizer:_S(this.activityRegularizer),embeddingsConstraint:Vx(this.embeddingsConstraint),maskZero:this.maskZero,inputLength:this.inputLength},t=super.getConfig();return Object.assign(e,t),e}}_E.className="Embedding",Bd(_E);class TE extends Cx{constructor(e){super(e||{}),this.supportsMasking=!0}mergeFunction(e){throw new Dw}computeElementwiseOpOutputShape(e,t){if(null==e||null==t)return null;if(e.length1)throw new Rw(`Can not merge tensors with different batch sizes. Got tensors with shapes: ${JSON.stringify(e)}.`);let n=null==e[0]?null:e[0].slice(1);for(let t=1;te.length));-1===e.indexOf(null)&&1===Kw(a).length?this.reshapeRequired=!1:this.reshapeRequired=!0}call(e,t){return dh((()=>{if(this.reshapeRequired){const t=[],n=e.map((e=>e.rank));if(-1===n.indexOf(null)){const a=AA(n);for(let n of e){const e=n.rank;for(let t=0;t1){const i=xA(1,e).concat([0]);t.push(Gy(a,i)),n=!0}else t.push(a)}let a=this.mergeFunction(t);const i=a.rank;if(n)if(null==i){const e=a.shape,t=e[e.length-1],n=[t].concat(e.slice(0,e.length-1));a=vm(Gy(vm(a,[-1,t]),[1,0]),n)}else if(i>1){const e=[i-1].concat(xA(0,i-1));a=Gy(a,e)}return a}}return this.mergeFunction(e)}))}computeOutputShape(e){let t;t=null==e[0]?null:e[0].slice(1);for(let n=1;n{if(null==t)return null;if(!Array.isArray(t))throw new Rw("`mask` should be an Array");if(!Array.isArray(e))throw new Rw("`inputs` should be an Array");if(t.length!==e.length)throw new Rw(`The Array 'inputs' and 'mask' are expected to have the same length, but have different lengths (${e.length} vs ${t.length})`);if(t.every((e=>null==e)))return null;let n=(t=t.map((e=>null==e?e:If(e,0))))[0];for(let e=1;e{let t=e[0].clone();for(let n=1;n{let t=e[0].clone();for(let n=1;n{let t=e[0].clone();for(let n=1;n{let t=e[0];for(let n=1;n{let t=e[0];for(let n=1;n1)throw new Rw("A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got input shapes: "+JSON.stringify(e))}mergeFunction(e){return dh((()=>RA(e,this.axis)))}computeOutputShape(e){if(!Array.isArray(e)||!Array.isArray(e[0]))throw new Rw("A `Concatenate` layer should be called on a list of inputs.");const t=e,n=t[0].slice(),a=this.axis<0?n.length+this.axis:this.axis;for(const e of t.slice(1)){if(null==n[a]||null==e[a]){n[a]=null;break}n[a]+=e[a]}return n}computeMask(e,t){if(null==t)return null;if(!Array.isArray(t))throw new Rw("`mask` should be an array for Concatenate");if(!Array.isArray(e))throw new Rw("`inputs` should be an array for Concatenate");if(t.length!==e.length)throw new Rw(`Mismatch in the length of mask (${t.length}) and the legnth of inputs (${e.length})`);return dh((()=>{let n=!0;if(t.forEach((e=>{null==e||(n=!1)})),n)return null;const a=[];for(let n=0;n"A `Dot` layer should be called on a list of exactly 2 inputs."));const t=e[0],n=e[1];if(t.length>3||n.length>3)throw new Dw("Dot layer does not support tensors of 4D or higher rank yet.");const a=this.interpretAxes(t,n);if(t[a[0]]!==n[a[1]])throw new Rw(`Dimension incompatibility: ${t[a[0]]} !== ${n[a[1]]}`)}mergeFunction(e){if(2!==e.length)throw new Rw(`A \`Dot\` layer must be called on exactly 2 inputs, but received ${e.length} input(s).`);let t,n=e[0],a=e[1];return t=Array.isArray(this.axes)?this.axes.map(((t,n)=>ME(t,e[n].shape.length))):[ME(this.axes,n.shape.length),ME(this.axes,a.shape.length)],this.normalize&&(n=aC(n,t[0]),a=aC(a,t[1])),function(e,t,n){if(e.shape.length>3||t.shape.length>3)throw new Dw("batchDot is not implemented for tensors of 4D or higher rank yet");if(Ns(e.shape.length>=2,(()=>`batchDot requires the rank of x to be >= 2, but got ${e.shape.length}`)),Ns(e.shape.length>=2,(()=>`batchDot requires the rank of y to be >= 2, but got ${t.shape.length}`)),"number"==typeof n&&(n=[n,n]),"complex64"===e.dtype||"complex64"===t.dtype)throw new Dw("batchDot is not implemented for complex64-type Tensors yet.");const a=e.shape.length,i=t.shape.length;null==n&&(n=[a-1,i-2]);const s=n;return dh((()=>{let n,r;if(a>i){n=a-i;const e=[];for(let t=0;ta){n=i-a;const t=[];for(let e=0;e0){let e;e=a>i?a+i-3:a-1;const t=[];for(let a=e;a"A `Dot` layer should be called on a list of exactly 2 inputs."));const t=e[0].slice(),n=e[1].slice();if(t.length>3||n.length>3)throw new Dw("Dot layer does not support tensors of 4D or higher rank yet.");const a=this.interpretAxes(t,n);t.splice(a[0],1),n.splice(a[1],1),n.splice(0,1);const i=t.concat(n);return 1===i.length&&i.push(1),i}computeMask(e,t){return null}getConfig(){const e={axes:this.axes,normalize:this.normalize},t=super.getConfig();return Object.assign(e,t),e}}BE.className="Dot",Bd(BE);class FE extends Cx{constructor(e){super(e),this.supportsMasking=!0,this.stddev=e.stddev}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={stddev:this.stddev};return Object.assign(t,e),t}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e);return VA((()=>xd(OA(n.shape,0,this.stddev),n)),(()=>n),t.training||!1)}))}}FE.className="GaussianNoise",Bd(FE);class LE extends Cx{constructor(e){super(e),this.supportsMasking=!0,this.rate=e.rate}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={rate:this.rate};return Object.assign(t,e),t}call(e,t){return dh((()=>{this.invokeCallHook(e,t);const n=dx(e);if(this.rate>0&&this.rate<1){return VA((()=>{const e=Math.sqrt(this.rate/(1-this.rate));return Ed(n,OA(n.shape,1,e))}),(()=>n),t.training||!1)}return n}))}}LE.className="GaussianDropout",Bd(LE);class PE extends Cx{constructor(e){super(e),this.supportsMasking=!0,this.rate=e.rate,this.noiseShape=e.noiseShape}_getNoiseShape(e){return this.noiseShape||dx(e).shape}computeOutputShape(e){return e}getConfig(){const e=super.getConfig(),t={rate:this.rate};return Object.assign(t,e),t}call(e,t){return dh((()=>{if(this.rate<1&&this.rate>0){const n=this._getNoiseShape(e);return VA((()=>{const t=dx(e),a=-1.7580993408473766;let i=Bf(Wg(n),this.rate);i=EA(i,"float32");const s=((1-this.rate)*(1+this.rate*a**2))**-.5,r=-s*a*this.rate,o=xd(Ed(t,i),Ed(xd(i,-1),a));return xd(Ed(o,s),r)}),(()=>dx(e)),t.training||!1)}return e}))}}function jE(e,t,n,a,i,s=.001){let r;if(2===e.rank)r=Nm(e,t,n,a,i,s);else if(3===e.rank)r=Rm(e,t,n,a,i,s);else{if(4!==e.rank)throw new Dw(`batchNormalization is not implemented for array of rank ${e.rank} yet`);r=Dm(e,t,n,a,i,s)}return r}function VE(e,t,n,a,i=.001){return Os(a.slice().sort(),xA(0,e.rank-1))?function(e,t,n,a,i=.001){return dh((()=>{const s=gg(e,a),r=s.mean,o=s.variance;return[jE(e,r,o,n,t,i),r,o]}))}(e,t,n,a,i):function(e,t,n,a,i=.001){return dh((()=>{const s=gg(e,a),r=s.mean,o=s.variance,l=[];for(const t of xA(0,e.rank))-1!==a.indexOf(t)?l.push(1):l.push(e.shape[t]);const u=vm(r,l),c=vm(o,l),h=null==t?null:vm(t,l),d=null==n?null:vm(n,l);return[jE(e,u,c,d,h,i),r,o]}))}(e,t,n,a,i)}PE.className="AlphaDropout",Bd(PE);class UE extends Cx{constructor(e){null==e&&(e={}),super(e),this.supportsMasking=!0,this.axis=null==e.axis?-1:e.axis,this.momentum=null==e.momentum?.99:e.momentum,this.epsilon=null==e.epsilon?.001:e.epsilon,this.center=null==e.center||e.center,this.scale=null==e.scale||e.scale,this.betaInitializer=ux(e.betaInitializer||"zeros"),this.gammaInitializer=ux(e.gammaInitializer||"ones"),this.movingMeanInitializer=ux(e.movingMeanInitializer||"zeros"),this.movingVarianceInitializer=ux(e.movingVarianceInitializer||"ones"),this.betaConstraint=Wx(e.betaConstraint),this.gammaConstraint=Wx(e.gammaConstraint),this.betaRegularizer=IS(e.betaRegularizer),this.gammaRegularizer=IS(e.gammaRegularizer)}build(e){e=px(e);const t=this.axis>=0?this.axis:this.axis+e.length,n=e[t];if(null==n)throw new Rw(`Axis ${t} of input tensor should have a defined dimension but the layer received an input with shape ${JSON.stringify(e)}.`);this.inputSpec=[new vx({ndim:e.length,axes:{[t]:n}})];const a=[n];this.scale&&(this.gamma=this.addWeight("gamma",a,null,this.gammaInitializer,this.gammaRegularizer,!0,this.gammaConstraint)),this.center&&(this.beta=this.addWeight("beta",a,null,this.betaInitializer,this.betaRegularizer,!0,this.betaConstraint)),this.movingMean=this.addWeight("moving_mean",a,null,this.movingMeanInitializer,null,!1),this.movingVariance=this.addWeight("moving_variance",a,null,this.movingVarianceInitializer,null,!1),this.built=!0}call(e,t){return dh((()=>{const n=null!=t.training&&t.training,a=dx(e),i=a.shape,s=i.length,r=xA(0,s),o=this.axis>=0?this.axis:this.axis+s;r.splice(o,1);const l=Mw(1,s);l[o]=i[o];const u=r.slice();u.sort();const c=!Os(u,xA(0,s).slice(0,s-1));if(!n)return(()=>{if(c){const e=vm(this.movingMean.read(),l),t=vm(this.movingVariance.read(),l),n=this.center?vm(this.beta.read(),l):null,i=this.scale?vm(this.gamma.read(),l):null;return jE(a,e,t,n,i,this.epsilon)}return jE(a,this.movingMean.read(),this.movingVariance.read(),null==this.beta?null:this.beta.read(),null==this.gamma?null:this.gamma.read(),this.epsilon)})();const[h,d,p]=VE(a,this.gamma.read(),this.beta.read(),r,this.epsilon),m=(e,t,n)=>{dh((()=>{const a=1-n,i=e.read(),s=Ed(Ud(i,t),a);e.write(Ud(i,s))}))};return(()=>{m(this.movingMean,d,this.momentum),m(this.movingVariance,p,this.momentum)})(),h}))}getConfig(){const e={axis:this.axis,momentum:this.momentum,epsilon:this.epsilon,center:this.center,scale:this.scale,betaInitializer:lx(this.betaInitializer),gammaInitializer:lx(this.gammaInitializer),movingMeanInitializer:lx(this.movingMeanInitializer),movingVarianceInitializer:lx(this.movingVarianceInitializer),betaRegularizer:_S(this.betaRegularizer),gammaRegularizer:_S(this.gammaRegularizer),betaConstraint:Vx(this.betaConstraint),gammaConstraint:Vx(this.gammaConstraint)},t=super.getConfig();return Object.assign(e,t),e}}UE.className="BatchNormalization",Bd(UE);class WE extends Cx{constructor(e){if(null==e&&(e={}),super(e),this.axis=null==e.axis?-1:e.axis,"number"==typeof this.axis){if(!Number.isInteger(this.axis))throw new Error(`Expected axis to be an integer, but received ${this.axis}`)}else{if(!Array.isArray(this.axis))throw new Error(`Expected axis to be an integer or an array of integers, but received ${JSON.stringify(this.axis)}`);for(const e of this.axis)if(!Number.isInteger(e))throw new Error(`Expected axis to be an array of integers, but received ${JSON.stringify(this.axis)}`)}this.epsilon=null==e.epsilon?.001:e.epsilon,this.center=null==e.center||e.center,this.scale=null==e.scale||e.scale,this.betaInitializer=ux(e.betaInitializer||"zeros"),this.gammaInitializer=ux(e.gammaInitializer||"ones"),this.betaRegularizer=IS(e.betaRegularizer),this.gammaRegularizer=IS(e.gammaRegularizer),this.supportsMasking=!0}build(e){const t=(e=px(e)).length;"number"==typeof this.axis&&(this.axis=[this.axis]);for(let e=0;e=t)throw new Error(`Invalid axis: ${e}`);if(this.axis.length!==Kw(this.axis).length)throw new Error(`Found duplicate axes in: ${this.axis}`);const n=this.axis.map((t=>e[t])),a=!0;this.scale?this.gamma=this.addWeight("gamma",n,"float32",this.gammaInitializer,this.gammaRegularizer,a):this.gamma=null,this.center?this.beta=this.addWeight("beta",n,"float32",this.betaInitializer,this.betaRegularizer,a):this.beta=null,this.built=!0}call(e,t){const n=dx(e),a=n.shape,i=a.length;return dh((()=>{let{mean:e,variance:t}=gg(n,this.axis,!0);const s=Mw(1,i);for(const e of this.axis)s[e]=a[e];const r=e=>null!=e&&e.shape.length!==i?vm(e,s):e;let o=this.scale?r(this.gamma.read()):null,l=this.center?r(this.beta.read()):null;const u=[],c=[];for(let e=0;e=0?e[2]+this.padding[0][0]+this.padding[0][1]:null,n=null!=e[3]&&e[3]>=0?e[3]+this.padding[1][0]+this.padding[1][1]:null,[e[0],e[1],t,n]):(t=null!=e[1]&&e[1]>=0?e[1]+this.padding[0][0]+this.padding[0][1]:null,n=null!=e[2]&&e[2]>=0?e[2]+this.padding[1][0]+this.padding[1][1]:null,[e[0],t,n,e[3]])}call(e,t){return dh((()=>{return t=dx(e),n=this.padding,a=this.dataFormat,dh((()=>{if(4!==t.rank)throw new Rw(`temporalPadding expects input tensor to be 4-D, but received a ${t.rank}-D tensor.`);if(null==n&&(n=[[1,1],[1,1]]),2!==n.length||2!==n[0].length||2!==n[1].length)throw new Rw("spatial2dPadding expects `padding` to be an Array of two Arrays, each of which is an Array of two integers.");if(null==a&&(a="channelsLast"),"channelsLast"!==a&&"channelsFirst"!==a)throw new Rw(`Unknown data format: ${a}. Supported data formats are 'channelsLast' and 'channelsFirst.`);let e;return e="channelsFirst"===a?[[0,0],[0,0],n[0],n[1]]:[[0,0],n[0],n[1],[0,0]],xg(t,e)}));var t,n,a}))}getConfig(){const e={padding:this.padding,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}function qE(e,t,n,a,i,s){return dh((()=>{let r;cA(i),dA(s),hA(a),null==n&&(n=[1,1]),null==a&&(a="valid"),null==i&&(i="channelsLast"),null==s&&(s="max"),e=PS(e,i);const o="same"===a?"same":"valid";return r="max"===s?rg(e,t,n,o):km(e,t,n,o),"channelsFirst"===i&&(r=Gy(r,[0,3,1,2])),r}))}function HE(e,t,n,a,i,s){return dh((()=>{let r;cA(i),dA(s),hA(a),null==n&&(n=[1,1,1]),null==a&&(a="valid"),null==i&&(i="channelsLast"),null==s&&(s="max"),e=jS(e,i);const o="same"===a?"same":"valid";return r="max"===s?og(e,t,n,o):wm(e,t,n,o),"channelsFirst"===i&&(r=Gy(r,[0,4,1,2,3])),r}))}GE.className="ZeroPadding2D",Bd(GE);class KE extends Cx{constructor(e){if(null==e.poolSize&&(e.poolSize=2),super(e),"number"==typeof e.poolSize)this.poolSize=[e.poolSize];else{if(!Array.isArray(e.poolSize)||1!==e.poolSize.length||"number"!=typeof e.poolSize[0])throw new Rw(`poolSize for 1D convolutional layer must be a number or an Array of a single number, but received ${JSON.stringify(e.poolSize)}`);this.poolSize=e.poolSize}if(Yw(this.poolSize,"poolSize"),null==e.strides)this.strides=this.poolSize;else if("number"==typeof e.strides)this.strides=[e.strides];else{if(!Array.isArray(e.strides)||1!==e.strides.length||"number"!=typeof e.strides[0])throw new Rw(`strides for 1D convolutional layer must be a number or an Array of a single number, but received ${JSON.stringify(e.strides)}`);this.strides=e.strides}Yw(this.strides,"strides"),this.padding=null==e.padding?"valid":e.padding,hA(this.padding),this.inputSpec=[new vx({ndim:3})]}computeOutputShape(e){const t=FS((e=px(e))[1],this.poolSize[0],this.padding,this.strides[0]);return[e[0],t,e[2]]}call(e,t){return dh((()=>{this.invokeCallHook(e,t),e=_A(dx(e),2);const n=this.poolingFunction(dx(e),[this.poolSize[0],1],[this.strides[0],1],this.padding,"channelsLast");return ky(n,[2])}))}getConfig(){const e={poolSize:this.poolSize,padding:this.padding,strides:this.strides},t=super.getConfig();return Object.assign(e,t),e}}class $E extends KE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"max")}}$E.className="MaxPooling1D",Bd($E);class ZE extends KE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"avg")}}ZE.className="AveragePooling1D",Bd(ZE);class XE extends Cx{constructor(e){if(null==e.poolSize&&(e.poolSize=[2,2]),super(e),this.poolSize=Array.isArray(e.poolSize)?e.poolSize:[e.poolSize,e.poolSize],null==e.strides)this.strides=this.poolSize;else if(Array.isArray(e.strides)){if(2!==e.strides.length)throw new Rw(`If the strides property of a 2D pooling layer is an Array, it is expected to have a length of 2, but received length ${e.strides.length}.`);this.strides=e.strides}else this.strides=[e.strides,e.strides];Yw(this.poolSize,"poolSize"),Yw(this.strides,"strides"),this.padding=null==e.padding?"valid":e.padding,this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),hA(this.padding),this.inputSpec=[new vx({ndim:4})]}computeOutputShape(e){e=px(e);let t="channelsFirst"===this.dataFormat?e[2]:e[1],n="channelsFirst"===this.dataFormat?e[3]:e[2];return t=FS(t,this.poolSize[0],this.padding,this.strides[0]),n=FS(n,this.poolSize[1],this.padding,this.strides[1]),"channelsFirst"===this.dataFormat?[e[0],e[1],t,n]:[e[0],t,n,e[3]]}call(e,t){return dh((()=>(this.invokeCallHook(e,t),this.poolingFunction(dx(e),this.poolSize,this.strides,this.padding,this.dataFormat))))}getConfig(){const e={poolSize:this.poolSize,padding:this.padding,strides:this.strides,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}class YE extends XE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"max")}}YE.className="MaxPooling2D",Bd(YE);class QE extends XE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),qE(e,t,n,a,i,"avg")}}QE.className="AveragePooling2D",Bd(QE);class JE extends Cx{constructor(e){if(null==e.poolSize&&(e.poolSize=[2,2,2]),super(e),this.poolSize=Array.isArray(e.poolSize)?e.poolSize:[e.poolSize,e.poolSize,e.poolSize],null==e.strides)this.strides=this.poolSize;else if(Array.isArray(e.strides)){if(3!==e.strides.length)throw new Rw(`If the strides property of a 3D pooling layer is an Array, it is expected to have a length of 3, but received length ${e.strides.length}.`);this.strides=e.strides}else this.strides=[e.strides,e.strides,e.strides];Yw(this.poolSize,"poolSize"),Yw(this.strides,"strides"),this.padding=null==e.padding?"valid":e.padding,this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),hA(this.padding),this.inputSpec=[new vx({ndim:5})]}computeOutputShape(e){e=px(e);let t="channelsFirst"===this.dataFormat?e[2]:e[1],n="channelsFirst"===this.dataFormat?e[3]:e[2],a="channelsFirst"===this.dataFormat?e[4]:e[3];return t=FS(t,this.poolSize[0],this.padding,this.strides[0]),n=FS(n,this.poolSize[1],this.padding,this.strides[1]),a=FS(a,this.poolSize[2],this.padding,this.strides[2]),"channelsFirst"===this.dataFormat?[e[0],e[1],t,n,a]:[e[0],t,n,a,e[4]]}call(e,t){return dh((()=>(this.invokeCallHook(e,t),this.poolingFunction(dx(e),this.poolSize,this.strides,this.padding,this.dataFormat))))}getConfig(){const e={poolSize:this.poolSize,padding:this.padding,strides:this.strides,dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}class e_ extends JE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),HE(e,t,n,a,i,"max")}}e_.className="MaxPooling3D",Bd(e_);class t_ extends JE{constructor(e){super(e)}poolingFunction(e,t,n,a,i){return cA(i),hA(a),HE(e,t,n,a,i,"avg")}}t_.className="AveragePooling3D",Bd(t_);class n_ extends Cx{constructor(e){super(e),this.inputSpec=[new vx({ndim:3})]}computeOutputShape(e){return[e[0],e[2]]}call(e,t){throw new Dw}}class a_ extends n_{constructor(e){super(e||{})}call(e,t){return dh((()=>{const t=dx(e);return ug(t,1)}))}}a_.className="GlobalAveragePooling1D",Bd(a_);class i_ extends n_{constructor(e){super(e||{})}call(e,t){return dh((()=>{const t=dx(e);return Af(t,1)}))}}i_.className="GlobalMaxPooling1D",Bd(i_);class s_ extends Cx{constructor(e){super(e),this.dataFormat=null==e.dataFormat?"channelsLast":e.dataFormat,cA(this.dataFormat),this.inputSpec=[new vx({ndim:4})]}computeOutputShape(e){return"channelsLast"===this.dataFormat?[e[0],e[3]]:[e[0],e[1]]}call(e,t){throw new Dw}getConfig(){const e={dataFormat:this.dataFormat},t=super.getConfig();return Object.assign(e,t),e}}class r_ extends s_{call(e,t){return dh((()=>{const t=dx(e);return"channelsLast"===this.dataFormat?ug(t,[1,2]):ug(t,[2,3])}))}}r_.className="GlobalAveragePooling2D",Bd(r_);class o_ extends s_{call(e,t){return dh((()=>{const t=dx(e);return"channelsLast"===this.dataFormat?Af(t,[1,2]):Af(t,[2,3])}))}}o_.className="GlobalMaxPooling2D",Bd(o_);class l_ extends Cx{constructor(e){super(e),this.layer=e.layer}build(e){this.built=!0}get trainable(){return null!=this.layer&&this.layer.trainable}set trainable(e){null!=this.layer&&(this.layer.trainable=e)}get trainableWeights(){return this.layer.trainableWeights}get nonTrainableWeights(){return this.layer.nonTrainableWeights}get updates(){return this.layer._updates}get losses(){return this.layer.losses}getWeights(){return this.layer.getWeights()}setWeights(e){this.layer.setWeights(e)}getConfig(){const e={layer:{className:this.layer.getClassName(),config:this.layer.getConfig()}},t=super.getConfig();return Object.assign(e,t),e}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),null!=this.layer&&this.layer.setFastWeightInitDuringBuild(e)}static fromConfig(e,t,n={}){const a=nC(t.layer,n);delete t.layer;const i={layer:a};return Object.assign(i,t),new e(i)}}class u_ extends l_{constructor(e){super(e),this.supportsMasking=!0}build(e){if((e=px(e)).length<3)throw new Rw(`TimeDistributed layer expects an input shape >= 3D, but received input shape ${JSON.stringify(e)}`);this.inputSpec=[{shape:e}];const t=[e[0]].concat(e.slice(2));this.layer.built||(this.layer.build(t),this.layer.built=!0),super.build(e)}computeOutputShape(e){const t=[(e=px(e))[0]].concat(e.slice(2)),n=this.layer.computeOutputShape(t),a=e[1];return[n[0],a].concat(n.slice(1))}call(e,t){return dh((()=>aE(((e,n)=>[dx(this.layer.call(e,t)),[]]),e=dx(e),[],!1,null,null,!1,!0)[1]))}}u_.className="TimeDistributed",Bd(u_);class c_ extends l_{constructor(e){super(e);const t=e.layer.getConfig(),n={};n.className=e.layer.getClassName(),n.config=t,this.forwardLayer=nC(n),t.goBackwards=!0!==t.goBackwards;const a={};var i;if(a.className=e.layer.getClassName(),a.config=t,this.backwardLayer=nC(a),this.forwardLayer.name="forward_"+this.forwardLayer.name,this.backwardLayer.name="backward_"+this.backwardLayer.name,this.mergeMode=void 0===e.mergeMode?"concat":e.mergeMode,i=this.mergeMode,Zw(lA,"BidirectionalMergeMode",i),e.weights)throw new Dw("weights support is not implemented for Bidirectional layer yet.");this._stateful=e.layer.stateful,this.returnSequences=e.layer.returnSequences,this.returnState=e.layer.returnState,this.supportsMasking=!0,this._trainable=!0,this.inputSpec=e.layer.inputSpec,this.numConstants=null}get trainable(){return this._trainable}set trainable(e){this._trainable=e,null!=this.forwardLayer&&(this.forwardLayer.trainable=e),null!=this.backwardLayer&&(this.backwardLayer.trainable=e)}getWeights(){return this.forwardLayer.getWeights().concat(this.backwardLayer.getWeights())}setWeights(e){const t=e.length,n=Math.floor(t/2);this.forwardLayer.setWeights(e.slice(0,n)),this.backwardLayer.setWeights(e.slice(n))}computeOutputShape(e){let t,n,a,i=this.forwardLayer.computeOutputShape(e);return Array.isArray(i)&&Array.isArray(i[0])||(i=[i]),this.returnState?(a=i.slice(1),t=i[0]):t=i[0],"concat"===this.mergeMode?(t[t.length-1]*=2,n=[t]):n=null==this.mergeMode?[t,t.slice()]:[t],this.returnState?null==this.mergeMode?n.concat(a).concat(a.slice()):[t].concat(a).concat(a.slice()):Lw(n)}apply(e,t){let n=null==t?null:t.initialState,a=null==t?null:t.constants;null==t&&(t={});const i=nE(e,n,a,this.numConstants);if(e=i.inputs,n=i.initialState,a=i.constants,Array.isArray(e)&&(n=e.slice(1),e=e[0]),(null==n||0===n.length)&&null==a)return super.apply(e,t);const s=[],r=[];if(null!=n){const e=n.length;if(e%2>0)throw new Rw("When passing `initialState` to a Bidrectional RNN, the state should be an Array containing the states of the underlying RNNs.");t.initialState=n,s.push(...n);const a=n.map((e=>new vx({shape:e.shape})));this.forwardLayer.stateSpec=a.slice(0,e/2),this.backwardLayer.stateSpec=a.slice(e/2),r.push(...a)}if(null!=a)throw new Dw("Support for constants in Bidirectional layers is not implemented yet.");const o=s[0]instanceof kx;for(const e of s)if(e instanceof kx!==o)throw new Rw("The initial state of a Bidirectional layer cannot be specified as a mix of symbolic and non-symbolic tensors");if(o){const n=[e].concat(s),a=this.inputSpec.concat(r),i=this.inputSpec;this.inputSpec=a;const o=super.apply(n,t);return this.inputSpec=i,o}return super.apply(e,t)}call(e,t){return dh((()=>{const n=t.initialState;let a,i,s,r;if(null==n)a=this.forwardLayer.call(e,t),i=this.backwardLayer.call(e,t);else{const s=n.slice(0,n.length/2),r=n.slice(n.length/2);a=this.forwardLayer.call(e,Object.assign(t,{initialState:s})),i=this.backwardLayer.call(e,Object.assign(t,{initialState:r}))}return this.returnState&&(Array.isArray(a)&&(s=a.slice(1).concat(i.slice(1))),a=a[0],i=i[0]),this.returnSequences&&(i=Xg(i,1)),"concat"===this.mergeMode?r=RA([a,i]):"sum"===this.mergeMode?r=xd(a,i):"ave"===this.mergeMode?r=Ed(.5,xd(a,i)):"mul"===this.mergeMode?r=Ed(a,i):null==this.mergeMode&&(r=[a,i]),this.returnState?null==this.mergeMode?r.concat(s):[r].concat(s):r}))}resetStates(e){this.forwardLayer.resetStates(),this.backwardLayer.resetStates()}build(e){fA(this.forwardLayer.name,(()=>{this.forwardLayer.build(e)})),fA(this.backwardLayer.name,(()=>{this.backwardLayer.build(e)})),this.built=!0}computeMask(e,t){let n;if(Array.isArray(t)&&(t=t[0]),n=this.returnSequences?null==this.mergeMode?[t,t]:t:null==this.mergeMode?[null,null]:null,this.returnState){const e=this.forwardLayer.states.map((e=>null));return Array.isArray(n)?n.concat(e).concat(e):[n].concat(e).concat(e)}return n}get trainableWeights(){return this.forwardLayer.trainableWeights.concat(this.backwardLayer.trainableWeights)}get nonTrainableWeights(){return this.forwardLayer.nonTrainableWeights.concat(this.backwardLayer.nonTrainableWeights)}setFastWeightInitDuringBuild(e){super.setFastWeightInitDuringBuild(e),null!=this.forwardLayer&&this.forwardLayer.setFastWeightInitDuringBuild(e),null!=this.backwardLayer&&this.backwardLayer.setFastWeightInitDuringBuild(e)}getConfig(){const e={mergeMode:this.mergeMode},t=super.getConfig();return Object.assign(e,t),e}static fromConfig(e,t){const n=nC(t.layer);if(delete t.layer,null!=t.numConstants)throw new Dw("Deserialization of a Bidirectional layer with numConstants present is not supported yet.");const a=t;return a.layer=n,new e(a)}}c_.className="Bidirectional",Bd(c_);class h_ extends Cx{constructor(e){super(e),this.scale=e.scale,e.offset?this.offset=e.offset:this.offset=0}getConfig(){const e={scale:this.scale,offset:this.offset},t=super.getConfig();return Object.assign(e,t),e}call(e,t){return dh((()=>("float32"!==(e=dx(e)).dtype&&(e=EA(e,"float32")),xd(Ed(e,this.scale),this.offset))))}}h_.className="Rescaling",Bd(h_);const{resizeBilinear:d_,cropAndResize:p_}=tv;class m_ extends Cx{constructor(e){super(e),this.height=e.height,this.width=e.width}centerCrop(e,t,n,a,i,s,r,o){return dh((()=>{let l,u=!1;const c=[t/s,n/r,(a+t)/s,(i+n)/r],h=[];3===e.rank?(u=!0,l=wy([e])):l=e;for(let e=0;eEA(d_(e,[t,n]),a)))}call(e,t){return dh((()=>{const t=dx(e),n=t.dtype,a=t.shape,i=a[a.length-3],s=a[a.length-2];let r=0;i!==this.height&&(r=Math.floor((i-this.height)/2));let o=0;return s!==this.width&&(o=Math.floor((s-this.width)/2),0===o&&(o=1)),r>=0&&o>=0?this.centerCrop(t,r,o,this.height,this.width,i,s,n):this.upsize(e,this.height,this.width,n)}))}getConfig(){const e={height:this.height,width:this.width},t=super.getConfig();return Object.assign(e,t),e}computeOutputShape(e){const t=(e=px(e)).length-3,n=e.length-2;return e[t]=this.height,e[n]=this.width,e}}m_.className="CenterCrop",Bd(m_);class f_ extends Cx{constructor(e){super(e),this.numTokens=e.numTokens,e.outputMode?this.outputMode=e.outputMode:this.outputMode="multiHot"}getConfig(){const e={numTokens:this.numTokens,outputMode:this.outputMode},t=super.getConfig();return Object.assign(e,t),e}computeOutputShape(e){return null==(e=px(e))?[this.numTokens]:"oneHot"===this.outputMode&&1!==e[e.length-1]?(e.push(this.numTokens),e):(e[e.length-1]=this.numTokens,e)}call(e,t){return dh((()=>{let n;if("int32"!==(e=dx(e)).dtype&&(e=EA(e,"int32")),void 0!==t.countWeights){if("count"!==this.outputMode)throw new Rw(`countWeights is not used when outputMode !== count.\n Received countWeights=${t.countWeights}`);n=dx(t.countWeights)}const a=Af(e),i=xf(e),s=Mf(this.numTokens,a).bufferSync().get(0),r=Bf(i,0).bufferSync().get(0);if(!s||!r)throw new Rw(`Input values must be between 0 < values <= numTokens with numTokens=${this.numTokens}`);return function(e,t,n,a){let i=dx(e);if("int32"!==i.dtype&&(i=EA(i,"int32")),"int"===t)return i;const s=i.shape;if(0===i.rank&&(i=If(i,-1)),"oneHot"===t&&1!==i.shape[i.shape.length-1]&&(i=If(i,-1)),i.rank>2)throw new Rw(`When outputMode is not int, maximum output rank is 2 Received outputMode ${t} and input shape ${s} which would result in output rank ${i.rank}.`);const r=["multiHot","oneHot"].includes(t);let o;if(o=ef(i,void 0!==a&&"count"===t?a:[],n,r),"tfIdf"!==t)return o;if(a)return Ed(o,a);throw new Rw("When outputMode is 'tfIdf', weights must be provided.")}(e,this.outputMode,this.numTokens,n)}))}}f_.className="CategoryEncoding",Bd(f_);const g_=new Set(["bilinear","nearest"]);class y_ extends Cx{constructor(e){if(super(e),this.height=e.height,this.width=e.width,e.interpolation){if(!g_.has(e.interpolation))throw new Rw(`Invalid interpolation parameter: ${e.interpolation} is not implemented`);this.interpolation=e.interpolation}else this.interpolation="bilinear";this.cropToAspectRatio=Boolean(e.cropToAspectRatio)}computeOutputShape(e){const t=(e=px(e))[2];return[this.height,this.width,t]}getConfig(){const e={height:this.height,width:this.width,interpolation:this.interpolation,cropToAspectRatio:this.cropToAspectRatio},t=super.getConfig();return Object.assign(e,t),e}call(e,t){return dh((()=>{const t=[this.height,this.width];if("bilinear"===this.interpolation)return tv.resizeBilinear(e,t,!this.cropToAspectRatio);if("nearest"===this.interpolation)return tv.resizeNearestNeighbor(e,t,!this.cropToAspectRatio);throw new Error(`Interpolation is ${this.interpolation} but only ${[...g_]} are supported`)}))}}y_.className="Resizing",Bd(y_);class b_{constructor(e){this.seed=e}next(){if(void 0!==this.seed)return this.seed++}}b_.className="RandomSeed";class v_ extends Cx{constructor(e){super(e),this.randomGenerator=new b_(e.seed)}getConfig(){const e={seed:this.randomGenerator.seed},t=super.getConfig();return Object.assign(e,t),e}}v_.className="BaseRandomLayer";const k_=new Set(["bilinear","nearest"]);class w_ extends v_{constructor(e){super(e);const{factor:t,interpolation:n="bilinear"}=e;if(this.factor=t,Array.isArray(this.factor)&&2===this.factor.length)this.widthLower=this.factor[0],this.widthUpper=this.factor[1];else{if(Array.isArray(this.factor)||!(this.factor>0))throw new Rw(`Invalid factor: ${this.factor}. Must be positive number or tuple of 2 numbers`);this.widthLower=-this.factor,this.widthUpper=this.factor}if(this.widthLower<-1||this.widthUpper<-1)throw new Rw(`factor must have values larger than -1. Got: ${this.factor}`);if(this.widthUpper{const t=dx(e);this.imgHeight=t.shape[t.shape.length-3];const n=t.shape[t.shape.length-2];this.widthFactor=Wg([1],1+this.widthLower,1+this.widthUpper,"float32",this.randomGenerator.next());let a=this.widthFactor.dataSync()[0]*n;a=Math.round(a);const i=[this.imgHeight,a];switch(this.interpolation){case"bilinear":return tv.resizeBilinear(e,i);case"nearest":return tv.resizeNearestNeighbor(e,i);default:throw new Error(`Interpolation is ${this.interpolation}\n but only ${[...k_]} are supported`)}}))}}w_.className="RandomWidth",Bd(w_);var A_,x_,C_;cr().registerFlag("KEEP_INTERMEDIATE_TENSORS",(()=>!1),(e=>{})),(x_=A_||(A_={}))[x_.DT_INVALID=0]="DT_INVALID",x_[x_.DT_FLOAT=1]="DT_FLOAT",x_[x_.DT_DOUBLE=2]="DT_DOUBLE",x_[x_.DT_INT32=3]="DT_INT32",x_[x_.DT_UINT8=4]="DT_UINT8",x_[x_.DT_INT16=5]="DT_INT16",x_[x_.DT_INT8=6]="DT_INT8",x_[x_.DT_STRING=7]="DT_STRING",x_[x_.DT_COMPLEX64=8]="DT_COMPLEX64",x_[x_.DT_INT64=9]="DT_INT64",x_[x_.DT_BOOL=10]="DT_BOOL",x_[x_.DT_QINT8=11]="DT_QINT8",x_[x_.DT_QUINT8=12]="DT_QUINT8",x_[x_.DT_QINT32=13]="DT_QINT32",x_[x_.DT_BFLOAT16=14]="DT_BFLOAT16",x_[x_.DT_QINT16=15]="DT_QINT16",x_[x_.DT_QUINT16=16]="DT_QUINT16",x_[x_.DT_UINT16=17]="DT_UINT16",x_[x_.DT_COMPLEX128=18]="DT_COMPLEX128",x_[x_.DT_HALF=19]="DT_HALF",x_[x_.DT_RESOURCE=20]="DT_RESOURCE",x_[x_.DT_VARIANT=21]="DT_VARIANT",x_[x_.DT_UINT32=22]="DT_UINT32",x_[x_.DT_UINT64=23]="DT_UINT64",x_[x_.DT_FLOAT_REF=101]="DT_FLOAT_REF",x_[x_.DT_DOUBLE_REF=102]="DT_DOUBLE_REF",x_[x_.DT_INT32_REF=103]="DT_INT32_REF",x_[x_.DT_UINT8_REF=104]="DT_UINT8_REF",x_[x_.DT_INT16_REF=105]="DT_INT16_REF",x_[x_.DT_INT8_REF=106]="DT_INT8_REF",x_[x_.DT_STRING_REF=107]="DT_STRING_REF",x_[x_.DT_COMPLEX64_REF=108]="DT_COMPLEX64_REF",x_[x_.DT_INT64_REF=109]="DT_INT64_REF",x_[x_.DT_BOOL_REF=110]="DT_BOOL_REF",x_[x_.DT_QINT8_REF=111]="DT_QINT8_REF",x_[x_.DT_QUINT8_REF=112]="DT_QUINT8_REF",x_[x_.DT_QINT32_REF=113]="DT_QINT32_REF",x_[x_.DT_BFLOAT16_REF=114]="DT_BFLOAT16_REF",x_[x_.DT_QINT16_REF=115]="DT_QINT16_REF",x_[x_.DT_QUINT16_REF=116]="DT_QUINT16_REF",x_[x_.DT_UINT16_REF=117]="DT_UINT16_REF",x_[x_.DT_COMPLEX128_REF=118]="DT_COMPLEX128_REF",x_[x_.DT_HALF_REF=119]="DT_HALF_REF",x_[x_.DT_RESOURCE_REF=120]="DT_RESOURCE_REF",x_[x_.DT_VARIANT_REF=121]="DT_VARIANT_REF",x_[x_.DT_UINT32_REF=122]="DT_UINT32_REF",x_[x_.DT_UINT64_REF=123]="DT_UINT64_REF",function(e){let t;!function(e){e[e.LEGACY=0]="LEGACY",e[e.V1=1]="V1",e[e.V2=2]="V2"}(t=e.CheckpointFormatVersion||(e.CheckpointFormatVersion={}))}(C_||(C_={}));const S_={};function E_(e){return S_[e]}function __(e,t,n,a,i){const s=t.inputParams[e];if(s&&void 0!==s.inputIndexStart){const e=s.inputIndexStart,r=0===s.inputIndexEnd?void 0:void 0===s.inputIndexEnd?e+1:s.inputIndexEnd,o=e<0?t.inputNames.length+e:e;if("tensor"===s.type)return T_(t.inputNames[o],n,a,i);if("tensors"===s.type){const s=t.inputs.slice(e,r);return t.inputNames.slice(e,r).filter(((e,t)=>{var n;return"NoOp"!==(null===(n=s[t])||void 0===n?void 0:n.op)})).map((e=>T_(e,n,a,i)))}const l=T_(t.inputNames[o],n,a,i),u=l.dataSync();return"number"===s.type?u[0]:Js(l.shape,u)}const r=t.attrParams[e];return r&&r.value}function T_(e,t,n,a){const[i,s]=D_(e,n);if(null!=a){const e=a.getHashTableHandleByName(i);if(null!=e)return e}const r=n.currentContextIds.find((e=>!!t[R_(i,e)]));return void 0!==r?t[R_(i,r)][s]:void 0}function I_(e,t,n){return t[R_(e,n.currentContextId)]}function N_(e,t){const[n,a,i]=D_(e,t);return[R_(n,t&&t.currentContextId),a,i]}function R_(e,t){return t?`${e}-${t}`:e}function D_(e,t){if(""===e)return["",0,void 0];const n=null!=t&&null!=t.parseNodeNameCache;if(n){const n=t.parseNodeNameCache.get(e);if(null!=n)return n}const a=e.split(":");let i;if(1===a.length)i=[e,0,void 0];else{const e=a[0],t=3===a.length?a[1]:void 0;i=[e,Number(a[a.length-1]),t]}return n&&t.parseNodeNameCache.set(e,i),i}function z_(e,t,n){let a=__("pad",e,t,n);if("explicit"===a){a=__("explicitPaddings",e,t,n);const i=[[0,0],[0,0],[0,0],[0,0]];for(let e=0;e<4;e++)i[e][0]=a[2*e],i[e][1]=a[2*e+1];return i}return a}function O_(e){return e.kept?e:wd(e)}const M_=[{tfOpName:"Add",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddV2",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AddN",category:"arithmetic",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"BiasAdd",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"Sub",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"RealDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Div",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"DivNoNan",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorDiv",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mul",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Maximum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Minimum",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Pow",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SquaredDifference",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Mod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"FloorMod",category:"arithmetic",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],B_=[{tfOpName:"Abs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atan2",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Ceil",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ClipByValue",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"clipValueMin",type:"number"},{start:2,name:"clipValueMax",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Complex",category:"basic_math",inputs:[{start:0,name:"real",type:"tensor"},{start:1,name:"imag",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ComplexAbs",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cos",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Elu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Exp",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Floor",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Imag",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Neg",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Real",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"Tout",name:"outputType",type:"dtype",notSupported:!0}]},{tfOpName:"Prelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"alpha",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Relu6",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Selu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sigmoid",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sin",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Rsqrt",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Square",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Tanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Sign",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Round",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Expm1",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Log1p",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Reciprocal",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Softplus",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Asinh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Acosh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Atanh",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Erf",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LeakyRelu",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"alpha",name:"alpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsNan",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsFinite",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"IsInf",category:"basic_math",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],F_=[{tfOpName:"EmptyTensorList",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"maxNumElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"LoopCond",category:"control",inputs:[{start:0,name:"pred",type:"tensor"}]},{tfOpName:"Switch",category:"control",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"pred",type:"tensor"}]},{tfOpName:"Merge",category:"control",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}]},{tfOpName:"Enter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"frame_name",name:"frameName",type:"string"},{tfName:"is_constant",name:"isConstant",type:"bool"}]},{tfOpName:"Exit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NextIteration",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayV3",category:"control",inputs:[{start:0,name:"size",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"dynamic_size",name:"dynamicSize",type:"bool"},{tfName:"clear_after_read",name:"clearAfterRead",type:"bool"},{tfName:"identical_element_shapes",name:"identicalElementShapes",type:"bool"},{tfName:"tensor_array_name",name:"name",type:"string"}]},{tfOpName:"TensorArrayWriteV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayReadV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"TensorArrayGatherV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape",name:"elementShape",type:"shape"}]},{tfOpName:"TensorArrayScatterV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"tensor",type:"tensor"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArrayConcatV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"element_shape_except0",name:"elementShapeExcept0",type:"shape",notSupported:!0}]},{tfOpName:"TensorArraySplitV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"tensor",type:"tensor"},{start:2,name:"lengths",type:"number[]"},{start:3,name:"flowIn",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"TensorArraySizeV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"},{start:1,name:"flowIn",type:"number"}]},{tfOpName:"TensorArrayCloseV3",category:"control",inputs:[{start:0,name:"tensorArrayId",type:"tensor"}]},{tfOpName:"StatelessIf",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"If",category:"control",inputs:[{start:0,name:"cond",type:"tensor"},{start:1,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"then_branch",name:"thenBranch",type:"func"},{tfName:"else_branch",name:"elseBranch",type:"func"}]},{tfOpName:"StatelessWhile",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"While",category:"control",inputs:[{start:0,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"cond",name:"cond",type:"func"},{tfName:"body",name:"body",type:"func"}]},{tfOpName:"TensorListScatter",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListScatterV2",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"},{start:3,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGather",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"indices",type:"number[]"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListGetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListSetItem",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"index",type:"number"},{start:2,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListReserve",category:"control",inputs:[{start:0,name:"elementShape",type:"shape"},{start:1,name:"numElements",type:"number"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListFromTensor",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListStack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"},{tfName:"num_elements",name:"numElements",type:"dtype"}]},{tfOpName:"TensorListSplit",category:"control",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"elementShape",type:"shape"},{start:2,name:"lengths",type:"number[]"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcat",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListConcatV2",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}],attrs:[{tfName:"element_shape",name:"elementShape",type:"shape"},{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPopBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"elementShape",type:"shape"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListPushBack",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"tensor",type:"tensor"}],attrs:[{tfName:"element_dtype",name:"elementDType",type:"dtype"}]},{tfOpName:"TensorListLength",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"}]},{tfOpName:"TensorListResize",category:"control",inputs:[{start:0,name:"tensorListId",type:"tensor"},{start:1,name:"size",type:"number"}]}],L_=[{tfOpName:"AvgPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[],notSupported:!0},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPoolWithArgmax",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"include_batch_in_index",name:"includeBatchInIndex",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"AvgPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MaxPool3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"ksize",name:"kernelSize",type:"number[]"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Conv1D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"stride",name:"stride",type:"number"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NWC"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"dilation",name:"dilation",type:"number",defaultValue:1}]},{tfOpName:"Conv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"useCudnnOnGpu",name:"useCudnnOnGpu",type:"bool"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"_FusedConv2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"use_cudnn_on_gpu",name:"useCudnnOnGpu",type:"bool",defaultValue:!0},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2}]},{tfOpName:"Conv2DBackpropInput",category:"convolution",inputs:[{start:2,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:0,name:"outputShape",type:"number[]"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]",notSupported:!0}]},{tfOpName:"DepthwiseConv2d",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"DepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"FusedDepthwiseConv2dNative",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]",defaultValue:[1,1,1,1]},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"explicit_paddings",name:"explicitPaddings",type:"number[]",defaultValue:[]}]},{tfOpName:"Conv3D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"padding",name:"pad",type:"string"},{tfName:"data_format",name:"dataFormat",type:"string",defaultValue:"NHWC"},{tfName:"dilations",name:"dilations",type:"number[]"}]},{tfOpName:"Dilation2D",category:"convolution",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"filter",type:"tensor"}],attrs:[{tfName:"strides",name:"strides",type:"number[]"},{tfName:"rates",name:"dilations",type:"number[]"},{tfName:"padding",name:"pad",type:"string"}]}],P_=[{tfOpName:"Fill",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"},{start:1,name:"value",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"LinSpace",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"num",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"OneHot",category:"creation",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"depth",type:"number"},{start:2,name:"onValue",type:"number",defaultValue:1},{start:3,name:"offValue",type:"number",defaultValue:0}],attrs:[{tfName:"axis",name:"axis",type:"number",notSupported:!0},{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Ones",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"OnesLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"RandomStandardNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"RandomUniform",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"minval",name:"minval",type:"number",defaultValue:0},{tfName:"maxval",name:"maxval",type:"number",defaultValue:1},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"RandomUniformInt",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"minval",name:"minval",type:"number"},{tfName:"maxval",name:"maxval",type:"number"},{tfName:"seed",name:"seed",type:"number",defaultValue:0},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0}]},{tfOpName:"Range",category:"creation",inputs:[{start:0,name:"start",type:"number"},{start:1,name:"stop",type:"number"},{start:2,name:"step",type:"number",defaultValue:0}],attrs:[{tfName:"Tidx",name:"dtype",type:"dtype"}]},{tfOpName:"TruncatedNormal",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"means",name:"mean",type:"number",defaultValue:0},{tfName:"stddev",name:"stdDev",type:"number",defaultValue:1},{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number",defaultValue:0,notSupported:!0},{tfName:"dtype",name:"dtype",type:"dtype"},{tfName:"T",name:"T",type:"number",notSupported:!0}]},{tfOpName:"Zeros",category:"creation",inputs:[{start:0,name:"shape",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"ZerosLike",category:"creation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"Multinomial",category:"creation",inputs:[{start:0,name:"logits",type:"tensor"},{start:1,name:"numSamples",type:"number"}],attrs:[{tfName:"seed",name:"seed",type:"number"},{tfName:"seed2",name:"seed2",type:"number"},{tfName:"T",name:"dtype",type:"dtype"},{tfName:"output_dtype",name:"output_dtype",type:"dtype"}]}],j_=[{tfOpName:"NonMaxSuppressionV2",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV3",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}]},{tfOpName:"NonMaxSuppressionV4",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0},{tfName:"T_threshold",name:"threshold",type:"dtype",notSupported:!0},{tfName:"pad_to_max_output_size",name:"padToMaxOutputSize",type:"bool"}]},{tfOpName:"NonMaxSuppressionV5",category:"dynamic",inputs:[{start:0,name:"boxes",type:"tensor"},{start:1,name:"scores",type:"tensor"},{start:2,name:"maxOutputSize",type:"number"},{start:3,name:"iouThreshold",type:"number"},{start:4,name:"scoreThreshold",type:"number"},{start:5,name:"softNmsSigma",type:"number"}]},{tfOpName:"Where",category:"dynamic",inputs:[{start:0,name:"condition",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ListDiff",category:"dynamic",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]}],V_=[{tfOpName:"LowerBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"TopKV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"k",type:"number"}],attrs:[{tfName:"sorted",name:"sorted",type:"bool"}]},{tfOpName:"UpperBound",category:"evaluation",inputs:[{start:0,name:"sortedSequence",type:"tensor"},{start:1,name:"values",type:"tensor"}]},{tfOpName:"Unique",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"UniqueV2",category:"evaluation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]}],U_=[{tfOpName:"PlaceholderWithDefault",category:"graph",inputs:[{start:0,name:"default",type:"tensor"}],attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Placeholder",category:"graph",attrs:[{tfName:"shape",name:"shape",type:"shape"},{tfName:"dtype",name:"dtype",type:"dtype"}]},{tfOpName:"Const",category:"graph"},{tfOpName:"Identity",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IdentityN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Snapshot",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Rank",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Size",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"Shape",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"ShapeN",category:"graph",inputs:[{start:0,end:0,name:"x",type:"tensors"}]},{tfOpName:"Print",category:"graph",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"data",type:"tensors"}],attrs:[{tfName:"message",name:"message",type:"string"},{tfName:"first_n",name:"firstN",type:"number",notSupported:!0},{tfName:"summarize",name:"summarize",type:"number",defaultValue:3}]},{tfOpName:"NoOp",category:"graph",inputs:[]},{tfOpName:"StopGradient",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"FakeQuantWithMinMaxVars",category:"graph",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"min",name:"min",type:"number"},{tfName:"max",name:"max",type:"number"}]}],W_=[{tfOpName:"HashTable",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"HashTableV2",category:"hash_table",inputs:[],attrs:[{tfName:"shared_name",name:"sharedName",type:"string"},{tfName:"use_node_name_sharing",name:"useNodeNameSharing",type:"bool"},{tfName:"key_dtype",name:"keyDType",type:"dtype"},{tfName:"value_dtype",name:"valueDType",type:"dtype"}]},{tfOpName:"LookupTableImport",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableImportV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFind",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableFindV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"Tin",name:"tIn",type:"dtype",notSupported:!0},{tfName:"Tout",name:"tOut",type:"dtype",notSupported:!0}]},{tfOpName:"LookupTableSize",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]},{tfOpName:"LookupTableSizeV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"}]},{tfOpName:"InitializeTable",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}]},{tfOpName:"InitializeTableV2",category:"hash_table",inputs:[{start:0,name:"tableHandle",type:"tensor"},{start:1,name:"keys",type:"tensor"},{start:2,name:"values",type:"tensor"}]}],G_=[{tfOpName:"ResizeBilinear",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"ResizeNearestNeighbor",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"size",type:"number[]"}],attrs:[{tfName:"align_corners",name:"alignCorners",type:"bool"},{tfName:"half_pixel_centers",name:"halfPixelCenters",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"CropAndResize",category:"image",inputs:[{start:0,name:"image",type:"tensor"},{start:1,name:"boxes",type:"tensor"},{start:2,name:"boxInd",type:"tensor"},{start:3,name:"cropSize",type:"number[]"}],attrs:[{tfName:"method",name:"method",type:"string"},{tfName:"extrapolation_value",name:"extrapolationValue",type:"number"}]},{tfOpName:"ImageProjectiveTransformV3",category:"image",inputs:[{start:0,name:"images",type:"tensor"},{start:1,name:"transforms",type:"tensor"},{start:2,name:"outputShape",type:"number[]"},{start:3,name:"fillValue",type:"number"}],attrs:[{tfName:"interpolation",name:"interpolation",type:"string"},{tfName:"fill_mode",name:"fillMode",type:"string"}]}],q_=[{tfOpName:"Equal",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"NotEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Greater",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"GreaterEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Less",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LessEqual",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalAnd",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalNot",category:"logical",inputs:[{start:0,name:"a",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"LogicalOr",category:"logical",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Select",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SelectV2",category:"logical",inputs:[{start:0,name:"condition",type:"tensor"},{start:1,name:"a",type:"tensor"},{start:2,name:"b",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BitwiseAnd",category:"logical",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"y",type:"tensor"}]}],H_=[{tfOpName:"_FusedMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"},{start:2,end:0,name:"args",type:"tensors"}],attrs:[{tfName:"num_args",name:"numArgs",type:"number"},{tfName:"fused_ops",name:"fusedOps",type:"string[]",defaultValue:[]},{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:1e-4},{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"leakyrelu_alpha",name:"leakyreluAlpha",type:"number",defaultValue:.2},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"MatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"transpose_a",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"transpose_b",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMul",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"BatchMatMulV2",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"b",type:"tensor"}],attrs:[{tfName:"adj_x",name:"transposeA",type:"bool",defaultValue:!1},{tfName:"adj_y",name:"transposeB",type:"bool",defaultValue:!1},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Transpose",category:"matrices",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"perm",type:"number[]"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Einsum",category:"matrices",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"equation",name:"equation",type:"string"},{tfName:"N",name:"n",type:"number",defaultValue:2},{tfName:"T",name:"dtype",type:"dtype"}]},{tfOpName:"MatrixBandPart",category:"matrices",inputs:[{start:0,name:"a",type:"tensor"},{start:1,name:"numLower",type:"tensor"},{start:1,name:"numUpper",type:"tensor"}]}],K_=[{tfOpName:"EuclideanNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool",defaultValue:!1}]},{tfOpName:"FusedBatchNorm",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV2",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"FusedBatchNormV3",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"scale",type:"tensor"},{start:2,name:"offset",type:"tensor"},{start:3,name:"mean",type:"tensor"},{start:4,name:"variance",type:"tensor"}],attrs:[{tfName:"epsilon",name:"epsilon",type:"number",defaultValue:.001},{tfName:"data_format",name:"dataFormat",type:"string",notSupported:!0}]},{tfOpName:"LRN",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"depth_radius",name:"radius",type:"number",defaultValue:5},{tfName:"bias",name:"bias",type:"number",defaultValue:1},{tfName:"alpha",name:"alpha",type:"number",defaultValue:1},{tfName:"beta",name:"beta",type:"number",defaultValue:.5}]},{tfOpName:"Softmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"LogSoftmax",category:"normalization",inputs:[{start:0,name:"x",type:"tensor"}]}],$_=[{tfOpName:"Bincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}]},{tfOpName:"DenseBincount",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"size",type:"number"},{start:2,name:"weights",type:"tensor"}],attrs:[{tfName:"binary_output",name:"binaryOutput",type:"bool"}]},{tfOpName:"Max",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Mean",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Min",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Sum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"All",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"Any",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"}]},{tfOpName:"ArgMax",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"ArgMin",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"Prod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}],attrs:[{tfName:"keep_dims",name:"keepDims",type:"bool"},{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"Cumprod",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]},{tfOpName:"Cumsum",category:"reduction",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}],attrs:[{tfName:"exclusive",name:"exclusive",type:"bool"},{tfName:"reverse",name:"reverse",type:"bool"}]}],Z_=[{tfOpName:"ConcatV2",category:"slice_join",inputs:[{start:0,end:-1,name:"tensors",type:"tensors"},{start:-1,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"Concat",category:"slice_join",inputs:[{start:1,end:0,name:"tensors",type:"tensors"},{start:0,name:"axis",type:"number"}],attrs:[{tfName:"N",name:"n",type:"number",defaultValue:2}]},{tfOpName:"GatherV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"axis",type:"number",defaultValue:0}],attrs:[{tfName:"batch_dims",name:"batchDims",type:"number",defaultValue:0}]},{tfOpName:"Gather",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",notSupported:!0}]},{tfOpName:"Reverse",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"dims",type:"bool[]"}]},{tfOpName:"ReverseV2",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number[]"}]},{tfOpName:"Slice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"size",type:"number[]"}]},{tfOpName:"StridedSlice",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"begin",type:"number[]"},{start:2,name:"end",type:"number[]"},{start:3,name:"strides",type:"number[]"}],attrs:[{tfName:"begin_mask",name:"beginMask",type:"number",defaultValue:0},{tfName:"end_mask",name:"endMask",type:"number",defaultValue:0},{tfName:"new_axis_mask",name:"newAxisMask",type:"number",defaultValue:0},{tfName:"ellipsis_mask",name:"ellipsisMask",type:"number",defaultValue:0},{tfName:"shrink_axis_mask",name:"shrinkAxisMask",type:"number",defaultValue:0}]},{tfOpName:"Pack",category:"slice_join",inputs:[{start:0,end:0,name:"tensors",type:"tensors"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0}]},{tfOpName:"Unpack",category:"slice_join",inputs:[{start:0,name:"tensor",type:"tensor"}],attrs:[{tfName:"axis",name:"axis",type:"number",defaultValue:0},{tfName:"num",name:"num",type:"number",defaultValue:0,notSupported:!0}]},{tfOpName:"Tile",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"reps",type:"number[]"}]},{tfOpName:"Split",category:"slice_join",inputs:[{start:0,name:"axis",type:"number",defaultValue:0},{start:1,name:"x",type:"tensor"}],attrs:[{tfName:"num_split",name:"numOrSizeSplits",type:"number",defaultValue:1}]},{tfOpName:"SplitV",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"numOrSizeSplits",type:"number[]"},{start:2,name:"axis",type:"number",defaultValue:0}]},{tfOpName:"ScatterNd",category:"slice_join",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"shape",type:"number[]"}]},{tfOpName:"GatherNd",category:"slice_join",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"indices",type:"tensor"}]},{tfOpName:"SparseToDense",category:"slice_join",inputs:[{start:0,name:"sparseIndices",type:"tensor"},{start:1,name:"outputShape",type:"number[]"},{start:2,name:"sparseValues",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}],attrs:[{tfName:"validate_indices",name:"validateIndices",type:"bool",defaultValue:!1,notSupported:!0}]},{tfOpName:"TensorScatterUpdate",category:"slice_join",inputs:[{start:0,name:"tensor",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"values",type:"tensor"}]}],X_=[{tfOpName:"SparseFillEmptyRows",category:"sparse",inputs:[{start:0,name:"indices",type:"tensor"},{start:1,name:"values",type:"tensor"},{start:2,name:"denseShape",type:"tensor"},{start:3,name:"defaultValue",type:"tensor"}]},{tfOpName:"SparseReshape",category:"sparse",inputs:[{start:0,name:"inputIndices",type:"tensor"},{start:1,name:"inputShape",type:"tensor"},{start:2,name:"newShape",type:"tensor"}],attrs:[{tfName:"T",name:"dtype",type:"dtype",notSupported:!0}]},{tfOpName:"SparseSegmentMean",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]},{tfOpName:"SparseSegmentSum",category:"sparse",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"indices",type:"tensor"},{start:2,name:"segmentIds",type:"tensor"}]}],Y_=[{tfOpName:"FFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"IFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"}]},{tfOpName:"RFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]},{tfOpName:"IRFFT",category:"spectral",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"fft_length",type:"number",notSupported:!0}]}],Q_=[{tfOpName:"StaticRegexReplace",category:"string",inputs:[{start:0,name:"input",type:"tensor"}],attrs:[{tfName:"pattern",name:"pattern",type:"string"},{tfName:"rewrite",name:"rewrite",type:"string"},{tfName:"replace_global",name:"replaceGlobal",type:"bool"}]},{tfOpName:"StringNGrams",category:"string",inputs:[{start:0,name:"data",type:"tensor"},{start:1,name:"dataSplits",type:"tensor"}],attrs:[{tfName:"separator",name:"separator",type:"string"},{tfName:"ngram_widths",name:"nGramWidths",type:"number[]"},{tfName:"left_pad",name:"leftPad",type:"string"},{tfName:"right_pad",name:"rightPad",type:"string"},{tfName:"pad_width",name:"padWidth",type:"number"},{tfName:"preserve_short_sequences",name:"preserveShortSequences",type:"bool"}],outputs:["ngrams","ngrams_splits"]},{tfOpName:"StringSplit",category:"string",inputs:[{start:0,name:"input",type:"tensor"},{start:1,name:"delimiter",type:"tensor"}],attrs:[{tfName:"skip_empty",name:"skipEmpty",type:"bool"}],outputs:["indices","values","shape"]},{tfOpName:"StringToHashBucketFast",category:"string",inputs:[{start:0,name:"input",type:"tensor"}],attrs:[{tfName:"num_buckets",name:"numBuckets",type:"number"}]}],J_=[{tfOpName:"Cast",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"SrcT",name:"sdtype",type:"dtype",notSupported:!0},{tfName:"DstT",name:"dtype",type:"dtype"}]},{tfOpName:"ExpandDims",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"axis",type:"number"}]},{tfOpName:"MirrorPad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"mode",name:"mode",type:"string"}]},{tfOpName:"Pad",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"}],attrs:[{tfName:"constant_value",name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"PadV2",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"padding",type:"number[]"},{start:2,name:"constantValue",type:"number",defaultValue:0}]},{tfOpName:"Reshape",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}]},{tfOpName:"EnsureShape",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}]},{tfOpName:"Squeeze",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"axis",tfDeprecatedName:"squeeze_dims",name:"axis",type:"number[]"}]},{tfOpName:"SpaceToBatchND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"paddings",type:"number[]"}]},{tfOpName:"BatchToSpaceND",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"blockShape",type:"number[]"},{start:2,name:"crops",type:"number[]"}]},{tfOpName:"DepthToSpace",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"}],attrs:[{tfName:"block_size",name:"blockSize",type:"number"},{tfName:"data_format",name:"dataFormat",type:"string"}]},{tfOpName:"BroadcastTo",category:"transformation",inputs:[{start:0,name:"x",type:"tensor"},{start:1,name:"shape",type:"number[]"}],attrs:[]},{tfOpName:"BroadcastArgs",category:"transformation",inputs:[{start:0,name:"s0",type:"tensor"},{start:1,name:"s1",type:"tensor"}],attrs:[]}];class eT{static get Instance(){return this._instance||(this._instance=new this)}constructor(){const e=[].concat(...[s,r,o,l,u,c,h,d,p,m,f,g,y,b,v,k,w,A,x].map((e=>e.json)));this.opMappers=e.reduce(((e,t)=>(e[t.tfOpName]=t,e)),{})}transformGraph(e,t={}){const n=e.node,a=[],i=[],s=[],r=n.reduce(((e,t)=>(e[t.name]=this.mapNode(t),t.op.startsWith("Placeholder")?a.push(e[t.name]):"Const"===t.op?i.push(e[t.name]):null!=t.input&&0!==t.input.length||s.push(e[t.name]),e)),{});let o=[];const l=[];let u={},c={};null!=t&&(u=this.mapSignatureEntries(t.inputs),c=this.mapSignatureEntries(t.outputs));const h=Object.keys(r);h.forEach((e=>{const t=r[e];t.inputNames.forEach(((e,n)=>{const[a,,i]=N_(e),s=r[a];if(null!=s.outputs){const e=s.outputs.indexOf(i);if(-1!==e){const i=`${a}:${e}`;t.inputNames[n]=i}}t.inputs.push(s),s.children.push(t)}))})),0===Object.keys(c).length?h.forEach((e=>{const t=r[e];0===t.children.length&&l.push(t)})):Object.keys(c).forEach((e=>{const[t]=N_(e),n=r[t];null!=n&&(n.signatureKey=c[e],l.push(n))})),Object.keys(u).length>0?Object.keys(u).forEach((e=>{const[t]=N_(e),n=r[t];n&&(n.signatureKey=u[e],o.push(n))})):o=a;let d={};null!=e.library&&null!=e.library.function&&(d=e.library.function.reduce(((e,t)=>(e[t.signature.name]=this.mapFunction(t),e)),{}));const p={nodes:r,inputs:o,outputs:l,weights:i,placeholders:a,signature:t,functions:d};return s.length>0&&(p.initNodes=s),p}mapSignatureEntries(e){return Object.keys(e||{}).reduce(((t,n)=>(t[e[n].name]=n,t)),{})}mapNode(e){const t=E_(e.op)||this.opMappers[e.op]||{};null==e.attr&&(e.attr={});const n={name:e.name,op:e.op,category:t.category,inputNames:(e.input||[]).map((e=>e.startsWith("^")?e.slice(1):e)),inputs:[],children:[],inputParams:{},attrParams:{},rawAttrs:e.attr,outputs:t.outputs};return null!=t.inputs&&(n.inputParams=t.inputs.reduce(((e,t)=>(e[t.name]={type:t.type,inputIndexStart:t.start,inputIndexEnd:t.end},e)),{})),null!=t.attrs&&(n.attrParams=t.attrs.reduce(((t,n)=>{const a=n.type;let i;switch(n.type){case"string":i=nT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=nT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"string[]":i=dT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=dT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"number":i=iT(e.attr,n.tfName,n.defaultValue||0),void 0===i&&n.tfDeprecatedName&&(i=iT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"number[]":i=hT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=hT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"bool":i=aT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=aT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"bool[]":i=mT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=mT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"shape":i=cT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=cT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"shape[]":i=pT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=pT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"dtype":i=oT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=oT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"dtype[]":i=lT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=lT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"func":i=rT(e.attr,n.tfName,n.defaultValue),void 0===i&&n.tfDeprecatedName&&(i=rT(e.attr,n.tfDeprecatedName,n.defaultValue));break;case"tensor":case"tensors":break;default:throw new Error(`Unsupported param type: ${n.type} for op: ${e.op}`)}return t[n.name]={value:i,type:a},t}),{})),n}mapFunction(e){const t=e.nodeDef,n=[];let a={};null!=t&&(a=t.reduce(((e,t)=>(e[t.name]=this.mapNode(t),"Const"===t.op&&n.push(e[t.name]),e)),{}));const i=[],s=[];e.signature.inputArg.forEach((e=>{const[t]=N_(e.name),n={name:t,op:"Placeholder",inputs:[],inputNames:[],category:"graph",inputParams:{},attrParams:{dtype:{value:sT(e.type),type:"dtype"}},children:[]};n.signatureKey=e.name,i.push(n),a[t]=n}));Object.keys(a).forEach((e=>{const t=a[e];t.inputNames.forEach(((e,n)=>{const[i,,s]=N_(e),r=a[i];if(null!=r.outputs){const e=r.outputs.indexOf(s);if(-1!==e){const a=`${i}:${e}`;t.inputNames[n]=a}}t.inputs.push(r),r.children.push(t)}))}));const r=e.ret;e.signature.outputArg.forEach((e=>{const[t,n]=N_(r[e.name]),i=a[t];null!=i&&(i.defaultOutput=n,s.push(i))}));const o=this.mapArgsToSignature(e);return{nodes:a,inputs:i,outputs:s,weights:n,placeholders:[],signature:o}}mapArgsToSignature(e){return{methodName:e.signature.name,inputs:e.signature.inputArg.reduce(((e,t)=>(e[t.name]=this.mapArgToTensorInfo(t),e)),{}),outputs:e.signature.outputArg.reduce(((t,n)=>(t[n.name]=this.mapArgToTensorInfo(n,e.ret),t)),{})}}mapArgToTensorInfo(e,t){let n=e.name;return null!=t&&(n=t[n]),{name:n,dtype:e.type}}}function tT(e,t){const n=Array.isArray(e)?String.fromCharCode.apply(null,e):function(e){const t=cr().global;if(void 0!==t.atob)return t.atob(e);if("undefined"!=typeof Buffer)return new Buffer(e,"base64").toString();throw new Error("Unable to decode base64 in this environment. Missing built-in atob() or Buffer()")}(e);return t?n:n.toLowerCase()}function nT(e,t,n,a=!1){const i=e[t];return null!=i?tT(i.s,a):n}function aT(e,t,n){const a=e[t];return a?a.b:n}function iT(e,t,n){const a=e[t]||{},i=null!=a.i?a.i:null!=a.f?a.f:n;return"number"==typeof i?i:parseInt(i,10)}function sT(e){switch("string"==typeof e&&(e=A_[e]),e){case A_.DT_FLOAT:case A_.DT_HALF:return"float32";case A_.DT_INT32:case A_.DT_INT64:case A_.DT_INT8:case A_.DT_UINT8:return"int32";case A_.DT_BOOL:return"bool";case A_.DT_DOUBLE:return"float32";case A_.DT_STRING:return"string";case A_.DT_COMPLEX64:case A_.DT_COMPLEX128:return"complex64";default:return null}}function rT(e,t,n){const a=e[t];return a&&a.func?a.func.name:n}function oT(e,t,n){const a=e[t];return a&&a.type?sT(a.type):n}function lT(e,t,n){const a=e[t];return a&&a.list&&a.list.type?a.list.type.map((e=>sT(e))):n}function uT(e){if(!e.unknownRank)return null!=e.dim?e.dim.map((e=>"number"==typeof e.size?e.size:parseInt(e.size,10))):[]}function cT(e,t,n){const a=e[t];return a&&a.shape?uT(a.shape):n}function hT(e,t,n){const a=e[t];return a?((a.list.f&&a.list.f.length?a.list.f:a.list.i)||[]).map((e=>"number"==typeof e?e:parseInt(e,10))):n}function dT(e,t,n,a=!1){const i=e[t];return i&&i.list&&i.list.s?i.list.s.map((e=>tT(e,a))):n}function pT(e,t,n){const a=e[t];return a&&a.list&&a.list.shape?a.list.shape.map((e=>uT(e))):n}function mT(e,t,n){const a=e[t];return a&&a.list&&a.list.b?a.list.b:n}class fT{constructor(e,t,n){this.node=e,this.tensorMap=t,this.context=n,this.inputs=[],this.attrs={},this.inputs=e.inputNames.map((e=>this.getInput(e))),null!=e.rawAttrs&&(this.attrs=Object.keys(e.rawAttrs).reduce(((e,t)=>(e[t]=this.getAttr(t),e)),{}))}getInput(e){return T_(e,this.tensorMap,this.context)}getAttr(e,t){const n=this.node.rawAttrs[e];if(null!=n.tensor)return T_(e,this.tensorMap,this.context);if(null!=n.i||null!=n.f)return iT(this.node.rawAttrs,e,t);if(null!=n.s)return nT(this.node.rawAttrs,e,t);if(null!=n.b)return aT(this.node.rawAttrs,e,t);if(null!=n.shape)return cT(this.node.rawAttrs,e,t);if(null!=n.type)return oT(this.node.rawAttrs,e,t);if(null!=n.list){if(null!=n.list.i||null!=n.list.f)return hT(this.node.rawAttrs,e,t);if(null!=n.list.s)return dT(this.node.rawAttrs,e,t);if(null!=n.list.shape)return pT(this.node.rawAttrs,e,t);if(null!=n.list.b)return mT(this.node.rawAttrs,e,t);if(null!=n.list.type)return lT(this.node.rawAttrs,e,t)}return t}}function gT(e,t,n=""){if("number"!=typeof e&&"number"!=typeof t){Ns(e.length===t.length,(()=>n+` Shapes ${e} and ${t} must match`));for(let a=0;an+` Shapes ${e} and ${t} must match`))}}}function yT(e){return"number"!=typeof e&&!e.some((e=>e<0))}function bT(e,t,n){let a=vT(e,n);const i=!yT(a);if(i&&0===t.length)throw new Error(`Tried to calculate elements of an empty list with non-fully-defined elementShape: ${a}`);if(i&&t.forEach((e=>{a=vT(e.shape,a)})),!yT(a))throw new Error(`Non-fully-defined elementShape: ${a}`);return a}function vT(e,t){if("number"==typeof e)return t;if("number"==typeof t)return e;if(e.length!==t.length)throw new Error(`Incompatible ranks during merge: ${e} vs. ${t}`);const n=[];for(let a=0;a=0&&s>=0&&i!==s)throw new Error(`Incompatible shape during merge: ${e} vs. ${t}`);n[a]=i>=0?i:s}return n}class kT{constructor(e,t,n,a,i,s,r){this.name=e,this.dtype=t,this.maxSize=n,this.elementShape=a,this.identicalElementShapes=i,this.dynamicSize=s,this.clearAfterRead=r,this.tensors=[],this.closed_=!1,this.idTensor=Rd(0),mh(this.idTensor)}get id(){return this.idTensor.id}get closed(){return this.closed_}clearAndClose(e){this.tensors.forEach((t=>{null!=e&&e.has(t.tensor.id)||t.tensor.dispose()})),this.tensors=[],this.closed_=!0,this.idTensor.dispose()}size(){return this.tensors.length}read(e){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||e>=this.size())throw new Error(`Tried to read from index ${e}, but array size is: ${this.size()}`);const t=this.tensors[e];if(t.cleared)throw new Error(`TensorArray ${this.name}: Could not read index ${e} twice because it was cleared after a previous read (perhaps try setting clear_after_read = false?).`);return this.clearAfterRead&&(t.cleared=!0),t.read=!0,t.tensor}readMany(e){return e.map((e=>this.read(e)))}write(e,t){if(this.closed_)throw new Error(`TensorArray ${this.name} has already been closed.`);if(e<0||!this.dynamicSize&&e>=this.maxSize)throw new Error(`Tried to write to index ${e}, but array is not resizeable and size is: ${this.maxSize}`);const n=this.tensors[e]||{};if(t.dtype!==this.dtype)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e},\n because the value dtype is ${t.dtype}, but TensorArray dtype is ${this.dtype}.`);if(0!==this.size()||null!=this.elementShape&&0!==this.elementShape.length||(this.elementShape=t.shape),gT(this.elementShape,t.shape,`TensorArray ${this.name}: Could not write to TensorArray index ${e}.`),n.read)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been read.`);if(n.written)throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${e}, because it has already been written.`);n.tensor=t,mh(t),n.written=!0,this.tensors[e]=n}writeMany(e,t){if(e.length!==t.length)throw new Error(`TensorArray ${this.name}: could not write multiple tensors,because the index size: ${e.length} is not the same as tensors size: ${t.length}.`);e.forEach(((e,n)=>this.write(e,t[n])))}gather(e,t){if(t&&t!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${t}`);if(e)e=e.slice(0,this.size());else{e=[];for(let t=0;t=this.maxSize)throw new Error(`Max index must be < array size (${n} vs. ${this.maxSize})`);this.writeMany(e,Ly(t,0))}split(e,t){if(t.dtype!==this.dtype)throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${t.dtype}`);let n=0;const a=e.map((e=>(n+=e,n)));if(n!==t.shape[0])throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${n}, and tensor's shape is: ${t.shape}`);if(!this.dynamicSize&&e.length!==this.maxSize)throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${e.length}), and the TensorArray is not marked as dynamically resizeable`);const i=0===n?0:t.size/n,s=[];dh((()=>{t=vm(t,[1,n,i]);for(let n=0;n{if(n!==e.dtype)throw new Error(`Invalid data types; op elements ${n}, but list elements ${e.dtype}`);gT(t,e.shape,"TensorList shape mismatch: "),mh(e)})),this.idTensor=Rd(0),this.maxNumElements=a,mh(this.idTensor)}copy(){return new wT([...this.tensors],this.elementShape,this.elementDtype)}clearAndClose(e){this.tensors.forEach((t=>{null!=e&&e.has(t.id)||t.dispose()})),this.tensors.length=0,this.idTensor.dispose()}size(){return this.tensors.length}stack(e,t,n=-1){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(-1!==n&&this.tensors.length!==n)throw new Error(`Operation expected a list with ${n} elements but got a list with ${this.tensors.length} elements.`);gT(e,this.elementShape,"TensorList shape mismatch: ");const a=bT(this.elementShape,this.tensors,e);return dh((()=>{const e=this.tensors.map((e=>vm(e,a)));return wy(e,0)}))}popBack(e,t){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);if(0===this.size())throw new Error("Trying to pop from an empty list.");const n=bT(this.elementShape,this.tensors,e),a=this.tensors.pop();return a.kept=!1,gT(a.shape,e,"TensorList shape mismatch: "),vm(a,n)}pushBack(e){if(e.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${this.elementDtype}`);if(gT(e.shape,this.elementShape,"TensorList shape mismatch: "),this.maxNumElements===this.size())throw new Error("Trying to push element into a full list.");mh(e),this.tensors.push(e)}resize(e){if(e<0)throw new Error(`TensorListResize expects size to be non-negative. Got: ${e}`);if(-1!==this.maxNumElements&&e>this.maxNumElements)throw new Error(`TensorListResize input size ${e} is greater maxNumElement ${this.maxNumElements}.`);const t=new wT([],this.elementShape,this.elementDtype,this.maxNumElements);t.tensors.length=e;for(let n=0;nthis.tensors.length)throw new Error(`Trying to access element ${e} in a list with ${this.tensors.length} elements.`);if(null==this.tensors[e])throw new Error(`element at index ${e} is null.`);gT(this.tensors[e].shape,t,"TensorList shape mismatch: ");const a=bT(this.elementShape,this.tensors,t);return vm(this.tensors[e],a)}setItem(e,t){if(t.dtype!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t.dtype}, but list elements ${this.elementDtype}`);if(e<0||-1!==this.maxNumElements&&e>=this.maxNumElements)throw new Error(`Trying to set element ${e} in a list with max ${this.maxNumElements} elements.`);gT(this.elementShape,t.shape,"TensorList shape mismatch: "),mh(t),null!=this.tensors[e]&&(this.tensors[e].kept=!1),this.tensors[e]=t}gather(e,t,n){if(t!==this.elementDtype)throw new Error(`Invalid data types; op elements ${t}, but list elements ${this.elementDtype}`);gT(this.elementShape,n,"TensorList shape mismatch: "),e=e.slice(0,this.size());const a=bT(this.elementShape,this.tensors,n);return 0===e.length?oh([],[0].concat(a)):dh((()=>{const t=e.map((e=>vm(this.tensors[e],a)));return wy(t,0)}))}concat(e,t){if(e&&e!==this.elementDtype)throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${e}`);gT(this.elementShape,t,"TensorList shape mismatch: ");const n=bT(this.elementShape,this.tensors,t);return 0===this.size()?oh([],[0].concat(n)):dh((()=>{const e=this.tensors.map((e=>vm(e,n)));return Am(e,0)}))}}const AT=async(e,t,n)=>{switch(e.op){case"If":case"StatelessIf":{const a=__("thenBranch",e,t,n),i=__("elseBranch",e,t,n),s=__("cond",e,t,n),r=__("args",e,t,n);return(await s.data())[0]?n.functionMap[a].executeFunctionAsync(r,n.tensorArrayMap,n.tensorListMap):n.functionMap[i].executeFunctionAsync(r,n.tensorArrayMap,n.tensorListMap)}case"While":case"StatelessWhile":{const a=__("body",e,t,n),i=__("cond",e,t,n),s=__("args",e,t,n),r=await n.functionMap[i].executeFunctionAsync(s,n.tensorArrayMap,n.tensorListMap),o=s.map((e=>e.id));let l=await r[0].data();r.forEach((e=>{e.kept||-1!==o.indexOf(e.id)||e.dispose()}));let u=s;for(;l[0];){const e=u;u=await n.functionMap[a].executeFunctionAsync(u,n.tensorArrayMap,n.tensorListMap);const t=u.map((e=>e.id));e.forEach((e=>{e.kept||-1!==o.indexOf(e.id)||-1!==t.indexOf(e.id)||e.dispose()}));const s=await n.functionMap[i].executeFunctionAsync(u,n.tensorArrayMap,n.tensorListMap);l=await s[0].data(),s.forEach((e=>{e.kept||-1!==o.indexOf(e.id)||-1!==t.indexOf(e.id)||e.dispose()}))}return u}case"LoopCond":return[O_(__("pred",e,t,n))];case"Switch":{const a=__("pred",e,t,n);let i=__("data",e,t,n);return i.kept||(i=O_(i)),(await a.data())[0]?[void 0,i]:[i,void 0]}case"Merge":{const a=e.inputNames.find((e=>void 0!==T_(e,t,n)));if(a){return[O_(T_(a,t,n))]}return}case"Enter":{const a=__("frameName",e,t,n),i=__("tensor",e,t,n);return n.enterFrame(a),[O_(i)]}case"Exit":{const a=__("tensor",e,t,n);return n.exitFrame(),[O_(a)]}case"NextIteration":{const a=__("tensor",e,t,n);return n.nextIteration(),[O_(a)]}case"TensorArrayV3":{const a=__("size",e,t,n),i=__("dtype",e,t,n),s=__("elementShape",e,t,n),r=__("dynamicSize",e,t,n),o=__("clearAfterRead",e,t,n),l=__("identicalElementShapes",e,t,n),u=__("name",e,t,n),c=new kT(u,i,a,s,l,r,o);return n.addTensorArray(c),[c.idTensor,Rd(1)]}case"TensorArrayWriteV3":{const a=__("tensorArrayId",e,t,n),i=__("index",e,t,n),s=__("tensor",e,t,n),r=n.getTensorArray(a.id);return r.write(i,s),[r.idTensor]}case"TensorArrayReadV3":{const a=__("tensorArrayId",e,t,n),i=__("index",e,t,n);return[n.getTensorArray(a.id).read(i)]}case"TensorArrayGatherV3":{const a=__("tensorArrayId",e,t,n),i=__("indices",e,t,n),s=__("dtype",e,t,n);return[n.getTensorArray(a.id).gather(i,s)]}case"TensorArrayScatterV3":{const a=__("tensorArrayId",e,t,n),i=__("indices",e,t,n),s=__("tensor",e,t,n),r=n.getTensorArray(a.id);return r.scatter(i,s),[r.idTensor]}case"TensorArrayConcatV3":{const a=__("tensorArrayId",e,t,n),i=n.getTensorArray(a.id),s=__("dtype",e,t,n);return[i.concat(s)]}case"TensorArraySplitV3":{const a=__("tensorArrayId",e,t,n),i=__("tensor",e,t,n),s=__("lengths",e,t,n),r=n.getTensorArray(a.id);return r.split(s,i),[r.idTensor]}case"TensorArraySizeV3":{const a=__("tensorArrayId",e,t,n);return[Rd(n.getTensorArray(a.id).size(),"int32")]}case"TensorArrayCloseV3":{const a=__("tensorArrayId",e,t,n),i=n.getTensorArray(a.id);return i.clearAndClose(),[i.idTensor]}case"TensorListSetItem":{const a=__("tensorListId",e,t,n),i=__("index",e,t,n),s=__("tensor",e,t,n),r=n.getTensorList(a.id);return r.setItem(i,s),[r.idTensor]}case"TensorListGetItem":{const a=__("tensorListId",e,t,n),i=__("index",e,t,n),s=__("elementShape",e,t,n),r=__("elementDType",e,t,n);return[n.getTensorList(a.id).getItem(i,s,r)]}case"TensorListScatterV2":case"TensorListScatter":{const a=__("indices",e,t,n),i=function(e,t,n,a){if(t.length!==e.shape[0])throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${t.length} vs. ${e.shape[0]}`);const i=Math.max(...t);if(null!=a&&-1!==a&&i>=a)throw new Error(`Max index must be < array size (${i} vs. ${a})`);const s=new wT([],n,e.dtype,a),r=Ly(e,0);return t.forEach(((e,t)=>{s.setItem(e,r[t])})),s}(__("tensor",e,t,n),a,__("elementShape",e,t,n),__("numElements",e,t,n));return n.addTensorList(i),[i.idTensor]}case"TensorListReserve":case"EmptyTensorList":{const a=__("elementShape",e,t,n),i=__("elementDType",e,t,n);let s;s="TensorListReserve"===e.op?"numElements":"maxNumElements";const r=__(s,e,t,n),o=function(e,t,n,a){return new wT([],e,t,a)}(a,i,0,"TensorListReserve"===e.op?-1:r);return n.addTensorList(o),[o.idTensor]}case"TensorListGather":{const a=__("tensorListId",e,t,n),i=__("indices",e,t,n),s=__("elementShape",e,t,n),r=__("elementDType",e,t,n);return[n.getTensorList(a.id).gather(i,r,s)]}case"TensorListStack":{const a=__("tensorListId",e,t,n),i=__("elementShape",e,t,n),s=__("elementDType",e,t,n),r=__("numElements",e,t,n);return[n.getTensorList(a.id).stack(i,s,r)]}case"TensorListFromTensor":{const a=function(e,t,n){const a=e.dtype;if(e.shape.length<1)throw new Error(`Tensor must be at least a vector, but saw shape: ${e.shape}`);if(e.dtype!==n)throw new Error(`Invalid data types; op elements ${e.dtype}, but list elements ${n}`);gT(e.shape.slice(1),t,"TensorList shape mismatch: ");const i=Ly(e);return new wT(i,t,a)}(__("tensor",e,t,n),__("elementShape",e,t,n),__("elementDType",e,t,n));return n.addTensorList(a),[a.idTensor]}case"TensorListConcat":case"TensorListConcatV2":{const a=__("tensorListId",e,t,n),i=n.getTensorList(a.id),s=__("dtype",e,t,n),r=__("elementShape",e,t,n);return[i.concat(s,r)]}case"TensorListPushBack":{const a=__("tensorListId",e,t,n),i=__("tensor",e,t,n),s=n.getTensorList(a.id);return s.pushBack(i),[s.idTensor]}case"TensorListPopBack":{const a=__("tensorListId",e,t,n),i=__("elementShape",e,t,n),s=__("elementDType",e,t,n);return[n.getTensorList(a.id).popBack(i,s)]}case"TensorListSplit":{const a=__("tensor",e,t,n),i=__("elementShape",e,t,n),s=function(e,t,n){let a=0;const i=t.map((e=>(a+=e,a)));if(a!==e.shape[0])throw new Error(`Expected sum of lengths to be equal to\n tensor.shape[0], but sum of lengths is\n ${a}, and tensor's shape is: ${e.shape}`);const s=vT(e.shape.slice(1),n),r=0===a?0:e.size/a,o=dh((()=>{const n=[];e=vm(e,[1,a,r]);for(let a=0;ae.dispose())),this.tensorMap.clear(),this.handle.dispose()}size(){return this.tensorMap.size}tensorSize(){return Rd(this.size(),"int32")}async import(e,t){this.checkKeyAndValueTensor(e,t);const n=await e.data();return this.tensorMap.forEach((e=>e.dispose())),this.tensorMap.clear(),dh((()=>{const e=Ly(t),a=n.length,i=e.length;Ns(a===i,(()=>`The number of elements doesn't match, keys has ${a} elements, the values has ${i} elements.`));for(let t=0;t{const e=[];for(let a=0;a{switch(e.category){case"arithmetic":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"BiasAdd":case"AddV2":case"Add":return[a.add(__("a",e,t,n),__("b",e,t,n))];case"AddN":return[a.addN(__("tensors",e,t,n))];case"FloorMod":case"Mod":return[a.mod(__("a",e,t,n),__("b",e,t,n))];case"Mul":return[a.mul(__("a",e,t,n),__("b",e,t,n))];case"RealDiv":case"Div":return[a.div(__("a",e,t,n),__("b",e,t,n))];case"DivNoNan":return[a.divNoNan(__("a",e,t,n),__("b",e,t,n))];case"FloorDiv":return[a.floorDiv(__("a",e,t,n),__("b",e,t,n))];case"Sub":return[a.sub(__("a",e,t,n),__("b",e,t,n))];case"Minimum":return[a.minimum(__("a",e,t,n),__("b",e,t,n))];case"Maximum":return[a.maximum(__("a",e,t,n),__("b",e,t,n))];case"Pow":return[a.pow(__("a",e,t,n),__("b",e,t,n))];case"SquaredDifference":return[a.squaredDifference(__("a",e,t,n),__("b",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"basic_math":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Abs":case"ComplexAbs":return[a.abs(__("x",e,t,n))];case"Acos":return[a.acos(__("x",e,t,n))];case"Acosh":return[a.acosh(__("x",e,t,n))];case"Asin":return[a.asin(__("x",e,t,n))];case"Asinh":return[a.asinh(__("x",e,t,n))];case"Atan":return[a.atan(__("x",e,t,n))];case"Atan2":return[a.atan2(__("x",e,t,n),__("y",e,t,n))];case"Atanh":return[a.atanh(__("x",e,t,n))];case"Ceil":return[a.ceil(__("x",e,t,n))];case"Complex":return[a.complex(__("real",e,t,n),__("imag",e,t,n))];case"Cos":return[a.cos(__("x",e,t,n))];case"Cosh":return[a.cosh(__("x",e,t,n))];case"Elu":return[a.elu(__("x",e,t,n))];case"Erf":return[a.erf(__("x",e,t,n))];case"Exp":return[a.exp(__("x",e,t,n))];case"Expm1":return[a.expm1(__("x",e,t,n))];case"Floor":return[a.floor(__("x",e,t,n))];case"Log":return[a.log(__("x",e,t,n))];case"Log1p":return[a.log1p(__("x",e,t,n))];case"Imag":return[a.imag(__("x",e,t,n))];case"Neg":return[a.neg(__("x",e,t,n))];case"Reciprocal":return[a.reciprocal(__("x",e,t,n))];case"Real":return[a.real(__("x",e,t,n))];case"Relu":return[a.relu(__("x",e,t,n))];case"Round":return[a.round(__("x",e,t,n))];case"Selu":return[a.selu(__("x",e,t,n))];case"Sigmoid":return[a.sigmoid(__("x",e,t,n))];case"Sin":return[a.sin(__("x",e,t,n))];case"Sign":return[a.sign(__("x",e,t,n))];case"Sinh":return[a.sinh(__("x",e,t,n))];case"Softplus":return[a.softplus(__("x",e,t,n))];case"Sqrt":return[a.sqrt(__("x",e,t,n))];case"Square":return[a.square(__("x",e,t,n))];case"Tanh":return[a.tanh(__("x",e,t,n))];case"Tan":return[a.tan(__("x",e,t,n))];case"ClipByValue":return[a.clipByValue(__("x",e,t,n),__("clipValueMin",e,t,n),__("clipValueMax",e,t,n))];case"Relu6":return[a.relu6(__("x",e,t,n))];case"Rsqrt":return[a.rsqrt(T_(e.inputNames[0],t,n))];case"LeakyRelu":return[a.leakyRelu(__("x",e,t,n),__("alpha",e,t,n))];case"Prelu":return[a.prelu(__("x",e,t,n),__("alpha",e,t,n))];case"IsNan":return[a.isNaN(T_(e.inputNames[0],t,n))];case"IsInf":return[a.isInf(T_(e.inputNames[0],t,n))];case"IsFinite":return[a.isFinite(T_(e.inputNames[0],t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"control":return AT(e,t,n);case"convolution":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Conv1D":{const i=__("stride",e,t,n),s=__("pad",e,t,n),r=__("dataFormat",e,t,n).toUpperCase(),o=__("dilation",e,t,n);return[a.conv1d(__("x",e,t,n),__("filter",e,t,n),i,s,r,o)]}case"Conv2D":{const i=__("strides",e,t,n),s=z_(e,t,n),r=__("dataFormat",e,t,n).toUpperCase(),o=__("dilations",e,t,n);return[a.conv2d(__("x",e,t,n),__("filter",e,t,n),[i[1],i[2]],s,r,[o[1],o[2]])]}case"_FusedConv2D":{const{stride:i,pad:s,dataFormat:r,dilations:o,biasArg:l,preluArg:u,activationFunc:c,leakyreluAlpha:h}=xT(e,t,n);return[a.fused.conv2d({x:__("x",e,t,n),filter:__("filter",e,t,n),strides:[i[1],i[2]],pad:s,dataFormat:r,dilations:[o[1],o[2]],bias:l,activation:c,preluActivationWeights:u,leakyreluAlpha:h})]}case"FusedDepthwiseConv2dNative":{const{stride:i,pad:s,dataFormat:r,dilations:o,biasArg:l,preluArg:u,activationFunc:c,leakyreluAlpha:h}=xT(e,t,n);return[a.fused.depthwiseConv2d({x:__("x",e,t,n),filter:__("filter",e,t,n),strides:[i[1],i[2]],pad:s,dataFormat:r,dilations:[o[1],o[2]],bias:l,activation:c,preluActivationWeights:u,leakyreluAlpha:h})]}case"Conv2DBackpropInput":case"Conv2dTranspose":{const i=__("outputShape",e,t,n),s=__("strides",e,t,n),r=z_(e,t,n);return[a.conv2dTranspose(__("x",e,t,n),__("filter",e,t,n),i,[s[1],s[2]],r)]}case"DepthwiseConv2dNative":case"DepthwiseConv2d":{const i=__("strides",e,t,n),s=z_(e,t,n),r=__("dilations",e,t,n),o=__("dataFormat",e,t,n).toUpperCase();return[a.depthwiseConv2d(__("input",e,t,n),__("filter",e,t,n),[i[1],i[2]],s,o,[r[1],r[2]])]}case"Conv3D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("dataFormat",e,t,n).toUpperCase(),o=__("dilations",e,t,n);return[a.conv3d(__("x",e,t,n),__("filter",e,t,n),[i[1],i[2],i[3]],s,r,[o[1],o[2],o[3]])]}case"AvgPool":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.avgPool(__("x",e,t,n),[r[1],r[2]],[i[1],i[2]],s)]}case"MaxPool":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.maxPool(__("x",e,t,n),[r[1],r[2]],[i[1],i[2]],s)]}case"MaxPoolWithArgmax":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n),o=__("includeBatchInIndex",e,t,n),{result:l,indexes:u}=a.maxPoolWithArgmax(__("x",e,t,n),[r[1],r[2]],[i[1],i[2]],s,o);return[l,u]}case"AvgPool3D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.avgPool3d(__("x",e,t,n),[r[1],r[2],r[3]],[i[1],i[2],i[3]],s)]}case"MaxPool3D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("kernelSize",e,t,n);return[a.maxPool3d(__("x",e,t,n),[r[1],r[2],r[3]],[i[1],i[2],i[3]],s)]}case"Dilation2D":{const i=__("strides",e,t,n),s=__("pad",e,t,n),r=__("dilations",e,t,n),o=i[1],l=i[2],u=r[1],c=r[2];return[a.dilation2d(__("x",e,t,n),__("filter",e,t,n),[o,l],s,[u,c],"NHWC")]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"creation":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Fill":{const i=__("shape",e,t,n),s=__("dtype",e,t,n),r=__("value",e,t,n);return[a.fill(i,r,s)]}case"LinSpace":{const i=__("start",e,t,n),s=__("stop",e,t,n),r=__("num",e,t,n);return[a.linspace(i,s,r)]}case"Multinomial":{const i=__("logits",e,t,n),s=__("numSamples",e,t,n),r=__("seed",e,t,n);return[a.multinomial(i,s,r)]}case"OneHot":{const i=__("indices",e,t,n),s=__("depth",e,t,n),r=__("onValue",e,t,n),o=__("offValue",e,t,n),l=__("dtype",e,t,n);return[a.oneHot(i,s,r,o,l)]}case"Ones":return[a.ones(__("shape",e,t,n),__("dtype",e,t,n))];case"OnesLike":return[a.onesLike(__("x",e,t,n))];case"RandomStandardNormal":return[a.randomStandardNormal(__("shape",e,t,n),__("dtype",e,t,n),__("seed",e,t,n))];case"RandomUniform":return[a.randomUniform(__("shape",e,t,n),__("minval",e,t,n),__("maxval",e,t,n),__("dtype",e,t,n))];case"RandomUniformInt":return[a.randomUniformInt(__("shape",e,t,n),__("minval",e,t,n),__("maxval",e,t,n),__("seed",e,t,n))];case"Range":{const i=__("start",e,t,n),s=__("stop",e,t,n),r=__("step",e,t,n);return[a.range(i,s,r,__("dtype",e,t,n))]}case"TruncatedNormal":{const i=__("shape",e,t,n),s=__("mean",e,t,n),r=__("stdDev",e,t,n),o=__("seed",e,t,n);return[a.truncatedNormal(i,s,r,__("dtype",e,t,n),o)]}case"Zeros":return[a.zeros(__("shape",e,t,n),__("dtype",e,t,n))];case"ZerosLike":return[a.zerosLike(__("x",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"dynamic":return(async(e,t,n,a,i=C)=>{switch(e.op){case"NonMaxSuppressionV5":{const{boxes:a,scores:s,maxOutputSize:r,iouThreshold:o,scoreThreshold:l,softNmsSigma:u}=CT(e,t,n),c=await i.image.nonMaxSuppressionWithScoreAsync(a,s,r,o,l,u);return[c.selectedIndices,c.selectedScores]}case"NonMaxSuppressionV4":{const{boxes:a,scores:s,maxOutputSize:r,iouThreshold:o,scoreThreshold:l}=CT(e,t,n),u=__("padToMaxOutputSize",e,t,n),c=await i.image.nonMaxSuppressionPaddedAsync(a,s,r,o,l,u);return[c.selectedIndices,c.validOutputs]}case"NonMaxSuppressionV3":case"NonMaxSuppressionV2":{const{boxes:a,scores:s,maxOutputSize:r,iouThreshold:o,scoreThreshold:l}=CT(e,t,n);return[await i.image.nonMaxSuppressionAsync(a,s,r,o,l)]}case"Where":{const a=i.cast(__("condition",e,t,n),"bool"),s=[await i.whereAsync(a)];return a.dispose(),s}case"ListDiff":return i.setdiff1dAsync(__("x",e,t,n),__("y",e,t,n));default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n);case"evaluation":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"LowerBound":{const i=__("sortedSequence",e,t,n),s=__("values",e,t,n);return[a.lowerBound(i,s)]}case"TopKV2":{const i=__("x",e,t,n),s=__("k",e,t,n),r=__("sorted",e,t,n),o=a.topk(i,s,r);return[o.values,o.indices]}case"UpperBound":{const i=__("sortedSequence",e,t,n),s=__("values",e,t,n);return[a.upperBound(i,s)]}case"Unique":{const i=__("x",e,t,n),s=a.unique(i);return[s.values,s.indices]}case"UniqueV2":{const i=__("x",e,t,n),s=__("axis",e,t,n),r=a.unique(i,s);return[r.values,r.indices]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"image":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"ResizeBilinear":{const i=__("images",e,t,n),s=__("size",e,t,n),r=__("alignCorners",e,t,n),o=__("halfPixelCenters",e,t,n);return[a.image.resizeBilinear(i,[s[0],s[1]],r,o)]}case"ResizeNearestNeighbor":{const i=__("images",e,t,n),s=__("size",e,t,n),r=__("alignCorners",e,t,n),o=__("halfPixelCenters",e,t,n);return[a.image.resizeNearestNeighbor(i,[s[0],s[1]],r,o)]}case"CropAndResize":{const i=__("image",e,t,n),s=__("boxes",e,t,n),r=__("boxInd",e,t,n),o=__("cropSize",e,t,n),l=__("method",e,t,n),u=__("extrapolationValue",e,t,n);return[a.image.cropAndResize(i,s,r,o,l,u)]}case"ImageProjectiveTransformV3":{const i=__("images",e,t,n),s=__("transforms",e,t,n),r=__("outputShape",e,t,n),o=__("fillValue",e,t,n),l=__("interpolation",e,t,n),u=__("fillMode",e,t,n);return[a.image.transform(i,s,l.toLowerCase(),u.toLowerCase(),o,r)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"graph":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Const":return t[e.name];case"PlaceholderWithDefault":const i=__("default",e,t,n);return[T_(e.name,t,n)||i];case"Placeholder":return[T_(e.name,t,n)];case"Identity":case"StopGradient":case"FakeQuantWithMinMaxVars":case"Snapshot":return[O_(__("x",e,t,n))];case"IdentityN":return __("x",e,t,n).map((e=>O_(e)));case"Shape":return[a.tensor1d(__("x",e,t,n).shape,"int32")];case"ShapeN":return __("x",e,t,n).map((e=>a.tensor1d(e.shape)));case"Size":return[a.scalar(__("x",e,t,n).size,"int32")];case"Rank":return[a.scalar(__("x",e,t,n).rank,"int32")];case"NoOp":return[a.scalar(1)];case"Print":const s=__("x",e,t,n),r=__("data",e,t,n);__("message",e,t,n),__("summarize",e,t,n);for(let e=0;e((e,t,n,a=C)=>{switch(e.op){case"Equal":return[a.equal(__("a",e,t,n),__("b",e,t,n))];case"NotEqual":return[a.notEqual(__("a",e,t,n),__("b",e,t,n))];case"Greater":return[a.greater(__("a",e,t,n),__("b",e,t,n))];case"GreaterEqual":return[a.greaterEqual(__("a",e,t,n),__("b",e,t,n))];case"Less":return[a.less(__("a",e,t,n),__("b",e,t,n))];case"LessEqual":return[a.lessEqual(__("a",e,t,n),__("b",e,t,n))];case"LogicalAnd":return[a.logicalAnd(__("a",e,t,n),__("b",e,t,n))];case"LogicalNot":return[a.logicalNot(__("a",e,t,n))];case"LogicalOr":return[a.logicalOr(__("a",e,t,n),__("b",e,t,n))];case"Select":case"SelectV2":return[a.where(__("condition",e,t,n),__("a",e,t,n),__("b",e,t,n))];case"BitwiseAnd":return[a.bitwiseAnd(__("a",e,t,n),__("b",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"matrices":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"BatchMatMul":case"BatchMatMulV2":case"MatMul":return[a.matMul(__("a",e,t,n),__("b",e,t,n),__("transposeA",e,t,n),__("transposeB",e,t,n))];case"Einsum":return[a.einsum(__("equation",e,t,n),...__("tensors",e,t,n))];case"Transpose":return[a.transpose(__("x",e,t,n),__("perm",e,t,n))];case"_FusedMatMul":const[i,s]=__("fusedOps",e,t,n),r="biasadd"===i,o="prelu"===s,l=__("numArgs",e,t,n),u=__("leakyreluAlpha",e,t,n);if(r){if(o&&2!==l)throw new Error("Fused MatMul with BiasAdd and Prelu must have two extra arguments: bias and alpha.");if(!o&&1!==l)throw new Error("Fused MatMul with BiasAdd must have one extra argument: bias.")}const[c,h]=__("args",e,t,n);return[a.fused.matMul({a:__("a",e,t,n),b:__("b",e,t,n),transposeA:__("transposeA",e,t,n),transposeB:__("transposeB",e,t,n),bias:c,activation:s,preluActivationWeights:h,leakyreluAlpha:u})];case"MatrixBandPart":return[a.linalg.bandPart(__("a",e,t,n),__("numLower",e,t,n),__("numUpper",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"normalization":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"EuclideanNorm":return[a.euclideanNorm(__("x",e,t,n),__("axis",e,t,n),__("keepDims",e,t,n))];case"FusedBatchNorm":case"FusedBatchNormV2":case"FusedBatchNormV3":return[a.batchNorm(__("x",e,t,n),__("mean",e,t,n),__("variance",e,t,n),__("offset",e,t,n),__("scale",e,t,n),__("epsilon",e,t,n))];case"LRN":return[a.localResponseNormalization(__("x",e,t,n),__("radius",e,t,n),__("bias",e,t,n),__("alpha",e,t,n),__("beta",e,t,n))];case"Softmax":return[a.softmax(__("x",e,t,n))];case"LogSoftmax":return[a.logSoftmax(__("x",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"ragged":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"RaggedGather":{const{outputNestedSplits:i,outputDenseValues:s}=a.raggedGather(__("paramsNestedSplits",e,t,n),__("paramsDenseValues",e,t,n),__("indices",e,t,n),__("outputRaggedRank",e,t,n));return i.concat(s)}case"RaggedRange":{const{rtNestedSplits:i,rtDenseValues:s}=a.raggedRange(__("starts",e,t,n),__("limits",e,t,n),__("splits",e,t,n));return[i,s]}case"RaggedTensorToTensor":return[a.raggedTensorToTensor(__("shape",e,t,n),__("values",e,t,n),__("defaultValue",e,t,n),__("rowPartitionTensors",e,t,n),__("rowPartitionTypes",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"reduction":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Max":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.max(__("x",e,t,n),i,s)]}case"Mean":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.mean(__("x",e,t,n),i,s)]}case"Min":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.min(__("x",e,t,n),i,s)]}case"Sum":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.sum(__("x",e,t,n),i,s)]}case"All":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.all(__("x",e,t,n),i,s)]}case"Any":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.any(__("x",e,t,n),i,s)]}case"ArgMax":{const i=__("axis",e,t,n);return[a.argMax(__("x",e,t,n),i)]}case"ArgMin":{const i=__("axis",e,t,n);return[a.argMin(__("x",e,t,n),i)]}case"Prod":{const i=__("axis",e,t,n),s=__("keepDims",e,t,n);return[a.prod(__("x",e,t,n),i,s)]}case"Cumprod":{const i=__("axis",e,t,n),s=__("exclusive",e,t,n),r=__("reverse",e,t,n);return[a.cumprod(__("x",e,t,n),i,s,r)]}case"Cumsum":{const i=__("axis",e,t,n),s=__("exclusive",e,t,n),r=__("reverse",e,t,n);return[a.cumsum(__("x",e,t,n),i,s,r)]}case"Bincount":const i=__("x",e,t,n),s=__("weights",e,t,n),r=__("size",e,t,n);return[a.bincount(i,s,r)];case"DenseBincount":{const i=__("x",e,t,n),s=__("weights",e,t,n),r=__("size",e,t,n),o=__("binaryOutput",e,t,n);return[a.denseBincount(i,s,r,o)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"slice_join":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"ConcatV2":case"Concat":{const i=__("n",e,t,n),s=__("axis",e,t,n);let r=__("tensors",e,t,n);return r=r.slice(0,i),[a.concat(r,s)]}case"Gather":{const i=__("x",e,t,n),s=__("indices",e,t,n);return[a.gather(i,a.cast(s,"int32"),0)]}case"GatherV2":{const i=__("axis",e,t,n),s=__("batchDims",e,t,n),r=__("x",e,t,n),o=__("indices",e,t,n);return[a.gather(r,a.cast(o,"int32"),i,s)]}case"Reverse":{const i=__("dims",e,t,n),s=[];for(let e=0;e{const i=__("axis",e,t,n),s=__("tensors",e,t,n),r=s[0].shape,o=a.squeeze(s[0]).shape,l=s.map((e=>{const t=Os(e.shape,r);if(!t&&!Os(a.squeeze(e).shape,o))throw new Error("the input tensors shape does not match");return t?e:a.reshape(e,r)}));return[a.stack(l,i)]}));case"Unpack":{const i=__("axis",e,t,n),s=__("tensor",e,t,n);return a.unstack(s,i)}case"Tile":{const i=__("reps",e,t,n);return[a.tile(__("x",e,t,n),i)]}case"Split":case"SplitV":{const i=__("axis",e,t,n),s=__("numOrSizeSplits",e,t,n),r=__("x",e,t,n);return a.split(r,s,i)}case"ScatterNd":{const i=__("indices",e,t,n),s=__("values",e,t,n),r=__("shape",e,t,n);return[a.scatterND(i,s,r)]}case"GatherNd":{const i=__("x",e,t,n),s=__("indices",e,t,n);return[a.gatherND(i,s)]}case"SparseToDense":{const i=__("sparseIndices",e,t,n),s=__("outputShape",e,t,n),r=__("sparseValues",e,t,n),o=__("defaultValue",e,t,n);return[a.sparseToDense(i,r,s,r.dtype===o.dtype?o:a.cast(o,r.dtype))]}case"TensorScatterUpdate":{const i=__("indices",e,t,n),s=__("values",e,t,n),r=__("tensor",e,t,n);return[a.tensorScatterUpdate(r,i,s)]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"sparse":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"SparseFillEmptyRows":{const{outputIndices:i,outputValues:s,emptyRowIndicator:r,reverseIndexMap:o}=a.sparse.sparseFillEmptyRows(__("indices",e,t,n),__("values",e,t,n),__("denseShape",e,t,n),__("defaultValue",e,t,n));return[i,s,r,o]}case"SparseReshape":{const{outputIndices:i,outputShape:s}=a.sparse.sparseReshape(__("inputIndices",e,t,n),__("inputShape",e,t,n),__("newShape",e,t,n));return[i,s]}case"SparseSegmentMean":return[a.sparse.sparseSegmentMean(__("data",e,t,n),__("indices",e,t,n),__("segmentIds",e,t,n))];case"SparseSegmentSum":return[a.sparse.sparseSegmentSum(__("data",e,t,n),__("indices",e,t,n),__("segmentIds",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"spectral":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"FFT":return[a.fft(__("x",e,t,n))];case"IFFT":return[a.ifft(__("x",e,t,n))];case"RFFT":return[a.rfft(__("x",e,t,n))];case"IRFFT":return[a.irfft(__("x",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"string":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"StaticRegexReplace":return[a.string.staticRegexReplace(__("input",e,t,n),__("pattern",e,t,n),__("rewrite",e,t,n),__("replaceGlobal",e,t,n))];case"StringNGrams":{const{nGrams:i,nGramsSplits:s}=a.string.stringNGrams(__("data",e,t,n),__("dataSplits",e,t,n),__("separator",e,t,n),__("nGramWidths",e,t,n),__("leftPad",e,t,n),__("rightPad",e,t,n),__("padWidth",e,t,n),__("preserveShortSequences",e,t,n));return[i,s]}case"StringSplit":{const{indices:i,values:s,shape:r}=a.string.stringSplit(__("input",e,t,n),__("delimiter",e,t,n),__("skipEmpty",e,t,n));return[i,s,r]}case"StringToHashBucketFast":return[a.string.stringToHashBucketFast(__("input",e,t,n),__("numBuckets",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"transformation":return i((()=>((e,t,n,a=C)=>{switch(e.op){case"Cast":return[a.cast(__("x",e,t,n),__("dtype",e,t,n))];case"ExpandDims":{const i=__("axis",e,t,n);return[a.expandDims(__("x",e,t,n),i)]}case"Squeeze":{const i=__("axis",e,t,n);return[a.squeeze(__("x",e,t,n),i)]}case"Reshape":return[a.reshape(__("x",e,t,n),__("shape",e,t,n))];case"EnsureShape":return[a.ensureShape(__("x",e,t,n),__("shape",e,t,n))];case"MirrorPad":return[a.mirrorPad(__("x",e,t,n),__("padding",e,t,n),__("mode",e,t,n))];case"PadV2":case"Pad":return[a.pad(__("x",e,t,n),__("padding",e,t,n),__("constantValue",e,t,n))];case"SpaceToBatchND":{const i=__("blockShape",e,t,n),s=__("paddings",e,t,n);return[a.spaceToBatchND(__("x",e,t,n),i,s)]}case"BatchToSpaceND":{const i=__("blockShape",e,t,n),s=__("crops",e,t,n);return[a.batchToSpaceND(__("x",e,t,n),i,s)]}case"DepthToSpace":{const i=__("blockSize",e,t,n),s=__("dataFormat",e,t,n).toUpperCase();return[a.depthToSpace(__("x",e,t,n),i,s)]}case"BroadcastTo":return[a.broadcastTo(__("x",e,t,n),__("shape",e,t,n))];case"BroadcastArgs":return[a.broadcastArgs(__("s0",e,t,n),__("s1",e,t,n))];default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n)));case"hash_table":return(async(e,t,n,a)=>{switch(e.op){case"HashTable":case"HashTableV2":{const i=a.getHashTableHandleByName(e.name);if(null!=i)return[i];{const i=__("keyDType",e,t,n),s=__("valueDType",e,t,n),r=new ST(i,s);return a.addHashTable(e.name,r),[r.handle]}}case"InitializeTable":case"InitializeTableV2":case"LookupTableImport":case"LookupTableImportV2":{const i=__("tableHandle",e,t,n,a),s=__("keys",e,t,n),r=__("values",e,t,n),o=a.getHashTableById(i.id);return[await o.import(s,r)]}case"LookupTableFind":case"LookupTableFindV2":{const i=__("tableHandle",e,t,n,a),s=__("keys",e,t,n),r=__("defaultValue",e,t,n),o=a.getHashTableById(i.id);return[await o.find(s,r)]}case"LookupTableSize":case"LookupTableSizeV2":{const i=__("tableHandle",e,t,n,a);return[a.getHashTableById(i.id).tensorSize()]}default:throw TypeError(`Node type ${e.op} is not implemented`)}})(e,t,n,a);case"custom":const s=E_(e.op);if(s&&s.customExecutor)return s.customExecutor(new fT(e,t,n));throw TypeError(`Custom op ${e.op} is not registered.`);default:throw TypeError(`Unknown op '${e.op}'. File an issue at https://github.com/tensorflow/tfjs/issues so we can add it, or register a custom execution with tf.registerOp()`)}})(e,t,n);return rr(s)?s.then((e=>[].concat(e))):[].concat(s)}class _T{constructor(e={},t={},n={},a={},i){this.weightMap=e,this.tensorArrayMap=t,this.tensorListMap=n,this.functionMap=a,this.parseNodeNameCache=i,this.rootContext={id:0,frameName:"",iterationId:0},this.contexts=[this.rootContext],this.lastId=0,this.generateCurrentContextIds()}newFrame(e,t){return{id:e,frameName:t,iterationId:0}}set currentContext(e){this.contexts!==e&&(this.contexts=e,this.generateCurrentContextIds())}get currentContext(){return this.contexts}get currentContextId(){return this._currentContextIds[0]}get currentContextIds(){return this._currentContextIds}generateCurrentContextIds(){const e=[];for(let t=0;t0===e.id&&0===e.iterationId?"":`${e.frameName}-${e.iterationId}`)).join("/"):""}enterFrame(e){this.contexts&&(this.lastId++,this.contexts=this.contexts.slice(),this.contexts.push(this.newFrame(this.lastId,e)),this._currentContextIds.unshift(this.contextIdforContexts(this.contexts)))}exitFrame(){if(!(this.contexts&&this.contexts.length>1))throw new Error("Cannot exit frame, the context is empty");this.contexts=this.contexts.slice(),this.contexts.splice(-1),this.currentContextIds.shift()}nextIteration(){if(!(this.contexts&&this.contexts.length>0))throw new Error("Cannot increase frame iteration, the context is empty");{this.contexts=this.contexts.slice(),this.lastId++;const e=Object.assign({},this.contexts[this.contexts.length-1]);e.iterationId+=1,e.id=this.lastId,this.contexts.splice(-1,1,e),this._currentContextIds.splice(0,1,this.contextIdforContexts(this.contexts))}}getWeight(e){return this.weightMap[e]}addTensorArray(e){this.tensorArrayMap[e.id]=e}getTensorArray(e){return this.tensorArrayMap[e]}addTensorList(e){this.tensorListMap[e.id]=e}getTensorList(e){return this.tensorListMap[e]}dispose(e){for(const t in this.tensorArrayMap)this.tensorArrayMap[t].clearAndClose(e);for(const t in this.tensorListMap)this.tensorListMap[t].clearAndClose(e)}}function TT(e,t,n,a){const i=new Set,s=[];let r=null,o=null;const l=new Set,u=new Set(Object.keys(e).map((e=>D_(e)[0])));a=a||[];const c=new Set(a.map((e=>D_(e.name)[0]))),h=[...t];for(;h.length>0;){const e=h.pop();(OT(e)||MT(e)||BT(e))&&null==r&&(r=e,o=r.children.map((e=>e.name)).filter((e=>i.has(e)))),i.add(e.name),null==n[e.name]&&(u.has(e.name)||c.has(e.name)||(0!==e.inputs.length?e.inputs.forEach((e=>{l.has(e.name)||(l.add(e.name),h.push(e))})):s.push(e.name)))}return{inputs:e,outputs:t,usedNodes:i,missingInputs:s,dynamicNode:r,syncInputs:o}}function IT(e,t){const{usedNodes:n,inputs:a}=t,i=Object.keys(a).map((e=>D_(e)[0])).map((t=>e.nodes[t])),s=e.initNodes||[],r=e=>n.has("string"==typeof e?e:e.name);function o(e){return[...new Map(e.map((e=>[e.name,e]))).values()]}const l=o([...i,...e.weights,...s]).filter(r),u=o([...l,...Object.values(e.nodes)]).filter(r),c=new Map(u.map((e=>[e.name,e]))),h={};for(const e of u){h[e.name]=h[e.name]||0;for(const t of e.children)r(t)||(h[t.name]=Number.POSITIVE_INFINITY),h[t.name]=(h[t.name]||0)+1}const d=Object.entries(h).filter((([,e])=>0===e)).map((([e])=>e)),p=[...d];for(;d.length>0;){const e=d.pop(),t=c.get(e);for(const e of t.children.filter(r))0==--h[e.name]&&(p.push(e.name),d.push(e.name))}const m=function(e,t){const n=new Map(e.map((e=>[e.name,e]))),a=t.map((e=>e.name)),i=new Set(a);for(;a.length>0;){const e=a.pop(),t=n.get(e);for(const e of t.children)n.has(e.name)&&!i.has(e.name)&&(i.add(e.name),a.push(e.name))}const s=e.filter((e=>i.has(e.name)));return s}(p.map((e=>c.get(e))),l);return function(e,t){const n=new Map(e.map(((e,t)=>[e.name,t]))),a=new Set(t.map((e=>e.name))),i=e=>a.has("string"==typeof e?e:e.name),s=new Set(e.map((e=>e.name))),r=e=>s.has("string"==typeof e?e:e.name);for(const t of e){for(const e of t.children.filter(r)){if(!n.has(e.name))throw new NT(`Child ${e.name} of node ${t.name} is unreachable.`);if(n.get(t.name)>n.get(e.name))throw new NT(`Node ${t.name} is scheduled to run after its child ${e.name}.`)}if(!i(t))for(const e of t.inputs){if(!n.has(e.name))throw new NT(`Input ${e.name} of node ${t.name} is unreachable.`);if(n.get(e.name)>n.get(t.name))throw new NT(`Node ${t.name} is scheduled to run before its input ${e.name}.`)}}}(m,l),m}class NT extends Error{constructor(e){super(`NodesExecutionOrderError: ${e}`)}}const RT=new Set(["Switch","Merge","Enter","Exit","NextIteration","StatelessIf","StatelessWhile","if","While"]),DT=new Set(["NonMaxSuppressionV2","NonMaxSuppressionV3","NonMaxSuppressionV5","Where"]),zT=new Set(["HashTable","HashTableV2","LookupTableImport","LookupTableImportV2","LookupTableFind","LookupTableFindV2","LookupTableSize","LookupTableSizeV2"]);function OT(e){return RT.has(e.op)}function MT(e){return DT.has(e.op)}function BT(e){return zT.has(e.op)}class FT{get weightIds(){return this.parent?this.parent.weightIds:this._weightIds}get functionExecutorMap(){return this.parent?this.parent.functionExecutorMap:this._functionExecutorMap}get weightMap(){return this.parent?this.parent.weightMap:this._weightMap}set weightMap(e){const t=Object.keys(e).map((t=>e[t].map((e=>e.id))));this._weightIds=[].concat(...t),this._weightMap=e}set resourceManager(e){this._resourceManager=e}get inputs(){return this._inputs.map((e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0})))}get outputs(){return this._outputs.map((e=>({name:e.name,shape:e.attrParams.shape?e.attrParams.shape.value:void 0,dtype:e.attrParams.dtype?e.attrParams.dtype.value:void 0})))}get inputNodes(){return this._inputs.map((e=>e.signatureKey||e.name))}get outputNodes(){return this._outputs.map((e=>{const t=e.signatureKey||e.name;return e.defaultOutput?`${t}:${e.defaultOutput}`:t}))}get functions(){return Object.keys(this._functions).reduce(((e,t)=>(e[t]=this._functions[t].signature,e)),{})}constructor(e,t){this.graph=e,this.parent=t,this.compiledMap=new Map,this.parseNodeNameCache=new Map,this._weightMap={},this.SEPARATOR=",",this._functions={},this._functionExecutorMap={},this.keepIntermediateTensors=!1,this._outputs=e.outputs,this._inputs=e.inputs,this._initNodes=e.initNodes,this._signature=e.signature,this._functions=e.functions,null!=e.functions&&Object.keys(e.functions).forEach((t=>{this._functionExecutorMap[t]=new FT(e.functions[t],this)}))}getCompilationKey(e,t){const n=e.map((e=>e.name)).sort(),a=t.map((e=>e.name)).sort();return n.join(this.SEPARATOR)+"--"+a.join(this.SEPARATOR)}compile(e,t){const n=TT(e,t,this.weightMap,this._initNodes),{missingInputs:a,dynamicNode:i,syncInputs:s}=n;if(null!=i)throw new Error(`This execution contains the node '${i.name}', which has the dynamic op '${i.op}'. Please use model.executeAsync() instead. Alternatively, to avoid the dynamic ops, specify the inputs [${s}]`);if(a.length>0){const n=t.map((e=>e.name)),i=Object.keys(e);throw new Error(`Cannot compute the outputs [${n}] from the provided inputs [${i}]. Missing the following inputs: [${a}]`)}const r=IT(this.graph,n),o=function(e){const t=new Map(e.map(((e,t)=>[e.name,t]))),n=Number.MAX_SAFE_INTEGER,a=e.map(((e,t)=>OT(e)?n:t)),i=e=>{const n=a[t.get(e.name)];return null==n?-1:n},s=e.map(((e,t)=>e.children.map(i).reduce(((e,t)=>Math.max(e,t)),a[t]))),r=new Map;for(let t=0;tthis.cloneAndKeepTensor(e)))}cloneTensorMap(e){return Object.fromEntries(Object.entries(e).map((([e,t])=>[e,this.cloneTensorList(t)])))}execute(e,t){this.disposeIntermediateTensors(),e=this.mapInputs(e);const n=Object.keys(e).sort();this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t);const a=n.map((e=>this.graph.nodes[D_(e)[0]])),i=t.map((e=>D_(e)[0])),s=new Set(i);let r=i.map((e=>this.graph.nodes[e]));0===r.length&&(r=this._outputs);const o=this.getCompilationKey(a,r);let l=this.compiledMap.get(o);null==l&&(l=this.compile(e,r),this.compiledMap.set(o,l));try{this.keepIntermediateTensors=cr().getBool("KEEP_INTERMEDIATE_TENSORS")}catch(e){this.keepIntermediateTensors=!1}const u={},c={};return dh((()=>{const n=new _T(this.weightMap,u,c,this.functionExecutorMap,this.parseNodeNameCache),a=Object.assign({},this.weightMap);this.keepIntermediateTensors&&(this.clonedTensorsMap=this.cloneTensorMap(this.weightMap)),Object.keys(e).forEach((t=>{const[i,s]=D_(t,n),r=[];r[s]=e[t],a[i]=r,this.keepIntermediateTensors&&(this.clonedTensorsMap[i]=this.cloneTensorList(r))}));const i=this.getFrozenTensorIds(a),{orderedNodes:r,nodeLiveUntilMap:o}=l;for(const e of r){if(a[e.name])continue;const t=ET(e,a,n,this._resourceManager);if(rr(t))throw new Error(`The execution of the op '${e.op}' returned a promise. Please use model.executeAsync() instead.`);a[e.name]=t,this.keepIntermediateTensors&&(this.clonedTensorsMap[e.name]=this.cloneTensorList(t)),this.checkTensorForDisposalWithNodeLiveUntilInfo(e,a,n,i,s,o.get(e.name))}return null==this.parent&&n.dispose(i),t.map((e=>T_(e,a,n)))}))}getFrozenTensorIds(e){const t=[].concat.apply([],Object.keys(e).map((t=>e[t])).map((e=>e.map((e=>e.id)))));return new Set(t)}checkTensorForDisposal(e,t,n,a,i,s,r){if(!OT(t)&&!s.has(e)){for(const a of n[e])null!=a&&(r[a.id]=(r[a.id]||0)+t.children.length);for(const e of t.inputs){if(OT(e))continue;const t=I_(e.name,n,a);if(null!=t)for(const e of t){if(!e||e.kept||i.has(e.id))continue;const t=r[e.id];1===t?(e.dispose(),delete r[e.id]):null!=t&&r[e.id]--}}}}checkTensorForDisposalWithNodeLiveUntilInfo(e,t,n,a,i,s){function r(e){return OT(e)||i.has(e.name)}if(!OT(e)&&null!=s)for(const e of s){if(r(e))continue;const i=I_(e.name,t,n);for(const e of i)!e||e.kept||a.has(e.id)||e.dispose()}}async executeAsync(e,t){return this._executeAsync(e,t)}disposeIntermediateTensors(){this.clonedTensorsMap&&(Object.values(this.clonedTensorsMap).forEach((e=>{for(const t of e)t&&!t.isDisposed&&t.dispose()})),this.clonedTensorsMap=null)}getIntermediateTensors(){return this.clonedTensorsMap}async _executeAsync(e,t,n=!1,a={},i={}){this.disposeIntermediateTensors(),n||(e=this.mapInputs(e),this.checkInputs(e),this.checkInputShapeAndType(e),t=this.mapOutputs(t),this.checkOutputs(t));try{this.keepIntermediateTensors=cr().getBool("KEEP_INTERMEDIATE_TENSORS")}catch(e){this.keepIntermediateTensors=!1}const s=new _T(this.weightMap,a,i,this.functionExecutorMap,this.parseNodeNameCache);this.keepIntermediateTensors&&(this.clonedTensorsMap=this.cloneTensorMap(this.weightMap));const r=await this.executeWithControlFlow(e,s,t,n),o=t.map((e=>T_(e,r,s))),l=o.map((e=>e.id)),u=Object.keys(e).map((t=>e[t].id)),c=new Set([...l,...u,...this.weightIds]);return Object.values(r).forEach((e=>{e.forEach((e=>{!e||e.isDisposed||c.has(e.id)||e.dispose()}))})),null==this.parent&&s.dispose(c),o}async executeFunctionAsync(e,t,n){const a=e.reduce(((e,t,n)=>(e[this.inputs[n].name]=t,e)),{});return this._executeAsync(a,this.outputNodes,!0,t,n)}async executeWithControlFlow(e,t,n,a){const i=Object.keys(e),s=i.map((e=>this.graph.nodes[D_(e)[0]])),r=n.map((e=>D_(e)[0])),o=new Set(r);let l=r.map((e=>this.graph.nodes[e]));0===l.length&&(l=this._outputs);const{usedNodes:u,missingInputs:c,dynamicNode:h,syncInputs:d}=TT(e,l,this.weightMap,this._initNodes),p=[...s,...this.graph.weights,...this._initNodes||[]].map((e=>({node:e,contexts:t.currentContext}))),m=Object.assign({},this.weightMap);Object.keys(e).forEach((t=>{const[n,a]=D_(t),i=[];i[a]=e[t],m[n]=i}));const f={},g=this.getFrozenTensorIds(m),y={};for(;p.length>0;){const e=this.processStack(s,p,t,m,y,g,o,f,u);await Promise.all(e)}const b=l.filter((e=>!OT(e)&&!T_(e.name,m,t))).map((e=>e.name));if(b.length>0){let e="";throw null!=h&&(e=`Alternatively, to avoid the dynamic ops, use model.execute() and specify the inputs [${d}]`),new Error(`Cannot compute the outputs [${b}] from the provided inputs [${i}]. Consider providing the following inputs: [${c}]. ${e}`)}return m}processStack(e,t,n,a,i,s,r,o,l){const u=[];for(;t.length>0;){const e=t.pop();n.currentContext=e.contexts;let c="";if("Enter"===e.node.op&&__("isConstant",e.node,a,n)&&([c]=N_(e.node.name,n)),null==a[e.node.name]){const h=ET(e.node,a,n,this._resourceManager);c||([c]=N_(e.node.name,n));const d=n.currentContext;rr(h)?u.push(h.then((u=>(a[c]=u,this.keepIntermediateTensors&&(this.clonedTensorsMap[c]=this.cloneTensorList(u)),n.currentContext=d,this.checkTensorForDisposal(c,e.node,a,n,s,r,o),this.processChildNodes(e.node,t,n,a,i,l),u)))):(a[c]=h,this.keepIntermediateTensors&&(this.clonedTensorsMap[c]=this.cloneTensorList(h)),this.checkTensorForDisposal(c,e.node,a,n,s,r,o),this.processChildNodes(e.node,t,n,a,i,l))}else this.processChildNodes(e.node,t,n,a,i,l)}return u}processChildNodes(e,t,n,a,i,s){e.children.forEach((e=>{const[r]=N_(e.name,n);!i[r]&&s.has(e.name)&&("Merge"===e.op?e.inputNames.some((e=>!!T_(e,a,n)))&&(i[r]=!0,t.push({contexts:n.currentContext,node:e})):e.inputNames.every((e=>!!T_(e,a,n)))&&(i[r]=!0,t.push({contexts:n.currentContext,node:e})))}))}dispose(){Object.keys(this.weightMap).forEach((e=>this.weightMap[e].forEach((e=>e.dispose()))))}checkInputShapeAndType(e){Object.keys(e).forEach((t=>{const n=e[t],[a]=D_(t),i=this.graph.nodes[a];if(i.attrParams.shape&&i.attrParams.shape.value){const e=i.attrParams.shape.value;Ns(e.length===n.shape.length&&n.shape.every(((t,n)=>-1===e[n]||e[n]===t)),(()=>`The shape of dict['${i.name}'] provided in model.execute(dict) must be [${e}], but was [${n.shape}]`))}i.attrParams.dtype&&i.attrParams.dtype.value&&Ns(n.dtype===i.attrParams.dtype.value,(()=>`The dtype of dict['${i.name}'] provided in model.execute(dict) must be ${i.attrParams.dtype.value}, but was ${n.dtype}`))}))}mapInputs(e){var t,n;const a={};for(const i in e){const s=null===(n=null===(t=this._signature)||void 0===t?void 0:t.inputs)||void 0===n?void 0:n[i];null!=s?a[s.name]=e[i]:a[i]=e[i]}return a}checkInputs(e){const t=Object.keys(e).filter((e=>{const[t]=D_(e);return null==this.graph.nodes[t]}));if(t.length>0)throw new Error(`The dict provided in model.execute(dict) has keys: [${t}] that are not part of graph`)}mapOutputs(e){return e.map((e=>{var t,n;const a=null===(n=null===(t=this._signature)||void 0===t?void 0:t.outputs)||void 0===n?void 0:n[e];return null!=a?a.name:e}),{})}checkOutputs(e){e.forEach((e=>{const[t]=D_(e);if(!this.graph.nodes[t])throw new Error(`The output '${e}' is not found in the graph`)}))}}class LT{constructor(e={},t={}){this.hashTableNameToHandle=e,this.hashTableMap=t}addHashTable(e,t){this.hashTableNameToHandle[e]=t.handle,this.hashTableMap[t.id]=t}getHashTableHandleByName(e){return this.hashTableNameToHandle[e]}getHashTableById(e){return this.hashTableMap[e]}dispose(){for(const e in this.hashTableMap)this.hashTableMap[e].clearAndClose(),delete this.hashTableMap[e];for(const e in this.hashTableNameToHandle)this.hashTableNameToHandle[e].dispose(),delete this.hashTableNameToHandle[e]}}const PT="?tfjs-format=file",jT="model.json";class VT{get modelVersion(){return this.version}get inputNodes(){return this.executor.inputNodes}get outputNodes(){return this.executor.outputNodes}get inputs(){return this.executor.inputs}get outputs(){return this.executor.outputs}get weights(){return this.executor.weightMap}get metadata(){return this.artifacts.userDefinedMetadata}get modelSignature(){return this.signature}get modelStructuredOutputKeys(){return this.structuredOutputKeys}constructor(t,n={},a=e){this.modelUrl=t,this.loadOptions=n,this.version="n/a",this.io=a,null==n&&(this.loadOptions={}),this.resourceManager=new LT}findIOHandler(){const e=this.modelUrl;if(null!=e.load)this.handler=e;else if(null!=this.loadOptions.requestInit)this.handler=this.io.browserHTTPRequest(e,this.loadOptions);else{const t=this.io.getLoadHandlers(e,this.loadOptions);if(0===t.length)t.push(this.io.browserHTTPRequest(e,this.loadOptions));else if(t.length>1)throw new Error(`Found more than one (${t.length}) load handlers for URL '${[e]}'`);this.handler=t[0]}}load(){if(this.findIOHandler(),null==this.handler.load)throw new Error("Cannot proceed with model loading because the IOHandler provided does not have the `load` method implemented.");const e=this.handler.load();return rr(e)?e.then((e=>null==e.getWeightStream?this.loadSync(e):this.loadStreaming(e))):this.loadSync(e)}loadSync(e){const t=this.io.decodeWeights(e.weightData,e.weightSpecs);return this.loadWithWeightMap(e,t)}async loadStreaming(e){if(null==e.getWeightStream)throw new Error("Model artifacts missing streamWeights function");const t=await Ch(e.getWeightStream(),e.weightSpecs);return this.loadWithWeightMap(e,t)}loadWithWeightMap(e,t){this.artifacts=e;const n=this.artifacts.modelTopology;let a=this.artifacts.signature;if(null!=this.artifacts.userDefinedMetadata){const e=this.artifacts.userDefinedMetadata;null!=e.signature&&(a=e.signature),null!=e.structuredOutputKeys&&(this.structuredOutputKeys=e.structuredOutputKeys)}if(this.signature=a,this.version=`${n.versions.producer}.${n.versions.minConsumer}`,this.executor=new FT(eT.Instance.transformGraph(n,this.signature)),this.executor.weightMap=this.convertTensorMapToTensorsMap(t),this.executor.resourceManager=this.resourceManager,null!=e.modelInitializer&&null!=e.modelInitializer.node){const t=eT.Instance.transformGraph(e.modelInitializer);this.initializer=new FT(t),this.initializer.weightMap=this.executor.weightMap,this.initializer.resourceManager=this.resourceManager,this.initializerSignature=e.initializerSignature}return!0}async save(e,t){if("string"==typeof e){const t=this.io.getSaveHandlers(e);if(0===t.length)throw new Error(`Cannot find any save handlers for URL '${e}'`);if(t.length>1)throw new Error(`Found more than one (${t.length}) save handlers for URL '${e}'`);e=t[0]}if(null==e.save)throw new Error("GraphModel.save() cannot proceed because the IOHandler provided does not have the `save` attribute defined.");return e.save(this.artifacts)}addStructuredOutputNames(e){if(this.structuredOutputKeys){const t={};return(e instanceof kc?[e]:e).forEach(((e,n)=>t[this.structuredOutputKeys[n]]=e)),t}return e}predict(e,t){const n=this.execute(e,this.outputNodes);return this.addStructuredOutputNames(n)}async predictAsync(e,t){const n=await this.executeAsync(e,this.outputNodes);return this.addStructuredOutputNames(n)}normalizeInputs(e){var t;if(!(e instanceof kc||Array.isArray(e))){const n=null===(t=this.signature)||void 0===t?void 0:t.inputs;if(null!=n)for(const t in n){const a=n[t];null!=a.resourceId&&(e[t]=this.resourceIdToCapturedInput[a.resourceId])}return e}e=Array.isArray(e)?e:[e];const n=Object.keys(this.resourceIdToCapturedInput).length;if(e.length+n!==this.inputNodes.length)throw new Error(`Input tensor count mismatch, the graph model has ${this.inputNodes.length-n} non-resource placeholders, while there are ${e.length} input tensors provided.`);let a=0;return this.inputNodes.reduce(((t,n)=>{var i,s,r;const o=null===(r=null===(s=null===(i=this.signature)||void 0===i?void 0:i.inputs)||void 0===s?void 0:s[n])||void 0===r?void 0:r.resourceId;return t[n]=null!=o?this.resourceIdToCapturedInput[o]:e[a++],t}),{})}normalizeOutputs(e){return e=e||this.outputNodes,Array.isArray(e)?e:[e]}executeInitializerGraph(){return null==this.initializer?[]:null==this.initializerSignature?this.initializer.execute({},[]):this.initializer.execute({},Object.keys(this.initializerSignature.outputs))}async executeInitializerGraphAsync(){return null==this.initializer?[]:null==this.initializerSignature?this.initializer.executeAsync({},[]):this.initializer.executeAsync({},Object.keys(this.initializerSignature.outputs))}setResourceIdToCapturedInput(e){if(this.resourceIdToCapturedInput={},this.initializerSignature){const t=this.initializerSignature.outputs,n=Object.keys(t);for(let a=0;a1?n:n[0]}async executeAsync(e,t){null==this.resourceIdToCapturedInput&&this.setResourceIdToCapturedInput(await this.executeInitializerGraphAsync()),e=this.normalizeInputs(e),t=this.normalizeOutputs(t);const n=await this.executor.executeAsync(e,t);return n.length>1?n:n[0]}getIntermediateTensors(){return this.executor.getIntermediateTensors()}disposeIntermediateTensors(){this.executor.disposeIntermediateTensors()}convertTensorMapToTensorsMap(e){return Object.keys(e).reduce(((t,n)=>(t[n]=[e[n]],t)),{})}dispose(){this.executor.dispose(),this.initializer&&(this.initializer.dispose(),this.resourceIdToCapturedInput&&ph(this.resourceIdToCapturedInput)),this.resourceManager.dispose()}}async function UT(t,n={},a=e){if(null==t)throw new Error("modelUrl in loadGraphModel() cannot be null. Please provide a url or an IOHandler that loads the model");null==n&&(n={}),n.fromTFHub&&"string"==typeof t&&(t=function(e){e.endsWith("/")||(e+="/");return`${e}${jT}${PT}`}(t));const i=new VT(t,n,a);return await i.load(),i}function WT(e,t,n=new Map,a=new Set){if(null==e)return null;if("function"==typeof Blob&&e instanceof Blob)return e.slice();if(a.has(e))throw new Error("Circular references are not supported.");if(n.has(e))return n.get(e);const i=t(e);if(i.recurse&&null!==i.value)throw new Error("A deep map function may not return both a value and recurse=true.");if(i.recurse){if(KT(e)){const i=Array.isArray(e)?[]:{};a.add(e);for(const s in e){const r=WT(e[s],t,n,a);i[s]=r}return a.delete(e),e.__proto__&&(i.__proto__=e.__proto__),i}throw new Error(`Can't recurse into non-iterable type: ${e}`)}return n.set(e,i.value),i.value}function GT(e,t=HT){return qT(e,t)}function qT(e,t,n=new Set){const a=e[0];if(n.has(a))throw new Error("Circular references are not supported.");const i=t(e);if(i.recurse&&null!==i.value)throw new Error("A deep zip function may not return both a value and recurse=true.");if(i.recurse){if(KT(a)){const i=Array.isArray(a)?[]:{};n.add(a);for(const s in a){const a=qT(e.map((e=>e[s])),t,n);i[s]=a}return n.delete(a),i}throw new Error(`Can't recurse into non-iterable type: ${a}`)}return i.value}function HT(e){return null===e?null:KT(e[0])?{value:null,recurse:!0}:{value:e,recurse:!1}}function KT(e){let t=!1;if(cr().get("IS_BROWSER"))t=e instanceof TextDecoder;else{const{StringDecoder:n}=__webpack_require__(7695);t=e instanceof n}return null!=e&&!ArrayBuffer.isView(e)&&(Array.isArray(e)||"object"==typeof e&&!(e instanceof kc)&&!(e instanceof Promise)&&!t)}function $T(e){return WT(e,ZT)}function ZT(e){return e instanceof kc?{value:e.clone(),recurse:!1}:KT(e)?{value:null,recurse:!0}:{value:e,recurse:!1}}class XT{constructor(e){if(this.capacity=e,this.begin=0,this.end=0,null==e)throw new RangeError("Can't create a ring buffer of unknown capacity.");if(e<1)throw new RangeError("Can't create ring buffer of capacity < 1.");this.data=new Array(e),this.doubledCapacity=2*e}wrap(e){for(;e<0;)e+=this.doubledCapacity;return e%this.doubledCapacity}get(e){if(e<0)throw new RangeError("Can't get item at a negative index.");return this.data[e%this.capacity]}set(e,t){if(e<0)throw new RangeError("Can't set item at a negative index.");this.data[e%this.capacity]=t}length(){let e=this.end-this.begin;return e<0&&(e=this.doubledCapacity+e),e}isFull(){return this.length()===this.capacity}isEmpty(){return 0===this.length()}push(e){if(this.isFull())throw new RangeError("Ring buffer is full.");this.set(this.end,e),this.end=this.wrap(this.end+1)}pushAll(e){for(const t of e)this.push(t)}pop(){if(this.isEmpty())throw new RangeError("Ring buffer is empty.");this.end=this.wrap(this.end-1);const e=this.get(this.end);return this.set(this.end,void 0),e}unshift(e){if(this.isFull())throw new RangeError("Ring buffer is full.");this.begin=this.wrap(this.begin-1),this.set(this.begin,e)}shift(){if(this.isEmpty())throw new RangeError("Ring buffer is empty.");const e=this.get(this.begin);return this.set(this.begin,void 0),this.begin=this.wrap(this.begin+1),e}shuffleExcise(e){if(this.isEmpty())throw new RangeError("Ring buffer is empty.");const t=this.wrap(this.begin+e),n=this.get(t);return this.set(t,this.pop()),n}}class YT extends XT{constructor(){super(YT.INITIAL_CAPACITY)}isFull(){return!1}push(e){super.isFull()&&this.expand(),super.push(e)}unshift(e){super.isFull()&&this.expand(),super.unshift(e)}expand(){const e=2*this.capacity,t=new Array(e),n=this.length();for(let e=0;e!0===e))}rowMajorBatch(e,t=!0){return new rI(this,e,t)}columnMajorBatch(e,t=!0,n=HT){return this.rowMajorBatch(e,t).map((e=>GT(e,n)))}concatenate(e,t){return new pI(new tI([this,e]),t)}take(e){return e<0||null==e?this:new sI(this,e)}skip(e){return e<0||null==e?this:new iI(this,e)}prefetch(e){return new fI(this,e)}shuffle(e,t){return new gI(this,e,t)}serial(){return new aI(this)}}class tI extends eI{constructor(e){super(),this.items=e,this.trav=0}summary(){return`Array of ${this.items.length} items`}async next(){if(this.trav>=this.items.length)return{value:null,done:!0};const e=this.items[this.trav];return this.trav++,{value:$T(e),done:!1}}}class nI extends eI{constructor(e){super(),this.nextFn=e}summary(){return"Function call"}async next(){try{return this.nextFn()}catch(e){throw e.message=`Error thrown while iterating through a dataset: ${e.message}`,e}}}class aI extends eI{constructor(e){super(),this.upstream=e,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> Serial`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){return this.upstream.next()}}class iI extends eI{constructor(e,t){super(),this.upstream=e,this.maxCount=t,this.count=0,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> Skip`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;this.count++ Take`}async next(){return this.count++>=this.maxCount?{value:null,done:!0}:this.upstream.next()}}class rI extends eI{constructor(e,t,n=!0){super(),this.upstream=e,this.batchSize=t,this.enableSmallLastBatch=n,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> RowMajorBatch`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){const e=[];for(;e.length0?{value:e,done:!1}:{value:null,done:!0};e.push(t.value)}return{value:e,done:!1}}}class oI extends eI{constructor(e,t){super(),this.upstream=e,this.predicate=t,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> Filter`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;;){const e=await this.upstream.next();if(e.done||this.predicate(e.value))return e;ph(e.value)}}}class lI extends eI{constructor(e,t){super(),this.upstream=e,this.transform=t}summary(){return`${this.upstream.summary()} -> Map`}async next(){const e=await this.upstream.next();if(e.done)return{value:null,done:!0};const t=jc(e.value),n=this.transform(e.value),a=jc(n);for(const e of t)Pc(e,a)||e.dispose();return{value:n,done:!1}}}class uI extends eI{constructor(e,t){super(),this.upstream=e,this.handler=t,this.count=0,this.lastRead=Promise.resolve({value:null,done:!1})}summary(){return`${this.upstream.summary()} -> handleErrors`}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;;)try{return await this.upstream.next()}catch(e){if(!this.handler(e))return{value:null,done:!0}}}}class cI extends eI{constructor(e,t){super(),this.upstream=e,this.transform=t}summary(){return`${this.upstream.summary()} -> AsyncMap`}async next(){const e=await this.upstream.next();if(e.done)return{value:null,done:!0};const t=jc(e.value),n=await this.transform(e.value),a=jc(n);for(const e of t)Pc(e,a)||e.dispose();return{value:n,done:!1}}}class hI extends eI{constructor(){super(),this.outputQueue=new YT,this.lastRead=Promise.resolve({value:null,done:!1})}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}async serialNext(){for(;0===this.outputQueue.length();)if(!await this.pump())return{value:null,done:!0};return{value:this.outputQueue.shift(),done:!1}}}class dI extends hI{constructor(e,t){super(),this.upstream=e,this.transform=t}summary(){return`${this.upstream.summary()} -> Flatmap`}async pump(){const e=await this.upstream.next();if(e.done)return!1;const t=jc(e.value),n=this.transform(e.value),a=jc(n);this.outputQueue.pushAll(n);for(const e of t)Pc(e,a)||e.dispose();return!0}}class pI extends eI{constructor(e,t){super(),this.baseErrorHandler=t,this.lastRead=null,this.iterator=null,this.moreIterators=e}summary(){return"TODO: fill in upstream of chained summaries -> Chained"}async next(){return this.lastRead=this.readFromChain(this.lastRead),this.lastRead}async readFromChain(e){if(await e,null==this.iterator){const e=await this.moreIterators.next();if(e.done)return{value:null,done:!0};this.iterator=e.value,null!=this.baseErrorHandler&&(this.iterator=this.iterator.handleErrors(this.baseErrorHandler))}const t=await this.iterator.next();return t.done?(this.iterator=null,this.readFromChain(e)):t}}var mI;!function(e){e[e.FAIL=0]="FAIL",e[e.SHORTEST=1]="SHORTEST",e[e.LONGEST=2]="LONGEST"}(mI||(mI={}));class fI extends eI{constructor(e,t){super(),this.upstream=e,this.bufferSize=t,this.buffer=new XT(t)}summary(){return`${this.upstream.summary()} -> Prefetch`}refill(){for(;!this.buffer.isFull();){const e=this.upstream.next();this.buffer.push(e)}}next(){return this.refill(),this.buffer.shift()}}class gI extends fI{constructor(e,t,n){super(e,t),this.upstream=e,this.windowSize=t,this.upstreamExhausted=!1,this.random=Bg.alea(n||ec().toString()),this.lastRead=Promise.resolve({value:null,done:!1})}async next(){return this.lastRead=this.lastRead.then((()=>this.serialNext())),this.lastRead}randomInt(e){return Math.floor(this.random()*e)}chooseIndex(){return this.randomInt(this.buffer.length())}async serialNext(){for(this.upstreamExhausted||this.refill();!this.buffer.isEmpty();){const e=this.chooseIndex(),t=await this.buffer.shuffleExcise(e);if(!t.done)return this.refill(),t;this.upstreamExhausted=!0}return{value:null,done:!0}}}class yI{constructor(){this.size=null}batch(e,t=!0){const n=this;let a;return Ns(e>0,(()=>`batchSize needs to be positive, but it is\n ${e}`)),a=this.size===1/0||null==this.size?this.size:t?Math.ceil(this.size/e):Math.floor(this.size/e),bI((async()=>(await n.iterator()).columnMajorBatch(e,t,vI)),a)}concatenate(e){const t=this;let n;return n=this.size===1/0||e.size===1/0?1/0:null!=this.size&&null!=e.size?this.size+e.size:null,bI((async()=>(await t.iterator()).concatenate(await e.iterator())),n)}filter(e){const t=this;let n;return n=this.size===1/0?1/0:null,bI((async()=>(await t.iterator()).filter((t=>dh((()=>e(t)))))),n)}async forEachAsync(e){return(await this.iterator()).forEachAsync(e)}map(e){const t=this;return bI((async()=>(await t.iterator()).map((t=>dh((()=>e(t)))))),this.size)}mapAsync(e){const t=this;return bI((async()=>(await t.iterator()).mapAsync(e)),this.size)}prefetch(e){if(null==e)throw new RangeError("`Dataset.prefetch()` requires bufferSize to be specified.");const t=this;return bI((async()=>(await t.iterator()).prefetch(e)),this.size)}repeat(e){const t=this;let n;return n=null!=this.size&&e>0?this.size*e:0===e?0:null!=this.size&&(void 0===e||e<0)?1/0:null,bI((async()=>JT(QT((async()=>({value:await t.iterator(),done:!1}))).take(e))),n)}skip(e){const t=this;let n;return n=null!=this.size&&e>=0&&this.size>=e?this.size-e:null!=this.size&&(this.size(await t.iterator()).skip(e)),n)}shuffle(e,t,n=!0){if(null==e||e<0)throw null==this.size?new RangeError("`Dataset.shuffle()` requires bufferSize to be specified."):new RangeError(`\`Dataset.shuffle()\` requires bufferSize to be specified. If your data fits in main memory (for regular JS objects), and/or GPU memory (for \`tf.Tensor\`s), consider setting bufferSize to the dataset size (${this.size} elements)`);const a=this,i=Bg.alea(t||ec().toString());return bI((async()=>{let t=i.int32();return n&&(t+=i.int32()),(await a.iterator()).shuffle(e,t.toString())}),this.size)}take(e){const t=this;let n;return n=null!=this.size&&this.size>e?e:null!=this.size&&this.size<=e?this.size:null,bI((async()=>(await t.iterator()).take(e)),n)}async toArray(){if(this.size===1/0)throw new Error("Can not convert infinite data stream to array.");return(await this.iterator()).toArray()}async toArrayForTest(){if(this.size===1/0)throw new Error("Can not convert infinite data stream to array.");return(await this.iterator()).toArrayForTest()}}function bI(e,t=null){return new class extends yI{constructor(){super(...arguments),this.size=t}async iterator(){return e()}}}function vI(e){if(null===e)return null;const t=e[0];if(null==(n=t)||null===(a=n)||"object"!=typeof a&&"function"!=typeof a||Array.isArray(n)||"object"==typeof n&&n instanceof kc||ac(n)){return{value:function(e){if(0===e.length)throw new Error("Can't make a batch of zero elements.");return e[0]instanceof kc?wy(e):oh(e)}(e),recurse:!1}}var n,a;return{value:null,recurse:!0}}yI.MAX_BUFFER_SIZE=1e4;Symbol("out"),Symbol("field"),Symbol("quote"),Symbol("quoteafterquote"),Symbol("quoteinquote");function kI(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&Ns("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the CPU backend.`))}))}const wI=Vy;class AI extends Cs{nextDataId(){return AI.nextDataId++}constructor(){super(),this.blockSize=48,this.firstUse=!0,this.data=new xs(this,ch())}write(e,t,n){this.firstUse&&(this.firstUse=!1,cr().get("IS_NODE")&&_u());const a={id:this.nextDataId()};return this.data.set(a,{values:e,dtype:n,refCount:1}),a}makeTensorInfo(e,t,n){let a;if("string"===t&&null!=n&&n.length>0&&Hs(n[0])){const i=n.map((e=>tc(e)));a=this.write(i,e,t)}else a=this.write(n,e,t);return{dataId:a,shape:e,dtype:t}}refCount(e){if(this.data.has(e)){return this.data.get(e).refCount}return 0}incRef(e){this.data.get(e).refCount++}decRef(e){if(this.data.has(e)){this.data.get(e).refCount--}}move(e,t,n,a,i){this.data.set(e,{values:t,dtype:a,refCount:i})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){const{dtype:t,complexTensorInfos:n}=this.data.get(e);if("complex64"===t){return Ov(this.readSync(n.real.dataId),this.readSync(n.imag.dataId))}return function(e,t){if(Array.isArray(e))return e;if("float32"===t)return e instanceof Float32Array?e:new Float32Array(e);if("int32"===t)return e instanceof Int32Array?e:new Int32Array(e);if("bool"===t||"string"===t)return Uint8Array.from(new Int32Array(e));throw new Error(`Unknown dtype ${t}`)}(this.data.get(e).values,t)}bufferSync(e){const t=this.readSync(e.dataId);if("string"===e.dtype)try{const n=t.map((e=>nc(e)));return vd(e.shape,e.dtype,n)}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return vd(e.shape,e.dtype,t)}makeOutput(e,t,n){return ch().makeTensorFromTensorInfo(this.makeTensorInfo(t,n,e),this)}disposeData(e,t=!1){if(this.data.has(e)){if(this.data.get(e).refCount--,!t&&this.data.get(e).refCount>0)return!1;const{complexTensorInfos:n}=this.data.get(e);null!=n&&(this.disposeData(n.real.dataId,!0),this.disposeData(n.imag.dataId,!0)),this.data.delete(e)}return!0}disposeIntermediateTensorInfo(e){this.disposeData(e.dataId)}async time(e){const t=ec();e();return{kernelMs:ec()-t}}memory(){return{unreliable:!0,reasons:["The reported memory is an upper bound. Due to automatic garbage collection, the true allocated memory may be less."]}}where(e){kI([e],"where");const t=this.readSync(e.dataId);return wI(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}}AI.nextDataId=0;function xI(e){return(t,n,a)=>{const i=Ws(n,t.length);for(let n=0;n{const{x:r}=a;kI(r,e);const o=s,l=o.data.get(r.dataId).values;let u;if("string"===r.dtype){if(!Array.isArray(l))throw new Error("String tensor's value was not an instance of Array");u=mk(l)}else u=l;const c=n||r.dtype,h=t(u,c,i);return o.makeTensorInfo(r.shape,c,h)}}fh("cpu",(()=>new AI),1);const EI=CI(mo,(e=>e>=0?e:Math.exp(e)-1)),_I={kernelName:mo,backendName:"cpu",kernelFunc:EI};function TI(e){const{inputs:t,backend:n}=e,{x:a}=t;return n.incRef(a.dataId),{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}const II={kernelName:Ro,backendName:"cpu",kernelFunc:TI};function NI(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{alpha:s}=a;kI([i],"leakyRelu");const r=zs(i.shape),o=n.data.get(i.dataId).values,l=Us("float32",r);for(let e=0;e{const r=Kd(t,n),o=r.length,l=Ys(r),u=Us(s,zs(r)),c=t.length,h=n.length,d=Ys(t),p=Ys(n),m=qd(t,r),f=qd(n,r);if(m.length+f.length===0)for(let t=0;ts[e]=0));const r=ir(s,c,d),g=n.slice(-h);f.forEach((e=>g[e]=0));const y=ir(g,h,p);u[t]=e(a[r],i[y])}return[u,r]}}const zI=DI(((e,t)=>e<0?t*e:e));function OI(e){const{inputs:t,backend:n}=e,{x:a,alpha:i}=t;kI([a,i],"prelu");const s=n.data.get(a.dataId).values,r=n.data.get(i.dataId).values,[o,l]=zI(a.shape,i.shape,s,r,"float32");return n.makeTensorInfo(l,"float32",o)}const MI={kernelName:bl,backendName:"cpu",kernelFunc:OI},BI=CI(El,(e=>Math.max(0,e))),FI={kernelName:El,backendName:"cpu",kernelFunc:BI},LI=CI(Dl,(e=>Math.min(Math.max(0,e),6))),PI={kernelName:Dl,backendName:"cpu",kernelFunc:LI},jI=xI((e=>1/(1+Math.exp(-e)))),VI=CI(ql,(e=>1/(1+Math.exp(-e)))),UI={kernelName:ql,backendName:"cpu",kernelFunc:VI};function WI(e,t,n,a,i){if("linear"===n)return TI({inputs:{x:t},backend:e});if("relu"===n)return BI({inputs:{x:t},backend:e});if("elu"===n)return EI({inputs:{x:t},backend:e});if("relu6"===n)return LI({inputs:{x:t},backend:e});if("prelu"===n)return OI({inputs:{x:t,alpha:a},backend:e});if("leakyrelu"===n)return NI({inputs:{x:t},backend:e,attrs:{alpha:i}});if("sigmoid"===n)return VI({inputs:{x:t},backend:e});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function GI(e){const{inputs:t,backend:n}=e,{real:a,imag:i}=t,s=n.data.get(a.dataId).values,r=n.data.get(i.dataId).values,o=n.makeTensorInfo(a.shape,"complex64");return n.data.get(o.dataId).complexTensorInfos={real:n.makeTensorInfo(a.shape,"float32",s),imag:n.makeTensorInfo(i.shape,"float32",r)},o}const qI={kernelName:Vr,backendName:"cpu",kernelFunc:GI};function HI(e,t,n="float32"){if("complex64"===n){return GI({inputs:{real:HI(e,t,"float32"),imag:HI(e,t,"float32")},backend:e})}const a=tr(zs(t),n);return e.makeTensorInfo(t,n,a)}function KI(e){const{inputs:t,backend:n}=e,{input:a}=t,i=n.data.get(a.dataId).complexTensorInfos.real,s=n.data.get(i.dataId).values;return n.makeTensorInfo(i.shape,i.dtype,s)}const $I={kernelName:Cl,backendName:"cpu",kernelFunc:KI};function ZI(e,t,n,a){if("int32"===a){return[t,"int32",Int32Array.from(e)]}if("bool"===a){const a=Ju([0],n),[i,s]=DI(((e,t)=>e!==t?1:0))(t,[],e,a,"bool");return[s,"bool",i]}throw new Error(`Error in Cast: failed to cast ${n} to ${a}`)}function XI(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{dtype:s}=a;if("complex64"===s){if("complex64"===i.dtype)return TI({inputs:{x:i},backend:n});const e=HI(n,i.shape,i.dtype),t=XI({inputs:{x:i},backend:n,attrs:{dtype:"float32"}}),a=GI({inputs:{real:t,imag:e},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),a}if("complex64"===i.dtype){const e=KI({inputs:{input:i},backend:n}),t=XI({inputs:{x:e},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(e),t}if(!Gs(i.dtype,s)){const e=TI({inputs:{x:i},backend:n});return{dataId:e.dataId,shape:e.shape,dtype:s}}const r=n.data.get(i.dataId).values,[o,l,u]=ZI(r,i.shape,i.dtype,s);return n.makeTensorInfo(o,l,u)}const YI={kernelName:Lr,backendName:"cpu",kernelFunc:XI};function QI(e,t,n,a){return null==n?({inputs:n,backend:i})=>{const{a:s,b:r}=n,o=i;kI([s,r],e);const l=o.data.get(s.dataId).values,u=o.data.get(r.dataId).values,c="string"===s.dtype?mk(l):l,h="string"===s.dtype?mk(u):u,d=a||s.dtype,[p,m]=t(s.shape,r.shape,c,h,d);return o.makeTensorInfo(m,d,p)}:({inputs:e,backend:i})=>{const{a:s,b:r}=e,o=i;if("complex64"===s.dtype||"complex64"===r.dtype){const e=XI({inputs:{x:s},backend:o,attrs:{dtype:"complex64"}}),t=o.data.get(e.dataId),a=t.complexTensorInfos.real,i=t.complexTensorInfos.imag,l=o.data.get(a.dataId).values,u=o.data.get(i.dataId).values,c=XI({inputs:{x:r},backend:o,attrs:{dtype:"complex64"}}),h=o.data.get(c.dataId),d=h.complexTensorInfos.real,p=h.complexTensorInfos.imag,m=o.data.get(d.dataId).values,f=o.data.get(p.dataId).values,[g,y,b]=n(s.shape,r.shape,l,u,m,f),v=o.makeTensorInfo(b,"float32",g),k=o.makeTensorInfo(b,"float32",y),w=GI({inputs:{real:v,imag:k},backend:o});return o.disposeIntermediateTensorInfo(e),o.disposeIntermediateTensorInfo(c),o.disposeIntermediateTensorInfo(v),o.disposeIntermediateTensorInfo(k),w}{const e=o.data.get(s.dataId).values,n=o.data.get(r.dataId).values,i=a||s.dtype,[l,u]=t(s.shape,r.shape,e,n,i);return o.makeTensorInfo(u,i,l)}}}function JI(e){return(t,n,a,i,s,r)=>{const o=Kd(t,n),l=zs(o),u=o.length,c=Ys(o),h=Us("float32",l),d=Us("float32",l),p=qd(t,o),m=qd(n,o),f=Ov(a,i),g=Ov(s,r),y=t.length,b=Ys(t),v=n.length,k=Ys(n);if(p.length+m.length===0)for(let t=0;ta[e]=0));const i=ir(a,y,b),s=n.slice(-v);m.forEach((e=>s[e]=0));const r=ir(s,v,k),o=e(f[2*i],f[2*i+1],g[2*r],g[2*r+1]);h[t]=o.real,d[t]=o.imag}return[h,d,o]}}const eN=DI(((e,t)=>e+t)),tN=JI(((e,t,n,a)=>({real:e+n,imag:t+a}))),nN=QI(br,eN,tN),aN={kernelName:br,backendName:"cpu",kernelFunc:nN};function iN(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{shape:s}=a,r=zs(i.shape),o=Ps(s,r),l=zs(o);Ns(r===l,(()=>`The new shape (${o}) has ${l} elements and the old shape (${i.shape}) has ${r} elements. The new shape and old shape must have the same number of elements.`)),n.incRef(i.dataId);const u=n.data.get(i.dataId);if(null!=u.complexTensorInfos){const e=u.complexTensorInfos.real,t=u.complexTensorInfos.imag;e.shape=o,t.shape=o}return{dataId:i.dataId,shape:o,dtype:i.dtype}}const sN={kernelName:_l,backendName:"cpu",kernelFunc:iN};function rN(e){const{inputs:t,backend:n,attrs:a}=e,{a:i,b:s}=t,{transposeA:r,transposeB:o}=a;kI([i,s],"matMul");const l=i.shape.length,u=s.shape.length,c=r?i.shape[l-2]:i.shape[l-1],h=o?s.shape[u-1]:s.shape[u-2],d=r?i.shape[l-1]:i.shape[l-2],p=o?s.shape[u-2]:s.shape[u-1],m=i.shape.slice(0,-2),f=s.shape.slice(0,-2),g=zs(m),y=zs(f),b=Kd(i.shape.slice(0,-2),s.shape.slice(0,-2)).concat([d,p]);Ns(c===h,(()=>`Error in matMul: inner shapes (${c}) and (${h}) of Tensors with shapes ${i.shape} and ${s.shape} and transposeA=${r} and transposeB=${o} must match.`));const v=o?[y,p,h]:[y,h,p],k=iN({inputs:{x:i},backend:n,attrs:{shape:r?[g,c,d]:[g,d,c]}}),w=iN({inputs:{x:s},backend:n,attrs:{shape:v}}),A=r?k.shape[1]:k.shape[2],x=r?k.shape[2]:k.shape[1],C=o?w.shape[1]:w.shape[2],S=Math.max(g,y),E=n.data.get(k.dataId).values,_=n.data.get(w.dataId).values,T=Ys(k.shape),I=Ys(w.shape),[N,R,D]=r?[T[0],1,T[1]]:[T[0],T[1],1],[z,O,M]=o?[1,I[1],I[0]]:[I[1],1,I[0]],B=x*C,F=vd([S,x,C],k.dtype),L=F.values,P=n.blockSize;for(let e=0;e{const{x:t}=e.inputs,n=e.backend;kI(t,"abs");let a=new Float32Array(zs(t.shape));return a=uN(n.data.get(t.dataId).values),n.makeOutput(a,t.shape,t.dtype)}},hN=CI(gr,(e=>Math.acos(e))),dN={kernelName:gr,backendName:"cpu",kernelFunc:hN},pN=CI(yr,(e=>Math.acosh(e))),mN={kernelName:yr,backendName:"cpu",kernelFunc:pN};const fN={kernelName:vr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,a=t;kI(t,"addN");const i=a.map((e=>n.data.get(e.dataId).values)),s=vd(a[0].shape,a[0].dtype),r=s.values;for(let e=0;en&&(n=i,a=e)}d[e]=a}return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(c,"int32",d)}};const AN={kernelName:xr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s}=a;kI(i,"argMin");let r=js(s,i.shape);const o=vf(r,i.shape.length);let l=i;const u=[];null!=o&&(l=yN({inputs:{x:i},backend:n,attrs:{perm:o}}),u.push(l),r=wf(r.length,l.shape.length)),r=[r[0]],bf("argMin",r,l.shape.length);const[c,h]=gf(l.shape,r),d=tr(zs(c),"int32"),p=zs(h),m=n.data.get(l.dataId).values;for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(c,"int32",d)}},xN=CI(Cr,(e=>Math.asin(e))),CN={kernelName:Cr,backendName:"cpu",kernelFunc:xN},SN=CI(Sr,(e=>Math.asinh(e))),EN={kernelName:Sr,backendName:"cpu",kernelFunc:SN},_N=CI(Er,(e=>Math.atan(e))),TN={kernelName:Er,backendName:"cpu",kernelFunc:_N},IN=DI(((e,t)=>Math.atan2(e,t))),NN=QI(Tr,IN),RN={kernelName:Tr,backendName:"cpu",kernelFunc:NN},DN=CI(_r,(e=>Math.atanh(e))),zN={kernelName:_r,backendName:"cpu",kernelFunc:DN};function ON(e,t,n,a,i,s){const r=i.strideHeight,o=i.strideWidth,l=i.dilationHeight,u=i.dilationWidth,c=i.effectiveFilterHeight,h=i.effectiveFilterWidth,d=i.padInfo.top,p=i.padInfo.left,m="max"===s?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,f=vd(i.outShape,n),g=f.values,y=i.outShape[1]*i.outShape[2]*i.outShape[3],b=i.outShape[2]*i.outShape[3],v=i.outShape[3];for(let t=0;ty?y=r:"avg"===s&&(b+=r,k++)}if(isNaN(y))break}g[x+n*v+t]="avg"===s?b/k:y}}}return f}function MN(e,t,n,a,i=!1,s=!1){const r=vd(a.outShape,"int32"),o=a.strideHeight,l=a.strideWidth,u=a.dilationHeight,c=a.dilationWidth,h=a.effectiveFilterHeight,d=a.effectiveFilterWidth,p=a.padInfo.top,m=a.padInfo.left,f=vd(t,n,e);for(let e=0;ek&&(k=u,w=i?s?((e*a.inHeight+n)*a.inWidth+o)*a.inChannels+t:(n*a.inWidth+o)*a.inChannels+t:r*d+l)}}r.set(w,e,n,o,t)}}return r}function BN(e,t,n,a,i,s){const r=i.strideDepth,o=i.strideHeight,l=i.strideWidth,u=i.dilationDepth,c=i.dilationHeight,h=i.dilationWidth,d=i.effectiveFilterDepth,p=i.effectiveFilterHeight,m=i.effectiveFilterWidth,f=i.padInfo.front,g=i.padInfo.top,y=i.padInfo.left,b="max"===s?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,v=vd(i.outShape,n),k=v.values,w=i.outShape[1]*i.outShape[2]*i.outShape[3]*i.outShape[4],A=i.outShape[2]*i.outShape[3]*i.outShape[4],x=i.outShape[3]*i.outShape[4],C=i.outShape[4];for(let t=0;tA?A=i:"avg"===s&&(x+=i,S++),isNaN(A))break}if(isNaN(A))break}if(isNaN(A))break}k[g+t]="avg"===s?x/Math.max(S,1):A}}}}return v}const FN={kernelName:Ir,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;kI(i,"avgPool");const{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=a;Ns(fm(r,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);let c;if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))c=TI({inputs:{x:i},backend:n});else{const e=n.data.get(i.dataId).values,t=Ys(i.shape),a=ON(e,i.shape,i.dtype,t,u,"avg");c=n.makeTensorInfo(u.outShape,i.dtype,a.values)}return c}};const LN={kernelName:Rr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l,dataFormat:u}=a;kI(i,"avgPool3d");const c=rm(i.shape,s,r,1,o,l,u),h=BN(n.data.get(i.dataId).values,i.shape,i.dtype,Ys(i.shape),c,"avg");return n.makeTensorInfo(h.shape,"float32",h.values)}};const PN={kernelName:Dr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,{filterSize:r,strides:o,pad:l,dimRoundingMode:u}=a;kI([i,s],"avgPool3DGrad");const c=rm(s.shape,r,o,1,l,u),h=c.strideDepth,d=c.strideHeight,p=c.strideWidth,m=c.filterDepth,f=c.filterHeight,g=c.filterWidth,y=c.dilationDepth,b=c.dilationHeight,v=c.dilationWidth,k=c.effectiveFilterDepth,w=c.effectiveFilterHeight,A=c.effectiveFilterWidth,x=k-1-c.padInfo.front,C=A-1-c.padInfo.left,S=w-1-c.padInfo.top,E=vd(s.shape,"float32"),_=1/(m*f*g),T=n.bufferSync(i);for(let e=0;e=c.outDepth||Math.floor(a)!==a))for(let n=0;n=c.outHeight||Math.floor(i)!==i))for(let n=0;n=c.outWidth||Math.floor(s)!==s)continue;l+=T.get(e,a,i,s,t)}}}E.set(l*_,e,n,a,i,t)}return n.makeTensorInfo(E.shape,E.dtype,E.values)}};const jN={kernelName:Nr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s;kI([i,s],"avgPoolGrad");const{filterSize:o,strides:l,pad:u}=a,c=sm(r.shape,o,l,1,u),h=c.strideHeight,d=c.strideWidth,p=c.filterHeight,m=c.filterWidth,f=c.dilationHeight,g=c.dilationWidth,y=c.effectiveFilterHeight,b=c.effectiveFilterWidth,v=b-1-c.padInfo.left,k=y-1-c.padInfo.top,w=vd(r.shape,"float32"),A=1/(p*m),x=n.data.get(i.dataId).values,C=vd(i.shape,"float32",x);for(let e=0;e=c.outHeight||Math.floor(a)!==a))for(let n=0;n=c.outWidth||Math.floor(i)!==i)continue;r+=C.get(e,a,i,t)}}w.set(r*A,e,n,a,t)}return n.makeTensorInfo(w.shape,w.dtype,w.values)}};const VN={kernelName:Eo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,scale:s,offset:r,mean:o,variance:l}=t;Ns(o.shape.length===l.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),Ns(null==r||o.shape.length===r.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),Ns(null==s||o.shape.length===s.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks.")),kI([i,o,l,s,r],"batchNorm");let{varianceEpsilon:u}=a;null==u&&(u=.001);const c=n.data.get(i.dataId).values,h=n.data.get(o.dataId).values,d=n.data.get(l.dataId).values,p=s?n.data.get(s.dataId).values:new Float32Array([1]),m=r?n.data.get(r.dataId).values:new Float32Array([0]),f=new Float32Array(c.length),g=m.length,y=p.length,b=d.length,v=h.length;let k=0,w=0,A=0,x=0;for(let e=0;e=g&&(k=0),w>=v&&(w=0),A>=y&&(A=0),x>=b&&(x=0);return n.makeTensorInfo(i.shape,i.dtype,f)}};function UN(e,t,n,a,i){const s=Vp(a,t,n),r=zs(n),o=Ys(a);if(s){const n=Up(t,o);return"string"===i?e.slice(n,n+r):e.subarray(n,n+r)}const l=vd(a,i,"string"===i?mk(e):e),u=vd(n,i);for(let e=0;ee+t[n]));u.set(l.get(...a),...n)}return"string"===i?fk(u.values):u.values}function WN(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{begin:s,size:r}=a;kI(i,"slice");const[o,l]=Wp(i,s,r);Ip(i,o,l);const u=UN(n.data.get(i.dataId).values,o,l,i.shape,i.dtype);return n.makeTensorInfo(l,i.dtype,u)}const GN={kernelName:Vl,backendName:"cpu",kernelFunc:WN};const qN={kernelName:Or,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockShape:s,crops:r}=a;kI([i],"batchToSpaceND");const o=s.reduce(((e,t)=>e*t)),l=kv(i.shape,s,o),u=wv(l.length,s.length),c=Av(i.shape,s,o),h=xv(r,s.length),d=Cv(c,r,s.length),p=iN({inputs:{x:i},backend:n,attrs:{shape:l}}),m=yN({inputs:{x:p},backend:n,attrs:{perm:u}}),f=iN({inputs:{x:m},backend:n,attrs:{shape:c}}),g=WN({inputs:{x:f},backend:n,attrs:{begin:h,size:d}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),g}};function HN(e,t,n,a,i){const s=zs(a),r=tr(i,n);for(let n=0;n=i||(r[a]+=s>0?t[n]:1)}return r}function KN(e,t,n,a=!1){const i=e.shape[0],s=e.shape[1],r=vd([i,n],t.dtype);for(let o=0;o=n||(a?r.set(1,o,s):t.size>0?r.set(r.get(o,s)+t.get(o,i),o,s):r.set(r.get(o,s)+1,o,s))}return r}const $N={kernelName:Mr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,weights:s}=t,{size:r}=a,o=HN(n.data.get(i.dataId).values,n.data.get(s.dataId).values,s.dtype,s.shape,r);return n.makeTensorInfo([r],s.dtype,o)}},ZN=DI(((e,t)=>e&t)),XN=QI(Br,ZN),YN={kernelName:Br,backendName:"cpu",kernelFunc:XN};const QN={kernelName:Fr,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{s0:a,s1:i}=t,s=n.data.get(a.dataId).values,r=n.data.get(i.dataId).values,o=Kd(Array.from(s),Array.from(r));return n.makeTensorInfo([o.length],"int32",Int32Array.from(o))}},JN=xI((e=>Math.ceil(e))),eR=SI(Pr,JN),tR={kernelName:Pr,backendName:"cpu",kernelFunc:eR},nR=CI(jr,((e,t)=>{const n=t;return e>n.clipValueMax?n.clipValueMax:e{const{x:t}=e.inputs,n=e.backend,a=new Float32Array(zs(t.shape)),i=n.data.get(t.dataId),s=i.complexTensorInfos.real,r=i.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(r.dataId).values;for(let e=0;e{const n=zs(e.shape);i.set(e.vals,t),t+=n}))}else{let a=0;e.forEach((e=>{const s="string"===n?mk(e.vals):e.vals;let r=0;for(let n=0;ne.shape)),s);let r=cv(t.map((e=>e.shape)),s);if(0===zs(r))return n.makeTensorInfo(r,t[0].dtype,[]);const o=t.filter((e=>zs(e.shape)>0));if(1===o.length)return TI({inputs:{x:o[0]},backend:n});if("complex64"===o[0].dtype){const e=o.map((e=>KI({inputs:{input:e},backend:n}))),t=o.map((e=>rR({inputs:{input:e},backend:n}))),a=lR({inputs:e,backend:n,attrs:{axis:s}}),i=lR({inputs:t,backend:n,attrs:{axis:s}}),r=GI({inputs:{real:a,imag:i},backend:n});return e.forEach((e=>n.disposeIntermediateTensorInfo(e))),t.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(a),n.disposeIntermediateTensorInfo(i),r}const l=o.map((e=>{const t=zs(e.shape.slice(s));return iN({inputs:{x:e},backend:n,attrs:{shape:[-1,t]}})})),u=l.map((e=>({vals:n.data.get(e.dataId).values,shape:e.shape})));r=cv(l.map((e=>e.shape)),1);const c=1===l[0].shape[0],h=sR(u,r,t[0].dtype,c),d=cv(o.map((e=>e.shape)),s),p=n.makeTensorInfo(d,t[0].dtype,h);return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}const uR={kernelName:Wr,backendName:"cpu",kernelFunc:lR};function cR(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dataFormat:l,dilations:u,dimRoundingMode:c}=a;kI([i,s],"conv2d");const h=ym(l),d=om(i.shape,s.shape,r,u,o,c,!1,h),p=d.filterHeight,m=d.filterWidth,f=d.dilationHeight,g=d.dilationWidth,y=d.padInfo.left,b=d.padInfo.top,v="channelsLast"===d.dataFormat,k=new gc(d.outShape,i.dtype),w=Ys(i.shape),A=Ys(s.shape),x=w[0],C=v?w[1]:w[2],S=v?w[2]:1,E=v?1:w[1],_=k.strides[0],T=v?k.strides[1]:k.strides[2],I=v?k.strides[2]:1,N=v?1:k.strides[1],R=n.data.get(i.dataId).values,D=n.data.get(s.dataId).values,z=k.values;for(let e=0;e=d.inHeight)continue;const s=e*A[0],r=t+n*C;for(let e=0;e=d.inWidth)continue;const i=r+a*S;let o=s+e*A[1];for(let e=0;e=u.inDepth)continue;const s=e*S[0],r=t+n*C[1];for(let e=0;e=u.inHeight)continue;const i=s+e*S[1],o=r+a*C[2];for(let e=0;e=u.inWidth)continue;const s=i+e*S[2],r=o+t*u.inChannels;let l=s;for(let e=0;eMath.cos(e))),bR={kernelName:Xr,backendName:"cpu",kernelFunc:yR},vR=CI(Yr,(e=>Math.cosh(e))),kR={kernelName:Yr,backendName:"cpu",kernelFunc:vR};const wR={kernelName:eo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{image:i,boxes:s,boxInd:r}=t,{cropSize:o,method:l,extrapolationValue:u}=a,[c,h,d,p]=i.shape,m=s.shape[0],[f,g]=o,y=vd([m,f,g,p],"float32"),b=n.data.get(s.dataId).values,v=n.data.get(r.dataId).values,k=n.data.get(i.dataId).values,w=Ys(i.shape),A=Ys(y.shape);for(let e=0;e=c)continue;const o=f>1?(i-n)*(h-1)/(f-1):0,m=g>1?(s-a)*(d-1)/(g-1):0;for(let t=0;t1?n*(h-1)+t*o:.5*(n+i)*(h-1);if(c<0||c>h-1)for(let n=0;n1?a*(d-1)+l*m:.5*(a+s)*(d-1);if(c<0||c>d-1){for(let n=0;n1?a*(d-1)+n*m:.5*(a+s)*(d-1);if(i<0||i>d-1){for(let a=0;ae+m-t-1:(e,t)=>e+t;for(let e=0;ee+m-t-1:(e,t)=>e+t;for(let e=0;e`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${r}`));const o=i.shape[0],l=i.shape[1],u=i.shape[2],c=i.shape[3],h=l*s,d=u*s,p=c/(s*s),m=n.data.get(i.dataId).values,f=new Float32Array(o*h*d*p);let g=0;for(let e=0;e`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${r} and dilations '${d}'`));const p=om(i.shape,s.shape,r,d,o,u,!0),{filterHeight:m,filterWidth:f,dilationHeight:g,dilationWidth:y,padInfo:b}=p,v=b.left,k=b.top,w=p.outChannels/p.inChannels,A=new gc(p.outShape,i.dtype),x=n.data.get(i.dataId).values,C=n.data.get(s.dataId).values,S=A.values;for(let e=0;e=p.inHeight)continue;const s=e*h[0],r=t+n*c[1];for(let e=0;e=p.inWidth)continue;const i=s+e*h[1],o=r+a*p.inChannels;let l=t,u=i;for(let e=0;e{const{x:a,filter:i}=e,{strides:s,pad:r,dilations:o}=n,l=t,u=l.data.get(a.dataId).values,c=a.shape.length,h=l.data.get(i.dataId).values,d=i.shape.length,{batchSize:p,inHeight:m,inWidth:f,inChannels:g,outHeight:y,outWidth:b,padInfo:v,strideHeight:k,strideWidth:w,filterHeight:A,filterWidth:x,dilationHeight:C,dilationWidth:S,outShape:E}=im(a.shape,i.shape,s,r,"NHWC",o),_=zs(E),T=E.length,I=Ws(a.dtype,_);for(let e=0;e=0&&s=0&&pl&&(l=f)}}}I[ir([e,t,s,o],T,Ys(E))]=l}}}return{dataId:l.write(Ju(I,a.dtype),E,a.dtype),shape:E,dtype:a.dtype}}},DR={kernelName:uo,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a,filter:i,dy:s}=e,{strides:r,pad:o,dilations:l}=n,u=t,c=Js(a.shape,u.data.get(a.dataId).values),h=Js(i.shape,u.data.get(i.dataId).values),{batchSize:d,inHeight:p,inWidth:m,inChannels:f,outHeight:g,outWidth:y,padInfo:b,strideHeight:v,strideWidth:k,filterHeight:w,filterWidth:A,dilationHeight:x,dilationWidth:C,outShape:S}=im(a.shape,i.shape,r,o,"NHWC",l);Ns(s.rank===S.length,(()=>`Error in ${uo}, dy must have the same rank as output ${S.length}, but got ${s.rank}`));const E=Js(S,u.data.get(s.dataId).values),_=nr(i.shape,i.dtype);for(let e=0;e=0&&a=0&&ur&&(r=i,o=t,l=n)}}}_[o][l][s]+=E[e][t][a][s]}}}return{dataId:u.write(Ju(_,a.dtype),i.shape,i.dtype),shape:i.shape,dtype:i.dtype}}},zR={kernelName:lo,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a,filter:i,dy:s}=e,{strides:r,pad:o,dilations:l}=n,u=t,c=Js(a.shape,u.data.get(a.dataId).values),h=Js(i.shape,u.data.get(i.dataId).values),{batchSize:d,inHeight:p,inWidth:m,inChannels:f,outHeight:g,outWidth:y,padInfo:b,strideHeight:v,strideWidth:k,filterHeight:w,filterWidth:A,dilationHeight:x,dilationWidth:C,outShape:S}=im(a.shape,i.shape,r,o,"NHWC",l);Ns(s.rank===S.length,(()=>`Error in ${lo}, dy must have the same rank as output ${S.length}, but got ${s.rank}`));const E=Js(S,u.data.get(s.dataId).values),_=nr(a.shape,a.dtype);for(let e=0;e=0&&a=0&&ur&&(r=i,o=a,l=u)}}}_[e][o][l][s]+=E[e][t][a][s]}}}return{dataId:u.write(Ju(_,a.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}};const OR={kernelName:co,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{image:i}=t,{canvas:s,options:r}=a,{contextOptions:o,imageOptions:l}=r||{},u=(null==l?void 0:l.alpha)||1,c=(null==o?void 0:o.contextType)||"2d";if("2d"!==c)throw new Error(`Context type ${o.contextType} is not supported by the CPU backend.`);const h=s.getContext(c,(null==o?void 0:o.contextAttributes)||{});if(null==h)throw new Error(`Could not get the context with ${c} type.`);const[d,p]=i.shape.slice(0,2),m=2===i.shape.length?1:i.shape[2],f=n.data.get(i.dataId).values,g="float32"===i.dtype?255:1,y=new Uint8ClampedArray(p*d*4);for(let e=0;e1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${a}.`)}else if("int32"===i.dtype&&(a<0||a>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${a}.`);1===m?(t[0]=a*g,t[1]=a*g,t[2]=a*g):t[n]=a*g}const n=4*e;y[n+0]=Math.round(t[0]),y[n+1]=Math.round(t[1]),y[n+2]=Math.round(t[2]),y[n+3]=Math.round(t[3])}s.width=p,s.height=d;const b=new ImageData(y,p,d);return h.putImageData(b,0,0),i}},MR=DI(((e,t)=>e*t)),BR=JI(((e,t,n,a)=>({real:e*n-t*a,imag:e*a+t*n}))),FR=QI(ol,MR,BR),LR={kernelName:ol,backendName:"cpu",kernelFunc:FR};function PR(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a;let o;kI(i,"sum"),o="bool"===i.dtype?XI({inputs:{x:i},backend:n,attrs:{dtype:"int32"}}):TI({inputs:{x:i},backend:n});const l=o.shape.length,u=js(s,o.shape),c=vf(u,l);let h=u,d=o;null!=c&&(d=yN({inputs:{x:o},backend:n,attrs:{perm:c}}),h=wf(h.length,l)),bf("sum",h,d.shape.length);const[p,m]=gf(d.shape,h);let f=HI(n,p,Oc(d.dtype,"int32"));const g=zs(m),y=n.data.get(f.dataId).values,b=n.data.get(d.dataId).values;for(let e=0;e=0&&(d=PR({inputs:{x:d},backend:n,attrs:{axis:u[e]-(r.length-p),keepDims:!1}}),m.push(d)),p--)}for(const e of m)e!==d&&n.disposeIntermediateTensorInfo(e);return d}};const UR={kernelName:fo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{dy:a,y:i}=t;kI([a,i],"eluGrad");const s=new Float32Array(zs(i.shape)),r=n.data.get(i.dataId).values,o=n.data.get(a.dataId).values;for(let e=0;e=0?o[e]:o[e]*(t+1)}return n.makeTensorInfo(i.shape,"float32",s)}},WR=DI(((e,t)=>e===t?1:0)),GR=QI(yo,WR,null,"bool"),qR={kernelName:yo,backendName:"cpu",kernelFunc:GR},HR=Tv,KR=Iv,$R=Nv,ZR=Rv,XR=Dv,YR=zv,QR=CI(go,(e=>{const t=Math.sign(e),n=Math.abs(e),a=1/(1+HR*n);return t*(1-((((YR*a+XR)*a+ZR)*a+$R)*a+KR)*a*Math.exp(-n*n))})),JR={kernelName:go,backendName:"cpu",kernelFunc:QR},eD=xI((e=>Math.exp(e))),tD=SI(bo,eD,"float32"),nD={kernelName:bo,backendName:"cpu",kernelFunc:tD};function aD(e){const{inputs:t,backend:n,attrs:a}=e,{input:i}=t,{dim:s}=a,r=i.shape.length,o=i.shape.slice();let l=s;return s<0&&(Ns(-(r+1)<=s,(()=>`Axis must be in the interval [${-(r+1)}, ${r}]`)),l=r+s+1),o.splice(l,0,1),iN({inputs:{x:i},backend:n,attrs:{shape:o}})}const iD={kernelName:vo,backendName:"cpu",kernelFunc:aD},sD=xI((e=>Math.expm1(e))),rD=SI(ko,sD),oD={kernelName:ko,backendName:"cpu",kernelFunc:rD},lD=DI(((e,t)=>e/t)),uD=QI(ho,lD),cD={kernelName:ho,backendName:"cpu",kernelFunc:uD},hD=DI(((e,t)=>e-t)),dD=JI(((e,t,n,a)=>({real:e-n,imag:t-a}))),pD=QI(cu,hD,dD),mD={kernelName:cu,backendName:"cpu",kernelFunc:pD};function fD(e,t,n){const a=e.shape,i=a[0],s=a[1],r=n.data.get(e.dataId),o=r.complexTensorInfos.real,l=r.complexTensorInfos.imag,u=[i,s],c=zs(u),h=Us("float32",c),d=Us("float32",c);for(let e=0;e{const{image:a}=e,i=n,s=Us(a.dtype,zs(a.shape)),[r,o,l,u]=a.shape,c=i.data.get(a.dataId).values;for(let e=0;e=0&&rMath.floor(e))),xD=SI(Co,AD),CD={kernelName:Co,backendName:"cpu",kernelFunc:xD},SD=DI(((e,t)=>Math.floor(e/t))),ED=QI(So,SD,null,"int32"),_D={kernelName:So,backendName:"cpu",kernelFunc:ED};const TD={kernelName:Su,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:m}=a;let f=cR({inputs:{x:i,filter:s},backend:n,attrs:{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d}});if(r){const e=f;if("NCHW"===c&&1===r.shape.length&&1!==r.shape[0]){const e=iN({inputs:{x:r},backend:n,attrs:{shape:[r.shape[0],1,1]}});f=nN({inputs:{a:f,b:e},backend:n}),n.disposeIntermediateTensorInfo(e)}else f=nN({inputs:{a:f,b:r},backend:n});n.disposeIntermediateTensorInfo(e)}if(p){const e=f;if("NCHW"===c&&"prelu"===p&&1===o.shape.length&&1!==o.shape[0]){const e=iN({inputs:{x:o},backend:n,attrs:{shape:[o.shape[0],1,1]}});f=WI(n,f,p,e,m),n.disposeIntermediateTensorInfo(e)}else f=WI(n,f,p,o,m);n.disposeIntermediateTensorInfo(e)}return f}};const ID={kernelName:Eu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:m}=a;let f=ER({inputs:{x:i,filter:s},backend:n,attrs:{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d}});if(r){const e=f;f=nN({inputs:{a:f,b:r},backend:n}),n.disposeIntermediateTensorInfo(e)}if(p){const e=f;f=WI(n,f,p,o,m),n.disposeIntermediateTensorInfo(e)}return f}};function ND(e,t,n,a,i,s,r,o,l){const u=vd([a,s],n);for(let n=0;n=l/s)throw new Error(`Invalid indices: ${a} does not index into ${o}`);for(let e=0;e=0,(()=>`GatherV2: the index value ${t} is not in [0, ${c-1}]`))}let h=o;null==o&&(h=0);const d=zs(s.shape),p=pk(i,s,l,h),m=iN({inputs:{x:i},backend:n,attrs:{shape:[p.batchSize,p.outerSize,p.dimSize,p.sliceSize]}}),f=iN({inputs:{x:s},backend:n,attrs:{shape:[p.batchSize,d/p.batchSize]}}),g=[p.batchSize,p.outerSize,d/p.batchSize,p.sliceSize],y=n.bufferSync(f),b=DD(n.bufferSync(m),y,g);return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),n.makeTensorInfo(p.outputShape,b.dtype,b.values)}},OD=DI(((e,t)=>e>t?1:0)),MD=QI(Io,OD,null,"bool"),BD={kernelName:Io,backendName:"cpu",kernelFunc:MD},FD=DI(((e,t)=>e>=t?1:0)),LD=QI(No,FD,null,"bool"),PD={kernelName:No,backendName:"cpu",kernelFunc:LD};const jD={kernelName:Do,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{input:a}=t,i=zs(a.shape),s=a.shape[a.shape.length-1],r=iN({inputs:{x:a},backend:n,attrs:{shape:[i/s,s]}}),o=fD(r,!0,n),l=iN({inputs:{x:o},backend:n,attrs:{shape:a.shape}});return n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(o),l}},VD=CI(Oo,(e=>Number.isFinite(e)?1:0),"bool"),UD={kernelName:Oo,backendName:"cpu",kernelFunc:VD},WD=CI(Mo,(e=>Math.abs(e)===1/0?1:0),"bool"),GD={kernelName:Mo,backendName:"cpu",kernelFunc:WD},qD=CI(Bo,(e=>Number.isNaN(e)?1:0),"bool"),HD={kernelName:Bo,backendName:"cpu",kernelFunc:qD},KD=DI(((e,t)=>ee<=t?1:0)),YD=QI(Po,XD,null,"bool"),QD={kernelName:Po,backendName:"cpu",kernelFunc:YD};function JD(e,t,n){const a=(t-e)/(n-1),i=tr(n,"float32");i[0]=e;for(let e=1;eMath.log(e))),nz=SI(Vo,tz),az={kernelName:Vo,backendName:"cpu",kernelFunc:nz},iz=CI(Uo,(e=>Math.log1p(e))),sz={kernelName:Uo,backendName:"cpu",kernelFunc:iz},rz=DI(((e,t)=>e&&t)),oz=QI(Wo,rz,null,"bool"),lz={kernelName:Wo,backendName:"cpu",kernelFunc:oz},uz=CI(Go,(e=>e?0:1),"bool"),cz={kernelName:Go,backendName:"cpu",kernelFunc:uz},hz=DI(((e,t)=>e||t)),dz=QI(qo,hz,null,"bool"),pz={kernelName:qo,backendName:"cpu",kernelFunc:dz};const mz={kernelName:Ho,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{depthRadius:s,bias:r,alpha:o,beta:l}=a;kI(i,"LRN");const u=i.shape[3],c=u-1,h=n.data.get(i.dataId).values,d=zs(i.shape),p=new Float32Array(d);function m(e){const t=e%u;let n=e-t+Math.max(0,t-s);const a=e-t+Math.min(t+s,c);let i=0;for(;n<=a;n++){const e=h[n];i+=e*e}return i}for(let e=0;es)&&(s=t)}i[n]=s}return i}function yz(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{reductionIndices:s,keepDims:r}=a,o=n;let l=i.shape;const u=l.length,c=js(s,l);let h=c;const d=vf(h,u);let p=o.data.get(i.dataId).values;if(null!=d){const e=new Array(u);for(let t=0;tMath.max(e,t))),kz=QI(Zo,vz),wz={kernelName:Zo,backendName:"cpu",kernelFunc:kz};const Az={kernelName:Xo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;kI(i,"maxPool");const{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=a;Ns(fm(r,1),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);let c;if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))c=TI({inputs:{x:i},backend:n});else{const e=n.data.get(i.dataId).values,t=Ys(i.shape),a=ON(e,i.shape,i.dtype,t,u,"max");c=n.makeTensorInfo(u.outShape,i.dtype,a.values)}return c}};const xz={kernelName:Qo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l,dataFormat:u}=a;kI(i,"maxPool3d");const c=rm(i.shape,s,r,1,o,l,u),h=BN(n.data.get(i.dataId).values,i.shape,i.dtype,Ys(i.shape),c,"max");return n.makeTensorInfo(h.shape,"float32",h.values)}};const Cz={kernelName:Jo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,{filterSize:r,strides:o,pad:l,dimRoundingMode:u}=a;kI([i,s],"maxPool3DGrad");const c=rm(s.shape,r,o,1,l,u),h=function(e,t){const n=vd(t.outShape,"int32"),a=t.strideDepth,i=t.strideHeight,s=t.strideWidth,r=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,u=t.effectiveFilterDepth,c=t.effectiveFilterHeight,h=t.effectiveFilterWidth,d=t.padInfo.front,p=t.padInfo.top,m=t.padInfo.left;for(let f=0;f=C&&(C=o,S=n*c*h+i*c+r)}}}n.set(S,f,y,a,i,g)}}}return n}(n.bufferSync(s),c),d=c.strideDepth,p=c.strideHeight,m=c.strideWidth,f=c.dilationDepth,g=c.dilationHeight,y=c.dilationWidth,b=c.effectiveFilterDepth,v=c.effectiveFilterHeight,k=c.effectiveFilterWidth,w=b-1-c.padInfo.front,A=k-1-c.padInfo.left,x=v-1-c.padInfo.top,C=vd(s.shape,"float32"),S=n.bufferSync(i);for(let e=0;e=c.outDepth||Math.floor(a)!==a))for(let i=0;i=c.outHeight||Math.floor(s)!==s))for(let r=0;r=c.outWidth||Math.floor(u)!==u)continue;const d=b*v*k-1-h.get(e,a,s,u,t)===n*v*k+i*k+r?1:0;if(0===d)continue;l+=S.get(e,a,s,u,t)*d}}}C.set(l,e,n,a,i,t)}return n.makeTensorInfo(C.shape,C.dtype,C.values)}};const Sz={kernelName:Yo,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s,output:r}=t,o=s;kI([s,r],"maxPoolGrad");const{filterSize:l,strides:u,pad:c,dimRoundingMode:h}=a,d=sm(o.shape,l,u,1,c,h),p=n.data.get(o.dataId).values,m=vd(d.outShape,o.dtype,MN(p,o.shape,o.dtype,d).values),f=d.strideHeight,g=d.strideWidth,y=d.dilationHeight,b=d.dilationWidth,v=d.effectiveFilterHeight,k=d.effectiveFilterWidth,w=k-1-d.padInfo.left,A=v-1-d.padInfo.top,x=vd(o.shape,"float32"),C=n.data.get(i.dataId).values,S=vd(i.shape,"float32",C);for(let e=0;e=d.outHeight||Math.floor(a)!==a))for(let i=0;i=d.outWidth||Math.floor(o)!==o)continue;const l=v*k-1-m.get(e,a,o,t)===n*k+i?1:0;if(0===l)continue;r+=S.get(e,a,o,t)*l}}x.set(r,e,n,a,t)}return n.makeTensorInfo(x.shape,x.dtype,x.values)}};const Ez={kernelName:el,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:a}=e,{filterSize:i,strides:s,pad:r,includeBatchInIndex:o}=t,l=n;kI(a,"MaxPoolWithArgmax");const u=l.data.get(a.dataId).values,c=sm(a.shape,i,s,[1,1],r),[h,d]=function(e,t,n,a,i){const s=ON(e,0,n,Ys(t),i,"max"),r=MN(e,t,n,i,!0,a);return[s.values,r.values]}(u,a.shape,a.dtype,o,c),p=l.write(h,c.outShape,a.dtype),m=l.write(d,c.outShape,a.dtype);return[{dataId:p,shape:c.outShape,dtype:a.dtype},{dataId:m,shape:c.outShape,dtype:"int32"}]}};const _z={kernelName:tl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=js(s,i.shape),l=zs(gf(i.shape,o)[1]),u=[],c=n.makeTensorInfo([],"float32",new Float32Array([l]));u.push(c);const h=XI({inputs:{x:i},backend:n,attrs:{dtype:"float32"}});u.push(h);const d=uD({inputs:{a:h,b:c},backend:n});u.push(d);const p=PR({inputs:{x:d},backend:n,attrs:{axis:s,keepDims:r}});return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),p}};const Tz={kernelName:nl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a;kI(i,"min");const o=js(s,i.shape);let l=o;const u=vf(l,i.shape.length);let c=i;null!=u&&(c=yN({inputs:{x:i},backend:n,attrs:{perm:u}}),l=wf(l.length,i.shape.length)),bf("min",l,c.shape.length);const[h,d]=gf(c.shape,l),p=zs(d),m=tr(zs(h),c.dtype),f=n.data.get(c.dataId).values;for(let e=0;eMath.min(e,t))),Nz=QI(al,Iz),Rz={kernelName:al,backendName:"cpu",kernelFunc:Nz};const Dz={kernelName:il,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{paddings:s,mode:r}=a;kI(i,"mirrorPad");const o=s.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=s.map((e=>e[0])),u=s.map(((e,t)=>e[0]+i.shape[t])),c="reflect"===r?0:1,h=n.data.get(i.dataId).values,d=i.shape.length,p=Ys(i.shape),m=zs(o),f=o.length,g=Ys(o),y=Us(i.dtype,m);for(let e=0;e=u[e]&&(t[e]=2*(u[e]-1)-t[e]+c);t=t.map(((e,t)=>e-l[t]));const n=ir(t,d,p);y[e]=h[n]}return{dataId:n.write(y,o,i.dtype),shape:o,dtype:i.dtype}}},zz=DI(((e,t)=>{const n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t})),Oz=QI(sl,zz),Mz={kernelName:sl,backendName:"cpu",kernelFunc:Oz};function Bz(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{dim:s}=a,r=i.shape.length;let o=s;if(-1===o&&(o=r-1),o!==r-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${r} and dim was ${o}`);const l=js([o],i.shape),u=yz({inputs:{x:i},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),c=yf(u.shape,l),h=iN({inputs:{x:u},backend:n,attrs:{shape:c}}),d=pD({inputs:{a:i,b:h},backend:n}),p=tD({inputs:{x:d},backend:n}),m=PR({inputs:{x:p},backend:n,attrs:{axis:l,keepDims:!1}}),f=iN({inputs:{x:m},backend:n,attrs:{shape:c}}),g=uD({inputs:{a:p,b:f},backend:n});return n.disposeIntermediateTensorInfo(u),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),g}const Fz={kernelName:Yl,backendName:"cpu",kernelFunc:Bz};const Lz={kernelName:rl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{numSamples:s,seed:r,normalized:o}=a;kI(i,"multinomial");const l=o?i:Bz({inputs:{logits:i},backend:n,attrs:{dim:-1}}),u=l.shape[0],c=l.shape[1],h=n.data.get(l.dataId).values,d=[u,s],p=tr(zs(d),"int32");for(let e=0;ee!==t?1:0)),$z=QI(ul,Kz,null,"bool"),Zz={kernelName:ul,backendName:"cpu",kernelFunc:$z};const Xz={kernelName:ml,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{indices:i}=t,{dtype:s,depth:r,onValue:o,offValue:l}=a;kI(i,"oneHot");const u=zs(i.shape),c=new Float32Array(u*r);c.fill(l);const h=n.data.get(i.dataId).values;for(let e=0;e=0&&h[e]{Rs(s,e.shape,"All tensors passed to stack must have matching shapes"),Ns(r===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const o=[],l=lR({inputs:t.map((e=>{const t=aD({inputs:{input:e},backend:n,attrs:{dim:i}});return o.push(t),t})),backend:n,attrs:{axis:i}});return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),l}const tO={kernelName:fl,backendName:"cpu",kernelFunc:eO};const nO={kernelName:gl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{paddings:s,constantValue:r}=a;kI(i,"pad");const o=s.map(((e,t)=>e[0]+i.shape[t]+e[1])),l=s.map((e=>e[0])),u=n.data.get(i.dataId).values,c=zs(i.shape),h=i.shape.length,d=Ys(i.shape),p=zs(o),m=o.length,f=Ys(o),g=Us(i.dtype,p);0!==r&&g.fill(r);for(let e=0;ee+l[t])),m,f)]=u[e]}return{dataId:n.write(g,o,i.dtype),shape:o,dtype:i.dtype}}},aO=DI(((e,t)=>Math.pow(e,t))),iO=QI(yl,aO),sO={kernelName:yl,backendName:"cpu",kernelFunc:iO};function rO(e,t,n,a){const[i,s]=gf(e,a),r=Oc(t,"int32"),o=tr(zs(i),r),l=zs(s);for(let e=0;en.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(y,g,m)}};function lO(e,t,n,a){const i=[];let s=0;const r=t.length-1+n.length,o=new Array(r).fill(null).map((()=>[0]));!function(e,t){for(let n=0;ni)throw new Error("Ragged splits must not point past values");for(let e=1;ea[e])throw new Error("Ragged splits must be sorted in ascending order")}}(n,a);let l=1;for(let e=0;e=0){const e=o[i],t=e[e.length-1]-a[r];for(let e=r;e{if(e<0||e>=n){const i=sr(a,t.length,Ys(t)).join(",");throw new Error(`indices[${i}] = ${e} is not in [0, ${n})`)}}))}(s,r,t[0][0]-1),0===a.length)throw new Error("params.rank must be nonzero");const l=a[0],{outSplits:u,valueSlices:c,numValues:h}=lO(s,r,e,l),d=function(e){const t=[];for(let n=0;na[t]=e))}return t}(u),p=cO(n,a,i,c,h);return[d,p[0],p[1]]}const dO={kernelName:kl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{paramsNestedSplits:i,paramsDenseValues:s,indices:r}=t,{outputRaggedRank:o}=a,l=i.map((e=>n.data.get(e.dataId).values)),u=i.map((e=>e.shape)),c=n.data.get(s.dataId).values,h=n.data.get(r.dataId).values,[d,p,m]=hO(l,u,c,s.shape,s.dtype,h,r.shape),f=d.map((e=>n.makeTensorInfo([e.length],"int32",e))),g=n.makeTensorInfo(m,s.dtype,p);return f.concat([g])}},pO=2147483647;function mO(e,t,n,a,i,s,r){if(t.length>1)throw new Error("starts must be a scalar or vector");if(i.length>1)throw new Error("limits must be a scalar or vector");if(r.length>1)throw new Error("deltas must be a scalar or vector");const o=0===t.length,l=0===i.length,u=0===r.length,c=[];o||c.push(t[0]),l||c.push(i[0]),u||c.push(r[0]);for(let e=1;e0&&in)c=0;else if(c=Math.ceil(Math.abs((i-n)/r)),c>pO)throw new Error(`Requires ((limit - start) / delta) <= ${pO}`);d[t+1]=d[t]+c}const p=Ws(n,d[h]);let m=0;for(let t=0;tn&&(n=t)}return n}static getMaxWidthValueRowID(e){const t=e.length;if(0===t)return 0;let n=0,a=e[0],i=0;for(let s=1;s"Final length of result must be equal to firstDimension.")),i}calculateOutputIndexRowSplit(e,t,n,a){const i=e.length,s=[];for(let r=0;r0&&s.length!==e[i-1])throw new Error("Invalid row split size.");return s}calculateOutputIndexValueRowID(e,t,n,a){const i=e.length,s=[];if(0===i)return[];let r=0,o=e[0];if(o>=t.length)throw new Error(`Got currentValueRowId=${o}, which is not less than ${t.length}`);let l=t[o];s.push(l);for(let u=1;u=0&&(++r,r=t.length)throw new Error(`Got nextValueRowId=${i} which is not less than ${t.length}`);l=t[i]}s.push(l)}if(s.length!==e.length)throw new Error("Invalid row ids.");return s}calculateOutputIndex(e,t,n,a){const i=this.getRowPartitionTensor(e),s=this.getRowPartitionTypeByDimension(e);switch(s){case gO.VALUE_ROWIDS:return this.calculateOutputIndexValueRowID(i,t,n,a);case gO.ROW_SPLITS:if(i.length-1>t.length)throw new Error(`Row partition size is greater than output size: ${i.length-1} > ${t.length}`);return this.calculateOutputIndexRowSplit(i,t,n,a);default:throw new Error(`Unsupported partition type: ${gO[s]}`)}}getFirstDimensionSize(){const e=this.rowPartitionValues[0];if(0===this.rowPartitionTypes.length)throw new Error("No row_partition_types given.");const t=this.rowPartitionTypes[0];switch(t){case gO.FIRST_DIM_SIZE:return e[0];case gO.VALUE_ROWIDS:throw new Error("Cannot handle VALUE_ROWIDS in first dimension.");case gO.ROW_SPLITS:return this.rowPartitionValuesShapes[0][0]-1;default:throw new Error(`Cannot handle type ${gO[t]}`)}}compute(){if(this.rowPartitionValues[0].length<=0)throw new Error("Invalid first partition input. Tensor requires at least one element.");const e=this.getFirstDimensionSize(),t=this.calculateOutputSize(e),n=new Array(this.raggedRank+1);n[n.length-1]=1;for(let e=n.length-2;e>=0;--e)n[e]=n[e+1]*t[e+1];const a=vO(t,!1),i=Ws(this.valuesDType,zs(a));if(n[0]*t[0]>0){let s=this.calculateFirstParentOutputIndex(e,n[0],t[0]);for(let e=1;e<=this.raggedRank;++e){s=this.calculateOutputIndex(e-1,s,n[e],t[e])}this.setOutput(this.raggedRank,s,i,a)}return[a,i]}setOutput(e,t,n,a){if(0===n.length)return;const i=this.values,s=n;let r=a.slice();r=r.slice(e+1);const o=zs(r),l=t.length;let u=this.defaultValue;if(u.length!==o&&1!==u.length){const e=this.defaultValueShape;dh((()=>{const t=vm(u,e),n=Bm(t,r);u=n.dataSync()}))}let c=0,h=0,d=0;for(let e=0;e<=l;++e){let a=e=l){const e=n.length;a=Math.floor(e/o)}if(a>d)if(1===this.defaultValue.length)s.subarray(d*o,a*o).fill(this.defaultValue[0]),d=a;else for(;a>d;){bO(s.slice(d*o),u,o),++d}a<0?(c=e+1,h=d):(c=e,h=d,d=h+1)}else++d}}}function bO(e,t,n){for(let a=0;a= 0`);if(a<-1)throw new Error(`Dimension ${a} must be >= -1`);a=-1}n.push(a)}return n}function kO(e,t,n,a,i,s,r,o,l,u){return new yO(e,t,n,a,i,s,r,o,l,u).compute()}const wO={kernelName:Al,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{shape:i,values:s,defaultValue:r,rowPartitionTensors:o}=t,{rowPartitionTypes:l}=a,u=n.data.get(i.dataId).values,c=n.data.get(s.dataId).values,h=n.data.get(r.dataId).values,d=o.map((e=>n.data.get(e.dataId).values)),p=o.map((e=>e.shape)),[m,f]=kO(u,i.shape,c,s.shape,s.dtype,h,r.shape,d,p,l);return n.makeTensorInfo(m,s.dtype,f)}};function AO(e,t,n,a){if(e===t||e1)return tr(0,a);const i=tr(Math.abs(Math.ceil((t-e)/n)),a);t1/e)),SO={kernelName:Sl,backendName:"cpu",kernelFunc:CO};const EO={kernelName:Nl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i}=t,{alignCorners:s,halfPixelCenters:r,size:o}=a;kI(i,"resizeBilinear");const l=Ys(i.shape),[u,c]=o,[h,d,p,m]=i.shape,f=n.data.get(i.dataId).values,g=new Float32Array(zs([h,u,c,m])),y=[s&&u>1?d-1:d,s&&c>1?p-1:p],b=[s&&u>1?u-1:u,s&&c>1?c-1:c];let v=0;const k=y[0]/b[0],w=y[1]/b[1];for(let e=0;e1?u-1:u,r&&p>1?c-1:c],g=[r&&d>1?d-1:d,r&&p>1?p-1:p],y=f[0]/g[0],b=f[1]/g[1],v=n.data.get(s.dataId).values;let k=0;for(let e=0;e1?d-1:d,s&&c>1?p-1:p],b=[s&&u>1?u-1:u,s&&c>1?c-1:c],v=y[0]/b[0],k=y[1]/b[1];let w=0;for(let e=0;e1?c-1:c,r&&m>1?h-1:h],b=[r&&p>1?p-1:p,r&&m>1?m-1:m],v=y[0]/b[0],k=y[1]/b[1],w=1/v,A=1/k,x=2*Math.ceil(w)+2,C=2*Math.ceil(A)+2;for(let e=0;e=p)continue;const d=t+u*l[1],f=u*v;if(e===Math.min(c-1,r?Math.round(f):Math.floor(f)))for(let e=0;e=m)continue;const i=d+t*l[2],s=t*k;a===Math.min(h-1,r?Math.round(s):Math.floor(s))&&(o+=g[i+n])}}f[s+n]=o}}}}return n.makeTensorInfo(i.shape,i.dtype,f)}};const NO={kernelName:zl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{dims:s}=a;kI(i,"reverse");const r=i.shape.length,o=js(s,i.shape);if(0===r)return TI({inputs:{x:i},backend:n});const l=new gc(i.shape,i.dtype),u=n.bufferSync(i);for(let e=0;en[e]=i.shape[e]-1-n[e])),l.set(u.get(...n),...t)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}},RO={kernelName:xu,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:a}=e,{radians:i,fillValue:s,center:r}=t,o=n,l=Us(a.dtype,zs(a.shape)),[u,c,h,d]=a.shape,[p,m]=vv(r,c,h),f=Math.sin(i),g=Math.cos(i),y=o.data.get(a.dataId).values;for(let e=0;e=0&&k=0&&w{const t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1})),zO={kernelName:Ol,backendName:"cpu",kernelFunc:DO},OO=xI((e=>1/Math.sqrt(e))),MO=SI(Ml,OO),BO={kernelName:Ml,backendName:"cpu",kernelFunc:MO};function FO(e,t,n,a,i,s,r,o,l,u){const c=[a/i,i],h=e.values,d=t.values;if(0===a)return vd(n,t.dtype);const p=l instanceof gc?l:vd(c,t.dtype);"string"==typeof l||"number"==typeof l?p.values.fill(l):"boolean"==typeof l&&p.values.fill(+l);for(let e=0;e=a/i)throw new Error(`Invalid indices: ${s} does not index into ${n}`);for(let n=0;n1||1===i.shape.length?1:zs(i.shape.slice(1));for(let e=0;ee>=0?GO*e:WO*(Math.exp(e)-1))),HO={kernelName:jl,backendName:"cpu",kernelFunc:qO},KO=CI(Gl,(e=>e<0?-1:e>0?1:0)),$O={kernelName:Gl,backendName:"cpu",kernelFunc:KO},ZO=CI(Ul,(e=>Math.sin(e))),XO={kernelName:Ul,backendName:"cpu",kernelFunc:ZO},YO=CI(Wl,(e=>Math.sinh(e))),QO={kernelName:Wl,backendName:"cpu",kernelFunc:YO},JO=Math.log(1.1920928955078125e-7)+2,eM=CI(Hl,(e=>{const t=e>-JO,n=e=l)throw new Error(tk(t,n,l));++m[n],d=d&&n>=p,p=n}let f=!0;for(let e=0;e0&&(m[e]+=m[e-1])}if(f&&d){const t=e,n=a;for(let e=0;eNumber(e))))),n.makeTensorInfo([f.length],a.dtype,new Int32Array(f))]}};function sM(e,t,n,a,i){const s=zs(a),r=t[0],o=i.length,l=[];let u=1,c=-1;for(let e=0;e0){d[h-1]=1;for(let e=h-2;e>=0;--e)d[e]=d[e+1]*a[e+1]}const p=[];if(o>0){p[o-1]=1;for(let e=o-2;e>=0;--e)p[e]=p[e+1]*l[e+1]}const m=Ws(n,r*o);for(let t=0;t0?i[o-1]+1:0;if(c<0)throw new Error("segment ids must be >= 0");const h=t.slice();h[0]=c;const d=Ws(n,h.reduce(((e,t)=>e*t),1));if(0===o)return c>0&&d.fill(r),[d,h];if(c<=0)throw new Error("segment ids must be >= 0");let p=0,m=1,f=0,g=i[p];for(;;){let t=0;if(m=t)throw new Error("segment ids are not increasing")}if(g<0||g>=c)throw new Error(uk(g,c));g>f&&d.fill(r,f*u,g*u);for(let t=p;t=l[0])throw new Error(ck(t,a[t],l[0]));for(let t=0;to)break}return f{const t=[...c];t[o]=e;const a=WN({inputs:{x:i},backend:n,attrs:{begin:u,size:t}});return u[o]+=e,a}))}},dM=xI((e=>Math.sqrt(e))),pM=CI(Kl,(e=>Math.sqrt(e))),mM={kernelName:Kl,backendName:"cpu",kernelFunc:pM},fM={kernelName:iu,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{const{x:n}=e,a=t;kI(n,"square");const i=a.data.get(n.dataId).values,s=new Float32Array(i.length);for(let e=0;e{const n=e-t;return n*n})),yM=QI(au,gM),bM={kernelName:au,backendName:"cpu",kernelFunc:yM},vM=xI(((e,t)=>{const{pattern:n,replaceGlobal:a,rewrite:i}=t;return e.replace(new RegExp(n,a?"g":""),i)})),kM=SI(su,vM),wM={kernelName:su,backendName:"cpu",kernelFunc:kM},AM=CI(wu,((e,t)=>{const n=t;return isNaN(e)?NaN:e>0?1:n.alpha})),xM={kernelName:wu,backendName:"cpu",kernelFunc:AM};function CM(e,t,n,a){const i=vd(e,t.dtype);for(let e=0;e=1,(()=>`Input must have rank at least 1, got: ${i.shape.length}`));const e=Rp(b,v,k),t=WN({inputs:{x:i},backend:n,attrs:{begin:b,size:e}});w=iN({inputs:{x:t},backend:n,attrs:{shape:m}}),n.disposeIntermediateTensorInfo(t)}else{const e=CM(p,n.bufferSync(i),k,b);w=n.makeTensorInfo(m,e.dtype,e.values)}return w}};class EM{constructor(e,t,n,a,i,s){this.separator=tc(e),this.nGramWidths=t,this.leftPad=tc(n),this.rightPad=tc(a),this.padWidth=i,this.preserveShort=s}getPadWidth(e){return Math.min(this.padWidth<0?e-1:this.padWidth,e-1)}getNumNGrams(e,t){const n=this.getPadWidth(t);return Math.max(0,e+2*n-t+1)}createNGrams(e,t,n,a,i,s){for(let r=0;r0?0:r-o);let d=0;d+=l*this.leftPad.length;for(let t=0;te.forEach((e=>p[m++]=e));for(let e=0;e0){f(e[h+c-1]);for(let e=0;e0){let e=t[0];if(0!==e)throw new Error(`First split value must be 0, got ${e}`);for(let i=1;i=e;if(a=a&&t[i]<=n,!a)throw new Error(`Invalid split value ${t[i]}, must be in [${e}, ${n}]`);e=t[i]}if(e!==n)throw new Error(`Last split value must be data size. Expected ${n}, got ${e}`)}const i=a-1,s=Ws("int32",a);if(0===n||0===a){const e=new Array(n);for(let e=0;e<=i;++e)s[e]=0;return[e,s]}s[0]=0;for(let e=1;e<=i;++e){const n=t[e]-t[e-1];let a=0;this.nGramWidths.forEach((e=>{a+=this.getNumNGrams(n,e)})),this.preserveShort&&n>0&&0===a&&(a=1),s[e]=s[e-1]+a}const r=new Array(s[i]);for(let n=0;n{const o=t[n+1]-t[n],l=this.getNumNGrams(o,s);this.createNGrams(e,a,r,i,l,s),i+=l})),this.preserveShort&&i===s[n]){const s=t[n+1]-t[n];if(0===s)continue;const o=s+2*this.padWidth,l=1;this.createNGrams(e,a,r,i,l,o)}}return[r,s]}}function _M(e,t,n,a,i,s,r,o){return new EM(n,a,i,s,r,o).compute(e,t)}const TM={kernelName:ou,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{separator:i,nGramWidths:s,leftPad:r,rightPad:o,padWidth:l,preserveShortSequences:u}=a,{data:c,dataSplits:h}=t,d=n.data.get(c.dataId).values,p=n.data.get(h.dataId).values,[m,f]=_M(d,p,i,s,r,o,l,u);return[n.makeTensorInfo([m.length],"string",m),n.makeTensorInfo(h.shape,"int32",f)]}};function IM(e,t,n,a){if(!e.length)return;if(0===t.length){for(let t=0;tMath.tan(e))),MM={kernelName:hu,backendName:"cpu",kernelFunc:OM},BM=CI(du,(e=>Math.tanh(e)));function FM(e,t){const n=new Array(e.rank);for(let a=0;a{const n=t.value-e.value;return 0===n?e.index-t.index:n};function PM(e,t,n=0,a=e.length-1){for(;a>n;){if(a-n>600){const i=a-n+1,s=t-n+1,r=Math.log(i),o=.5*Math.exp(2*r/3),l=.5*Math.sqrt(r*o*(i-o)/i)*Math.sign(s-i/2);PM(e,t,Math.max(n,Math.floor(t-s*o/i+l)),Math.min(a,Math.floor(t+(i-s)*o/i+l)))}const i=e[t];let s=n,r=a;for(Is(e,n,t),LM(e[a],i)>0&&Is(e,n,a);s0;)r-=1}0===LM(e[n],i)?Is(e,n,r):(r+=1,Is(e,r,a)),r<=t&&(n=r+1),t<=r&&(a=r-1)}}function jM(e,t,n,a,i){const s=t[t.length-1],[r,o]=[e.length/s,s],l=Us(n,r*a),u=Us("int32",r*a);for(let t=0;tr[t]={value:e,index:t})),at-1)if(t<=1)n=0;else{const e=2*t;n-=e*Math.trunc(n/e),n>=t&&(n=e-n-1)}return _s(0,n,t-1)}(e,t);case"wrap":return function(e,t){let n=e;if(n<0)if(t<=1)n=0;else{const e=t-1;n+=t*(Math.trunc(-n/e)+1)}else if(n>t-1)if(t<=1)n=0;else{const e=t-1;n-=t*Math.trunc(n/e)}return _s(0,n,t-1)}(e,t);case"nearest":return function(e,t){return _s(0,e,t-1)}(e,t);default:return function(e,t){return e}(e)}}function UM(e,t,n,a,i,s,r,o,l,u,c){return 0<=o&&o{for(let n=0;nn.disposeIntermediateTensorInfo(e))),h}},KM=[lN,cN,dN,mN,aN,fN,vN,kN,wN,AN,CN,EN,TN,RN,zN,FN,LN,PN,jN,oN,VN,qN,$N,YN,QN,YI,tR,aR,qI,iR,uR,hR,dR,pR,mR,fR,gR,bR,kR,wR,AR,xR,CR,SR,_R,TR,IR,NR,RR,DR,zR,OR,VR,_I,UR,qR,JR,nD,iD,oD,bD,kD,wD,CD,_D,TD,ID,RD,zD,BD,PD,II,jD,oR,UD,GD,HD,RI,ZD,QD,ez,az,sz,lz,cz,pz,mz,fz,bz,wz,Az,xz,Cz,Sz,Ez,_z,Tz,Rz,Dz,Mz,Lz,LR,jz,Uz,Gz,Hz,Zz,Xz,Jz,tO,nO,sO,MI,oO,dO,fO,wO,xO,$I,cD,SO,FI,PI,sN,EO,_O,TO,IO,NO,RO,zO,BO,LO,VO,UO,HO,UI,$O,XO,QO,GN,Fz,tM,nM,iM,rM,lM,uM,cM,hM,mM,fM,bM,wM,xM,SM,TM,RM,zM,mD,jR,MM,{kernelName:du,backendName:"cpu",kernelFunc:BM},{kernelName:Fl,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n}=e,{tensor:a,indices:i,updates:s}=t,{sliceRank:r,numUpdates:o,sliceSize:l,strides:u,outputSize:c}=Dy(0,i,a.shape),h=n.bufferSync(i),d=n.bufferSync(s),p=n.bufferSync(a),m=FO(h,d,a.shape,c,l,o,r,u,p,!1);return n.makeTensorInfo(a.shape,m.dtype,m.values)}},{kernelName:pu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{reps:s}=a;kI(i,"tile");const r=FM(n.bufferSync(i),s);return n.makeTensorInfo(r.shape,r.dtype,r.values)}},{kernelName:mu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{k:s,sorted:r}=a;kI(i,"topk");const o=n.data.get(i.dataId).values,[l,u]=jM(o,i.shape,i.dtype,s,r);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(u.shape,u.dtype,u.values)]}},{kernelName:fu,backendName:"cpu",kernelFunc:function(e){const{inputs:t,attrs:n,backend:a}=e,{image:i,transforms:s}=t,{interpolation:r,fillMode:o,fillValue:l,outputShape:u}=n,[c,h,d,p]=i.shape,[m,f]=null!=u?u:[h,d],g=[c,m,f,p],y=Ys(i.shape),b=y[0],v=y[1],k=y[2],w=Ys(g),A=w[0],x=w[1],C=w[2],S=Us(i.dtype,zs(g));S.fill(l);const E=a.data.get(i.dataId).values,_=a.data.get(s.dataId).values;for(let e=0;e{t.preventDefault(),delete $M[e]}),!1),cr().getBool("SOFTWARE_WEBGL_ENABLED")&&(ZM.failIfMajorPerformanceCaveat=!1);if(1===e)return n.getContext("webgl",ZM)||n.getContext("experimental-webgl",ZM);return n.getContext("webgl2",ZM)}(e,t);if(null===n)return null;$M[e]=n}const n=$M[e];return null==n||n.isContextLost()?(delete $M[e],XM(e)):(n.disable(n.DEPTH_TEST),n.disable(n.STENCIL_TEST),n.disable(n.BLEND),n.disable(n.DITHER),n.disable(n.POLYGON_OFFSET_FILL),n.disable(n.SAMPLE_COVERAGE),n.enable(n.SCISSOR_TEST),n.enable(n.CULL_FACE),n.cullFace(n.BACK),$M[e])}var YM,QM,JM,eB,tB,nB;function aB(e,t){return[t,e]}function iB(e){const t=zs(e);return Bs(Math.ceil(t/4))}function sB(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function rB(e,t){const n=e;let a,i,s,r,o,l,u,c,h,d;return 2===cr().getNumber("WEBGL_VERSION")?(a=n.R32F,i=n.R16F,s=n.RGBA16F,r=n.RGBA32F,o=n.RED,u=4,c=1,h=n.HALF_FLOAT,d=n.FLOAT,l=n.RGBA8):(a=e.RGBA,i=e.RGBA,s=e.RGBA,r=n.RGBA,o=e.RGBA,u=4,c=4,h=null!=t?t.HALF_FLOAT_OES:null,d=e.FLOAT,l=e.RGBA),{internalFormatFloat:a,internalFormatHalfFloat:i,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:r,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:u,defaultNumChannels:c,textureTypeHalfFloat:h,textureTypeFloat:d}}function oB(e,t){const n=t();return cr().getBool("DEBUG")&&function(e){const t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+function(e,t){switch(t){case e.NO_ERROR:return"NO_ERROR";case e.INVALID_ENUM:return"INVALID_ENUM";case e.INVALID_VALUE:return"INVALID_VALUE";case e.INVALID_OPERATION:return"INVALID_OPERATION";case e.INVALID_FRAMEBUFFER_OPERATION:return"INVALID_FRAMEBUFFER_OPERATION";case e.OUT_OF_MEMORY:return"OUT_OF_MEMORY";case e.CONTEXT_LOST_WEBGL:return"CONTEXT_LOST_WEBGL";default:return`Unknown error code ${t}`}}(e,t))}(e),n}(QM=YM||(YM={}))[QM.DENSE=0]="DENSE",QM[QM.SHARED_BATCH=1]="SHARED_BATCH",(eB=JM||(JM={}))[eB.RENDER=0]="RENDER",eB[eB.UPLOAD=1]="UPLOAD",eB[eB.PIXELS=2]="PIXELS",eB[eB.DOWNLOAD=3]="DOWNLOAD",(nB=tB||(tB={}))[nB.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",nB[nB.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",nB[nB.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",nB[nB.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",nB[nB.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16";function lB(e){return!!(cr().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||0===e||5.96e-8e.getExtension(t)),'Extension "'+t+'" not supported on this browser.')}const cB=/ERROR: [0-9]+:([0-9]+):/g;function hB(e,t){const n=cB.exec(t);if(null==n)return;const a=+n[1],i=e.split("\n"),s=i.length.toString().length+2,r=i.map(((e,t)=>Fs((t+1).toString(),s)+e));let o=0;for(let e=0;ee.validateProgram(t))),!1===e.getProgramParameter(t,e.VALIDATE_STATUS))throw new Error("Shader program validation failed.")}function pB(e,t,n,a,i,s,r){const o=e.getAttribLocation(t,n);return-1!==o&&(oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,a))),oB(e,(()=>e.vertexAttribPointer(o,i,e.FLOAT,!1,s,r))),oB(e,(()=>e.enableVertexAttribArray(o))),!0)}function mB(e,t,n,a){oB(e,(()=>function(e,t,n){vB(e,n),oB(e,(()=>e.activeTexture(e.TEXTURE0+n))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,t)))}(e,t,a))),oB(e,(()=>e.uniform1i(n,a)))}function fB(e,t,n){oB(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,n))),oB(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0)))}function gB(e,t){oB(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,t))),oB(e,(()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0)))}function yB(e){const t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+function(e,t){switch(t){case e.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:return"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT";case e.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:return"FRAMEBUFFER_INCOMPLETE_DIMENSIONS";case e.FRAMEBUFFER_UNSUPPORTED:return"FRAMEBUFFER_UNSUPPORTED";default:return`unknown error ${t}`}}(e,t))}function bB(e,t,n){const a=oB(e,(()=>t()));if(null==a)throw new Error(n);return a}function vB(e,t){const n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,a=t+e.TEXTURE0;if(an){throw new Error(`textureUnit must be in ${`[gl.TEXTURE0, gl.TEXTURE${n}]`}.`)}}function kB(e,t=2){return zs(e.slice(0,e.length-t))}function wB(e){if(0===e.length)throw Error("Cannot get rows and columns of an empty shape array.");return[e.length>1?e[e.length-2]:1,e[e.length-1]]}function AB(e){let t=[1,1,1];return 0===e.length||1===e.length&&1===e[0]||(t=[kB(e),...wB(e)]),t}function xB(e){return e%2==0}function CB(e,t){if(Os(e=e.slice(-2),t=t.slice(-2)))return!0;if(!e.length||!t.length)return!0;if(0===e[0]||0===e[1]||0===t[0]||0===t[1])return!0;if(e.length!==t.length){const n=e[e.length-1],a=t[t.length-1];if(n===a)return!0;if(xB(n)&&xB(a)&&(1===e[0]||1===t[0]))return!0}return e[1]===t[1]&&xB(e[0])&&xB(t[0])}let SB,EB;function _B(e,t){return null!=e.getExtension(t)}function TB(e){try{if(null!=XM(e))return!0}catch(e){return!1}return!1}function IB(e){if(0===e)return!1;const t=XM(e);if(1!==e){if(_B(t,"EXT_color_buffer_float"))return NB(t);const e="EXT_color_buffer_half_float";if(_B(t,e)){const n=t.getExtension(e);return function(e,t){const n=rB(e,t),a=e.createTexture();e.bindTexture(e.TEXTURE_2D,a);const i=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,i,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);const r=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,r),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,a,0);const o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(a),e.deleteFramebuffer(r),o}(t,n)}return!1}if(!_B(t,"OES_texture_float"))return!1;if(!_B(t,"WEBGL_color_buffer_float"))return!1;return NB(t)}function NB(e){const t=rB(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,1,1,0,t.textureFormatFloat,t.textureTypeFloat,null);const a=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,a),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const i=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(n),e.deleteFramebuffer(a),i}function RB(e,t){Array.isArray(e)||(e=[e]),e.forEach((e=>{null!=e&&Ns("complex64"!==e.dtype,(()=>`${t} does not support complex64 tensors in the WebGL backend.`))}))}const DB=cr();function zB(){let e,t,n,a,i,s,r,o,l,u;return 2===cr().getNumber("WEBGL_VERSION")?(e="#version 300 es",t="in",n="out",a="in",i="texture",s="outputColor",r="out vec4 outputColor;",o=cr().getBool("WEBGL2_ISNAN_CUSTOM")?"\n bool isnan_custom(float val) {\n uint floatToUint = floatBitsToUint(val);\n return (floatToUint & 0x7fffffffu) > 0x7f800000u;\n }\n\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan_custom(val.x),\n isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n }\n\n #define isnan(value) isnan_custom(value)\n ":"",l="",u="\n #define round(value) newRound(value)\n int newRound(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 newRound(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "):(e="",t="attribute",n="varying",a="varying",i="texture2D",s="gl_FragColor",r="",o="\n #define isnan(value) isnan_custom(value)\n bool isnan_custom(float val) {\n return (val > 0. || val < 1. || val == 0.) ? false : true;\n }\n bvec4 isnan_custom(vec4 val) {\n return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n }\n ",l="\n uniform float INFINITY;\n\n bool isinf(float val) {\n return abs(val) == INFINITY;\n }\n bvec4 isinf(vec4 val) {\n return equal(abs(val), vec4(INFINITY));\n }\n ",u="\n int round(float value) {\n return int(floor(value + 0.5));\n }\n\n ivec4 round(vec4 value) {\n return ivec4(floor(value + vec4(0.5)));\n }\n "),{version:e,attribute:t,varyingVs:n,varyingFs:a,texture2D:i,output:s,defineOutput:r,defineSpecialNaN:o,defineSpecialInf:l,defineRound:u}}function OB(e,t,n="index"){const a=Ys(t);return a.map(((t,i)=>`${`int ${e[i]} = ${n} / ${t}`}; ${i===a.length-1?`int ${e[i+1]} = ${n} - ${e[i]} * ${t}`:`index -= ${e[i]} * ${t}`};`)).join("")}function MB(e,t,n="index"){const a=Ys(t);return a.map(((t,i)=>`${`int ${e[i]} = ${n} / outShapeStrides[${i}]`}; ${i===a.length-1?`int ${e[i+1]} = ${n} - ${e[i]} * outShapeStrides[${i}]`:`index -= ${e[i]} * outShapeStrides[${i}]`};`)).join("")}function BB(e,t,n="index"){const a=function(e,t){const n=e.length,a=e.map((e=>`${t}[${e}]`)),i=new Array(n-1);i[n-2]=a[n-1];for(let e=n-3;e>=0;--e)i[e]=`(${i[e+1]} * ${a[e+1]})`;return i}(e.map(((e,t)=>t)),t);return a.map(((t,i)=>`${`int ${e[i]} = ${n} / ${a[i]}`}; ${i===a.length-1?`int ${e[i+1]} = ${n} - ${e[i]} * ${a[i]}`:`index -= ${e[i]} * ${a[i]}`};`)).join("")}function FB(e){const t=Ys(e).map((e=>e.toString()));return`\n int getFlatIndex(ivec3 coords) {\n return coords.x * ${t[0]} + coords.y * ${t[1]} + coords.z;\n }\n`}DB.registerFlag("HAS_WEBGL",(()=>DB.getNumber("WEBGL_VERSION")>0)),DB.registerFlag("WEBGL_VERSION",(()=>TB(2)?2:TB(1)?1:0)),DB.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",(()=>!1)),DB.registerFlag("WEBGL_BUFFER_SUPPORTED",(()=>2===DB.get("WEBGL_VERSION"))),DB.registerFlag("WEBGL_CPU_FORWARD",(()=>!0)),DB.registerFlag("WEBGL_FORCE_F16_TEXTURES",(()=>!1)),DB.registerFlag("WEBGL_PACK",(()=>DB.getBool("HAS_WEBGL"))),DB.registerFlag("WEBGL_PACK_NORMALIZATION",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_CLIP",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_DEPTHWISECONV",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_REDUCE",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_LAZILY_UNPACK",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_CONV_IM2COL",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_PACK_CONV2DTRANSPOSE",(()=>DB.getBool("WEBGL_PACK"))),DB.registerFlag("WEBGL_MAX_TEXTURE_SIZE",(()=>function(e){if(null==SB){const t=XM(e);SB=t.getParameter(t.MAX_TEXTURE_SIZE)}return SB}(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",(()=>function(e){if(null==EB){const t=XM(e);EB=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,EB)}(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",(()=>{const e=DB.getNumber("WEBGL_VERSION");return 0===e?0:function(e){if(0===e)return 0;let t;const n=XM(e);return t=_B(n,"EXT_disjoint_timer_query_webgl2")&&2===e?2:_B(n,"EXT_disjoint_timer_query")?1:0,t}(e)})),DB.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",(()=>DB.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!Zc())),DB.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",(()=>function(e){if(0===e)return!1;const t=XM(e);if(1===e){if(!_B(t,"OES_texture_float"))return!1}else if(!_B(t,"EXT_color_buffer_float"))return!1;return NB(t)}(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",(()=>!DB.getBool("WEBGL_FORCE_F16_TEXTURES")&&DB.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"))),DB.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",(()=>IB(DB.getNumber("WEBGL_VERSION")))),DB.registerFlag("WEBGL_FENCE_API_ENABLED",(()=>{return 2===(e=DB.getNumber("WEBGL_VERSION"))&&null!=XM(e).fenceSync;var e})),DB.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",(()=>DB.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0)),DB.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",(()=>-1),(e=>{if("number"!=typeof e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be a number but got ${e}.`);if(e<0&&-1!==e)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)})),DB.registerFlag("WEBGL_FLUSH_THRESHOLD",(()=>Zc()?1:-1),(e=>{if("number"!=typeof e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be a number but got ${e}.`);if(e<0&&-1!==e)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)})),DB.registerFlag("CPU_HANDOFF_SIZE_THRESHOLD",(()=>128)),DB.registerFlag("WEBGL_USE_SHAPES_UNIFORMS",(()=>!1)),DB.registerFlag("TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD",(()=>1e5)),DB.registerFlag("TOPK_K_CPU_HANDOFF_THRESHOLD",(()=>128)),DB.registerFlag("WEBGL_EXP_CONV",(()=>!1)),DB.registerFlag("SOFTWARE_WEBGL_ENABLED",(()=>DB.getBool("IS_TEST"))),DB.registerFlag("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE",(()=>1/0)),DB.registerFlag("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE",(()=>!1)),DB.registerFlag("WEBGL2_ISNAN_CUSTOM",(()=>!1)),DB.registerFlag("ENGINE_COMPILE_ONLY",(()=>!1));const LB="\n const float FLOAT_MAX = 1.70141184e38;\n const float FLOAT_MIN = 1.17549435e-38;\n\n lowp vec4 encode_float(highp float v) {\n if (isnan(v)) {\n return vec4(255, 255, 255, 255);\n }\n\n highp float av = abs(v);\n\n if(av < FLOAT_MIN) {\n return vec4(0.0, 0.0, 0.0, 0.0);\n } else if(v > FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n } else if(v < -FLOAT_MAX) {\n return vec4(0.0, 0.0, 128.0, 255.0) / 255.0;\n }\n\n highp vec4 c = vec4(0,0,0,0);\n\n highp float e = floor(log2(av));\n highp float m = exp2(fract(log2(av))) - 1.0;\n\n c[2] = floor(128.0 * m);\n m -= c[2] / 128.0;\n c[1] = floor(32768.0 * m);\n m -= c[1] / 32768.0;\n c[0] = floor(8388608.0 * m);\n\n highp float ebias = e + 127.0;\n c[3] = floor(ebias / 2.0);\n ebias -= c[3] * 2.0;\n c[2] += floor(ebias) * 128.0;\n\n c[3] += 128.0 * step(0.0, -v);\n\n return c / 255.0;\n }\n",{getBroadcastDims:PB}=i;function jB(e,t,n){const a=[];if(e.forEach((e=>{const t=zs(e.shapeInfo.logicalShape);if(e.shapeInfo.isUniform?a.push(`uniform float ${e.name}${t>1?`[${t}]`:""};`):(a.push(`uniform sampler2D ${e.name};`),a.push(`uniform int offset${e.name};`)),n.enableShapeUniforms){const{uniformShape:t}=YB(n.packedInputs,e.shapeInfo.logicalShape,e.shapeInfo.texShape);switch(t.length){case 1:a.push(`uniform int ${e.name}Shape;`);break;case 2:a.push(`uniform ivec2 ${e.name}Shape;`);break;case 3:a.push(`uniform ivec3 ${e.name}Shape;`);break;case 4:a.push(`uniform ivec4 ${e.name}Shape;`)}a.push(`uniform ivec2 ${e.name}TexShape;`)}})),n.enableShapeUniforms){switch(t.logicalShape.length){case 1:a.push("uniform int outShape;");break;case 2:a.push("uniform ivec2 outShape;"),a.push("uniform int outShapeStrides;");break;case 3:a.push("uniform ivec3 outShape;"),a.push("uniform ivec2 outShapeStrides;");break;case 4:a.push("uniform ivec4 outShape;"),a.push("uniform ivec3 outShapeStrides;")}a.push("uniform ivec2 outTexShape;")}n.customUniforms&&n.customUniforms.forEach((e=>{a.push(`uniform ${e.type} ${e.name}${e.arrayIndex?`[${e.arrayIndex}]`:""};`)}));const i=a.join("\n"),s=e.map((e=>function(e,t,n=!1,a){let i="";i+=n?UB(e,a):VB(e,a);const s=e.shapeInfo.logicalShape,r=t.logicalShape;s.length<=r.length&&(i+=n?function(e,t){const n=e.name,a=n.charAt(0).toUpperCase()+n.slice(1),i="get"+a+"AtOutCoords",s=e.shapeInfo.logicalShape.length,r=t.logicalShape.length,o=PB(e.shapeInfo.logicalShape,t.logicalShape),l=XB(r),u=r-s;let c;const h=["x","y","z","w","u","v"];c=0===s?"":r<2&&o.length>=1?"coords = 0;":o.map((e=>`coords.${h[e+u]} = 0;`)).join("\n");let d="";d=r<2&&s>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${h[t+u]}`)).join(", ");let p="return outputValue;";const m=1===zs(e.shapeInfo.logicalShape),f=zs(t.logicalShape),g=1===f;if(1!==s||m||g){if(m&&!g)p=1===r?"\n return vec4(outputValue.x, outputValue.x, 0., 0.);\n ":"\n return vec4(outputValue.x);\n ";else if(o.length){const e=s-2,t=s-1;o.indexOf(e)>-1&&o.indexOf(t)>-1?p="return vec4(outputValue.x);":o.indexOf(e)>-1?p="return vec4(outputValue.x, outputValue.y, outputValue.x, outputValue.y);":o.indexOf(t)>-1&&(p="return vec4(outputValue.xx, outputValue.zz);")}}else p="\n return vec4(outputValue.xy, outputValue.xy);\n ";return`\n vec4 ${i}() {\n ${l} coords = getOutputCoords();\n ${c}\n vec4 outputValue = get${a}(${d});\n ${p}\n }\n `}(e,t):function(e,t){const n=e.name,a=n.charAt(0).toUpperCase()+n.slice(1),i="get"+a+"AtOutCoords",s=t.texShape,r=e.shapeInfo.texShape,o=e.shapeInfo.logicalShape.length,l=t.logicalShape.length;if(!e.shapeInfo.isUniform&&o===l&&null==e.shapeInfo.flatOffset&&Os(r,s))return`\n float ${i}() {\n return sampleTexture(${n}, resultUV);\n }\n `;const u=XB(l),c=PB(e.shapeInfo.logicalShape,t.logicalShape),h=l-o;let d;const p=["x","y","z","w","u","v"];d=0===o?"":l<2&&c.length>=1?"coords = 0;":c.map((e=>`coords.${p[e+h]} = 0;`)).join("\n");let m="";m=l<2&&o>0?"coords":e.shapeInfo.logicalShape.map(((e,t)=>`coords.${p[t+h]}`)).join(", ");return`\n float ${i}() {\n ${u} coords = getOutputCoords();\n ${d}\n return get${a}(${m});\n }\n `}(e,t));return i}(e,t,n.packedInputs,n.enableShapeUniforms))).join("\n"),r=t.texShape,o=zB(),l=function(e){return`\n float sampleTexture(sampler2D textureSampler, vec2 uv) {\n return ${e.texture2D}(textureSampler, uv).r;\n }\n `}(o);let u,c,h=function(e){const t=`${e.version}\n precision highp float;\n precision highp int;\n precision highp sampler2D;\n ${e.varyingFs} vec2 resultUV;\n ${e.defineOutput}\n const vec2 halfCR = vec2(0.5, 0.5);\n\n struct ivec5\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n };\n\n struct ivec6\n {\n int x;\n int y;\n int z;\n int w;\n int u;\n int v;\n };\n\n uniform float NAN;\n ${e.defineSpecialNaN}\n ${e.defineSpecialInf}\n ${e.defineRound}\n\n int imod(int x, int y) {\n return x - y * (x / y);\n }\n\n int idiv(int a, int b, float sign) {\n int res = a / b;\n int mod = imod(a, b);\n if (sign < 0. && mod != 0) {\n res -= 1;\n }\n return res;\n }\n\n //Based on the work of Dave Hoskins\n //https://www.shadertoy.com/view/4djSRW\n #define HASHSCALE1 443.8975\n float random(float seed){\n vec2 p = resultUV * seed;\n vec3 p3 = fract(vec3(p.xyx) * HASHSCALE1);\n p3 += dot(p3, p3.yzx + 19.19);\n return fract((p3.x + p3.y) * p3.z);\n }\n\n ${WB}\n ${GB}\n ${qB}\n `;return t}(o);t.isPacked?(u=function(e,t,n){switch(e.length){case 0:return KB();case 1:return function(e,t,n){const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(1===a[0])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.x * ${a[1]}.0);\n }\n `;if(1===a[1])return n?"\n int getOutputCoords() {\n return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n }\n ":`\n int getOutputCoords() {\n return 2 * int(resultUV.y * ${a[0]}.0);\n }\n `;if(n)return"\n int getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n }\n ";return`\n int getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${a[0]}, ${a[1]}));\n return 2 * (resTexRC.x * ${a[1]} + resTexRC.y);\n }\n `}(0,t,n);case 2:return function(e,t,n){const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)];if(Os(e,t))return n?"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n }\n ":`\n ivec2 getOutputCoords() {\n return 2 * ivec2(resultUV.yx * vec2(${a[0]}, ${a[1]}));\n }\n `;const i=Math.ceil(e[1]/2);if(n)return"\n ivec2 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec2(r, c);\n }\n ";return`\n ivec2 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${a[0]}, ${a[1]}));\n\n int index = resTexRC.x * ${a[1]} + resTexRC.y;\n int r = 2 * (index / ${i});\n int c = imod(index, ${i}) * 2;\n\n return ivec2(r, c);\n }\n `}(e,t,n);case 3:return function(e,t,n){if(n)return"\n ivec3 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec3(b, r, c);\n }\n ";const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],i=Math.ceil(e[2]/2),s=i*Math.ceil(e[1]/2);return`\n ivec3 getOutputCoords() {\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(${a[0]}, ${a[1]}));\n int index = resTexRC.x * ${a[1]} + resTexRC.y;\n\n int b = index / ${s};\n index -= b * ${s};\n\n int r = 2 * (index / ${i});\n int c = imod(index, ${i}) * 2;\n\n return ivec3(b, r, c);\n }\n `}(e,t,n);default:return function(e,t,n){if(n)return"\n ivec4 getOutputCoords() {\n ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n ivec2 resTexRC = ivec2(resultUV.yx *\n vec2(packedTexShape[0], packedTexShape[1]));\n int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n int texelsInBatchN = texelsInBatch * outShape[1];\n\n int b2 = index / texelsInBatchN;\n index -= b2 * texelsInBatchN;\n\n int b = index / texelsInBatch;\n index -= b * texelsInBatch;\n\n int r = 2 * (index / texelsInLogicalRow);\n int c = imod(index, texelsInLogicalRow) * 2;\n\n return ivec4(b2, b, r, c);\n }\n ";const a=[Math.ceil(t[0]/2),Math.ceil(t[1]/2)],i=Math.ceil(e[e.length-1]/2),s=i*Math.ceil(e[e.length-2]/2);let r=s,o="",l="b, r, c";for(let t=2;t1&&!Os(t,n)&&a.lengthe[t])).join(", ")}function eF(e,t,n,a){const i=n.map(((e,n)=>{const a={logicalShape:e.shape,texShape:e.isUniform?null:e.texData.texShape,isUniform:e.isUniform,isPacked:!e.isUniform&&e.texData.isPacked,flatOffset:null};return null!=e.texData&&null!=e.texData.slice&&e.texData.slice.flatOffset>0&&(a.flatOffset=e.texData.slice.flatOffset),{name:t.variableNames[n],shapeInfo:a}})),s=i.map((e=>e.shapeInfo)),r={logicalShape:a.shape,texShape:a.texData.texShape,isUniform:!1,isPacked:a.texData.isPacked,flatOffset:null},o=jB(i,r,t),l=function(e,t){const n=bB(e,(()=>e.createShader(e.FRAGMENT_SHADER)),"Unable to create fragment WebGLShader.");if(oB(e,(()=>e.shaderSource(n,t))),oB(e,(()=>e.compileShader(n))),cr().get("ENGINE_COMPILE_ONLY"))return n;if(!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw hB(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}(e.gl,o),u=e.createProgram(l);return cr().get("ENGINE_COMPILE_ONLY")?{program:t,fragmentShader:l,source:o,webGLProgram:u,inShapeInfos:s,outShapeInfo:r,variablesLocations:null,customUniformLocations:null,infLoc:null,nanLoc:null,outShapeLocation:null,outShapeStridesLocation:null,outTexShapeLocation:null}:(e.buildVao(u),Object.assign({program:t,fragmentShader:l,source:o,webGLProgram:u,inShapeInfos:s,outShapeInfo:r},tF(e,t,u)))}function tF(e,t,n){const a=[],i=[];let s,r,o,l=null,u=null;u=e.getUniformLocation(n,"NAN",!1),1===cr().getNumber("WEBGL_VERSION")&&(l=e.getUniformLocation(n,"INFINITY",!1));const c=!1;for(const i of t.variableNames){const s={name:i,uniform:e.getUniformLocation(n,i,c),offset:e.getUniformLocation(n,`offset${i}`,c)};t.enableShapeUniforms&&(s.shape=e.getUniformLocation(n,`${i}Shape`,c),s.texShape=e.getUniformLocation(n,`${i}TexShape`,c)),a.push(s)}if(t.enableShapeUniforms&&(s=e.getUniformLocation(n,"outShape",c),o=e.getUniformLocation(n,"outShapeStrides",c),r=e.getUniformLocation(n,"outTexShape",c)),t.customUniforms)for(const a of t.customUniforms)i.push(e.getUniformLocation(n,a.name,c));return{variablesLocations:a,customUniformLocations:i,infLoc:l,nanLoc:u,outShapeLocation:s,outShapeStridesLocation:o,outTexShapeLocation:r}}function nF(e,t){if(e.length!==t.length)throw Error(`Binary was compiled with ${e.length} inputs, but was executed with ${t.length} inputs`);e.forEach(((e,n)=>{const a=e.logicalShape,i=t[n],s=i.shape;if(!Os(a,s))throw Error(`Binary was compiled with different shapes than the current args. Shapes ${a} and ${s} must match`);if(e.isUniform&&i.isUniform)return;const r=e.texShape,o=i.isUniform?null:i.texData.texShape;if(!Os(r,o))throw Error(`Binary was compiled with different texture shapes than the current args. Shape ${r} and ${o} must match`)}))}function aF(e){return cr().getBool("WEBGL_USE_SHAPES_UNIFORMS")&&e<=4}class iF{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outPackingScheme=YM.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=zB();this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?MB(["r","c","d"],e):OB(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getA(rc.x, rc.y, rc.z);\n }\n\n ${t.output} = result;\n }\n `}}class sF{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outPackingScheme=YM.DENSE,this.customUniforms=[{name:"texShape",type:"ivec2"}];const t=zB();this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n ivec3 outCoordsFromFlatIndex(int index) {\n ${this.enableShapeUniforms?MB(["r","c","d"],e):OB(["r","c","d"],e)}\n return ivec3(r, c, d);\n }\n\n void main() {\n ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n vec4 result = vec4(0.);\n\n for (int i=0; i<4; i++) {\n int flatIndex = index + i;\n ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n }\n\n ${t.output} = result;\n }\n `}}class rF{constructor(e){this.variableNames=["A"],this.outTexUsage=JM.DOWNLOAD;const t=zB();this.outputShape=e,this.userCode=`\n ${LB}\n\n void main() {\n float x = getAAtOutCoords();\n ${t.output} = encode_float(x);\n }\n `}}class oF{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outTexUsage=JM.DOWNLOAD;const t=zB();this.outputShape=e,this.userCode=`\n ${LB}\n\n void main() {\n ivec3 coords = getOutputCoords();\n float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n ${t.output} = encode_float(x);\n }\n `}}const lF={R:0,G:1,B:2,A:3};class uF{constructor(e,t=!1,n="RGBA"){this.variableNames=["A"],this.customUniforms=[{name:"texShape",type:"ivec2"}];const a=zB();this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length);let i="result";t&&(i="floor(result * 255. + 0.5)");let s="";for(let e=0;ee.createShader(e.VERTEX_SHADER)),"Unable to create vertex WebGLShader.");if(oB(e,(()=>e.shaderSource(n,t))),oB(e,(()=>e.compileShader(n))),!1===e.getShaderParameter(n,e.COMPILE_STATUS))throw new Error("Failed to compile vertex shader.");return n}(e,`${t.version}\n precision highp float;\n ${t.attribute} vec3 clipSpacePos;\n ${t.attribute} vec2 uv;\n ${t.varyingVs} vec2 resultUV;\n\n void main() {\n gl_Position = vec4(clipSpacePos, 1);\n resultUV = uv;\n }`)}function dF(e){return function(e,t){const n=bB(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),oB(e,(()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW))),n}(e,new Float32Array([-1,1,0,0,1,-1,-1,0,0,0,1,1,0,1,1,1,-1,0,1,0]))}function pF(e){return function(e,t){const n=bB(e,(()=>e.createBuffer()),"Unable to create WebGLBuffer");return oB(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n))),oB(e,(()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW))),n}(e,new Uint16Array([0,1,2,2,1,3]))}function mF(e,t,n,a,i,s){!function(e,t){const n=cr().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0)throw new Error(`Requested texture size [${e}x${t}] is invalid.`);if(e>n||t>n)throw new Error(`Requested texture size [${e}x${t}] greater than WebGL maximum on this browser / GPU [${n}x${n}].`)}(t,n);const r=function(e){return bB(e,(()=>e.createTexture()),"Unable to create WebGLTexture.")}(e),o=e.TEXTURE_2D;return oB(e,(()=>e.bindTexture(o,r))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_MIN_FILTER,e.NEAREST))),oB(e,(()=>e.texParameteri(o,e.TEXTURE_MAG_FILTER,e.NEAREST))),1===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texImage2D(o,0,a,t,n,0,i,s,null))):oB(e,(()=>e.texStorage2D(o,1,a,t,n))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,null))),{texture:r,texShape:[n,t]}}function fF(e){return e.internalFormatFloat}function gF(e){return e.internalFormatHalfFloat}function yF(e){return e.downloadTextureFormat}function bF(e){return e.internalFormatPackedFloat}function vF(e){return e.internalFormatPackedHalfFloat}function kF(e,t,n,a,i,s,r,o){const l=e,u=new Float32Array(function(e,t){const[n,a]=sB(e,t);return n*a*4}(s,r));return l.bindBuffer(l.PIXEL_PACK_BUFFER,t),l.getBufferSubData(l.PIXEL_PACK_BUFFER,0,u),l.bindBuffer(l.PIXEL_PACK_BUFFER,null),u}class wF{constructor(e){this.outputTexture=null,this.program=null,this.disposed=!1,this.itemsToPoll=[];const t=cr().getNumber("WEBGL_VERSION");if(null!=e?(this.gl=e,function(e,t){$M[e]=t}(t,e)):this.gl=XM(t),e=this.gl,2===cr().getNumber("WEBGL_VERSION")){const t=e;this.createVertexArray=()=>oB(t,(()=>t.createVertexArray())),this.bindVertexArray=e=>oB(t,(()=>t.bindVertexArray(e))),this.deleteVertexArray=e=>oB(t,(()=>t.deleteVertexArray(e))),this.getVertexArray=()=>oB(t,(()=>t.getParameter(t.VERTEX_ARRAY_BINDING)))}else if(null!=e){const t=e.getExtension("OES_vertex_array_object");if(null==t)throw new Error("All WebGL1 implementations are expected to offer OES_vertex_array_object.");this.createVertexArray=()=>oB(e,(()=>t.createVertexArrayOES())),this.bindVertexArray=n=>oB(e,(()=>t.bindVertexArrayOES(n))),this.deleteVertexArray=n=>oB(e,(()=>t.deleteVertexArrayOES(n))),this.getVertexArray=()=>oB(e,(()=>e.getParameter(t.VERTEX_ARRAY_BINDING_OES)))}let n="WEBGL_color_buffer_float";const a="EXT_color_buffer_half_float";if(this.parallelCompilationExtension=this.gl.getExtension("KHR_parallel_shader_compile"),1===cr().getNumber("WEBGL_VERSION")){const e="OES_texture_float",t="OES_texture_half_float";if(this.textureFloatExtension=uB(this.gl,e),_B(this.gl,t))this.textureHalfFloatExtension=uB(this.gl,t);else if(cr().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support half float textures, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.");if(this.colorBufferFloatExtension=this.gl.getExtension(n),_B(this.gl,a))this.colorBufferHalfFloatExtension=uB(this.gl,a);else if(cr().get("WEBGL_FORCE_F16_TEXTURES"))throw new Error("GL context does not support color renderable half floats, yet the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.")}else if(n="EXT_color_buffer_float",_B(this.gl,n))this.colorBufferFloatExtension=this.gl.getExtension(n);else{if(!_B(this.gl,a))throw new Error("GL context does not support color renderable floats");this.colorBufferHalfFloatExtension=this.gl.getExtension(a)}this.vertexBuffer=dF(this.gl),this.indexBuffer=pF(this.gl),this.framebuffer=function(e){return bB(e,(()=>e.createFramebuffer()),"Unable to create WebGLFramebuffer.")}(this.gl),this.textureConfig=rB(this.gl,this.textureHalfFloatExtension)}get debug(){return cr().getBool("DEBUG")}dispose(){if(this.disposed)return;this.program,this.outputTexture;const e=this.gl;oB(e,(()=>e.finish())),oB(e,(()=>e.bindFramebuffer(e.FRAMEBUFFER,null))),oB(e,(()=>e.deleteFramebuffer(this.framebuffer))),oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,null))),oB(e,(()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,null))),oB(e,(()=>e.deleteBuffer(this.indexBuffer))),this.disposed=!0}createFloat32MatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=aB(t,n);return mF(e,i,s,fF(a),a.textureFormatFloat,e.FLOAT)}(this.gl,e,t,this.textureConfig)}createFloat16MatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=aB(t,n);return mF(e,i,s,gF(a),a.textureFormatFloat,a.textureTypeHalfFloat)}(this.gl,e,t,this.textureConfig)}createUnsignedBytesMatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=aB(t,n);return mF(e,i,s,yF(a),e.RGBA,e.UNSIGNED_BYTE)}(this.gl,e,t,this.textureConfig)}uploadPixelDataToTexture(e,t){this.throwIfDisposed(),function(e,t,n){oB(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),n.data instanceof Uint8Array?2===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,n.width,n.height,e.RGBA,e.UNSIGNED_BYTE,n.data))):oB(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,n.width,n.height,0,e.RGBA,e.UNSIGNED_BYTE,n.data))):2===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,n))):oB(e,(()=>e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}(this.gl,e,t)}uploadDenseMatrixToTexture(e,t,n,a){this.throwIfDisposed(),function(e,t,n,a,i,s){let r,o,l;oB(e,(()=>e.bindTexture(e.TEXTURE_2D,t))),i instanceof Uint8Array?(r=new Uint8Array(n*a*4),o=e.UNSIGNED_BYTE,l=e.RGBA):(r=new Float32Array(n*a*4),o=e.FLOAT,l=s.internalFormatPackedFloat),r.set(i),2===cr().getNumber("WEBGL_VERSION")?oB(e,(()=>e.texSubImage2D(e.TEXTURE_2D,0,0,0,n,a,e.RGBA,o,r))):oB(e,(()=>e.texImage2D(e.TEXTURE_2D,0,l,n,a,0,e.RGBA,o,r))),oB(e,(()=>e.bindTexture(e.TEXTURE_2D,null)))}(this.gl,e,t,n,a,this.textureConfig)}createFloat16PackedMatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=sB(t,n);return mF(e,i,s,vF(a),e.RGBA,a.textureTypeHalfFloat)}(this.gl,e,t,this.textureConfig)}createPackedMatrixTexture(e,t){return this.throwIfDisposed(),function(e,t,n,a){const[i,s]=sB(t,n);return mF(e,i,s,bF(a),e.RGBA,e.FLOAT)}(this.gl,e,t,this.textureConfig)}deleteMatrixTexture(e){this.throwIfDisposed(),this.outputTexture===e&&(gB(this.gl,this.framebuffer),this.outputTexture=null),oB(this.gl,(()=>this.gl.deleteTexture(e)))}downloadByteEncodedFloatMatrixFromOutputTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>function(e,t,n,a){const[i,s]=aB(t,n),r=new Uint8Array(t*n*4);return oB(e,(()=>e.readPixels(0,0,i,s,a.downloadTextureFormat,e.UNSIGNED_BYTE,r))),new Float32Array(r.buffer)}(this.gl,t,n,this.textureConfig)))}downloadPackedMatrixFromBuffer(e,t,n,a,i,s){return kF(this.gl,e,0,0,0,i,s,this.textureConfig)}downloadFloat32MatrixFromBuffer(e,t){return function(e,t,n){const a=e,i=new Float32Array(n);return a.bindBuffer(a.PIXEL_PACK_BUFFER,t),a.getBufferSubData(a.PIXEL_PACK_BUFFER,0,i),a.bindBuffer(a.PIXEL_PACK_BUFFER,null),i}(this.gl,e,t)}createBufferFromTexture(e,t,n){this.bindTextureToFrameBuffer(e);const a=function(e,t,n,a){const i=e.createBuffer();oB(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,i)));const s=16*t*n;return oB(e,(()=>e.bufferData(e.PIXEL_PACK_BUFFER,s,e.STREAM_READ))),oB(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,0))),oB(e,(()=>e.bindBuffer(e.PIXEL_PACK_BUFFER,null))),i}(this.gl,t,n,this.textureConfig);return this.unbindTextureToFrameBuffer(),a}createAndWaitForFence(){const e=this.createFence(this.gl);return this.pollFence(e)}createFence(e){let t,n;if(cr().getBool("WEBGL_FENCE_API_ENABLED")){const a=e,i=a.fenceSync(a.SYNC_GPU_COMMANDS_COMPLETE,0);e.flush(),n=()=>{const e=a.clientWaitSync(i,0,0);return e===a.ALREADY_SIGNALED||e===a.CONDITION_SATISFIED},t=i}else cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0?(t=this.beginQuery(),this.endQuery(),n=()=>this.isQueryAvailable(t,cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))):n=()=>!0;return{query:t,isFencePassed:n}}downloadMatrixFromPackedTexture(e,t,n){return this.downloadMatrixDriver(e,(()=>function(e,t,n){const a=new Float32Array(t*n*4);return oB(e,(()=>e.readPixels(0,0,n,t,e.RGBA,e.FLOAT,a))),a}(this.gl,t,n)))}createProgram(e){this.throwIfDisposed();const t=this.gl;null==this.vertexShader&&(this.vertexShader=hF(t));const n=function(e){return bB(e,(()=>e.createProgram()),"Unable to create WebGLProgram.")}(t);oB(t,(()=>t.attachShader(n,this.vertexShader))),oB(t,(()=>t.attachShader(n,e))),function(e,t){if(oB(e,(()=>e.linkProgram(t))),!cr().get("ENGINE_COMPILE_ONLY")&&!1===e.getProgramParameter(t,e.LINK_STATUS))throw new Error("Failed to link vertex and fragment shaders.")}(t,n);const a=Object.assign(n,{vao:this.createVertexArray()});return this.debug&&dB(t,a),a}buildVao(e){this.setProgram(e),this.bindVertexArray(e.vao);const t=this.gl;oB(t,(()=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer))),function(e,t,n){oB(e,(()=>e.bindBuffer(e.ARRAY_BUFFER,n))),pB(e,t,"clipSpacePos",n,3,20,0)&&pB(e,t,"uv",n,2,20,12)}(t,e,this.vertexBuffer)}deleteProgram(e){this.throwIfDisposed(),e===this.program&&(this.program=null),null!=e&&(oB(this.gl,(()=>this.gl.deleteProgram(e))),this.deleteVertexArray(e.vao))}setProgram(e){this.throwIfDisposed(),this.program=e,null!=this.program&&this.debug&&dB(this.gl,this.program),oB(this.gl,(()=>this.gl.useProgram(e)))}getUniformLocation(e,t,n=!0){return this.throwIfDisposed(),n?function(e,t,n){return bB(e,(()=>e.getUniformLocation(t,n)),'uniform "'+n+'" not present in program.')}(this.gl,e,t):function(e,t,n){return e.getUniformLocation(t,n)}(this.gl,e,t)}getAttributeLocation(e,t){return this.throwIfDisposed(),oB(this.gl,(()=>this.gl.getAttribLocation(e,t)))}getUniformLocationNoThrow(e,t){return this.throwIfDisposed(),this.gl.getUniformLocation(e,t)}setInputMatrixTexture(e,t,n){this.throwIfDisposed(),this.throwIfNoProgram(),mB(this.gl,e,t,n)}setOutputMatrixTexture(e,t,n){this.setOutputMatrixTextureDriver(e,n,t)}setOutputPackedMatrixTexture(e,t,n){this.throwIfDisposed();const[a,i]=sB(t,n);this.setOutputMatrixTextureDriver(e,a,i)}setOutputMatrixWriteRegion(e,t,n,a){this.setOutputMatrixWriteRegionDriver(n,e,a,t)}setOutputPackedMatrixWriteRegion(e,t,n,a){throw new Error("setOutputPackedMatrixWriteRegion not implemented.")}debugValidate(){null!=this.program&&dB(this.gl,this.program),yB(this.gl)}executeProgram(){this.throwIfDisposed(),this.throwIfNoProgram();const e=this.gl;if(this.debug){this.getVertexArray();this.debugValidate()}oB(e,(()=>e.drawElements(e.TRIANGLES,6,e.UNSIGNED_SHORT,0)))}blockUntilAllProgramsCompleted(){this.throwIfDisposed(),oB(this.gl,(()=>this.gl.finish()))}getQueryTimerExtension(){return null==this.disjointQueryTimerExtension&&(this.disjointQueryTimerExtension=uB(this.gl,2===cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")?"EXT_disjoint_timer_query_webgl2":"EXT_disjoint_timer_query")),this.disjointQueryTimerExtension}getQueryTimerExtensionWebGL2(){return this.getQueryTimerExtension()}getQueryTimerExtensionWebGL1(){return this.getQueryTimerExtension()}beginQuery(){if(2===cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2(),n=e.createQuery();return e.beginQuery(t.TIME_ELAPSED_EXT,n),n}const e=this.getQueryTimerExtensionWebGL1(),t=e.createQueryEXT();return e.beginQueryEXT(e.TIME_ELAPSED_EXT,t),t}endQuery(){if(2===cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")){const e=this.gl,t=this.getQueryTimerExtensionWebGL2();return void e.endQuery(t.TIME_ELAPSED_EXT)}const e=this.getQueryTimerExtensionWebGL1();e.endQueryEXT(e.TIME_ELAPSED_EXT)}async waitForQueryAndGetTime(e){return await Ls((()=>this.disposed||this.isQueryAvailable(e,cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")))),this.getQueryTime(e,cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION"))}getQueryTime(e,t){if(0===t)return null;if(2===t){const t=this.gl;return t.getQueryParameter(e,t.QUERY_RESULT)/1e6}{const t=this.getQueryTimerExtensionWebGL1();return t.getQueryObjectEXT(e,t.QUERY_RESULT_EXT)/1e6}}isQueryAvailable(e,t){if(0===t)return!0;if(2===t){const t=this.gl,n=this.getQueryTimerExtensionWebGL2(),a=t.getQueryParameter(e,t.QUERY_RESULT_AVAILABLE);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(n.GPU_DISJOINT_EXT)),a&&!this.disjoint}{const t=this.getQueryTimerExtensionWebGL1(),n=t.getQueryObjectEXT(e,t.QUERY_RESULT_AVAILABLE_EXT);return null==this.disjoint&&(this.disjoint=this.gl.getParameter(t.GPU_DISJOINT_EXT)),n&&!this.disjoint}}pollFence(e){return new Promise((t=>{this.addItemToPoll((()=>e.isFencePassed()),(()=>t()))}))}pollItems(){const e=function(e){let t=0;for(;te.isDoneFn)));for(let t=0;t<=e;++t){const{resolveFn:e}=this.itemsToPoll[t];e()}this.itemsToPoll=this.itemsToPoll.slice(e+1)}addItemToPoll(e,t){if(this.itemsToPoll.push({isDoneFn:e,resolveFn:t}),this.itemsToPoll.length>1)return;let n;"setTimeoutCustom"in cr().platform&&(n=cr().platform.setTimeoutCustom.bind(cr().platform)),Ls((()=>(this.pollItems(),0===this.itemsToPoll.length)),(()=>0),null,n)}bindTextureToFrameBuffer(e){this.throwIfDisposed(),fB(this.gl,e,this.framebuffer),this.debug&&yB(this.gl)}unbindTextureToFrameBuffer(){null!=this.outputTexture?(fB(this.gl,this.outputTexture,this.framebuffer),this.debug&&yB(this.gl)):gB(this.gl,this.framebuffer)}downloadMatrixDriver(e,t){this.bindTextureToFrameBuffer(e);const n=t();return this.unbindTextureToFrameBuffer(),n}setOutputMatrixTextureDriver(e,t,n){this.throwIfDisposed();const a=this.gl;fB(a,e,this.framebuffer),this.debug&&yB(a),this.outputTexture=e,oB(a,(()=>a.viewport(0,0,t,n))),oB(a,(()=>a.scissor(0,0,t,n)))}setOutputMatrixWriteRegionDriver(e,t,n,a){this.throwIfDisposed(),oB(this.gl,(()=>this.gl.scissor(e,t,n,a)))}throwIfDisposed(){if(this.disposed)throw new Error("Attempted to use disposed GPGPUContext.")}throwIfNoProgram(){if(null==this.program)throw new Error("No GPU program is currently set.")}}const{mx:AF,XI:xF,Nk:CF,f6:SF,ct:EF,YG:_F,hH:TF,z3:IF,sG:NF,uM:RF,vS:DF,qB:zF,GG:OF,rq:MF,lg:BF,WR:FF,cu:LF,GE:PF,px:jF,jC:VF,He:UF,hE:WF,BF:GF,Dk:qF,cl:HF,_B:KF,ub:$F,_f:ZF,Ku:XF,qy:YF,Zy:QF,bu:JF,zv:eL,dH:tL,HS:nL,yH:aL,l3:iL,z9:sL,x6:rL,_m:oL,eW:lL,GK:uL,SP:cL,yr:hL,dl:dL,Dw:pL,xT:mL,_X:fL,wz:gL}=S;function yL(e,t){return["x","y","z","w","u","v"].slice(0,t).map((t=>`${e}.${t}`))}function bL(e,t){return 1===t?[e]:yL(e,t)}class vL{constructor(e){if(this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.enableShapeUniforms=aF(this.outputShape.length),0===this.rank)this.userCode="\n void main() {\n setOutput(vec4(getA(), 0., 0., 0.));\n }\n ";else{const e=bL("rc",this.rank),t=XB(this.rank),n=this.getOutOfBoundsCondition(e),a=this.getSetup(e),i=this.getOutput(e);this.userCode=`\n void main() {\n ${t} rc = getOutputCoords();\n\n if(${n}) {\n setOutput(vec4(0));\n } else {\n ${a}\n\n setOutput(vec4(${i}));\n }\n }\n `}}getSourceCoordsArr(e){const t=[];for(let n=0;n<=1;n++)for(let a=0;a<=1;a++){let i=`${0===n?"r":"rp1"}, ${0===a?"c":"cp1"}`;for(let t=2;t ${this.enableShapeUniforms?"outShape":this.outputShape[0]}`;let t="";for(let n=this.rank-2;n= ${this.enableShapeUniforms?`outShape[${n}]`:this.outputShape[n]}`,n= ${n};\n bool rEdge = rp1 >= ${a};\n `}getOutput(e){const t=this.getSourceCoordsArr(e);if(1===this.rank){return`getA(rc), (rc + 1 >= ${this.enableShapeUniforms?"outShape":this.outputShape[0]} ? 0. : getA(rc + 1)), 0, 0`}return`getA(${t[0]}),\n cEdge ? 0. : getA(${t[1]}),\n rEdge ? 0. : getA(${t[2]}),\n rEdge || cEdge ? 0. : getA(${t[3]})`}}class kL{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"inputShape",type:"ivec3"}],this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length);let n="";for(let e=0;e<4;e++){let t="thisRC = rc;";e%2==1&&(t+="thisRC.z += 1;"),e>1&&(t+="thisRC.y += 1;"),n+=`\n ${t}\n ${e>0?"if(thisRC.y < rows && thisRC.z < cols){":""}\n int flatIndex = getFlatIndex(thisRC);\n\n ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n result[${e}] =\n getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n ${e>0?"}":""}\n `}var a,i;this.userCode=`\n ${a=t,i=this.enableShapeUniforms,`\n ivec3 inputCoordsFromReshapedOutCoords(int index) {\n ${i?BB(["r","c","d"],"inputShape"):OB(["r","c","d"],a)}\n return ivec3(r, c, d);\n }\n `}\n ${this.enableShapeUniforms?"\n int getFlatIndex(ivec3 coords) {\n return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z;\n }\n":FB(e)}\n\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0.);\n\n ivec3 thisRC;\n int rows = ${this.enableShapeUniforms?"outShape[1]":e[1]};\n int cols = ${this.enableShapeUniforms?"outShape[2]":e[2]};\n\n ${n}\n\n setOutput(result);\n }\n `}}class wL{constructor(e){this.gpgpu=e,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0,this.freeTextures={},this.usedTextures={},this.logEnabled=!1}acquireTexture(e,t,n){const a=xL(t,n),i=CL(e,a,n);i in this.freeTextures||(this.freeTextures[i]=[]),i in this.usedTextures||(this.usedTextures[i]=[]);const s=AL(e,a,this.gpgpu.gl,this.gpgpu.textureConfig,n);if(this.freeTextures[i].length>0){this.numFreeTextures--,this.numUsedTextures++,this._numBytesFree-=s,this.log();const e=this.freeTextures[i].pop();return this.usedTextures[i].push(e),e}let r;return a===tB.PACKED_2X2_FLOAT32?r=this.gpgpu.createPackedMatrixTexture(e[0],e[1]):a===tB.PACKED_2X2_FLOAT16?r=this.gpgpu.createFloat16PackedMatrixTexture(e[0],e[1]):a===tB.UNPACKED_FLOAT32?r=this.gpgpu.createFloat32MatrixTexture(e[0],e[1]):a===tB.UNPACKED_FLOAT16?r=this.gpgpu.createFloat16MatrixTexture(e[0],e[1]):a===tB.PACKED_4X1_UNSIGNED_BYTE&&(r=this.gpgpu.createUnsignedBytesMatrixTexture(e[0],e[1])),this.usedTextures[i].push(r),this.numUsedTextures++,this._numBytesAllocated+=s,this.log(),r}releaseTexture(e,t,n,a){if(null==this.freeTextures)return;const i=xL(n,a),s=CL(t,i,a);s in this.freeTextures||(this.freeTextures[s]=[]);const r=AL(t,i,this.gpgpu.gl,this.gpgpu.textureConfig,a),o=cr().getNumber("WEBGL_DELETE_TEXTURE_THRESHOLD");-1!==o&&this._numBytesAllocated>o?(this.gpgpu.deleteMatrixTexture(e.texture),this._numBytesAllocated-=r):(this.freeTextures[s].push(e),this.numFreeTextures++,this._numBytesFree+=r),this.numUsedTextures--;const l=this.usedTextures[s],u=l&&l.indexOf(e);if(null==u||u<0)throw new Error("Cannot release a texture that was never provided by this texture manager");l[u]=l[l.length-1],l.pop(),this.log()}log(){if(!this.logEnabled)return;this.numFreeTextures,this.numUsedTextures,this._numBytesFree,this._numBytesAllocated}get numBytesAllocated(){return this._numBytesAllocated}get numBytesFree(){return this._numBytesFree}getNumUsedTextures(){return this.numUsedTextures}getNumFreeTextures(){return this.numFreeTextures}dispose(){if(null!=this.freeTextures){for(const e in this.freeTextures)this.freeTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e.texture)}));for(const e in this.usedTextures)this.usedTextures[e].forEach((e=>{this.gpgpu.deleteMatrixTexture(e.texture)}));this.freeTextures=null,this.usedTextures=null,this.numUsedTextures=0,this.numFreeTextures=0,this._numBytesAllocated=0,this._numBytesFree=0}}}function AL(e,t,n,a,i){const s=function(e,t){switch(e){case tB.PACKED_2X2_FLOAT32:return bF(t);case tB.PACKED_2X2_FLOAT16:return vF(t);case tB.UNPACKED_FLOAT32:return fF(t);case tB.UNPACKED_FLOAT16:return gF(t);case tB.PACKED_4X1_UNSIGNED_BYTE:return yF(t);default:throw new Error(`Unknown physical texture type ${e}`)}}(t,a);let r;if(i){const[t,n]=sB(e[0],e[1]);r=t*n}else{const[t,n]=aB(e[0],e[1]);r=t*n}const o=function(e,t){const n=e;if(t===n.R32F)return 4;if(t===n.R16F)return 2;if(t===n.RGBA32F)return 16;if(t===e.RGBA)return 16;if(t===n.RGBA16F)return 8;if(t===n.RGBA8)return 4;throw new Error(`Unknown internal format ${t}`)}(n,s);return r*o}function xL(e,t){if(e===JM.UPLOAD)return tB.PACKED_2X2_FLOAT32;if(e===JM.RENDER||null==e)return function(e){return cr().getBool("WEBGL_RENDER_FLOAT32_ENABLED")?e?tB.PACKED_2X2_FLOAT32:tB.UNPACKED_FLOAT32:e?tB.PACKED_2X2_FLOAT16:tB.UNPACKED_FLOAT16}(t);if(e===JM.DOWNLOAD||e===JM.PIXELS)return tB.PACKED_4X1_UNSIGNED_BYTE;throw new Error(`Unknown logical texture type ${e}`)}function CL(e,t,n){return`${e[0]}_${e[1]}_${t}_${n}`}class SL{constructor(e,t){this.variableNames=["A"],this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n float unaryOperation(float x) {\n ${t}\n }\n\n void main() {\n float x = getAAtOutCoords();\n float y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}const EL="if (isnan(x)) return x;",_L="return x;",TL="return abs(x);";const IL="return (x >= 0.0) ? x : (exp(x) - 1.0);",NL=EL+"\n return (x < 0.0) ? 0.0 : x;\n",RL=EL+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",DL="return x;",zL="return 1.0 / (1.0 + exp(-1.0 * x));",OL="return x;",ML="\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n",BL="\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",FL="\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",LL="return 1.0 / (1.0 + exp(-1.0 * x));";class PL{constructor(e,t){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n vec4 unaryOperation(vec4 x) {\n ${t}\n }\n\n void main() {\n vec4 x = getAAtOutCoords();\n vec4 y = unaryOperation(x);\n\n setOutput(y);\n }\n `}}class jL{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!1,this.outputShape=e,this.enableShapeUniforms=aF(this.outputShape.length);const t=e.length,n=bL("rc",t),a=XB(t),i=function(e,t){if(1===e)return"rc";let n="";for(let a=0;at.push(e)))}const t=this.texData.get(e),{values:n,shape:a,slice:i,dtype:s,complexTensorInfos:r,isPacked:o}=t;if(null!=i){let t;t=o?new PL(a,DL):new SL(a,DL);const n=this.runWebGLProgram(t,[{dataId:e,shape:a,dtype:s}],s),i=this.read(n.dataId);return this.disposeIntermediateTensorInfo(n),i}if(null!=n)return this.convertAndCacheOnCPU(e);if(cr().getBool("DEBUG")&&!cr().getBool("WEBGL_DOWNLOAD_FLOAT_ENABLED")&&2===cr().getNumber("WEBGL_VERSION"))throw new Error("tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and WEBGL_VERSION=2 not yet supported.");let l,u,c=null;if("complex64"!==s&&cr().get("WEBGL_BUFFER_SUPPORTED")){l=this.decode(e);const t=this.texData.get(l.dataId);c=this.gpgpu.createBufferFromTexture(t.texture.texture,...iB(a))}if(this.pendingRead.set(e,[]),"complex64"!==s&&await this.gpgpu.createAndWaitForFence(),"complex64"===s){const e=await Promise.all([this.read(r.real.dataId),this.read(r.imag.dataId)]);u=Ov(e[0],e[1])}else if(null==c)u=this.getValuesFromTexture(e);else{const e=zs(a);u=this.gpgpu.downloadFloat32MatrixFromBuffer(c,e)}if(null!=l&&this.disposeIntermediateTensorInfo(l),null!=c){const e=this.gpgpu.gl;oB(e,(()=>e.deleteBuffer(c)))}const h=this.convertAndCacheOnCPU(e,u),d=this.pendingRead.get(e);return this.pendingRead.delete(e),d.forEach((e=>e(h))),this.pendingDisposal.has(e)&&(this.pendingDisposal.delete(e),this.disposeData(e)&&ch().removeDataId(e,this),this.pendingDeletes--),h}readToGPU(e,t={}){const n=this.texData.get(e),{values:a,shape:i,slice:s,dtype:r,isPacked:o,texture:l}=n;if("complex64"===r)throw new Error("Does not support reading texture for complex64 dtype.");if(null!=s){let n;n=o?new PL(i,DL):new SL(i,DL);const a=this.runWebGLProgram(n,[{dataId:e,shape:i,dtype:r}],r),s=this.readToGPU(a,t);return this.disposeIntermediateTensorInfo(a),s}if(null==l)throw null!=a?new Error("Data is not on GPU but on CPU."):new Error("There is no data on GPU or CPU.");const u=this.decode(e,t.customTexShape),c=ch().makeTensorFromTensorInfo(u),h=this.texData.get(u.dataId);return Object.assign({tensorRef:c},h.texture)}bufferSync(e){const t=this.readSync(e.dataId);if("string"===e.dtype)try{const n=t.map((e=>nc(e)));return vd(e.shape,e.dtype,n)}catch(e){throw new Error("Failed to decode encoded string bytes into utf-8")}return vd(e.shape,e.dtype,t)}checkNumericalProblems(e){if(null!=e)for(let t=0;t0}time(e){const t=this.activeTimers,n=[];let a=!1;null==this.programTimersStack?(this.programTimersStack=n,a=!0):this.activeTimers.push(n),this.activeTimers=n,e();const i=ic(this.activeTimers.map((e=>e.query))).filter((e=>null!=e)),s=ic(this.activeTimers.map((e=>e.name))).filter((e=>null!=e));this.activeTimers=t,a&&(this.programTimersStack=null);const r={uploadWaitMs:this.uploadWaitMs,downloadWaitMs:this.downloadWaitMs,kernelMs:null,wallMs:null};return(async()=>{if(cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0){const e=await Promise.all(i);r.kernelMs=function(e){let t=0;for(let n=0;ne.map(((e,t)=>({name:s[t],ms:e}))).map((e=>`${e.name}: ${e.ms}`)).join(", ")}else r.kernelMs={error:"WebGL query timers are not supported in this environment."};return this.uploadWaitMs=0,this.downloadWaitMs=0,r})()}memory(){return{unreliable:!1,numBytesInGPU:this.numBytesInGPU,numBytesInGPUAllocated:this.textureManager.numBytesAllocated,numBytesInGPUFree:this.textureManager.numBytesFree}}startTimer(){return cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?this.gpgpu.beginQuery():{startMs:ec(),endMs:null}}endTimer(e){return cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0?(this.gpgpu.endQuery(),e):(e.endMs=ec(),e)}async getQueryTime(e){if(cr().getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE")>0)return this.gpgpu.waitForQueryAndGetTime(e);const t=e;return t.endMs-t.startMs}disposeData(e,t=!1){if(this.pendingDisposal.has(e))return!1;if(!this.texData.has(e))return!0;if(t?this.texData.get(e).refCount=0:this.texData.get(e).refCount--,!t&&this.texData.get(e).refCount>0)return!1;if(this.pendingRead.has(e))return this.pendingDisposal.add(e),this.pendingDeletes++,!1;this.releaseGPUData(e);const{complexTensorInfos:n}=this.texData.get(e);return null!=n&&(this.disposeData(n.real.dataId,t),this.disposeData(n.imag.dataId,t)),this.texData.delete(e),!0}releaseGPUData(e){const{texture:t,dtype:n,texShape:a,usage:i,isPacked:s,slice:r}=this.texData.get(e),o=r&&r.origDataId||e,l=this.dataRefCount.get(o);l>1?this.dataRefCount.set(o,l-1):(this.dataRefCount.delete(o),null!=t&&(this.numBytesInGPU-=this.computeBytes(a,n),this.textureManager.releaseTexture(t,a,i,s)));const u=this.texData.get(e);u.texture=null,u.texShape=null,u.isPacked=!1,u.slice=null}getTexture(e){return this.uploadToGPU(e),this.texData.get(e).texture.texture}getDataInfo(e){return this.texData.get(e)}shouldExecuteOnCPU(e,t=WL){return cr().getBool("WEBGL_CPU_FORWARD")&&e.every((e=>null==this.texData.get(e.dataId).texture&&zs(e.shape)0&&Hs(n[0])){const i=n.map((e=>tc(e)));a=this.write(i,e,t)}else a=this.write(n,e,t);return this.texData.get(a).usage=null,{dataId:a,shape:e,dtype:t}}makeOutput(e,t,n){return ch().makeTensorFromTensorInfo(this.makeTensorInfo(e,t,n),this)}unpackTensor(e){const t=new jL(e.shape);return this.runWebGLProgram(t,[e],e.dtype)}packTensor(e){const t=new vL(e.shape);return this.runWebGLProgram(t,[e],e.dtype,null,!0)}packedReshape(e,t){const n=[kB(e.shape),...wB(e.shape)],a={dtype:e.dtype,shape:n,dataId:e.dataId},i=[kB(t),...wB(t)],s=new kL(i,n),r=[n],o=this.runWebGLProgram(s,[a],e.dtype,r,!0);return{dataId:o.dataId,shape:t,dtype:o.dtype}}decode(e,t){const n=this.texData.get(e),{isPacked:a,shape:i,dtype:s}=n;if(null!=t){Ns(zs(i)<=t[0]*t[1]*4,(()=>"customTexShape is too small. Row * Column * 4 should be equal or larger than the size of the tensor data."))}const r=AB(i);let o;o=a?new sF(r):new iF(r);const l=[null!=t?t:iB(r)];return{dtype:s,shape:i,dataId:this.runWebGLProgram(o,[{shape:r,dtype:s,dataId:e}],s,l,!0,t).dataId}}runWebGLProgram(e,t,n,a,i=!1,s){const r=this.makeTensorInfo(e.outputShape,n),o=this.texData.get(r.dataId);if(e.packedOutput&&(o.isPacked=!0),e.outPackingScheme===YM.DENSE){const t=null!=s?s:iB(e.outputShape);o.texShape=t.map((e=>2*e))}if(null!=e.outTexUsage&&(o.usage=e.outTexUsage),0===zs(r.shape))return o.values=Us(r.dtype,0),r;const l=[],u=t.map((t=>{if("complex64"===t.dtype)throw new Error("GPGPUProgram does not support complex64 input. For complex64 dtypes, please separate the program into real and imaginary parts.");let n=this.texData.get(t.dataId);if(null==n.texture){if(!e.packedInputs&&zs(t.shape)<=cr().getNumber("WEBGL_SIZE_UPLOAD_UNIFORM"))return{shape:t.shape,texData:null,isUniform:!0,uniformValues:n.values};e.packedInputs&&(n.isPacked=!0,n.shape=t.shape)}if(this.uploadToGPU(t.dataId),!!n.isPacked!=!!e.packedInputs)t=n.isPacked?this.unpackTensor(t):this.packTensor(t),l.push(t),n=this.texData.get(t.dataId);else if(n.isPacked&&!CB(n.shape,t.shape)){const e=t,a=t.shape;t.shape=n.shape,t=this.packedReshape(t,a),l.push(t),n=this.texData.get(t.dataId),e.shape=a}return{shape:t.shape,texData:n,isUniform:!1}}));this.uploadToGPU(r.dataId);const c={shape:r.shape,texData:o,isUniform:!1},h=function(e,t,n){let a="";t.concat(n).forEach((t=>{const i=null!=t.texData&&null!=t.texData.slice&&t.texData.slice.flatOffset>0;if(e.enableShapeUniforms&&!t.isUniform){const s=t.texData.texShape,{useSqueezeShape:r,uniformShape:o,keptDims:l}=YB(e.packedInputs,t.shape,s);let u="",c="",h="";if(1===o.length&&e.packedInputs){const e=[Math.ceil(s[0]/2),Math.ceil(s[1]/2)];u=`${e[0]>1}_${e[1]>1}`}else if(2!==o.length||e.packedInputs){if(o.length>2&&!e.packedInputs){const e=Ys(o);h=`${e[0]===s[1]}_${e[e.length-1]===s[1]}`}}else c=`${o[0]>1}_${o[1]>1}`;const d=t.shape.length,p=2===o.length&&Os(t.shape,s),m=1===zs(t.shape),f=qd(t.shape,n.shape),g=!e.packedInputs&&d===n.shape.length&&Os(s,n.texData.texShape),y=e.packedInputs||o.length>2?"":`${s[0]>1}_${s[1]>1}`;a+=`${d}_${g}_${r?l:""}_${o.length}_${m}_${f}_${p}_${u}_${c}_${h}_${y}_${i}`}else{const e=t.isUniform?"uniform":t.texData.texShape;a+=`${t.shape}_${e}_${i}`}}));const i=e.userCode;let s=e.constructor.name;return s+="_"+a+"_"+i+`${cr().getNumber("WEBGL_VERSION")}`,s}(e,u,c),d=this.getAndSaveBinary(h,(()=>eF(this.gpgpu,e,u,c))),p=null!=this.activeTimers;let m;p&&(m=this.startTimer()),cr().get("ENGINE_COMPILE_ONLY")||function(e,t,n,a,i){t.program.enableShapeUniforms||(nF(t.inShapeInfos,n),nF([t.outShapeInfo],[a]));const s=a.texData.texture,r=a.texData.texShape;a.texData.isPacked?e.setOutputPackedMatrixTexture(s.texture,r[0],r[1]):e.setOutputMatrixTexture(s.texture,r[0],r[1]),e.setProgram(t.webGLProgram),e.bindVertexArray(t.webGLProgram.vao),1===cr().getNumber("WEBGL_VERSION")&&null!==t.infLoc&&e.gl.uniform1f(t.infLoc,1/0),null!==t.nanLoc&&e.gl.uniform1f(t.nanLoc,NaN);for(let a=0;athis.disposeIntermediateTensorInfo(e))),p&&(m=this.endTimer(m),this.activeTimers.push({name:e.constructor.name,query:this.getQueryTime(m)}));const f=cr().getNumber("WEBGL_FLUSH_THRESHOLD");if(f>0){const e=ec();e-this.lastGlFlushTime>f&&(this.gpgpu.gl.flush(),this.lastGlFlushTime=e)}if(!cr().getBool("WEBGL_LAZILY_UNPACK")&&o.isPacked&&!1===i){const e=this.unpackTensor(r);return this.disposeIntermediateTensorInfo(r),e}return r}compileAndRun(e,t,n,a,i=!1){n=n||t[0].dtype;return this.runWebGLProgram(e,t,n,a,i)}getAndSaveBinary(e,t){return e in this.binaryCache||(this.binaryCache[e]=t()),this.binaryCache[e]}getTextureManager(){return this.textureManager}dispose(){if(!this.disposed){if(!cr().getBool("IS_TEST")){Object.keys(this.binaryCache).forEach((e=>{this.gpgpu.deleteProgram(this.binaryCache[e].webGLProgram),delete this.binaryCache[e]}))}this.textureManager.dispose(),null!=this.canvas&&"undefined"!=typeof HTMLCanvasElement&&this.canvas instanceof HTMLCanvasElement?this.canvas.remove():this.canvas=null,this.gpgpuCreatedLocally&&(this.gpgpu.program=null,this.gpgpu.dispose()),this.disposed=!0}}floatPrecision(){return null==this.floatPrecisionValue&&(this.floatPrecisionValue=dh((()=>{if(!cr().get("WEBGL_RENDER_FLOAT32_ENABLED")){const e=cr().getBool("DEBUG");cr().set("DEBUG",!1);const t=this.abs(Rd(1e-8)).dataSync()[0];if(cr().set("DEBUG",e),t>0)return 32}return 16}))),this.floatPrecisionValue}epsilon(){return 32===this.floatPrecision()?1e-7:1e-4}uploadToGPU(e){const t=this.texData.get(e),{shape:n,dtype:a,values:i,texture:s,usage:r,isPacked:o}=t;if(null!=s)return;const l=null!=this.activeTimers;let u;l&&(u=ec());let c=t.texShape;if(null==c&&(c=function(e,t=!1){let n=cr().getNumber("WEBGL_MAX_TEXTURE_SIZE"),a=cr().getNumber("WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE");if(a===1/0&&cr().getBool("WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE")&&(a=n/2),t&&(n*=2,a*=2,1===(e=e.map(((t,n)=>n>=e.length-2?Ts(e[n]):e[n]))).length&&(e=[2,e[0]])),2!==e.length){const t=Vs(e);e=t.newShape}let i=zs(e),s=null;e.length<=1&&i<=n?s=[1,i]:2===e.length&&e[0]<=n&&e[1]<=n?s=e:3===e.length&&e[0]*e[1]<=n&&e[2]<=n?s=[e[0]*e[1],e[2]]:3===e.length&&e[0]<=n&&e[1]*e[2]<=n?s=[e[0],e[1]*e[2]]:4===e.length&&e[0]*e[1]*e[2]<=n&&e[3]<=n?s=[e[0]*e[1]*e[2],e[3]]:4===e.length&&e[0]<=n&&e[1]*e[2]*e[3]<=n&&(s=[e[0],e[1]*e[2]*e[3]]);const r=null!=s&&Math.max(...s)>a&&Math.min(...s)<=(t?2:1)&&Math.min(...s)>0;if(null==s||r)if(t){const t=kB(e);let n=2,a=2;e.length&&([n,a]=wB(e)),i=t*(n/2)*(a/2),s=Bs(i).map((e=>2*e))}else s=Bs(i);return s}(n,o),t.texShape=c),null!=i){const e=AB(n);let s,r=c[1],h=c[0];const d=i instanceof Uint8Array||i instanceof Uint8ClampedArray;!o&&d||([r,h]=sB(c[0],c[1])),s=o?new cF(e,d):new uF(e,d);const p=d?[h,r]:c,m=this.makeTensorInfo(p,a),f=this.texData.get(m.dataId);f.usage=d?JM.PIXELS:JM.UPLOAD,f.texShape=p,this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(m.dataId),r,h,i);const g=[[h,r]],y=!0,b=this.runWebGLProgram(s,[m],a,g,y),v=this.texData.get(b.dataId);t.texShape=v.texShape,t.isPacked=v.isPacked,t.usage=v.usage,cr().get("ENGINE_COMPILE_ONLY")?this.disposeData(b.dataId):(t.texture=v.texture,t.values=null,this.texData.delete(b.dataId)),this.disposeIntermediateTensorInfo(m),l&&(this.uploadWaitMs+=ec()-u)}else{const e=this.acquireTexture(c,r,a,o);t.texture=e}}convertAndCacheOnCPU(e,t){const n=this.texData.get(e),{dtype:a}=n;return null!=t&&(n.values=function(e,t){if("float32"===t||"complex64"===t)return e;if("int32"===t||"bool"===t){const n="int32"===t?new Int32Array(e.length):new Uint8Array(e.length);for(let t=0;t1024*this.numMBBeforeWarning*1024){(this.numBytesInGPU/1024/1024).toFixed(2);this.warnedAboutMemory=!0}return this.textureManager.acquireTexture(e,t,a)}computeBytes(e,t){return e[0]*e[1]*qs(t)}checkCompileCompletion(){for(const[,e]of Object.entries(this.binaryCache))this.checkCompletion_(e)}async checkCompileCompletionAsync(){const e=[];if(this.gpgpu.parallelCompilationExtension){for(const[,t]of Object.entries(this.binaryCache))e.push(this.checkCompletionAsync_(t));return Promise.all(e)}for(const[,t]of Object.entries(this.binaryCache)){const n=new Promise((e=>{try{this.checkCompletion_(t),e(!0)}catch(e){throw e}}));e.push(n)}return Promise.all(e)}async checkCompletionAsync_(e){return this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR)?this.checkCompletion_(e):(await lv(),this.checkCompletionAsync_(e))}checkCompletion_(e){if(!1===this.gpgpu.gl.getProgramParameter(e.webGLProgram,this.gpgpu.gl.LINK_STATUS)){if(!1===this.gpgpu.gl.getShaderParameter(e.fragmentShader,this.gpgpu.gl.COMPILE_STATUS))throw hB(e.source,this.gpgpu.gl.getShaderInfoLog(e.fragmentShader)),new Error("Failed to compile fragment shader.");throw new Error("Failed to link vertex and fragment shaders.")}return!0}getUniformLocations(){for(const e of Object.values(this.binaryCache)){this.gpgpu.buildVao(e.webGLProgram);const{variablesLocations:t,customUniformLocations:n,infLoc:a,nanLoc:i,outShapeLocation:s,outShapeStridesLocation:r,outTexShapeLocation:o}=tF(this.gpgpu,e.program,e.webGLProgram);e.variablesLocations=t,e.customUniformLocations=n,e.infLoc=a,e.nanLoc=i,e.outShapeLocation=s,e.outShapeStridesLocation=r,e.outTexShapeLocation=o}}createTensorFromGPUData(e,t,n){e.channels=e.channels||"RGBA";const{texture:a,height:i,width:s,channels:r}=e,o=ch().backend;if(!o.gpgpu.gl.isTexture(a))throw new Error("The texture is invalid. Also, please make sure the texture and the TFJS WebGL backend are using the same canvas. If you want to use your own custom canvas, you have to create and use the custom TFJS WebGL backend created from the canvas through 'new tf.MathBackendWebGL(customCanvas)'.");const l=o.writeTexture(a,t,n,i,s,r);return ch().makeTensorFromDataId(l,t,n,o)}}GL.nextDataId=0;Xc()&&fh("webgl",(()=>new GL),2);const qL="\n if (isnan(a)) return a;\n if (isnan(b)) return b;\n";class HL{constructor(e,t,n){this.variableNames=["A","B"],this.outputShape=Kd(t,n),this.enableShapeUniforms=aF(this.outputShape.length),this.userCode=`\n float binaryOperation(float a, float b) {\n ${e}\n }\n\n void main() {\n float a = getAAtOutCoords();\n float b = getBAtOutCoords();\n setOutput(binaryOperation(a, b));\n }\n `}}const KL="\n result.r = isNaN.r ? NAN : result.r;\n result.g = isNaN.g ? NAN : result.g;\n result.b = isNaN.b ? NAN : result.b;\n result.a = isNaN.a ? NAN : result.a;\n";class $L{constructor(e,t,n,a=!1){this.variableNames=["A","B"],this.supportsBroadcasting=!0,this.packedInputs=!0,this.packedOutput=!0,this.outputShape=Kd(t,n);const i=this.outputShape.length;this.enableShapeUniforms=aF(i);let s="";if(a)if(0===i||1===zs(this.outputShape))s="\n result.y = 0.;\n result.z = 0.;\n result.w = 0.;\n ";else{if(s=`\n ${XB(i)} coords = getOutputCoords();\n `,1===i)this.enableShapeUniforms?s+="\n result.y = (coords + 1) >= outShape ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n ":s+=`\n result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n result.z = 0.;\n result.w = 0.;\n `;else{const e=bL("coords",i);this.enableShapeUniforms?s+=`\n bool nextRowOutOfBounds =\n (${e[i-2]} + 1) >= outShape[${i} - 2];\n bool nextColOutOfBounds =\n (${e[i-1]} + 1) >= outShape[${i} - 1];\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `:s+=`\n bool nextRowOutOfBounds =\n (${e[i-2]} + 1) >= ${this.outputShape[i-2]};\n bool nextColOutOfBounds =\n (${e[i-1]} + 1) >= ${this.outputShape[i-1]};\n result.y = nextColOutOfBounds ? 0. : result.y;\n result.z = nextRowOutOfBounds ? 0. : result.z;\n result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n `}}this.userCode=`\n vec4 binaryOperation(vec4 a, vec4 b) {\n ${e}\n }\n\n void main() {\n vec4 a = getAAtOutCoords();\n vec4 b = getBAtOutCoords();\n\n vec4 result = binaryOperation(a, b);\n ${s}\n\n setOutput(result);\n }\n `}}function ZL(e){const{inputs:t,backend:n}=e,{x:a}=t;return n.incRef(a.dataId),{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}const XL={kernelName:Ro,backendName:"webgl",kernelFunc:ZL};function YL(e){const{inputs:t,backend:n}=e,{real:a,imag:i}=t,s=n.makeTensorInfo(a.shape,"complex64"),r=n.texData.get(s.dataId),o=ZL({inputs:{x:a},backend:n}),l=ZL({inputs:{x:i},backend:n});return r.complexTensorInfos={real:o,imag:l},s}const QL={kernelName:Vr,backendName:"webgl",kernelFunc:YL},JL="return (a < 0.) ? b * a : a;",eP="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";const tP={kernelName:Fo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{alpha:s}=a,r=n.makeTensorInfo([],"float32",Qu(s,"float32")),o=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new $L(eP,i.shape,r.shape):new HL(JL,i.shape,r.shape),l=n.runWebGLProgram(o,[i,r],"float32");return n.disposeIntermediateTensorInfo(r),l}},nP="return (a < 0.) ? b * a : a;",aP="\n vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n";const iP={kernelName:bl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a,alpha:i}=t,s=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new $L(aP,a.shape,i.shape):new HL(nP,a.shape,i.shape);return n.runWebGLProgram(s,[a,i],"float32")}},sP="if (isnan(x)) return x;";function rP({opSnippet:e,packedOpSnippet:t,cpuKernelImpl:n,dtype:a}){return({inputs:i,backend:s})=>{const{x:r}=i,o=s,l=a||r.dtype;if(o.shouldExecuteOnCPU([r])&&null!=n){const e=o.texData.get(r.dataId),t=n(e.values,l);return o.makeTensorInfo(r.shape,l,t)}let u;return u=cr().getBool("WEBGL_PACK_UNARY_OPERATIONS")&&null!=t?new PL(r.shape,t):new SL(r.shape,e),o.runWebGLProgram(u,[r],l)}}function oP({opSnippet:e,packedOpSnippet:t,checkOutOfBounds:n=!1,supportsComplex:a=!1,cpuKernelImpl:i,dtype:s}){return({inputs:r,backend:o})=>{const{a:l,b:u}=r,c=o;if(a&&"complex64"===l.dtype){const t=c.texData.get(l.dataId),n=c.texData.get(u.dataId),[a,i]=[[t.complexTensorInfos.real,n.complexTensorInfos.real],[t.complexTensorInfos.imag,n.complexTensorInfos.imag]].map((t=>{const[n,a]=t,i={dataId:n.dataId,dtype:n.dtype,shape:l.shape},s={dataId:a.dataId,dtype:a.dtype,shape:u.shape},r=new HL(e,l.shape,u.shape);return c.runWebGLProgram(r,[i,s],Oc(n.dtype,a.dtype))})),s=YL({inputs:{real:a,imag:i},backend:c});return c.disposeIntermediateTensorInfo(a),c.disposeIntermediateTensorInfo(i),s}const h=s||Oc(l.dtype,u.dtype);if(("string"===l.dtype||"string"===u.dtype||c.shouldExecuteOnCPU([l,u]))&&null!=i){const e=c.texData.get(l.dataId).values,t=c.texData.get(u.dataId).values,n="string"===l.dtype?mk(e):e,a="string"===l.dtype?mk(t):t,[s,r]=i(l.shape,u.shape,n,a,h),o=c.makeTensorInfo(r,h);return c.texData.get(o.dataId).values=s,o}let d;return d=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")&&null!=t?new $L(t,l.shape,u.shape,n):new HL(e,l.shape,u.shape),c.runWebGLProgram(d,[l,u],h)}}function lP(e,t=!1){if("linear"===e)return t?OL:_L;if("relu"===e)return t?BL:NL;if("elu"===e)return t?ML:IL;if("relu6"===e)return t?FL:RL;if("prelu"===e)return t?aP:nP;if("leakyrelu"===e)return t?eP:JL;if("sigmoid"===e)return t?LL:zL;throw new Error(`Activation ${e} has not been implemented for the WebGL backend.`)}class uP{constructor(e,t,n,a=!1,i=!1,s=!1,r=null,o=!1,l=!1){this.variableNames=["matrixA","matrixB"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=n,this.enableShapeUniforms=aF(this.outputShape.length);const u=a?e[1]:e[2],c=Math.ceil(u/2),h=a?"i * 2, rc.y":"rc.y, i * 2",d=i?"rc.z, i * 2":"i * 2, rc.z",p=a?["a.xxyy","a.zzww"]:["a.xxzz","a.yyww"],m=i?["b.xzxz","b.ywyw"]:["b.xyxy","b.zwzw"];let f="",g="";r&&(f=o?`vec4 activation(vec4 a) {\n vec4 b = getPreluActivationWeightsAtOutCoords();\n ${r}\n }`:l?`vec4 activation(vec4 a) {\n vec4 b = getLeakyreluAlphaAtOutCoords();\n ${r}\n }`:`vec4 activation(vec4 x) {\n ${r}\n }`,g="result = activation(result);");const y=s?"result += getBiasAtOutCoords();":"";s&&this.variableNames.push("bias"),o&&this.variableNames.push("preluActivationWeights"),l&&this.variableNames.push("leakyreluAlpha");let b="rc.x",v="rc.x";e[0]`The new shape (${l}) has ${u} elements and the old shape (${i.shape}) has ${o} elements. The new shape and old shape must have the same number of elements.`));const c=r.texData.get(i.dataId);return!c.isPacked||CB(i.shape,l)||null!==c.texture&&CB(c.shape,l)?(r.incRef(i.dataId),{dataId:i.dataId,shape:l,dtype:i.dtype}):function(e,t,n){const a=[kB(e.shape),...wB(e.shape)],i={dtype:e.dtype,shape:a,dataId:e.dataId},s=[kB(t),...wB(t)],r=new kL(s,a),o=[a],l=n.runWebGLProgram(r,[i],e.dtype,o,!0);return{dataId:l.dataId,shape:t,dtype:l.dtype}}(i,l,r)}const gP={kernelName:_l,backendName:"webgl",kernelFunc:fP};class yP{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:a,inSize:i,outSize:s}=e;this.outputShape=[a,s];const r=4*Math.floor(n/4),o=n%4;let l="sumValue += dot(values, ones);";if(null!=t){const e=1/t;l=`sumValue += dot(values * ${Ms(e)?e.toPrecision(2):e}, ones);`}let u="";i%n>0&&(u=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return 0.0;\n }\n `),this.userCode=`\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${u}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${r}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${l}\n }\n\n int inIdx = inOffset + ${r};\n if (${1===o}) {\n vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n ${l}\n } else if (${2===o}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1), 0.0, 0.0);\n\n ${l}\n } else if (${3===o}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2), 0.0);\n\n ${l}\n }\n setOutput(sumValue);\n }\n `}}class bP{constructor(e,t){this.variableNames=["x"];const{windowSize:n,batchSize:a,inSize:i,outSize:s}=e;this.outputShape=[a,s];let r="0.0",o="";"prod"===t?r="1.0":"min"===t?(r="1.0 / 1e-20",o="min"):"max"===t&&(r="-1.0 / 1e-20",o="max");let l=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"sum"===t?l="sumValue":"prod"===t?l="prodValue":"all"===t?l="allValue":"any"===t&&(l="anyValue");const u=4*Math.floor(n/4),c=n%4;let h=`\n if (${"sum"===t}) {\n sumValue += dot(values, ones);\n } else if (${"prod"===t}) {\n vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n prodValue *= tmp[0] * tmp[1];\n } else {\n minMaxValue = ${o}(values, minMaxValue);\n if (${"min"===t} || ${"max"===t}) {\n minMaxValue = ${o}(values, minMaxValue);\n bvec4 isNaN = isnan(values);\n if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n minMaxValue = vec4(NAN);\n }\n }\n }\n `,d="vec4";"all"===t?(r="1.0",h="\n bool reducedAllValue = all(values);\n float floatedReducedAllValue = float(reducedAllValue);\n allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n ",d="bvec4"):"any"===t&&(r="0.0",h="\n bool reducedAnyValue = any(values);\n float floatedReducedAnyValue = float(reducedAnyValue);\n anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n ",d="bvec4");let p="";i%n>0&&(p=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return initializationValue;\n }\n `),this.userCode=`\n const float initializationValue = ${r};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float getValue(int batch, int inIdx) {\n ${p}\n return getX(batch, inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${n};\n\n vec4 minMaxValue = vec4(${r});\n float prodValue = 1.0;\n float sumValue = 0.0;\n float allValue = 1.0;\n float anyValue = 0.0;\n\n for (int i = 0; i < ${u}; i += 4) {\n int inIdx = inOffset + i;\n ${d} values = ${d}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n ${h}\n }\n\n int inIdx = inOffset + ${u};\n if (${1===c}) {\n ${d} values = ${d}(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${h}\n } else if (${2===c}) {\n ${d} values = ${d}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n ${h}\n } else if (${3===c}) {\n ${d} values = ${d}(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n ${h}\n }\n setOutput(${l});\n }\n `}}function vP(e,t,n,a){const i=function(e){const t=[];for(;0===t.length||1!==t[t.length-1].outSize;){const n=t.length?t[t.length-1].outSize:e[1],a=bv(n);t.push({inSize:n,windowSize:a,outSize:Math.ceil(n/a)})}return t}(e.shape);let s=e;for(let r=0;r6)throw Error(`Transpose for rank ${t} is not yet supported`);const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u","resRC.v"],a=new Array(t);for(let t=0;t6)throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);const a=XB(this.rank),i=yL("rc",this.rank),s=new Array(this.rank);for(let e=0;e`Error in matMul: inner shapes (${h}) and (${d}) of Tensors with shapes ${e.shape} and ${t.shape} and transposeA=${n} and transposeB=${a} must match.`));const k=n?[y,h,p]:[y,p,h],w=a?[b,m,d]:[b,d,m],A=fP({inputs:{x:e},backend:i,attrs:{shape:k}}),x=fP({inputs:{x:t},backend:i,attrs:{shape:w}}),C=[A,x],S=Math.max(y,b),E=n?A.shape[1]:A.shape[2],_=null!=s,T=null!=r,I="leakyrelu"===l,N=null!=l?lP(l,!0):null;let R;if((1===p||1===m)&&E>_P&&!1===(_||T||I||null!=N)){let e=A,t=x;n&&(e=SP({inputs:{x:A},backend:i,attrs:{perm:[0,2,1]}}),C.push(e)),a&&(t=SP({inputs:{x},backend:i,attrs:{perm:[0,2,1]}}),C.push(t));const s=1===m;let r=e;1!==m&&(r=fP({inputs:{x:e},backend:i,attrs:{shape:[S,E,1]}}),C.push(r));const o=1===m?2:1;let l=t;s&&(l=fP({inputs:{x:t},backend:i,attrs:{shape:[S,1,E]}}),C.push(l));const u=pP({inputs:{a:r,b:l},backend:i});R=xP({inputs:{x:u},backend:i,attrs:{axis:o,keepDims:!0}}),C.push(u)}else{const l=Oc(e.dtype,t.dtype),u=new uP(k,w,[S,p,m],n,a,_,N,T,I),c=[A,x];if(null!=s&&c.push(s),T&&c.push(r),I){const e=i.makeTensorInfo([],"float32",Qu(o,"float32"));c.push(e),C.push(e)}R=i.runWebGLProgram(u,c,l)}const D=fP({inputs:{x:R},backend:i,attrs:{shape:v}});C.push(R);for(const e of C)i.disposeIntermediateTensorInfo(e);return D}const IP={kernelName:Cu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{a:i,b:s,bias:r,preluActivationWeights:o}=t,{transposeA:l,transposeB:u,activation:c,leakyreluAlpha:h}=a;return TP({a:i,b:s,transposeA:l,transposeB:u,backend:n,bias:r,preluActivationWeights:o,leakyreluAlpha:h,activation:c})}},NP="return abs(x);";const RP={kernelName:fr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t;if(n.shouldExecuteOnCPU([a])&&"complex64"!==a.dtype){const e=n.texData.get(a.dataId),t=tL(e.values);return n.makeTensorInfo(a.shape,a.dtype,t)}let i;return i=cr().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new PL(a.shape,NP):new SL(a.shape,NP),n.runWebGLProgram(i,[a],a.dtype)}},DP=rP({opSnippet:EL+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return acos(x);\n"}),zP={kernelName:gr,backendName:"webgl",kernelFunc:DP},OP=rP({opSnippet:EL+"\n if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));"}),MP={kernelName:yr,backendName:"webgl",kernelFunc:OP},BP="return a + b;",FP=oP({opSnippet:BP,packedOpSnippet:BP,supportsComplex:!0,cpuKernelImpl:AF}),LP={kernelName:br,backendName:"webgl",kernelFunc:FP};class PP{constructor(e,t){this.outputShape=[],this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`float v${e} = get${e}AtOutCoords();`)}));const a=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n float result = ${a};\n setOutput(result);\n }\n `}}class jP{constructor(e,t){this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.variableNames=t.map(((e,t)=>`T${t}`));const n=[];this.variableNames.forEach((e=>{n.push(`vec4 v${e} = get${e}AtOutCoords();`)}));const a=this.variableNames.map((e=>`v${e}`)).join(" + ");this.userCode=`\n void main() {\n ${n.join("\n ")}\n\n vec4 result = ${a};\n setOutput(result);\n }\n `}}const VP={kernelName:vr,backendName:"webgl",kernelFunc:function e(t){const{inputs:n,backend:a}=t,i=n;if(1===i.length)return ZL({inputs:{x:i[0]},backend:a});if(i.length>cr().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER")){const t=Math.floor(i.length/2),n=e({inputs:i.slice(0,t),backend:a}),s=e({inputs:i.slice(t),backend:a});return e({inputs:[n,s],backend:a})}const s=i.map((e=>e.dtype)).reduce(((e,t)=>Oc(e,t))),r=i.map((e=>e.shape)),o=cr().getBool("WEBGL_PACK")?new jP(i[0].shape,r):new PP(i[0].shape,r);return a.runWebGLProgram(o,i,s)}};const UP={kernelName:kr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=i.shape.length,l=js(s,i.shape);let u=l;const c=vf(u,o);let h=i;null!=c&&(h=SP({inputs:{x:i},backend:n,attrs:{perm:c}}),u=wf(u.length,o)),bf("all",u,o);const[d,p]=gf(h.shape,u),m=fP({inputs:{x:h},backend:n,attrs:{shape:[-1,zs(p)]}}),f=vP(m,m.dtype,"all",n);let g;if(r){g=fP({inputs:{x:f},backend:n,attrs:{shape:yf(d,l)}})}else g=fP({inputs:{x:f},backend:n,attrs:{shape:d}});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),null!=c&&n.disposeIntermediateTensorInfo(h),g}};const WP={kernelName:wr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=i.shape.length,l=js(s,i.shape);let u=l;const c=vf(u,o);let h=i;null!=c&&(h=SP({inputs:{x:i},backend:n,attrs:{perm:c}}),u=wf(u.length,o)),bf("any",u,o);const[d,p]=gf(h.shape,u),m=fP({inputs:{x:h},backend:n,attrs:{shape:[-1,zs(p)]}}),f=vP(m,m.dtype,"any",n);let g;if(r){g=fP({inputs:{x:f},backend:n,attrs:{shape:yf(d,l)}})}else g=fP({inputs:{x:f},backend:n,attrs:{shape:d}});return n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),null!=c&&n.disposeIntermediateTensorInfo(h),g}};class GP{constructor(e,t,n){this.variableNames=["A"];const{windowSize:a,batchSize:i,outSize:s}=e;n||this.variableNames.push("bestIndicesA"),this.outputShape=[i,s];const r="max"===t?">":"<",o=n?"inOffset + i;":"round(getBestIndicesA(batch, inOffset + i));";this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = outIdx * ${a};\n\n int bestIndex = inOffset;\n float bestValue = getA(batch, bestIndex);\n\n for (int i = 0; i < ${a}; i++) {\n int inIdx = ${o};\n float candidate = getA(batch, inIdx);\n if (candidate ${r} bestValue) {\n bestValue = candidate;\n bestIndex = inIdx;\n }\n }\n setOutput(float(bestIndex));\n }\n `}}class qP{constructor(e,t,n,a){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,Ns(e.length>2,(()=>`Packed arg${n.charAt(0).toUpperCase()+n.slice(1)} supports only inputs with rank above 2.`));const i=e[e.length-1],s=Math.ceil(i/t);this.outputShape=e.slice(0,-1),s>1&&this.outputShape.push(s),a||this.variableNames.push("bestIndicesA");const r=this.outputShape,o=r.length,l=XB(o),u=bL("coords",o);let c,h;if(1===s){h=o+1;const e=XB(h);c=`\n ${e} sourceLocR = ${e}(${u.join()}, 0);\n ++${u[o-1]};\n ${e} sourceLocG = ${e}(${u.join()}, 0);\n ++${u[o-2]};\n ${e} sourceLocA = ${e}(${u.join()}, 0);\n --${u[o-1]};\n ${e} sourceLocB = ${e}(${u.join()}, 0);\n --${u[o-2]};`}else h=o,c=`\n ${l} sourceLocR = coords;\n ++${u[o-1]};\n ${l} sourceLocG = coords;\n ++${u[o-2]};\n ${l} sourceLocA = coords;\n --${u[o-1]};\n ${l} sourceLocB = coords;\n --${u[o-2]};`;const d=["x","y","z","w","u","v"].slice(0,h),p="."+d[h-1],m=d.map((e=>"int "+e)),f=bL("sourceLocR",h-1).concat("inIdx.r"),g=bL("sourceLocG",h-1).concat("inIdx.g"),y=bL("sourceLocB",h-1).concat("inIdx.b"),b=bL("sourceLocA",h-1).concat("inIdx.a"),v="max"===n?"greaterThan":"lessThan",k=a?"":`\n inIdx = round(vec4(getBestIndicesAChannel(${f.join()}),\n getBestIndicesAChannel(${g.join()}),\n getBestIndicesAChannel(${y.join()}),\n getBestIndicesAChannel(${b.join()})));`,w=`vec4(\n getAChannel(${f.join()}),\n hasNextCol ? getAChannel(${g.join()}) : 0.,\n hasNextRow ? getAChannel(${y.join()}) : 0.,\n hasNextRow && hasNextCol ? getAChannel(${b.join()}) : 0.)`,A=a?"":`\n float getBestIndicesAChannel(${m.join()}) {\n return getChannel(getBestIndicesA(${d.join()}),\n vec2(${d.slice(-2).join()}));\n }`;this.userCode=`\n float getAChannel(${m.join()}) {\n return getChannel(getA(${d.join()}),\n vec2(${d.slice(-2).join()}));\n }\n ${A}\n void main() {\n ${l} coords = getOutputCoords();\n bool hasNextCol = ${u[o-1]} < ${r[o-1]-1};\n bool hasNextRow = ${u[o-2]} < ${r[o-2]-1};\n ${c}\n ivec4 srcIdx = ivec4(sourceLocR${p}, sourceLocG${p},\n sourceLocB${p}, sourceLocA${p}) * ${t};\n ivec4 inIdx = srcIdx;\n vec4 bestIndex = vec4(inIdx);\n vec4 bestValue = ${w};\n\n for (int i = 0; i < ${t}; i++) {\n inIdx = srcIdx;\n ${k}\n vec4 candidate = ${w};\n bvec4 nan = isnan(candidate);\n bvec4 replace = bvec4(\n vec4(${v}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n bestValue = vec4(replace.x ? candidate.x : bestValue.x,\n replace.y ? candidate.y : bestValue.y,\n replace.z ? candidate.z : bestValue.z,\n replace.w ? candidate.w : bestValue.w);\n bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n srcIdx++;\n }\n setOutput(bestIndex);\n }\n `}}function HP(e,t,n,a=null){let i=t.shape[0],s=t.shape[1];null!=a&&(i=a.shape[0],s=a.shape[1]);const r=bv(s),o={windowSize:r,inSize:s,batchSize:i,outSize:Math.ceil(s/r)},l=new GP(o,n,null==a),u=[t];null!=a&&u.push(a);const c=e.runWebGLProgram(l,u,"int32");if(1===c.shape[1])return c;const h=HP(e,t,n,c);return e.disposeIntermediateTensorInfo(c),h}function KP(e,t,n,a=null){const i=null!=a?a.shape:t.shape,s=bv(i[i.length-1]),r=new qP(i,s,n,null==a),o=null==a?[t]:[t,a],l=e.runWebGLProgram(r,o,"int32");if(l.shape.length===t.shape.length){const a=KP(e,t,n,l);return e.disposeIntermediateTensorInfo(l),a}return l}function $P(e,t,n,a){const i=[n];if(bf("arg"+a.charAt(0).toUpperCase()+a.slice(1),i,t.shape.length),!cr().getBool("WEBGL_PACK_REDUCE")||t.shape.length<=2){const n=[],s=e.texData.get(t.dataId);let r=t;null!==s&&s.isPacked&&(r=e.unpackTensor(t),n.push(r));const[o,l]=gf(r.shape,i),u=zs(l),c=fP({inputs:{x:r},backend:e,attrs:{shape:[-1,u]}});n.push(c);const h=HP(e,c,a);n.push(h);const d=fP({inputs:{x:h},backend:e,attrs:{shape:o}});return n.forEach((t=>e.disposeIntermediateTensorInfo(t))),d}return KP(e,t,a)}const ZP={kernelName:Ar,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s}=a;let r=js(s,i.shape);const o=vf(r,i.shape.length);let l=i;const u=[];null!=o&&(l=SP({inputs:{x:i},backend:n,attrs:{perm:o}}),u.push(l),r=wf(r.length,l.shape.length)),bf("argMax",[r[0]],l.shape.length);const c=$P(n,l,r[0],"max");return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),c}};const XP={kernelName:xr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s}=a;let r=js(s,i.shape);const o=vf(r,i.shape.length);let l=i;const u=[];null!=o&&(l=SP({inputs:{x:i},backend:n,attrs:{perm:o}}),u.push(l),r=wf(r.length,l.shape.length)),bf("argMin",[r[0]],l.shape.length);const c=$P(n,l,r[0],"min");return u.forEach((e=>n.disposeIntermediateTensorInfo(e))),c}},YP=rP({opSnippet:EL+"\n if (abs(x) > 1.) {\n return NAN;\n }\n return asin(x);\n"}),QP={kernelName:Cr,backendName:"webgl",kernelFunc:YP},JP=rP({opSnippet:EL+"return log(x + sqrt(x * x + 1.0));"}),ej={kernelName:Sr,backendName:"webgl",kernelFunc:JP},tj=rP({opSnippet:EL+"\n return atan(x);\n"}),nj={kernelName:Er,backendName:"webgl",kernelFunc:tj},aj=oP({opSnippet:qL+"\n return atan(a, b);\n",packedOpSnippet:"\n vec4 result = atan(a, b);\n bvec4 isNaNA = isnan(a);\n bvec4 isNaNB = isnan(b);\n bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n "+KL+"\n return result;\n"}),ij={kernelName:Tr,backendName:"webgl",kernelFunc:aj},sj=rP({opSnippet:EL+"\n if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;"}),rj={kernelName:_r,backendName:"webgl",kernelFunc:sj};class oj{constructor(e,t,n,a=!1,i=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const s=e.filterWidth,r=e.strideHeight,o=e.strideWidth,l=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterHeight,h=e.effectiveFilterWidth,d=e.padInfo.top,p=e.padInfo.left;this.outputShape=e.outShape;const m="avg"===t,f=`((batch * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + d`,g=`(xR * ${e.inWidth} + xC) * ${e.inChannels} + d`;let y="0.0";if(m||(y="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec2 strides = ivec2(${r}, ${o});\n const ivec2 pads = ivec2(${d}, ${p});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n float avgValue = 0.0;\n\n for (int wR = 0; wR < ${c};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${h};\n wC += ${u}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xR, xC, d);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${a?i?f:g:`wR * ${h} + wC`};\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let b=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(b="avgValue / max(count, 1.0)");const v=4*Math.floor(s/4),k=s%4,w=`\n if (${m}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec2 strides = ivec2(${r}, ${o});\n const ivec2 pads = ivec2(${d}, ${p});\n const float initializationValue = ${y};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xR, int xC, int d) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xR, xC, d);\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d = coords[3];\n\n ivec2 xRCCorner = coords.yz * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // max/min x(?, ?, d) to get y(yR, yC, d).\n // ? = to be determined\n vec4 minMaxValue = vec4(${y});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wR = 0; wR < ${c};\n wR += ${l}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${v}; wC += 4) {\n int xC = xCCorner + wC * ${u};\n\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n getValue(batch, xR, xC + 3 * ${u}, d)\n );\n\n ${w}\n }\n\n int xC = xCCorner + ${v};\n if (${1===k}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${w}\n } else if (${2===k}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n initializationValue,\n initializationValue\n );\n\n ${w}\n } else if (${3===k}) {\n vec4 values = vec4(\n getValue(batch, xR, xC, d),\n getValue(batch, xR, xC + ${u}, d),\n getValue(batch, xR, xC + 2 * ${u}, d),\n initializationValue\n );\n\n ${w}\n }\n }\n setOutput(${b});\n }\n `}}class lj{constructor(e,t,n,a=!1,i=!1){if(this.variableNames=["x"],"avg"===t&&n)throw new Error("Cannot compute positions for average pool.");const s=e.filterWidth,r=e.strideDepth,o=e.strideHeight,l=e.strideWidth,u=e.dilationDepth,c=e.dilationHeight,h=e.dilationWidth,d=e.effectiveFilterDepth,p=e.effectiveFilterHeight,m=e.effectiveFilterWidth,f=e.padInfo.front,g=e.padInfo.top,y=e.padInfo.left;this.outputShape=e.outShape;const b="avg"===t;let v="0.0";if(b||(v="-1.0 / 1e-20"),n){const t=">=";return void(this.userCode=`\n const ivec3 strides =\n ivec3(${r}, ${o}, ${l});\n const ivec3 pads = ivec3(${f}, ${g}, ${y});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n // ? = to be determined\n float minMaxValue = 0.0;\n float minMaxValueFound = 0.0;\n int minMaxPosition = 0;\n\n for (int wD = 0; wD < ${d};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${c}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${m};\n wC += ${h}) {\n int xC = xCCorner + wC;\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float value = getX(batch, xD, xR, xC, ch);\n\n // If a min / max value has already been found, use it. If not,\n // use the current value.\n float currMinMaxValue = mix(\n value, minMaxValue, minMaxValueFound);\n if (value ${t} currMinMaxValue) {\n minMaxValue = value;\n minMaxValueFound = 1.0;\n minMaxPosition = ${a?i?`(((batch * ${e.inDepth} + xD) * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`((xD * ${e.inHeight} + xR) * ${e.inWidth} + xC) * ${e.inChannels} + ch`:`wD * ${p} * ${m} +\n wR * ${m} + wC`};\n }\n }\n }\n }\n setOutput(float(minMaxPosition));\n }\n `)}let k=`${t}(${t}(${t}(minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])`;"avg"===t&&(k="avgValue / max(count, 1.0)");const w=4*Math.floor(s/4),A=s%4,x=`\n if (${b}) {\n avgValue += dot(values, ones);\n } else {\n minMaxValue = max(values, minMaxValue);\n }\n `;this.userCode=`\n const ivec3 strides =\n ivec3(${r}, ${o}, ${l});\n const ivec3 pads = ivec3(${f}, ${g}, ${y});\n const float initializationValue = ${v};\n const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n float count = 0.0;\n\n float getValue(int batch, int xD, int xR, int xC, int ch) {\n if (xC < 0 || xC >= ${e.inWidth}) {\n return initializationValue;\n }\n count += 1.0;\n return getX(batch, xD, xR, xC, ch);\n }\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xDCorner = xCorner.x;\n int xRCorner = xCorner.y;\n int xCCorner = xCorner.z;\n\n // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n // ? = to be determined\n vec4 minMaxValue = vec4(${v});\n float avgValue = 0.0;\n count = 0.0;\n\n for (int wD = 0; wD < ${d};\n wD += ${u}) {\n int xD = xDCorner + wD;\n\n if (xD < 0 || xD >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${p};\n wR += ${c}) {\n int xR = xRCorner + wR;\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${w}; wC += 4) {\n int xC = xCCorner + wC * ${h};\n\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${h}, ch),\n getValue(batch, xD, xR, xC + 2 * ${h}, ch),\n getValue(batch, xD, xR, xC + 3 * ${h}, ch)\n );\n\n ${x}\n }\n\n int xC = xCCorner + ${w};\n if (${1===A}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${2===A}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${h}, ch),\n initializationValue,\n initializationValue\n );\n\n ${x}\n } else if (${3===A}) {\n vec4 values = vec4(\n getValue(batch, xD, xR, xC, ch),\n getValue(batch, xD, xR, xC + ${h}, ch),\n getValue(batch, xD, xR, xC + 2 * ${h}, ch),\n initializationValue\n );\n\n ${x}\n }\n }\n }\n setOutput(${k});\n }\n `}}const uj={kernelName:Ir,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;RB(i,"avgPool");const{filterSize:s,strides:r,pad:o,dimRoundingMode:l}=a;Ns(fm(r,1),(()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))return ZL({inputs:{x:i},backend:n});const c=new oj(u,"avg",!1);return n.runWebGLProgram(c,[i],"float32")}};const cj={kernelName:Rr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dimRoundingMode:l,dataFormat:u}=a,c=rm(i.shape,s,r,[1,1,1],o,l,u),h=new lj(c,"avg",!1);return n.runWebGLProgram(h,[i],"float32")}};class hj{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,a=e.strideHeight,i=e.strideWidth,s=e.dilationHeight,r=e.dilationWidth,o=e.effectiveFilterHeight,l=e.effectiveFilterWidth,u=o-1-e.padInfo.top,c=l-1-e.padInfo.left,h=1/(t*n);this.userCode=`\n const ivec2 pads = ivec2(${u}, ${c});\n const float avgMultiplier = float(${h});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${o};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${l};\n wC+= ${r}) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n setOutput(dotProd);\n }\n `}}class dj{constructor(e){this.variableNames=["dy"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,a=e.filterWidth,i=e.strideDepth,s=e.strideHeight,r=e.strideWidth,o=e.dilationDepth,l=e.dilationHeight,u=e.dilationWidth,c=e.effectiveFilterDepth,h=e.effectiveFilterHeight,d=e.effectiveFilterWidth,p=c-1-e.padInfo.front,m=h-1-e.padInfo.top,f=d-1-e.padInfo.left,g=1/(t*n*a);this.userCode=`\n const ivec3 pads = ivec3(${p}, ${m}, ${f});\n const float avgMultiplier = float(${g});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${c};\n wD += ${o}) {\n float dyD = float(dyDCorner + wD) / ${i}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${h};\n wR += ${l}) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${d};\n wC += ${u}) {\n float dyC = float(dyCCorner + wC) / ${r}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n dotProd += dyValue * avgMultiplier;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const pj={kernelName:Dr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s,{filterSize:o,strides:l,pad:u,dimRoundingMode:c}=a,h=rm(r.shape,o,l,[1,1,1],u,c),d=new dj(h);return n.runWebGLProgram(d,[i],r.dtype)}};const mj={kernelName:Nr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s;RB([i,s],"avgPoolGrad");const{filterSize:o,strides:l,pad:u}=a,c=sm(r.shape,o,l,1,u),h=new hj(c);return n.runWebGLProgram(h,[i],r.dtype)}};const fj={kernelName:zr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{a:i,b:s}=t,{transposeA:r,transposeB:o}=a;return TP({a:i,b:s,transposeA:r,transposeB:o,backend:n})}};class gj{constructor(e,t,n,a,i,s){this.outputShape=[],this.variableNames=["x","mean","variance"],Kd(e,t),Kd(e,n);let r="0.0";null!=a&&(Kd(e,a),this.variableNames.push("offset"),r="getOffsetAtOutCoords()");let o="1.0";null!=i&&(Kd(e,i),this.variableNames.push("scale"),o="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n float x = getXAtOutCoords();\n float mean = getMeanAtOutCoords();\n float variance = getVarianceAtOutCoords();\n float offset = ${r};\n float scale = ${o};\n float inv = scale * inversesqrt(variance + float(${s}));\n setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n }\n `}}class yj{constructor(e,t,n,a,i,s){this.packedInputs=!0,this.packedOutput=!0,this.variableNames=["x","mean","variance"],Kd(e,t),Kd(e,n);let r="vec4(0.0)";null!=a&&(Kd(e,a),this.variableNames.push("offset"),r="getOffsetAtOutCoords()");let o="vec4(1.0)";null!=i&&(Kd(e,i),this.variableNames.push("scale"),o="getScaleAtOutCoords()"),this.outputShape=e,this.userCode=`\n void main() {\n vec4 offset = ${r};\n vec4 scale = ${o};\n\n vec4 x = getXAtOutCoords();\n vec4 mean = getMeanAtOutCoords();\n vec4 variance = getVarianceAtOutCoords();\n\n vec4 inv = scale * inversesqrt(variance + vec4(${s}));\n\n setOutput((x - mean) * inv + offset);\n }\n `}}const bj={kernelName:Eo,backendName:"webgl",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a,mean:i,variance:s,offset:r,scale:o}=e;Ns(i.shape.length===s.shape.length,(()=>"Batch normalization gradient requires mean and variance to have equal ranks.")),Ns(null==r||i.shape.length===r.shape.length,(()=>"Batch normalization gradient requires mean and offset to have equal ranks.")),Ns(null==o||i.shape.length===o.shape.length,(()=>"Batch normalization gradient requires mean and scale to have equal ranks."));let{varianceEpsilon:l}=n;null==l&&(l=.001);const u=[a,i,s];let c=null;null!=r&&(c=r.shape,u.push(r));let h=null;null!=o&&(h=o.shape,u.push(o));const d=cr().getBool("WEBGL_PACK_NORMALIZATION")?new yj(a.shape,i.shape,s.shape,c,h,l):new gj(a.shape,i.shape,s.shape,c,h,l);return t.runWebGLProgram(d,u,u[0].dtype)}};class vj{constructor(e){this.variableNames=["source"],this.outputShape=e,this.rank=e.length;const t=XB(this.rank);this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const n=function(e){if(1===e)return"sourceLoc";if(e<=6)return kj.slice(0,e).map((e=>"sourceLoc."+e)).join(",");throw Error(`Slicing for rank ${e} is not yet supported`)}(this.rank);let a;a=`\n ${t} sourceLoc;\n ${t} coords = getOutputCoords();\n ${e.map(((e,t)=>`sourceLoc.${kj[t]} = start[${t}] + coords.${kj[t]};`)).join("\n")}\n `,this.userCode=`\n void main() {\n ${a}\n setOutput(getSource(${n}));\n }\n `}}const kj=["x","y","z","w","u","v"];class wj{constructor(e){this.variableNames=["source"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=e,this.rank=e.length,this.customUniforms=[{name:"start",arrayIndex:this.rank,type:"int"}];const t=XB(this.rank),n=bL("coords",this.rank),a=bL("sourceLoc",this.rank),i=1===this.rank?"sourceLoc":`vec2(${a.slice(-2).join()})`,s=`getChannel(getSource(${a.join()}), ${i})`,r=`\n result.x = ${s};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${a[this.rank-1]};\n result.y = ${s};\n --${a[this.rank-1]};\n }\n `,o=1===this.rank?"":`\n --${n[this.rank-1]};\n if (++${n[this.rank-2]} < ${e[this.rank-2]}) {\n ++${a[this.rank-2]};\n result.z = ${s};\n if (++${n[this.rank-1]} < ${e[this.rank-1]}) {\n ++${a[this.rank-1]};\n result.w = ${s};\n }\n }\n `,l=this.rank<=4?`sourceLoc = coords +\n ${t}(${e.map(((e,t)=>`start[${t}]`)).join()});`:e.map(((e,t)=>`${a[t]} = ${n[t]} + start[${t}];`)).join("\n");this.userCode=`\n void main() {\n ${t} coords = getOutputCoords();\n ${t} sourceLoc;\n ${l}\n vec4 result = vec4(0.);\n ${r}\n ${o}\n setOutput(result);\n }\n `}}function Aj(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{begin:s,size:r}=a,[o,l]=Wp(i,s,r);if(Ip(i,o,l),0===zs(l))return n.makeTensorInfo(l,i.dtype,[]);if(n.shouldExecuteOnCPU([i])||"string"===i.dtype){const e=n.texData.get(i.dataId),t=nL(e.values,o,l,i.shape,i.dtype);return n.makeTensorInfo(l,i.dtype,t)}const{isPacked:u}=n.texData.get(i.dataId),c=Vp(i.shape,o,l);if(u||!c){const e=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new wj(l):new vj(l),t=[o];return n.runWebGLProgram(e,[i],i.dtype,t)}return n.uploadToGPU(i.dataId),function(e,t,n,a){const i=a.texData.get(e.dataId),s=a.makeTensorInfo(n,e.dtype),r=a.texData.get(s.dataId);Object.assign(r,i),r.refCount=1,r.shape=n,r.dtype=e.dtype;let o=Up(t,Ys(e.shape));i.slice&&(o+=i.slice.flatOffset),r.slice={flatOffset:o,origDataId:i.slice&&i.slice.origDataId||e.dataId};const l=a.dataRefCount.get(r.slice.origDataId)||1;return a.dataRefCount.set(r.slice.origDataId,l+1),s}(i,o,l,n)}const xj={kernelName:Vl,backendName:"webgl",kernelFunc:Aj},Cj={kernelName:Or,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockShape:s,crops:r}=a;Ns(i.shape.length<=4,(()=>"batchToSpaceND for rank > 4 with a WebGL backend not implemented yet"));const o=s.reduce(((e,t)=>e*t)),l=kv(i.shape,s,o),u=wv(l.length,s.length),c=Av(i.shape,s,o),h=xv(r,s.length),d=Cv(c,r,s.length),p=[],m=fP({inputs:{x:i},backend:n,attrs:{shape:l}}),f=SP({inputs:{x:m},backend:n,attrs:{perm:u}}),g=fP({inputs:{x:f},backend:n,attrs:{shape:c}}),y=Aj({inputs:{x:g},backend:n,attrs:{begin:h,size:d}});return p.push(m),p.push(f),p.push(g),p.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}};const Sj={kernelName:Mr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,weights:s}=t,{size:r}=a,o=n.readSync(i.dataId),l=n.readSync(s.dataId),u=xF(o,l,s.dtype,s.shape,r);return n.makeTensorInfo([r],s.dtype,u)}};const Ej={kernelName:Br,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{a,b:i}=t,s=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS"),r=cr().getNumber("WEBGL_VERSION");if(n.shouldExecuteOnCPU([a,i])||1===r){const e=n.texData.get(a.dataId).values,t=n.texData.get(i.dataId).values,[s,r]=SF(a.shape,i.shape,e,t,a.dtype),o=n.makeTensorInfo(r,a.dtype);return n.texData.get(o.dataId).values=s,o}let o;return o=s?new $L("\n int r = int(a.r) & int(b.r);\n int g = int(a.g) & int(b.g);\n int rb = int(a.b) & int(b.b);\n int ra = int(a.a) & int(b.a);\n return vec4(r, g, rb, ra);\n",a.shape,i.shape,!1):new HL("\n return float(int(a.r) & int(b.r));\n",a.shape,i.shape),n.runWebGLProgram(o,[a,i],a.dtype)}};const _j={kernelName:Fr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{s0:a,s1:i}=t,s=n.readSync(a.dataId),r=n.readSync(i.dataId),o=Kd(Array.from(s),Array.from(r));return n.makeTensorInfo([o.length],"int32",Int32Array.from(o))}},Tj=oP({opSnippet:"return float(a != b);",cpuKernelImpl:HF,dtype:"bool"}),Ij={kernelName:ul,backendName:"webgl",kernelFunc:Tj};function Nj(e){const{inputs:t,backend:n}=e,{input:a}=t;return ZL({inputs:{x:n.texData.get(a.dataId).complexTensorInfos.real},backend:n})}const Rj={kernelName:Cl,backendName:"webgl",kernelFunc:Nj},Dj="return float(int(x));";const zj={kernelName:Lr,backendName:"webgl",kernelFunc:function e(t){const{inputs:n,backend:a,attrs:i}=t,{x:s}=n,{dtype:r}=i;if("complex64"===r){if("complex64"===s.dtype)return ZL({inputs:{x:s},backend:a});const t=cg(s.shape),n=e({inputs:{x:s},backend:a,attrs:{dtype:"float32"}}),i=YL({inputs:{real:n,imag:t},backend:a});return t.dispose(),a.disposeIntermediateTensorInfo(n),i}if("complex64"===s.dtype){const t=Nj({inputs:{input:s},backend:a}),n=e({inputs:{x:t},backend:a,attrs:{dtype:r}});return a.disposeIntermediateTensorInfo(t),n}if(!Gs(s.dtype,r)){const e=ZL({inputs:{x:s},backend:a});return{dataId:e.dataId,shape:e.shape,dtype:r}}if(a.shouldExecuteOnCPU([s])){const e=a.texData.get(s.dataId).values,[t,n,i]=EF(e,s.shape,s.dtype,r);return a.makeTensorInfo(t,n,i)}if("int32"===r)return function(e,t){const n=new SL(e.shape,Dj),a=t.runWebGLProgram(n,[e],"int32");return{dataId:a.dataId,shape:a.shape,dtype:a.dtype}}(s,a);if("bool"===r){const e=a.makeTensorInfo([],"bool",Us("bool",1)),t=Tj({inputs:{a:s,b:e},backend:a});return a.disposeIntermediateTensorInfo(e),t}throw new Error(`Error in Cast: failed to cast ${s.dtype} to ${r}`)}},Oj="return ceil(x);",Mj=rP({opSnippet:Oj,packedOpSnippet:Oj,cpuKernelImpl:_F}),Bj={kernelName:Pr,backendName:"webgl",kernelFunc:Mj};class Fj{constructor(e){this.variableNames=["A"],this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n\n void main() {\n float value = getAAtOutCoords();\n if (isnan(value)) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, minVal, maxVal));\n }\n "}}class Lj{constructor(e){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"minVal",type:"float"},{name:"maxVal",type:"float"}],this.outputShape=e,this.userCode="\n void main() {\n vec4 value = getAAtOutCoords();\n\n if (any(isnan(value))) {\n setOutput(value);\n return;\n }\n\n setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n }\n "}}const Pj={kernelName:jr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{clipValueMin:s,clipValueMax:r}=a;let o;o=cr().getBool("WEBGL_PACK_CLIP")?new Lj(i.shape):new Fj(i.shape);const l=[[s],[r]];return n.runWebGLProgram(o,[i],i.dtype,l)}};class jj{constructor(e){this.variableNames=["real","imag"],this.outputShape=e,this.userCode="\n void main() {\n float re = abs(getRealAtOutCoords());\n float im = abs(getImagAtOutCoords());\n float mx = max(re, im);\n\n // sadly the length function in glsl is not underflow-safe\n // (at least not on Intel GPUs). So the safe solution is\n // to ensure underflow-safety in all cases.\n setOutput(\n mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n );\n }\n "}}function Vj(e,t){return{dataId:t.dataId,dtype:t.dtype,shape:e.shape}}const Uj={kernelName:Ur,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t,i=n.texData.get(a.dataId),s=new jj(a.shape),r=[Vj(a,i.complexTensorInfos.real),Vj(a,i.complexTensorInfos.imag)];return n.runWebGLProgram(s,r,r[0].dtype)}};class Wj{constructor(e){this.outputShape=[],this.outputShape=cv(e,1),this.variableNames=e.map(((e,t)=>`T${t}`));const t=new Array(e.length-1);t[0]=e[0][1];for(let n=1;n`T${t}`));const o=new Array(e.length-1);o[0]=e[0][t];for(let n=1;n= ${o[e-1]}) {\n return getChannel(\n getT${e}(${qj(r,l,t)}),\n vec2(${qj(u,l,t)}));\n }`}const d=o.length,p=o[o.length-1];h+=`\n return getChannel(\n getT${d}(${qj(r,l,p)}),\n vec2(${qj(u,l,p)}));`,this.userCode=`\n float getValue(${r.map((e=>"int "+e))}) {\n ${h}\n }\n\n void main() {\n ${i} coords = getOutputCoords();\n vec4 result = vec4(getValue(${s}), 0., 0., 0.);\n\n ${s[a-1]} = ${s[a-1]} + 1;\n if (${s[a-1]} < ${n[a-1]}) {\n result.g = getValue(${s});\n }\n\n ${s[a-2]} = ${s[a-2]} + 1;\n if (${s[a-2]} < ${n[a-2]}) {\n result.a = getValue(${s});\n }\n\n ${s[a-1]} = ${s[a-1]} - 1;\n if (${s[a-2]} < ${n[a-2]} &&\n ${s[a-1]} < ${n[a-1]}) {\n result.b = getValue(${s});\n }\n setOutput(result);\n }\n `}}function qj(e,t,n){const a=e.indexOf(t);return e.map(((e,t)=>t===a?`${e} - ${n}`:e)).join()}function Hj(e){const{inputs:t,backend:n}=e,{input:a}=t;return ZL({inputs:{x:n.texData.get(a.dataId).complexTensorInfos.imag},backend:n})}const Kj={kernelName:zo,backendName:"webgl",kernelFunc:Hj};function $j(e,t,n){const a=e[0].dtype;if("complex64"===a){const a=e.map((e=>Nj({inputs:{input:e},backend:n}))),i=e.map((e=>Hj({inputs:{input:e},backend:n}))),s=$j(a,t,n),r=$j(i,t,n),o=YL({inputs:{real:s,imag:r},backend:n});return a.forEach((e=>n.disposeIntermediateTensorInfo(e))),i.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.disposeIntermediateTensorInfo(s),n.disposeIntermediateTensorInfo(r),o}let i=n.shouldExecuteOnCPU(e);if("string"===a&&(i=!0),i){const i=e.map((e=>{const a=zs(e.shape.slice(t));return fP({inputs:{x:e},backend:n,attrs:{shape:[-1,a]}})})),s=i.map((e=>({vals:n.readSync(e.dataId),shape:e.shape}))),r=cv(i.map((e=>e.shape)),1),o=1===i[0].shape[0],l=TF(s,r,a,o),u=cv(e.map((e=>e.shape)),t),c=n.makeTensorInfo(u,a,l);return i.forEach((e=>n.disposeIntermediateTensorInfo(e))),c}const s=e.filter((e=>zs(e.shape)>0)),r=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")&&s[0].shape.length>1;if(1===s.length){const t=r?new SL(e[0].shape,DL):new PL(e[0].shape,DL);return n.runWebGLProgram(t,e,a)}const o=cr().getNumber("WEBGL_MAX_TEXTURES_IN_SHADER");if(s.length>o){const e=[];for(let a=0;ae.shape)),t);return n.runWebGLProgram(e,s,a)}const{tensors2D:l,outShape:u}=function(e,t,n){const a=cv(e.map((e=>e.shape)),t),i=e.map((e=>fP({inputs:{x:e},attrs:{shape:[-1,zs(e.shape.slice(t))]},backend:n})));return{tensors2D:i,outShape:a}}(s,t,n),c=new Wj(l.map((e=>e.shape))),h=n.runWebGLProgram(c,l,a);l.forEach((e=>n.disposeIntermediateTensorInfo(e)));const d=fP({inputs:{x:h},attrs:{shape:u},backend:n});return n.disposeIntermediateTensorInfo(h),d}function Zj(e){const{inputs:t,backend:n,attrs:a}=e,{axis:i}=a,s=js(i,t[0].shape)[0];uv(t.map((e=>e.shape)),s);const r=cv(t.map((e=>e.shape)),s);if(0===zs(r))return n.makeTensorInfo(r,t[0].dtype,[]);const o=t.filter((e=>zs(e.shape)>0));return 1===o.length?ZL({inputs:{x:o[0]},backend:n}):$j(o,s,n)}const Xj={kernelName:Wr,backendName:"webgl",kernelFunc:Zj};class Yj{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.outputShape=e.outShape;const s=e.padInfo.top,r=e.padInfo.left,o=e.strideHeight,l=e.strideWidth,u=e.dilationHeight,c=e.dilationWidth,h=e.filterHeight,d=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4,f="channelsLast"===e.dataFormat,g=f?1:2,y=f?2:3,b=f?3:1;let v="",k="";n&&(v=a?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:i?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,k="result = activation(result);");const w=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),i&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${v}\n\n const ivec2 strides = ivec2(${o}, ${l});\n const ivec2 pads = ivec2(${s}, ${r});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d2 = coords[${b}];\n\n ivec2 xRCCorner =\n ivec2(coords[${g}], coords[${y}]) * strides - pads;\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${h}; wR++) {\n int xR = xRCorner + wR * ${u};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${d}; wC++) {\n int xC = xCCorner + wC * ${c};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 wValues = vec4(\n getW(wR, wC, d1, d2),\n getW(wR, wC, d1 + 1, d2),\n getW(wR, wC, d1 + 2, d2),\n getW(wR, wC, d1 + 3, d2)\n );\n\n if (${f}) {\n vec4 xValues = vec4(\n getX(batch, xR, xC, d1),\n getX(batch, xR, xC, d1 + 1),\n getX(batch, xR, xC, d1 + 2),\n getX(batch, xR, xC, d1 + 3)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec4 xValues = vec4(\n getX(batch, d1, xR, xC),\n getX(batch, d1 + 1, xR, xC),\n getX(batch, d1 + 2, xR, xC),\n getX(batch, d1 + 3, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n\n if (${1===m}) {\n\n if (${f}) {\n dotProd +=\n getX(batch, xR, xC, ${p}) *\n getW(wR, wC, ${p}, d2);\n } else {\n dotProd +=\n getX(batch, ${p}, xR, xC) *\n getW(wR, wC, ${p}, d2);\n }\n\n } else if (${2===m}) {\n vec2 wValues = vec2(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2)\n );\n\n if (${f}) {\n vec2 xValues = vec2(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec2 xValues = vec2(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n } else if (${3===m}) {\n vec3 wValues = vec3(\n getW(wR, wC, ${p}, d2),\n getW(wR, wC, ${p} + 1, d2),\n getW(wR, wC, ${p} + 2, d2)\n );\n\n if (${f}) {\n vec3 xValues = vec3(\n getX(batch, xR, xC, ${p}),\n getX(batch, xR, xC, ${p} + 1),\n getX(batch, xR, xC, ${p} + 2)\n );\n dotProd += dot(xValues, wValues);\n } else {\n vec3 xValues = vec3(\n getX(batch, ${p}, xR, xC),\n getX(batch, ${p} + 1, xR, xC),\n getX(batch, ${p} + 2, xR, xC)\n );\n dotProd += dot(xValues, wValues);\n }\n\n }\n }\n }\n\n float result = dotProd;\n ${w}\n ${k}\n setOutput(result);\n }\n `}}class Qj{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const t=e.padInfo.front,n=e.padInfo.top,a=e.padInfo.left,i=e.strideDepth,s=e.strideHeight,r=e.strideWidth,o=e.dilationDepth,l=e.dilationHeight,u=e.dilationWidth,c=e.filterDepth,h=e.filterHeight,d=e.filterWidth,p=4*Math.floor(e.inChannels/4),m=e.inChannels%4;this.userCode=`\n const ivec3 strides = ivec3(${i}, ${s}, ${r});\n const ivec3 pads = ivec3(${t}, ${n}, ${a});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d2 = coords.u;\n\n ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n int xFCorner = xFRCCorner.x;\n int xRCorner = xFRCCorner.y;\n int xCCorner = xFRCCorner.z;\n\n // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n // y(yF, yR, yC, d2). ? = to be determined. : = across all\n // values in that axis.\n float dotProd = 0.0;\n for (int wF = 0; wF < ${c}; wF++) {\n int xF = xFCorner + wF * ${o};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int wR = 0; wR < ${h}; wR++) {\n int xR = xRCorner + wR * ${l};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int wC = 0; wC < ${d}; wC++) {\n int xC = xCCorner + wC * ${u};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n for (int d1 = 0; d1 < ${p}; d1 += 4) {\n vec4 xValues = vec4(\n getX(batch, xF, xR, xC, d1),\n getX(batch, xF, xR, xC, d1 + 1),\n getX(batch, xF, xR, xC, d1 + 2),\n getX(batch, xF, xR, xC, d1 + 3)\n );\n vec4 wValues = vec4(\n getW(wF, wR, wC, d1, d2),\n getW(wF, wR, wC, d1 + 1, d2),\n getW(wF, wR, wC, d1 + 2, d2),\n getW(wF, wR, wC, d1 + 3, d2)\n );\n\n dotProd += dot(xValues, wValues);\n }\n\n if (${1===m}) {\n dotProd +=\n getX(batch, xF, xR, xC, ${p}) *\n getW(wF, wR, wC, ${p}, d2);\n } else if (${2===m}) {\n vec2 xValues = vec2(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1)\n );\n vec2 wValues = vec2(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2)\n );\n dotProd += dot(xValues, wValues);\n } else if (${3===m}) {\n vec3 xValues = vec3(\n getX(batch, xF, xR, xC, ${p}),\n getX(batch, xF, xR, xC, ${p} + 1),\n getX(batch, xF, xR, xC, ${p} + 2)\n );\n vec3 wValues = vec3(\n getW(wF, wR, wC, ${p}, d2),\n getW(wF, wR, wC, ${p} + 1, d2),\n getW(wF, wR, wC, ${p} + 2, d2)\n );\n dotProd += dot(xValues, wValues);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class Jj{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=aF(this.outputShape.length);const s=e.padInfo.left,r=e.strideWidth,o=e.dilationWidth,l=e.filterHeight,u=e.filterWidth,c=u;let h="\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;";for(let e=0;e=0 && xR < inDims[0]) {\n ";for(let t=0;t<(c+1)/2;t++){const n=2*t;if(h+=`\n xC = xCCorner + ${n*o};\n `,1===r){if(n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n `,h+=1===o&&n>0?`\n xC${n} = vec4(xTexelC${n-2}.zw, xTexelC${n}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${n} = vec4(previous.zw, xTexelC${n}.xy);\n } else {\n xC${n} = vec4(0.0, 0.0, xTexelC${n}.xy);\n }\n `):h+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xC${n} = xTexelC${n};\n `,n+1= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n `,h+=o>1?`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${n+1} = vec4(previous.zw, xTexelC${n+1}.xy);\n } else {\n xC${n+1} = vec4(0.0, 0.0, xTexelC${n+1}.xy);\n }\n `:`\n xC${n+1} = vec4(xTexelC${n}.zw, xTexelC${n+1}.xy);\n `):h+=1===e?`\n xC${n+1} = xTexelC${n};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n+1} = xTexelC${n+1};\n `}}else n= 0 && xCOffset < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.0);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(xTexelC${n}.zw, xTexelC${n+1}.zw);\n `,n+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${n+1} = vec4(xTexelC${n+1}.xy, final.xy);\n `)):(h+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${n}Ready == 0) {\n xTexelC${n} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${n}.zw = vec2(0.0);\n }\n xTexelC${n}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${n+1}Ready == 0) {\n xTexelC${n+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${n+1}.zw = vec2(0.);\n }\n xTexelC${n+1}Ready = 1;\n }\n\n xC${n} = vec4(\n xTexelC${n}.xy, xTexelC${n+1}.xy);\n `,n+1= 0) {\n // Use custom imod instead mod. On Intel GPU, mod may generate\n // unexpected value.\n // https://github.com/tensorflow/tfjs/issues/5447\n offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1];\n d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) /\n inChannels);\n\n if(d1 < inputShape[${r}] && d1 >= 0) {\n\n ch = imod(pos, inChannels);\n\n if (${i}) {\n innerDims = vec2(d1, ch);\n result[${2*e+t}] = getChannel(\n getA(rc.x, d0, int(innerDims.x),\n int(innerDims.y)), innerDims);\n } else {\n innerDims = vec2(d0, d1);\n result[${2*e+t}] = getChannel(\n getA(rc.x, ch, int(innerDims.x),\n int(innerDims.y)), innerDims);\n }\n }\n }\n }\n `;this.userCode=`\n void main() {\n ivec3 rc = getOutputCoords();\n\n vec4 result = vec4(0);\n\n int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n vec2 innerDims;\n\n ${l}\n\n ${a.output} = result;\n }\n `}}function tV(e,t){const n=e.length;return n>=3?t?[...e.slice(0,-3),e[n-3]*e[n-2],e[n-1]]:[...e.slice(0,-3),e[n-3],e[n-2]*e[n-1]]:!t&&1===n&&e[0]>1?[e[0],1]:null}function nV({x:e,filter:t,convInfo:n,backend:a,bias:i=null,preluActivationWeights:s=null,leakyreluAlpha:r=0,activation:o=null}){const l=e.shape,u=a.texData.get(e.dataId),c=n.inChannels,h=l[0]*l[1]*l[2],d=n.outChannels,p="channelsLast"===n.dataFormat,m=!1;let f;const g=[];if(null!=s){const e=tV(s.shape,p);null!=e&&(s=fP({inputs:{x:s},backend:a,attrs:{shape:e}}),g.push(s))}if(null!=i){const e=tV(i.shape,p);null!=e&&(i=fP({inputs:{x:i},backend:a,attrs:{shape:e}}),g.push(i))}if(!((1===h||1===d)&&c>_P)&&u.isPacked&&p&&null!=u.texture&&l[2]%2!=0&&Os(u.shape.slice(-3),l.slice(-3))){const c=l[0]*l[1]*(l[2]+1),h={dataId:e.dataId,shape:[1,c,n.inChannels],dtype:e.dtype},d=u.shape;u.shape=u.shape.slice(),u.shape[u.shape.length-2]++,Ns(CB(u.shape,h.shape),(()=>`packed reshape ${u.shape} to ${h.shape} isn't free`));const p=fP({inputs:{x:t},backend:a,attrs:{shape:[1,n.inChannels,n.outChannels]}});g.push(p);const y=TP({a:h,b:p,backend:a,transposeA:false,transposeB:m,bias:i,activation:o,preluActivationWeights:s,leakyreluAlpha:r}),b=a.texData.get(y.dataId);Ns(b.isPacked,(()=>"batchMatMul result is expected to be packed")),u.shape=d,b.shape=n.outShape,f=ZL({inputs:{x:y},backend:a}),f.shape=n.outShape,g.push(y)}else{const l=n.outHeight*n.outWidth,u=fP({inputs:{x:e},backend:a,attrs:{shape:p?[n.batchSize,l,n.inChannels]:[n.batchSize,n.inChannels,l]}}),c=fP({inputs:{x:t},backend:a,attrs:{shape:[1,n.inChannels,n.outChannels]}}),h=TP({a:p?u:c,b:p?c:u,transposeA:!p,transposeB:m,backend:a,bias:i,activation:o,preluActivationWeights:s,leakyreluAlpha:r});f=fP({inputs:{x:h},backend:a,attrs:{shape:n.outShape}}),g.push(u),g.push(c),g.push(h)}for(const e of g)a.disposeIntermediateTensorInfo(e);return f}function aV({x:e,filter:t,convInfo:n,backend:a,bias:i=null,preluActivationWeights:s=null,leakyreluAlpha:r=0,activation:o=null}){const{filterWidth:l,filterHeight:u,inChannels:c,outWidth:h,outHeight:d,dataFormat:p}=n,m="channelsLast"===p,f=l*u*c,g=d*h,y=[n.batchSize,f,g],b=[];if(null!=s){const e=tV(s.shape,m);null!=e&&(s=fP({inputs:{x:s},backend:a,attrs:{shape:e}}),b.push(s))}if(null!=i){const e=tV(i.shape,m);null!=e&&(i=fP({inputs:{x:i},backend:a,attrs:{shape:e}}),b.push(i))}const v=fP({inputs:{x:t},backend:a,attrs:{shape:[1,f,zs(t.shape)/f]}});b.push(v);const k=new eV(y,n),w=[e.shape,[n.padInfo.top,n.padInfo.left],[n.strideHeight,n.strideWidth],[n.dilationHeight,n.dilationWidth],[n.inChannels],[n.filterWidth*n.inChannels],[n.outWidth]],A=a.runWebGLProgram(k,[e],"float32",w),x=fP({inputs:{x:A},backend:a,attrs:{shape:y}});b.push(A),b.push(x);const C=null!=i,S=null!=s,E="leakyrelu"===o,_=o?lP(o,!0):null,T=new uP(m?x.shape:v.shape,m?v.shape:x.shape,m?[n.batchSize,g,n.outChannels]:[n.batchSize,n.outChannels,g],!0,!1,C,_,S,E),I=m?[x,v]:[v,x];if(i&&I.push(i),S&&I.push(s),E){const e=a.makeTensorInfo([],"float32",Qu(r,"float32"));I.push(e),b.push(e)}const N=a.runWebGLProgram(T,I,"float32"),R=fP({inputs:{x:N},backend:a,attrs:{shape:n.outShape}});b.push(N);for(const e of b)a.disposeIntermediateTensorInfo(e);return R}const iV={kernelName:Gr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dataFormat:l,dilations:u,dimRoundingMode:c}=a,h=ym(l),d=om(i.shape,s.shape,r,u,o,c,!1,h);let p;if(1!==d.filterHeight||1!==d.filterWidth||1!==d.dilationHeight||1!==d.dilationWidth||1!==d.strideHeight||1!==d.strideWidth||"SAME"!==d.padInfo.type&&"VALID"!==d.padInfo.type)if(d.strideWidth<=2&&"channelsLast"===h&&cr().getBool("WEBGL_EXP_CONV")){const e=new Jj(d),t=[[d.padInfo.top,d.padInfo.left],[d.strideHeight,d.strideWidth],[d.dilationHeight,d.dilationWidth],[d.inHeight,d.inWidth]];p=n.runWebGLProgram(e,[i,s],"float32",t)}else if(cr().getBool("WEBGL_CONV_IM2COL"))p=aV({x:i,filter:s,convInfo:d,backend:n});else{const e=new Yj(d);p=n.runWebGLProgram(e,[i,s],"float32")}else p=nV({x:i,filter:s,convInfo:d,backend:n});const m=fP({inputs:{x:p},backend:n,attrs:{shape:d.outShape}});return n.disposeIntermediateTensorInfo(p),m}};class sV{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,a=e.padInfo.top,i=e.padInfo.left,s="channelsLast"===e.dataFormat;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int d2 = coords.w;\n\n // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${a};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n ${s?"float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);":"float dyValue = getDy(b, d2, yR, yC);\n float xValue = getX(b, d1, xR, xC);\n dotProd += (xValue * dyValue);"}\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class rV{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,a=e.strideHeight,i=e.strideWidth,s="channelsLast"===e.dataFormat,r=t-1-e.padInfo.top,o=n-1-e.padInfo.left,l=s?1:2,u=s?2:3,c=s?3:1;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${o});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[${c}];\n\n ivec2 dyCorner = ivec2(coords[${l}], coords[${u}]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n\n if (${s}) {\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n } else {\n float xValue = getDy(batch, d2, idyR, idyC);\n float wValue = getW(wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class oV{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideDepth,n=e.strideHeight,a=e.strideWidth,i=e.padInfo.front,s=e.padInfo.top,r=e.padInfo.left;this.userCode=`\n void main() {\n ivec5 coords = getOutputCoords();\n int wF = coords.x;\n int wR = coords.y;\n int wC = coords.z;\n int d1 = coords.w;\n int d2 = coords.u;\n\n float dotProd = 0.0;\n\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yF = 0; yF < ${e.outDepth}; yF++) {\n int xF = wF + yF * ${t} - ${i};\n\n if (xF < 0 || xF >= ${e.inDepth}) {\n continue;\n }\n\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${n} - ${s};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${a} - ${r};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yF, yR, yC, d2);\n float xValue = getX(b, xF, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class lV{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterDepth,n=e.filterHeight,a=e.filterWidth,i=e.strideDepth,s=e.strideHeight,r=e.strideWidth,o=t-1-e.padInfo.front,l=n-1-e.padInfo.top,u=a-1-e.padInfo.left;this.userCode=`\n const ivec3 pads = ivec3(${o}, ${l}, ${u});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.u;\n\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyFCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n float dotProd = 0.0;\n for (int wF = 0; wF < ${t}; wF++) {\n float dyF = float(dyFCorner + wF) / ${i}.0;\n\n if (dyF < 0.0 || dyF >= ${e.outDepth}.0 || fract(dyF) > 0.0) {\n continue;\n }\n int idyF = int(dyF);\n\n int wFPerm = ${t} - 1 - wF;\n\n for (int wR = 0; wR < ${n}; wR++) {\n float dyR = float(dyRCorner + wR) / ${s}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${n} - 1 - wR;\n\n for (int wC = 0; wC < ${a}; wC++) {\n float dyC = float(dyCCorner + wC) / ${r}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${a} - 1 - wC;\n\n for (int d2 = 0; d2 < ${e.outChannels}; d2++) {\n float xValue = getDy(batch, idyF, idyR, idyC, d2);\n float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n dotProd += xValue * wValue;\n }\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const uV={kernelName:qr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,dy:s}=t,{strides:r,pad:o,dataFormat:l,dimRoundingMode:u,filterShape:c}=a,h=ym(l),d=om(i.shape,c,r,1,o,u,!1,h),p=new sV(d);return n.runWebGLProgram(p,[i,s],"float32")}};class cV{constructor(e){this.variableNames=["dy","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"strides",type:"vec2"}],this.outputShape=e.inShape,this.enableShapeUniforms=aF(this.outputShape.length);const t=e.filterHeight,n=e.filterWidth,a=t-1-e.padInfo.top,i=n-1-e.padInfo.left;this.userCode=`\n const ivec2 pads = ivec2(${a}, ${i});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n\n ivec2 dyCorner = ivec2(coords[1], coords[2]) - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n vec4 result = vec4(0.);\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / strides[0];\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n int wCPerm = ${n} - 1 - wC;\n\n float dyC = float(dyCCorner + wC) / strides[1];\n bool idyCVal = (dyC >= 0.0) && (dyC < ${e.outWidth}.0)\n && (fract(dyC) == 0.0);\n int idyC = int(dyC);\n\n float dyC2 = float(dyCCorner + wC + 1) / strides[1];\n bool idyCVal2 = (dyC2 >= 0.0) && (dyC2 < ${e.outWidth}.0)\n && (fract(dyC2) == 0.0);\n int idyC2 = int(dyC2);\n\n if (idyCVal && idyCVal2) {\n for (int d2 = 0; d2 < ${e.outChannels}; d2 += 2) {\n vec4 wValue = getW(wRPerm, wCPerm, d1, d2);\n vec4 dySample = getDy(batch, idyR, idyC, d2);\n vec4 dySample2 = (idyC / 2 == idyC2 / 2) ?\n dySample : getDy(batch, idyR, idyC2, d2);\n\n vec2 dyValue = mod(float(idyC), 2.) == 0. ?\n dySample.xy : dySample.zw;\n result.xy += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n\n dyValue = mod(float(idyC2), 2.) == 0. ?\n dySample2.xy : dySample2.zw;\n result.zw += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n }\n } else if (idyCVal) {\n for (int d2 = 0; d2 < ${e.outChannels}; d2 += 2) {\n vec4 wValue = getW(wRPerm, wCPerm, d1, d2);\n vec4 dySample = getDy(batch, idyR, idyC, d2);\n vec2 dyValue = mod(float(idyC), 2.) == 0. ?\n dySample.xy : dySample.zw;\n result.xy += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n }\n } else if (idyCVal2) {\n for (int d2 = 0; d2 < ${e.outChannels}; d2 += 2) {\n vec4 wValue = getW(wRPerm, wCPerm, d1, d2);\n vec4 dySample = getDy(batch, idyR, idyC2, d2);\n vec2 dyValue = mod(float(idyC2), 2.) == 0. ?\n dySample.xy : dySample.zw;\n result.zw += vec2(dot(dyValue, wValue.xy),\n dot(dyValue, wValue.zw));\n }\n }\n }\n }\n setOutput(result);\n }\n `}}const hV={kernelName:Hr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,filter:s}=t,{inputShape:r,strides:o,pad:l,dataFormat:u,dimRoundingMode:c}=a,h=ym(u),d=om(r,s.shape,o,1,l,c,!1,h);if(cr().getBool("WEBGL_PACK_CONV2DTRANSPOSE")&&"channelsLast"===h){const e=[[d.strideHeight,d.strideWidth]],t=new cV(d);return n.runWebGLProgram(t,[i,s],"float32",e)}{const e=new rV(d);return n.runWebGLProgram(e,[i,s],"float32")}}};const dV={kernelName:Kr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dilations:l}=a,u=lm(i.shape,s.shape,r,l,o),c=new Qj(u);return n.runWebGLProgram(c,[i,s],"float32")}};const pV={kernelName:$r,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,dy:s}=t,{strides:r,pad:o,filterShape:l}=a,u=lm(i.shape,l,r,1,o),c=new oV(u);return n.runWebGLProgram(c,[i,s],"float32")}};const mV={kernelName:Zr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,filter:s}=t,{pad:r,strides:o,inputShape:l}=a,u=lm(l,s.shape,o,1,r),c=new lV(u);return n.runWebGLProgram(c,[i,s],"float32")}},fV=rP({opSnippet:sP+"\n return cos(x);\n",packedOpSnippet:`\n vec4 result = cos(x);\n bvec4 isNaN = isnan(x);\n ${KL}\n return result;\n`}),gV={kernelName:Xr,backendName:"webgl",kernelFunc:fV},yV=rP({opSnippet:"\n float e2x = exp(-x);\n return (e2x + 1.0 / e2x) / 2.0;\n"}),bV={kernelName:Yr,backendName:"webgl",kernelFunc:yV};class vV{constructor(e,t,n,a,i){this.variableNames=["Image","Boxes","BoxInd"],this.outputShape=[];const[s,r,o,l]=e,[u]=t,[c,h]=n;this.outputShape=[u,c,h,l];const d="bilinear"===a?1:0,[p,m]=[r-1+".0",o-1+".0"],[f,g,y]=c>1?[""+(r-1)/(c-1),"(y2-y1) * height_ratio",`y1*${p} + float(y)*(height_scale)`]:["0.0","0.0",`0.5 * (y1+y2) * ${p}`],[b,v,k]=h>1?[""+(o-1)/(h-1),"(x2-x1) * width_ratio",`x1*${m} + float(x)*(width_scale)`]:["0.0","0.0",`0.5 * (x1+x2) * ${m}`];this.userCode=`\n const float height_ratio = float(${f});\n const float width_ratio = float(${b});\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int y = coords[1];\n int x = coords[2];\n int d = coords[3];\n\n // get box vals\n float y1 = getBoxes(b,0);\n float x1 = getBoxes(b,1);\n float y2 = getBoxes(b,2);\n float x2 = getBoxes(b,3);\n\n // get image in batch index\n int bInd = round(getBoxInd(b));\n if(bInd < 0 || bInd >= ${s}) {\n return;\n }\n\n float height_scale = ${g};\n float width_scale = ${v};\n\n float in_y = ${y};\n if( in_y < 0.0 || in_y > ${p} ) {\n setOutput(float(${i}));\n return;\n }\n float in_x = ${k};\n if( in_x < 0.0 || in_x > ${m} ) {\n setOutput(float(${i}));\n return;\n }\n\n vec2 sourceFracIndexCR = vec2(in_x,in_y);\n if(${d} == 1) {\n // Compute the four integer indices.\n ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n float top = topLeft + (topRight - topLeft) * fracCR.x;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n float newValue = top + (bottom - top) * fracCR.y;\n setOutput(newValue);\n } else {\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestCR = ivec2(floor(\n sourceFracIndexCR + vec2(0.5,0.5)));\n float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n setOutput(newValue);\n }\n }\n `}}const kV={kernelName:eo,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{image:i,boxes:s,boxInd:r}=t,{cropSize:o,method:l,extrapolationValue:u}=a,c=new vV(i.shape,s.shape,o,l,u);return n.runWebGLProgram(c,[i,s,r],"float32")}};var wV,AV;(AV=wV||(wV={})).Prod="*",AV.Sum="+";class xV{constructor(e,t,n,a){this.op=e,this.outputShape=t,this.variableNames=["x"],this.customUniforms=[{name:"index",type:"float"}];const i=this.outputShape.length,s=this.op===wV.Prod?"1.0":"0.0",r=n?s:`getX(${CV(i,"coords",this.op)})`,o=this.outputShape[this.outputShape.length-1];let l="",u="";n?(l=a?"end != "+(o-1):"end != 0",u=a?"end + 1":"end - 1"):(l=a?`end + pow2 < ${o}`:"end >= pow2",u=a?"end + pow2":"end - pow2"),this.userCode=`\n void main() {\n ${XB(i)} coords = getOutputCoords();\n int end = ${SV(i,"coords",this.op)};\n float val = ${r};\n int pow2 = int(pow(2.0, index));\n if (${l}) {\n int idx = ${u};\n ${SV(i,"coords",this.op)} = idx;\n val ${this.op}= getX(${CV(i,"coords",this.op)});\n }\n setOutput(val);\n }\n `}}function CV(e,t,n){if(1===e)return`${t}`;if(2===e)return`${t}.x, ${t}.y`;if(3===e)return`${t}.x, ${t}.y, ${t}.z`;if(4===e)return`${t}.x, ${t}.y, ${t}.z, ${t}.w`;throw new Error(`Cumulative ${n} for rank ${e} is not yet supported`)}function SV(e,t,n){if(1===e)return`${t}`;if(2===e)return`${t}.y`;if(3===e)return`${t}.z`;if(4===e)return`${t}.w`;throw new Error(`Cumulative ${n} for rank ${e} is not yet supported`)}function EV(e,t,n,a,i,s){const r=t.shape.length,o=vf([a],r);let l=t;null!=o&&(l=SP({inputs:{x:t},backend:n,attrs:{perm:o}}));const u=wf(1,r)[0];if(u!==r-1)throw new Error(`WebGL cumprod shader expects an inner-most axis=${t.shape.length-1} but got axis=${a}`);const c=l.shape[u];let h=ZL({inputs:{x:l},backend:n});for(let t=0;t<=Math.ceil(Math.log2(c))-1;t++){const a=new xV(e,l.shape,!1,s),i=[[t]],r=h;h=n.runWebGLProgram(a,[h],h.dtype,i),n.disposeIntermediateTensorInfo(r)}if(i){const t=new xV(e,l.shape,i,s),a=h;h=n.runWebGLProgram(t,[h],h.dtype),n.disposeIntermediateTensorInfo(a)}if(null!=o){const e=SP({inputs:{x:h},backend:n,attrs:{perm:kf(o)}});return n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(l),e}return h}const _V={kernelName:Qr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,exclusive:r,reverse:o}=a;return EV(wV.Prod,i,n,s,r,o)}};const TV={kernelName:Jr,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,exclusive:r,reverse:o}=a;return EV(wV.Sum,i,n,s,r,o)}};const IV={kernelName:to,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,weights:s}=t,{size:r,binaryOutput:o}=a;if(1===i.shape.length){const e=n.readSync(i.dataId),t=n.readSync(s.dataId),a=xF(e,t,s.dtype,s.shape,r);return n.makeTensorInfo([r],s.dtype,a)}if(2===i.shape.length){const e=n.bufferSync(i),t=n.bufferSync(s),a=CF(e,t,r,o);return n.makeTensorInfo(a.shape,s.dtype,a.values)}throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank${i.shape.length}.`)}};class NV{constructor(e,t,n){this.variableNames=["x"],this.outputShape=[],this.outputShape=e,this.blockSize=t,this.dataFormat=n,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int h = ${this.getHeightCoordString()};\n int w = ${this.getWidthCoordString()};\n int d = ${this.getDepthCoordString()};\n\n int in_h = h / ${t};\n int offset_h = imod(h, ${t});\n int in_w = w / ${t};\n int offset_w = imod(w, ${t});\n int offset_d = (offset_h * ${t} + offset_w) *\n ${this.getOutputDepthSize()};\n int in_d = d + offset_d;\n\n float result = ${this.getInputSamplingString()};\n setOutput(result);\n }\n `}getHeightCoordString(){return"NHWC"===this.dataFormat?"coords[1]":"coords[2]"}getWidthCoordString(){return"NHWC"===this.dataFormat?"coords[2]":"coords[3]"}getDepthCoordString(){return"NHWC"===this.dataFormat?"coords[3]":"coords[1]"}getOutputDepthSize(){return"NHWC"===this.dataFormat?this.outputShape[3]:this.outputShape[1]}getInputSamplingString(){return"NHWC"===this.dataFormat?"getX(b, in_h, in_w, in_d)":"getX(b, in_d, in_h, in_w)"}}const RV={kernelName:no,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockSize:s,dataFormat:r}=a,o=i.shape[0],l=("NHWC"===r?i.shape[1]:i.shape[2])*s,u=("NHWC"===r?i.shape[2]:i.shape[3])*s,c=("NHWC"===r?i.shape[3]:i.shape[1])/(s*s),h=new NV("NHWC"===r?[o,l,u,c]:[o,c,l,u],s,r);return n.runWebGLProgram(h,[i],i.dtype)}};class DV{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=aF(this.outputShape.length);const s=e.filterHeight,r=e.filterWidth,o=e.outChannels/e.inChannels;let l="",u="";n&&(l=a?`float activation(float a) {\n float b = getPreluActivationWeightsAtOutCoords();\n ${n}\n }`:i?`float activation(float a) {\n float b = getLeakyreluAlphaAtOutCoords();\n ${n}\n }`:`\n float activation(float x) {\n ${n}\n }\n `,u="result = activation(result);");const c=t?"result += getBiasAtOutCoords();":"";t&&this.variableNames.push("bias"),a&&this.variableNames.push("preluActivationWeights"),i&&this.variableNames.push("leakyreluAlpha"),this.userCode=`\n ${l}\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n ivec2 xRCCorner = coords.yz * strides - pads;\n int d2 = coords.w;\n int d1 = d2 / ${o};\n int q = d2 - d1 * ${o};\n\n int xRCorner = xRCCorner.x;\n int xCCorner = xRCCorner.y;\n\n // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n for (int wR = 0; wR < ${s}; wR++) {\n int xR = xRCorner + wR * dilations[0];\n\n if (xR < 0 || xR >= inDims[0]) {\n continue;\n }\n\n for (int wC = 0; wC < ${r}; wC++) {\n int xC = xCCorner + wC * dilations[1];\n\n if (xC < 0 || xC >= inDims[1]) {\n continue;\n }\n\n float xVal = getX(batch, xR, xC, d1);\n float wVal = getW(wR, wC, d1, q);\n dotProd += xVal * wVal;\n }\n }\n\n float result = dotProd;\n ${c}\n ${u}\n setOutput(result);\n }\n `}}class zV{constructor(e,t=!1,n=null,a=!1,i=!1){this.variableNames=["x","W"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"pads",type:"ivec2"},{name:"strides",type:"ivec2"},{name:"dilations",type:"ivec2"},{name:"inDims",type:"ivec2"}],this.outputShape=e.outShape,this.enableShapeUniforms=aF(this.outputShape.length);const s=e.outChannels/e.inChannels,r=e.padInfo.left,o=e.strideWidth,l=e.dilationWidth,u=e.filterHeight,c=e.filterWidth,h=c;let d="\n int xR; int xC; int xCOffset;\n vec4 wTexel; vec4 previous; vec4 final;";for(let e=0;e=0 && xR < inDims[0]) {\n ";for(let e=0;e<(h+1)/2;e++){const t=2*e;if(d+=`\n xC = xCCorner + ${t*l};\n `,1===o){if(t= 0 && xCOffset < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n `,d+=1===l&&t>0?`\n xC${t} = vec4(xTexelC${t-2}.zw, xTexelC${t}.xy);\n `:`\n xCOffset = xC + 1 - 2;\n\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n previous.zw = vec2(0.0);\n }\n\n xC${t} = vec4(previous.zw, xTexelC${t}.xy);\n } else {\n xC${t} = vec4(0.0, 0.0, xTexelC${t}.xy);\n }\n `):d+=`\n if (xC >= 0 && xC < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n\n xC${t} = xTexelC${t};\n `,t+1= 0 && xCOffset < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xCOffset, d1);\n\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.0);\n }\n xTexelC${t+1}Ready = 1;\n }\n `,d+=l>1?`\n xCOffset -= 2;\n if (xCOffset >= 0 && xCOffset < inDims[1]) {\n previous = getX(batch, xR, xCOffset, d1);\n xC${t+1} = vec4(previous.zw, xTexelC${t+1}.xy);\n } else {\n xC${t+1} = vec4(0.0, 0.0, xTexelC${t+1}.xy);\n }\n `:`\n xC${t+1} = vec4(xTexelC${t}.zw, xTexelC${t+1}.xy);\n `):d+=1===e?`\n xC${t+1} = xTexelC${t};\n `:`\n xCOffset = xC + ${e};\n\n if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.0);\n }\n xTexelC${t+1}Ready = 1;\n }\n\n xC${t+1} = xTexelC${t+1};\n `}}else t= 0 && xCOffset < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xCOffset, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n\n if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xC + 1, d1);\n // Need to manually clear unused channels in case\n // we're reading from recycled texture.\n if (xC + 2 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.0);\n }\n xTexelC${t+1}Ready = 1;\n }\n\n xC${t} = vec4(xTexelC${t}.zw, xTexelC${t+1}.zw);\n `,t+1= 0 && xCOffset < inDims[1]) {\n final = getX(batch, xR, xCOffset, d1);\n }\n xC${t+1} = vec4(xTexelC${t+1}.xy, final.xy);\n `)):(d+=`\n if(xC >= 0 && xC < inDims[1] && xTexelC${t}Ready == 0) {\n xTexelC${t} = getX(batch, xR, xC, d1);\n if (xC + 1 >= inDims[1]) {\n xTexelC${t}.zw = vec2(0.0);\n }\n xTexelC${t}Ready = 1;\n }\n\n xCOffset = xC + strides[1];\n if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${t+1}Ready == 0) {\n xTexelC${t+1} = getX(batch, xR, xCOffset, d1);\n if (xCOffset + 1 >= inDims[1]) {\n xTexelC${t+1}.zw = vec2(0.);\n }\n xTexelC${t+1}Ready = 1;\n }\n\n xC${t} = vec4(\n xTexelC${t}.xy, xTexelC${t+1}.xy);\n `,t+1`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${r} and dilations '${c}'`));const h=om(i.shape,s.shape,r,c,o,u,!0);let d;d=cr().getBool("WEBGL_PACK_DEPTHWISECONV")&&h.strideWidth<=2&&h.outChannels/h.inChannels==1?new zV(h):new DV(h);const p=[[h.padInfo.top,h.padInfo.left],[h.strideHeight,h.strideWidth],[h.dilationHeight,h.dilationWidth],[h.inHeight,h.inWidth]];return n.runWebGLProgram(d,[i,s],"float32",p)}};class MV{constructor(e){this.variableNames=["x","dy"],this.outputShape=e.filterShape;const t=e.strideHeight,n=e.strideWidth,a=e.padInfo.top,i=e.padInfo.left,s=e.outChannels/e.inChannels;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int wR = coords.x;\n int wC = coords.y;\n int d1 = coords.z;\n int dm = coords.w;\n int d2 = d1 * ${s} + dm;\n\n float dotProd = 0.0;\n\n // TO DO: Vec4 over the batch size\n for (int b = 0; b < ${e.batchSize}; b++) {\n for (int yR = 0; yR < ${e.outHeight}; yR++) {\n int xR = wR + yR * ${t} - ${a};\n\n if (xR < 0 || xR >= ${e.inHeight}) {\n continue;\n }\n\n for (int yC = 0; yC < ${e.outWidth}; yC++) {\n int xC = wC + yC * ${n} - ${i};\n\n if (xC < 0 || xC >= ${e.inWidth}) {\n continue;\n }\n\n float dyValue = getDy(b, yR, yC, d2);\n float xValue = getX(b, xR, xC, d1);\n dotProd += (xValue * dyValue);\n }\n }\n }\n setOutput(dotProd);\n }\n `}}class BV{constructor(e){this.variableNames=["dy","W"],this.outputShape=e.inShape;const t=e.filterHeight,n=e.filterWidth,a=e.strideHeight,i=e.strideWidth,s=t-1-e.padInfo.top,r=n-1-e.padInfo.left,o=e.outChannels/e.inChannels;this.userCode=`\n const ivec2 pads = ivec2(${s}, ${r});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords[0];\n int d1 = coords[3];\n ivec2 dyCorner = coords.yz - pads;\n int dyRCorner = dyCorner.x;\n int dyCCorner = dyCorner.y;\n\n float dotProd = 0.0;\n\n for (int wR = 0; wR < ${t}; wR++) {\n float dyR = float(dyRCorner + wR) / ${a}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n int wRPerm = ${t} - 1 - wR;\n\n for (int wC = 0; wC < ${n}; wC++) {\n float dyC = float(dyCCorner + wC) / ${i}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n int wCPerm = ${n} - 1 - wC;\n\n // TO DO: Vec4 over the channelMul\n for (int dm = 0; dm < ${o}; dm++) {\n int d2 = d1 * ${o} + dm;\n float xValue = getDy(batch, idyR, idyC, d2);\n float wValue = getW(wRPerm, wCPerm, d1, dm);\n dotProd += xValue * wValue;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const FV={kernelName:io,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,dy:s}=t,{strides:r,dilations:o,pad:l,dimRoundingMode:u,filterShape:c}=a,h=om(i.shape,c,r,o,l,u,!0),d=new MV(h);return n.runWebGLProgram(d,[i,s],"float32")}};const LV={kernelName:so,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,filter:s}=t,{strides:r,dilations:o,pad:l,dimRoundingMode:u,inputShape:c}=a,h=om(c,s.shape,r,o,l,u,!0),d=new BV(h);return n.runWebGLProgram(d,[i,s],"float32")}};class PV{constructor(e){this.variableNames=["X"],this.outputShape=[e,e],this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n setOutput(val);\n }\n "}}const jV={kernelName:ro,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t,i=[...a.shape,...a.shape],s=zs(a.shape),r=fP({inputs:{x:a},backend:n,attrs:{shape:[s]}}),o=new PV(s),l=n.runWebGLProgram(o,[r],r.dtype),u=fP({inputs:{x:l},backend:n,attrs:{shape:i}});return n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(l),u}};class VV{constructor(e){this.variableNames=["x","W"],this.outputShape=e.outShape;const{inHeight:t,inWidth:n,padInfo:a,strideHeight:i,strideWidth:s,filterHeight:r,filterWidth:o,dilationHeight:l,dilationWidth:u}=e,{top:c,left:h}=a;this.userCode=`\n const ivec2 strides = ivec2(${i}, ${s});\n const ivec2 pads = ivec2(${c}, ${h});\n const float neg_infinity = -3.4e38;\n\n void main() {\n ivec4 coords = getOutputCoords();\n int batch = coords.x;\n int d1 = coords.w;\n ivec2 outTopLeftCorner =\n coords.yz * strides - pads;\n int hBeg = outTopLeftCorner.x;\n int wBeg = outTopLeftCorner.y;\n\n float curVal = neg_infinity;\n for (int h = 0; h < ${r}; h++) {\n int hIn = hBeg + h * ${l};\n\n if (hIn >= 0 && hIn < ${t}) {\n for (int w = 0; w < ${o}; w++) {\n int wIn = wBeg + w * ${u};\n\n if (wIn >= 0 && wIn < ${n}) {\n float xVal = getX(batch, hIn, wIn, d1);\n float wVal = getW(h, w, d1);\n\n float val = xVal + wVal;\n if (val > curVal) {\n curVal = val;\n }\n }\n }\n }\n }\n\n float result = curVal;\n setOutput(result);\n }\n `}}const UV={kernelName:oo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s}=t,{strides:r,pad:o,dilations:l}=a,u=im(i.shape,s.shape,r,o,"NHWC",l);let c;const h=new VV(u);c=n.runWebGLProgram(h,[i,s],"float32");const d=fP({inputs:{x:c},backend:n,attrs:{shape:u.outShape}});return n.disposeIntermediateTensorInfo(c),d}};const WV={kernelName:po,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{equation:i}=a,s=t,{allDims:r,summedDims:o,idDims:l}=Hv(i,s.length);$v(r.length,l,s);const{path:u,steps:c}=Zv(o,l),h=c.length;let d=null,p=r.length;const m=[];for(let e=0;e=0&&(d=xP({inputs:{x:d},backend:n,attrs:{axis:u[e]-(r.length-p),keepDims:!1}}),m.push(d)),p--)}for(const e of m)e!==d&&n.disposeIntermediateTensorInfo(e);return d}},GV=rP({opSnippet:"return (x >= 0.0) ? x : (exp(x) - 1.0);",packedOpSnippet:"\n vec4 result;\n\n result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n return result;\n"}),qV={kernelName:mo,backendName:"webgl",kernelFunc:GV},HV={kernelName:fo,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n}=e,{dy:a,y:i}=t,s=cr().getBool("WEBGL_PACK_BINARY_OPERATIONS")?new $L("\n vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n",a.shape,i.shape):new HL("return (b >= 0.0) ? a : a * (b + 1.0);",a.shape,i.shape);return n.runWebGLProgram(s,[a,i],a.dtype)}},KV=oP({opSnippet:"return float(a == b);",packedOpSnippet:"\n return vec4(equal(a, b));\n",dtype:"bool",cpuKernelImpl:IF}),$V={kernelName:yo,backendName:"webgl",kernelFunc:KV},ZV=rP({opSnippet:`\n // Error function is calculated approximately with elementary function.\n // See "Handbook of Mathematical Functions with Formulas,\n // Graphs, and Mathematical Tables", Abramowitz and Stegun.\n float p = ${Tv};\n float a1 = ${Iv};\n float a2 = ${Nv};\n float a3 = ${Rv};\n float a4 = ${Dv};\n float a5 = ${zv};\n\n float sign = sign(x);\n x = abs(x);\n float t = 1.0 / (1.0 + p * x);\n return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`}),XV={kernelName:go,backendName:"webgl",kernelFunc:ZV},YV=rP({opSnippet:sP+"\n return exp(x);\n",packedOpSnippet:"\n vec4 result = exp(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",cpuKernelImpl:NF,dtype:"float32"}),QV={kernelName:bo,backendName:"webgl",kernelFunc:YV};function JV(e){const{inputs:t,attrs:n,backend:a}=e,{dim:i}=n,{input:s}=t,r=s.shape.length,o=s.shape.slice();let l=i;return i<0&&(Ns(-(r+1)<=i,(()=>`Axis must be in the interval [${-(r+1)}, ${r}]`)),l=r+i+1),o.splice(l,0,1),fP({inputs:{x:s},backend:a,attrs:{shape:o}})}const eU={kernelName:vo,backendName:"webgl",kernelFunc:JV},tU="return exp(x) - 1.0;",nU=rP({opSnippet:tU,packedOpSnippet:tU,cpuKernelImpl:RF}),aU={kernelName:ko,backendName:"webgl",kernelFunc:nU};class iU{constructor(e,t,n){this.variableNames=["real","imag"];const a=t[1];this.outputShape=t;const i=n?`2.0 * ${Math.PI}`:`-2.0 * ${Math.PI}`,s=n?`${a}.0`:"1.0";let r;if("real"===e)r="return real * expR - imag * expI;";else{if("imag"!==e)throw new Error(`FFT component must be either "real" or "imag", got ${e}.`);r="return real * expI + imag * expR;"}this.userCode=`\n const float exponentMultiplier = ${i};\n\n float unaryOpComplex(float real, float expR, float imag, float expI) {\n ${r}\n }\n\n float mulMatDFT(int batch, int index) {\n float indexRatio = float(index) / float(${a});\n float exponentMultiplierTimesIndexRatio =\n exponentMultiplier * indexRatio;\n\n float result = 0.0;\n\n for (int i = 0; i < ${a}; i++) {\n // x = (-2|2 * PI / N) * index * i;\n float x = exponentMultiplierTimesIndexRatio * float(i);\n float expR = cos(x);\n float expI = sin(x);\n float real = getReal(batch, i);\n float imag = getImag(batch, i);\n\n result +=\n unaryOpComplex(real, expR, imag, expI) / ${s};\n }\n\n return result;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n setOutput(mulMatDFT(coords[0], coords[1]));\n }\n `}}function sU(e,t,n){const a=n.texData.get(e.dataId),i=zs(e.shape),s=e.shape[e.shape.length-1],r=fP({inputs:{x:e},backend:n,attrs:{shape:[i/s,s]}}),o=r.shape,l=new iU("real",o,t),u=new iU("imag",o,t),c=[{dataId:a.complexTensorInfos.real.dataId,dtype:a.complexTensorInfos.real.dtype,shape:o},{dataId:a.complexTensorInfos.imag.dataId,dtype:a.complexTensorInfos.imag.dtype,shape:o}],h=n.runWebGLProgram(l,c,"float32"),d=n.runWebGLProgram(u,c,"float32"),p=YL({inputs:{real:h,imag:d},backend:n});n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d);const m=fP({inputs:{x:p},backend:n,attrs:{shape:e.shape}});return n.disposeIntermediateTensorInfo(r),n.disposeIntermediateTensorInfo(p),m}const rU={kernelName:wo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{input:a}=t;return sU(a,!1,n)}};class oU{constructor(e,t){this.outputShape=[],this.customUniforms=[{name:"value",type:"float"}],this.variableNames=["x"],this.outputShape=e,this.userCode="\n void main() {\n // Input can be obtained from uniform value.\n setOutput(value);\n }\n "}}function lU(e){const{backend:t,attrs:n}=e,{shape:a,value:i}=n;let{dtype:s}=n;if(s=s||$s(i),"string"===s){const e=Ws(s,zs(a));return e.fill(i),t.makeTensorInfo(a,s,e)}{const e=new oU(a,i),n=[[i]];return t.runWebGLProgram(e,[],s,n)}}const uU={kernelName:Ao,backendName:"webgl",kernelFunc:lU};class cU{constructor(e){this.variableNames=["Image"],this.outputShape=[];const t=e[2];this.outputShape=e,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n\n int coordX = ${t} - x - 1;\n float outputValue;\n if(coordX >= 0 && coordX < ${t}) {\n outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n } else {\n outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n }\n setOutput(outputValue);\n }\n `}}const hU={kernelName:xo,backendName:"webgl",kernelFunc:({inputs:e,backend:t})=>{const{image:n}=e,a=t,i=new cU(n.shape);return a.runWebGLProgram(i,[n],n.dtype)}},dU="return floor(x);",pU=rP({opSnippet:dU,packedOpSnippet:dU,cpuKernelImpl:DF}),mU={kernelName:Co,backendName:"webgl",kernelFunc:pU},fU=oP({opSnippet:"\n float s = sign(a) * sign(b);\n int ia = round(a);\n int ib = round(b);\n if (ib != 0) {\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n return float(idiv(ia, ib, s));\n } else {\n return NAN;\n }\n",packedOpSnippet:"\n ivec4 ia = round(a);\n ivec4 ib = round(b);\n bvec4 cond = notEqual(ib, ivec4(0));\n ivec4 result = ivec4(0);\n vec4 s = sign(a) * sign(b);\n\n // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n if (cond[0]) {\n result[0] = idiv(ia[0], ib[0], s[0]);\n }\n if (cond[1]) {\n result[1] = idiv(ia[1], ib[1], s[1]);\n }\n if (cond[2]) {\n result[2] = idiv(ia[2], ib[2], s[2]);\n }\n if (cond[3]) {\n result[3] = idiv(ia[3], ib[3], s[3]);\n }\n return vec4(result);\n",dtype:"int32"}),gU={kernelName:So,backendName:"webgl",kernelFunc:fU};class yU{constructor(e){this.variableNames=["A"];const t=zB(),[n,a]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${a}.0, ${n}.0);\n\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n setOutput(floor(value * 255.0 + 0.5));\n }\n `}}class bU{constructor(e){this.variableNames=["A"],this.packedInputs=!1,this.packedOutput=!0;const t=zB(),[n,a]=e;this.outputShape=e,this.userCode=`\n void main() {\n ivec3 coords = getOutputCoords();\n int texR = coords[0];\n int texC = coords[1];\n int depth = coords[2];\n\n vec4 result = vec4(0.);\n\n for(int row=0; row<=1; row++) {\n for(int col=0; col<=1; col++) {\n texC = coords[1] + row;\n depth = coords[2] + col;\n\n vec2 uv = (vec2(texC, texR) + halfCR) /\n vec2(${a}.0, ${n}.0);\n vec4 values = ${t.texture2D}(A, uv);\n float value;\n if (depth == 0) {\n value = values.r;\n } else if (depth == 1) {\n value = values.g;\n } else if (depth == 2) {\n value = values.b;\n } else if (depth == 3) {\n value = values.a;\n }\n\n result[row * 2 + col] = floor(value * 255.0 + 0.5);\n }\n }\n\n ${t.output} = result;\n }\n `}}const vU={kernelName:Au,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e;let{pixels:i}=t;const{numChannels:s}=a,r="undefined"!=typeof HTMLVideoElement&&i instanceof HTMLVideoElement,o="undefined"!=typeof HTMLImageElement&&i instanceof HTMLImageElement,[l,u]=r?[i.videoWidth,i.videoHeight]:[i.width,i.height],c=[u,l],h=[u,l,s];if(o||r){const e=cr().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");null!=kU&&e===wU||(wU=e,kU=document.createElement("canvas").getContext("2d",{willReadFrequently:wU})),kU.canvas.width=l,kU.canvas.height=u,kU.drawImage(i,0,0,l,u),i=kU.canvas}const d=n.makeTensorInfo(c,"int32");n.texData.get(d.dataId).usage=JM.PIXELS,n.gpgpu.uploadPixelDataToTexture(n.getTexture(d.dataId),i);const p=cr().getBool("WEBGL_PACK")?new bU(h):new yU(h),m=n.runWebGLProgram(p,[d],"int32");return n.disposeData(d.dataId),m}};let kU,wU=cr().getBool("CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU");const AU={kernelName:Su,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dataFormat:c,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:m}=a,f=ym(c),g=om(i.shape,s.shape,l,h,u,d,!1,f);let y;const b=[],v=null!=r,k=null!=o,w="leakyrelu"===p,A=()=>{const e=[i,s],t=(e,t)=>{if("NCHW"===t&&1===e.shape.length&&1!==e.shape[0]){const t=fP({inputs:{x:e},backend:n,attrs:{shape:[e.shape[0],1,1]}});return b.push(t),t}return e};if(v&&e.push(t(r,c)),k&&e.push(t(o,c)),w){const t=n.makeTensorInfo([],"float32",Qu(m,"float32"));e.push(t),b.push(t)}return e};if(1!==g.filterHeight||1!==g.filterWidth||1!==g.dilationHeight||1!==g.dilationWidth||1!==g.strideHeight||1!==g.strideWidth||"SAME"!==g.padInfo.type&&"VALID"!==g.padInfo.type)if(g.strideWidth<=2&&"channelsLast"===f&&cr().getBool("WEBGL_EXP_CONV")){const e=p?lP(p,!0):null,t=new Jj(g,v,e,k,w),a=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],i=A();y=n.runWebGLProgram(t,i,"float32",a)}else if(cr().getBool("WEBGL_CONV_IM2COL"))y=aV({x:i,filter:s,convInfo:g,backend:n,bias:r,activation:p,preluActivationWeights:o,leakyreluAlpha:m});else{const e=p?lP(p,!1):null,t=new Yj(g,v,e,k,w),a=A();y=n.runWebGLProgram(t,a,"float32")}else y=nV({x:i,filter:s,convInfo:g,backend:n,bias:r,activation:p,preluActivationWeights:o,leakyreluAlpha:m});const x=fP({inputs:{x:y},backend:n,attrs:{shape:g.outShape}});return b.push(y),b.forEach((e=>n.disposeIntermediateTensorInfo(e))),x}};const xU={kernelName:Eu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,filter:s,bias:r,preluActivationWeights:o}=t,{strides:l,pad:u,dilations:c,dimRoundingMode:h,activation:d,leakyreluAlpha:p}=a,m=[];let f=c;null==f&&(f=[1,1]),Ns(fm(l,f),(()=>`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${l} and dilations '${f}'`));const g=om(i.shape,s.shape,l,f,u,h,!0),y=cr().getBool("WEBGL_PACK_DEPTHWISECONV")&&g.strideWidth<=2&&g.outChannels/g.inChannels==1,b=d?lP(d,y):null,v=[i,s],k=null!=r,w=null!=o,A="leakyrelu"===d;if(k&&v.push(r),w&&v.push(o),A){const e=n.makeTensorInfo([],"float32",Qu(p,"float32"));v.push(e),m.push(e)}let x;x=y?new zV(g,k,b,w,A):new DV(g,k,b,w,A);const C=[[g.padInfo.top,g.padInfo.left],[g.strideHeight,g.strideWidth],[g.dilationHeight,g.dilationWidth],[g.inHeight,g.inWidth]],S=n.runWebGLProgram(x,v,"float32",C);return m.forEach((e=>n.disposeIntermediateTensorInfo(e))),S}};class CU{constructor(e,t,n,a){this.sliceDim=e,this.strides=t,this.paramsShape=a,this.variableNames=["x","indices"],this.outputShape=n;const i=XB(n.length);let s="\n int index;";for(let e=0;e= ${this.paramsShape[e]};\n flattenIndex += index * ${this.strides[e]};`;this.userCode=`\n void main() {\n ${i} coords = getOutputCoords();\n int flattenIndex = 0;\n bool out_of_bounds = false;\n\n ${s}\n\n setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1]));\n }\n `}}const SU={kernelName:To,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{params:a,indices:i}=t,s=i.shape,r=s[s.length-1],o=zs(a.shape),[l,u,c,h]=Sv(a,i),d=fP({inputs:{x:i},backend:n,attrs:{shape:[u,r]}}),p=fP({inputs:{x:a},backend:n,attrs:{shape:[zs(a.shape)/c,c]}});if(n.shouldExecuteOnCPU([a,i])||"string"===a.dtype){const e=n.readSync(i.dataId),t=n.bufferSync(a),s=zF(e,t,a.dtype,u,r,c,h,a.shape,o);return n.makeTensorInfo(l,a.dtype,s.values)}const m=new CU(r,h,[u,c],a.shape),f=n.runWebGLProgram(m,[p,d],p.dtype),g=fP({inputs:{x:f},backend:n,attrs:{shape:l}});return n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),g}};class EU{constructor(e,t){this.variableNames=["A","indices"],this.outputShape=t,this.rank=t.length;const n=XB(this.rank),a=function(e,t){const n=["resRC.x","resRC.y","resRC.z","resRC.w"],a=[];for(let t=0;t= 0) && (index < ${e[2]}) ? 1.0 : 0.0;\n setOutput(inBounds * getA(${a}));\n }\n `}}function _U(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,indices:s}=t,{axis:r,batchDims:o}=a,l=js(r,i.shape)[0];if(cr().get("DEBUG")){const e=n.readSync(s.dataId),t=i.shape[l];for(let n=0;n=0,(()=>`GatherV2: the index value ${a} is not in [0, ${t-1}]`))}}const u=pk(i,s,l,o),c=zs(s.shape),h=[],d=fP({inputs:{x:i},backend:n,attrs:{shape:[u.batchSize,u.outerSize,u.dimSize,u.sliceSize]}}),p=fP({inputs:{x:s},backend:n,attrs:{shape:[u.batchSize,c/u.batchSize]}});h.push(d),h.push(p);const m=[u.batchSize,u.outerSize,c/u.batchSize,u.sliceSize];if(n.shouldExecuteOnCPU([i,s])||"string"===i.dtype){const e=n.bufferSync(p),t=n.bufferSync(d),a=OF(t,e,m);return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),n.makeTensorInfo(u.outputShape,a.dtype,a.values)}const f=new EU(d.shape,m),g=n.runWebGLProgram(f,[d,p],d.dtype);h.push(g);const y=fP({inputs:{x:g},backend:n,attrs:{shape:u.outputShape}});return h.forEach((e=>n.disposeIntermediateTensorInfo(e))),y}const TU={kernelName:_o,backendName:"webgl",kernelFunc:_U},IU=oP({opSnippet:"return float(a > b);",packedOpSnippet:"\n return vec4(greaterThan(a, b));\n",cpuKernelImpl:MF,dtype:"bool"}),NU={kernelName:Io,backendName:"webgl",kernelFunc:IU},RU=oP({opSnippet:"return float(a >= b);",packedOpSnippet:"\n return vec4(greaterThanEqual(a, b));\n",dtype:"bool",cpuKernelImpl:BF}),DU={kernelName:No,backendName:"webgl",kernelFunc:RU};const zU={kernelName:Do,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{input:a}=t;return sU(a,!0,n)}},OU=rP({opSnippet:"return float(!isnan(x) && !isinf(x));",dtype:"bool"}),MU={kernelName:Oo,backendName:"webgl",kernelFunc:OU},BU=rP({opSnippet:"return float(isinf(x));",dtype:"bool"}),FU={kernelName:Mo,backendName:"webgl",kernelFunc:BU},LU=rP({opSnippet:"return float(isnan(x));",dtype:"bool"}),PU={kernelName:Bo,backendName:"webgl",kernelFunc:LU},jU=oP({opSnippet:"return float(a < b);",packedOpSnippet:"\n return vec4(lessThan(a, b));\n",cpuKernelImpl:FF,dtype:"bool"}),VU={kernelName:Lo,backendName:"webgl",kernelFunc:jU},UU=oP({opSnippet:"return float(a <= b);",packedOpSnippet:"\n return vec4(lessThanEqual(a, b));\n",cpuKernelImpl:LF,dtype:"bool"}),WU={kernelName:Po,backendName:"webgl",kernelFunc:UU};const GU={kernelName:jo,backendName:"webgl",kernelFunc:function(e){const{backend:t,attrs:n}=e,{start:a,stop:i,num:s}=n,r=PF(a,i,s);return t.makeTensorInfo([r.length],"float32",r)}},qU=rP({opSnippet:sP+"\n return x < 0.0 ? 0./0. : log(x);\n",packedOpSnippet:"\n vec4 result = log(x);\n bvec4 isNaN = isnan(x);\n result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r);\n result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g);\n result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b);\n result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a);\n return result;\n",cpuKernelImpl:jF}),HU={kernelName:Vo,backendName:"webgl",kernelFunc:qU},KU=rP({opSnippet:sP+"\n return log(1.0 + x);\n"}),$U={kernelName:Uo,backendName:"webgl",kernelFunc:KU},ZU=oP({opSnippet:"return float(a >= 1.0 && b >= 1.0);",packedOpSnippet:"\n return vec4(\n vec4(greaterThanEqual(a, vec4(1.0))) *\n vec4(greaterThanEqual(b, vec4(1.0))));\n",dtype:"bool"}),XU={kernelName:Wo,backendName:"webgl",kernelFunc:ZU},YU=rP({opSnippet:"return float(!(x >= 1.0));"}),QU={kernelName:Go,backendName:"webgl",kernelFunc:YU},JU=oP({opSnippet:"return float(a >= 1.0 || b >= 1.0);",packedOpSnippet:"\n return min(\n vec4(greaterThanEqual(a, vec4(1.0))) +\n vec4(greaterThanEqual(b, vec4(1.0))),\n vec4(1.0));\n",dtype:"bool"}),eW={kernelName:qo,backendName:"webgl",kernelFunc:JU};class tW{constructor(e,t,n,a,i){this.variableNames=["x"],this.outputShape=[];const s=t,r=e[3]-1;let o;this.outputShape=e;const l=`float(${n}) + float(${a}) * sum`;o=.5===i?`inversesqrt(${l})`:1===i?`1.0/(${l})`:`exp(log(${l}) * float(-${i}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n int d = coords[3];\n float x = getX(b, r, c, d);\n float sum = 0.0;\n for (int j = -${s}; j <= ${s}; j++) {\n int idx = d + j;\n if (idx >= 0 && idx <= ${r}) {\n float z = getX(b, r, c, idx);\n sum += z * z;\n }\n }\n float val = x * ${o};\n setOutput(val);\n }\n `}}class nW{constructor(e,t,n,a,i){this.variableNames=["x"],this.outputShape=[],this.packedInputs=!0,this.packedOutput=!0;const s=t,r=e[3]-1;let o;this.outputShape=e;const l=`float(${n}) + float(${a}) * sum`;o=.5===i?`inversesqrt(${l})`:1===i?`1.0/(${l})`:`exp(log(${l}) * float(-${i}));`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords.x;\n int r = coords.y;\n int c = coords.z;\n int d = coords.w;\n\n bool hasNextCol = d < ${this.outputShape[3]};\n bool hasNextRow = c < ${this.outputShape[2]};\n\n vec4 sum = vec4(0.);\n vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n vec4 xAtOutputCoords = vec4(\n getChannel(xFragAtOutputCoords, vec2(c, d)),\n hasNextCol ?\n getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n hasNextRow ?\n getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n (hasNextRow && hasNextCol) ?\n getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n );\n\n int firstChannel = d - ${s};\n vec2 cache = vec2(0.);\n if(firstChannel >= 0){\n vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n if(hasNextRow){\n cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n }\n }\n\n ivec2 depth = ivec2(d, d + 1);\n for (int j = - ${s}; j <= ${s}; j++) {\n ivec2 idx = depth + j;\n bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${r}));\n\n bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n if(depthInRange || depthPlusOneInRange){\n vec4 z = vec4(0.);\n vec4 xFragAtCurrentDepth;\n z.xz = cache.xy;\n if(depthPlusOneInRange && hasNextCol){\n xFragAtCurrentDepth = idx.y != d ?\n getX(b, r, c, idx.y) : xFragAtOutputCoords;\n z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n if(hasNextRow){\n z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n }\n }\n cache.xy = z.yw;\n sum += z * z;\n }\n }\n vec4 result = xAtOutputCoords * ${o};\n setOutput(result);\n }\n `}}const aW={kernelName:Ho,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{depthRadius:s,bias:r,alpha:o,beta:l}=a,u=cr().getBool("WEBGL_PACK_NORMALIZATION")?new nW(i.shape,s,r,o,l):new tW(i.shape,s,r,o,l);return n.runWebGLProgram(u,[i],i.dtype)}};class iW{constructor(e,t,n,a,i){this.variableNames=["inputImage","outputImage","dy"],this.outputShape=[],this.outputShape=e,this.depth=e[3],this.depthRadius=t,this.bias=n,this.alpha=a,this.beta=i,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int r = coords[1];\n int c = coords[2];\n\n float result = 0.0;\n for (int d = 0; d < ${this.depth}; ++d) {\n int depthBegin = int(max(0.0, float(d - ${t})));\n int depthEnd = int(min(float(${this.depth}),\n float(d + ${t} + 1)));\n\n const int MIN_DEPTH_BEGIN = 0;\n const int MAX_DEPTH_END = ${this.depth};\n\n float norm = 0.0;\n for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd) {\n norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n }\n else {\n break;\n }\n }\n\n norm = float(${a}) * norm + float(${n});\n\n for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n if (k < depthBegin){\n continue;\n }\n else if (k >= depthBegin && k < depthEnd){\n float dyi = -2.0 * float(${a})\n * float(${i})\n * getInputImage(b, r, c, k) * getOutputImage(b, r, c, d)\n / norm;\n if (k == d) {\n dyi += pow(norm, -1.0 * ${i});\n }\n if (k == coords[3]) {\n dyi *= getDy(b, r, c, d);\n result += dyi;\n }\n }\n else {\n break;\n }\n }\n }\n setOutput(result);\n }\n `}}const sW={kernelName:Ko,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i,y:s,dy:r}=t,{depthRadius:o,bias:l,alpha:u,beta:c}=a,h=new iW(i.shape,o,l,u,c);return n.runWebGLProgram(h,[i,s,r],i.dtype)}};function rW(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{reductionIndices:s,keepDims:r}=a,o=i.shape.length,l=js(s,i.shape);let u=l;const c=vf(u,o),h=null!=c,d=n.shouldExecuteOnCPU([i]);let p=i;if(h){if(d){const e=n.texData.get(p.dataId).values,t=new Array(o);for(let e=0;e`Error in maxPool: Either strides or dilations must be 1. Got strides ${r} and dilations '1'`));const u=sm(i.shape,s,r,1,o,l);if(1===u.filterWidth&&1===u.filterHeight&&Os(u.inShape,u.outShape))return ZL({inputs:{x:i},backend:n});const c=new oj(u,"max",!1);return n.runWebGLProgram(c,[i],i.dtype)}};const hW={kernelName:Qo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{filterSize:s,strides:r,pad:o,dataFormat:l,dimRoundingMode:u}=a,c=rm(i.shape,s,r,[1,1,1],o,u,l),h=new lj(c,"max",!1);return n.runWebGLProgram(h,[i],i.dtype)}};class dW{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideHeight,n=e.strideWidth,a=e.dilationHeight,i=e.effectiveFilterHeight,s=e.effectiveFilterWidth,r=i-1-e.padInfo.top,o=s-1-e.padInfo.left,l=i*s-1;this.userCode=`\n const ivec2 pads = ivec2(${r}, ${o});\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n\n ivec2 dyRCCorner = coords.yz - pads;\n int dyRCorner = dyRCCorner.x;\n int dyCCorner = dyRCCorner.y;\n\n // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n for (int wR = 0; wR < ${i};\n wR += ${a}) {\n float dyR = float(dyRCorner + wR) / ${t}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 || fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${s}; wC++) {\n float dyC = float(dyCCorner + wC) / ${n}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(b, idyR, idyC, d);\n int maxPosValue = ${l} - int(getMaxPos(b, idyR, idyC, d));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue = wR * ${s} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n setOutput(dotProd);\n }\n `}}class pW{constructor(e){this.variableNames=["dy","maxPos"],this.outputShape=e.inShape;const t=e.strideDepth,n=e.strideHeight,a=e.strideWidth,i=e.dilationDepth,s=e.dilationHeight,r=e.dilationWidth,o=e.effectiveFilterDepth,l=e.effectiveFilterHeight,u=e.effectiveFilterWidth,c=o-1-e.padInfo.front,h=l-1-e.padInfo.top,d=u-1-e.padInfo.left,p=o*l*u-1;this.userCode=`\n const ivec3 pads = ivec3(${c}, ${h}, ${d});\n\n void main() {\n ivec5 coords = getOutputCoords();\n int batch = coords.x;\n int ch = coords.u;\n\n ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n int dyDCorner = dyCorner.x;\n int dyRCorner = dyCorner.y;\n int dyCCorner = dyCorner.z;\n\n // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n // dx(xD, xR, xC, ch).\n // ? = to be determined. : = across all values in that axis.\n float dotProd = 0.0;\n\n for (int wD = 0; wD < ${o};\n wD += ${i}) {\n float dyD = float(dyDCorner + wD) / ${t}.0;\n\n if (dyD < 0.0 || dyD >= ${e.outDepth}.0 || fract(dyD) > 0.0) {\n continue;\n }\n int idyD = int(dyD);\n\n for (int wR = 0; wR < ${l};\n wR += ${s}) {\n float dyR = float(dyRCorner + wR) / ${n}.0;\n\n if (dyR < 0.0 || dyR >= ${e.outHeight}.0 ||\n fract(dyR) > 0.0) {\n continue;\n }\n int idyR = int(dyR);\n\n for (int wC = 0; wC < ${u};\n wC += ${r}) {\n float dyC = float(dyCCorner + wC) / ${a}.0;\n\n if (dyC < 0.0 || dyC >= ${e.outWidth}.0 ||\n fract(dyC) > 0.0) {\n continue;\n }\n int idyC = int(dyC);\n\n float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n int maxPosValue = ${p} -\n int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n // Get the current value, check it against the value from the\n // position matrix.\n int curPosValue =\n wD * ${l} * ${u} +\n wR * ${u} + wC;\n float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n dotProd += dyValue * mask;\n }\n }\n }\n setOutput(dotProd);\n }\n `}}const mW={kernelName:Jo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s}=t,r=s,{filterSize:o,strides:l,pad:u,dimRoundingMode:c}=a,h=rm(r.shape,o,l,[1,1,1],u,c),d=new lj(h,"max",!0),p=n.runWebGLProgram(d,[r],r.dtype),m=new pW(h),f=n.runWebGLProgram(m,[i,p],r.dtype);return n.disposeIntermediateTensorInfo(p),f}};const fW={kernelName:Yo,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{dy:i,input:s,output:r}=t,o=s;RB([s,r],"maxPoolGrad");const{filterSize:l,strides:u,pad:c,dimRoundingMode:h}=a,d=sm(o.shape,l,u,1,c,h),p=new oj(d,"max",!0),m=n.runWebGLProgram(p,[o],o.dtype),f=new dW(d),g=n.runWebGLProgram(f,[i,m],o.dtype);return n.disposeIntermediateTensorInfo(m),g}};const gW={kernelName:el,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:a}=e,{filterSize:i,strides:s,pad:r,includeBatchInIndex:o}=t,l=n;Ns(4===a.shape.length,(()=>`Error in maxPool: input must be rank 4 but got rank ${a.shape.length}.`));const u=[1,1];Ns(fm(s,u),(()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${s} and dilations '${u}'`));const c=sm(a.shape,i,s,u,r),[h,d]=function(e,t,n,a){let i=new oj(n,"max",!1);const s=a.runWebGLProgram(i,[e],"float32");return i=new oj(n,"max",!0,!0,t),[s,a.runWebGLProgram(i,[e],"float32")]}(a,o,c,l);return[h,d]}};const yW={kernelName:tl,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{x:a}=e,{keepDims:i,axis:s}=t,r=n,o=a.shape.length,l=js(s,a.shape);let u=l;const c=vf(u,o),h=null!=c,d=r.shouldExecuteOnCPU([a]),p=[];let m=a;if(h){if(d){const e=r.texData.get(m.dataId).values,t=new Array(o);for(let e=0;et[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,a),l="reflect"===n?0:1;this.userCode=1!==a?`\n ${i} start = ${i}(${s});\n ${i} end = ${i}(${r});\n\n void main() {\n ${i} outC = getOutputCoords();\n for (int i = 0; i < ${a}; i++) {\n if (outC[i] < start[i]) {\n outC[i] = start[i] * 2 - outC[i] - ${l};\n } else if(outC[i] >= end[i]) {\n outC[i] = (end[i] - 1) * 2 - outC[i] + ${l};\n }\n }\n ${i} coords = outC - start;\n setOutput(getX(${o}));\n }\n `:`\n int start = ${s};\n int end = ${r};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start) {\n outC = start * 2 - outC - ${l};\n } else if(outC >= end) {\n outC = (end - 1) * 2 - outC + ${l};\n }\n setOutput(getX(outC - start));\n }\n `}}class AW{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=bL("rc",a),l=bL("source",a),u=`${o[a-1]} < ${this.outputShape[a-1]}`,c=1===a?"source":`vec2(${l.slice(-2).join()})`,h="reflect"===n?0:1;let d="";if(1===a){const e=`\n ${i} source = rc;\n if (source < start) {\n source = start * 2 - source - ${h};\n } else if (source >= end) {\n source = (end - 1) * 2 - source + ${h};\n }\n source -= start;\n `;d=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${c});\n ${o[a-1]} += 1;\n if(${u}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${c});\n }\n `}else{const e=`\n ${i} source = rc;\n ${i} lt = ${i}(lessThan(source, start));\n ${i} gte = ${i}(greaterThanEqual(source, end));\n ${i} orig = 1 - (lt + gte);\n source = orig * source +\n lt * (start * 2 - source - ${h}) +\n gte * ((end - 1) * 2 - source + ${h});\n source -= start;\n `;d=`\n ${i} rc = outputLoc;\n ${e}\n result[0] = getChannel(getX(${l.join()}), ${c});\n ${o[a-1]} += 1;\n if(${u}) {\n ${e}\n result[1] = getChannel(getX(${l.join()}), ${c});\n }\n rc = outputLoc;\n ${o[a-2]} += 1;\n if(${o[a-2]} < ${this.outputShape[a-2]}) {\n ${e}\n result[2] = getChannel(getX(${l.join()}), ${c});\n ${o[a-1]} += 1;\n if(${u}) {\n ${e}\n result[3] = getChannel(getX(${l.join()}), ${c});\n }\n }\n `}this.userCode=`\n const ${i} start = ${i}(${s});\n const ${i} end = ${i}(${r});\n\n void main() {\n ${i} outputLoc = getOutputCoords();\n vec4 result = vec4(0.);\n ${d}\n setOutput(result);\n }\n `}}const xW={kernelName:il,backendName:"webgl",kernelFunc:({inputs:e,backend:t,attrs:n})=>{const{x:a}=e,{paddings:i,mode:s}=n,r=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new AW(a.shape,i,s):new wW(a.shape,i,s);return t.runWebGLProgram(r,[a],a.dtype)}},CW=oP({opSnippet:"if (b == 0.0) return NAN;\n return mod(a, b);",packedOpSnippet:"\n vec4 result = mod(a, b);\n bvec4 isNaN = equal(b, vec4(0.0));\n "+KL+"\n return result;\n"}),SW={kernelName:sl,backendName:"webgl",kernelFunc:CW};class EW{constructor(e,t,n){this.variableNames=["probs"],this.customUniforms=[{name:"seed",type:"float"}],this.outputShape=[e,n],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n\n float r = random(seed);\n float cdf = 0.0;\n\n for (int i = 0; i < ${t-1}; i++) {\n cdf += getProbs(batch, i);\n\n if (r < cdf) {\n setOutput(float(i));\n return;\n }\n }\n\n // If no other event happened, last event happened.\n setOutput(float(${t-1}));\n }\n `}}const _W=oP({opSnippet:"\nif (a == b) {\n return 1.0;\n};\nreturn a / b;",packedOpSnippet:"\n // vec4 one = vec4(equal(a, b));\n // return one + (vec4(1.0) - one) * a / b;\n vec4 result = a / b;\n if(a.x == b.x) {\n result.x = 1.;\n }\n if(a.y == b.y) {\n result.y = 1.;\n }\n if(a.z == b.z) {\n result.z = 1.;\n }\n if(a.w == b.w) {\n result.w = 1.;\n }\n\n return result;\n",checkOutOfBounds:!0}),TW={kernelName:ho,backendName:"webgl",kernelFunc:_W},IW="return a - b;",NW=oP({opSnippet:IW,packedOpSnippet:IW,supportsComplex:!0,cpuKernelImpl:dL}),RW={kernelName:cu,backendName:"webgl",kernelFunc:NW};function DW(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{dim:s}=a,r=js([s],i.shape),o=rW({inputs:{x:i},backend:n,attrs:{reductionIndices:r,keepDims:!1}}),l=yf(o.shape,r),u=fP({inputs:{x:o},backend:n,attrs:{shape:l}}),c=NW({inputs:{a:i,b:u},backend:n}),h=YV({inputs:{x:c},backend:n}),d=xP({inputs:{x:h},backend:n,attrs:{axis:r,keepDims:!1}}),p=fP({inputs:{x:d},backend:n,attrs:{shape:l}}),m=_W({inputs:{a:h,b:p},backend:n});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(u),n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),m}const zW={kernelName:Yl,backendName:"webgl",kernelFunc:DW};const OW={kernelName:rl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{logits:i}=t,{numSamples:s,seed:r,normalized:o}=a,l=o?i:DW({inputs:{logits:i},backend:n,attrs:{dim:i.shape.length-1}}),u=l.shape[0],c=l.shape[1],h=new EW(u,c,s),d=[[r]],p=n.runWebGLProgram(h,[l],"int32",d);return o||n.disposeIntermediateTensorInfo(l),p}},MW=EL+"\n return -x;\n";const BW={kernelName:ll,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{x:a}=t;if(n.shouldExecuteOnCPU([a])){const e=n.texData.get(a.dataId),[t,i]=qF(e.values,a.shape,a.dtype);return n.makeTensorInfo(i,a.dtype,t)}let i;return i=cr().getBool("WEBGL_PACK_UNARY_OPERATIONS")?new PL(a.shape,"\n vec4 result = -x;\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"):new SL(a.shape,MW),n.runWebGLProgram(i,[a],a.dtype)}},FW=Ab;const LW={kernelName:cl,backendName:"webgl",kernelFunc:function(e){_u();const{inputs:t,backend:n,attrs:a}=e,{boxes:i,scores:s}=t,{maxOutputSize:r,iouThreshold:o,scoreThreshold:l}=a,u=n.readSync(i.dataId),c=n.readSync(s.dataId),{selectedIndices:h}=FW(u,c,r,o,l);return n.makeTensorInfo([h.length],"int32",new Int32Array(h))}},PW=xb;const jW={kernelName:hl,backendName:"webgl",kernelFunc:function(e){_u();const{inputs:t,backend:n,attrs:a}=e,{boxes:i,scores:s}=t,{maxOutputSize:r,iouThreshold:o,scoreThreshold:l,padToMaxOutputSize:u}=a,c=n.readSync(i.dataId),h=n.readSync(s.dataId),{selectedIndices:d,validOutputs:p}=PW(c,h,r,o,l,u);return[n.makeTensorInfo([d.length],"int32",new Int32Array(d)),n.makeTensorInfo([],"int32",new Int32Array([p]))]}},VW=Cb;const UW={kernelName:dl,backendName:"webgl",kernelFunc:function(e){_u();const{inputs:t,backend:n,attrs:a}=e,{boxes:i,scores:s}=t,{maxOutputSize:r,iouThreshold:o,scoreThreshold:l,softNmsSigma:u}=a,c=n.readSync(i.dataId),h=n.readSync(s.dataId),d=r,p=o,m=l,f=u,{selectedIndices:g,selectedScores:y}=VW(c,h,d,p,m,f);return[n.makeTensorInfo([g.length],"int32",new Int32Array(g)),n.makeTensorInfo([y.length],"float32",new Float32Array(y))]}};class WW{constructor(e,t,n,a){this.variableNames=["indices"],this.outputShape=[e,t],this.userCode=`\n void main() {\n ivec2 coords = getOutputCoords();\n int index = round(getIndices(coords.x));\n setOutput(mix(float(${a}), float(${n}),\n float(index == coords.y)));\n }\n `}}const GW={kernelName:ml,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{indices:i}=t,{dtype:s,depth:r,onValue:o,offValue:l}=a,u=zs(i.shape),c=new WW(u,r,o,l),h=fP({inputs:{x:i},backend:n,attrs:{shape:[u]}}),d=n.runWebGLProgram(c,[h],s);n.disposeIntermediateTensorInfo(h);const p=fP({inputs:{x:d},backend:n,attrs:{shape:[...i.shape,r]}});return n.disposeIntermediateTensorInfo(d),p}};function qW(e){const{inputs:t,backend:n}=e,{x:a}=t;if("complex64"===a.dtype){const e=Nj({inputs:{input:a},backend:n}),t=qW({inputs:{x:e},backend:n}),i=Hj({inputs:{input:a},backend:n}),s=qW({inputs:{x:i},backend:n}),r=YL({inputs:{real:t,imag:s},backend:n});return n.disposeIntermediateTensorInfo(e),n.disposeIntermediateTensorInfo(t),n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(s),r}return lU({attrs:{shape:a.shape,dtype:a.dtype,value:"string"===a.dtype?"":0},backend:n})}const HW={kernelName:ku,backendName:"webgl",kernelFunc:qW};const KW={kernelName:pl,backendName:"webgl",kernelFunc:function e(t){const{inputs:n,backend:a}=t,{x:i}=n;if("string"===i.dtype)throw new Error("onesLike is not supported under string dtype");if("complex64"===i.dtype){const t=Nj({inputs:{input:i},backend:a}),n=e({inputs:{x:t},backend:a}),s=Hj({inputs:{input:i},backend:a}),r=qW({inputs:{x:s},backend:a}),o=YL({inputs:{real:n,imag:r},backend:a});return a.disposeIntermediateTensorInfo(t),a.disposeIntermediateTensorInfo(n),a.disposeIntermediateTensorInfo(s),a.disposeIntermediateTensorInfo(r),o}return lU({attrs:{shape:i.shape,dtype:i.dtype,value:1},backend:a})}};const $W={kernelName:fl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{axis:i}=a;if(1===t.length)return JV({inputs:{input:t[0]},backend:n,attrs:{dim:i}});const s=t[0].shape,r=t[0].dtype;t.forEach((e=>{Rs(s,e.shape,"All tensors passed to stack must have matching shapes"),Ns(r===e.dtype,(()=>"All tensors passed to stack must have matching dtypes"))}));const o=[],l=Zj({inputs:t.map((e=>{const t=JV({inputs:{input:e},backend:n,attrs:{dim:i}});return o.push(t),t})),backend:n,attrs:{axis:i}});return o.forEach((e=>n.disposeIntermediateTensorInfo(e))),l}};class ZW{constructor(e,t,n){this.variableNames=["x"],this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=["coords[0]","coords[1]","coords[2]","coords[3]"].slice(0,a);this.userCode=1!==a?`\n ${i} start = ${i}(${s});\n ${i} end = ${i}(${r});\n\n void main() {\n ${i} outC = getOutputCoords();\n if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n setOutput(value);\n } else {\n ${i} coords = outC - start;\n setOutput(getX(${o}));\n }\n }\n `:`\n int start = ${s};\n int end = ${r};\n\n void main() {\n int outC = getOutputCoords();\n if (outC < start || outC >= end) {\n setOutput(value);\n } else {\n setOutput(getX(outC - start));\n }\n }\n `}}class XW{constructor(e,t,n){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0,this.customUniforms=[{name:"value",type:"float"}],this.outputShape=t.map(((t,n)=>t[0]+e[n]+t[1]));const a=e.length,i=XB(a),s=t.map((e=>e[0])).join(","),r=t.map(((t,n)=>t[0]+e[n])).join(","),o=bL("rc",a),l=bL("source",a),u=`${o[a-1]} < ${this.outputShape[a-1]}`,c=1===a?"source":`vec2(${l.slice(-2).join()})`,h=[`${i} rc = outputLoc;`,`${o[a-1]} += 1;\n if(${u}) {\n `,1===a?"":`}\n rc = outputLoc;\n ${o[a-2]} += 1;\n if(${o[a-2]} < ${this.outputShape[a-2]}) {`,1===a?"":` ${o[a-1]} += 1;\n if(${u}) {`],d=1===a?"rc < start || rc >= end":"any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))";let p="";for(let e=0,t=1===a?2:4;e{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{paddings:s,constantValue:r}=a;if(0===zs(i.shape)){return lU({backend:n,attrs:{shape:s.map(((e,t)=>e[0]+i.shape[t]+e[1])),value:r,dtype:i.dtype}})}const o=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new XW(i.shape,s,r):new ZW(i.shape,s,r),l=[[r]];return n.runWebGLProgram(o,[i],i.dtype,l)},QW={kernelName:gl,backendName:"webgl",kernelFunc:YW},JW=oP({opSnippet:"\n if(a < 0.0 && floor(b) < b){\n return NAN;\n }\n if (b == 0.0) {\n return 1.0;\n }\n return (round(mod(b, 2.0)) != 1) ?\n pow(abs(a), b) : sign(a) * pow(abs(a), b);\n",packedOpSnippet:"\n // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n vec4 result = multiplier * pow(abs(a), b);\n\n // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n bvec4 isExpZero = equal(b, vec4(0.0));\n result.r = isExpZero.r ? 1.0 : result.r;\n result.g = isExpZero.g ? 1.0 : result.g;\n result.b = isExpZero.b ? 1.0 : result.b;\n result.a = isExpZero.a ? 1.0 : result.a;\n\n bvec4 isNaN1 = lessThan(a, vec4(0.0));\n bvec4 isNaN2 = lessThan(floor(b), b);\n bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w);\n "+KL+"\n return result;\n"}),eG={kernelName:yl,backendName:"webgl",kernelFunc:JW};const tG={kernelName:vl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{axis:s,keepDims:r}=a,o=i.shape.length,l=[],u=js(s,i.shape);let c=u;const h=vf(c,o);let d,p=i;if(null!=h&&(p=SP({inputs:{x:i},backend:n,attrs:{perm:h}}),c=wf(c.length,o),l.push(p)),bf("prod",c,o),n.shouldExecuteOnCPU([p])){const e=n.texData.get(p.dataId).values,{outVals:t,outShape:a,outDtype:i}=KF(p.shape,p.dtype,e,c);d=n.makeTensorInfo(a,i,t)}else{const[e,t]=gf(p.shape,c),a=zs(t),s=fP({inputs:{x:p},backend:n,attrs:{shape:[-1,a]}}),r=vP(s,Mc(i.dtype),"prod",n);d=fP({inputs:{x:r},backend:n,attrs:{shape:e}}),l.push(s),l.push(r)}if(r){l.push(d);const e=yf(d.shape,u);d=fP({inputs:{x:d},backend:n,attrs:{shape:e}})}return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),d}};const nG={kernelName:kl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{paramsNestedSplits:i,paramsDenseValues:s,indices:r}=t,{outputRaggedRank:o}=a,l=i.map((e=>n.readSync(e.dataId))),u=i.map((e=>e.shape)),c=n.readSync(s.dataId),h=n.readSync(r.dataId),[d,p,m]=$F(l,u,c,s.shape,s.dtype,h,r.shape,o),f=d.map((e=>n.makeTensorInfo([e.length],"int32",e))),g=n.makeTensorInfo(m,s.dtype,p);return f.concat([g])}};const aG={kernelName:wl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{starts:a,limits:i,deltas:s}=t,r=n.readSync(a.dataId),o=n.readSync(i.dataId),l=n.readSync(s.dataId),[u,c]=ZF(r,a.shape,a.dtype,o,i.shape,l,s.shape);return[n.makeTensorInfo([u.length],"int32",u),n.makeTensorInfo([c.length],a.dtype,c)]}};const iG={kernelName:Al,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{shape:i,values:s,defaultValue:r,rowPartitionTensors:o}=t,{rowPartitionTypes:l}=a,u=n.readSync(i.dataId),c=n.readSync(s.dataId),h=n.readSync(r.dataId),d=o.map((e=>n.readSync(e.dataId))),p=o.map((e=>e.shape)),[m,f]=XF(u,i.shape,c,s.shape,s.dtype,h,r.shape,d,p,l);return n.makeTensorInfo(m,s.dtype,f)}},sG=e=>{const{backend:t,attrs:n}=e,{start:a,stop:i,step:s,dtype:r}=n,o=YF(a,i,s,r);return t.makeTensorInfo([o.length],r,o)},rG={kernelName:xl,backendName:"webgl",kernelFunc:sG},oG=rP({opSnippet:"return 1.0 / x;"}),lG={kernelName:Sl,backendName:"webgl",kernelFunc:oG},uG=rP({opSnippet:EL+"\n return (x < 0.0) ? 0.0 : x;\n",packedOpSnippet:"\n vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),cG={kernelName:El,backendName:"webgl",kernelFunc:uG},hG=rP({opSnippet:EL+"\n return (x < 0.0) ? 0.0 : min(6.0, x);\n",packedOpSnippet:"\n vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n"}),dG={kernelName:Dl,backendName:"webgl",kernelFunc:hG};class pG{constructor(e,t,n,a,i){this.variableNames=["A"],this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n];let h;h=i?"(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC - vec2(0.5)":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/c[0]},\n ${u[1]/c[1]});\n const vec2 inputShapeRC = vec2(${r}.0, ${o}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${h};\n\n // Compute the four integer indices.\n ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n ivec2 sourceCeilRC = ivec2(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n float top = topLeft + (topRight - topLeft) * fracRC.y;\n float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n float newValue = top + (bottom - top) * fracRC.x;\n\n setOutput(newValue);\n }\n `}}class mG{constructor(e,t,n,a,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n];let h;h=i?"(vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC - vec3(0.5)":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/c[0]},\n ${u[1]/c[1]},\n ${u[1]/c[1]});\n const vec3 inputShapeRC = vec3(${r}.0, ${o}.0,\n ${o}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${h};\n\n // Compute the four integer indices.\n ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n ivec3 sourceCeilRC = ivec3(\n min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${l-1};\n bool hasNextRow = coords.z < ${n-1};\n\n // In parallel, construct four corners for all four components in\n // packed 2x2 cell.\n vec4 topLeft = vec4(\n getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 bottomLeft = vec4(\n getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n vec4 topRight = vec4(\n getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec4 bottomRight = vec4(\n getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n vec4 newValue = mix(top, bottom, fracRC.x);\n\n setOutput(newValue);\n }\n `}}const fG={kernelName:Nl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i}=t,{alignCorners:s,halfPixelCenters:r,size:o}=a,[l,u]=o,c=cr().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new mG(i.shape,l,u,s,r):new pG(i.shape,l,u,s,r);return n.runWebGLProgram(c,[i],"float32")}};class gG{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,a,i]=t,[,s,r]=e,o=[n&&s>1?a-1:a,n&&r>1?i-1:i],l=[n&&s>1?s-1:s,n&&r>1?r-1:r],u=o[0]/l[0],c=o[1]/l[1],h=1/u,d=1/c,p=2*Math.ceil(h)+2,m=2*Math.ceil(d)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${c});\n\n const float invHeightScale = float(${h});\n const float invWidthScale = float(${d});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(startRLerp - float(winHeight / 2));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(startCLerp - float(winWidth / 2));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${s}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${r}) {\n continue;\n }\n\n float dxR = float(dyR) * heightScale;\n int topDxRIndex = int(floor(dxR));\n int bottomDxRIndex = int(min(ceil(dxR), ${a-1}.0));\n float dxRLerp = dxR - float(topDxRIndex);\n float inverseDxRLerp = 1.0 - dxRLerp;\n\n float dxC = float(dyC) * widthScale;\n int leftDxCIndex = int(floor(dxC));\n int rightDxCIndex = int(min(ceil(dxC), ${i-1}.0));\n float dxCLerp = dxC - float(leftDxCIndex);\n float inverseDxCLerp = 1.0 - dxCLerp;\n\n if (r == topDxRIndex && c == leftDxCIndex) {\n // topLeft\n accumulator +=\n getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n }\n\n if (r == topDxRIndex && c == rightDxCIndex) {\n // topRight\n accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n }\n\n if (r == bottomDxRIndex && c == leftDxCIndex) {\n // bottomLeft\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n }\n\n if (r == bottomDxRIndex && c == rightDxCIndex) {\n // bottomRight\n accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}const yG={kernelName:Rl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i,dy:s}=t,{alignCorners:r}=a,o=new gG(s.shape,i.shape,r);return n.runWebGLProgram(o,[s],s.dtype)}};class bG{constructor(e,t,n,a,i){this.variableNames=["A"],this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n],h=a?"0.5":"0.0";let d;d=i?"max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC, vec2(0.0))":"vec2(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec2 effectiveInputOverOutputRatioRC = vec2(\n ${u[0]/c[0]},\n ${u[1]/c[1]});\n const vec2 inputShapeRC = vec2(${r}.0, ${o}.0);\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n ivec2 yRC = coords.yz;\n\n // Fractional source index.\n vec2 sourceFracIndexRC = ${d};\n\n // Compute the coordinators of nearest neighbor point.\n ivec2 sourceNearestRC = ivec2(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${h})));\n float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n setOutput(newValue);\n }\n `}}class vG{constructor(e,t,n,a,i){this.variableNames=["A"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=[];const[s,r,o,l]=e;this.outputShape=[s,t,n,l];const u=[a&&t>1?r-1:r,a&&n>1?o-1:o],c=[a&&t>1?t-1:t,a&&n>1?n-1:n],h=a?"0.5":"0.0";let d;d=i?"max((vec3(yRC) + vec3(0.5)) * effectiveInputOverOutputRatioRC, vec3(0.0))":"vec3(yRC) * effectiveInputOverOutputRatioRC",this.userCode=`\n const vec3 effectiveInputOverOutputRatioRC = vec3(\n ${u[0]/c[0]},\n ${u[1]/c[1]},\n ${u[1]/c[1]});\n const vec3 inputShapeRC = vec3(${r}.0, ${o}.0,\n ${o}.0);\n\n float getAValue(int b, int r, int c, int d) {\n return getChannel(getA(b, r, c, d), vec2(c, d));\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n // Calculate values for next column in yRC.z.\n ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n // Fractional source index.\n vec3 sourceFracIndexRC = ${d};\n\n // Compute the coordinators of nearest neighbor point.\n ivec3 sourceNearestRC = ivec3(\n min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${h})));\n\n // Should we calculate next column and row elements in 2x2 packed cell.\n bool hasNextCol = d < ${l-1};\n bool hasNextRow = coords.z < ${n-1};\n\n vec4 newValue = vec4(\n getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n : 0.0,\n hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n : 0.0,\n (hasNextRow && hasNextCol) ?\n getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n setOutput(newValue);\n }\n `}}const kG={kernelName:Tl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i}=t,{alignCorners:s,halfPixelCenters:r,size:o}=a,[l,u]=o,c=cr().getBool("WEBGL_PACK_IMAGE_OPERATIONS")?new vG(i.shape,l,u,s,r):new bG(i.shape,l,u,s,r);return n.runWebGLProgram(c,[i],i.dtype)}};class wG{constructor(e,t,n){this.variableNames=["dy"],this.outputShape=[],this.outputShape=t;const[,a,i]=t,[,s,r]=e,o=[n&&s>1?a-1:a,n&&r>1?i-1:i],l=[n&&s>1?s-1:s,n&&r>1?r-1:r],u=o[0]/l[0],c=o[1]/l[1],h=1/u,d=1/c,p=2*Math.ceil(h)+2,m=2*Math.ceil(d)+2;this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int b = coords[0];\n int d = coords[3];\n int r = coords[1];\n int c = coords[2];\n\n float accumulator = 0.0;\n\n const float heightScale = float(${u});\n const float widthScale = float(${c});\n\n const float invHeightScale = float(${h});\n const float invWidthScale = float(${d});\n\n const int winHeight = int(${p});\n const int winWidth = int(${m});\n\n // Compute bounds for where in dy we will look\n float startRLerp = floor(float(r) * invHeightScale);\n int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n float startCLerp = floor(float(c) * invWidthScale);\n int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n // Loop over dy\n for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n int dyR = dyROffset + startDyR;\n\n // Guard against the window exceeding the bounds of dy\n if (dyR < 0 || dyR >= ${s}) {\n continue;\n }\n\n for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n int dyC = dyCOffset + startDyC;\n\n // Guard against the window exceeding the bounds of dy\n if (dyC < 0 || dyC >= ${r}) {\n continue;\n }\n\n float sourceFracRow =\n float(${o[0]}) *\n (float(dyR) / float(${l[0]}));\n\n float sourceFracCol =\n float(${o[1]}) *\n (float(dyC) / float(${l[1]}));\n\n int sourceNearestRow = int(min(\n float(int(${a}) - 1),\n ${n} ? float(round(sourceFracRow)) :\n float(floor(sourceFracRow))));\n\n int sourceNearestCol = int(min(\n float(int(${i}) - 1),\n ${n} ? float(round(sourceFracCol)) :\n float(floor(sourceFracCol))));\n\n if (r == sourceNearestRow && c == sourceNearestCol) {\n accumulator += getDy(b, dyR, dyC, d);\n }\n }\n }\n // End loop over dy\n\n setOutput(accumulator);\n }\n `}}const AG={kernelName:Il,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{images:i,dy:s}=t,{alignCorners:r}=a,o=new wG(s.shape,i.shape,r);return n.runWebGLProgram(o,[s],s.dtype)}};class xG{constructor(e,t){this.variableNames=["x"];const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);if(this.outputShape=e,1===n)return void(this.userCode=`\n void main() {\n int coord = getOutputCoords();\n setOutput(getX(${e[0]} - coord - 1));\n }\n `);const a=e.map(((n,a)=>(n=>-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - coords[${n}] - 1`:`coords[${n}]`)(a))).join(","),i=XB(n);this.userCode=`\n void main() {\n ${i} coords = getOutputCoords();\n setOutput(getX(${a}));\n }\n `}}class CG{constructor(e,t){this.variableNames=["x"],this.packedInputs=!0,this.packedOutput=!0;const n=e.length;if(n>4)throw new Error(`WebGL backend: Reverse of rank-${n} tensor is not yet supported`);this.outputShape=e;const a=bL("rc",n),i=`${a[n-1]} + 1 < ${this.outputShape[n-1]}`,s=`${a[n-2]} + 1 < ${this.outputShape[n-2]}`,r=XB(n);function o(n){const a=e.map(((a,i)=>function(n,a){return-1!==t.indexOf(n)&&1!==e[n]?`${e[n]} - ${a[n]} - 1`:`${a[n]}`}(i,n)));return`getChannel(getX(${a.join(",")}), vec2(${a.slice(-2).join(",")}))`}this.userCode=1===n?`\n void main(){\n int rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = getChannel(getX(${e[0]} - rc - 1),\n ${e[0]} - rc - 1);\n if(${i}){\n result.g = getChannel(getX(${e[0]} - (rc + 1) - 1),\n ${e[0]} - (rc + 1) - 1);\n }\n setOutput(result);\n }\n `:`\n void main() {\n ${r} rc = getOutputCoords();\n vec4 result = vec4(0.);\n result.r = ${function(e){return o(e)}(a.slice())};\n if(${i}){\n result.g = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",o(e)}(a.slice())};\n }\n if(${s}) {\n result.b = ${function(e){return e[n-2]="("+e[n-2]+" + 1)",o(e)}(a.slice())};\n if(${i}) {\n result.a = ${function(e){return e[n-1]="("+e[n-1]+" + 1)",e[n-2]="("+e[n-2]+" + 1)",o(e)}(a.slice())};\n }\n }\n setOutput(result);\n }\n `}}const SG={kernelName:zl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{dims:s}=a,r=i.shape.length,o=js(s,i.shape);if(0===r)return ZL({inputs:{x:i},backend:n});const l=cr().getBool("WEBGL_PACK_ARRAY_OPERATIONS")?new CG(i.shape,o):new xG(i.shape,o);return n.runWebGLProgram(l,[i],i.dtype)}};class EG{constructor(e,t){this.variableNames=["Image"],this.outputShape=[],this.customUniforms=[{name:"params",type:"vec4"}];const n=e[1],a=e[2];this.outputShape=e;let i="";i="number"==typeof t?`float outputValue = ${t.toFixed(2)};`:`\n vec3 fill = vec3(${t.join(",")});\n float outputValue = fill[coords[3]];`,this.userCode=`\n void main() {\n ivec4 coords = getOutputCoords();\n int x = coords[2];\n int y = coords[1];\n float coordXFloat = (float(x) - params[0]) * params[3] -\n (float(y) - params[1]) * params[2];\n float coordYFloat = (float(x) - params[0]) * params[2] +\n (float(y) - params[1]) * params[3];\n int coordX = int(round(coordXFloat + params[0]));\n int coordY = int(round(coordYFloat + params[1]));\n ${i}\n if(coordX >= 0 && coordX < ${a} && coordY >= 0 && coordY < ${n}) {\n outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n }\n setOutput(outputValue);\n }\n `}}const _G={kernelName:xu,backendName:"webgl",kernelFunc:({inputs:e,attrs:t,backend:n})=>{const{image:a}=e,{radians:i,fillValue:s,center:r}=t,o=n,l=new EG(a.shape,s),[u,c]=vv(r,a.shape[1],a.shape[2]),h=[[u,c,Math.sin(i),Math.cos(i)]];return o.runWebGLProgram(l,[a],a.dtype,h)}},TG=rP({opSnippet:"\n // OpenGL ES does not support round function.\n // The algorithm is based on banker's rounding.\n float base = floor(x);\n if ((x - base) < 0.5) {\n return floor(x);\n } else if ((x - base) > 0.5) {\n return ceil(x);\n } else {\n if (mod(base, 2.0) == 0.0) {\n return base;\n } else {\n return base + 1.0;\n }\n }\n"}),IG={kernelName:Ol,backendName:"webgl",kernelFunc:TG},NG=rP({opSnippet:"return inversesqrt(x);",cpuKernelImpl:QF}),RG={kernelName:Ml,backendName:"webgl",kernelFunc:NG};class DG{constructor(e,t,n,a,i,s,r=!0,o=!1){this.variableNames=["updates","indices","defaultValue"],this.outputShape=s;const l=XB(i.length),u=XB(s.length);let c="";1===n?c="i":2===n&&(c="i, j");const h=`getIndices(${c})`;let d="";1===a?d="i":2===a&&(d="i, coords[1]");const p=`getUpdates(${d})`;let m="";o&&(m="coords[0], coords[1]");const f=`getDefaultValue(${m})`,g=t>1?"strides[j]":"strides";this.userCode=`\n ${l} strides = ${l}(${i});\n\n void main() {\n ${u} coords = getOutputCoords();\n float sum = 0.0;\n bool found = false;\n for (int i = 0; i < ${e}; i++) {\n int flattenedIndex = 0;\n for (int j = 0; j < ${t}; j++) {\n int index = round(${h});\n flattenedIndex += index * ${g};\n }\n if (flattenedIndex == coords[0]) {\n sum += ${p};\n found = true;\n }\n }\n setOutput(mix(${f}, sum, float(found)));\n }\n `}}class zG{constructor(e,t,n,a,i,s,r=!0,o=!1){this.variableNames=["updates","indices","defaultValue"],this.packedInputs=!0,this.packedOutput=!0,this.outputShape=s;const l=XB(i.length),u=XB(s.length);let c="";1===n?c="i":2===n&&(c="i, j");const h=`getIndices(${c})`;let d="";1===a?d="i":2===a&&(d="i, coords[1]");const p=`getUpdates(${d})`;let m="";o&&(m="coords[0], coords[1]");const f=`getDefaultValue(${m})`,g=t>1?"strides[j]":"strides",y=t>1?"strides[j + 1]":"strides";this.userCode=`\n ${l} strides = ${l}(${i});\n\n void main() {\n ${u} coords = getOutputCoords();\n vec4 sum = vec4(0.);\n vec4 found = vec4(0.);\n for (int i = 0; i < ${e}; i+=2) {\n ivec2 flattenedIndex = ivec2(0);\n for (int j = 0; j < ${t}; j+=2) {\n ivec4 index = round(${h});\n flattenedIndex += index.xz * ${g};\n if (j + 1 < ${t}) {\n flattenedIndex += index.yw * ${y};\n }\n }\n if (flattenedIndex[0] == coords[0] || flattenedIndex[1] == coords[0] ||\n flattenedIndex[0] == coords[0] + 1 || flattenedIndex[1] == coords[0] + 1) {\n vec4 updVals = ${p};\n if (flattenedIndex[0] == coords[0]) {\n sum.xy += updVals.xy;\n found.xy = vec2(1.);\n } else if (flattenedIndex[0] == coords[0] + 1) {\n sum.zw += updVals.xy;\n found.zw = vec2(1.);\n }\n if (flattenedIndex[1] == coords[0]) {\n sum.xy += updVals.zw;\n found.xy = vec2(1.);\n } else if (flattenedIndex[1] == coords[0] + 1) {\n sum.zw += updVals.zw;\n found.zw = vec2(1.);\n }\n }\n }\n setOutput(mix(${f}, sum, found));\n }\n `}}const OG={kernelName:Bl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{indices:i,updates:s}=t,{shape:r}=a,{sliceRank:o,numUpdates:l,sliceSize:u,strides:c,outputSize:h}=Dy(0,i,r),d=[h/u,u];if(0===h)return n.makeTensorInfo(r,i.dtype);const p=fP({inputs:{x:i},backend:n,attrs:{shape:[l,o]}}),m=fP({inputs:{x:s},backend:n,attrs:{shape:[l,u]}}),f=n.makeTensorInfo([],"float32",new Float32Array([0]));let g;g=cr().getBool("WEBGL_PACK")?new zG(l,o,p.shape.length,m.shape.length,c,d):new DG(l,o,p.shape.length,m.shape.length,c,d);const y=n.runWebGLProgram(g,[m,p,f],m.dtype),b=fP({inputs:{x:y},backend:n,attrs:{shape:r}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(f),b}};class MG{constructor(e,t,n,a){this.variableNames=["sortedSequence","values"],this.customUniforms=[{name:"numInputs",type:"int"}],this.outputShape=[e,n];const i=`for (int i = 0; i < ${Math.ceil(Math.log2(t+1))}; ++i) { if (left >= right) break;`,s=2===cr().getNumber("WEBGL_VERSION")?"while (left < right) {":i,r="left"===a?"<":"<=";this.userCode=`\n int findBound(int batch, float value) {\n int left = 0;\n int right = numInputs;\n int mid;\n ${s}\n mid = (left + right) / 2;\n if (getSortedSequence(batch, mid) ${r} value) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n return right;\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int valueIndex = coords[1];\n\n float value = getValues(batch, valueIndex);\n\n setOutput(float(findBound(batch, value)));\n }\n `}}const BG={kernelName:Ll,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{sortedSequence:i,values:s}=t,{side:r}=a,o=new MG(i.shape[0],i.shape[1],s.shape[1],r),l=[[i.shape[1]]];return n.runWebGLProgram(o,[i,s],"int32",l)}};class FG{constructor(e,t,n){let a,i;if(this.variableNames=["c","a","b"],this.outputShape=t,n>4)throw Error(`Where for rank ${n} is not yet supported`);if(1===n)i="resRC",a="resRC";else{const n=["resRC.x","resRC.y","resRC.z","resRC.w"],s=[],r=[];for(let a=0;a= 1.0) {\n setOutput(getA(${i}));\n } else {\n setOutput(getB(${i}));\n }\n }\n `}}const LG={kernelName:Pl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{condition:a,t:i,e:s}=t,r=new FG(a.shape.length,i.shape,i.shape.length);return n.runWebGLProgram(r,[a,i,s],Oc(i.dtype,s.dtype))}},PG=rP({opSnippet:`\n // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n // see: https://arxiv.org/abs/1706.02515\n float scaleAlpha = ${Ev};\n float scale = ${_v};\n return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`}),jG={kernelName:jl,backendName:"webgl",kernelFunc:PG},VG=rP({opSnippet:sP+"\n return 1.0 / (1.0 + exp(-1.0 * x));\n",packedOpSnippet:"\n vec4 result = 1.0 / (1.0 + exp(-1.0 * x));\n bvec4 isNaN = isnan(x);\n\n result.r = isNaN.r ? x.r : result.r;\n result.g = isNaN.g ? x.g : result.g;\n result.b = isNaN.b ? x.b : result.b;\n result.a = isNaN.a ? x.a : result.a;\n\n return result;\n",cpuKernelImpl:eL}),UG={kernelName:ql,backendName:"webgl",kernelFunc:VG},WG=rP({opSnippet:"\n if (isnan(x)) { return 0.0; }\n return sign(x);\n"}),GG={kernelName:Gl,backendName:"webgl",kernelFunc:WG},qG=rP({opSnippet:sP+"\n return sin(x);\n",packedOpSnippet:`\n vec4 result = sin(x);\n bvec4 isNaN = isnan(x);\n ${KL}\n return result;\n`}),HG={kernelName:Ul,backendName:"webgl",kernelFunc:qG},KG=rP({opSnippet:"\n float e2x = exp(x);\n return (e2x - 1.0 / e2x) / 2.0;\n"}),$G={kernelName:Wl,backendName:"webgl",kernelFunc:KG},ZG=rP({opSnippet:"\n float epsilon = 1.1920928955078125e-7;\n float threshold = log(epsilon) + 2.0;\n\n bool too_large = x > -threshold;\n bool too_small = x < threshold;\n\n float result;\n float exp_x = exp(x);\n\n if (too_large){\n result = x;\n }\n else if (too_small){\n result = exp_x;\n }\n else{\n result = log(exp_x + 1.0);\n }\n return result;\n"}),XG={kernelName:Hl,backendName:"webgl",kernelFunc:ZG},YG={kernelName:Zl,backendName:"webgl",kernelFunc:e=>{const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{blockShape:s,paddings:r}=a;Ns(i.shape.length<=4,(()=>"spaceToBatchND for rank > 4 with a WebGL backend not implemented yet"));const o=s.reduce(((e,t)=>e*t)),l=[[0,0]];l.push(...r);for(let e=1+s.length;en.disposeIntermediateTensorInfo(e))),g}};const QG={kernelName:Ql,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{indices:a,values:i,denseShape:s,defaultValue:r}=t;if(1!==s.shape.length)throw new Error(`Dense shape must be a vector, saw:\n ${s.shape}`);if(2!==a.shape.length)throw new Error(`Indices must be a matrix, saw:\n ${a.shape}`);if(1!==i.shape.length)throw new Error(`Values must be a vector, saw:\n ${i.shape}`);if(0!==r.shape.length)throw new Error(`Default value must be a scalar, saw:\n ${r.shape}`);const o=n.readSync(a.dataId),l=n.readSync(i.dataId),u=n.readSync(s.dataId),c=n.readSync(r.dataId)[0],[h,d,p,m,f]=aL(o,a.shape,a.dtype,l,i.dtype,u,c);return[n.makeTensorInfo(d,a.dtype,h),n.makeTensorInfo([d[0]],i.dtype,p),n.makeTensorInfo([m.length],"bool",new Uint8Array(m.map((e=>Number(e))))),n.makeTensorInfo([f.length],a.dtype,new Int32Array(f))]}};const JG={kernelName:Jl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{inputIndices:a,inputShape:i,newShape:s}=t;if(2!==a.shape.length)throw new Error(`Input indices should be a matrix but received shape ${a.shape}`);if(1!==i.shape.length)throw new Error(`Input shape should be a vector but received shape ${i.shape}`);if(1!==s.shape.length)throw new Error(`Target shape should be a vector but received shape ${s.shape}`);const r=Array.from(n.readSync(i.dataId)),o=n.readSync(a.dataId),l=Array.from(n.readSync(s.dataId)),[u,c,h]=iL(o,a.shape,a.dtype,r,l);return[n.makeTensorInfo(c,a.dtype,u),n.makeTensorInfo([h.length],s.dtype,new Int32Array(h))]}};const eq={kernelName:eu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{data:a,indices:i,segmentIds:s}=t;if(a.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.shape.length)throw new Error(`Indices should be a vector but received shape\n ${i.shape}`);if(1!==s.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);const r=n.readSync(a.dataId),o=n.readSync(i.dataId),l=n.readSync(s.dataId),[u,c]=sL(r,a.shape,a.dtype,o,l,!0);return n.makeTensorInfo(c,a.dtype,u)}};const tq={kernelName:tu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n}=e,{data:a,indices:i,segmentIds:s}=t;if(a.shape.length<1)throw new Error("Data should be at least 1 dimensional but received scalar");if(1!==i.shape.length)throw new Error(`Indices should be a vector but received shape\n ${i.shape}`);if(1!==s.shape.length)throw new Error(`Segment ids should be a vector but received shape\n ${s.shape}`);const r=n.readSync(a.dataId),o=n.readSync(i.dataId),l=n.readSync(s.dataId),[u,c]=sL(r,a.shape,a.dtype,o,l);return n.makeTensorInfo(c,a.dtype,u)}};const nq={kernelName:nu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{sparseIndices:i,sparseValues:s,defaultValue:r}=t,{outputShape:o}=a,{sliceRank:l,numUpdates:u,sliceSize:c,strides:h,outputSize:d}=Dy(0,i,o),p=!1;if("string"===s.dtype){const e=n.bufferSync(i),t=n.bufferSync(s),a=nc(n.readSync(r.dataId)[0]),m=JF(e,t,o,d,c,u,l,h,a,p);return n.makeTensorInfo(o,m.dtype,m.values)}const m=new DG(u,l,i.shape.length,s.shape.length,h,[d,1],p),f=n.runWebGLProgram(m,[s,i,r],s.dtype),g=fP({inputs:{x:f},backend:n,attrs:{shape:o}});return n.disposeIntermediateTensorInfo(f),g}};const aq={kernelName:Xl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{numOrSizeSplits:s,axis:r}=a,o=js(r,i.shape)[0],l=Qv(i,s,o),u=i.shape.length,c=new Array(u).fill(0),h=i.shape.slice();return l.map((e=>{const t=[...h];t[o]=e;const a=Aj({inputs:{x:i},backend:n,attrs:{begin:c,size:t}});return c[o]+=e,a}))}},iq="return sqrt(x);",sq=rP({opSnippet:iq,packedOpSnippet:iq,cpuKernelImpl:rL}),rq={kernelName:Kl,backendName:"webgl",kernelFunc:sq},oq={kernelName:iu,backendName:"webgl",kernelFunc:rP({opSnippet:"return x * x;"})},lq="return (a - b) * (a - b);",uq=oP({opSnippet:lq,packedOpSnippet:lq}),cq={kernelName:au,backendName:"webgl",kernelFunc:uq};const hq={kernelName:su,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t;if("string"!==i.dtype)throw new Error("Input must be of datatype string");const s=mk(n.readSync(i.dataId)),r=oL(s,"string",a);return n.makeTensorInfo(i.shape,"string",r)}};const dq={kernelName:wu,backendName:"webgl",kernelFunc:function({inputs:e,attrs:t,backend:n}){const{x:a}=e,i=EL+`\n return x > 0.0 ? 1.0 : float(${t.alpha});\n `,s=new SL(a.shape,i);return n.runWebGLProgram(s,[a],a.dtype)}};class pq{constructor(e,t,n){this.variableNames=["x"],this.outputShape=n;const a=n.length,i=XB(n.length),s=XB(n.length);let r="";if(1===a)r="coords * strides + begin";else{let e=0;r=n.map(((t,a)=>(e++,1===n.length?`coords * strides[${a}] + begin[${a}]`:`coords[${e-1}] * strides[${a}] + begin[${a}]`))).join(",")}this.userCode=`\n ${i} begin = ${i}(${e});\n ${i} strides = ${i}(${t});\n\n void main() {\n ${s} coords = getOutputCoords();\n setOutput(getX(${r}));\n }\n `}}const mq={kernelName:ru,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i}=t,{begin:s,end:r,strides:o,beginMask:l,endMask:u,ellipsisMask:c,newAxisMask:h,shrinkAxisMask:d}=a,{finalShapeSparse:p,finalShape:m,isIdentity:f,sliceDim0:g,isSimpleSlice:y,begin:b,end:v,strides:k}=Gp(i.shape,s,r,o,l,u,c,h,d);let w;if(f)w=fP({inputs:{x:i},backend:n,attrs:{shape:m}});else if(g||y){Ns(i.shape.length>=1,(()=>`Input must have rank at least 1, got: ${i.shape.length}`));const e=Rp(b,v,k),t=Aj({inputs:{x:i},backend:n,attrs:{begin:b,size:e}});w=fP({inputs:{x:t},backend:n,attrs:{shape:m}}),n.disposeIntermediateTensorInfo(t)}else{if(n.shouldExecuteOnCPU([i])){const e=n.readSync(i.dataId),t=vd(i.shape,i.dtype,e),a=lL(p,t,k,b);w=n.makeTensorInfo(m,i.dtype,a.values)}else{const e=new pq(b,k,p);w=n.runWebGLProgram(e,[i],i.dtype)}}const A=fP({inputs:{x:w},backend:n,attrs:{shape:m}});return n.disposeIntermediateTensorInfo(w),A}};const fq={kernelName:ou,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{separator:i,nGramWidths:s,leftPad:r,rightPad:o,padWidth:l,preserveShortSequences:u}=a,{data:c,dataSplits:h}=t,d=n.readSync(c.dataId),p=n.readSync(h.dataId),[m,f]=uL(d,p,i,s,r,o,l,u);return[n.makeTensorInfo([m.length],"string",m),n.makeTensorInfo(h.shape,"int32",f)]}};const gq={kernelName:lu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{skipEmpty:i}=a,{input:s,delimiter:r}=t;if("string"!==s.dtype)throw new Error("Input must be of datatype string");if(1!==s.shape.length)throw new Error(`Input must be a vector, got shape: ${s.shape}`);if(0!==r.shape.length)throw new Error(`Delimiter must be a scalar, got shape: ${r.shape}`);const o=n.readSync(s.dataId),l=n.readSync(r.dataId)[0],[u,c,h]=cL(o,l,i),d=c.length;return[n.makeTensorInfo([d,2],"int32",u),n.makeTensorInfo([d],"string",c),n.makeTensorInfo([2],"int32",new Int32Array(h))]}};const yq={kernelName:uu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{numBuckets:i}=a,{input:s}=t;if("string"!==s.dtype)throw new Error("Input must be of datatype string");if(i<=0)throw new Error("Number of buckets must be at least 1");const r=n.readSync(s.dataId),o=hL(r,i);return n.makeTensorInfo(s.shape,"int32",o)}},bq=rP({opSnippet:"return tan(x);"}),vq={kernelName:hu,backendName:"webgl",kernelFunc:bq},kq=rP({opSnippet:"\n float e2x = exp(-2.0 * abs(x));\n return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n"}),wq={kernelName:du,backendName:"webgl",kernelFunc:kq};const Aq={kernelName:Fl,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{tensor:i,indices:s,updates:r}=t,{}=a,{sliceRank:o,numUpdates:l,sliceSize:u,strides:c,outputSize:h}=Dy(0,s,i.shape),d=[h/u,u];if(0===h)return n.makeTensorInfo(i.shape,s.dtype);const p=fP({inputs:{x:s},backend:n,attrs:{shape:[l,o]}}),m=fP({inputs:{x:r},backend:n,attrs:{shape:[l,u]}}),f=fP({inputs:{x:i},backend:n,attrs:{shape:d}}),g=new DG(l,o,p.shape.length,m.shape.length,c,d,!1,!0),y=n.runWebGLProgram(g,[m,p,f],f.dtype),b=fP({inputs:{x:y},backend:n,attrs:{shape:i.shape}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(m),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(y),b}};class xq{constructor(e,t){this.variableNames=["A"];const n=new Array(e.length);for(let a=0;a5)throw Error(`Tile for rank ${t} is not yet supported`);if(1===t)return`imod(resRC, ${e[0]})`;const n=["resRC.x","resRC.y","resRC.z","resRC.w","resRC.u"],a=[];for(let t=0;t5){const e=n.readSync(i.dataId),t="string"===i.dtype?e.map((e=>nc(e))):e,a=vd(i.shape,i.dtype,t),r=pL(a,s);return n.makeTensorInfo(r.shape,r.dtype,r.values)}const r=new xq(i.shape,s);return n.runWebGLProgram(r,[i],i.dtype)}const Sq={kernelName:pu,backendName:"webgl",kernelFunc:Cq};class Eq{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"negativeInf",type:"float"},{name:"dir",type:"int"},{name:"inc",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // We compare elements pair-wise within a group of size 2 * inc.\n // The comparing rule for each group alternates between ascending\n // and descending. Within each group, we compare each pair at\n // positions i and i+inc. To decide whether an element at position i\n // is x0 or x1, we mod it by 2 * inc, if the result is smaller than\n // inc, it is in the first half of the group, we denote it as x0,\n // otherwise we denote it as x1.\n // For example, as shown in the Bitonic top K paper referenced above,\n // Figure5(a) shows that element[1] is in the\n // second half of the group when group size is 2, but it is in the\n // first half of the group when group size is 4.\n\n bool isFirstInPair = imod(elemIdx, 2 * inc) < inc;\n int i = isFirstInPair ? elemIdx : elemIdx - inc;\n\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc));\n float x0 = i0 < n ? getX(batch, i0) : negativeInf;\n float x1 = i1 < n ? getX(batch, i1) : negativeInf;\n\n // Denotes which direction indices are in (ascending or descending).\n bool reverse = imod(elemIdx, 2 * dir) >= dir;\n bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n if (reverse == isGreater) { // Elements in opposite order of direction\n int iTemp = i0;\n i0 = i1;\n i1 = iTemp;\n }\n if (isFirstInPair) {\n setOutput(float(i0));\n } else {\n setOutput(float(i1));\n }\n }\n "}}class _q{constructor(e){this.variableNames=["x","indices"],this.customUniforms=[{name:"n",type:"int"},{name:"firstPass",type:"int"},{name:"k",type:"int"}],this.outputShape=e,this.userCode="\n void main() {\n // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int elemIdx = coords[1];\n\n // The output size is half of the previous size.\n // If the previous sequence is | | | | _ _ _ _ | | | | _ _ _ _ (k=4),\n // we only need to output the indices at positions |, the indices at\n // positions _ can be thrown away, see Figure5(b) After Phase 2\n // (Merge phase) in the Bitonic Top K paper referenced above.\n // For example, the paper shows we only need to output the orange bars.\n // The output sequence should look like this | | | | | | | |.\n // Because the sequence is halved, to map the output index back\n // to the previous sequence to find the corresponding value,\n // we need to double the index. When we double the index,\n // we basically interpolate a position, so 2i looks like\n // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n // of each 2k positions by - elemIdx % k. E.g. for output at\n // index 4,5,6,7, we want to get the corresponding element at\n // original index 8,9,10,11, for output at index 8,9,10,11,\n // we want to get the corresponding element at original index\n // 16,17,18,19, so on and so forth.\n\n int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n float x0 = getX(batch, i0);\n float x1 = i1 < n ? getX(batch, i1) : x0;\n\n setOutput(x0 >= x1 ? float(i0) : float(i1));\n }\n "}}function Tq(e,t){null!==t&&e.disposeIntermediateTensorInfo(t)}function Iq(e){let t=1;for(;tl){const e=n.readSync(i.dataId),[t,a]=mL(e,u,i.dtype,s,r);return[n.makeTensorInfo(t.shape,t.dtype,t.values),n.makeTensorInfo(a.shape,a.dtype,a.values)]}if(0===s)return u[u.length-1]=0,[n.makeTensorInfo(u,i.dtype,[]),n.makeTensorInfo(u,"int32",[])];if(1===c)return[i,lU({attrs:{shape:u,dtype:"int32",value:0},backend:n})];const h=n.texData.get(i.dataId),d=null!==h&&h.isPacked,p=d?n.unpackTensor(i):i,m=zs(u)/c,f=fP({inputs:{x:p},attrs:{shape:[m,c]},backend:n});d&&Tq(n,p);const g=Iq(s),y=Iq(c);let b=null;const v=()=>null===b?[f,f]:[f,b],k=(e,t,a)=>{const i=v(),s=new Eq(a),r=[[c],[null===b?1:0],[Number.NEGATIVE_INFINITY],[e],[t]],o=b;b=n.runWebGLProgram(s,i,"int32",r),Tq(n,o)};for(let e=1;e=1;n/=2)k(t,n,[m,y])}for(let e=y;e>g;e/=2){const t=v(),a=new _q([m,e/2]),i=[[c],[null===b?1:0],[g]],s=b;b=n.runWebGLProgram(a,t,"int32",i),Tq(n,s);const r=g/2,o=2*r;for(let e=r;e>=1;e/=2)k(o,e,b.shape)}let w=b;b=Aj({inputs:{x:b},backend:n,attrs:{begin:0,size:[m,s]}}),Tq(n,w);let A=_U({inputs:{x:f,indices:b},backend:n,attrs:{axis:1,batchDims:1}});Tq(n,f);const x=u.slice(0,-1);x.push(s),w=b,b=fP({inputs:{x:b},attrs:{shape:x},backend:n}),Tq(n,w);const C=A;return A=fP({inputs:{x:A},attrs:{shape:x},backend:n}),Tq(n,C),[A,b]}};class Rq{constructor(e,t,n,a,i,s){this.variableNames=["Image","Transforms"],this.outputShape=s;const r="nearest"===n?1:2;let o;switch(a){case"constant":default:o=1;break;case"reflect":o=2;break;case"wrap":o=3;break;case"nearest":o=4}this.userCode=`\n float mapCoord(float outCoord, float len) {\n float inCoord = outCoord;\n if(${o} == 2) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n if (inCoord < sz2) {\n inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n inCoord;\n }\n inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz2 = 2.0 * len;\n inCoord -= sz2 * float(int(float(inCoord / sz2)));\n if (inCoord >= len) {\n inCoord = sz2 - inCoord - 1.0;\n }\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${o} == 3) {\n if (inCoord < 0.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n }\n } else if (inCoord > len - 1.0) {\n if (len <= 1.0) {\n inCoord = 0.0;\n } else {\n float sz = len - 1.0;\n inCoord -= len * float(int(float(inCoord / sz)));\n }\n }\n return clamp(inCoord, 0.0, len - 1.0);\n } else if (${o} == 4) {\n return clamp(outCoord, 0.0, len - 1.0);\n } else {\n return outCoord;\n }\n }\n\n float readWithFillValue(int batch, int coordY, int coordX,\n int channel) {\n float outputValue;\n if (0 <= coordY && coordY < ${e} && 0 <= coordX && coordX < ${t}) {\n outputValue = getImage(batch, coordY, coordX, channel);\n } else {\n outputValue = float(${i});\n }\n return outputValue;\n }\n\n void main() {\n ivec4 coords = getOutputCoords();\n float outputValue;\n int batch = coords[0];\n int x = coords[2];\n int y = coords[1];\n int channel = coords[3];\n float xf = float(x);\n float yf = float(y);\n float a1 = getTransforms(batch, 0);\n float a2 = getTransforms(batch, 1);\n float a3 = getTransforms(batch, 2);\n float b1 = getTransforms(batch, 3);\n float b2 = getTransforms(batch, 4);\n float b3 = getTransforms(batch, 5);\n float c1 = getTransforms(batch, 6);\n float c2 = getTransforms(batch, 7);\n float projection = c1 * xf + c2 * yf + 1.0;\n if (projection == 0.0) {\n outputValue = float(${i});\n } else {\n float inX = (a1 * xf + a2 * yf + a3) / projection;\n float inY = (b1 * xf + b2 * yf + b3) / projection;\n float mapX = mapCoord(inX, float(${t}));\n float mapY = mapCoord(inY, float(${e}));\n\n if (${r} == 1) {\n int coordY = int(round(mapY));\n int coordX = int(round(mapX));\n outputValue = readWithFillValue(batch, coordY, coordX,\n channel);\n } else {\n float yFloor = floor(mapY);\n float xFloor = floor(mapX);\n float yCeil = yFloor + 1.0;\n float xCeil = xFloor + 1.0;\n float valueYFloor = (xCeil - mapX) *\n readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n float valueYCeil = (xCeil - mapX) *\n readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n (mapX - xFloor) *\n readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n outputValue = (yCeil - mapY) * valueYFloor +\n (mapY - yFloor) * valueYCeil;\n }\n }\n setOutput(outputValue);\n }\n `}}const Dq={kernelName:fu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{image:i,transforms:s}=t,{interpolation:r,fillMode:o,fillValue:l,outputShape:u}=a,[c,h,d,p]=i.shape,[m,f]=null!=u?u:[h,d],g=new Rq(h,d,r,o,l,[c,m,f,p]);return n.runWebGLProgram(g,[i,s],"float32")}};const zq={kernelName:yu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,attrs:n,backend:a}=e,{axis:i}=n,{x:s}=t;RB(s,"unique");const r=a.readSync(s.dataId),{outputValues:o,outputShape:l,indices:u}=gL(r,i,s.shape,s.dtype);return[a.makeTensorInfo(l,s.dtype,o),a.makeTensorInfo([u.length],"int32",u)]}};const Oq={kernelName:bu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{value:i}=t;let{axis:s}=a;s<0&&(s+=i.shape.length);const r=i,o=r.shape.length,l=i.shape[s],u=new Array(o-1);let c=0;for(let e=0;en.disposeIntermediateTensorInfo(e))),m}};class Mq{constructor(e,t){this.variableNames=["x","segmentIds"];const n=e.windowSize,a=e.batchSize,i=e.inSize,s=e.numSegments,r=s*Math.ceil(i/n);this.outputShape=[a,r];const o=4*Math.floor(n/4),l=n%4,u="\n sumValue += dot(values, segFilter);\n ";let c="";i%n>0&&(c=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return initializationValue;\n }\n `);let h="";i%n>0&&(h=`\n if (inIdx < 0 || inIdx >= ${i}) {\n return -1.0;\n }\n `),this.userCode=`\n const float initializationValue = 0.0;\n\n float getValue(int batch, int inIdx) {\n ${c}\n return getX(batch, inIdx);\n }\n\n float getSegmentIdAtIndex(int inIdx) {\n ${h}\n return getSegmentIds(inIdx);\n }\n\n void main() {\n ivec2 coords = getOutputCoords();\n int batch = coords[0];\n int outIdx = coords[1];\n int inOffset = int(floor(float(outIdx) / float(\n ${s})) * float(${n}));\n int currentSeg = int(mod(float(outIdx), float(${s})));\n\n float sumValue = 0.0;\n\n for (int i = 0; i < ${o}; i += 4) {\n int inIdx = inOffset + i;\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n getValue(batch, inIdx + 3)\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n );\n\n ${u}\n }\n\n int inIdx = inOffset + ${o};\n if (${1===l}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n initializationValue,\n initializationValue,\n initializationValue\n );\n\n int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${2===l}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n initializationValue,\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n 0,\n 0\n );\n\n ${u}\n } else if (${3===l}) {\n vec4 values = vec4(\n getValue(batch, inIdx),\n getValue(batch, inIdx + 1),\n getValue(batch, inIdx + 2),\n initializationValue\n );\n\n vec4 segFilter = vec4(\n int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n 0\n );\n\n ${u}\n }\n setOutput(sumValue);\n }\n `}}const Bq={kernelName:vu,backendName:"webgl",kernelFunc:function(e){const{inputs:t,backend:n,attrs:a}=e,{x:i,segmentIds:s}=t,{numSegments:r}=a,o=i.shape.length,l=[];let u=0;const c=vf([u],o);let h=i;null!=c&&(h=SP({inputs:{x:i},backend:n,attrs:{perm:c}}),l.push(h),u=wf(1,o)[0]);const d=dk(h.shape,u,r),p=zs([h.shape[u]]),m=fP({inputs:{x:h},backend:n,attrs:{shape:[-1,p]}});l.push(m);const f=Mc(i.dtype),g=(e,t,a,i,s)=>{const r=e.shape[0],o=e.shape[1],u=hk(o,s),c=new Mq({windowSize:u,inSize:o,batchSize:r,numSegments:s},t),h=n.compileAndRun(c,[e,a],i);if(l.push(h),h.shape[1]===s)return h;const d=sG({backend:n,attrs:{start:0,stop:s,step:1,dtype:"float32"}}),p=Cq({inputs:{x:d},backend:n,attrs:{reps:[o/u]}});l.push(d),l.push(p);return g(h,t,p,i,s)},y=fP({inputs:{x:g(m,"unsortedSegmentSum",s,f,r)},backend:n,attrs:{shape:d}});let b=y;if(null!=c){l.push(y);const e=kf(c);b=SP({inputs:{x:b},backend:n,attrs:{perm:e}})}return l.forEach((e=>n.disposeIntermediateTensorInfo(e))),b}},Fq=[IP,RP,zP,MP,LP,VP,UP,WP,ZP,XP,QP,ej,nj,ij,rj,uj,cj,pj,mj,fj,bj,Cj,Sj,Ej,_j,zj,Bj,Pj,QL,Uj,Xj,iV,uV,hV,dV,pV,mV,gV,bV,kV,_V,TV,IV,RV,OV,FV,LV,jV,UV,WV,qV,HV,$V,XV,QV,eU,aU,rU,uU,hU,mU,gU,vU,AU,xU,SU,TU,NU,DU,XL,zU,Kj,MU,FU,PU,tP,VU,WU,GU,HU,$U,XU,QU,eW,aW,sW,oW,uW,cW,hW,mW,fW,gW,yW,bW,kW,xW,SW,OW,mP,BW,LW,jW,UW,Ij,GW,KW,$W,QW,eG,iP,tG,nG,aG,iG,rG,Rj,TW,lG,cG,dG,gP,fG,yG,kG,AG,SG,_G,IG,RG,OG,BG,LG,jG,UG,GG,HG,$G,xj,zW,XG,YG,QG,JG,eq,tq,nq,aq,rq,oq,cq,hq,dq,mq,fq,gq,yq,RW,CP,vq,wq,Aq,Sq,Nq,Dq,EP,zq,Oq,Bq,HW];for(const e of Fq)Ou(e);__webpack_require__(9464);const Lq={moveTickSize:50,videoContainerId:"webgazerVideoContainer",videoElementId:"webgazerVideoFeed",videoElementCanvasId:"webgazerVideoCanvas",faceOverlayId:"webgazerFaceOverlay",faceFeedbackBoxId:"webgazerFaceFeedbackBox",gazeDotId:"webgazerGazeDot",videoViewerWidth:320,videoViewerHeight:240,faceFeedbackBoxRatio:.66,showVideo:!0,mirrorVideo:!0,showFaceOverlay:!0,showFaceFeedbackBox:!0,showGazeDot:!0,camConstraints:{video:{width:{min:320,ideal:640,max:1920},height:{min:240,ideal:480,max:1080},facingMode:"user"}},dataTimestep:50,showVideoPreview:!0,applyKalmanFilter:!0,saveDataAcrossSessions:!0,storingPoints:!1,videoIsOn:!1,trackEye:"both"};__webpack_require__(6003);var Pq=__webpack_require__(7350),jq=__webpack_require__.n(Pq),Vq=__webpack_require__(8990),Uq=function(){return Uq=Object.assign||function(e){for(var t,n=1,a=arguments.length;n0&&i[i.length-1])||6!==s[0]&&2!==s[0])){r=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]>>0)+"_",i=0;return function e(n){if(this instanceof e)throw new TypeError("Symbol is not a constructor");return new t(a+(n||"")+"_"+i++,n)}})),i("Symbol.iterator",(function(e){if(e)return e;e=Symbol("Symbol.iterator");for(var i="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),r=0;r(t=t||0)&&(t=Math.max(t+a,0));t>2];r=t[(3&r)<<4|o>>4],o=t[(15&o)<<2|l>>6],l=t[63&l],n[s++]=u+r+o+l}switch(u=0,l=a,e.length-i){case 2:l=t[(15&(u=e[i+1]))<<2]||a;case 1:e=e[i],n[s]=t[e>>2]+t[(3&e)<<4|u>>4]+l+a}return n.join("")}function M(e){var t=e.length,n=3*t/4;n%3?n=Math.floor(n):-1!="=.".indexOf(e[t-1])&&(n=-1!="=.".indexOf(e[t-2])?n-2:n-1);var a=new Uint8Array(n),i=0;return function(e,t){function n(t){for(;a>4),64!=r&&(t(s<<4&240|r>>2),64!=o&&t(r<<6&192|o))}}(e,(function(e){a[i++]=e})),i!==n?a.subarray(0,i):a}function B(){if(!z){z={};for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),t=["+/=","+/","-_=","-_.","-_"],n=0;5>n;n++){var a=e.concat(t[n].split(""));D[n]=a;for(var i=0;ie.i)throw Error("Tried to read past the end of the data "+e.g+" > "+e.i)}function $(e){var t=e.h,n=t[e.g],a=127&n;if(128>n)return e.g+=1,K(e),a;if(a|=(127&(n=t[e.g+1]))<<7,128>n)return e.g+=2,K(e),a;if(a|=(127&(n=t[e.g+2]))<<14,128>n)return e.g+=3,K(e),a;if(a|=(127&(n=t[e.g+3]))<<21,128>n)return e.g+=4,K(e),a;if(n=t[e.g+4],e.g+=5,a|=(15&n)<<28,128>n)return K(e),a;if(128<=t[e.g++]&&128<=t[e.g++]&&128<=t[e.g++]&&128<=t[e.g++]&&128<=t[e.g++])throw G();return K(e),a}q.prototype.reset=function(){this.g=this.j};var Z=[];function X(){this.g=[]}function Y(e,t){for(;127>>=7;e.g.push(t)}function Q(e){var t={},n=void 0!==t.W&&t.W;this.l={v:void 0!==t.v&&t.v},this.W=n,t=this.l,Z.length?(n=Z.pop(),t&&(n.v=t.v),e&&H(n,e),e=n):e=new q(e,t),this.g=e,this.j=this.g.g,this.h=this.i=-1}function J(e){var t=e.g;if(t.g==t.i)return!1;e.j=e.g.g;var n=$(e.g)>>>0;if(t=n>>>3,!(0<=(n&=7)&&5>=n))throw W(n,e.j);if(1>t)throw Error("Invalid field number: "+t+" (at position "+e.j+")");return e.i=t,e.h=n,!0}function ee(e){switch(e.h){case 0:if(0!=e.h)ee(e);else e:{for(var t=(e=e.g).g,n=t+10;t>>0,(e=e.g).g+=t,K(e));break;case 5:(e=e.g).g+=4,K(e);break;case 3:for(t=e.i;;){if(!J(e))throw Error("Unmatched start-group tag: stream EOF");if(4==e.h){if(e.i!=t)throw Error("Unmatched end-group tag");break}ee(e)}break;default:throw W(e.h,e.j)}}X.prototype.length=function(){return this.g.length},X.prototype.end=function(){var e=this.g;return this.g=[],e},Q.prototype.reset=function(){this.g.reset(),this.j=this.g.g,this.h=this.i=-1};var te=[];function ne(){this.i=[],this.h=0,this.g=new X}function ae(e,t){0!==t.length&&(e.i.push(t),e.h+=t.length)}var ie="function"==typeof Symbol&&"symbol"==typeof Symbol()?Symbol(void 0):void 0;function se(e,t){Object.isFrozen(e)||(ie?e[ie]|=t:void 0!==e.N?e.N|=t:Object.defineProperties(e,{N:{value:t,configurable:!0,writable:!0,enumerable:!1}}))}function re(e){var t;return null==(t=ie?e[ie]:e.N)?0:t}function oe(e){return se(e,1),e}function le(e){return!!Array.isArray(e)&&!!(2&re(e))}function ue(e){if(!Array.isArray(e))throw Error("cannot mark non-array as immutable");se(e,2)}function ce(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)&&e.constructor===Object}var he=Object.freeze(oe([]));function de(e){if(le(e.m))throw Error("Cannot mutate an immutable Message")}var pe,me="undefined"!=typeof Symbol&&void 0!==Symbol.hasInstance;function fe(e){return{value:e,configurable:!1,writable:!1,enumerable:!1}}function ge(e,t,n){return-1===t?null:t>=e.i?e.g?e.g[t]:void 0:void 0!==n&&n&&e.g&&null!=(n=e.g[t])?n:e.m[t+e.h]}function ye(e,t,n,a){a=void 0!==a&&a,de(e),tte.length&&te.push(e)}}function tt(e,t,n){for(var a=n.length,i=1==a%2,s=i?1:0;s>>0)>>31)+1,a=i>>>23&255,i&=8388607,ye(t,n,255==a?i?NaN:1/0*e:0==a?e*Math.pow(2,-149)*i:e*Math.pow(2,a-150)*(i+Math.pow(2,23))),!0}),(function(e,t,n){if(null!=(t=ge(t,n))){Y(e.g,8*n+5),e=e.g;var a=t;0===(a=(n=0>a?1:0)?-a:a)?U=0<1/a?0:2147483648:isNaN(a)?U=2147483647:34028234663852886e22>>0:11754943508222875e-54>a?(a=Math.round(a/Math.pow(2,-149)),U=(n<<31|a)>>>0):(t=Math.floor(Math.log(a)/Math.LN2),a*=Math.pow(2,-t),16777216<=(a=Math.round(8388608*a))&&++t,U=(n<<31|t+127<<23|8388607&a)>>>0),n=U,e.g.push(n>>>0&255),e.g.push(n>>>8&255),e.g.push(n>>>16&255),e.g.push(n>>>24&255)}})),st=at((function(e,t,n){if(0!==e.h)return!1;for(var a=e.g,i=128,s=0,r=e=0;4>r&&128<=i;r++)i=a.h[a.g++],K(a),s|=(127&i)<<7*r;if(128<=i&&(i=a.h[a.g++],K(a),s|=(127&i)<<28,e|=(127&i)>>4),128<=i)for(r=0;5>r&&128<=i;r++)i=a.h[a.g++],K(a),e|=(127&i)<<7*r+3;if(!(128>i))throw G();return a=s>>>0,(e=2147483648&(i=e>>>0))&&(i=~i>>>0,0==(a=1+~a>>>0)&&(i=i+1>>>0)),a=4294967296*i+(a>>>0),ye(t,n,e?-a:a),!0}),(function(e,t,n){if(null!=(t=ge(t,n))&&null!=t){Y(e.g,8*n),e=e.g;var a=t;for(n=0>a,t=(a=Math.abs(a))>>>0,a=Math.floor((a-t)/4294967296),a>>>=0,n&&(a=~a>>>0,4294967295<(t=1+(~t>>>0))&&(t=0,4294967295<++a&&(a=0))),n=U=t,t=a;0>>7|t<<25)>>>0,t>>>=7;e.g.push(n)}})),rt=at((function(e,t,n){return 0===e.h&&(ye(t,n,$(e.g)),!0)}),(function(e,t,n){if(null!=(t=ge(t,n))&&null!=t)if(Y(e.g,8*n),e=e.g,0<=(n=t))Y(e,n);else{for(t=0;9>t;t++)e.g.push(127&n|128),n>>=7;e.g.push(1)}})),ot=at((function(e,t,n){if(2!==e.h)return!1;var a,i=$(e.g)>>>0,s=(e=e.g).g;if(e.g+=i,K(e),e=e.h,N)(a=T)||(a=T=new TextDecoder("utf-8",{fatal:!0})),a=a.decode(e.subarray(s,s+i));else{i=s+i;for(var r,o,l,u=[],c=null;s(r=e[s++])?u.push(r):224>r?s>=i?E():(o=e[s++],194>r||128!=(192&o)?(s--,E()):u.push((31&r)<<6|63&o)):240>r?s>=i-1?E():128!=(192&(o=e[s++]))||224===r&&160>o||237===r&&160<=o||128!=(192&(a=e[s++]))?(s--,E()):u.push((15&r)<<12|(63&o)<<6|63&a):244>=r?s>=i-2?E():128!=(192&(o=e[s++]))||o-144+(r<<28)>>30||128!=(192&(a=e[s++]))||128!=(192&(l=e[s++]))?(s--,E()):(r=(7&r)<<18|(63&o)<<12|(63&a)<<6|63&l,r-=65536,u.push(55296+(r>>10&1023),56320+(1023&r))):E(),8192<=u.length&&(c=_(c,u),u.length=0);a=_(c,u)}return ye(t,n,a),!0}),(function(e,t,n){if(null!=(t=ge(t,n))){var a=!1;if(a=void 0!==a&&a,R){if(a&&/(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])/.test(t))throw Error("Found an unpaired surrogate");t=(I||(I=new TextEncoder)).encode(t)}else{for(var i=0,s=new Uint8Array(3*t.length),r=0;ro)s[i++]=o;else{if(2048>o)s[i++]=o>>6|192;else{if(55296<=o&&57343>=o){if(56319>=o&&r=l){o=1024*(o-55296)+l-56320+65536,s[i++]=o>>18|240,s[i++]=o>>12&63|128,s[i++]=o>>6&63|128,s[i++]=63&o|128;continue}r--}if(a)throw Error("Found an unpaired surrogate");o=65533}s[i++]=o>>12|224,s[i++]=o>>6&63|128}s[i++]=63&o|128}}t=s.subarray(0,i)}Y(e.g,8*n+2),Y(e.g,t.length),ae(e,e.g.end()),ae(e,t)}})),lt=at((function(e,t,n,a,i){if(2!==e.h)return!1;t=we(t,n,a),n=e.g.i,a=$(e.g)>>>0;var s=e.g.g+a,r=s-n;if(0>=r&&(e.g.i=s,i(t,e),r=s-e.g.g),r)throw Error("Message parsing ended unexpectedly. Expected to read "+a+" bytes, instead read "+(a-r)+" bytes, either the data ended unexpectedly or the message misreported its own length");return e.g.g=s,e.g.i=n,!0}),(function(e,t,n,a,i){if(null!=(t=ke(t,a,n)))for(a=0;a>>=7,r.h++;s.push(o),r.h++}}));function ut(){Ne.apply(this,arguments)}if(p(ut,Ne),me){var ct={};Object.defineProperties(ut,(ct[Symbol.hasInstance]=fe(Object[Symbol.hasInstance]),ct))}function ht(e){ut.call(this,e)}function dt(){return[1,rt,2,it,3,ot,4,ot]}function pt(e){ut.call(this,e,-1,ft)}function mt(){return[1,lt,ht,dt]}p(ht,ut),p(pt,ut),pt.prototype.addClassification=function(e,t){return we(this,1,ht,e,t),this};var ft=[1];function gt(e){ut.call(this,e)}function yt(){return[1,it,2,it,3,it,4,it,5,it]}function bt(e){ut.call(this,e,-1,kt)}function vt(){return[1,lt,gt,yt]}p(gt,ut),p(bt,ut);var kt=[1];function wt(e){ut.call(this,e)}function At(){return[1,it,2,it,3,it,4,it,5,it,6,st]}p(wt,ut);var xt=[[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]],Ct=[[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]],St=[[276,283],[283,282],[282,295],[295,285],[300,293],[293,334],[334,296],[296,336]],Et=[[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]],_t=[[46,53],[53,52],[52,65],[65,55],[70,63],[63,105],[105,66],[66,107]],Tt=[[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]],It=[].concat(o(xt),o(Ct),o(St),o(Et),o(_t),o(Tt));function Nt(e,t,n){if(n=e.createShader(0===n?e.VERTEX_SHADER:e.FRAGMENT_SHADER),e.shaderSource(n,t),e.compileShader(n),!e.getShaderParameter(n,e.COMPILE_STATUS))throw Error("Could not compile WebGL shader.\n\n"+e.getShaderInfoLog(n));return n}function Rt(e){return ke(e,ht,1).map((function(e){return{index:Ae(e,1),ga:ve(e,2),label:null!=ge(e,3)?xe(e,3):void 0,displayName:null!=ge(e,4)?xe(e,4):void 0}}))}function Dt(e){return{x:ve(e,1),y:ve(e,2),z:ve(e,3),visibility:null!=ge(e,4)?ve(e,4):void 0}}function zt(e,t){this.h=e,this.g=t,this.l=0}function Ot(e,t,n){return function(e,t){var n=e.g;if(void 0===e.o){var a=Nt(n,"\n attribute vec2 aVertex;\n attribute vec2 aTex;\n varying vec2 vTex;\n void main(void) {\n gl_Position = vec4(aVertex, 0.0, 1.0);\n vTex = aTex;\n }",0),i=Nt(n,"\n precision mediump float;\n varying vec2 vTex;\n uniform sampler2D sampler0;\n void main(){\n gl_FragColor = texture2D(sampler0, vTex);\n }",1),s=n.createProgram();if(n.attachShader(s,a),n.attachShader(s,i),n.linkProgram(s),!n.getProgramParameter(s,n.LINK_STATUS))throw Error("Could not compile WebGL program.\n\n"+n.getProgramInfoLog(s));a=e.o=s,n.useProgram(a),i=n.getUniformLocation(a,"sampler0"),e.j={K:n.getAttribLocation(a,"aVertex"),J:n.getAttribLocation(a,"aTex"),ma:i},e.u=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,e.u),n.enableVertexAttribArray(e.j.K),n.vertexAttribPointer(e.j.K,2,n.FLOAT,!1,0,0),n.bufferData(n.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,1,1,-1]),n.STATIC_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null),e.s=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,e.s),n.enableVertexAttribArray(e.j.J),n.vertexAttribPointer(e.j.J,2,n.FLOAT,!1,0,0),n.bufferData(n.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,0,1,1]),n.STATIC_DRAW),n.bindBuffer(n.ARRAY_BUFFER,null),n.uniform1i(i,0)}a=e.j,n.useProgram(e.o),n.canvas.width=t.width,n.canvas.height=t.height,n.viewport(0,0,t.width,t.height),n.activeTexture(n.TEXTURE0),e.h.bindTexture2d(t.glName),n.enableVertexAttribArray(a.K),n.bindBuffer(n.ARRAY_BUFFER,e.u),n.vertexAttribPointer(a.K,2,n.FLOAT,!1,0,0),n.enableVertexAttribArray(a.J),n.bindBuffer(n.ARRAY_BUFFER,e.s),n.vertexAttribPointer(a.J,2,n.FLOAT,!1,0,0),n.bindFramebuffer(n.DRAW_FRAMEBUFFER?n.DRAW_FRAMEBUFFER:n.FRAMEBUFFER,null),n.clearColor(0,0,0,0),n.clear(n.COLOR_BUFFER_BIT),n.colorMask(!0,!0,!0,!0),n.drawArrays(n.TRIANGLE_FAN,0,4),n.disableVertexAttribArray(a.K),n.disableVertexAttribArray(a.J),n.bindBuffer(n.ARRAY_BUFFER,null),e.h.bindTexture2d(0)}(e,t),"function"==typeof e.g.canvas.transferToImageBitmap?Promise.resolve(e.g.canvas.transferToImageBitmap()):n?Promise.resolve(e.g.canvas):"function"==typeof createImageBitmap?createImageBitmap(e.g.canvas):(void 0===e.i&&(e.i=document.createElement("canvas")),new Promise((function(t){e.i.height=e.g.canvas.height,e.i.width=e.g.canvas.width,e.i.getContext("2d",{}).drawImage(e.g.canvas,0,0,e.g.canvas.width,e.g.canvas.height),t(e.i)})))}function Mt(e){this.g=e}var Bt=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11]);function Ft(e,t){return t+e}function Lt(e,t){window[e]=t}function Pt(e){if(this.g=e,this.listeners={},this.j={},this.H={},this.o={},this.u={},this.I=this.s=this.Z=!0,this.D=Promise.resolve(),this.Y="",this.C={},this.locateFile=e&&e.locateFile||Ft,"object"==typeof window)var t=window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/";else{if("undefined"==typeof location)throw Error("solutions can only be loaded on a web page or in a web worker");t=location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/"}if(this.$=t,e.options)for(var n=(t=r(Object.keys(e.options))).next();!n.done;n=t.next()){n=n.value;var a=e.options[n].default;void 0!==a&&(this.j[n]="function"==typeof a?a():a)}}function jt(e,t){var n,a;return A((function(i){return t in e.H?i.return(e.H[t]):(n=e.locateFile(t,""),a=fetch(n).then((function(e){return e.arrayBuffer()})),e.H[t]=a,i.return(a))}))}function Vt(e,t,n){var a,i,s,o,l,u,c,h,d,p,m,f,g,b;return A((function(v){switch(v.g){case 1:if(!n)return v.return(t);for(a={},i=0,s=r(Object.keys(n)),o=s.next();!o.done;o=s.next())l=o.value,"string"!=typeof(u=n[l])&&"texture"===u.type&&void 0!==t[u.stream]&&++i;10&&i[i.length-1])||6!==s[0]&&2!==s[0])){r=0;continue}if(3===s[0]&&(!i||s[1]>i[0]&&s[1]0){var c=o===e.strides.length-1?1:pH(e.minScale,e.maxScale,o+1,e.strides.length);r.push(Math.sqrt(l*c)),s.push(e.interpolatedScaleAspectRatio)}}o++}for(var h=0;h0)p=e.featureMapHeight[n],m=e.featureMapWidth[n];else{var f=e.strides[n];p=Math.ceil(e.inputSizeHeight/f),m=Math.ceil(e.inputSizeWidth/f)}for(var g=0;g-1})),ph([a,i,s]),[2,o]}}))}))}function gH(e,t,n){return aH(this,void 0,void 0,(function(){var a,i,s,r,o;return iH(this,(function(l){switch(l.label){case 0:return a=e[0],i=e[1],s=function(e,t,n){return dh((function(){var a,i,s,r;n.reverseOutputOrder?(i=ky(Sm(e,[0,n.boxCoordOffset+0],[-1,1])),a=ky(Sm(e,[0,n.boxCoordOffset+1],[-1,1])),r=ky(Sm(e,[0,n.boxCoordOffset+2],[-1,1])),s=ky(Sm(e,[0,n.boxCoordOffset+3],[-1,1]))):(a=ky(Sm(e,[0,n.boxCoordOffset+0],[-1,1])),i=ky(Sm(e,[0,n.boxCoordOffset+1],[-1,1])),s=ky(Sm(e,[0,n.boxCoordOffset+2],[-1,1])),r=ky(Sm(e,[0,n.boxCoordOffset+3],[-1,1]))),i=xd(Ed(Sd(i,n.xScale),t.w),t.x),a=xd(Ed(Sd(a,n.yScale),t.h),t.y),n.applyExponentialOnBoxSize?(s=Ed(Tf(Sd(s,n.hScale)),t.h),r=Ed(Tf(Sd(r,n.wScale)),t.w)):(s=Ed(Sd(s,n.hScale),t.h),r=Ed(Sd(r,n.wScale),t.h));var o=Ud(a,Sd(s,2)),l=Ud(i,Sd(r,2)),u=xd(a,Sd(s,2)),c=xd(i,Sd(r,2)),h=Am([vm(o,[n.numBoxes,1]),vm(l,[n.numBoxes,1]),vm(u,[n.numBoxes,1]),vm(c,[n.numBoxes,1])],1);if(n.numKeypoints)for(var d=0;d0)for((c=l.locationData).relativeKeypoints=[],h=n.numKeypoints*n.numValuesPerKeypoint,d=0;dl?(s=e.width,r=e.width*o,c=(1-l/o)/2):(s=e.height/o,r=e.height,u=(1-o/l)/2),e.width=s,e.height=r,{top:c,left:u,right:u,bottom:c}}(l,a,i),c=function(e,t,n,a){var i=e.width,s=e.height,r=Math.cos(e.rotation),o=Math.sin(e.rotation),l=e.xCenter,u=e.yCenter,c=1/t,h=1/n,d=new Array(16);return d[0]=i*r*1*c,d[1]=-s*o*c,d[2]=0,d[3]=(-.5*i*r*1+.5*s*o+l)*c,d[4]=i*o*1*h,d[5]=s*r*h,d[6]=0,d[7]=(-.5*s*r-.5*i*o*1+u)*h,d[8]=0,d[9]=0,d[10]=i*c,d[11]=0,d[12]=0,d[13]=0,d[14]=0,d[15]=1,function(e){if(16!==e.length)throw new Error("Array length must be 16 but got "+e.length);return[[e[0],e[1],e[2],e[3]],[e[4],e[5],e[6],e[7]],[e[8],e[9],e[10],e[11]],[e[12],e[13],e[14],e[15]]]}(d)}(l,o.width,o.height),h=dh((function(){var t=cH(e),n=Ey(function(e,t,n){return hH(n,"inputResolution"),[1/n.width*e[0][0]*t.width,1/n.height*e[0][1]*t.width,e[0][3]*t.width,1/n.width*e[1][0]*t.height,1/n.height*e[1][1]*t.height,e[1][3]*t.height,0,0]}(c,o,a),[1,8]),i="zero"===s?"constant":"nearest",l=tv.transform(If(kd(t,"float32")),n,"bilinear",i,0,[a.height,a.width]);return null!=r?function(e,t){var n=function(e,t,n,a){var i=(a-n)/255;return{scale:i,offset:n-0*i}}(0,0,t[0],t[1]);return dh((function(){return xd(Ed(e,n.scale),n.offset)}))}(l,r):l}));return{imageTensor:h,padding:u,transformationMatrix:c}}(n,this.imageToTensorConfig),i=a.imageTensor,s=a.transformationMatrix,r=this.detectorModel.execute(i,"Identity:0"),o=function(e){return dh((function(){var t=function(e){return dh((function(){return[Sm(e,[0,0,0],[1,-1,1]),Sm(e,[0,0,1],[1,-1,-1])]}))}(e),n=t[0],a=t[1];return{boxes:ky(a),logits:ky(n)}}))}(r),l=o.boxes,[4,gH([u=o.logits,l],this.anchorTensor,this.tensorsToDetectionConfig)]);case 1:return 0===(c=p.sent()).length?(ph([n,i,r,u,l]),[2,c]):[4,fH(c,this.maxFaces,.3)];case 2:return h=p.sent(),d=function(e,t){void 0===e&&(e=[]);var n,a=(n=t,[].concat.apply([],n));return e.forEach((function(e){var t=e.locationData;t.relativeKeypoints.forEach((function(e){var t=mH(a,[e.x,e.y]),n=t[0],i=t[1];e.x=n,e.y=i}));var n=t.relativeBoundingBox,i=Number.MAX_VALUE,s=Number.MAX_VALUE,r=Number.MIN_VALUE,o=Number.MIN_VALUE;[[n.xMin,n.yMin],[n.xMin+n.width,n.yMin],[n.xMin+n.width,n.yMin+n.height],[n.xMin,n.yMin+n.height]].forEach((function(e){var t=mH(a,e),n=t[0],l=t[1];i=Math.min(i,n),r=Math.max(r,n),s=Math.min(s,l),o=Math.max(o,l)})),t.relativeBoundingBox={xMin:i,xMax:r,yMin:s,yMax:o,width:r-i,height:o-s}})),e}(h,s),ph([n,i,r,u,l]),[2,d]}}))}))},e.prototype.estimateFaces=function(e,t){return aH(this,void 0,void 0,(function(){var n,a;return iH(this,(function(i){return n=uH(e),a=!!t&&t.flipHorizontal,[2,this.detectFaces(e,a).then((function(e){return e.map((function(e){for(var t=e.locationData.relativeKeypoints.map((function(e,t){return nH(nH({},e),{x:e.x*n.width,y:e.y*n.height,name:sH[t]})})),a=e.locationData.relativeBoundingBox,i=0,s=["width","xMax","xMin"];i-1,[4,UT(t.detectorModelUrl,{fromTFHub:n})];case 1:return a=i.sent(),[2,new _H(t.modelType,a,t.maxFaces)]}}))}))}function IH(e,t){return aH(this,void 0,void 0,(function(){var n,a;return iH(this,(function(i){if(e===vH.MediaPipeFaceDetector){if(a=void 0,null!=(n=t)){if("tfjs"===n.runtime)return[2,TH(n)];if("mediapipe"===n.runtime)return[2,lH(n)];a=n.runtime}throw new Error("Expect modelConfig.runtime to be either 'tfjs' or 'mediapipe', but got "+a)}throw new Error(e+" is not a supported model name.")}))}))}function NH(e){return e.width*e.height}function RH(e){var t=e.xCenter-e.width/2,n=t+e.width,a=e.yCenter-e.height/2;return{xMin:t,xMax:n,yMin:a,yMax:a+e.height,width:e.width,height:e.height}}function DH(e){return e instanceof kc?{height:e.shape[0],width:e.shape[1]}:{height:e.height,width:e.width}}function zH(e){return e-2*Math.PI*Math.floor((e+Math.PI)/(2*Math.PI))}function OH(e){return e instanceof kc?e:Ep(e)}function MH(e,t){Ns(0!==e.width,(function(){return t+" width cannot be 0."})),Ns(0!==e.height,(function(){return t+" height cannot be 0."}))}function BH(e,t,n){var a=t.outputTensorSize,i=t.keepAspectRatio,s=t.borderMode,r=t.outputTensorFloatRange,o=DH(e),l=function(e,t){return t?{xCenter:t.xCenter*e.width,yCenter:t.yCenter*e.height,width:t.width*e.width,height:t.height*e.height,rotation:t.rotation}:{xCenter:.5*e.width,yCenter:.5*e.height,width:e.width,height:e.height,rotation:0}}(o,n),u=function(e,t,n){if(void 0===n&&(n=!1),!n)return{top:0,left:0,right:0,bottom:0};var a=t.height,i=t.width;MH(t,"targetSize"),MH(e,"roi");var s,r,o=a/i,l=e.height/e.width,u=0,c=0;return o>l?(s=e.width,r=e.width*o,c=(1-l/o)/2):(s=e.height/o,r=e.height,u=(1-o/l)/2),e.width=s,e.height=r,{top:c,left:u,right:u,bottom:c}}(l,a,i),c=function(e,t,n,a){var i=e.width,s=e.height,r=a?-1:1,o=Math.cos(e.rotation),l=Math.sin(e.rotation),u=e.xCenter,c=e.yCenter,h=1/t,d=1/n,p=new Array(16);return p[0]=i*o*r*h,p[1]=-s*l*h,p[2]=0,p[3]=(-.5*i*o*r+.5*s*l+u)*h,p[4]=i*l*r*d,p[5]=s*o*d,p[6]=0,p[7]=(-.5*s*o-.5*i*l*r+c)*d,p[8]=0,p[9]=0,p[10]=i*h,p[11]=0,p[12]=0,p[13]=0,p[14]=0,p[15]=1,function(e){if(16!==e.length)throw new Error("Array length must be 16 but got "+e.length);return[[e[0],e[1],e[2],e[3]],[e[4],e[5],e[6],e[7]],[e[8],e[9],e[10],e[11]],[e[12],e[13],e[14],e[15]]]}(p)}(l,o.width,o.height,!1),h=dh((function(){var t=OH(e),n=Ey(function(e,t,n){return MH(n,"inputResolution"),[1/n.width*e[0][0]*t.width,1/n.height*e[0][1]*t.width,e[0][3]*t.width,1/n.width*e[1][0]*t.height,1/n.height*e[1][1]*t.height,e[1][3]*t.height,0,0]}(c,o,a),[1,8]),i="zero"===s?"constant":"nearest",l=tv.transform(If(kd(t,"float32")),n,"bilinear",i,0,[a.height,a.width]);return null!=r?function(e,t){var n=function(e,t,n,a){var i=(a-n)/255;return{scale:i,offset:n-0*i}}(0,0,t[0],t[1]);return dh((function(){return xd(Ed(e,n.scale),n.offset)}))}(l,r):l}));return{imageTensor:h,padding:u,transformationMatrix:c}}function FH(e){return{xCenter:e.xMin+e.width/2,yCenter:e.yMin+e.height/2,width:e.width,height:e.height}}function LH(e){var t=e.relativeKeypoints;if(t.length<=1)throw new Error("2 or more keypoints required to calculate a rect.");var n=Number.MAX_VALUE,a=Number.MAX_VALUE,i=Number.MIN_VALUE,s=Number.MIN_VALUE;return t.forEach((function(e){n=Math.min(n,e.x),i=Math.max(i,e.x),a=Math.min(a,e.y),s=Math.max(s,e.y)})),{xCenter:(n+i)/2,yCenter:(a+s)/2,width:i-n,height:s-a}}function PH(e,t,n,a,i){var s="rect"===n?function(e,t,n){var a,i=e.locationData;if("boundingbox"===t)a=FH(i.boundingBox);else{a=LH(i);var s=n.width,r=n.height;a.xCenter=Math.round(a.xCenter*s),a.yCenter=Math.round(a.yCenter*r),a.width=Math.round(a.width*s),a.height=Math.round(a.height*r)}return a}(e,t,a):function(e,t){var n=e.locationData;return"boundingbox"===t?FH(n.relativeBoundingBox):LH(n)}(e,t);return i&&(s.rotation=function(e,t,n){var a,i=e.locationData,s=n.rotationVectorStartKeypointIndex,r=n.rotationVectorEndKeypointIndex;a=n.rotationVectorTargetAngle?n.rotationVectorTargetAngle:Math.PI*n.rotationVectorTargetAngleDegree/180;var o=i.relativeKeypoints[s].x*t.width,l=i.relativeKeypoints[s].y*t.height,u=i.relativeKeypoints[r].x*t.width,c=i.relativeKeypoints[r].y*t.height;return zH(a-Math.atan2(-(c-l),u-o))}(e,a,i)),s}function jH(e,t,n){for(var a=0;a1&&(h.y=a?t.inputImageHeight-r[u+1]:r[u+1]),s>2&&(h.z=r[u+2]),s>3&&(h.score=GH(t.visibilityActivation,r[u+3])),o.push(h);for(c=0;c0?i/s:0}(e,t)<=.5}))).push(e)}))})),l=y,[4,Promise.all(l.map((function(e){return f.faceLandmark(e,i)})))];case 4:for(u=g.sent(),c=[],this.prevFaceRectsFromLandmarks=[],h=0;h-1,[4,UT(t.landmarkModelUrl,{fromTFHub:n})];case 1:return a=s.sent(),[4,IH(vH.MediaPipeFaceDetector,{modelType:"short",maxFaces:t.maxFaces,detectorModelUrl:t.detectorModelUrl,runtime:t.runtime})];case 2:return i=s.sent(),[2,new lK(i,a,t.maxFaces,t.refineLandmarks)]}}))}))}(KH||(KH={})).MediaPipeFaceMesh="MediaPipeFaceMesh";Object.freeze({__proto__:null,getKeypointIndexByContour:function(e){if(e===KH.MediaPipeFaceMesh)return Hq;throw new Error("Model "+e+" is not supported.")},getAdjacentPairs:function(e){if(e===KH.MediaPipeFaceMesh)return Kq;throw new Error("Model "+e+" is not supported.")}});const cK=(e,t,n,a)=>1===a?.5*(e+t):e+(t-e)*n/(a-1),hK={applyExponentialOnBoxSize:!1,flipVertically:!1,ignoreClasses:[],numClasses:1,numBoxes:2304,numCoords:16,boxCoordOffset:0,keypointCoordOffset:4,numKeypoints:6,numValuesPerKeypoint:2,sigmoidScore:!0,scoreClippingThresh:100,reverseOutputOrder:!0,xScale:192,yScale:192,hScale:192,wScale:192,minScoreThresh:.6},dK={reduceBoxesInLowestLayer:!1,interpolatedScaleAspectRatio:0,featureMapHeight:[],featureMapWidth:[],numLayers:1,minScale:.1484375,maxScale:.75,inputSizeHeight:192,inputSizeWidth:192,anchorOffsetX:.5,anchorOffsetY:.5,strides:[4],aspectRatios:[1],fixedAnchorSize:!0},pK={outputTensorSize:{width:192,height:192},keepAspectRatio:!0,outputTensorFloatRange:[-1,1],borderMode:"zero"},mK=e=>{e.detector.imageToTensorConfig=pK,e.detector.tensorsToDetectionConfig=hK,e.detector.anchors=(e=>{null===e.reduceBoxesInLowestLayer&&(e.reduceBoxesInLowestLayer=!1),null===e.interpolatedScaleAspectRatio&&(e.interpolatedScaleAspectRatio=1),null===e.fixedAnchorSize&&(e.fixedAnchorSize=!1);const t=[];let n=0;for(;n0){const n=o===e.strides.length-1?1:cK(e.minScale,e.maxScale,o+1,e.strides.length);r.push(Math.sqrt(t*n)),s.push(e.interpolatedScaleAspectRatio)}}o++}for(let e=0;e0)l=e.featureMapHeight[n],u=e.featureMapWidth[n];else{const t=e.strides[n];l=Math.ceil(e.inputSizeHeight/t),u=Math.ceil(e.inputSizeWidth/t)}for(let n=0;ne.width))),n=Sy(e.detector.anchors.map((e=>e.height))),a=Sy(e.detector.anchors.map((e=>e.xCenter))),i=Sy(e.detector.anchors.map((e=>e.yCenter)));e.detector.anchorTensor={x:a,y:i,w:t,h:n}},fK=()=>navigator.onLine,gK=function(){this.model=function(e,t){return Wq(this,void 0,void 0,(function(){var n,a;return Gq(this,(function(i){if(e===KH.MediaPipeFaceMesh){if(a=void 0,null!=(n=t)){if("tfjs"===n.runtime)return[2,uK(n)];if("mediapipe"===n.runtime)return[2,Jq(n)];a=n.runtime}throw new Error("Expect modelConfig.runtime to be either 'tfjs' or 'mediapipe', but got "+a)}throw new Error(e+" is not a supported model name.")}))}))}(KH.MediaPipeFaceMesh,{runtime:"tfjs",detectorModelUrl:fK()?"https://tfhub.dev/mediapipe/tfjs-model/face_detection/full/1":"./models/detector/model.json",landmarkModelUrl:fK()?void 0:"./models/landmark/model.json"}),this.predictionReady=!1,this.modelLoaded=!1},yK={current:!1,resolves:[]};gK.prototype.loadModel=async function(){if(!this.modelLoaded){if(yK.current){const e=new Promise((e=>{yK.resolves.push(e)}));return await e}yK.current=!0;try{this.model=await this.model,mK(this.model),this.modelLoaded=!0,yK.resolves.forEach((e=>e()))}finally{yK.current=!1,yK.resolves=[]}}},gK.prototype.positionsArray=null,gK.prototype.getEyePatches=async function(e,t,n,a){if(0===t.width)return null;const i=this.model,s=await i.estimateFaces(t,{flipHorizontal:!1});if(0===s.length)return!1;this.positionsArray=s[0].keypoints;const r=s[0],[o,l]=[{eyeTopArc:[466,388,387,386,385,384,398].map((e=>r.keypoints[e])),eyeBottomArc:[263,249,390,373,374,380,381,382,362].map((e=>r.keypoints[e]))},{eyeTopArc:[246,161,160,159,158,157,173].map((e=>r.keypoints[e])),eyeBottomArc:[33,7,163,144,145,153,154,155,133].map((e=>r.keypoints[e]))}].map((({eyeTopArc:e,eyeBottomArc:t})=>{const n={x:Math.round(Math.min(...e.map((e=>e.x)))),y:Math.round(Math.min(...e.map((e=>e.y))))},a=Math.round(Math.max(...t.map((e=>e.x)))),i=Math.round(Math.max(...t.map((e=>e.y))));return{origin:n,width:a-n.x,height:i-n.y}}));var u=o.origin.x,c=o.origin.y,h=o.width,d=o.height,p=l.origin.x,m=l.origin.y,f=l.width,g=l.height;if(0===h||0===f)return null;if(0===d||0===g)return null;var y={},b=t.getContext("2d").getImageData(u,c,h,d);y.left={patch:b,imagex:u,imagey:c,width:h,height:d};var v=t.getContext("2d").getImageData(p,m,f,g);return y.right={patch:v,imagex:p,imagey:m,width:f,height:g},this.predictionReady=!0,y},gK.prototype.getPositions=function(){return this.positionsArray},gK.prototype.reset=function(){},gK.prototype.drawFaceOverlay=function(e,t){if(t){e.fillStyle="#32EEDB",e.strokeStyle="#32EEDB",e.lineWidth=.5;for(let n=0;nn?n:e}vK.Eye=function(e,t,n,a,i){this.patch=e,this.imagex=t,this.imagey=n,this.width=a,this.height=i},vK.getEyeFeats=function(e){var t=this.resizeEye(e.left,10,6),n=this.resizeEye(e.right,10,6),a=this.grayscale(t.data,t.width,t.height),i=this.grayscale(n.data,n.width,n.height),s=[];this.equalizeHistogram(a,5,s);var r=[];return this.equalizeHistogram(i,5,r),s.concat(r)},vK.DataWindow=function(e,t){this.data=[],this.windowSize=e,this.index=0,this.length=0,t&&(this.data=t.slice(t.length-e,t.length),this.length=this.data.length)},vK.DataWindow.prototype.push=function(e){return this.data.length>2),i=0,s=0,r=0;rt?255:0;return e},vK.correlation=function(e,t){const n=Math.min(e.length,t.length);let a=0;for(let i=0;iAK(e,t,((e,t)=>e+t)),sub:(e,t)=>AK(e,t,((e,t)=>e-t)),inv:e=>xK.solve(e,xK.identity(e.length,e[0].length)),identity(e,t=e){const n=new Array(e);for(let a=0;ae.length===e[0].length?xK.LUDecomposition(e,t):xK.QRDecomposition(e,t),LUDecomposition(e,t){for(var n=new Array(e.length),a=0;aMath.abs(c[m])&&(m=a);if(m!=i){for(p=0;p=0;p--){for(i=0;i=0;u--){for(i=0;i=0;n--){var a=this.screenXTrailArray.get(n),i=this.screenYTrailArray.get(n);if(Math.sqrt(Math.pow(a-e,2)+Math.pow(i-t,2))>72)return n+1}return n},SK.addData=function(e,t,n){e&&("click"===n?(this.screenXClicksArray.push([t[0]]),this.screenYClicksArray.push([t[1]]),this.eyeFeaturesClicks.push(wK.getEyeFeats(e)),this.dataClicks.push({eyes:e,screenPos:t,type:n})):"move"===n&&(this.screenXTrailArray.push([t[0]]),this.screenYTrailArray.push([t[1]]),this.eyeFeaturesTrail.push(wK.getEyeFeats(e)),this.trailTimes.push(performance.now()),this.dataTrail.push({eyes:e,screenPos:t,type:n})))};const EK=SK,_K={RidgeReg:function(){this.init()}};_K.RidgeReg.prototype.init=EK.InitRegression,_K.RidgeReg.prototype.addData=EK.addData,_K.RidgeReg.prototype.predict=function(e){if(!e||0===this.eyeFeaturesClicks.length)return null;for(var t=performance.now()-this.trailTime,n=[],a=[],i=[],s=0;st&&(n.push(this.screenXTrailArray.get(s)),a.push(this.screenYTrailArray.get(s)),i.push(this.eyeFeaturesTrail.get(s)));var r=this.screenXClicksArray.data.concat(n),o=this.screenYClicksArray.data.concat(a),l=this.eyeFeaturesClicks.data.concat(i),u=EK.ridge(r,l,this.ridgeParameter),c=EK.ridge(o,l,this.ridgeParameter),h=wK.getEyeFeats(e),d=0;for(s=0;st&&(n.push(this.screenXTrailArray.get(s)),a.push(this.screenYTrailArray.get(s)),i.push(this.eyeFeaturesTrail.get(s)));var r=this.eyeFeaturesClicks.data.length,o=Array(r),l=Array(r),u=Array(r);for(s=0;ssetTimeout(t,e)))}function BK(e,t){let n=Math.pow(10,t);return Math.round(e*n)/n}const FK={tracker:{}};FK.tracker.TFFaceMesh=bK,FK.reg=TK,FK.reg.RidgeWeightedReg=NK.RidgeWeightedReg,FK.reg.RidgeRegThreaded=OK.RidgeRegThreaded,FK.util=wK,FK.params=Lq;var LK=null,PK=null,jK=null,VK=null,UK=null,WK=null,GK=null,qK=!1,HK=new Array(50),KK=new Array(50),$K=(performance.now(),null),ZK=null;FK.params.paused=!1,FK.params.greedyLearner=!1,FK.params.framerate=60,FK.params.showGazeDot=!1,FK.params.getLatestVideoFrameTimestamp=()=>{},FK.params.activeCamera={label:"",id:""};let XK=[];var YK=function(e){},QK=YK,JK=["click","move"],e$=performance.now(),t$=new FK.tracker.TFFaceMesh,n$=[new FK.reg.RidgeReg],a$={TFFacemesh:function(){return new FK.tracker.TFFaceMesh}},i$={ridge:function(){return new FK.reg.RidgeReg},weightedRidge:function(){return new FK.reg.RidgeWeightedReg},threadedRidge:function(){return new FK.reg.RidgeRegThreaded}},s$="webgazerGlobalData",r$="webgazerGlobalSettings",o$={},l$=[];let u$,c$,h$,d$,p$,m$,f$,g$,y$,b$,v$,k$;FK.computeValidationBoxSize=function(){var e=jK.videoWidth,t=jK.videoHeight,n=parseInt(jK.style.width),a=parseInt(jK.style.height),i=Math.min(e,t),s=e==Math.max(e,t)?n/e:a/t,r=i*FK.params.faceFeedbackBoxRatio*s;return[(a-r)/2,(n-r)/2,r,r]};let w$=!1,A$=!1;function x$(){null!==WK&&$K?(w$||A$||(A$=!0,setTimeout((()=>{u$=jK.videoWidth,c$=jK.videoHeight,h$=Math.min(u$,c$),d$=h$*FK.params.faceFeedbackBoxRatio,p$=(c$-d$)/2,m$=(u$-d$)/2,f$=m$+d$,g$=p$+d$,w$=!0,A$=!1}),500)),y$=u$-$K.left.imagex,v$=u$-$K.right.imagex,b$=$K.left.imagey,k$=$K.right.imagey,WK.style.border=w$&&y$>m$&&y$m$&&v$p$&&b$p$&&k$=1e3/FK.params.framerate&&(N$=I$,ZK=E$(),ZK=await ZK,QK(ZK),R$=!0,ZK)){_$.push(ZK);var e=0,t=0,n=_$.length;for(var a in _$.data)e+=_$.get(a).x,t+=_$.get(a).y;var i=wK.bound({x:e/n,y:t/n});FK.params.storingPoints&&(FK.storePoints(i.x,i.y,T$),50==++T$&&(T$=0)),GK.style.opacity="",GK.style.left=`${i.x}px`,GK.style.top=`${i.y}px`}requestAnimationFrame(z$)}var O$=function(e,t,n){if(!FK.params.paused){if(0===n$.length)return null;for(var a in n$)$K&&n$[a].addData($K,[e,t],n)}},M$=async function(e){O$(e.clientX,e.clientY,JK[0]),FK.params.saveDataAcrossSessions&&await async function(){var e=n$[0].getData()||l$;jq().setItem(r$,o$),jq().setItem(s$,e)}()},B$=function(e){if(!FK.params.paused){var t=performance.now();tFK.params.activeCamera.id?{video:{...e.video,deviceId:FK.params.activeCamera.id}}:e;function V$(e){navigator.vendor&&navigator.vendor.indexOf("Apple")>-1?(e.style.opacity=FK.params.showVideo?"1":"0",e.style.display="block"):e.style.display=FK.params.showVideo?"block":"none"}FK._begin=function(e,t){if(!FK.params.videoIsOn)return void 0===navigator.mediaDevices&&(navigator.mediaDevices={}),void 0===navigator.mediaDevices.getUserMedia&&(navigator.mediaDevices.getUserMedia=function(e){var t=navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return t?new Promise((function(n,a){t.call(navigator,e,n,a)})):Promise.reject(new Error("Unfortunately, your browser does not support access to the webcam through the getUserMedia API. Try to use the latest version of Google Chrome, Mozilla Firefox, Opera, or Microsoft Edge instead."))}),new Promise((async(n,a)=>{let i;try{if(void 0!==navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.enumerateDevices){const a=await navigator.mediaDevices.enumerateDevices();if((e=>{let t,n;XK=[],e.forEach((e=>{"videoinput"===e.kind&&XK.push(e),e.label.includes("FaceTime")&&(t=e.label,n=e.deviceId)})),XK.length&&(FK.params.activeCamera.label=t||XK[0].label,FK.params.activeCamera.id=n||XK[0].deviceId)})(a),0===XK.length)throw t(XK),JSON.stringify({message:"We can't find any video input devices.",devices:a});try{i=await navigator.mediaDevices.getUserMedia(j$(FK.params.camConstraints))}catch(e){throw t(XK),e}P$(e?"video":"all",i).then((()=>{XK.length>1&&(e=>{const t=PK,n=document.createElement("select");n.className=n.id="webgazer-videoinput-select",n.name="videoinput",e.forEach(((e,t)=>{var a;n.innerHTML+=``})),n.onchange=e=>{const[t,a]=n.value.split("%");FK.params.activeCamera.label=a,FK.params.activeCamera.id=t,FK.setCameraConstraints(j$(FK.params.camConstraints))},t.appendChild(n)})(XK)})),FK.params.videoIsOn=!0,e||n(FK)}else t([])}catch(e){throw jK=null,i=null,t([]),a(e),JSON.stringify({error:e,devices:await navigator.mediaDevices.enumerateDevices()})}}));P$("gaze")},FK.isReady=function(){return null!==VK&&VK.width>0},FK.pause=function(){return FK.params.paused=!0,FK},FK.stopLearning=function(e){return L$(e),FK},FK.startLearning=function(e){return F$(e),FK},FK.resume=async function(){return FK.params.paused?(FK.params.paused=!1,R$=!0,U$.current&&(clearInterval(U$.current),U$.current=void 0,qK=!1,GK.style.backgroundColor="",GK.style.opacity=""),await z$(),FK):FK},FK.end=function(e=!1){return e&&(_$=new wK.DataWindow(4),T$=0,I$=null,N$=-1,w$=!1,FK.params.videoIsOn=!1,setTimeout((()=>{FK.stopVideo(),PK.remove()}),500)),FK},FK.stopVideo=function(){return LK.getTracks()[0].stop(),FK},FK.detectCompatibility=function(){return void 0!==(navigator.mediaDevices.getUserMedia||navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia)},FK.showVideoPreview=function(e){return FK.params.showVideoPreview=e,FK.showVideo(e&&FK.params.showVideo),FK.showFaceOverlay(e&&FK.params.showFaceOverlay),FK.showFaceFeedbackBox(e&&FK.params.showFaceFeedbackBox),FK},FK.showVideo=function(e,t=.8){return FK.params.showVideo=e,jK&&V$(jK),PK&&V$(PK),FK},FK.showFaceOverlay=function(e){return FK.params.showFaceOverlay=e,UK&&(UK.style.display=e?"block":"none"),FK},FK.showFaceFeedbackBox=function(e){return FK.params.showFaceFeedbackBox=e,WK&&(WK.style.display=e?"block":"none"),FK},FK.showPredictionPoints=function(e){return FK.params.showGazeDot=e,GK&&(GK.style.display=e?"block":"none"),FK};const U$={current:void 0};function W$(e,t){VK&&(VK.width=e,VK.height=t),UK&&(UK.width=e,UK.height=t)}FK.popPredictionPoints=function(){return U$.current&&(clearInterval(U$.current),U$.current=void 0,qK=!1),GK&&FK.params.showGazeDot&&(qK=!0,GK.style.backgroundColor="red",GK.style.opacity=1,U$.current=setInterval((()=>{GK.style.opacity-=.02,GK.style.opacity<=.02&&(clearInterval(U$.current),U$.current=void 0,qK=!1,GK.style.backgroundColor="",GK.style.opacity="")}),50)),FK},FK.saveDataAcrossSessions=function(e){return FK.params.saveDataAcrossSessions=e,FK},FK.applyKalmanFilter=function(e){return FK.params.applyKalmanFilter=e,FK},FK.setCameraConstraints=async function(e){if(FK.params.camConstraints=e,LK){FK.pause();try{LK.getVideoTracks().forEach((e=>{e.stop()}));const e=await navigator.mediaDevices.getUserMedia(FK.params.camConstraints);setTimeout((()=>{const t=e.getVideoTracks()[0].getSettings();LK=e,jK.srcObject=e,W$(t.width,t.height)}),1500)}catch(e){return}await FK.resume()}},FK.setStaticVideo=function(e){return e,FK},FK.setVideoViewerSize=function(e,t){FK.params.videoViewerWidth=e,FK.params.videoViewerHeight=t,jK.style.width=e+"px",jK.style.height=t+"px",PK.style.width=e+"px",PK.style.height=t+"px",UK.style.width=e+"px",UK.style.height=t+"px";var n=FK.computeValidationBoxSize();WK.style.top=n[0]+"px",WK.style.left=n[1]+"px",WK.style.width=n[2]+"px",WK.style.height=n[3]+"px"},FK.addMouseEventListeners=function(){return F$(),FK},FK.removeMouseEventListeners=function(){return L$(),FK},FK.recordScreenPosition=function(e,t,n){return O$(e,t,n||JK[0]),FK},FK.storePoints=function(e,t,n){HK[n]=e,KK[n]=t},FK.setTracker=function(e){if(void 0===a$[e]){for(var t in a$);return FK}return t$=a$[e](),FK},FK.setRegression=function(e){if(void 0===i$[e]){for(var t in i$);return FK}return l$=n$[0].getData(),(n$=[i$[e]()])[0].setData(l$),FK},FK.addTrackerModule=function(e,t){a$[e]=function(){return new t}},FK.addRegressionModule=function(e,t){i$[e]=function(){return new t}},FK.addRegression=function(e){var t=i$[e]();return l$=n$[0].getData(),t.setData(l$),n$.push(t),FK},FK.setGazeListener=function(e){return QK=e,FK},FK.clearGazeListener=function(){return QK=YK,FK},FK.setVideoElementCanvas=function(e){return VK=e},FK.clearData=async function(){!function(){for(var e in jq().clear(),n$)n$[e].init()}()},FK.getTracker=function(){return t$},FK.getRegression=function(){return n$},FK.getCurrentPrediction=async function(e=0,t=150,n=5){let a=0;const i=[],s=[];for(let e=0;et.x>=0&&t.x<=window.innerWidth?e+t.x:e),0)/s.length),l=Math.round(s.reduce(((e,t)=>t.y>=0&&t.y<=window.innerHeight?e+t.y:e),0)/s.length);return GK&&(GK.style.left=`${o}px`,GK.style.top=`${l}px`),{x:o,y:l,raw:s.map((e=>({x:BK(e.x,0),y:BK(e.y,0)})))}},FK.params.getEventTypes=function(){return JK.slice()},FK.getVideoElementCanvas=function(){return VK},FK.getVideoPreviewToCameraResolutionRatio=function(){return[FK.params.videoViewerWidth/jK.videoWidth,FK.params.videoViewerHeight/jK.videoHeight]},FK.getStoredPoints=function(){return[HK,KK]};const G$=FK;class q${constructor(e){this.calibrator=e,this.webgazer=G$,this.defaultGazeCallback=null,this.defaultDistanceTrackCallback=null,this._initialized={distance:!1,gaze:!1},this._learning=!0,this._running={distance:!1,gaze:!1},this._runningVideo=!1,this._toFixedN=1}begin({pipWidthPx:e},t){this.checkInitialized("gaze",!0)&&(this._running.gaze||(this.webgazer.begin(this.videoFailed.bind(this)),this._running.gaze=!0,this._runningVideo=!0),bi(this.calibrator,e,this.calibrator.params.videoOpacity,this.webgazer,t))}beginVideo({pipWidthPx:e},t){this.checkInitialized("distance",!0)&&(this._runningVideo||(this.webgazer.beginVideo(this.videoFailed.bind(this)),this._runningVideo=!0),bi(this.calibrator,e,this.calibrator.params.videoOpacity,this.webgazer,t))}videoFailed(e){const t=Ga(this.calibrator,{showIcon:!0});Ba.fire({...t,icon:"error",iconColor:this.calibrator._CONST.COLOR.DARK_RED,showConfirmButton:!1,html:e.length?U.H.RC_errorCameraUseDenied[this.calibrator.L]:U.H.RC_errorNoCamera[this.calibrator.L]})}attachNewCallback(e){this.checkInitialized("gaze",!0)&&this.webgazer.setGazeListener((t=>{if(t){const n=this.getData(t);this.calibrator.newGazePositionData=n,(0,_.nB)(e,n)}}))}async getGazeNow(e={},t=void 0){const n=Object.assign({wait:0,frames:5},e),a=this.getData(await this.webgazer.getCurrentPrediction(0,n.wait,n.frames));return this.calibrator.newGazePositionData=a,this.webgazer.popPredictionPoints(),(0,_.nB)(t,a),a}end(){this.webgazer.end()}}q$.prototype._init=function({greedyLearner:e,framerate:t,toFixedN:n,showVideo:a,showFaceOverlay:i,showGazer:s},r){this.checkInitialized(r)||("gaze"===r&&(this.webgazer.params.greedyLearner=e,this.webgazer.params.framerate=t,this.webgazer.params.getLatestVideoFrameTimestamp=this._getLatestVideoTimestamp.bind(this),this.showGazer(s)),this._toFixedN=n,this.showVideo(a),this.showFaceOverlay(i),this._initialized[r]=!0)},q$.prototype.checkInitialized=function(e,t=!1){return!!(""===e?this._initialized.gaze||this._initialized.distance:this._initialized[e])},q$.prototype.getData=function(e){const t=performance.now();return{value:{x:(0,_.Nh)(e.x,this._toFixedN),y:(0,_.Nh)(e.y,this._toFixedN),latencyMs:t-this.calibrator._trackingVideoFrameTimestamps.gaze},timestamp:t,raw:e.raw?e.raw:void 0}},q$.prototype.pause=function(){this.webgazer.pause()},q$.prototype.resume=function(){this.webgazer.resume()},q$.prototype.end=function(e,t=!1){if(!this.checkInitialized(e,!0))return;const n=t||!this._initialized.gaze||!this._initialized.distance;"gaze"===e?(this._endGaze(),n&&this.checkInitialized("distance")&&this.calibrator.endDistance(!1,!1),this.calibrator._trackingVideoFrameTimestamps.gaze=0):(this.defaultDistanceTrackCallback=null,n&&this.checkInitialized("gaze")&&this._endGaze()),n?(this._initialized={distance:!1,gaze:!1},this._running={distance:!1,gaze:!1},this.webgazer.end(!0),this._runningVideo=!1):(this._initialized[e]=!1,this._running[e]=!1)},q$.prototype._endGaze=function(){this.webgazer.params.paused=!0,this._learning=!0,this.defaultGazeCallback=null,this.webgazer.clearData(),this.webgazer.params.greedyLearner=!1,this.webgazer.params.framerate=60,this.webgazer.params.getLatestVideoFrameTimestamp=()=>{}},q$.prototype._getLatestVideoTimestamp=function(e){this.calibrator._trackingVideoFrameTimestamps.gaze=e},q$.prototype.startStoringPoints=function(){this.webgazer.params.storingPoints=!0},q$.prototype.stopStoringPoints=function(){this.webgazer.params.storingPoints=!1},q$.prototype.startLearning=function(e){this._learning||(this.webgazer.startLearning(e),this._learning=!0)},q$.prototype.stopLearning=function(e){this._learning&&(this.webgazer.stopLearning(e),this._learning=!1)},q$.prototype.showGazer=function(e){this.webgazer.showPredictionPoints(e)},q$.prototype.showVideo=function(e){this.webgazer.showVideo(e,this.calibrator._params.videoOpacity)},q$.prototype.showFaceOverlay=function(e){this.webgazer.showFaceOverlay(e)},E.A.prototype.performanceCompute=async function(e,t=!1){if(!this.checkInitialized())return;const n=performance.now(),a={_useless:void 0,time:0,randomTime:0};for(;performance.now()-n<500;)a._useless=Array(5e3).fill(Math.floor(10*Math.random())),a.time++;const i=performance.now();for(a._useless=0;performance.now()-i<500;)a._useless+=Math.random(),a.randomTime++;const s={value:{computeArrayFillMHz:(0,_.Nh)(2*a.time/1e6,3),computeRandomMHz:(0,_.Nh)(2*a.randomTime/1e6,3),idealFps:void 0,stressFps:void 0},timestamp:performance.now()};return t||(this.newPerformanceData=s),(0,_.nB)(e,s),s},E.A.prototype.performance=async function(e={},t=void 0){if(!this.checkInitialized())return;const n=Object.assign({testComputation:!0,testFrameCount:180,testObjectCount:1e4,headline:`🚀 ${U.H.RC_performanceTitle[this.L]}`,description:U.H.RC_performanceIntro[this.L]},e);this._addBackground(),this._addBackgroundText(n.headline,n.description),await(0,_.yy)(200);const a=n.testComputation?await this.performanceCompute(null,!0):{value:{computeArrayFillMHz:void 0,computeRandomMHz:void 0}},i=document.createElement("canvas"),s=i.getContext("2d");i.width=window.innerWidth,i.height=window.innerHeight,this.background.appendChild(i);const r=await H$(s),o=await K$(s,n.testFrameCount,n.testObjectCount),l={value:{computeArrayFillMHz:a.value.computeArrayFillMHz,computeRandomMHz:a.value.computeRandomMHz,idealFps:Math.round(6e4/(r.end-r.start)),stressFps:Math.round(1e3*n.testFrameCount/(o.end-o.start))},timestamp:performance.now()};return this.newPerformanceData=l,this._removeBackground(),(0,_.nB)(t,l),l};const H$=()=>{let e=60;const t=performance.now();return new Promise((n=>{const a=()=>{e--,e>0?requestAnimationFrame(a):n({start:t,end:performance.now()})};requestAnimationFrame(a)}))},K$=async(e,t,n)=>{let a=t;const i=[],s=["#000000","#333333","#999999"];for(let e=0;e{const n=()=>{e.clearRect(0,0,window.innerWidth,window.innerHeight),e.beginPath();for(const t of i)t.move(),t.draw(e);a--,a>0?requestAnimationFrame(n):t({start:r,end:performance.now()})};requestAnimationFrame(n)}))};class $${constructor(e){this.w=(0,_.Av)(20,70),this.h=(0,_.Av)(30,70),this.x=-this.w+Math.random()*window.innerWidth,this.y=-this.h/2+Math.random()*(window.innerHeight+this.h/2),this.speed=(0,_.Av)(1,5),this.stroke=e[Math.floor(Math.random()*e.length)]}move(){this.x+=this.speed+.5*Math.random(),this.x>window.innerWidth&&(this.x=-this.w)}draw(e){e.strokeStyle=this.stroke,e.fillRect(this.x,this.y,this.w,this.h),e.strokeRect(this.x,this.y,this.w,this.h)}}E.A.prototype.getEquipment=async function(e,t=!1,n="original"){if(this.equipment&&!t)return(0,_.nB)(e);let a,i,s,r,o,l;if(this._replaceBackground(),"original"===n){const{CM:e,IN_D:t,IN_F:n}=this._CONST.UNITS;a="Do you have a ruler or tape measure?",i="Ideally, it should be long enough to measure your viewing distance, but even a 6 inch (15 cm) ruler can be useful. Please select the units you'll use, or indicate that no ruler or tape measure is available.",s="select",r={[e]:"centimeter",[t]:"inch (decimal, e.g. 11.5 in)",[n]:"inch (fractional, e.g. 12 3/8 in)",none:"No ruler or tape measure is available"},o="Select an option",l=void 0}else a=Wa.RC_TestDistances[this.language.value].replace(/(?:\r\n|\r|\n)/g,"
          "),i=Wa.RC_rulerUnit[this.language.value].replace(/(?:\r\n|\r|\n)/g,"
          "),s="radio",r={inches:"inches",cm:"cm",none:"None"},o=void 0,l="none";const{value:u}=await Ba.fire({...Ga(this,{showIcon:!1}),title:a,html:i,input:s,inputOptions:r,inputPlaceholder:o,inputValue:l,inputValidator:e=>new Promise((t=>{e?.length||t("Please select an option."),this.rulerUnits=e,t()}))});if(!u)return;const c="none"!==u,h={value:{has:c,unit:c?u:null,equipment:c?"":null,length:c?"":null},timestamp:performance.now()};return"original"!==n&&c?await Z$(this,h):this.newEquipmentData=h,(0,_.nB)(e)};const Z$=async(e,t)=>{const{value:n}=await Ba.fire({...Ga(e,{showIcon:!1}),title:Wa.RC_howLong[e.language.value].replace("AAA",t.value.unit),input:"number",inputAttributes:{min:0,step:1},inputPlaceholder:"",inputValidator:n=>new Promise((a=>{(!n?.length||isNaN(n)||parseInt(n)<=0)&&a("Please provide a number for the length of your ruler or tape measure."),e.rulerLength=n,t.value.length=n,e.newEquipmentData=t,a()}))});return n};var X$=__webpack_require__(2016),Y$=__webpack_require__(980),Q$=__webpack_require__.n(Y$),J$=__webpack_require__(3890),eZ=__webpack_require__.n(J$);E.A.prototype._checkScreenSize=async function(e,t,n){await this.getEquipment((()=>{tZ(this,e,t,n)}))};const tZ=async(e,t,n,a)=>{if(e.equipment?.value?.has){e._replaceBackground((0,_.$O)("📏 Measure the Length of the Arrow",'Use your ruler (or tape measure) to measure the length of the arrow. Type your numerical answer into the box. Just digits, period, decimal comma, and / (forward slash) for fractional inches. Then click OK or hit RETURN.'));const t=t=>[()=>{const n=document.createElement("div");e.background.appendChild(n),n.outerHTML=t},()=>{for(const t of e.background.getElementsByClassName("arrow-two-sided-svg"))t.remove()},{callback:()=>{},content:"Ruler is too short"}],n=await(0,X$.K)(e,...t(Q$())),i=await(0,X$.K)(e,...t(eZ())),s={};if(n){const t=n.value,a=e.windowWidthPx.value,i=(0,_.Nh)(2.54*a/e.screenPpi.value,1);s.horizontal={...t,calibratorArrowWidthCm:i,arrowWidthPx:a}}if(i){const t=i.value,n=e.windowHeightPx.value,a=(0,_.Nh)(2.54*n/e.screenPpi.value,1);s.vertical={...t,calibratorArrowHeightCm:a,arrowHeightPx:n}}if(s.vertical||s.horizontal){const t={value:s,timestamp:n?n.timestamp:i.timestamp,measure:"screenSize"};e.newCheckData=t,(0,_.nB)(a,t)}}e._removeBackground(),(0,_.nB)(t,n)};E.A.prototype._checkDistance=async function(e,t,n,a,i=[],s=(()=>{})){await this.getEquipment((()=>{}),!1,"new"),await nZ(this,e,t,n,a,i,s)};const nZ=async(e,t,n,a,i,s,r)=>{const o="trackDistance"===a,l=()=>{e._removeBackground(),o||(0,_.nB)(t,n,!1),r()};if(o&&(0,_.nB)(t,n,!1),e.equipment?.value?.has){if("inches"===e.equipment?.value?.unit&&(s=s.map((e=>Math.round(e/2.54)))),0===(s=s.filter((t=>t>0&&t<=e.equipment?.value?.length))).length)return void l();e._removeBackground(),e.pauseNudger(),rZ(),aZ(),e.calibrateTrackDistanceRequestedCm=s.map((t=>"inches"===e.equipment?.value?.unit?Math.round(2.54*t):t)),e.calibrateTrackDistanceMeasuredCm=[];for(let t of s){const n=s.indexOf(t)+1;oZ(n/s.length*100,n,s.length),sZ(t,e.equipment?.value?.unit);const a=(0,_.$O)(Wa.RC_produceDistanceTitle[e.language.value].replace("222",n).replace("333",s.length),Wa.RC_produceDistance[e.language.value].replace("111",t).replace("AAA",e.equipment?.value?.unit).replace(/(?:\r\n|\r|\n)/g,"

          "),!1,"","left");e._replaceBackground(a),await new Promise((t=>{document.addEventListener("keydown",(function n(a){if("Enter"===a.key){const a=e.viewingDistanceAllowedPreciseBool?e.viewingDistanceCm.value.toFixed(1):Math.round(e.viewingDistanceCm.value);e.calibrateTrackDistanceMeasuredCm.push(a),document.removeEventListener("keydown",n),t()}}));const n=W(null,e.keypadHandler,(()=>{const a=e.viewingDistanceAllowedPreciseBool?e.viewingDistanceCm.value.toFixed(1):Math.round(e.viewingDistanceCm.value);e.calibrateTrackDistanceMeasuredCm.push(a),n(),t()}),!1,["return"])}))}e.resumeNudger(),lZ(),iZ()}l()},aZ=()=>{if(document.getElementById("viewing-distance-div"))return;const e=document.createElement("viewing-distance-div");e.id="calibration-trackDistance-check-viewingDistance-container",e.className="calibration-trackDistance-check-viewingDistance-container";const t=document.createElement("p");t.id="viewing-distance-p",t.className="calibration-trackDistance-check-viewingDistance";const n=document.createElement("p");n.id="calibration-trackDistance-check-viewingDistance-units",n.className="calibration-trackDistance-check-viewingDistance-units",e.appendChild(t),e.appendChild(n),document.body.appendChild(e)},iZ=()=>{const e=document.getElementById("viewing-distance-p");e&&document.body.removeChild(e);const t=document.getElementById("calibration-trackDistance-check-viewingDistance-units");t&&document.body.removeChild(t);const n=document.getElementById("calibration-trackDistance-check-viewingDistance-container");n&&document.body.removeChild(n)},sZ=(e,t)=>{const n=document.getElementById("viewing-distance-p");if(!n)return;n.innerText=e;const a=document.getElementById("calibration-trackDistance-check-viewingDistance-units");a&&(a.innerText=t)},rZ=()=>{if(document.getElementById("custom-progress-bar"))return;const e=document.createElement("div");e.id="custom-progress-bar",e.className="calibration-trackDistance-check-progessBar-container";const t=document.createElement("div");t.id="calibration-trackDistance-check-progessBar",t.className="calibration-trackDistance-check-progessBar";const n=document.createElement("p");n.id="calibration-trackDistance-check-progessBar-text",n.className="calibration-trackDistance-check-progessBar-text",e.appendChild(t),e.appendChild(n),document.body.appendChild(e)},oZ=(e,t,n)=>{const a=document.getElementById("calibration-trackDistance-check-progessBar"),i=document.getElementById("calibration-trackDistance-check-progessBar-text");if(!a||!i)return;const s=Math.min(100,Math.max(0,e));a.style.width=`${s}%`,i.innerText=`${t} of ${n}`},lZ=()=>{const e=document.getElementById("custom-progress-bar");e&&document.body.removeChild(e)};var uZ=__webpack_require__(7790),cZ=__webpack_require__(627),hZ=__webpack_require__.n(cZ),dZ=__webpack_require__(8110),pZ=__webpack_require__.n(dZ),mZ=__webpack_require__(5072),fZ=__webpack_require__.n(mZ),gZ=__webpack_require__(7825),yZ=__webpack_require__.n(gZ),bZ=__webpack_require__(7659),vZ=__webpack_require__.n(bZ),kZ=__webpack_require__(5056),wZ=__webpack_require__.n(kZ),AZ=__webpack_require__(540),xZ=__webpack_require__.n(AZ),CZ=__webpack_require__(1113),SZ=__webpack_require__.n(CZ),EZ=__webpack_require__(4636),_Z={};_Z.styleTagTransform=SZ(),_Z.setAttributes=wZ(),_Z.insert=vZ().bind(null,"head"),_Z.domAPI=yZ(),_Z.insertStyleElement=xZ();fZ()(EZ.A,_Z);EZ.A&&EZ.A.locals&&EZ.A.locals;E.A.prototype.removePanel=function(){return!!this._panelStatus.hasPanel&&(this._panel.panelObserver.unobserve(this._panel.panel),this._panel.panel.remove(),this._panel.panel=null,this._panel.panelObserver=null,this._panel.panelTasks=[],this._panel.panelParent=null,this._panel.panelOptions={},this._panel.panelCallback=null,this._panel.panelResolve=null,this._panelStatus.hasPanel=!1,this._panelStatus.panelFinished=!1,LZ(this),!0)},E.A.prototype.resetPanel=function(e=null,t=null,n=null,a=null,i=null){if(!this._panelStatus.hasPanel)return!1;const s=e||[...this._panel.panelTasks],r=n||{...this._panel.panelOptions},o=a&&"function"==typeof a?a:this._panel.panelCallback,l=i||this._panel.panelResolve;return null!==t&&t!==this._panel.panelParent?(this.removePanel(),this.panel(s,t,r,o,l)):(LZ(this),this.panel(s,this._panel.panelParent,r,o,l,!0))},E.A.prototype.panel=async function(e,t,n={},a=null,i=null,s=!1){if(this._panelStatus.hasPanel^s)return!1;if(!NZ(e))return!1;const r=document.querySelector(t);if(!r)return!1;const o=Object.assign({headline:U.H.RC_panelTitle[this.L],description:U.H.RC_panelIntro[this.L],showNextButton:!1,nextHeadline:U.H.RC_panelTitleNext[this.L],nextDescription:U.H.RC_panelIntroNext[this.L],nextButton:U.H.RC_panelButton[this.L],color:"#3490de",debug:!1,i18n:!0,_demoActivateAll:!1},n),l=Ii(o.color).darken(20).toString();document.documentElement.style.setProperty("--rc-panel-theme-color",o.color),document.documentElement.style.setProperty("--rc-panel-darken-color",l),document.documentElement.style.setProperty("--rc-panel-theme-color-semi",`${o.color}66`),document.documentElement.style.setProperty("--rc-panel-darken-color-semi",`${l}88`);const u=document.createElement("div");u.className=u.id="rc-panel",this.LD===this._CONST.RTL?u.className+=" rc-lang-rtl":u.className+=" rc-lang-ltr",o.i18n&&(u.innerHTML+='
          '),u.innerHTML+=`

          ${o.headline}

          `,u.innerHTML+=`

          ${o.description}

          `,u.innerHTML+='
          ',s?r.replaceChild(u,this._panel.panel):r.appendChild(u);const c=u.querySelector("#rc-panel-steps"),h=new ResizeObserver((()=>{zZ(c,u.offsetWidth,this.LD)}));if(h.observe(u),zZ(c,u.offsetWidth,this.LD),0===e.length)c.className+=" rc-panel-no-steps";else for(const t in e){const n=RZ(this,t,e[t],o);c.appendChild(n)}(o.showNextButton||o._demoActivateAll)&&c.appendChild(DZ(e.length,o));OZ(this,{index:0,finished:[]},e,o,a),this._panel.panel=u,this._panel.panelObserver=h,this._panel.panelTasks=e,this._panel.panelParent=t;const d={...o};return o.headline===U.H.RC_panelTitle[this.L]&&(d.headline=void 0),o.description===U.H.RC_panelIntro[this.L]&&(d.description=void 0),o.nextHeadline===U.H.RC_panelTitleNext[this.L]&&(d.nextHeadline=void 0),o.nextDescription===U.H.RC_panelIntroNext[this.L]&&(d.nextDescription=void 0),o.nextButton===U.H.RC_panelButton[this.L]&&(d.nextButton=void 0),this._panel.panelOptions=d,this._panel.panelCallback=a,this._panel.panelResolve=i,this._panelStatus.hasPanel=!0,this._panelStatus.panelFinished=!1,o.i18n&&PZ(this,document.querySelector("#rc-panel-language-parent"),l),o.debug&&(0,uZ.K)(this,u,e,a),null===i&&(i=!0),new Promise((e=>{const t=setInterval((()=>{this._panelStatus.panelFinished&&(clearInterval(t),e(i))}),100);this._panelStatus.panelResolveIntervals.push(t)}))};const TZ={screenSize:{use:1,name:U.H.RC_screenSize["en-US"],phraseHandle:"RC_screenSize"},measureDistance:{use:1,name:U.H.RC_viewingDistance["en-US"],phraseHandle:"RC_viewingDistance"},trackDistance:{use:2,name:U.H.RC_distanceTracking["en-US"],phraseHandle:"RC_distanceTracking"},trackGaze:{use:2,name:U.H.RC_gazeTracking["en-US"],phraseHandle:"RC_gazeTracking"},performance:{use:1,name:U.H.RC_performance["en-US"],phraseHandle:"RC_performance"}},IZ=Object.keys(TZ),NZ=e=>{if(!Array.isArray(e))return!1;for(const t of e){if("object"==typeof t&&(null===t||!IZ.includes(t.name)))return!1;if("string"==typeof t&&!IZ.includes(t))return!1}return!0},RZ=(e,t,n,a)=>{let i,s;switch(TZ[BZ(n)].use){case 0:case 1:default:i="",s="";break;case 2:i=hZ(),s=U.H.RC_panelUsesWebcam[e.L];break;case 3:i=hZ()+pZ(),s=U.H.RC_panelUsesWebcamPhone[e.L]}const r=document.createElement("button");return r.className="rc-panel-step rc-panel-step-todo"+(a._demoActivateAll?" rc-panel-step-active":" rc-panel-step-inactive"),r.dataset.index=t,r.innerHTML=`${i.length?`

          ${i}

          `:""}

          ${Number(t)+1}  ${U.H[TZ[BZ(n)].phraseHandle][e.L]}

          ${i.length?`

          ${i} ${s}

          `:""}`,r},DZ=(e,t)=>{const n=document.createElement("button");return n.className="rc-panel-step rc-panel-next-button rc-panel-step-inactive",n.dataset.index=e,n.innerHTML=`

          ${t.nextButton}

          `,n},zZ=(e,t,n)=>{if(t<640){e.classList.add("rc-panel-steps-s"),e.classList.remove("rc-panel-steps-l");for(const t of e.childNodes)t.classList.add(`rc-lang-${n.toLowerCase()}`)}else{e.classList.add("rc-panel-steps-l"),e.classList.remove("rc-panel-steps-s");for(const t of e.childNodes)t.classList.remove("rc-lang-ltr"),t.classList.remove("rc-lang-rtl")}},OZ=(e,t,n,a,i)=>{document.querySelectorAll(".rc-panel-step").forEach(((s,r)=>{const o=Number(s.dataset.index);if(a._demoActivateAll)s.onclick=()=>{e[BZ(n[r])](...FZ(n[r])),MZ(r),t.finished.push(BZ(n[r]));for(const e of n)if(!t.finished.includes(BZ(e)))return;const a=document.querySelector(".rc-panel-next-button");a.classList.replace("rc-panel-step-inactive","rc-panel-step-active"),a.onclick=()=>{e._panelStatus.panelFinished=!0,(0,_.nB)(i,{timestamp:performance.now()})}},W(s,e.keypadHandler);else if(o===t.index)if(s.classList.replace("rc-panel-step-inactive","rc-panel-step-active"),s.focus(),o!==n.length)o!==n.length-1||a.showNextButton?s.onclick=()=>{e[BZ(n[t.index])](...FZ(n[t.index],(()=>{MZ(t.index),t.index++,OZ(e,t,n,a,i)})))}:s.onclick=()=>{e[BZ(n[t.index])](...FZ(n[t.index],(()=>{MZ(t.index)}),i,(()=>{e._panelStatus.panelFinished=!0})))},W(s,e.keypadHandler);else if(o===n.length&&a.showNextButton){const{headline:t,nextHeadline:n,description:r,nextDescription:o}=a;t!==n&&(document.querySelector("#rc-panel-title").innerHTML=n),r!==o&&(document.querySelector("#rc-panel-description").innerHTML=o),s.onclick=()=>{e._panelStatus.panelFinished=!0,(0,_.nB)(i,{timestamp:performance.now()})},W(s,e.keypadHandler)}}))},MZ=e=>{const t=document.querySelectorAll(".rc-panel-step");for(const n of t)Number(n.dataset.index)===e&&(n.classList.replace("rc-panel-step-todo","rc-panel-step-finished"),n.classList.replace("rc-panel-step-active","rc-panel-step-inactive"))},BZ=e=>"string"==typeof e?e:e.name,FZ=(e,t,n=null,a=null)=>{"string"==typeof e&&(e={name:e});const i=()=>{(0,_.nB)(t),(0,_.nB)(n,{timestamp:performance.now()}),(0,_.nB)(a)};return["screenSize","measureDistance","performance"].includes(e.name)?[e.options||{},t=>{(0,_.nB)(e.callback,t),i()}]:"trackGaze"===e.name?[e.options||{},t=>{(0,_.nB)(e.callbackOnCalibrationEnd,t),i()},e.callbackTrack||null]:"trackDistance"===e.name?[e.options||{},t=>{(0,_.nB)(e.callbackStatic,t),i()},e.callbackTrack||null]:void 0},LZ=e=>{e._panelStatus.panelResolveIntervals.map((e=>clearInterval(e))),e._panelStatus.panelResolveIntervals=[]},PZ=(e,t,n)=>{let a=`",t.innerHTML=a,document.querySelector("#rc-panel-lang-picker").onchange=()=>{e.newLanguage(document.querySelector("#rc-panel-lang-picker").value),e.resetPanel()}};E.A.prototype.backgroundColor=function(e=null){if(!this.checkInitialized())return null;null!==e&&/^#([0-9A-F]{3}){1,2}$/i.test(e)?this._params.backgroundColor=e:this._params.backgroundColor="#eee";const t=document.querySelector("#calibration-background");return t&&(t.style.background=this.params.backgroundColor),this.params.backgroundColor},E.A.prototype.videoOpacity=function(e=null){if(!this.checkInitialized())return null;null===e||Number(e)!==e||Number(e)>1||Number(e)<0?this._params.videoOpacity=.8:this._params.videoOpacity=e;const t=document.querySelector("#webgazerVideoContainer");return t&&(t.style.opacity=this.params.videoOpacity),this.params.videoOpacity},E.A.prototype.showCancelButton=function(e=!0){return this.checkInitialized()?(this._params.showCancelButton=!!e,this.params.showCancelButton):null};var jZ=__webpack_require__(9725),VZ={};VZ.styleTagTransform=SZ(),VZ.setAttributes=wZ(),VZ.insert=vZ().bind(null,"head"),VZ.domAPI=yZ(),VZ.insertStyleElement=xZ();fZ()(jZ.A,VZ);jZ.A&&jZ.A.locals&&jZ.A.locals;var UZ=__webpack_require__(5151),WZ={};WZ.styleTagTransform=SZ(),WZ.setAttributes=wZ(),WZ.insert=vZ().bind(null,"head"),WZ.domAPI=yZ(),WZ.insertStyleElement=xZ();fZ()(UZ.A,WZ);UZ.A&&UZ.A.locals&&UZ.A.locals;var GZ=__webpack_require__(2945),qZ={};qZ.styleTagTransform=SZ(),qZ.setAttributes=wZ(),qZ.insert=vZ().bind(null,"head"),qZ.domAPI=yZ(),qZ.insertStyleElement=xZ();fZ()(GZ.A,qZ);GZ.A&&GZ.A.locals&&GZ.A.locals;var HZ=__webpack_require__(9057),KZ={};KZ.styleTagTransform=SZ(),KZ.setAttributes=wZ(),KZ.insert=vZ().bind(null,"head"),KZ.domAPI=yZ(),KZ.insertStyleElement=xZ();fZ()(HZ.A,KZ);HZ.A&&HZ.A.locals&&HZ.A.locals;var $Z=__webpack_require__(4889),ZZ={};ZZ.styleTagTransform=SZ(),ZZ.setAttributes=wZ(),ZZ.insert=vZ().bind(null,"head"),ZZ.domAPI=yZ(),ZZ.insertStyleElement=xZ();fZ()($Z.A,ZZ);$Z.A&&$Z.A.locals&&$Z.A.locals;var XZ=__webpack_require__(2636),YZ={};YZ.styleTagTransform=SZ(),YZ.setAttributes=wZ(),YZ.insert=vZ().bind(null,"head"),YZ.domAPI=yZ(),YZ.insertStyleElement=xZ();fZ()(XZ.A,YZ);XZ.A&&XZ.A.locals&&XZ.A.locals;var QZ=__webpack_require__(2921),JZ={};JZ.styleTagTransform=SZ(),JZ.setAttributes=wZ(),JZ.insert=vZ().bind(null,"head"),JZ.domAPI=yZ(),JZ.insertStyleElement=xZ();fZ()(QZ.A,JZ);QZ.A&&QZ.A.locals&&QZ.A.locals;var eX=__webpack_require__(7271),tX={};tX.styleTagTransform=SZ(),tX.setAttributes=wZ(),tX.insert=vZ().bind(null,"head"),tX.domAPI=yZ(),tX.insertStyleElement=xZ();fZ()(eX.A,tX);eX.A&&eX.A.locals&&eX.A.locals;var nX=__webpack_require__(2551),aX={};aX.styleTagTransform=SZ(),aX.setAttributes=wZ(),aX.insert=vZ().bind(null,"head"),aX.domAPI=yZ(),aX.insertStyleElement=xZ();fZ()(nX.A,aX);nX.A&&nX.A.locals&&nX.A.locals;var iX=__webpack_require__(8470),sX={};sX.styleTagTransform=SZ(),sX.setAttributes=wZ(),sX.insert=vZ().bind(null,"head"),sX.domAPI=yZ(),sX.insertStyleElement=xZ();fZ()(iX.A,sX);iX.A&&iX.A.locals&&iX.A.locals;var rX=__webpack_require__(2535),oX={};oX.styleTagTransform=SZ(),oX.setAttributes=wZ(),oX.insert=vZ().bind(null,"head"),oX.domAPI=yZ(),oX.insertStyleElement=xZ();fZ()(rX.A,oX);rX.A&&rX.A.locals&&rX.A.locals;var lX=__webpack_require__(663),uX={};uX.styleTagTransform=SZ(),uX.setAttributes=wZ(),uX.insert=vZ().bind(null,"head"),uX.domAPI=yZ(),uX.insertStyleElement=xZ();fZ()(lX.A,uX);lX.A&&lX.A.locals&&lX.A.locals;var cX=__webpack_require__(5319),hX={};hX.styleTagTransform=SZ(),hX.setAttributes=wZ(),hX.insert=vZ().bind(null,"head"),hX.domAPI=yZ(),hX.insertStyleElement=xZ();fZ()(cX.A,hX);cX.A&&cX.A.locals&&cX.A.locals;var dX=__webpack_require__(290),pX={};pX.styleTagTransform=SZ(),pX.setAttributes=wZ(),pX.insert=vZ().bind(null,"head"),pX.domAPI=yZ(),pX.insertStyleElement=xZ();fZ()(dX.A,pX);dX.A&&dX.A.locals&&dX.A.locals;const mX=new E.A;mX.gazeTracker=new q$(mX);const fX=mX})(),__webpack_exports__=__webpack_exports__.default,__webpack_exports__})())); //# sourceMappingURL=RemoteCalibrator.min.js.map \ No newline at end of file diff --git a/lib/RemoteCalibrator.min.js.LICENSE.txt b/lib/RemoteCalibrator.min.js.LICENSE.txt index 4f91e5d..6e22231 100644 --- a/lib/RemoteCalibrator.min.js.LICENSE.txt +++ b/lib/RemoteCalibrator.min.js.LICENSE.txt @@ -8,7 +8,7 @@ /*! * * @license - * EasyEyes Remote Calibrator (remote-calibrator) Version 0.7.25 + * EasyEyes Remote Calibrator (remote-calibrator) Version 0.7.26 * https://github.com/EasyEyes/remote-calibrator * * Copyright 2024 New York University. All Rights Reserved diff --git a/package.json b/package.json index c1a6ca4..f8ebd51 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "remote-calibrator", - "version": "0.7.25", + "version": "0.7.26", "description": "Useful calibration tools for remote psychophysics experiments", "main": "lib/RemoteCalibrator.min.js", "directories": {