From 14b3b23686f02f5f37a4c7eb55c6780ce60d1579 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Mon, 29 Mar 2021 15:01:16 -0400 Subject: [PATCH] new icons --- assets/icon.png | Bin 124338 -> 142790 bytes demo/favicon.ico | Bin 5063 -> 261950 bytes demo/manifest.json | 12 - demo/manifest.webmanifest | 4 +- dist/human.esm.js | 98854 ++++++++++++++++++++++++++++++++++- dist/human.esm.js.map | 2 +- dist/human.js | 98880 +++++++++++++++++++++++++++++++++++- dist/human.js.map | 2 +- dist/human.node.js | 25544 +++++++++- dist/human.node.js.map | 2 +- dist/tfjs.esm.js | 76099 ++++++++++++++++++++++++++- dist/tfjs.esm.js.map | 2 +- favicon.ico | Bin 5063 -> 261950 bytes 13 files changed, 294465 insertions(+), 4936 deletions(-) delete mode 100644 demo/manifest.json diff --git a/assets/icon.png b/assets/icon.png index fae4db6f9864d3fd684794fb18173cd69fbd9884..125bd4bb576f63a30792ec3c442bfe2b4f64058a 100644 GIT binary patch literal 142790 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\oj&k{B8>M#VrtD4nUQzn7@tjH=C0ph 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%0D$Oz{QoX3Si5wfF<9>Cz9$2Q9 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 ywe> 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 literal 124338 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 diff --git a/demo/favicon.ico b/demo/favicon.ico index 1cbc04490dd7488fa515a98e243c113ac220d2f6..346ff661ece19720f194d8bc0b8cfab01c64432c 100644 GIT binary patch literal 261950 zcmeEP1$-RG)gQB%neN2Q%*@QviJ6(1S+ZnF2AP@Jj_ufvlQ<3M3pCI)ZJ=q>Hfh>G zA?*M6_8hsY8)NL$c5eJz@9FM#cjn!^nTP+!*dqGJzGU=2pP66@Q(=sm(80a^DIMJV z!uH;h%V*L5A_|BoAfkYX0wM~CC?KMMhyo%Ch$tYUfQSMj3Wz8mqJW43A_|BoAfkYX z0wM~CC?KMMhyo%Ch$tYUfQSMj3Wz8mqJW43A_|BoAfkYX0zWAQBo<$OoZK?TRK*$N zOEIRrf-z@p#)1qPvr%L0g*wKT{-nJUJxoLa5e4ox1u}w-S%QZ)TeGs3d(=|madDj$ zOp$x-#$T)&X2A3f7?XPMr72b!t0U}=x(qE2|HGyzCB^hq<(P)N471|NF;8Pz=5MJ$ zXK9vbE5@=MSFluPY39rqVAfmt(3WVD$uqan;7UrlSo9J(v zmh8h{lj^IxJ>JjqY+JleuaPZ!qSezd}6Nc!^@HorIznpQ-p6EOrVo77K~A61Q~HWID!jOw5DNm?%R1 zr~H*f&$=HdV5cj?@ZBj^6la-JURC&6MRfs+%JU&ei9&u&6_T^FkyloX`o3Y*uiEt0 zz})J`2kQfE&+IK@;>(t^C5x8dkzq=Si7~NdE0~guB-2)wW_%SHrl%&uj5TGLnT{;8 z(Nkc-_Uf!L)s$^&uwZ(+T1%@UReg&6<$DAkN_(>cv>z`F)_OeJ+w{p0AEysOe4IZk zjy8WcGsgARj99lUZq0JF(Y+&m72QNcfd_>G_WE)R*v;zWwX18YbG~cbdK#6x9!GtD zJIeZp(cWH+)`@XcCt4%3aTqHP9>vyfhaMXLqA!owu+7zaLQ?ozE8G@Ibk${;u9hO* zhsX9;%F{iR7t1RsESHy4SRo~)xI$K1T3l6LT2eNl#bqGORaEl~qP4@y2ttc1#Rp{I*^tGkEH`o-F@2$X=M>@)|tbD;O_VC(Y7bjWe>f_qq7JVY3z`aQU zb$Kb;|H1Y&XtAd_C5aqpLGpr14m3fb=EO*^%TRfg*27v_?r| zJY5B|x$0O~q=|LKS{O)GMqRiJihLv>2)9FKMI+KmYEanHgZ{}O%uQE)ynQU@?51Yx z;n6G=cPk0DG}~K}1z5{5E!iJ$vs9NSo5vzCmgp+OGF&BCpusYh=_bR1%p_QZl?)3p z7iSJ+bL5($q{!ZQ%ah_~aDlWKHxI>_x||p@Ruf|mI%3RBOM-=4h_OtXQ(?B!^!YL- zFL`+$-EESDxv0<@P{Zm|dEBEG?PxKK+BTl}a`mPosMv5A#mUa7E004J%aTQVtJ7L=itT7J@Yy&N z`FQ%>I{G5|4?K-S@B9UiooPQ?<-_DNgSBqual-G)N=mTf z!xn6Ht&!8(VzoaO@$49VZea%bT`hBxYg2iROxfsbR;(4qzMw=SL7ji2{opjpSKFqQ*}^j3uljUYCV=sB_O+bg;v)Vx~LxU#%zq4^{i0Mf%Vd zRBw3%ldpb`^1W|h=c}*d+`gQ3#Q95Ga!hZde~VZ}BA+#;>+`l&YyPseHU*hwm1NHg zho`$8EKK+?)m4GLu`0YQX)W-uM{H_3vMcJ5Ti1cEk=}1MPL~~=Zg#cebeNWm%eKfc zSK5K^U{jXku``24tS?i;cw?R6>5fv*uM*M)h|H-#vLFsw1sRACM-bzzBj-q$6>x=zEZqIM4)d&VgScdq5$XPZc9>S)ln+0HD!q(*3N84 z-PYr%BVSw9_!Qduo6yx=hMeqplx}_;`&UKaY@f!_ICmMzxk?i@lB>%a6G;EO;7oq< zA1BjZk8I1yw#~JFoN!^=noN8rnnT{tsBJ^u)FBj39YgD*pQ7)HKVtJ(91gT-jWQ;` zxHML1JGkC$ukqRC_<`;9I$b;3tS%K-7a=CU3Sp_aLcWhq%R_!cFC9H7YwkjATPs!$ zm;8NhIB}>d)ktB_RGjd>R{FBnxc{xc9YOK~@Hf_+tj#_?V8`8HQLL|l!hsHh{Vlon z2&|gHOiv6ZdXh0tYgT(xI$E2u5Z|>Kb&a{-3})+|>P(O`*;S>=c&b0n?r`h97hQ3$ zQh?+CBySZa@KKZ*&Ebtq_osX|aOyEkAK#7fks@pwjKs)rF?MviplRz7Y+YA`$49i^ zKQZE5GFfEo-w>~38fLG&d{d1+!|U#Mb(l#(eCF+_#pKo0m+x&iUB9Zt7@;|J2&!C# zmFM2ZiNBCkvVIJk%T#tm`|(!fh1|ORj~jrTlmvTsvmu+S)QP?@toQfnCO5=pCNXoB7VqOKp6El#X6^+fk!5{DGv1_b|l#yK5;V$%DNG!jzk$rrMJ9=rgB`Xfs z)YwpMka}UlVc@lW;YXiYZS_e_aVV0SC$X*71|2OK=*qK4Mokkk+9xnMS^3eCLA$=L z6jklNZP8{}{H)!(K&IW#MvXAQW_S9Rqx7})| z>ym`eSoH8p`-yE`ZU`zLLrTjm)}DC*C;$8z270qGlO^|bny-?2j0B%P!9!FB`9oe!*rEB+H2xbRW3kG z|6zUwo|JbmrukGvdoy;S-aASdz(0i_%aRqKd&p+27^`D4L{t-M)|F?2ta| zPFMH2Flzkq!7fXL1-ii}BnqJ^g$RhvK!AlB1`_1I+1sQuU}mDRye(6Yt*I5F(BGBe z=Y?yt;%J`66H^xd_w0HX6z2uO-BBNcP(wu545PLt6CK6AsHiPQdhZ7GPWAkD@31GQ zh%Bxmd*;Vyf|%IypT>84R|p`w>0PIQnvyJAvSc}XV{aInsW8;sKN-DaWb52_9b0#! zyrmj70$a50KZmgm?T87rMQTMY_HC)eo4Z|KA1~3>KRj^fY+ctHY<`3$_tBz#ZF+-; zhTKp$wFCa1&hX%^K)9(Ck^=3}(pvCBYJ|B~qz`2X-e%j?tjl^b)SXWbnEh#At0BTI z#9^f=3ma_(xY=7HH_8F)3RPZi6=)btm+G*;pK`vCx_c5lS86aB`?JG))}nb)%#*4`1|^Z9W1_QUvrlNdXFcB2ww%L5_; zZo5Bom6~iQOW9_oJL30^rNIcWRfV;d4D57O5tWcaw)9}EDN@<0uBE&p*_ZQ!+?kxC zYjwCj+nW1m$@80iCim}bN8#K>xEGATziB5@Mvfq~aXsS3A3^QhejJ<$TU+DHB$`sR zSV^oXzvx;t6}^9b3gDN4Y)6Z6*p8v_54&jJpLptR^q+bOd*AvH#V3D{-0d%7@2_6Q zqdOB;a&yzg@~80!ZtAdSJ3B4y);CyxP%yL^F;#{++Y) zU#m;Hnw*Zdot>U=DA=?z{cFGG-LNa)f%w6rDBJKTayGtzgpuQznk;)`bG@F``AJLm z*VA{`9(%36ir&BfDX?Oh7>o2XWZHVX<;VN2Mmt-xz7-7aLiVboXgcsbnx6d}`A6PC z|E`UfPK{c1(})-8sNQ`(kR{uEg}{{c7Mq*SRU5uj+&7ELHK)+KZV&$WudngYuU>gC zGt191FT>+U{RpiTx6_}at-q_o>dlVcTI81$ps>6W{j2BDKerxzIaXgx<|t*nzn;fr zByNA5x!F!?sc<=w0=BK$ICs3*@GHOKAvjl)?o&03+{t4|>RONbj`FXz^?B5CzlFB4 z4D+)7Y1ZSL9fRn5_ZJ0v${g9g9y>NsZf3Zv#q7nVEPF&yK5IbZR&<~H0Q=wn2L0ICEx@0V6pV|MQ@Gz|8mE1CaEuRuAVpYjyR#CH1+ zx```Qr53Y58*XitSvrueJW-P6kHn!P>c(jWU8wJ&yN@id1Ecr4ya zWaqyL(u%%v0}3o!CgkbG6mvH*k*Q{=qnNGad?fL%a zA66F6XLSO7o$WQ6uhwQbQVei4vI~kZuxTp_YpT(cr1@b>qKZpvqAFXm`0mEj<%er9 z|L_nN5SO4ElN9w*RAD1ZHavm6-Z_*^9zgE;C$Or~3unizXBd-QtgfcamM#4;tKU2o zL}w8NmXh2F_Q;G|&%sWLdreG(U+Ea)>nAXHV@;whSacb8&P z;u7qY?QU#Si)Fx2n&RI|DoZF{@iBDG?!v|2y^kYviElN8Ei=jwRij<`_W80ZQI9pJ z8}Qbbs=rzk&PQ5NIRx3cXq{eM__SH_%a!>WM8l^t+G0Yn~o%;MNJ1yB7j19E~xLvx9}PjrB$u?Xj|7 zW>bDk^R6e*xq3G)y!|%zuMGa6FGbqEO~CmH2{rUKTSt~Y8z?Z)n=MrPRi=*$l5z@> zoSB1$u{Frf&qH^->L>jf>H&Re>UUlLx7NLkhmh0MT2nN#^*cdz50aWz!9TYh;bpy8 zGnR*!=ghv`*{qiXgtAZvh1(pp=rR!n{*wY6|8H$FWW71MMidM4+PX?ZB-alkXXYFP z6mz=i?6Y|6lfR>TbBK{N+UTb25ozvM91uIod3;l zv1=&c<5juxK0BNEY{id|foH0W*krk(*;Jm|JIOBch)c^xVtO{J2d9yllY@>Jm4B?v z*NEF*qs^8rxx2EqpS@6*Syb58(O)vMiTwQCn0uIVo?iSDy0`Afk!}k-HD&l@W0Hn; zUpBY*i}L&K;uQSZ-P+YkDB~_Z+HX;RqLcq+Mw~k`MvtIqXd5Q?oyX}ve1eHR>$eix z)`}3@yK4i?3)f*jezr^IDs|Ts5FSr-L=f8d{Q_+>yYcX^e}nD4e*c`!S4_ZZGo~zi z`+YgsW5#AG4eiIWR6mHZlSXv10C9p$l=n;^Eh`hv5lUYXK2QN(F=vX>xBr|QO(yZ> z;w(ATlqH)ov4+03-MMY!C~Y0WBfohUn|}EYda6V4*ogjLj|^HQ0|$k-`!Va@jrt?{ z{O3o3Fn3KhTW`zS^KBF_Ogijok5@!MObXKaccXG(EjC?z6B~~0exV^&N@uv-lKI(E z^vzvrUe+qCAkI)~LpA?sijz1(1AU19pCG+_7f!wT8*J|K{)YI!6!2x1y0ZTawP1MNHXMEXKg$6TT6rL!yTSK8U=iDiWGnU3z+OX+z{jjbirOyIQ zB?$i~8c|7U$ZzTu@_$vJB39+9lD%DSX@v9LS?}bjo=B9t(1*WduEn9drmgPVRKgP8 zdErTn9eV_=$;LR*ZSdCW7Dvm&<8Ca*TbpSpiunKj=eT=s1P&IOtT@%0#YEUio*1^< zTOTHe(3nJ|b!|k=z-p`}4Bj2XA&=LEF3}jyR%M}1w~oDeGoxv_Om*R5DFt&9s`nK*vaj+it z)@l9g@Q__9ejmza+dXgpM-^QuqQFg1KvhwOotyDwn>t-ANe6g4(Owe4WCuuZBrLAs zSxm1R$Chf{r|V*r_@lX6gei7s<4+yTI1HR}wzJKws3%$Z8+Xe23-Iwm`_A*|SbG46 zUVatbS!P(BtMGPpjG9>y;eWip%km~h_Mcx7UqSJ_8g`2(3w0**y=CC8D~14HZ-f#5 zrFvVw%o<)9P4(bDC zalA|a*RxG_#@l-wX`Q>f`A2tSe4=~ae-voUv1X;|4zhdOOdcxom4>H{ArdNjP)NA9 zgKIZoO})$4v-!%+jL9x?GgBlV+?@*uC`;h-c{LYrZ#EihidKNL_6ow}^+)UWhtad~ zDE7bbGMW<&urgi#^N}p|m^Ws1Z`n4_$rx4!N-WG>TV^ar^JI#XBwTr7@bz*d{!d40 zQ8m)@ijd~4go$*ek2+J;J^Irr27uy{?o^9(RbyN|!3Ym6$>{>MjScBmh!SL>rh5oI z8+IVc%Lqe>@;E(caxlRpB}qOpwFMY*mU!ShhIEg)13+Ypsfl{TJxzb|opl9$_T`Ct7E` z-JB4Xlqtmg%qSonFefF9q$vJlsz5Vtd$kr}{@i}7;lkdDEtgM>~sycb?BdM%>BU8lf>2`jd_*&=efK;v`H z2IppPgT&G{lr(mtXJingnOc`-@>JJ)SSd?nkq+Q$a{D-3^Mm1J^0Z(bR-b01wYSya z|8hK~VW++VkumXvNpKuv`z~PXg~w6sua0K2P0r@2o=Njpl@s_VvE{cQgDj;wI!{fR zv9SWae{+n&U;T|GU{C9er;{D=e-;w5i;z)RMs+`w(HF1q&H6IUY9RcMVQS(f7dDim z!zyC5wZ^klA1Mn{LwIZq;SLs|eP#oqylqkBA&vcw+Mn#|GzXp!0m2)6HlD9tQx`7xox83CY}Li!VQ+=742-%QyV7EzC)YrTC~ZITekiquClA&5<%+C-|EpC@Ky`4Q(iHXhNvD0$Ri5aiUBA z<>7L3-dKhCkA1A@dJzR~i2~JW<}5ANMsk0L>4CBUS<=IaKRkSpSWLNi9YbiTr@bmt zhO>`7UmK%lvZX?c>~CGM0-=7w=^7e zIQ|!hn~gcbQ*x*dKsGW7^FQ7}4XqJ!*ixx^vL@9)x;OX7VIR7hDKT3k4%;Y|YM*LE zb|omjpXMrskU&p_L?@u8Zxpc+frzt^#6+4h&J3AuH#X7{vo^dte%2qNkLW!S1vm<5 z3b81_j`Z8K^du>N=dCXeJAF+=W>q4GYG5_@4WS~8hwd2JOB0zY+f%(&6e_}1S)%*x z&sARs4Pgw@{%(t=)kPYYqO2u||HY6}SdGe+yRi9*H!!|=4N`4okl`ec)<^|Vd@k7l zlokv8Z_Yl?VeCXvtYcvmUv;KP^T`-nDcEV!I-@QD7b_Elr&2wQq|0{r7<&yg1j}Ma zjn>PQC&XJL!5MeuI;GRVGZ#bw!O(pFXebhBFs)1ej#CqCEH&`XDEWrl@wC!2CS|3c58ai%nFr?bsx996P*lo@R zbNQ?+T1Sp!^gLk5im+^}TPkaryWqiAGX{$9rr@pe*EnZf{Pj=s+d$|K3;ri0+XN z;(tjb+sV>%<*}he{g?HLTKuY*o7?~OH00UWXB^q;N`n}RFZhSI0m&G||J?rXY^IOM zv_gc%Q@jK5f2@->@uCcN*J%EIdz(efnPE;3zjYtHv#Aox3DII64!q@)`P$u8!E#>( znn=LgPzv7Op70BcMj6!~i}ZCwtc4VMVij?^-{93%b=Lg#E!MY6#yj@?3JNv6-f_ns z^fSHD^=Qj|_P=h!m3FMLz)ALKulYl@WN-JYQF)7{z0?sRkNnhRmMpNm4`v?f>@L(nziBLCwSt z9C+hnwDr^@*_!y@Ru+XG@{}8+_J^)?ZM)VKO^QRfv47svMvdW97dBh2m){nr__c=~ z$rzesXVjqm-;9swjADewB~uJg9b%k#sPdD+&MJ*>9~!l-12!=&K zkL-=S#FiMP4};Al;YKz`cM~;u282+|v4H$4%?L14My8`IX0nxWVchJntDTONul>!f zYj3Y3@oO5R>uTdrfh;n(+{mRf^EqB&x63h-fEWRQPiIuZ{~-wrd$vUKZ_jYgpS{?d}6@hHRuj z&#Es~_2qENGj!og!dZvxjdm9B2nd6qr~)Y|@d!4OK&iJp$r~D%&Wu@hb9q)`x8T>j z)AM%099=}OuRgBG26y_o5BmKU(3PX%)pX_l7Si^AO^4-6#2GI7k}uFPV@s9J7x83| zcP3l84PPC>(MiZEDnm&{ITGwu5N9QgB(lqO$0~lYwnVdn`o3t%B5|rice#fBjm9Fj zOoHw2vt}EcE&NXO8vd<4PX03g^A!?-_cNCj8q#blK`s8Pn z!S)I@TwG;+x;E2RcD%~wMvu7iITtTjm&9jy~ncTaD4 z2ZtlKx)H(7CWyC`LUSm^{PpPm^FW_f;S!Y*t?SoUL36o?d=PNKHp+Z6i_x zY!G8Ei5N>66nMyCb-wCrlpA2WrH04cjc+bL|1$P<65G>lnRT?w;LDCU$~`nE`JbS<%UhEU&WIJ4bV~mdKB&uNw#_@j-<^6z@ z|LwJiAGO5bZoxx*UbT?_GppJV>1>D+PtF#vhNovNUYV@2$~fXBv+-rL?~YxV3V*IRnl z-T3l?xysGgg>#jAePs=}8_#|a@40}USFfiWJ%#%|cfMEJ?tT|G+2E{xZp`wTwpe+g z4#3S{M+;L##3UfEq!hX7@rbpOL9_)Y1IUsLpm1qZg=U|OywVa29T{e!b7MWg*@E

u9Tp3KRIZ2Q+fusmOZ=Dh^;Qyjp<5M`qYnfdwVU?Gl=({ zbmigh697;DU}Tk5AW0|ZXcU!} zAT!2~cwb7W0|*@CsBW&}cO(N4cGj{*Ry-LdD|UUqd2SR}zfxt%?lzOj{mnXPj+TRu z0mU2{@Q~QBN|^hz@4YWkQJR4)@;78SDv)hX9_tHLKVDhP_Z-dVG0EjO_Bn>SQJmsu z_H0e1USV^z!Z*Gole>~V&O=umK6ZvkENMXm#s8FbPaxXeT)6*lDyBVo!r+TNon~pz zt+62A=#A|R*&*62FIr!GO^Nn)E|0;5$MODUJ;T+~0PX>y2#km!8%hzvEEI&g%y5!C zE{+*|d2GZs3(x$x+D3PJ?q4;3Iazg{|L50$D|7r#Kl^^a-wkMYPs;rZX?}FXnXPYi z40&wA;?ox5%Sg(XbLL_JOsQsWcsQ~%(@wgvnuNOnY+UH2St2#~zOV%d(J5 z@o_mWiWHk8k1gfuf9TB6v1?7$zA68og`P6QFI?DMjbS|P%m3tj8kAm3a)20o9E^oI zPEpAjsO+0Ww8v%sUtge1e5v>K;XboM{KAom-@wjbq9eyn^qR2Q3Vp{xfy(=#WE*kR zzRdqlv<`T9c)*qR|M-ktB*sUO&tF_j_NVqC5|Uq)QiiC<=3Ac2;ZrvN1)6Uw4!7e@e2l?3uL= zY+aqH_h6dJ$I%pH%-Q994JrTM*#Ze=9f+np-0Fc+PB%gmMJbe6+RZ)X*H*;i=Jkw2i zM#ow-@xq+-`TSTDg}OB3|J8K8?sFH;S9;Cu{mZ{UxOshL4Y=-2enuY>P3HNV(~&qD z&C`pc-F=}qm8V)VZGGbv7iS$eA12+rEI@|rfRe&^V0R}c#6^drFh2|VIRYd)DAO81 z`Z?(U-7yN-QlYuZ$6047mm_?=R+((X7AY8U{J&;TgElIIF7v-5#TzC!u0r?Re(Zkt zYgAMfqtsm*)}+& zVRYt^+%L2-io?Uj5pI6L2#$FrT@3ef6B?=J$Our|$-BuD<62T5&X4xK?s&z?HR<``*3Wc-`JW^tGrv(dZu zoK6km5eZ}#Z*MXfpXYxclF6NItdZI>BdqnZ;te#`muo+tNB0V&+=gHi!Wr~-L40YuFc+t3d=28gEm2H9`?Z(( z|Es+n#yRiou(+llL80GSD{O>~XKCVW}@S?rn)yoGNCFMv; zjzzSYl+fs{eIV*j|=8Cw+3+Yc*TN)TLb3zyzAZOf&OeE z4d^u|=P#tuJumlP{p0NIcVg??oLrxtvHH{c5;f$JP0Nk!X4aar2=MnqVst2q3bK)x zm4Z|!6|&FE3H@1IeBOpip5N1xhD=4~+WV%v_2n9S+nNlUN&df76Cw*=gB5Uhc1C*p zTC}aA`2TmmLQO{-Y6z38F@$n|h%dL-@o2x4UL5arbNN5qxQuj^Sd@>x)RtP^W1O53 zYb${WbHW)6@Izd2E8?jRP{;HJB>UT-%!}mzd}XS?q5F>w^@cIWdJX9g*VfB{^X%j8 z2Ati$s5MscYYtn4voCT!6Awpgcm#&QH!v7gJ$(psGlRfR2BXOo@879~7uQ?9wyxFQ z;QXvB=@>WmWnBFm{gi)SHNUyNO>Dt&-_7qkO}hp3nO`60>2u$$kDRZ><;4dWU(TC#v$dicJ)y`-i6viPF)~6OgmLUep7MkdqV(Oi8f~f@IKZ-l zu3blyr$%^KANx}sGUJSWO}sA}B4}MPS`HuI0A%%SMAP_2?0frPs2iC;oxe2N==tO; z|7K^Ceg#m+%=tHu&o3=5&G>e1i?`Gn%rr;Ifx|c9>I?*hMT%@L!k=E{$Bj4U> zO4Hcq<)3-F%=11c1KgMTQG}0hPA)n%;n;k3z~I}_bS0q<;7E2YE=DILBoqmefkGJ| zmt=q}4|QRDPJaT)=rvknk+|9 zOd9eAcc6A~4fenJIa=56Lv4^e*~?_HsYLCc+nbFOzC7*3JIet0<69^F7Aa z*BEsX1_#nzsKyw@6ow>ZAUdlIX?evM-+2Ie@jkTHQ2cMXDlUxZzuA|oXSAc``n=hc zrq8-^47Df*`h_fa@|Dv5??u=N9u5@i9~cgAKYuh03_*|*MKP07XbYFefjV_OH*Nfn zLjyL+-<-dOvjBQ}1#-u$Q|#BEy1^kwozT#RbTYb|(xw!swuVdPkMUYuy<-`t@X^ zkM;OrIbD|We=6hotVy6}dbCsjw}UB)h_VzzOi>#OMs}mTYZ7~3`Va%ho<}v|fA+>m zV{@t6ryJ^wLXP*FQ(pef%gcB_hhz;swzkT+o^UvjW14>x@c1@`)88#Y&K0F zJV=h=^!`LaI=UvOD7MfLS(NKHo~nqmJ=%C`#{9XF3M-wx{dPiZ&>w!nz4z`_^PSTJ zBo-X^oviy~DZGFl9ItacKTi)%KDx4I{@CaI)YmJ^%dxIP86R)>#l7B%nH_G z`H?)8!<`0CtjbkEGGPm(cWpx9&~}Q)8^N|GeuFj7{uxyQ5A;S$QtXe)r>o0!L-w^A z5dP=Q^S`2uEW^9nY^p@Bu_sZH@C2#$m%9<7^Xm~tvA<Lh(zRDYodT3H|TRj$3w-*?+OG!_E0Ie(K-sDiOn1#GL~jmvB4Eh&oBVLZYX`=M4A%V*Jk`eM79 z^>=TfoSVEzGvuv0gS_7L$Zs6L`cuzi_nTj%uDJ#s;SyMzr~Kvm3Y{!`V8gh*_h#F& zrDTU(>b!Wil((`yRt_01#Q$Ldh|R4c9Nt9Kcl2ZDBNs3@Gm3G-;XB=}{oTP1y*BRt zhFU-T98Fr+ien8}t-w@yT^a9Du5Lms#TEoutHagP2hJ2LnUIu>(YduqiS|Pp+5Nhy zzQM5;4Lmb#{LWm1nf*D!Ts}E{f7bX}F!#B6&hfp}_Xo!Z_odEzv-64j9*uF~!O1=I zyw9CEx#-I0w{qWm>ANxhMyxB}g0<$`D4!iMKeM}56J?|y2T|?{X9sYywnR`c;aLQD zA~P`p1v$ycPjEwPlma%EYP{T$rmH`c!)JKf@dt+`2;^b}r54Rq>Gtof*Fa5<4{~QO zAhT^1Vrg&gSiKjAfAbZ3w;w}uq!Okw6tJ#XbAs~nmt+Rq98QLcoGf!OS7Gr!I&y^n zccv zzy(J(Sz-`RF@K+>QH)fC4aNDpIKaup6<%K6Xzpl7_v9Gjops1JLV1$eO1LwkBl*4ch`^XOx>>he^;ryo8oUF_7zx4O#2VM`LanAEMxBhWF|3I#P{w|b1 z_l-B(-D#P0x>x_RA<|zH?I|Cai*eIegHJ#Zf_yy@8|;PL)JPO%$D=sGk?_Hkzn(4B z>|o2)sg|x9^EChOctA6<;d8Yv)|Bh!9c|P4s-rF*dDCZ*P%{jxz!ZdLR^q^`A7T5e ze?WVdHAWJoFju5@AumK-sW?=X>Hysg)_?@z@aeMlG@j*fhRVCeJ`%`|ut08Y3qs-& zVQFJ0#QxfR{4A#SAH?1cD_j`leN1u8-fPOV|LYlYlF}^FMU6F3o_}S$p8BeM&9jw( zG86|z@ykx;aB_BntFt3g1p-WOT#M4m0wI2J7p;kh8Z_|Kl<}LZYfWsPo3puxxcTd zgpDbb0Yb?R;KC<1{QLi~d_Tk91KN+BD7eHCBx0YW23q$bT(xmO%jFdAK+^P@biZ%{5rLpXoPxcOpZHasn>r z1-e-o!jEzS{5@R|<>!p-IDa&jrJ}yE6wRroSe2#pcx|-0!DtqT^&QEylor|o#At8U zW5ap6Zck1ce>B@04X3zLgp>{Q$MM_#M+`T;D7oAEu&1Ac%tVLN{AByYi zaBf`??a_uWH6?0luP*0e6#w0vO_Z6MB8TS>)|alC(w(6AmrOTlgnOF9%fp3Ymu%rn zwafGKbFqFS1ICr!?_W*Vulsij<@TC;!O_&$HNV9s-PFWK)8 zZXLLy2jAyIywd#zW1W|I=Euv){|}_h6YFch{2V!5U1`bT9*d46t^9Aec%THr2Jkgg zfj{m4{!~jd(9H%J(LSiI%t2{RDC)wMDP~{x(qxwErc@twg^pxR_RdCA(s?i2?!_s8 zcOXxX!^(5HIBxRc;8Zu_8)lHvy$KaP)7bmOYdHAgyEy;bkMJ5X-Kyh4+rk?}XG0bPkQ8fAuAGyw9EQYk%L3rq zizmG|$j60Z={*P|$QT}ksgoSxipD4vVNP#tgenG;6uubCRBtoaS6`Owsm9z0AA7#_ zWb1KjfaA#?{XccD8b@Z&79`e=pqlD`%su)RF1-6G{`~DFyz~t)vSEz;bJCP&toBlE ztR}B1L4z=Wt{r2nAT7%-OjxqsY~8@&H08hLkqxe}q6F2wV}!w3Nwt47DE2>x)`MYm zjZb3ZL#J?ZPbJRv^Iqsk<7up|yv+Yx{9u=W&qnifS#3N|XCy=IbUD=t$n;S~CSjo` zd#J+O)fNus1{4<+gqc-C*s^ycI?6+^CQBZV4e`G{H)=Yp&(m059K&Z`HaBOxoTt(K za9+S0oZK(}{lTpRS8Rdz!#J+j#|2~L)-+DnnI9*&_dhV}+z-)!)780##~j$k2J?vH zoq8Y5=Bc0|jN<8CHHES64#fZVMp_7QwLrWF57lYT=xGw5F2R`UTPgf`Bug_Euw!;q zi+jFxWa_cLTz$v=O*((o4W5@@=13pAJ#@%Xixt)U9T2aarIAwPQ{Rq3ljFG=JGf{@$Ti!`ch7?YNZ=wzz> zlUs~~o{>SUAf zLwtZ4+$^T9b@Yk(D8$sQ0B=z-KQH#C>VV`{V#O$GjFkD$D|0<|Y=<23mL8Cq;0 z>oPt_7h&cN=IgueZP5O3?MOPZ$B&|BXb#)Xy@-##_!jSc3+#ITEA(vHg1%HO3@6HB zYnkfj(?wd5JL|Nm2I;lqfD?TQ`v(qevOuSKSU`EVep1K_(nLgDEJD*tgxKE+={d;C z$;HNP8?oo{Q#iLa5XaiIU+B){)Bb;%|1I=r9XVk}`#&#oSfKoIHpLI-N0^{EFAfob zZg6w7fg9QU!~NV*US5pstYmcL+Tm=!E}ogv|72&2K@#A_Yz)<|=sy3Z>Vxy@D*l+~ zf9`z6E_T0;cEQ-@*EdCak2@Zi_3dVUo8ovAwzb)e_2(IyogXrO^{JIcXiCyWfQuRY zTx}5S>4?mPP^3ruqM$!1l8*;7=s;?|Sz$6gPLGAzVW!`%h91@UBYrFR5N=7A}}DWs2>) zR%=P)_}6{WOtH=g7rRs)EKM=YQi!%!gbUR+jm&Kj)*8((D#pGON3iqgEXCzo<9G+} z`JODE#yaBvWLiV=L$z357*BC^k>>Fx%2UeqkU~MMHFB~N5f7hP!A;SI6tHl9+$n6Ry?g`}zF^Ji_hwoD87!{lV$S_q7Z_ z{h#0aIsImy_qnz0XR-Is&r2h14%<`6bBhjjnzX;Z!Rot>%?^kQv_pWCF#_D|5a#cR zln7tc7sg|tgK}#tLeLT}g9(8=SLgEO#sp2nv0N>d8?3?Fh(`zV^lc~y=noGMS)g)o z3Ppoku>ROZ{OW6`Ctn`y6D zTh7}~80BcC*xoc3&Tm0@#(GK!%c>_oUJJ5(X zw_1LVg13!@Dqh;2d83Cy?LTi7-QPA^s-eX)R%%fGf-GSfN`k8aWUDES zz=V7V^2^cCP>20zPh#iF1U$FO0LMD`k5HfFr_1zM9@X(n_1Bi$P@!{Vl4OWl8b>D8 zMvQY*raj*i!66|C@bN&nuNyMrf-urmjva^Q@Yt?oJhjT`V0MU(bVD+aYNIXmdtTks z2j}kvyu$GXx9_Wbe{g)m@sDsHy`M%r-)A~=dq2nf%HN-VR(t>aZ^k2^x{;1DGceFw zezeDA^@UM$tZ8;ZTBsF5T}=_}Zi~1OZ=@%MA|=!jX^!&3nxVbq2j4;Vf`cu*=W1g$ zbjR~_SbmreYfRPCCH{Z?M7uWH>Qj+Fyc?_bp23TseTTG?G6d?0A<;$-Srl8Uq^bxvILK7V+=SNE3;51b(Q12Mo;dl)dGk8<4rh*PK3>AttJV-h*YE(l%u`9 z8M_}kh&}!8cyf%7BklZ?m5KV&U4$|8w}V!MWy+7-)4==d%1mVxQ=ES!;U4=?j<2Js zJ_0CyIKew+9!eEdIH#!!Qj9W=w|J8-k6t_xjlcL z|2dwy?__`lW8u~_ZVj6s&wa1c{FwRXW2eFXe8`DyX)+5w)~WxuGoyB>O|?XXhZ*Ss zW(f6iL{x|`<-_n0W+H_|u70PdEcpSHaJJ9jtG%s8weLbkm=lK7HkH0`{auU3GD-dEVP4z}(h4r#dcJT1%gvEhy7j5gr5(5n+ z8dCIFqK}sB@m|yY2by@a_sb%juzk7wCr8SGv>_Y>Zy#TTQtV?!ln+)8)L_ewL7ZO~ zi1UN|XFIbEv^p|$*=WhViS7AAbh{JpUBxq;eO!$WRXRBSxv%79>hINS88;4Y4Y(5D zcqeFfzum(~OOfSA8L*mE6UC#Q2ItNXnPGj6DdK(25KJ}hgIp{T;^PJnOFj4yW$P>mrM*G;Kr8F69XWQ`brUX1aX>{pWj{)f?Qj1HX zb(oCUwS5#n*!c(G%>{hJ#RPKvKfeatH!{G2G0gA%^W)&`e)pv=bEl@3k}RjsE)vG{ z?rS%$I@M$N&6xo+lt${39l#tR&c+Dwbbyz=1z}-Q&M@&W$HU2Xvgji0>*H;@-<@CS zILemjEp5p%Gu+#3@YYOk!J=>KX0J=0$k1l$N$!9RR3F*_}`6m z7OHFB-QRCV`+GC&X#Hi=>Ks;ouT_Pt2w*hfA{T9{Ra2)eHQQz$0wZ5tWJjp z9h?ksU)TWV`$=a`&*%1iZVcSP<6Q=?pC2>?#pWX| z&=?V}#t3z@gukmD9CYLfGlY|wFYn7H&3{uvR8ro34#Amn9r<1-e!dPfnWtb$gei@BTjf9~`2$9go(g z1MKvqN9nOngKtX-Ly*HSgT-d&)NCs`_I`i9;h6@ zA2a<7wK+e&`jW%lrb8z>buS%gA}s$1O~TTr{hwrjU=KU;wW-5~>}?$1`RGX@%|V{@ zcsat^qS|+>>^Du8n3CD{ETJ*l+@J_h; zhun1>|GVgLdJNePEwvEiZj9Sy@Z z0zTs8er-Cm=-_04dwLJ0{>|_GoUG6BKG$zf2KZU}{H`~3BR%z4xSyrOL&G+^4z=ij z%MZ@*QbnkdR6Ib7Z_TNR`> zjA4fIefK@}f3VZngf;O$w{FB)$_e>@fa(BoKEPkBb)IERVrin^e`9n;dFZmjcpJH= z*19~rne2@Ms>|a;{Lk6{=lS2q+5o9JCB**&80f7CSjY0zEgAkj zh@)`gC&yKly1Xh5Rq5a>r=76BRv%gJ?9Jta((1g(N!pPJFh6b8Z<)?~+Rr>hm30u6mV1f$zDnl$p5AVCOzaPIV ze3?-WI@D8)(U{_jfgC&R%~rw179Bh{Vev|3s*QR=fQe+P^T*>7Kb+~K@zWY+cow-b zYxozkzyoOq{K$MojL+J9h3x+~SI^{Ly@9Ry4pL{av)0oC7N4FX{wvroEQxpxcQZqT zr!_*{Z7D-5!D-00spoOf~yZrz7omb#&pdtHC znE6hb%pmZ;J5>$Wd-U;@qmDmbXt44)&AeJIr4RD}giR9PiOm9Dh@^q`9##k}mczC-JFPU0fY9U)iB$vnkQ{PuC^6S8M*TT<0Tr5_lK5Hzk>n z9ymK7=d{NAg}fqcmSUcQguEjA-@~%*8#zx;JAKK?-eT+JA?tIKw9kuvfl2HQ9_D0# zFjvOOve&i;bpYW95HfLRrrZWA1AMO7~ZoL2(eKojK z_KvW)t25Nm{x5oGU+L1r7glY4b*9%Q^WEc4(yk{ztOZ&SVV7vuN*tn`slP>$irNlcBmGB?Q(pPDqmtK$Z;9suR^HF{I_7rMW& z`->Qc5K9##xap%L%o2?W%xj2NBmPy0f4$#a=ryN3GEyp#^)}te)qn8El4D26`@(-_ zCMSU}fwKqZ5Oa}}uvZA)zqVIB(DsV^y?|QEg8#ZccCOcYkI1#JWUPIPGh^)SG!X1! zhHy_?_}Sjo0R)!9EvU~st6-tb5a(L;*)vR+y~Fh|Uul8b(FH8g|9|lMZQ@^5hCQ)g z9o{ET3#7Or&<5|Xg4mk=;1cwf3DM(ccw`n)#2*2`+unW3;c&sKS}Y> zM`a9Sog$3T6QhFJ92x%q<6N&rHh$7zd1?p)dwmbkn>r? zzld92+oy!gBJ)>#^qv$yf4BmVN!z4vt(r(Dx@;QQ%jbVZo=mzc`L@k21UVYBK8QK@ z0V|mfAZ&oa)aQjCaH+zOef{)l2h_#>G96458l!r6j~(!SWLBa79&Ibv}xF35IUcb=7OG8%H*UuS`x!S!LQ&x?A+(|H=izsUO)e*C*J zKyE?~Vg2&-{8B8h?!~#o9XLum!Nn$BoMOM@)p8xwMrhoP7oyH0WEOwgAR`^Lk>zWI zsu)|;g=k?QUIk06NpQK#;Gd6oT84gRzaw>#M9k}fBFcngbpq2X%=#NpyC1L z^As|P(D%h2CFUvY{tDUuPdsMj?Ml-3&bmm)yKLi+HR%6b^w|)-f}+_gB-oC5GEOE4 zakGMli6-TFVb9-z6x#Fm5&x^@x>zXE#-3aa3}hOha)|hU>UpeOx=Q@*LLm8W0%Lza z#J?&;P0g#Fy0|rL`uRPzv;p?mN-En$U4re>kzQBnK&P|!g)Wny9<0*F?o2gV&w>a! z{zV+03w;XSW;&>3@4`ce_u}Ys8VfX(-5A=8b_QJfIbfVA6{%pJPcYBkRQQ*y-ALh#iTd5+@!I*o1 zDSWIAXiF3R{JZ#HDmTO;u|LJWoTKTgXiwHh#o#>VFFePb{Od?|Rg=jI$&CFi@KBT4 z|A!J)aimfUC+XL_-e>#|%Z*k6=X$NAP!~PP-A2?IFOkj-IFui)*Z;M!MT)u~8SGgi z;(ukid*tQ94pA6tg0A*T>|373>OwolnV&q*{w5O{^aHX_SY@c14FAG!A^3l=75#p$ zIw%RXKsoyzw^BbC=jTqar{8nCO`oewG**sq)&4)Wh~HVFNBURdXboS&4@}Y5v-s3_wi-$Ugbk22!Yvs$W2=V% zdjt5}8NuB^N#=h`WlsNMnF03ZX<{@@75$0IXpA#J+28`^F5JP@7oNsco-Q(6RglX5 znMI!JGWmZXL6tmO4J)h#@>HAte_b4~sleAfB`xM8wddPQlDhk*^L@5UOQl-qO=8Xv zYjy}-M9BYl@xPsQi`6hzV1|ae63nws|I%y+Yjvw&G(|-=k8aj0DyRM5P5&i)#XF{ zCvx1~xw>eM(?w-vG3FMgF*nnNwn$ahDN;duv@%+l^HUO_O#S0-%!0qE5@PJtk>}6+ zB!4}|3USWy%wsB0V{Z?`Utb%sEWvO6rRLPTbxr@wQa!T&7C4gQNyOFI%1PwZ-FJ*} z4q|R=dy@@+7JI-0u{S*|FU*h6IZ3Dc>`TwI8va*%tP*m)=r3p9ZIFc${H%58bJM2X zO;cvmPazIx3iL2edAo=CxeeSe%EC=hGO!PG=WpZmm9w&#{1epSmx?JD_)sSg&_HLD z8hwB&?5m@U!xfsiHDdnKNTq}7a*LfbSYjtl*Eu;{>NEdt59Nuumb#`wP& z2PKT<>Cwc8Ia%ByOnzBfw^ z`rI_(V?i4r?Rv??|3r>9MyNw~F!!dK^?`~)%$WbXUxxn^mrkQKOc{%eC%DmR$bEu- zH$T?#CHDF$1B}qdu#Y`~?~IszXQjo~{@R$m^phLG(z#*RTa#-2U>DEFg$!5H8=_6e!xzLC%GdKrqGAK}Mf zzatNA6!_}N=Fr7GXok5$7n*hO(zNBXC2{7;(Vlveh4zPWNFQU#9=VSYPir_6bwLDw zwI>Oz-B%kM$6uS5h*1`Mk|3e`KTc8{A9Do?Pj2eb$2bg0`(c44D|9-s7Chp3xHEn;8E{{5O9bj&lZXqF z{qIkGf4%-EA6sBuU|#G=f`p&qzRhX9?sa{yyH&zB{H05yu4NZGjDIa;aG4)~{5O!f z|Gvb&uelm+0IIa@Q{Sc>-W9tG&FrUDL3ukb#ESS|CH|km(Q`-8z&xUH#`_&9(ZDm^ z`t1K}D8rxNzx~v|XQ<;}?=|@E>tnVx__VvUL)Urpl@a@uRq70t)cdo@`-KfM&S4j( ziw!ZEr^OncO331#l;}czK0g;zdx`(OBgD2Q%6*x;z*^(QzRJk**hPDxsP#!%g*C`? zytEm!tU;NCJ_7m*gx&w;NwXiH?6dcJ=ZJ@-{5R0gcYWWDyH{Vs6wkuW=0tKN3EbT` z8vw@^I2W?MkV(XzB=E1${r|!jLPu3qy1Ca^I?(NDb!*i6-5L7StAdq~%vfNNf9q?e zLj0@3%TyJqjOS^jjNZf?`$o$7<-}ZWhz*Jc56JL;=+r^fkr$67(AH0XypREI_Zed} zRR?VmlmTK@F`c1;r`z@L+?358PWADgGS^+#M{S>-XRYos#vrE?=b~n3Q=B%Is|?ta zP=z{)l1wH@a8g5VZVr2YO;QJ7PcZWKGGA5d0jjK7O#E~22&eBNlKIN%ZtBQ(*Fd?C zI(iuMyTDpSS3C7YzW+0sk(SCaK88|&aov3Ic~{O^9WqYM7; zZK}c=`sB6T8!D;y*U;Bi?xT#H5PK929hBk!;E5H~`m10lP900^`+J-|g&V~B#a1Kw z-ZU6{tA@#R6`ZFI{@l3bMGpt_t+f4V-yF62%!Kei`qS?3%)B9Q#u-)_VI)%nb=+%& zO(2E)QJkY1vU9RAv1fukJ0_STs6!j08taTx)_13jK#H?t41=9AZ3ybf;T}*+`{OX< z4-S`W;Kkj>|9x%Tp;5#eaO+XX{vY!_S;G|1BBoyOS!a^i2SjY}h96=~ISF}R%terh z`w=>d;`jtB@WBNi>Ef7Y^0fi;e;*-6OZ-GE&`y~S;6wiJW2%f)`rwOvl~6={mim$} z^PCgr^#Ad{dTc+c`S<=9b<8n_?;z`noMnyB=lTul|7SlB)&drC_~|+=+#WOk)OfXn z>Rf|^4afZUF#ldc{HGBAgV~HPEaN^z8>8?CSQ8Lb@+D0FEo>B6JTEl9-1e5%VwG7yjlS#y!44Q(aBz+_=BA(CMfD z!XC%Z%ItvTyTT3^CUgK|Ur>s>Ds5~^vYNno9xB8a<^Kp*6b&CD|G$O(N0w1RUfdI< zP8*;a_EVQQTB3=o%(cJ8IzuDL8nXDiV^x~CJ!<;p z^XBImhgjjOfxcK?uSgxYnX~w*C8yJF4whSe?G^dHf9WeE$CkjH(EHuwB!1p-%*n?T z{zoD6i@ivYBIf@ueW)M#d|aT&$1&c_`g`-2x{T4s_?~>m0z|VHh(B#=0{_Ww^r;bx zX->O{H`?1>87~m&f#TuAGW;(e*@tp36?9V9pGa22B4v6Z1DvU1yltNW`+)1Q7J%@< zYvA^X$v0P8tW8h$xrCo-Gy2ya_WBZf{vO5`%@pde_b2U(!l&m=UEXCE;_Y@K%Jwe) zceDQI;_4jo{S1)jPF_#!3o4>MQo#Kuo%qjnQ==_X>^JOTSgXa{L(5;^p7Silf5v^} zt`$Fi+!Y|cWH{$p$lUI75;lMhkG18PVlKiTDfE7^7YX@a!~tyhUi5L-?_v1d53Ytw zH)aD9GoBfQD~Kg542W%0H! z<_09FW0rM)_A@^JSg9tiQ2u^?&Nr%UfoF$JzPZ{e!+*r-7NdXbWWV8_6iuwu z7%&EydBe2%3*Mhin|_M3=tV;QZ!6^gEbM0e?|p|BiGL&Ve(p)kOBQ_!%4mBi@mH1M zzl8CJU6I^_X!pA&Y7ZQA`qt?&U)z@t1WQ`GWc^SdhDY+i%yA7{JS&p~<~&FOe_Kf# zc8Ia$By5pu^AI+``(lgSup3|JfsD1(r5p31(n?>T(PviNKYxn3{T;LeW|QAXS&Lp8 zqCSw)UEdseaRTjZDU`|6BmIg0BbYmP6U&tUOIRzsC4~O=SPe|G?$1J&8V<;1fEW7p zY5S*7kTtuX88UhIK%0%xu^y-JQ!R%7+D*UXGO<6MuZ1SY7L-vI$n#<>kQ?_M?lZB( zf0P{mW9x*ck>Nj!e#w05BQ?SF1q5=BpzJT=4oA3;h>MM?KF3dRT9Z z_cdAPmHgYh{6}yn_^!~mJxM|i5c|P~9bzmwi5O%t2SGv)P}u(d%BPSPX2~mPZGL^l zcki81bBxo5SIW4WMEc@GC<7!o-NkXZRAWWIpwtQqp^ZX;O^0DBL7bFsNX0PBt6@f1ld+P%=&>g`X!Fb95DQeiqT;XH1172e8&ugRlczL%m?u?p!eSe#s(cvy< zKj!`a)9DTa))v#I-mk(qfV+Bsrkn5wa!l$QV$X@Pqfb9K52Nh=w|epr^MS2pHHHek zR8bW`xr6=2Yl4|`z+68OYq(m%y2HZ;_|g&QFDGr&T=}S{K{~_W5g$y8kYw5K2ig#^OM9$- z@$8rpmRVP*pYnq6`xVIS{&#i%I63}f9NBBAxC}$X{Wx^~B+BAEP)dJ;=mXHqULc(@ zs_5mOGs1YEm11>Syx$iNIQ-=NZco2=F9bs&x>@8$|KRF2- z;D+S_%I2_H7KbG4k75o&{#TOyo%2&1f87d1`5?<9^(h98819d{or}(1lNX4F`mtw9_A2;{YLm0h3!*QI!_Ny+%dWW4JX!1%tF5jHPPGc>jrNExa;rjJFTDpGyd_+fkir z^Vcnm;@fN37iVF67rZxsBycEff*W#(aT+$sdJ+rS-=DOh<8R1K-seHm!)3KOAAfb9 z@6hcLi{DIS)3!z#pu~^QybkKx`N4OzU;CE6N4 zzhe9IXXm^!@V%J(yrO>_!wc-mNyPmM`~{N4J|OeGZ^T`4EUEr+SzjW7eX;+D*q;rP zKQ`hX@AnwMcchp02T5l}{aio0?E0O<)jBd6poVsNnJthtf<>N9Fl+0lH;yBxWelt5 zui)h${}dg2mr%*LyB5~k?4lmt6M2`KD5KBhYvN#ywk(D)lJY}@rNFl``}ojK$h_j0 z$Mjh>W;%Fi_|B+e9ZmjsRlQ#;{zU&&Mrlrk9+Z63H*_S&tLf6f=B`Nn%UcHn=I)GI{&s@) zv=-I~E~Z~Dp1%K3#s!D4MsQZ=A~LHwvHH|iT>j<3?scEnfHnD?&_> z9_ohPBKGJ@)R4vUhOwW3=qZq7&p02(>hv-{_*k7jc2~I~+TRsXj_gNDJwx~zMeI+E zJ!OWh5|lNzqo$HI09OuRbgZBChG=JC-@j?@8%J4_{1EMoPqpaci>r3Odi{W3DbOzM z+`Qv2x_`xo|M&_JYXXD92PpV%2r0O3lcd+a?T>%wUj0Ylzm69p{zV;vU^$6eB%%(0 z;<(2v@a6L{(z%Hs*S8ONe(PARE_xG{P|f_mRA(iGnX?~vU;y#Ifb`OOES$Q4)t5hw z?6?pV(;r_UYI896wkXOSIki2=XxodNwoybRr6I^(525C)??e2HI3m#}q#)cLHEpfv zJ9G}U3$!D)j3C;b{YWjh-?jbI*BBk-hmyKBRF>vrdS(yyE-#}m-2!9uQS4{@z?lYp z))>~7`4_)>())$k7Ei4+qu!FYwZiUyuU-v-GdbP_-whR1yGb$`*Z{Yx!2h(X<6{k* z9uvMlvG<7ag)ef${15kP9Ut`TXz$u3HRn5Xn!20bJQOnU!npPSOwtY@`UK>ADN}c+ zA27WbY4t^)&}GT~XwNpalc75L@bMbgEoU|CG? zo6DYW9Hk7Ie`*b!-MtaYJ_F(GH4+e&h{DDm^ru?lP_Y)4I-@YTydSmw(}?zU zLAcp=MA6<5=W2xP%yd*1W}vOU414GHV0xe$E3_*<)vU{UW9&^jW{l4r_B>IM?y_^b z-c@okQoF~i@@QXf4Qo6Lz8fK^cGF|_{a&FPg8zO)9qJyN+!{CE-FrB`BJXz{U&(N9 zGsXk#VT~Za{9D78KObZLo`x{i=m@h%N@W+)3oB4iUXAqJe3VqxA<geULkOHc7uzX7u*BFkr*G#m?1S;-GBw!@T>C^P*~lF zYmu-vYeRs_(t&mego|-O6PrQ z@{%U&-KD-tZ`Bv~x?Vd_sg2es_Tq_mLsnHA@`?T8>ITH8=O8LJ9-(g5#H%tQT`dt1 zor=Wl0_4VdGDe@Vf{YCg5B5iJQa)nR^AMh#i{SVyq~+wHys;HEDLxpEXY5|;PSj`k zAw4?>sX2v+bJC;DQH|F$Lv~UGCPsTP&{m1nxnW$pv=0}$>~Uv+v4vA6zkPYZWv{BX z#S`@zwvxtnh28I7zZPp)-Bulucx_lr{wKuDB(v*(zPkC#H)SgKO0J6u6~3eQuE7D)jf{Xs$Qg&G{G+*5dH!F zh>D4We_$9qL*tQJ(S{`2{*%Mpkdm2=G};Q2a*9z@(}a?yZdA1Pp>uE;Glvgj_r4{J z4mM(>%pY}`fk;ZvMr=|F;zRuq?&rpy#5SlY&B4%UAF7JdF|)f9=MVSca;NA4u8+^` zv-!@kUKiI-?f0b2((<4$?L#>~;%$xpi03 z@h^-0eJB_6A(?bykeM`A?IP`N^xOITw9|!U`q&y+|2K`bzf$tc5$5lWr2HDn0NF@N zNZh^sZ?;uBC-UW%*`XZGnaMQwsB z2AlIR&)R-7^E0SvZe_pkVvbRXlwmDd>#IK`tNUXH*Q3^hmo3(x2@voyU?EgEPw>=p~{Ks;9fqxN;tT@(r z1%CEMu{2O(D~(k-m|hvM{L0;Wy?0{)M0`$UfERWBLe#c&psuSI>3N07t7$`gNjqX_ z3yinjF6+tBRF;PR!A_Kvmm@tr4OP|EC@m>OZfXq5Vq6)|tBsCO4OE3&@fv05>FHpv zk8!ln=GR%1hiS_E{n;*1aTI(TQ%__uEza2(Ol;xo=4;U%Sg#9kzqfE_>T>6LF>pg`ln_PN4s8t zzb~>_&%c5)KweQXeSOL7)op>6U`;fI>LN2M59#@(C@s!IXMG`t8nReJ*Z`BP>$S)p z#HZM=?73cDeC@Ese?Pb2T!nv&lyr7(f6$llp`RZyC-5)y?pWeKsa;()ium8P5%{0= z^%VGzCjJvSzVJUN@V`NClp|wl@U=MU#vZqnOFbsP=t&fP0`Au6OJ#qKl$anaA6mwV zYnL#5^dfqXG9EBD7qQk`5k>!fpr02qDqE12UjpBNAhi8UPV1hXd`H*{NGWNgW+5!@_rQ@V13d{bvk%`w;tXiU<}Y19)zB2;ysZ&x zs}8Tg5QOJc(_h#H|A<6bo14Jf+Y|YW=}#(dKyYF%!WiRU8>oZIdo=fLH)o8#?C&Cv6JU9clIm}Tsebn2FT_+Wl*F@baK8 z-aTZBZ(a8K^xjqvou{UKHfSXt?O{HG|3uz%{&#h>MMy*>;{h8`)7XTn+8VU?522`g4taGQ+zVQW|7MibHXy&Y9gRJMxGnQdw+arFPKyZuk(|1tib z{{Jlk{}~)VnIz&66vqawK#Y$GV{7+GFCGf4d}F`uf1hgB#-1uiG!G4-aL-d{-+vC1 zhfZQ@^%!<9A3^Kf5yt%1$ZY!sWtAwbX+{EN{Rrj;#ie8*TjUOQkI-It2`&A@l=EBA zIy8>T!6jtXbfL7qg}DJOtozl3e15mQtshUH8OEElws`lTG5+q3|G!*Xh>3XPOu`1O zz@t5kz?z(Ncupt&vszV@;*M>A|6kyr@&7v*|10GGOpY&f05K26u|X@K#hjY2-b#~h z?2ich!b#VEzA|Kt;qE+Cj4h*TfwKSMvzR(`0^`K~@Zw>#%pOK^VL2k06A(`OesEkm zVsfjIoXfbtvqYb)zlq}X zSXocM;-nyCHw+=Wt{a8)4U{&tp^SC^%9tZqBfgE%`s!2jK^R{u3D3e;Tcm3&@FfL%g#V5))z(otlG?)KbKyW*{vi4LMa! zDC?U+`Scl#t{lhca3?yV4AI2=|J?E#>ijJzX3g(X>Hrl@ZK!T-MP*Y1+PW+8)oams z?`G5?_AGp&AngyZJR zNz6lm|9k$V|M&${gUzLyTz}>FZ$>`<*@ISC98SXSg*_NvI)L8URdh}+qIqx}6;)-( z54S}cZ6SX8-WM z3~Q9<#-X637=@KJD6XkvEI{46aCczDV;h10-FB9u{-@~sQz$2Qo)z^!@7WXn^A}1Z|F6yoP%^OLQ9St%91@%5aoy*e?#`~RYtDIE?JI{=;0S>$=qLSO~mClqN;Zag{9@# zcj_FDz4jSYc8#FGQ=7d*)K~{h8{_O5GRHVy(L;PB%>aX0Rv0UE#7dn5dxx6it1CwM z@pWgsdoyW{Gv1UNVf*JNuK2`Xy#mCV;I#s80)xeZSpU=er@1>fr2bzy?|}8cJvgpx z@8LOsq^SS>S3lX0e}TLhTd6QLWZQesCSH2`kTtIM>0zZp2OaF)S?0(3z@EE^dyyN& zK3=R9oWWi`0{?Md7D$MRLPRcg|MF&J7M9URZ~&7}J%{RvL+EX*Ky!ivI@vo^^bMWM zP-U#YAQddK#_y3LHC$`a!kgo|GW`GKrU%}=l{U_qKc3)Y_VI5(@ySoT0>qlYzrdTQ zzgtQwVf}B{QPod;$&dX-q5pF{fqzl|SL{6{B#{HSnWQ*2Xa&X^LnLWi{HCv7Pg?o< z83!5um&$a|9;=2@e~}Mxw|}4L;aBLREbAF0dUz!SI3bStKE5&8@Cb^AS4a%}5(^Pk z)`QaF{TQ7XL|1MgdLuP3o36$jKQ+t}|Fh|;Sjbev!2%8T5EeNA5BmDG^_y2t9 zT4n?A3(4J7QR9Cj9>2gD=?Rj^zb_+|vj2x|#|F4wKZ1Wtjw|pl_8$=g_#{bjY|sic z=KC=Q2-4>+rFFf3$^Ez2`t`6-tc^DI-z{N3&I0edl+WJ0#q1fF$NZoqNA?S655ExB z^ACy3L}Xe40>dJaQdouZ!CB;%)uOy;;^#$@$oae6sEgM| zMcls${{DraU%YrCBk5Z&6i7z96tzA#;_(Zdk#>;MNadsw_Wv^3i2h&V{y3iK|0#U_ zLjD)~kB9@>MN%9av;rQM`o#Z|^xC=H?8J9^3-Je zz`ktu4(0FrbD8s7uOq|%`zOrs(^q1Ccx)oU<>FkNWTLWjgYN#(9Y$bGP9pbT_}?l> z0*A61yc@AH97|%%!P@v@{}Dcj4I6(W?(tz5YCr3mL$SB%9kqzsL{44Hzr$l=5PorOt|Q-4E`>f9_KY zCfHB=Uu!h`{srEZ`PX!Sk~RF(2N-9kj5t3h1VzLnC^8Nq;SsC_Uc~(1e)l|{6V=!sRLK7y>ilvv;mcPO7CD-+UrYcF=5-jdL`UVp-=CM`U+4oT%Cu!Qe?GTYpLxHI_|nrcW4ztR5`4@z=&m2_VFbQN0(+wG zPCcoP6hzuE-n%vy&ue>-n1iSV`h@tO;@FrK2(Z(aQlf&le)&@9#kUWd<7|r#hV#r& z9%W7&ppx7Ns3emGvfNoC*q;7>_6AIfVXwd3O5~NX=4VbO_AV{r#GO0noIiwtt{OCj z8>1(Z^?iwd!Sm{{v|54UE+4FlRg4~@D5)zEaV8;08Wiz(F30YBoDDhNBeSjA6 zuf>=j;-B^Xrwc4Go27}BTvhb)`bURi@!5GZ%Kwh|+LfqD-tOZ$;no{;*N^Tn0$Xwt zwm#u|Zy*UBz=X7+hZv6}Z2rRkAm$;?iawwl_!Oc&Or@&K0F`e)8~ehiS1d5tmW;~U zGE|o5BHvdX1p#^(=`2BOVHmPJ)R4&hzi8q=!eR%49L?eF<^(T$69jrXvR_~{(*3MZ z;-QW@;=eaS3%gV32dE4~e`TyJ26(R24r3F2*n9LSE*z@DkFMA=_CJpL|C5`VvK2jl z*89;DUu*a`;?Dy2O(fxe+wl5Z98=6i_y9x>P$NmmA+{vh9M^j-9`);+Dl17@;r3E% zaiHF}ZbiQH;=B#|D}2zKqKVF?Je1_dBh6(Oib9Oh#GW0+DZxl`)j~9DfX8@PB7(d> zo_WA&aiQqxYCy~Q4C-nt(V7*6I)4o`N1359Hw*(M0T@r!#_lwI3=g$ou`?bQ+iY=i zHU}R(<$$kWi#g-v==9Hlo^2xLDY6O;!UqCPhYL%FUpzCWI* zjDfmT40e>^Xqhgq(EfjTC=&0VwZnIBN53}N5~*=&B2v;*)cs%ACojjAu(1oi$BLZ~+?OR`W@!rr0Y zCdhHuLUB?6+EZMp186c1NDTv-b{Ohy#ALZQR=eYHWM4bxW}5MhVSp1U?C&(FBJG8h6-bX~fA7>N)Fim0+L!&mg0#>UYlb%V{9HP)4~JGqad@H- zlS^}$KYbE!o{7fKUJd=#>t~X4fF8+0RryhS3>$X8Ynb9$gCt^Z1pWo?OiB0U5aW{8 z<|FnZp_7=&|9)TQ^e7B!vTK)=A7v}mW_qfA_qn*|zJAFQ`};#MJ5qq9^QX~6n_W?a zg=`Nf%+DgGBN1&+nV)vQ2$S|`l5#G;-3fR7GG;`)(n{Nqaj_{L2U1GH&#bCx0oXuaOQ zHB9j=_^rTNCrQNJsgmx?A;u+bB?%jZm`?}Em!#nT>-a>Jr6;6|bFtFtsYur!zZm|* zw@&)t*nlS%D@?GsI)&p;A4gAlIC29`ke(Qcq)-n;`Pd=UN(Eu2jQ_LPg)kS^0igXa zGbslBeQl^|Z9$5c8PXh7kU>g!*F}DeH=2tQxUW=WI@=JV6+!6iZoyQ05?&nC#?|>y zeD4{5{OHBlH}^F8YG2qBELkdKfOUEDa!d)`KZMjRClP;t-(qe!w!pcVQy8gBP9hfh zzRhV}7XJaeXo8O=b^m$k^;6L$KY7mY*RP!n#lc=b?5Xoa-*6Xt$H!3DT#Nja5EPLA zCr9`q(uqBOsPhL}P!2HLj!+j%__`t(McQI= zxD_k2otWt>!|cKo=9Xu0^4J(|PkZ3}cp$!cJrMu=df4Azo(=YU`EaN-QLE_xwH~hv zF(t4jbbk?N(<7%1jr;rE`{EpAe4b}}lHmPfUlQ>^_f01G-8ud({@zvW&fD_X{P_!^ z%Rhb23$Gpz!S3Dl=o@NBZ(|y2675i)m&h8uwd~o`gp3T<`*$%wIQf5&y&-~}Oc50k zLH^HPztO>HY^*}d=p@qlxp;p^WCc5-$Xkc?KLc^$+BrP+>=i8UpTa_C5>9pp;L@of zoOt>e_RZJhy(>QW*Ed4`>z(uA)gm9+%}~+*=U%^a#M2tiM86;5YwslqdE1gC``^7D z^W$DmKEAL42>-v>m&CjjaR4880sq3!8E)Gl)u-D@-6dWc-@F?5+K-=g!*hqjF)%fZ zu`*}$Cn=#en7sh~Rgo8NhuqvOWai}~DK?C?Kgs*ecOu%|0x^-1NKQ>hepV`m#z#=s zKZew_bfo)RQ~pPuKv&y!uFy zB%v25j&)dpm0lm|*odFg`&T@_|J@sIxOgBFON(uo=uSs}nid-4^iddWNPS)(Y4Ksm z$jm@WYBG`|0}*MXh8WB3vKXLXA6EppS|ixk1L2Voh;uVR68!|ZK1S$ktHl15Ih;Cs z9P_=!n8>%sYNa*KG+5zss~Hx$6LDa<8LvOvfPa0}2j9Kn^XmRCU-cXF{_AkZkM<=6 zj!44CFY;{%7)+MC^~i{{Tt&0TsCb>+odUjWi|vTaNVnieKux=Nx|V z-gST6IT(s_L(c5&Ifaq&9yB*qQ1=f-YHAWvGqaJBl7!e0Zz<^5P) zXu+F{HhAks5&rSzK>X;Y>-Wx$x;nkQ;vw0pEBt`>>d_NNYxq*)&qB8zB8fe~n@V;y&f@p`KEF?LPY?2U8q)99*nVlh>%dn|SmB#DLh}a7~VaCj>%cn zclV*Jwhm2AbvS%v1@n6bG0Irt(b7=n06AbU^^1M;-MGR%;QFU-;FXKz`26Kq{N2mp z_~8}1U%t5Hn)>ah-6a)i>w~<657pe(FvPR)`w7`v;9uC<^hx&}Uu$#VS;QcV9H3#6 zm}4mEzR&NWde|RhvXixrQbU37*4Ga>o&CZgGraq30*)T-z`{&54z#;sJl_z#HSy?b ztCI2Z7+YoL`)o(Jy$*Bz6Of)9kK|xCB!u}RGAtM=aS_PL%|SwX4&ow1krf+^Db@g< z8Es|#FnyG|tDxGSb;VNM&|Q^?xf(BA?J~iO$8&J`r3<)lahU$UNc`ZEd{^L`)xe|q|JzAJ8)Iw{#7K)|J2@H|F~Nw5=9&Kgg8UrBr=%e(Ap)&Uwb;LZFFGnxkm9I{(inF%GM})$ zED7Vq&Ny0Sj9Z=B%>UQHvlkn2;`Y<{$;&bL?pZT@^_2aE>LmMZ`J zlgP6Zvj3Qz9w^=_pQD(o@J9$6fY_&mozj#fyN5^nN#2{gH(=k-uU`(7ZqB=hzP4cT zvzMj~@R`eLxP7A!FTS)Fr{_{I*_VSB>g{>y(X{vZAucusF;U@&4)JH*&tw!AWTT*% zy}XKwP*zn#-9H6wUF~S>?ndX}AWACA(b`avp*WU6v+Zu$|v${Kcf7P7yP zsdtkEzKlr^46fGZ!n3gXRg=U#1qpfJftlyS{wlR)$@=R&_VTiG|FdJpzj<~{AMadC z#}8l2#MKLo%Uc}9=wu(7+Zq_tAA&e{=Jtj)nlaAuzBIFj8Fy_Ao zh0OnJZf!mYa<#~@osg5zu^%|O znsbujoM(Y~G1qaD@KNp}DUQE#1;T7prKw7DX|mcz?bSuw=g+qr;Mp-ly!(6s-ni32 zyBuS5n*uP+*xbpnF4R^OBRSBSa=$7f8TX$+J3yv~J_;h;SRW_`<>jTQsH{X;emZ%4 zH`<5BkXu+po}Y_?_yG0_)86tkRF51>Qo%+i^0>!T5$f(IehAc z-FW}`EPQ#{2=6Qy;d3k2`;51%KGBt;|5x7eqy2S(899ksKO(<&Qce$)?7#Mu72AH+@-ra3o^|6Wt6^loW#c>Jn6!=AkUX7mI}kIA5iKXS*2xf4l~#Z(qib z-zdXZR!s25xE|hFHvj6OW>br+!xmDqllmvTTgBJbFvGJeN$}DslJKn=kRCWZt<8yN zVV5i?P0J~R=S?KV@d;PJLP=R_NfP|@iOtVW*-T&RHu~+MYF&JK)ei5y-hro2Fji+I z8LdgisEBhwd1fT#{|F?9crf?J3rXRANDcQvW~4WABi&Ju5P*u(LgK$1wWT?joSwkG zlPA&K)rFkY804lenJvAQ#9`L$#9`mFV>gRh?T#+P4g zz~w0qjI|}AmbL$?D+*B*N1TT`vi64wQXEuS2TX(Y|8$V=Z;HZ5XV&)!ChoJ)SXY7i z@;uDW&tQCU5#`m@tOb(K{UI2+LAI(U|*0|rp<2DglZ{|XX|n;*KZFn=e3hvbtMl24XG|dSL#dB z;q%dy8p1WD${;N%%~eYZvCxp*b=4(%bydkqMOD(;wo|g;Gk%bdHLUP#ND{KNz`wxK zeW~^Fao39TTf@J|QxLcp^WH-WAw5v|7dS5p(3fF6-AzYojMSCt!?mQkFiojFT2ops z(w6@Ih%xi*;(7a8kHQ6C}hBHj0 zws;e%B*;k0^)Zxkyjh>u-$<&DGLc5J&83kHBdM2sydzFe>WbHwI!V=``cjgUw&bC& zE}898k*rjI|K0RAQ|CNFrK2t8r8h^+{_{Yk9xim~;e(qI_~MOpjQ3@tHa`s2?Au+N z8HBR*2vp>!pt>Lx*`5Z-bW%pH3wwevr@zWall{GP(URC}a5sg(xmY_rqW-7HDF9>e?Q(#;NCX)H}kYUJKf9jqbMhiOS=fjUwk=b-zfl4P&3 z0nM{NCXm*!!gDlfR!$JL|%= z4eP@--H89F-gvF-zC`Wn&RFfvmI%%1#xRXzq??VQ>TkA2YJ9pO&gkYqj@87TJcES3 zWFzbDBr~np5Plk~)Uw@H$=l9V=CYwJJJm1@0nIMZCSC&^f|E!I$@Bi>l4 zHO_Q|M4FEUvV2XE?`Mj# zKvOhEkn&?tQ(KLOihRuPo5#Sy3aayyWi`OEd@WEIYKPhc5AG?RDB*rmoR^BSf^^hm zGS@I!lXd_TOb%4x;7kdAaKjJ(@Jc-1o;Sn`13GwP+W3D@w-|K+b&@TgnY*5vlSE8{>N4%j{XM&M#Z;F|AeYE*@gI&6O zW0bg#+exaM%r#A(sE)DSI+SUt+?Q&qHS=BFy;r)*LeBHh*O0Qk$X5~!rRFGI=}48RQRnbjU4*_;YmBzzaH@9Z zaEj)5UxLQ9t{C+%HixVKxGqTT->L%Ce^u(E{@?i?>c7cxRYRt;DpKrK5O1T31aBLp zCxoGyb+JY({QiBu(BS=reC@a9@^x>}K6Y}Y++_Jkjm6xFddpeT{NZYg!~08(uFvFX zy)l}q@#b){=Iet=ns@pWHLndMYMvZQ)|wbi)2Zr9(v4_{(6g!uGgR?0H0ps%Wb#FUUkm zP6~=M6Oa?_i=5a%^6*F$(e_`K9gBw2bhI^B%jEwV%Kx2%{b-`!udSs49rPdewAEsm zy+8*V3ot)Rz5nn$Ru0W!X74aYJBu;env10de;n-a$Cr=T;h$bl#+MFQ;@KW;ygFfs zXNJw5FY?z>-&<%b{rg!fuKBLV(!9*K)JGX=w8iS#kEH8Gk7ejI45etz4kT%w8c5Q* zHkhpW0@vovu{6!MxmKU%nq59xYjNmQqt*PWCac+Fb(Zt16($E4iww@q=IcH;m#_2o zbiU#D>r)+ml@Q7pXVx-I^|NK2b7iDCs?gr4iX1mJ6nd)tPlcb_uWJI;e%TPB_RnpR zY9DmRs=wM7uYPziS)-AAd~kKBj*h#L$>y)magXBuTOXk><#Qi!qwZj`Ls_z;{_xQ~ z!IOE;_(`JFlVK_KXIe zU`JqI*#CrG{ekBF0)%UGx7Qz38?A;osBn6tNNU_$+QjC?d6kwt% z`5LN9!RG4HN?(qYA7J9rkl-}i9&dW6Jwm0b+~aYJh7c9??nDFEv24?TJw=u-U8$Bz zUpwj{RYjOeC6wih1N3;-lgZTGNk-EC3Nz`yu83GPSXD+%p{nSNQvI)?B-MYJNLPPvGE?)piA=4-6PY@FBdNN%lX)i5H^=Rc z-x@Ldjo|$UDs}M1)5P6rZ!DA<&_^GL>Lh2B7iEyL$@>dsxE8j(j)roSg;=m3h&C!i zOwbr>gVtnwbfwv$p*$OPWw{uio%?TH#%p6~>L2vPs{LDIsM`Nj2T~^qP(v-BfmoAX_8p$cVDIr_ZJekv z#K}6YU9}f7*N*lqTo@ zT!Hfunl_{*1QNf$--8CS^uG7K=iGD8c#bD4iFRE!S?1y}q_Fqx&9HHRjku~M)+j_3 zBj~CK6OR-GiaA*WlUo}xcdSX?=Ef|*!k7hF8nXl^BbMZB#KLThSWSo#WJha3et3Le z1#G?yB_3~DzaPK8D-WFO!gX+e1=nF*2XKF&Q{^foGq@SEbT=dD$Z&?P5wPo+*6A5f zwx-;gRbm{R448IXip}OVoeJ7AH%wC<#TTY)!d{%KlAT{uVD`>;Xltvp_c9* zQdZYcKk{Ryr^g^~rBsD{n$o;X$`13O48+;;ywQ8le-(5Ja_7U0NgZWMo#>}Elx|Mb zd16{uY(eXbMTBdiu}lGVC79qdTo)KoYs@O>0z(>1HN^iJeY(Cx_~F4;tM?AHT3(!k z{#dOL&|b9_y?$35-8F1SW9ZSN&h@6UqHL-w&!Ntya@6kDQ-6CMwbm9Jn1H4>&cmntBHNs5;J-D$xH&8Gv&Mho2zMiW;*5VgJXI zQV~zJ1qoEobzMm!4fZwB>d8TxS9#F=hz0&+AGpBpiKmmD653rYhU|*zc$d`$_$uF< z$v6FIFcsH@*knueD#*JL&c_6PMH6a|Go>-~ELdA;PU}l7Xl;=Nt4;+)HxQGl!Mnej^gD36yfbm z;n3L;PG%J2h&%|VRmf=o|Dmf9^gHZ1+;6TA^1Mu_g!@LIQ##^}KN!mryas)BVoi}` zY<-zc!P-*$$PtCDS7)k?U2Bq!q%+OVtTn|!I9=uGaOZ&Q_>Ma3pUe~pf48~P^2bAY zw)fR0yZovsE&P+J%pht`vOb&bZeV=8Ma(LLRAE4W17en(8e-z+Er&kJ0MSMi-a^& zAfWMFW4eFNmtH&+N?Xy3b11_YwSJDIEKH%*0}Zr#u!)Ai0nBwkcXJii_d=>rB$F~T z9I-(kYRvGX25^HnD|4u&v67l9b7>m2zWrlE@C6i7b6Ezp6~|LwRSI%`l{7uxNduj= z)LN5Ejm3$iDngAwWioYDr=ZVB8Eviiq%-a42R4?XWVHU*6tljvBv({Q;+k9 z&4RU`dQ(lQCB~SVp#!=SR?$GJF~J6-rYOiCbPnbPC4!qg#!jCiZP23(2)8kyFk3?k zvooPEM{|wbNBMhDY)AmbhXqkebQq;X$tfv1f|4=z>Bx7M2l`VC{y#P}kfMTo(d*2e z!ohP8=3!5AS4)yRiAXLLf(y-rqNK*?hin9HWMfKog?->@OeL5nTo-VA1be~{U@QI! zzQcFc6qvudsZ8_&Y>{V=?DK)=XufXm4@6&o7iIK5y5jdc0qg0=pF` zjdl5?G{*U2UYOlSS#s(7tD9mzSksgJ=}e=XMv7f&pum}$vQV3jIo-WxE%nc>rSXAU z+T9gQYg?jdO?wv2w4~E$Z31C%q>uWM>7XJ+gX{ElLZ20fGqpL-4Zb@e8h!uB=6S||V@@94QVk!woh*(T6;CN!LBivB)kbbeD@GzS_e@~5GWDjFSZq3MZUnu0DE>8zlh z8pysfmRc*5s9hnWec0RF*Ka|OZ}p;c>w|Hw0@_fF{=vXho+)Hs0RB*c=8@Ygory*S zJC8DCu+Oo#3WJ;nSs74(l_B|A8IiAzfc)&me{b-W2UBuv6lI}~IS+YF zid66zpspb;Hj)w}f+-LsKQRrU95*Oq61+p>YWW;fB)?gP}bW+RPnnnzChQ?&n{^R#Z? zQN*%$(&+4Z8W^9XuD(I!w|9`bsR{C2OZ8P1_zw8Tit`{J=y$J3r_!uMDoTl>!uSxx z!2GE&+Lwx>eW*Cbmr7!NsT8@dB~cz!5-FpSXm9k_@P{rare<{$Rg@IN7nnq;n41Z( zL*pV)Zx@c*T5#(p!6r>hKpsv?66I#3ks>og^T_9LI`mIkR50c6--(q`U6Ld6_N)*vpl2BgFH;$6w+}BUp1A74Fnr;71i{p43njMQsfQ)YDpt zyuK{h{F&hFFQP7>twuqu#gNrR8|q0GQ+Kk2I#ZwrvfQa2pHr1*!j|sS;s8dWv4O0T@lhL;r!?5&hdTwo)(QMfN`1%FTI z3hzrggmWXo&WMi)rG#kQ(|G7~==R)<1Zu42ah4oXRb!8pA4N48GOEh-rAVAlWRO2a zLI1=?gisD@sAD-&vn(pdE=4CG5IxZYg)c!LydH0RByU@czcRvNq4UE>h1!cb8UG6 zZx7W({BEQ<i4?(+COa_T1{*B-A*&x=izgjrX4$`=rFivPoUm?|LRoQ*d9$? zwJF$}#z6S z_Qn)tZ$yy*YTp23im*4K2nSP&keX41GyGB5v&Q(!uucR~O@17;Dl@3PHkX>K6qC~;t zg+DJF_Iw77bi)qlt)sD?I{5HwF-G77g*~Ls3njH8kW_eVRbuV0%BLp${a|-94Gi_t zAng3n_HvqR%crr{0vb{0;cv4^T^vX1qDX3iUDZ>aNK=FLG~8Z9{q;#WAJ|*q3hTvQ zprt63R(Ivo>_j8t4l$G*CWDO1C;^)^Z~JE7ZlHoy;n|JT}D<)HC_6v&nsVNWRQOEnD`SC|J)m)RusmwJx$ zSA{+{(-iij14H3Y-M=B`v1jI^AA4bM#ADBH_J8`}Nv9Xi^xOaVSi9{{_BPo5Y*(%I zuji|+{=BWy>TjFNBp+-nm0Z|ZBDuH`KBe_VVwzQ;hb3(1(KI0qCJU%H5q>xLo?4?# zsXmnVyD+6f$Trsx90i^NyoPP<&4IPpM@XfP#P!9WkfM)wEsW06MK6WAc z2uf(U*n>K%)2JQjP$p1UWi0jACem#$HJTx%7;uSlER7SCger9Qwg|6RdE*70l%a&l*e5l zgOJG>$RzihBx8Th$2SkYI$pm}6?mzRfscI(>J$>u(?sKAfqx|tdOQJ-aR7hhi2n@m zFJRBb?@u;#d$BKUE7(_c@GmxmbN{Oe{IA?sYl;{R_t%=yNT!HJvc#Vv4)YJ>XIz*q zwES>=nbmunDr|l~Uu*M=JKF8vynn>$jqh#ref5Q1;V(S4IqdlpV?ocat@V7NKi}!6 z!zHe-jaPUcm@IQpjw&Qc0~zKa-AMwkx^NRwu9Rta=Qy#MY;)$pmS{KXXw^bSc3lRy znT>&4R{pQj0ZF))ogC_ATI-d|wUHmdYeWSs3wfHIDducCU&yvqnX?C{HNE7un!NJ(&_=YnGFVI?L6hG1J|&G0RKXRpe_is`Ry)stvH+)*kG5d?MWEt|@ucT@!(+ zr^b90Cr5nCPL24~of`4(x_iWP^_dab)^nq7NADYTdEnk*ryrghlK$e{pu-=}_S=7W zrqBK#ceL5lHl-zEcjnZ|{mx;ilL;13b&wGAO^8P`stqGY(Eu>XbpWy0qjYeXu{Hy(FX zW6rg}PUcX<|6dh?dG0Gf{hf#sy%Bo|bU_}!AMAl(DoPEdf|PK|LoC0gp@QlQlc_Au z1HC$t{^Q}N!+PFPMxAwt*VSgyNP7v5s8Xpv&yo6b?5Ho-k=hGGVP_;#T_J3U zD(nFe2W)MsrqPjZ8m>>Fsp>!)EA^nkVo&OX%(s=tP+xsAjko2{P-8OnsnVerlBumE zjJhhKslOa*q4Qkg?@tGj8UzX>@>m861ip$K)zIf%{Yg}YK&m<@W1nj>~+O0|%= zI_zm0vA5x4p^h-3&bUKf&lOwzetoIMJJWfh zcYBkBAMn^pHDU>+=y6(rct7{=<|0Or1^MRSF&zc$wPIhy8=zZyp!esn9^9s~1&@(E z-P3FL$vu7c@88oe{oUC?r`OL8x&H9nsO+AzqaORtjC!v-HR3yZ=a5g^i9w%+lf%9h zcTWW7ot+6yx_df2=)iznw!I_Rc|&ucbi6vyW>^_uF;W#M9;*h*JuRk7?d*F~1oj#B zOz))w!R*c+Teh)G#E^5ssv?l{X=%#3441GrWQ!?vwLKvlTL3Qq^S~{=_H)_i2d-lQ z+z-Gx40gi?*bQA*mu#S?lcv9%Rp?>>t~es3LgpnhWyQhBg-fwv#gPsyJ;0u&`P;H| z^t{gtcVsmwZmd1ell2w*u-S$HcK6yC_RBMAjJ}`A=q)_Hmk!$^6^H^Dlei`88%oUIfgkwUP37VvGX>_uvqct}Yn67sb9GYB z^$pUnnM&Kjkpim?TN}n3s}eCT@bhf05Yg63k;XqZmT3�XcvS@R&e` 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 QyecBXY~~9W|7Xqr0Ao^=VgLXD literal 5063 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 D<0%g1

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�XcvS@R&e` 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 QyecBXY~~9W|7Xqr0Ao^=VgLXD literal 5063 zcmdUzc{J2-7r?*sov}BTM6!g!Sh7U6Aw-3gWyq4rnx%+|hViq_P?RW3ekh_WHA0hp z2~)DK{bY%ek!>^>M%kBlI`2R4Iq#qEU+?#OzUO)FbHC@F=iGDe=ef@X00`^-^FRP8 z;JqLK2(#u7tu0OA+@jp9Dcs!bJnE13&&SEm8qh&+ya7NEXMX;i9d2xCB0L%GmD9G$ zU@X13ESF_o>!U7{%*D9~a{YiGvCqHS{dXwZ?v}&#s#8#|b9U;4-^_Lul{!)ae_Yw`->;uG*~O)9-@l}yyS>u7;`!4&YpV~X5Q)}%LdJR`6e>Y@BO-A8C0|rX>j$3 z?cI%q*A2S;y7NmL*;$|jh!Dwv5;0DOY_qaTK z`vz{VxTvIJY5uEfi29lQ^Lu@iGcBsv#Y8icomClF=d!v3z~Q~}cXoddYqSQXCWsnJ?F7D(&aJ4{7VbDq}x z3R=`1fbPN^ZSg)#BZl-kCvUxae_e%S3u0;=LiHo-SN^a%q6+$v1EJwuA%j)E_HyUE ztIt9W5})VzZdQ@6k`1Q%sVECy3{FxJ;ec#WdB(n~XtU zh8t3C;SBm6P+GvZc$N(PVba4lowl+P(eYpPMzDS@jfU*bDSU2iMOh_#eVCH~zj zefg5~XpiS0dVX#MKh*2*T*HV1Fc)`J*wZeG@9<;JUfX)x$)Oe)T+vw?x-R(};TJ&v z+$*LwhUfF%`%&m&i!Xc}UHj7UMqBxB@^{dz;|u?K_WjkXU6TtIzd6Z1y?adbb&1y# z)$})Kzw~%XI38B3=_d3upPe-$awB4*z22yV+Dk#CDytbEIk8VoF-p(RN(o*OT)F=b zjkbv1m+xy0YB3HHUAf=buQ23uywBJwwSKOe7u4a3g3L0uu%{dvzr#Y<(&BGkKbyS$ z$$4zp_HrC%lgBJYwt;mM6qFR4R_u^Gs)=&6t&pof+h??I@d1~f__*O z;n3hj7Q$ks?}45ET_@{Mdwp!pwY&4$w$8K*j0v0lmN30pg(=jYiqetDkh};~Kc!^Q zOtDDx6sbVu8e`KLhr%i?9Q>}`vHWD~QXG6(4M9JOAR@J`4RT#?wc9;z!^;IJK6)u`dspiEo+q-Zz@R_{5U(mB|<-@0i z@MfRwfD;0?kO${4vq}BGEr3*~_~fq(8tDlzHyt{EYVl#UR4gZv7eebs-YY2fwTvE? zEStZkB74cyQLLs|&Qrd4TORbY zs8hRU_$m-Ly8?P!LH#OtPY_4JU8D?Y$|A|hCq8SPpxD*iYF>>PeUZJ{lE>yLjtrk9-f|b%eAxqt%9^`*CJoad1@snJS z1SJ|;@=`xpW@y%(+8|O`)_UcS{lh@LuoX0)w)~b5UcoEtSq|B(&%z>FW$33+UM_3b zzi@g_$&$nf92LBBLf^nsjl0W5?dA#obs>KZhZS@!D&fm6Aktth`U{{ibOSP0a2ahC zt4dTFQ;k}G7^S6bphDM2-CuvMTs~V&yj-eHxt;I+2=Dx*(^&8d*QU_QLfgyj+zhbE zrhPBy9&e^f^>XkPe;3LF6TSdfHfOW2dWe$s035(*UfMyu=WDaD)@I4YcwQ?=>-@VRQ>p2U=teQ^ zrHLy4#{6idzEape94EGNoT^L~cT=?Hm>D=yxvFU6G8M0ooBIW#&#v!5m={;|Z@Sd5 zllme;Hgs%fq8zGP`TffVuwv0uU7dtoI*bXBiJgAmsrOIDeuD}O7L3!ZruFgsq>`A*Lg#H z`M$*4IjTOD*^BMWDaI#f!kY{kS<{_aBjxgu|g4{e$d1auza;NcJ7guWGyS~%p}R+PuT8P#$;TC=y5snqW{LK5j$>@l{K1cmQSo5 z)@Uv`ocx~4`uIu(^Ys2<>Pe^g)YH0Ro2IE4McsbnBfBij&kVhfv z^U5-H!buz*BKKqfu0gyipi#~%V=4pWhScy(XdbmtJgP=^1Wt7z6BD~{k`a`&-5#wa zHZw2K8%{PQwEao;#>tKx!a7)B{Bfe6U8NKGpy0=uo=G82@zCkCf5SqB?b#oMbU+#M zsFGZCaW`u#1f#HLfsw=KWHgV$KHVu2)F=cYI*30cJC?alD^Q1I=3qI^uR>=9>(28k z0fXhd(!{QO!P)|2NM`mQ4R6wd*?lHW-9@wg3@9)3&qC9Gz&vMLDSmdg`w-0oTGd{~ zA(bv#xZA*n(u=zapomdp1I>6cL{@jZ1P-)HnqHU>;a+d(=qf1k=V?fwTl zlThahJ|e)Kd{Rv=;d76LB#B+uO^jdO9*@*624)`IeTU37mj7$gZQ&@{2Y+x88Y_6k z5TiFbB&&3G#M<9ur)zD!f#spcqmP~Eg32h z3hg}7AHyBcxKTDDAak`*X&!RKvbk*Sn<2f+aC|lHQ#1dfPPTWVa9-!-<_o7SAL^Nq zEn}BNR6Tw{3YTZs+A5`l@Zv(w0XZ8#H)2mdeRq-s&9T&<^5wVwpV;@`{PY96Z0@XI zZ_x2#0^=O7hxEjsIBVc|1~}{GX*#lG{uORg@09Gygwf5lS2sPcC3730G+#GL<^@!K z&b|#D6b7OpJscxm9|tQYy*|RVV)r1M6O{F)N!fc6ap5Dcidt06SnkUVZx1-sk5~@; zyqHGb8Q_Z*=NTjjQxSAn4ObCnymYBgV)W*W&GgpEAUorgtSwd{^*GE;DP zTAXfVFF7idwTH~!x?p^7uD^_H<%T;2lAVK<(=7lZ_;*A2df?{9emgun6Y{9{!$S?H zvxgft(21-4hx>=OAUC#8+$)wH228)kcxJElGE!HyF((oW0$bz{Rvw{<-7Eb;IFcEFdR&zXZyk> zMJ=TM@u1_?AfH#xMb!K6Q|~K}K0}APZ}HWb5`H^1o0+%9Zc&|0Ixlfy_-4-?C%Rmq zwqxt2B$gNY8S051WhCh4>i7B7pH=Y9n+oq`+>BOusR-X!rkdf0H*dZ?llA@Td|}hd zl}DnTh%kIO!O(lpWA=gWieS%+Pg1{1GC3X!i7$i5a!Z71K|gieJk`JZe!h0Yc$&Dh z!(Yc2?ayG)rAR!3>atj0PmEB(L$PfYYbyDw8i+F_pt8Zo-UjvPjq??$-^i7u4N@rhJ(`_zWde#qay@myFl zwU&?Y4z}FC-D=UwPPpp5USSSD>5tZt!1aE^H@=+{j1j`vLnn>+vQ*X*i-nFr5AL@;ma9KUb*?Q9+4xj+A!#RobP(O2bvuV@AXL#xR;S)88SI8| zlcO_(^QWK3%#JoOX-nIZJqv#99qE^FoTasshtRy2yS9^3po=j3teqt{=yPH1rO{_{H0@fRwA0>woTDgG@tMkI`MSguVmF+--nG>U%!wSYOvTvDX$cCOBI`k zNJ96yGkMO~GjYc<1oAi>Ew*+x;!9^D4LWIcVIC#B@19lF=L-JJ*^jvbRbeZm>@d9Z z4CoP>eF}k6S|DG{#Pk5y5iQkQ5fdEtAHbSZbfBZbnFn*46-D}aLOKGO;7oZGqBzsG ziFQ$vBs2=>6Do!ied4%dO%RuLA0|!eXwb9Y`3={^6LXPf@2yANFn{Z20D;gxh_~%` z4PPU%C#&){$4A4nm8RieR!@ae(;+%kyQ%ZZZD? D<0%g1 diff --git a/demo/manifest.json b/demo/manifest.json deleted file mode 100644 index 013f9075..00000000 --- a/demo/manifest.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Human Library", - "short_name": "Human", - "icons": [ - { "src": "../assets/icon.png", "sizes": "853x853", "type": "image/png", "purpose": "any maskable" } - ], - "start_url": "./index.html", - "scope": "/", - "display": "standalone", - "background_color": "#000000", - "theme_color": "#000000" -} \ No newline at end of file diff --git a/demo/manifest.webmanifest b/demo/manifest.webmanifest index 013f9075..50b371ae 100644 --- a/demo/manifest.webmanifest +++ b/demo/manifest.webmanifest @@ -1,9 +1,7 @@ { "name": "Human Library", "short_name": "Human", - "icons": [ - { "src": "../assets/icon.png", "sizes": "853x853", "type": "image/png", "purpose": "any maskable" } - ], + "icons": [{ "src": "../assets/icon.png", "sizes": "500x484", "type": "image/png", "purpose": "any maskable" }], "start_url": "./index.html", "scope": "/", "display": "standalone", diff --git a/dist/human.esm.js b/dist/human.esm.js index 62564459..90d14c92 100644 --- a/dist/human.esm.js +++ b/dist/human.esm.js @@ -5,31 +5,28354 @@ author: ' */ -var o8=Object.defineProperty;var pr=(e,t)=>{for(var n in t)o8(e,n,{get:t[n],enumerable:!0})};var Pg=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},Jn=(e,t,n)=>(Pg(e,t,"read from private field"),n?n.call(e):t.get(e)),rs=(e,t,n,r)=>(Pg(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n);function Ne(...e){let t=new Date,n=`${t.getHours().toString().padStart(2,"0")}:${t.getMinutes().toString().padStart(2,"0")}:${t.getSeconds().toString().padStart(2,"0")}.${t.getMilliseconds().toString().padStart(3,"0")}`;e&&console.log(n,"Human:",...e)}var Ye=()=>typeof performance!="undefined"?performance.now():parseInt((Number(process.hrtime.bigint())/1e3/1e3).toString());function qi(...e){let t=n=>n&&typeof n=="object";return e.reduce((n,r)=>(Object.keys(r||{}).forEach(a=>{let s=n[a],i=r[a];Array.isArray(s)&&Array.isArray(i)?n[a]=s.concat(...i):t(s)&&t(i)?n[a]=qi(s,i):n[a]=i}),n),{})}function Lg(){let e,t;if(typeof navigator!="undefined"){let n=navigator.userAgent.match(/\(([^()]+)\)/g);n&&n[0]&&(e=n[0].match(/\(([^()]+)\)/g)[0].replace(/\(|\)/g,""),t=navigator.userAgent.replace(n[0],""),e[1]&&(t=t.replace(n[1],"")),t=t.replace(/ /g," "))}else typeof process!="undefined"&&(e=`${process.platform} ${process.arch}`,t=`NodeJS ${process.version}`);return{platform:e,agent:t}}var gh={};pr(gh,{Abs:()=>Yi,Acos:()=>Ji,Acosh:()=>Qi,AdadeltaOptimizer:()=>jd,AdagradOptimizer:()=>Hd,AdamOptimizer:()=>Gd,AdamaxOptimizer:()=>qd,Add:()=>va,AddN:()=>is,All:()=>kh,Any:()=>Ih,ArgMax:()=>os,ArgMin:()=>du,Asin:()=>eo,Asinh:()=>to,Atan:()=>no,Atan2:()=>ao,Atanh:()=>ro,AvgPool:()=>ls,AvgPool3D:()=>pu,AvgPool3DGrad:()=>Sh,AvgPoolGrad:()=>Nh,BackendWasm:()=>T3,BatchMatMul:()=>us,BatchToSpaceND:()=>fu,Bincount:()=>Th,BroadcastTo:()=>n5,Callback:()=>xv,CallbackList:()=>y7,Cast:()=>cs,Ceil:()=>hs,ClipByValue:()=>ka,Complex:()=>Ch,ComplexAbs:()=>mu,Concat:()=>so,Conv2D:()=>ds,Conv2DBackpropFilter:()=>Eh,Conv2DBackpropInput:()=>ps,Conv3D:()=>Au,Conv3DBackpropFilterV2:()=>Rh,Conv3DBackpropInputV2:()=>Mh,Cos:()=>fs,Cosh:()=>io,CropAndResize:()=>oo,Cumsum:()=>ms,CustomCallback:()=>x7,DataStorage:()=>wh,DenseBincount:()=>Fh,DepthToSpace:()=>lo,DepthwiseConv2dNative:()=>As,DepthwiseConv2dNativeBackpropFilter:()=>$h,DepthwiseConv2dNativeBackpropInput:()=>Dh,Diag:()=>Oh,Dilation2D:()=>yu,Dilation2DBackpropFilter:()=>Ph,Dilation2DBackpropInput:()=>zh,ENV:()=>fr,EarlyStopping:()=>bv,Elu:()=>uo,EluGrad:()=>Lh,Environment:()=>e5,Equal:()=>ho,Erf:()=>co,Exp:()=>gs,ExpandDims:()=>po,Expm1:()=>fo,FFT:()=>Wh,Fill:()=>gu,FlipLeftRight:()=>mo,Floor:()=>xs,FloorDiv:()=>ws,FromPixels:()=>td,FusedBatchNorm:()=>bs,FusedConv2D:()=>Qs,FusedDepthwiseConv2D:()=>ei,GPGPUContext:()=>cp,GatherNd:()=>yo,GatherV2:()=>Ao,GraphModel:()=>Yv,Greater:()=>go,GreaterEqual:()=>_s,History:()=>g7,IFFT:()=>Bh,Identity:()=>vs,Imag:()=>Vh,InputSpec:()=>Gt,IsFinite:()=>xo,IsInf:()=>wo,IsNan:()=>bo,KernelBackend:()=>uu,LRN:()=>bu,LRNGrad:()=>jh,LayerVariable:()=>d7,LayersModel:()=>ca,LeakyRelu:()=>ks,Less:()=>_o,LessEqual:()=>vo,LinSpace:()=>Uh,Log:()=>Is,Log1p:()=>ko,LogSoftmax:()=>r5,LogicalAnd:()=>Io,LogicalNot:()=>xu,LogicalOr:()=>wu,MathBackendCPU:()=>Yd,MathBackendWebGL:()=>Rl,Max:()=>Ns,MaxPool:()=>Ts,MaxPool3D:()=>_u,MaxPool3DGrad:()=>Gh,MaxPoolGrad:()=>Hh,MaxPoolWithArgmax:()=>qh,Maximum:()=>Ss,Mean:()=>Cs,Min:()=>Es,Minimum:()=>Rs,MirrorPad:()=>vu,Mod:()=>No,MomentumOptimizer:()=>Xd,Multinomial:()=>Xh,Multiply:()=>Ms,Neg:()=>So,NonMaxSuppressionV3:()=>Co,NonMaxSuppressionV4:()=>Eo,NonMaxSuppressionV5:()=>Ro,NotEqual:()=>To,OP_SCOPE_SUFFIX:()=>f5,OneHot:()=>Fs,OnesLike:()=>Mo,Optimizer:()=>ia,Pack:()=>Fo,PadV2:()=>$s,Pool:()=>lk,Pow:()=>Ds,Prelu:()=>Os,Prod:()=>$o,RMSPropOptimizer:()=>Kd,RNN:()=>jr,Range:()=>ku,Rank:()=>mf,Real:()=>Kh,RealDiv:()=>ys,Reciprocal:()=>Do,Reduction:()=>cn,Relu:()=>zs,Relu6:()=>Ls,Reshape:()=>Oo,ResizeBilinear:()=>Ps,ResizeBilinearGrad:()=>Yh,ResizeNearestNeighbor:()=>Iu,ResizeNearestNeighborGrad:()=>Zh,Reverse:()=>Ws,RotateWithOffset:()=>Zo,Round:()=>Bs,Rsqrt:()=>Vs,SGDOptimizer:()=>rc,ScatterNd:()=>zo,Select:()=>Po,Selu:()=>Lo,Sequential:()=>Bl,Sigmoid:()=>js,Sign:()=>Vo,Sin:()=>Us,Sinh:()=>Bo,Slice:()=>Wo,Softmax:()=>qs,Softplus:()=>Uo,SpaceToBatchND:()=>Nu,SparseToDense:()=>Jh,SplitV:()=>jo,Sqrt:()=>Hs,Square:()=>Su,SquaredDifference:()=>Xs,Step:()=>Na,StridedSlice:()=>Ho,Sub:()=>Ks,Sum:()=>Gs,SymbolicTensor:()=>vr,Tan:()=>Go,Tanh:()=>Zs,Tensor:()=>Ve,TensorBuffer:()=>$t,Tile:()=>Ia,TopK:()=>qo,Transform:()=>Qh,Transpose:()=>Ys,Unique:()=>ed,Unpack:()=>Xo,UnsortedSegmentSum:()=>Tu,Variable:()=>Du,ZerosLike:()=>Ko,_FusedMatMul:()=>Js,abs:()=>Dt,acos:()=>Bf,acosh:()=>Vf,add:()=>se,addN:()=>Ra,all:()=>pd,any:()=>Wu,argMax:()=>ii,argMin:()=>Uf,asin:()=>jf,asinh:()=>Hf,atan:()=>Gf,atan2:()=>qf,atanh:()=>Xf,avgPool:()=>Vu,avgPool3d:()=>Yf,backend:()=>K5,backend_util:()=>R,basicLSTMCell:()=>WI,batchNorm:()=>li,batchNorm2d:()=>Q5,batchNorm3d:()=>ex,batchNorm4d:()=>tx,batchToSpaceND:()=>Uu,bincount:()=>nx,booleanMaskAsync:()=>HT,broadcastTo:()=>ju,browser:()=>al,buffer:()=>We,callbacks:()=>hne,cast:()=>ye,ceil:()=>Jf,clipByValue:()=>bn,clone:()=>Rr,complex:()=>Sa,concat:()=>rt,concat1d:()=>rx,concat2d:()=>ul,concat3d:()=>ax,concat4d:()=>sx,constraints:()=>L3,conv1d:()=>md,conv2d:()=>na,conv2dTranspose:()=>Ad,conv3d:()=>em,conv3dTranspose:()=>lN,copyRegisteredKernels:()=>hk,cos:()=>Hu,cosh:()=>yd,cosineWindow:()=>Sm,cumsum:()=>gd,customGrad:()=>$r,data:()=>Jv,denseBincount:()=>ox,deprecationWarn:()=>Lf,depthToSpace:()=>tm,depthwiseConv2d:()=>cl,deregisterOp:()=>pne,device_util:()=>zu,diag:()=>AN,dilation2d:()=>nm,disableDeprecationWarnings:()=>eI,dispose:()=>ve,disposeVariables:()=>tI,div:()=>me,divNoNan:()=>rm,dot:()=>lx,dropout:()=>Cx,elu:()=>hl,enableDebugMode:()=>Q9,enableProdMode:()=>J9,enclosingPowerOfTwo:()=>Ex,engine:()=>Mr,env:()=>J,equal:()=>Fa,erf:()=>am,exp:()=>Gn,expandDims:()=>Yt,expm1:()=>sm,eye:()=>im,fft:()=>tc,fill:()=>Gu,findBackend:()=>Wf,findBackendFactory:()=>oI,floor:()=>dl,floorDiv:()=>dd,forceHalfFloat:()=>Bb,fused:()=>za,gather:()=>ui,gatherND:()=>Tx,gather_util:()=>Mf,getBackend:()=>sI,getGradient:()=>df,getKernel:()=>nd,getKernelsForBackend:()=>Jo,gpgpu_util:()=>hb,grad:()=>HN,grads:()=>GN,greater:()=>nr,greaterEqual:()=>Da,ifft:()=>yl,imag:()=>xd,image:()=>ze,inTopKAsync:()=>nC,initializers:()=>G3,input:()=>s7,io:()=>wn,irfft:()=>Dd,isFinite:()=>ux,isInf:()=>cx,isNaN:()=>hx,keep:()=>Ut,kernel_impls:()=>Pr,layers:()=>a7,leakyRelu:()=>qu,less:()=>wd,lessEqual:()=>ci,linalg:()=>Vx,linspace:()=>dx,loadGraphModel:()=>ct,loadLayersModel:()=>Rte,localResponseNormalization:()=>om,log:()=>Mn,log1p:()=>bd,logSigmoid:()=>fx,logSoftmax:()=>vd,logSumExp:()=>cm,logicalAnd:()=>rr,logicalNot:()=>Xu,logicalOr:()=>kd,logicalXor:()=>gx,losses:()=>xE,matMul:()=>Ge,math:()=>E5,max:()=>vn,maxPool:()=>Ku,maxPool3d:()=>hm,maxPoolWithArgmax:()=>xx,maximum:()=>Dr,mean:()=>vt,memory:()=>hd,metrics:()=>Av,min:()=>fl,minimum:()=>ml,mirrorPad:()=>dm,mod:()=>pm,model:()=>Cte,models:()=>yv,moments:()=>Id,movingAverage:()=>XT,mul:()=>P,multiRNNCell:()=>bS,multinomial:()=>wx,neg:()=>_t,nextFrame:()=>Zd,norm:()=>Ld,notEqual:()=>di,oneHot:()=>rl,ones:()=>Or,onesLike:()=>Fn,op:()=>O,outerProduct:()=>NS,pad:()=>ra,pad1d:()=>CS,pad2d:()=>RS,pad3d:()=>FS,pad4d:()=>DS,pool:()=>bx,pow:()=>aa,prelu:()=>Yu,print:()=>k5,prod:()=>Nd,profile:()=>an,rand:()=>jS,randomGamma:()=>XS,randomNormal:()=>_x,randomUniform:()=>Al,range:()=>Sd,ready:()=>aI,real:()=>Ju,reciprocal:()=>Am,registerBackend:()=>il,registerCallbackConstructor:()=>Mte,registerGradient:()=>a5,registerKernel:()=>ti,registerOp:()=>dne,regularizers:()=>gv,relu:()=>zr,relu6:()=>Td,removeBackend:()=>iI,reshape:()=>H,reverse:()=>$n,reverse1d:()=>rT,reverse2d:()=>sT,reverse3d:()=>oT,reverse4d:()=>uT,rfft:()=>nc,round:()=>ym,rsqrt:()=>Cd,scalar:()=>ge,scatterND:()=>Sx,scatter_util:()=>Ff,selu:()=>Ed,separableConv2d:()=>gm,sequential:()=>Ete,serialization:()=>re,setBackend:()=>rI,setPlatform:()=>lI,setWasmPath:()=>NZ,setWasmPaths:()=>SZ,setWebGLContext:()=>ip,setdiff1dAsync:()=>vx,shared:()=>Rm,sigmoid:()=>Rn,sign:()=>xm,signal:()=>gE,sin:()=>Rd,sinh:()=>Md,slice:()=>Ee,slice1d:()=>Fd,slice2d:()=>wm,slice3d:()=>$d,slice4d:()=>Qu,slice_util:()=>ln,softmax:()=>ec,softplus:()=>pl,spaceToBatchND:()=>Zu,sparseToDense:()=>Nm,spectral:()=>yE,split:()=>zt,sqrt:()=>Jt,square:()=>it,squaredDifference:()=>Od,squeeze:()=>Oa,stack:()=>un,step:()=>gl,stridedSlice:()=>bm,sub:()=>Ae,sum:()=>Ce,sumOutType:()=>id,tan:()=>_m,tanh:()=>ll,tensor:()=>yr,tensor1d:()=>sn,tensor2d:()=>kn,tensor3d:()=>ud,tensor4d:()=>DT,tensor5d:()=>OT,tensor6d:()=>zT,tensor_util:()=>mr,test_util:()=>G5,tidy:()=>z,tile:()=>$a,time:()=>nI,topk:()=>vm,train:()=>fi,transpose:()=>nt,truncatedNormal:()=>zd,unique:()=>Pd,unregisterGradient:()=>ck,unregisterKernel:()=>uk,unsortedSegmentSum:()=>km,unstack:()=>ar,upcastType:()=>tr,util:()=>v,valueAndGrad:()=>qN,valueAndGrads:()=>XN,variable:()=>kx,variableGrads:()=>px,version:()=>Jre,version_converter:()=>dre,version_core:()=>Y9,version_cpu:()=>gw,version_layers:()=>ZA,version_wasm:()=>E3,version_webgl:()=>Wb,webgl:()=>jP,webgl_util:()=>Lw,where:()=>_n,whereAsync:()=>Im,zeros:()=>Ct,zerosLike:()=>je});var l8=Object.create,xh=Object.defineProperty,u8=Object.getPrototypeOf,c8=Object.prototype.hasOwnProperty,h8=Object.getOwnPropertyNames,d8=Object.getOwnPropertyDescriptor,p8=e=>xh(e,"__esModule",{value:!0}),wt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Oe=(e,t)=>{for(var n in t)xh(e,n,{get:t[n],enumerable:!0})},f8=(e,t,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of h8(t))!c8.call(e,r)&&r!=="default"&&xh(e,r,{get:()=>t[r],enumerable:!(n=d8(t,r))||n.enumerable});return e},Xi=e=>f8(p8(xh(e!=null?l8(u8(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),m8=wt(()=>{}),A8=wt((e,t)=>{(function(n,r,a){function s(c){var u=this,h=l();u.next=function(){var d=2091639*u.s0+u.c*23283064365386963e-26;return u.s0=u.s1,u.s1=u.s2,u.s2=d-(u.c=d|0)},u.c=1,u.s0=h(" "),u.s1=h(" "),u.s2=h(" "),u.s0-=h(c),u.s0<0&&(u.s0+=1),u.s1-=h(c),u.s1<0&&(u.s1+=1),u.s2-=h(c),u.s2<0&&(u.s2+=1),h=null}function i(c,u){return u.c=c.c,u.s0=c.s0,u.s1=c.s1,u.s2=c.s2,u}function o(c,u){var h=new s(c),d=u&&u.state,p=h.next;return p.int32=function(){return h.next()*4294967296|0},p.double=function(){return p()+(p()*2097152|0)*11102230246251565e-32},p.quick=p,d&&(typeof d=="object"&&i(d,h),p.state=function(){return i(h,{})}),p}function l(){var c=4022871197,u=function(h){h=h.toString();for(var d=0;d>>0,p-=c,p*=c,c=p>>>0,p-=c,c+=p*4294967296}return(c>>>0)*23283064365386963e-26};return u}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),y8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.x=0,c.y=0,c.z=0,c.w=0,c.next=function(){var d=c.x^c.x<<11;return c.x=c.y,c.y=c.z,c.z=c.w,c.w^=c.w>>>19^d^d>>>8},l===(l|0)?c.x=l:u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),g8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.x^c.x>>>2;return c.x=c.y,c.y=c.z,c.z=c.w,c.w=c.v,(c.d=c.d+362437|0)+(c.v=c.v^c.v<<4^(d^d<<1))|0},c.x=0,c.y=0,c.z=0,c.w=0,c.v=0,l===(l|0)?c.x=l:u+=l;for(var h=0;h>>4),c.next()}function i(l,c){return c.x=l.x,c.y=l.y,c.z=l.z,c.w=l.w,c.v=l.v,c.d=l.d,c}function o(l,c){var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),x8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.x,d=c.i,p,f,m;return p=h[d],p^=p>>>7,f=p^p<<24,p=h[d+1&7],f^=p^p>>>10,p=h[d+3&7],f^=p^p>>>3,p=h[d+4&7],f^=p^p<<7,p=h[d+7&7],p=p^p<<13,f^=p^p<<9,h[d]=f,c.i=d+1&7,f};function u(h,d){var p,f,m=[];if(d===(d|0))f=m[0]=d;else for(d=""+d,p=0;p0;--p)h.next()}u(c,l)}function i(l,c){return c.x=l.x.slice(),c.i=l.i,c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.x&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),w8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.w,d=c.X,p=c.i,f,m;return c.w=h=h+1640531527|0,m=d[p+34&127],f=d[p=p+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=d[p]=m^f,c.i=p,m+(h^h>>>16)|0};function u(h,d){var p,f,m,A,y,g=[],w=128;for(d===(d|0)?(f=d,d=null):(d=d+"\0",f=0,w=Math.max(w,d.length)),m=0,A=-32;A>>15,f^=f<<4,f^=f>>>13,A>=0&&(y=y+1640531527|0,p=g[A&127]^=f+y,m=p==0?m+1:0);for(m>=128&&(g[(d&&d.length||0)&127]=-1),m=127,A=4*128;A>0;--A)f=g[m+34&127],p=g[m=m+1&127],f^=f<<13,p^=p<<17,f^=f>>>15,p^=p>>>12,g[m]=f^p;h.w=y,h.X=g,h.i=m}u(c,l)}function i(l,c){return c.i=l.i,c.w=l.w,c.X=l.X.slice(),c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.X&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),b8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.b,p=c.c,f=c.d,m=c.a;return d=d<<25^d>>>7^p,p=p-f|0,f=f<<24^f>>>8^m,m=m-d|0,c.b=d=d<<20^d>>>12^p,c.c=p=p-f|0,c.d=f<<16^p>>>16^m,c.a=m-d|0},c.a=0,c.b=0,c.c=2654435769|0,c.d=1367130551,l===Math.floor(l)?(c.a=l/4294967296|0,c.b=l|0):u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),Wg=wt(()=>{}),_8=wt((e,t)=>{(function(n,r){var a=this,s=256,i=6,o=52,l="random",c=r.pow(s,i),u=r.pow(2,o),h=u*2,d=s-1,p;function f(_,x,N){var T=[];x=x==!0?{entropy:!0}:x||{};var C=g(y(x.entropy?[_,b(n)]:_==null?w():_,3),T),F=new m(T),D=function(){for(var L=F.g(i),V=c,U=0;L=h;)L/=2,V/=2,U>>>=1;return(L+U)/V};return D.int32=function(){return F.g(4)|0},D.quick=function(){return F.g(4)/4294967296},D.double=D,g(b(F.S),n),(x.pass||N||function(L,V,U,j){return j&&(j.S&&A(j,F),L.state=function(){return A(F,{})}),U?(r[l]=L,V):L})(D,C,"global"in x?x.global:this==r,x.state)}r["seed"+l]=f;function m(_){var x,N=_.length,T=this,C=0,F=T.i=T.j=0,D=T.S=[];for(N||(_=[N++]);C{var n=A8(),r=y8(),a=g8(),s=x8(),i=w8(),o=b8(),l=_8();l.alea=n,l.xor128=r,l.xorwow=a,l.xorshift7=s,l.xor4096=i,l.tychei=o,t.exports=l}),lu=wt(()=>{}),v8=wt(()=>{}),k8=wt(()=>{}),I8=wt((e,t)=>{var n=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(a){a=a||{};function s(){return Q.buffer!=Be&&Kt(Q.buffer),mn}function i(){return Q.buffer!=Be&&Kt(Q.buffer),xt}function o(){return Q.buffer!=Be&&Kt(Q.buffer),An}function l(){return Q.buffer!=Be&&Kt(Q.buffer),Un}function c(){return Q.buffer!=Be&&Kt(Q.buffer),on}var u=typeof a!="undefined"?a:{},h,d;u.ready=new Promise(function(I,S){h=I,d=S});var p={},f;for(f in u)u.hasOwnProperty(f)&&(p[f]=u[f]);var m=[],A="./this.program",y=function(I,S){throw S},g=!1,w=!1,b=!1,_=!1;g=typeof window=="object",w=typeof importScripts=="function",b=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",_=!g&&!b&&!w;var x=u.ENVIRONMENT_IS_PTHREAD||!1;x&&(Be=u.buffer);var N="";function T(I){return u.locateFile?u.locateFile(I,N):N+I}var C,F,D,L,V,U;if(b){w?N=lu().dirname(N)+"/":N=__dirname+"/",C=function(I,S){return V||(V=require("fs")),U||(U=lu()),I=U.normalize(I),V.readFileSync(I,S?null:"utf8")},D=function(I){var S=C(I,!0);return S.buffer||(S=new Uint8Array(S)),pe(S.buffer),S},process.argv.length>1&&(A=process.argv[1].replace(/\\/g,"/")),m=process.argv.slice(2),process.on("uncaughtException",function(I){if(!(I instanceof ou))throw I}),process.on("unhandledRejection",Yr),y=function(I){process.exit(I)},u.inspect=function(){return"[Emscripten Module object]"};var j;try{j=v8()}catch(I){throw console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'),I}global.Worker=j.Worker}else _?(typeof read!="undefined"&&(C=function(I){return read(I)}),D=function(I){var S;return typeof readbuffer=="function"?new Uint8Array(readbuffer(I)):(S=read(I,"binary"),pe(typeof S=="object"),S)},typeof scriptArgs!="undefined"?m=scriptArgs:typeof arguments!="undefined"&&(m=arguments),typeof quit=="function"&&(y=function(I){quit(I)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(g||w)&&(w?N=self.location.href:typeof document!="undefined"&&document.currentScript&&(N=document.currentScript.src),typeof r!="undefined"&&r&&(N=r),N.indexOf("blob:")!==0?N=N.substr(0,N.lastIndexOf("/")+1):N="",b?(C=function(I,S){return V||(V=require("fs")),U||(U=lu()),I=U.normalize(I),V.readFileSync(I,S?null:"utf8")},D=function(I){var S=C(I,!0);return S.buffer||(S=new Uint8Array(S)),pe(S.buffer),S}):(C=function(I){var S=new XMLHttpRequest;return S.open("GET",I,!1),S.send(null),S.responseText},w&&(D=function(I){var S=new XMLHttpRequest;return S.open("GET",I,!1),S.responseType="arraybuffer",S.send(null),new Uint8Array(S.response)}),F=function(I,S,W){var q=new XMLHttpRequest;q.open("GET",I,!0),q.responseType="arraybuffer",q.onload=function(){if(q.status==200||q.status==0&&q.response){S(q.response);return}W()},q.onerror=W,q.send(null)}),L=function(I){document.title=I});b&&typeof performance=="undefined"&&(global.performance=k8().performance);var X=u.print||console.log.bind(console),G=u.printErr||console.warn.bind(console);for(f in p)p.hasOwnProperty(f)&&(u[f]=p[f]);p=null,u.arguments&&(m=u.arguments),u.thisProgram&&(A=u.thisProgram),u.quit&&(y=u.quit);var ee=Atomics.load,Y=Atomics.store,ae=Atomics.compareExchange,te;u.wasmBinary&&(te=u.wasmBinary);var oe=u.noExitRuntime||!0;typeof WebAssembly!="object"&&Yr("no native wasm support detected");var Q,he,le=!1,fe;function pe(I,S){I||Yr("Assertion failed: "+S)}function ke(I){var S=u["_"+I];return pe(S,"Cannot call unknown function "+I+", make sure it is exported"),S}function Se(I,S,W,q,de){var ue={string:function(xn){var Gi=0;if(xn!=null&&xn!==0){var zg=(xn.length<<2)+1;Gi=Ui(zg),et(xn,Gi,zg)}return Gi},array:function(xn){var Gi=Ui(xn.length);return Ke(xn,Gi),Gi}};function ce(xn){return S==="string"?Fe(xn):S==="boolean"?Boolean(xn):xn}var be=ke(I),tt=[],Bt=0;if(q)for(var Mt=0;Mt=q);){var ue=I[S++];if(!ue)return de;if(!(ue&128)){de+=String.fromCharCode(ue);continue}var ce=I[S++]&63;if((ue&224)==192){de+=String.fromCharCode((ue&31)<<6|ce);continue}var be=I[S++]&63;if((ue&240)==224?ue=(ue&15)<<12|ce<<6|be:ue=(ue&7)<<18|ce<<12|be<<6|I[S++]&63,ue<65536)de+=String.fromCharCode(ue);else{var tt=ue-65536;de+=String.fromCharCode(55296|tt>>10,56320|tt&1023)}}return de}function Fe(I,S){return I?De(i(),I,S):""}function Qe(I,S,W,q){if(!(q>0))return 0;for(var de=W,ue=W+q-1,ce=0;ce=55296&&be<=57343){var tt=I.charCodeAt(++ce);be=65536+((be&1023)<<10)|tt&1023}if(be<=127){if(W>=ue)break;S[W++]=be}else if(be<=2047){if(W+1>=ue)break;S[W++]=192|be>>6,S[W++]=128|be&63}else if(be<=65535){if(W+2>=ue)break;S[W++]=224|be>>12,S[W++]=128|be>>6&63,S[W++]=128|be&63}else{if(W+3>=ue)break;S[W++]=240|be>>18,S[W++]=128|be>>12&63,S[W++]=128|be>>6&63,S[W++]=128|be&63}}return S[W]=0,W-de}function et(I,S,W){return Qe(I,i(),S,W)}function st(I){for(var S=0,W=0;W=55296&&q<=57343&&(q=65536+((q&1023)<<10)|I.charCodeAt(++W)&1023),q<=127?++S:q<=2047?S+=2:q<=65535?S+=3:S+=4}return S}function Ke(I,S){s().set(I,S)}function dt(I,S){return I%S>0&&(I+=S-I%S),I}var Be,mn,xt,Vn,Xt,An,Un,En,on;function Kt(I){Be=I,u.HEAP8=mn=new Int8Array(I),u.HEAP16=Vn=new Int16Array(I),u.HEAP32=An=new Int32Array(I),u.HEAPU8=xt=new Uint8Array(I),u.HEAPU16=Xt=new Uint16Array(I),u.HEAPU32=Un=new Uint32Array(I),u.HEAPF32=En=new Float32Array(I),u.HEAPF64=on=new Float64Array(I)}var Tr=u.INITIAL_MEMORY||16777216;if(x)Q=u.wasmMemory,Be=u.buffer;else if(u.wasmMemory)Q=u.wasmMemory;else if(Q=new WebAssembly.Memory({initial:Tr/65536,maximum:2147483648/65536,shared:!0}),!(Q.buffer instanceof SharedArrayBuffer))throw G("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"),b&&console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"),Error("bad memory");Q&&(Be=Q.buffer),Tr=Be.byteLength,Kt(Be);var Zn,Yn=[],fa=[],Kr=[],ma=[],Di=[],dr=!1,Kc=!1;x||fa.push({func:function(){hh()}}),x&&(dr=!0);function U0(){if(!x){if(u.preRun)for(typeof u.preRun=="function"&&(u.preRun=[u.preRun]);u.preRun.length;)Jc(u.preRun.shift());zi(Yn)}}function Zc(){dr=!0,zi(fa)}function j0(){x||zi(Kr)}function Yc(){x||(Kc=!0)}function yn(){if(!x){if(u.postRun)for(typeof u.postRun=="function"&&(u.postRun=[u.postRun]);u.postRun.length;)H0(u.postRun.shift());zi(Di)}}function Jc(I){Yn.unshift(I)}function H0(I){Di.unshift(I)}var Zr=0,Aa=null,es=null;function G0(I){pe(!x,"addRunDependency cannot be used in a pthread worker"),Zr++,u.monitorRunDependencies&&u.monitorRunDependencies(Zr)}function q0(I){if(Zr--,u.monitorRunDependencies&&u.monitorRunDependencies(Zr),Zr==0&&(Aa!==null&&(clearInterval(Aa),Aa=null),es)){var S=es;es=null,S()}}u.preloadedImages={},u.preloadedAudios={};function Yr(I){u.onAbort&&u.onAbort(I),x&&console.error("Pthread aborting at "+new Error().stack),I+="",G(I),le=!0,fe=1,I="abort("+I+"). Build with -s ASSERTIONS=1 for more info.";var S=new WebAssembly.RuntimeError(I);throw d(S),S}function Qc(I,S){return String.prototype.startsWith?I.startsWith(S):I.indexOf(S)===0}var Oi="data:application/octet-stream;base64,";function eh(I){return Qc(I,Oi)}var X0="file://";function th(I){return Qc(I,X0)}var gn="tfjs-backend-wasm-threaded-simd.wasm";eh(gn)||(gn=T(gn));function K0(I){try{if(I==gn&&te)return new Uint8Array(te);if(D)return D(I);throw"both async and sync fetching of the wasm failed"}catch(S){Yr(S)}}function nh(){if(!te&&(g||w)){if(typeof fetch=="function"&&!th(gn))return fetch(gn,{credentials:"same-origin"}).then(function(I){if(!I.ok)throw"failed to load wasm binary file at '"+gn+"'";return I.arrayBuffer()}).catch(function(){return K0(gn)});if(F)return new Promise(function(I,S){F(gn,function(W){I(new Uint8Array(W))},S)})}return Promise.resolve().then(function(){return K0(gn)})}function Z0(){var I={a:W1};function S(ce,be){var tt=ce.exports;if(u.asm=tt,Zn=u.asm.F,he=be,!x){var Bt=Ie.unusedWorkers.length;Ie.unusedWorkers.forEach(function(Mt){Ie.loadWasmModuleToWorker(Mt,function(){--Bt||q0("wasm-instantiate")})})}}x||G0("wasm-instantiate");function W(ce){S(ce.instance,ce.module)}function q(ce){return nh().then(function(be){return WebAssembly.instantiate(be,I)}).then(ce,function(be){G("failed to asynchronously prepare wasm: "+be),Yr(be)})}function de(){return!te&&typeof WebAssembly.instantiateStreaming=="function"&&!eh(gn)&&!th(gn)&&typeof fetch=="function"?fetch(gn,{credentials:"same-origin"}).then(function(ce){var be=WebAssembly.instantiateStreaming(ce,I);return be.then(W,function(tt){return G("wasm streaming compile failed: "+tt),G("falling back to ArrayBuffer instantiation"),q(W)})}):q(W)}if(u.instantiateWasm)try{var ue=u.instantiateWasm(I,S);return ue}catch(ce){return G("Module.instantiateWasm callback failed with error: "+ce),!1}return de().catch(d),{}}var rh={8991:function(I,S){setTimeout(function(){Rg(I,S)},0)}};function Y0(){Ie.initRuntime()}function zi(I){for(;I.length>0;){var S=I.shift();if(typeof S=="function"){S(u);continue}var W=S.func;typeof W=="number"?S.arg===void 0?Zn.get(W)():Zn.get(W)(S.arg):W(S.arg===void 0?null:S.arg)}}function Pi(I,S){if(I<=0||I>s().length||I&!0||S<0)return-28;if(S==0)return 0;S>=2147483647&&(S=Infinity);var W=Atomics.load(o(),ji>>2),q=0;if(W==I){var de=Atomics.compareExchange(o(),ji>>2,W,0);if(de==W&&(--S,q=1,S<=0))return 1}var ue=Atomics.notify(o(),I>>2,S);if(ue>=0)return ue+q;throw"Atomics.notify returned an unexpected value "+ue}u._emscripten_futex_wake=Pi;function J0(I){if(x)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!I)throw"Internal Error! Null pthread_ptr in killThread!";o()[I+12>>2]=0;var S=Ie.pthreads[I];S.worker.terminate(),Ie.freeThreadData(S),Ie.runningWorkers.splice(Ie.runningWorkers.indexOf(S.worker),1),S.worker.pthread=void 0}function Q0(I){if(x)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!I)throw"Internal Error! Null pthread_ptr in cancelThread!";var S=Ie.pthreads[I];S.worker.postMessage({cmd:"cancel"})}function e1(I){if(x)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!I)throw"Internal Error! Null pthread_ptr in cleanupThread!";o()[I+12>>2]=0;var S=Ie.pthreads[I];if(S){var W=S.worker;Ie.returnWorkerToPool(W)}}var Ie={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){for(var I=8,S=0;S>2]=I;var W=I+152;o()[W>>2]=W;for(var q=ns(512),S=0;S<128;++S)l()[q/4+S]=0;Atomics.store(l(),I+100>>2,q),Atomics.store(l(),I+40>>2,I),Ah(I,!w,1),Eg(I)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){for(;Ie.threadExitHandlers.length>0;)Ie.threadExitHandlers.pop()();x&&Bi()&&Cg()},threadExit:function(I){var S=Bi();S&&(Atomics.store(l(),S+4>>2,I),Atomics.store(l(),S+0>>2,1),Atomics.store(l(),S+56>>2,1),Atomics.store(l(),S+60>>2,0),Ie.runExitHandlers(),Pi(S+0,2147483647),Ah(0,0,0),x&&postMessage({cmd:"exit"}))},threadCancel:function(){Ie.runExitHandlers();var I=Bi();Atomics.store(l(),I+4>>2,-1),Atomics.store(l(),I+0>>2,1),Pi(I+0,2147483647),Ah(0,0,0),postMessage({cmd:"cancelDone"})},terminateAllThreads:function(){for(var I in Ie.pthreads){var S=Ie.pthreads[I];S&&S.worker&&Ie.returnWorkerToPool(S.worker)}Ie.pthreads={};for(var W=0;W>2];o()[I.threadInfoStruct+100>>2]=0,su(S),su(I.threadInfoStruct)}I.threadInfoStruct=0,I.allocatedOwnStack&&I.stackBase&&su(I.stackBase),I.stackBase=0,I.worker&&(I.worker.pthread=null)}},returnWorkerToPool:function(I){Ie.runWithoutMainThreadQueuedCalls(function(){delete Ie.pthreads[I.pthread.threadInfoStruct],Ie.unusedWorkers.push(I),Ie.runningWorkers.splice(Ie.runningWorkers.indexOf(I),1),Ie.freeThreadData(I.pthread),I.pthread=void 0})},runWithoutMainThreadQueuedCalls:function(I){o()[Og>>2]=0;try{I()}finally{o()[Og>>2]=1}},receiveObjectTransfer:function(I){},loadWasmModuleToWorker:function(I,S){I.onmessage=function(W){var q=W.data,de=q.cmd;if(I.pthread&&(Ie.currentProxiedOperationCallerThread=I.pthread.threadInfoStruct),q.targetThread&&q.targetThread!=Bi()){var ue=Ie.pthreads[q.targetThread];ue?ue.worker.postMessage(W.data,q.transferList):console.error('Internal error! Worker sent a message "'+de+'" to target pthread '+q.targetThread+", but that thread no longer exists!"),Ie.currentProxiedOperationCallerThread=void 0;return}if(de==="processQueuedMainThreadWork")tf();else if(de==="spawnThread")uh(W.data);else if(de==="cleanupThread")e1(q.thread);else if(de==="killThread")J0(q.thread);else if(de==="cancelThread")Q0(q.thread);else if(de==="loaded")I.loaded=!0,S&&S(I),I.runPthread&&(I.runPthread(),delete I.runPthread);else if(de==="print")X("Thread "+q.threadId+": "+q.text);else if(de==="printErr")G("Thread "+q.threadId+": "+q.text);else if(de==="alert")alert("Thread "+q.threadId+": "+q.text);else if(de==="exit"){var ce=I.pthread&&Atomics.load(l(),I.pthread.threadInfoStruct+64>>2);ce&&Ie.returnWorkerToPool(I)}else if(de==="exitProcess")try{i8(q.returnCode)}catch(be){if(be instanceof ou)return;throw be}else de==="cancelDone"?Ie.returnWorkerToPool(I):de==="objectTransfer"?Ie.receiveObjectTransfer(W.data):W.data.target==="setimmediate"?I.postMessage(W.data):G("worker sent an unknown command "+de);Ie.currentProxiedOperationCallerThread=void 0},I.onerror=function(W){G("pthread sent an error! "+W.filename+":"+W.lineno+": "+W.message)},b&&(I.on("message",function(W){I.onmessage({data:W})}),I.on("error",function(W){I.onerror(W)}),I.on("exit",function(W){})),I.postMessage({cmd:"load",urlOrBlob:u.mainScriptUrlOrBlob||r,wasmMemory:Q,wasmModule:he})},allocateUnusedWorker:function(){var I=T("tfjs-backend-wasm-threaded-simd.worker.js");Ie.unusedWorkers.push(new Worker(I))},getNewWorker:function(){return Ie.unusedWorkers.length==0&&(Ie.allocateUnusedWorker(),Ie.loadWasmModuleToWorker(Ie.unusedWorkers[0])),Ie.unusedWorkers.length>0?Ie.unusedWorkers.pop():null},busySpinWait:function(I){for(var S=performance.now()+I;performance.now()>2]=I,I}function o1(I,S){if(x)return ya(1,1,I,S)}function l1(I,S){if(I==S)postMessage({cmd:"processQueuedMainThreadWork"});else if(x)postMessage({targetThread:I,cmd:"processThreadQueue"});else{var W=Ie.pthreads[I],q=W&&W.worker;if(!q)return;q.postMessage({cmd:"processThreadQueue"})}return 1}function u1(){Yr()}function c1(I,S,W){var q=m1(S,W);return rh[I].apply(null,q)}function h1(I,S){}function d1(I,S,W){if(I<=0||I>s().length||I&!0)return-28;if(g){if(Atomics.load(o(),I>>2)!=S)return-6;for(var q=performance.now(),de=q+W,ue=Atomics.exchange(o(),ji>>2,I);;){if(q=performance.now(),q>de)return ue=Atomics.exchange(o(),ji>>2,0),-73;if(ue=Atomics.exchange(o(),ji>>2,0),ue==0)break;if(tf(),Atomics.load(o(),I>>2)!=S)return-6;ue=Atomics.exchange(o(),ji>>2,I)}return 0}else{var ce=Atomics.wait(o(),I>>2,S,W);if(ce==="timed-out")return-73;if(ce==="not-equal")return-6;if(ce==="ok")return 0;throw"Atomics.wait returned an unexpected value "+ce}}function p1(I,S,W){i().copyWithin(I,S,S+W)}function f1(){return b?require("os").cpus().length:navigator.hardwareConcurrency}function ya(I,S){for(var W=arguments.length-2,q=iu(),de=W,ue=Ui(de*8),ce=ue>>3,be=0;be>=2;W=i()[I++];){var q=W<105;q&&S&1&&S++,eu.push(q?c()[S++>>1]:o()[S]),++S}return eu}function A1(I,S,W){Ql.length=S;for(var q=W>>3,de=0;de>>16),Kt(Q.buffer),1}catch(S){}}function x1(I){var S=y1();if(I<=S)return!1;var W=2147483648;if(I>W)return!1;for(var q=1;q<=4;q*=2){var de=S*(1+.2/q);de=Math.min(de,I+100663296);var ue=Math.min(W,dt(Math.max(I,de),65536)),ce=g1(ue);if(ce)return!0}return!1}var Le={inEventHandler:0,removeAllEventListeners:function(){for(var I=Le.eventHandlers.length-1;I>=0;--I)Le._removeHandler(I);Le.eventHandlers=[],Le.deferredCalls=[]},registerRemoveEventListeners:function(){Le.removeEventListenersRegistered||(ma.push(Le.removeAllEventListeners),Le.removeEventListenersRegistered=!0)},deferredCalls:[],deferCall:function(I,S,W){function q(ce,be){if(ce.length!=be.length)return!1;for(var tt in ce)if(ce[tt]!=be[tt])return!1;return!0}for(var de in Le.deferredCalls){var ue=Le.deferredCalls[de];if(ue.targetFunction==I&&q(ue.argsList,W))return}Le.deferredCalls.push({targetFunction:I,precedence:S,argsList:W}),Le.deferredCalls.sort(function(ce,be){return ce.precedence>2]=W,o()[ce+4>>2]=q,o()[ce+8>>2]=de,nf(0,I,637534208,S,q,ce),Vi(ue)},getTargetThreadForEventCallback:function(I){switch(I){case 1:return 0;case 2:return Ie.currentProxiedOperationCallerThread;default:return I}},getNodeNameForTarget:function(I){return I?I==window?"#window":I==screen?"#screen":I&&I.nodeName?I.nodeName:"":""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function w1(I){var S=st(I)+1,W=ns(S);return et(I,W,S),W}function b1(I,S,W,q){var de=iu(),ue=Ui(12),ce=0;S&&(ce=w1(S)),o()[ue>>2]=ce,o()[ue+4>>2]=W,o()[ue+8>>2]=q,nf(0,I,657457152,0,ce,ue),Vi(de)}function _1(I,S,W,q){S=S?Fe(S):"",b1(I,S,W,q)}function v1(I){return I>2?Fe(I):I}var k1=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];function I1(I){I=v1(I);var S=k1[I]||(typeof document!="undefined"?document.querySelector(I):void 0);return S}function tu(I){return I1(I)}function ah(I,S,W){var q=tu(I);if(!q)return-4;if(q.canvasSharedPtr&&(o()[q.canvasSharedPtr>>2]=S,o()[q.canvasSharedPtr+4>>2]=W),q.offscreenCanvas||!q.controlTransferredOffscreen){q.offscreenCanvas&&(q=q.offscreenCanvas);var de=!1;if(q.GLctxObject&&q.GLctxObject.GLctx){var ue=q.GLctxObject.GLctx.getParameter(2978);de=ue[0]===0&&ue[1]===0&&ue[2]===q.width&&ue[3]===q.height}q.width=S,q.height=W,de&&q.GLctxObject.GLctx.viewport(0,0,S,W)}else if(q.canvasSharedPtr){var ce=o()[q.canvasSharedPtr+8>>2];return _1(ce,I,S,W),1}else return-4;return 0}function sh(I,S,W){return x?ya(2,1,I,S,W):ah(I,S,W)}function N1(I,S,W){var q=tu(I);return q?ah(I,S,W):sh(I,S,W)}function S1(I){}function T1(I,S){}function C1(I){var S=I.getExtension("ANGLE_instanced_arrays");if(S)return I.vertexAttribDivisor=function(W,q){S.vertexAttribDivisorANGLE(W,q)},I.drawArraysInstanced=function(W,q,de,ue){S.drawArraysInstancedANGLE(W,q,de,ue)},I.drawElementsInstanced=function(W,q,de,ue,ce){S.drawElementsInstancedANGLE(W,q,de,ue,ce)},1}function E1(I){var S=I.getExtension("OES_vertex_array_object");if(S)return I.createVertexArray=function(){return S.createVertexArrayOES()},I.deleteVertexArray=function(W){S.deleteVertexArrayOES(W)},I.bindVertexArray=function(W){S.bindVertexArrayOES(W)},I.isVertexArray=function(W){return S.isVertexArrayOES(W)},1}function R1(I){var S=I.getExtension("WEBGL_draw_buffers");if(S)return I.drawBuffers=function(W,q){S.drawBuffersWEBGL(W,q)},1}function M1(I){return!!(I.multiDrawWebgl=I.getExtension("WEBGL_multi_draw"))}var Je={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function(I){Je.lastError||(Je.lastError=I)},getNewId:function(I){for(var S=Je.counter++,W=I.length;W>2]:-1;de+=Fe(o()[W+ue*4>>2],ce<0?void 0:ce)}return de},createContext:function(I,S){var W=I.getContext("webgl",S);if(!W)return 0;var q=Je.registerContext(W,S);return q},registerContext:function(I,S){var W=ns(8);o()[W+4>>2]=Bi();var q={handle:W,attributes:S,version:S.majorVersion,GLctx:I};return I.canvas&&(I.canvas.GLctxObject=q),Je.contexts[W]=q,(typeof S.enableExtensionsByDefault=="undefined"||S.enableExtensionsByDefault)&&Je.initExtensions(q),W},makeContextCurrent:function(I){return Je.currentContext=Je.contexts[I],u.ctx=ga=Je.currentContext&&Je.currentContext.GLctx,!(I&&!ga)},getContext:function(I){return Je.contexts[I]},deleteContext:function(I){Je.currentContext===Je.contexts[I]&&(Je.currentContext=null),typeof Le=="object"&&Le.removeAllHandlersOnTarget(Je.contexts[I].GLctx.canvas),Je.contexts[I]&&Je.contexts[I].GLctx.canvas&&(Je.contexts[I].GLctx.canvas.GLctxObject=void 0),su(Je.contexts[I].handle),Je.contexts[I]=null},initExtensions:function(I){if(I||(I=Je.currentContext),!I.initExtensionsDone){I.initExtensionsDone=!0;var S=I.GLctx;C1(S),E1(S),R1(S),S.disjointTimerQueryExt=S.getExtension("EXT_disjoint_timer_query"),M1(S);var W=S.getSupportedExtensions()||[];W.forEach(function(q){q.indexOf("lose_context")<0&&q.indexOf("debug")<0&&S.getExtension(q)})}},populateUniformTable:function(I){for(var S=Je.programs[I],W=Je.programInfos[I]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1},q=W.uniforms,de=ga.getProgramParameter(S,35718),ue=0;ue>2,q=o()[W+(24>>2)],de={alpha:!!o()[W+(0>>2)],depth:!!o()[W+(4>>2)],stencil:!!o()[W+(8>>2)],antialias:!!o()[W+(12>>2)],premultipliedAlpha:!!o()[W+(16>>2)],preserveDrawingBuffer:!!o()[W+(20>>2)],powerPreference:F1[q],failIfMajorPerformanceCaveat:!!o()[W+(28>>2)],majorVersion:o()[W+(32>>2)],minorVersion:o()[W+(36>>2)],enableExtensionsByDefault:o()[W+(40>>2)],explicitSwapControl:o()[W+(44>>2)],proxyContextToMainThread:o()[W+(48>>2)],renderViaOffscreenBackBuffer:o()[W+(52>>2)]},ue=tu(I);if(!ue||de.explicitSwapControl)return 0;var ce=Je.createContext(ue,de);return ce}function D1(I,S){return $1(I,S)}var Li={mappings:{},buffers:[null,[],[]],printChar:function(I,S){var W=Li.buffers[I];S===0||S===10?((I===1?X:G)(De(W,0)),W.length=0):W.push(S)},varargs:void 0,get:function(){Li.varargs+=4;var I=o()[Li.varargs-4>>2];return I},getStr:function(I){var S=Fe(I);return S},get64:function(I,S){return I}};function ih(I){return x?ya(3,1,I):0}function oh(I,S,W,q,de){if(x)return ya(4,1,I,S,W,q,de)}function lh(I,S,W,q){if(x)return ya(5,1,I,S,W,q);for(var de=0,ue=0;ue>2],be=o()[S+(ue*8+4)>>2],tt=0;tt>2]=de,0}function O1(I){var S=Ie.threadExitHandlers.pop();I&&S()}function z1(I,S){Ie.threadExitHandlers.push(function(){Zn.get(I)(S)})}function uh(I){if(x)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var S=Ie.getNewWorker();if(S.pthread!==void 0)throw"Internal error!";if(!I.pthread_ptr)throw"Internal error, no pthread ptr!";Ie.runningWorkers.push(S);for(var W=ns(128*4),q=0;q<128;++q)o()[W+q*4>>2]=0;var de=I.stackBase+I.stackSize,ue=Ie.pthreads[I.pthread_ptr]={worker:S,stackBase:I.stackBase,stackSize:I.stackSize,allocatedOwnStack:I.allocatedOwnStack,threadInfoStruct:I.pthread_ptr},ce=ue.threadInfoStruct>>2;Atomics.store(l(),ce+(64>>2),I.detached),Atomics.store(l(),ce+(100>>2),W),Atomics.store(l(),ce+(40>>2),ue.threadInfoStruct),Atomics.store(l(),ce+(80>>2),I.stackSize),Atomics.store(l(),ce+(76>>2),de),Atomics.store(l(),ce+(104>>2),I.stackSize),Atomics.store(l(),ce+(104+8>>2),de),Atomics.store(l(),ce+(104+12>>2),I.detached);var be=Tg(),tt=be+40;Atomics.store(l(),ce+(172>>2),tt),S.pthread=ue;var Bt={cmd:"run",start_routine:I.startRoutine,arg:I.arg,threadInfoStruct:I.pthread_ptr,stackBase:I.stackBase,stackSize:I.stackSize};S.runPthread=function(){Bt.time=performance.now(),S.postMessage(Bt,I.transferList)},S.loaded&&(S.runPthread(),delete S.runPthread)}function P1(I,S,W,q){if(typeof SharedArrayBuffer=="undefined")return G("Current environment does not support SharedArrayBuffer, pthreads are not available!"),6;if(!I)return G("pthread_create called with a null thread pointer!"),28;var de=[],ue=0;if(x&&(de.length===0||ue))return Mg(687865856,I,S,W,q);if(ue)return ue;var ce=0,be=0,tt=0;S&&S!=-1?(ce=o()[S>>2],ce+=81920,be=o()[S+8>>2],tt=o()[S+12>>2]!==0):ce=2097152;var Bt=be==0;Bt?be=Dg(16,ce):(be-=ce,pe(be>0));for(var Mt=ns(228),wa=0;wa<228>>2;++wa)l()[(Mt>>2)+wa]=0;o()[I>>2]=Mt,o()[Mt+12>>2]=Mt;var Hi=Mt+152;o()[Hi>>2]=Hi;var xn={stackBase:be,stackSize:ce,allocatedOwnStack:Bt,detached:tt,startRoutine:W,pthread_ptr:Mt,arg:q,transferList:de};return x?(xn.cmd="spawnThread",postMessage(xn,de)):uh(xn),0}function ch(I){if(x)return ya(6,1,I);switch(I){case 30:return 16384;case 85:var S=2147483648;return S/16384;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return typeof navigator=="object"&&navigator.hardwareConcurrency||1}return i1(28),-1}x||Ie.initMainThreadBlock();var ga,L1=[null,o1,sh,ih,oh,lh,ch],W1={e:a1,r:s1,x:l1,b:u1,y:c1,j:h1,c:d1,d:Pi,f:ts,p:p1,z:f1,u:A1,q:x1,v:N1,i:S1,t:T1,w:D1,m:ih,n:oh,g:lh,o:Y0,a:Q||u.wasmMemory,k:O1,l:z1,h:P1,s:ch},Ng=Z0(),hh=u.___wasm_call_ctors=function(){return(hh=u.___wasm_call_ctors=u.asm.A).apply(null,arguments)},B1=u._init=function(){return(B1=u._init=u.asm.B).apply(null,arguments)},V1=u._register_tensor=function(){return(V1=u._register_tensor=u.asm.C).apply(null,arguments)},U1=u._dispose_data=function(){return(U1=u._dispose_data=u.asm.D).apply(null,arguments)},j1=u._dispose=function(){return(j1=u._dispose=u.asm.E).apply(null,arguments)},H1=u._Abs=function(){return(H1=u._Abs=u.asm.G).apply(null,arguments)},G1=u._Add=function(){return(G1=u._Add=u.asm.H).apply(null,arguments)},q1=u._AddN=function(){return(q1=u._AddN=u.asm.I).apply(null,arguments)},X1=u._ArgMax=function(){return(X1=u._ArgMax=u.asm.J).apply(null,arguments)},K1=u._AvgPool=function(){return(K1=u._AvgPool=u.asm.K).apply(null,arguments)},Z1=u._BatchMatMul=function(){return(Z1=u._BatchMatMul=u.asm.L).apply(null,arguments)},Y1=u._Ceil=function(){return(Y1=u._Ceil=u.asm.M).apply(null,arguments)},J1=u._ClipByValue=function(){return(J1=u._ClipByValue=u.asm.N).apply(null,arguments)},Q1=u._Conv2D=function(){return(Q1=u._Conv2D=u.asm.O).apply(null,arguments)},dh=u._Conv2DBackpropInput=function(){return(dh=u._Conv2DBackpropInput=u.asm.P).apply(null,arguments)},ph=u._Cos=function(){return(ph=u._Cos=u.asm.Q).apply(null,arguments)},nu=u._CropAndResize=function(){return(nu=u._CropAndResize=u.asm.R).apply(null,arguments)},Wi=u._Cumsum=function(){return(Wi=u._Cumsum=u.asm.S).apply(null,arguments)},ef=u._DepthToSpace=function(){return(ef=u._DepthToSpace=u.asm.T).apply(null,arguments)},ru=u._DepthwiseConv2dNative=function(){return(ru=u._DepthwiseConv2dNative=u.asm.U).apply(null,arguments)},K=u._Equal=function(){return(K=u._Equal=u.asm.V).apply(null,arguments)},ne=u._Exp=function(){return(ne=u._Exp=u.asm.W).apply(null,arguments)},Te=u._FlipLeftRight=function(){return(Te=u._FlipLeftRight=u.asm.X).apply(null,arguments)},Ze=u._Floor=function(){return(Ze=u._Floor=u.asm.Y).apply(null,arguments)},It=u._FloorDiv=function(){return(It=u._FloorDiv=u.asm.Z).apply(null,arguments)},ft=u._FusedBatchNorm=function(){return(ft=u._FusedBatchNorm=u.asm._).apply(null,arguments)},Ue=u._FusedConv2D=function(){return(Ue=u._FusedConv2D=u.asm.$).apply(null,arguments)},He=u._FusedDepthwiseConv2D=function(){return(He=u._FusedDepthwiseConv2D=u.asm.aa).apply(null,arguments)},Zt=u._Gather=function(){return(Zt=u._Gather=u.asm.ba).apply(null,arguments)},Jr=u._GatherNd=function(){return(Jr=u._GatherNd=u.asm.ca).apply(null,arguments)},Qr=u._Greater=function(){return(Qr=u._Greater=u.asm.da).apply(null,arguments)},fh=u._GreaterEqual=function(){return(fh=u._GreaterEqual=u.asm.ea).apply(null,arguments)},au=u._LeakyRelu=function(){return(au=u._LeakyRelu=u.asm.fa).apply(null,arguments)},jn=u._Less=function(){return(jn=u._Less=u.asm.ga).apply(null,arguments)},xa=u._LessEqual=function(){return(xa=u._LessEqual=u.asm.ha).apply(null,arguments)},mh=u._Log=function(){return(mh=u._Log=u.asm.ia).apply(null,arguments)},m4=u._LogicalAnd=function(){return(m4=u._LogicalAnd=u.asm.ja).apply(null,arguments)},A4=u._Max=function(){return(A4=u._Max=u.asm.ka).apply(null,arguments)},y4=u._MaxPool=function(){return(y4=u._MaxPool=u.asm.la).apply(null,arguments)},g4=u._Maximum=function(){return(g4=u._Maximum=u.asm.ma).apply(null,arguments)},x4=u._Mean=function(){return(x4=u._Mean=u.asm.na).apply(null,arguments)},w4=u._Min=function(){return(w4=u._Min=u.asm.oa).apply(null,arguments)},b4=u._Minimum=function(){return(b4=u._Minimum=u.asm.pa).apply(null,arguments)},_4=u._Multiply=function(){return(_4=u._Multiply=u.asm.qa).apply(null,arguments)},v4=u._Neg=function(){return(v4=u._Neg=u.asm.ra).apply(null,arguments)},k4=u._NonMaxSuppressionV3=function(){return(k4=u._NonMaxSuppressionV3=u.asm.sa).apply(null,arguments)},I4=u._NonMaxSuppressionV4=function(){return(I4=u._NonMaxSuppressionV4=u.asm.ta).apply(null,arguments)},N4=u._NonMaxSuppressionV5=function(){return(N4=u._NonMaxSuppressionV5=u.asm.ua).apply(null,arguments)},S4=u._NotEqual=function(){return(S4=u._NotEqual=u.asm.va).apply(null,arguments)},T4=u._OneHot=function(){return(T4=u._OneHot=u.asm.wa).apply(null,arguments)},C4=u._PadV2=function(){return(C4=u._PadV2=u.asm.xa).apply(null,arguments)},E4=u._Pow=function(){return(E4=u._Pow=u.asm.ya).apply(null,arguments)},R4=u._Prelu=function(){return(R4=u._Prelu=u.asm.za).apply(null,arguments)},M4=u._Prod=function(){return(M4=u._Prod=u.asm.Aa).apply(null,arguments)},F4=u._RealDiv=function(){return(F4=u._RealDiv=u.asm.Ba).apply(null,arguments)},$4=u._Relu=function(){return($4=u._Relu=u.asm.Ca).apply(null,arguments)},D4=u._Relu6=function(){return(D4=u._Relu6=u.asm.Da).apply(null,arguments)},O4=u._ResizeBilinear=function(){return(O4=u._ResizeBilinear=u.asm.Ea).apply(null,arguments)},z4=u._Reverse=function(){return(z4=u._Reverse=u.asm.Fa).apply(null,arguments)},P4=u._RotateWithOffset=function(){return(P4=u._RotateWithOffset=u.asm.Ga).apply(null,arguments)},L4=u._Round=function(){return(L4=u._Round=u.asm.Ha).apply(null,arguments)},W4=u._Rsqrt=function(){return(W4=u._Rsqrt=u.asm.Ia).apply(null,arguments)},B4=u._ScatterNd=function(){return(B4=u._ScatterNd=u.asm.Ja).apply(null,arguments)},V4=u._SelectV2=function(){return(V4=u._SelectV2=u.asm.Ka).apply(null,arguments)},U4=u._Sigmoid=function(){return(U4=u._Sigmoid=u.asm.La).apply(null,arguments)},j4=u._Sin=function(){return(j4=u._Sin=u.asm.Ma).apply(null,arguments)},H4=u._Softmax=function(){return(H4=u._Softmax=u.asm.Na).apply(null,arguments)},G4=u._Sqrt=function(){return(G4=u._Sqrt=u.asm.Oa).apply(null,arguments)},q4=u._Square=function(){return(q4=u._Square=u.asm.Pa).apply(null,arguments)},X4=u._SquaredDifference=function(){return(X4=u._SquaredDifference=u.asm.Qa).apply(null,arguments)},K4=u._Step=function(){return(K4=u._Step=u.asm.Ra).apply(null,arguments)},Z4=u._StridedSlice=function(){return(Z4=u._StridedSlice=u.asm.Sa).apply(null,arguments)},Y4=u._Sub=function(){return(Y4=u._Sub=u.asm.Ta).apply(null,arguments)},J4=u._Sum=function(){return(J4=u._Sum=u.asm.Ua).apply(null,arguments)},Q4=u._Tanh=function(){return(Q4=u._Tanh=u.asm.Va).apply(null,arguments)},e8=u._Tile=function(){return(e8=u._Tile=u.asm.Wa).apply(null,arguments)},t8=u._TopK=function(){return(t8=u._TopK=u.asm.Xa).apply(null,arguments)},n8=u._Transpose=function(){return(n8=u._Transpose=u.asm.Ya).apply(null,arguments)},r8=u.__FusedMatMul=function(){return(r8=u.__FusedMatMul=u.asm.Za).apply(null,arguments)},ns=u._malloc=function(){return(ns=u._malloc=u.asm._a).apply(null,arguments)},su=u._free=function(){return(su=u._free=u.asm.$a).apply(null,arguments)},Sg=u.___errno_location=function(){return(Sg=u.___errno_location=u.asm.ab).apply(null,arguments)},Tg=u._emscripten_get_global_libc=function(){return(Tg=u._emscripten_get_global_libc=u.asm.bb).apply(null,arguments)},Bi=u._pthread_self=function(){return(Bi=u._pthread_self=u.asm.cb).apply(null,arguments)},Cg=u.___pthread_tsd_run_dtors=function(){return(Cg=u.___pthread_tsd_run_dtors=u.asm.db).apply(null,arguments)},tf=u._emscripten_main_thread_process_queued_calls=function(){return(tf=u._emscripten_main_thread_process_queued_calls=u.asm.eb).apply(null,arguments)},a8=u._emscripten_current_thread_process_queued_calls=function(){return(a8=u._emscripten_current_thread_process_queued_calls=u.asm.fb).apply(null,arguments)},Eg=u._emscripten_register_main_browser_thread_id=function(){return(Eg=u._emscripten_register_main_browser_thread_id=u.asm.gb).apply(null,arguments)},Rg=u.__emscripten_do_dispatch_to_thread=function(){return(Rg=u.__emscripten_do_dispatch_to_thread=u.asm.hb).apply(null,arguments)},Mg=u._emscripten_sync_run_in_main_thread_4=function(){return(Mg=u._emscripten_sync_run_in_main_thread_4=u.asm.ib).apply(null,arguments)},Fg=u._emscripten_run_in_main_runtime_thread_js=function(){return(Fg=u._emscripten_run_in_main_runtime_thread_js=u.asm.jb).apply(null,arguments)},nf=u.__emscripten_call_on_thread=function(){return(nf=u.__emscripten_call_on_thread=u.asm.kb).apply(null,arguments)},s8=u._emscripten_tls_init=function(){return(s8=u._emscripten_tls_init=u.asm.lb).apply(null,arguments)},Ah=u.__emscripten_thread_init=function(){return(Ah=u.__emscripten_thread_init=u.asm.mb).apply(null,arguments)},iu=u.stackSave=function(){return(iu=u.stackSave=u.asm.nb).apply(null,arguments)},Vi=u.stackRestore=function(){return(Vi=u.stackRestore=u.asm.ob).apply(null,arguments)},Ui=u.stackAlloc=function(){return(Ui=u.stackAlloc=u.asm.pb).apply(null,arguments)},$g=u._emscripten_stack_set_limits=function(){return($g=u._emscripten_stack_set_limits=u.asm.qb).apply(null,arguments)},Dg=u._memalign=function(){return(Dg=u._memalign=u.asm.rb).apply(null,arguments)},Og=u.__emscripten_allow_main_runtime_queued_calls=9880,ji=u.__emscripten_main_thread_futex=11368;u.cwrap=Me,u.PThread=Ie,u.PThread=Ie,u.wasmMemory=Q,u.ExitStatus=ou;var yh;function ou(I){this.name="ExitStatus",this.message="Program terminated with exit("+I+")",this.status=I}es=function I(){yh||rf(),yh||(es=I)};function rf(I){if(I=I||m,Zr>0)return;if(x){h(u),postMessage({cmd:"loaded"});return}if(U0(),Zr>0)return;function S(){yh||(yh=!0,u.calledRun=!0,!le&&(Zc(),j0(),h(u),u.onRuntimeInitialized&&u.onRuntimeInitialized(),yn()))}u.setStatus?(u.setStatus("Running..."),setTimeout(function(){setTimeout(function(){u.setStatus("")},1),S()},1)):S()}u.run=rf;function i8(I,S){if(!(S&&oe&&I===0)){if(!S&&x)throw postMessage({cmd:"exitProcess",returnCode:I}),new ou(I);oe||(Ie.terminateAllThreads(),fe=I,Yc(),u.onExit&&u.onExit(I),le=!0),y(I,new ou(I))}}if(u.preInit)for(typeof u.preInit=="function"&&(u.preInit=[u.preInit]);u.preInit.length>0;)u.preInit.pop()();return x&&(oe=!1,Ie.initWorker()),rf(),a.ready}}();typeof e=="object"&&typeof t=="object"?t.exports=n:typeof define=="function"&&define.amd?define([],function(){return n}):typeof e=="object"&&(e.WasmBackendModuleThreadedSimd=n)}),N8=wt((e,t)=>{var n=function(){var r=typeof document!="undefined"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename!="undefined"&&(r=r||__filename),function(a){a=a||{};var s=typeof a!="undefined"?a:{},i,o;s.ready=new Promise(function(K,ne){i=K,o=ne});var l={},c;for(c in s)s.hasOwnProperty(c)&&(l[c]=s[c]);var u=[],h="./this.program",d=function(K,ne){throw ne},p=!1,f=!1,m=!1,A=!1;p=typeof window=="object",f=typeof importScripts=="function",m=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string",A=!p&&!m&&!f;var y="";function g(K){return s.locateFile?s.locateFile(K,y):y+K}var w,b,_,x,N,T;m?(f?y=lu().dirname(y)+"/":y=__dirname+"/",w=function(K,ne){return N||(N=require("fs")),T||(T=lu()),K=T.normalize(K),N.readFileSync(K,ne?null:"utf8")},_=function(K){var ne=w(K,!0);return ne.buffer||(ne=new Uint8Array(ne)),X(ne.buffer),ne},process.argv.length>1&&(h=process.argv[1].replace(/\\/g,"/")),u=process.argv.slice(2),process.on("uncaughtException",function(K){if(!(K instanceof ef))throw K}),process.on("unhandledRejection",dr),d=function(K){process.exit(K)},s.inspect=function(){return"[Emscripten Module object]"}):A?(typeof read!="undefined"&&(w=function(K){return read(K)}),_=function(K){var ne;return typeof readbuffer=="function"?new Uint8Array(readbuffer(K)):(ne=read(K,"binary"),X(typeof ne=="object"),ne)},typeof scriptArgs!="undefined"?u=scriptArgs:typeof arguments!="undefined"&&(u=arguments),typeof quit=="function"&&(d=function(K){quit(K)}),typeof print!="undefined"&&(typeof console=="undefined"&&(console={}),console.log=print,console.warn=console.error=typeof printErr!="undefined"?printErr:print)):(p||f)&&(f?y=self.location.href:typeof document!="undefined"&&document.currentScript&&(y=document.currentScript.src),r&&(y=r),y.indexOf("blob:")!==0?y=y.substr(0,y.lastIndexOf("/")+1):y="",w=function(K){var ne=new XMLHttpRequest;return ne.open("GET",K,!1),ne.send(null),ne.responseText},f&&(_=function(K){var ne=new XMLHttpRequest;return ne.open("GET",K,!1),ne.responseType="arraybuffer",ne.send(null),new Uint8Array(ne.response)}),b=function(K,ne,Te){var Ze=new XMLHttpRequest;Ze.open("GET",K,!0),Ze.responseType="arraybuffer",Ze.onload=function(){if(Ze.status==200||Ze.status==0&&Ze.response){ne(Ze.response);return}Te()},Ze.onerror=Te,Ze.send(null)},x=function(K){document.title=K});var C=s.print||console.log.bind(console),F=s.printErr||console.warn.bind(console);for(c in l)l.hasOwnProperty(c)&&(s[c]=l[c]);l=null,s.arguments&&(u=s.arguments),s.thisProgram&&(h=s.thisProgram),s.quit&&(d=s.quit);var D;s.wasmBinary&&(D=s.wasmBinary);var L=s.noExitRuntime||!0;typeof WebAssembly!="object"&&dr("no native wasm support detected");var V,U=!1,j;function X(K,ne){K||dr("Assertion failed: "+ne)}function G(K){var ne=s["_"+K];return X(ne,"Cannot call unknown function "+K+", make sure it is exported"),ne}function ee(K,ne,Te,Ze,It){var ft={string:function(jn){var xa=0;if(jn!=null&&jn!==0){var mh=(jn.length<<2)+1;xa=nu(mh),he(jn,xa,mh)}return xa},array:function(jn){var xa=nu(jn.length);return le(jn,xa),xa}};function Ue(jn){return ne==="string"?oe(jn):ne==="boolean"?Boolean(jn):jn}var He=G(K),Zt=[],Jr=0;if(Ze)for(var Qr=0;Qr=Ze);)++It;if(It-ne>16&&K.subarray&&ae)return ae.decode(K.subarray(ne,It));for(var ft="";ne>10,56320|Jr&1023)}}return ft}function oe(K,ne){return K?te(Se,K,ne):""}function Q(K,ne,Te,Ze){if(!(Ze>0))return 0;for(var It=Te,ft=Te+Ze-1,Ue=0;Ue=55296&&He<=57343){var Zt=K.charCodeAt(++Ue);He=65536+((He&1023)<<10)|Zt&1023}if(He<=127){if(Te>=ft)break;ne[Te++]=He}else if(He<=2047){if(Te+1>=ft)break;ne[Te++]=192|He>>6,ne[Te++]=128|He&63}else if(He<=65535){if(Te+2>=ft)break;ne[Te++]=224|He>>12,ne[Te++]=128|He>>6&63,ne[Te++]=128|He&63}else{if(Te+3>=ft)break;ne[Te++]=240|He>>18,ne[Te++]=128|He>>12&63,ne[Te++]=128|He>>6&63,ne[Te++]=128|He&63}}return ne[Te]=0,Te-It}function he(K,ne,Te){return Q(K,Se,ne,Te)}function le(K,ne){ke.set(K,ne)}function fe(K,ne){return K%ne>0&&(K+=ne-K%ne),K}var pe,ke,Se,Me,De,Fe,Qe,et,st;function Ke(K){pe=K,s.HEAP8=ke=new Int8Array(K),s.HEAP16=Me=new Int16Array(K),s.HEAP32=Fe=new Int32Array(K),s.HEAPU8=Se=new Uint8Array(K),s.HEAPU16=De=new Uint16Array(K),s.HEAPU32=Qe=new Uint32Array(K),s.HEAPF32=et=new Float32Array(K),s.HEAPF64=st=new Float64Array(K)}var dt=s.INITIAL_MEMORY||16777216,Be,mn=[],xt=[],Vn=[],Xt=[],An=!1;xt.push({func:function(){nh()}});function Un(){if(s.preRun)for(typeof s.preRun=="function"&&(s.preRun=[s.preRun]);s.preRun.length;)Tr(s.preRun.shift());Aa(mn)}function En(){An=!0,Aa(xt)}function on(){Aa(Vn)}function Kt(){if(s.postRun)for(typeof s.postRun=="function"&&(s.postRun=[s.postRun]);s.postRun.length;)Zn(s.postRun.shift());Aa(Xt)}function Tr(K){mn.unshift(K)}function Zn(K){Xt.unshift(K)}var Yn=0,fa=null,Kr=null;function ma(K){Yn++,s.monitorRunDependencies&&s.monitorRunDependencies(Yn)}function Di(K){if(Yn--,s.monitorRunDependencies&&s.monitorRunDependencies(Yn),Yn==0&&(fa!==null&&(clearInterval(fa),fa=null),Kr)){var ne=Kr;Kr=null,ne()}}s.preloadedImages={},s.preloadedAudios={};function dr(K){s.onAbort&&s.onAbort(K),K+="",F(K),U=!0,j=1,K="abort("+K+"). Build with -s ASSERTIONS=1 for more info.";var ne=new WebAssembly.RuntimeError(K);throw o(ne),ne}function Kc(K,ne){return String.prototype.startsWith?K.startsWith(ne):K.indexOf(ne)===0}var U0="data:application/octet-stream;base64,";function Zc(K){return Kc(K,U0)}var j0="file://";function Yc(K){return Kc(K,j0)}var yn="tfjs-backend-wasm.wasm";Zc(yn)||(yn=g(yn));function Jc(K){try{if(K==yn&&D)return new Uint8Array(D);if(_)return _(K);throw"both async and sync fetching of the wasm failed"}catch(ne){dr(ne)}}function H0(){if(!D&&(p||f)){if(typeof fetch=="function"&&!Yc(yn))return fetch(yn,{credentials:"same-origin"}).then(function(K){if(!K.ok)throw"failed to load wasm binary file at '"+yn+"'";return K.arrayBuffer()}).catch(function(){return Jc(yn)});if(b)return new Promise(function(K,ne){b(yn,function(Te){K(new Uint8Array(Te))},ne)})}return Promise.resolve().then(function(){return Jc(yn)})}function Zr(){var K={a:gn};function ne(Ue,He){var Zt=Ue.exports;s.asm=Zt,V=s.asm.g,Ke(V.buffer),Be=s.asm.m,Di("wasm-instantiate")}ma("wasm-instantiate");function Te(Ue){ne(Ue.instance)}function Ze(Ue){return H0().then(function(He){return WebAssembly.instantiate(He,K)}).then(Ue,function(He){F("failed to asynchronously prepare wasm: "+He),dr(He)})}function It(){return!D&&typeof WebAssembly.instantiateStreaming=="function"&&!Zc(yn)&&!Yc(yn)&&typeof fetch=="function"?fetch(yn,{credentials:"same-origin"}).then(function(Ue){var He=WebAssembly.instantiateStreaming(Ue,K);return He.then(Te,function(Zt){return F("wasm streaming compile failed: "+Zt),F("falling back to ArrayBuffer instantiation"),Ze(Te)})}):Ze(Te)}if(s.instantiateWasm)try{var ft=s.instantiateWasm(K,ne);return ft}catch(Ue){return F("Module.instantiateWasm callback failed with error: "+Ue),!1}return It().catch(o),{}}function Aa(K){for(;K.length>0;){var ne=K.shift();if(typeof ne=="function"){ne(s);continue}var Te=ne.func;typeof Te=="number"?ne.arg===void 0?Be.get(Te)():Be.get(Te)(ne.arg):Te(ne.arg===void 0?null:ne.arg)}}function es(){dr()}function G0(K,ne,Te){Se.copyWithin(K,ne,ne+Te)}function q0(){return Se.length}function Yr(K){try{return V.grow(K-pe.byteLength+65535>>>16),Ke(V.buffer),1}catch(ne){}}function Qc(K){var ne=q0(),Te=2147483648;if(K>Te)return!1;for(var Ze=1;Ze<=4;Ze*=2){var It=ne*(1+.2/Ze);It=Math.min(It,K+100663296);var ft=Math.min(Te,fe(Math.max(K,It),65536)),Ue=Yr(ft);if(Ue)return!0}return!1}var Oi={mappings:{},buffers:[null,[],[]],printChar:function(K,ne){var Te=Oi.buffers[K];ne===0||ne===10?((K===1?C:F)(te(Te,0)),Te.length=0):Te.push(ne)},varargs:void 0,get:function(){Oi.varargs+=4;var K=Fe[Oi.varargs-4>>2];return K},getStr:function(K){var ne=oe(K);return ne},get64:function(K,ne){return K}};function eh(K){return 0}function X0(K,ne,Te,Ze,It){}function th(K,ne,Te,Ze){for(var It=0,ft=0;ft>2],He=Fe[ne+(ft*8+4)>>2],Zt=0;Zt>2]=It,0}var gn={a:es,d:G0,e:Qc,f:eh,c:X0,b:th},K0=Zr(),nh=s.___wasm_call_ctors=function(){return(nh=s.___wasm_call_ctors=s.asm.h).apply(null,arguments)},Z0=s._init=function(){return(Z0=s._init=s.asm.i).apply(null,arguments)},rh=s._register_tensor=function(){return(rh=s._register_tensor=s.asm.j).apply(null,arguments)},Y0=s._dispose_data=function(){return(Y0=s._dispose_data=s.asm.k).apply(null,arguments)},zi=s._dispose=function(){return(zi=s._dispose=s.asm.l).apply(null,arguments)},Pi=s._Abs=function(){return(Pi=s._Abs=s.asm.n).apply(null,arguments)},J0=s._Add=function(){return(J0=s._Add=s.asm.o).apply(null,arguments)},Q0=s._AddN=function(){return(Q0=s._AddN=s.asm.p).apply(null,arguments)},e1=s._ArgMax=function(){return(e1=s._ArgMax=s.asm.q).apply(null,arguments)},Ie=s._AvgPool=function(){return(Ie=s._AvgPool=s.asm.r).apply(null,arguments)},t1=s._BatchMatMul=function(){return(t1=s._BatchMatMul=s.asm.s).apply(null,arguments)},n1=s._Ceil=function(){return(n1=s._Ceil=s.asm.t).apply(null,arguments)},r1=s._ClipByValue=function(){return(r1=s._ClipByValue=s.asm.u).apply(null,arguments)},a1=s._Conv2D=function(){return(a1=s._Conv2D=s.asm.v).apply(null,arguments)},s1=s._Conv2DBackpropInput=function(){return(s1=s._Conv2DBackpropInput=s.asm.w).apply(null,arguments)},ts=s._Cos=function(){return(ts=s._Cos=s.asm.x).apply(null,arguments)},i1=s._CropAndResize=function(){return(i1=s._CropAndResize=s.asm.y).apply(null,arguments)},o1=s._Cumsum=function(){return(o1=s._Cumsum=s.asm.z).apply(null,arguments)},l1=s._DepthToSpace=function(){return(l1=s._DepthToSpace=s.asm.A).apply(null,arguments)},u1=s._DepthwiseConv2dNative=function(){return(u1=s._DepthwiseConv2dNative=s.asm.B).apply(null,arguments)},c1=s._Equal=function(){return(c1=s._Equal=s.asm.C).apply(null,arguments)},h1=s._Exp=function(){return(h1=s._Exp=s.asm.D).apply(null,arguments)},d1=s._FlipLeftRight=function(){return(d1=s._FlipLeftRight=s.asm.E).apply(null,arguments)},p1=s._Floor=function(){return(p1=s._Floor=s.asm.F).apply(null,arguments)},f1=s._FloorDiv=function(){return(f1=s._FloorDiv=s.asm.G).apply(null,arguments)},ya=s._FusedBatchNorm=function(){return(ya=s._FusedBatchNorm=s.asm.H).apply(null,arguments)},Ql=s._FusedConv2D=function(){return(Ql=s._FusedConv2D=s.asm.I).apply(null,arguments)},eu=s._FusedDepthwiseConv2D=function(){return(eu=s._FusedDepthwiseConv2D=s.asm.J).apply(null,arguments)},m1=s._Gather=function(){return(m1=s._Gather=s.asm.K).apply(null,arguments)},A1=s._GatherNd=function(){return(A1=s._GatherNd=s.asm.L).apply(null,arguments)},y1=s._Greater=function(){return(y1=s._Greater=s.asm.M).apply(null,arguments)},g1=s._GreaterEqual=function(){return(g1=s._GreaterEqual=s.asm.N).apply(null,arguments)},x1=s._LeakyRelu=function(){return(x1=s._LeakyRelu=s.asm.O).apply(null,arguments)},Le=s._Less=function(){return(Le=s._Less=s.asm.P).apply(null,arguments)},w1=s._LessEqual=function(){return(w1=s._LessEqual=s.asm.Q).apply(null,arguments)},b1=s._Log=function(){return(b1=s._Log=s.asm.R).apply(null,arguments)},_1=s._LogicalAnd=function(){return(_1=s._LogicalAnd=s.asm.S).apply(null,arguments)},v1=s._Max=function(){return(v1=s._Max=s.asm.T).apply(null,arguments)},k1=s._MaxPool=function(){return(k1=s._MaxPool=s.asm.U).apply(null,arguments)},I1=s._Maximum=function(){return(I1=s._Maximum=s.asm.V).apply(null,arguments)},tu=s._Mean=function(){return(tu=s._Mean=s.asm.W).apply(null,arguments)},ah=s._Min=function(){return(ah=s._Min=s.asm.X).apply(null,arguments)},sh=s._Minimum=function(){return(sh=s._Minimum=s.asm.Y).apply(null,arguments)},N1=s._Multiply=function(){return(N1=s._Multiply=s.asm.Z).apply(null,arguments)},S1=s._Neg=function(){return(S1=s._Neg=s.asm._).apply(null,arguments)},T1=s._NonMaxSuppressionV3=function(){return(T1=s._NonMaxSuppressionV3=s.asm.$).apply(null,arguments)},C1=s._NonMaxSuppressionV4=function(){return(C1=s._NonMaxSuppressionV4=s.asm.aa).apply(null,arguments)},E1=s._NonMaxSuppressionV5=function(){return(E1=s._NonMaxSuppressionV5=s.asm.ba).apply(null,arguments)},R1=s._NotEqual=function(){return(R1=s._NotEqual=s.asm.ca).apply(null,arguments)},M1=s._OneHot=function(){return(M1=s._OneHot=s.asm.da).apply(null,arguments)},Je=s._PadV2=function(){return(Je=s._PadV2=s.asm.ea).apply(null,arguments)},F1=s._Pow=function(){return(F1=s._Pow=s.asm.fa).apply(null,arguments)},$1=s._Prelu=function(){return($1=s._Prelu=s.asm.ga).apply(null,arguments)},D1=s._Prod=function(){return(D1=s._Prod=s.asm.ha).apply(null,arguments)},Li=s._RealDiv=function(){return(Li=s._RealDiv=s.asm.ia).apply(null,arguments)},ih=s._Relu=function(){return(ih=s._Relu=s.asm.ja).apply(null,arguments)},oh=s._Relu6=function(){return(oh=s._Relu6=s.asm.ka).apply(null,arguments)},lh=s._ResizeBilinear=function(){return(lh=s._ResizeBilinear=s.asm.la).apply(null,arguments)},O1=s._Reverse=function(){return(O1=s._Reverse=s.asm.ma).apply(null,arguments)},z1=s._RotateWithOffset=function(){return(z1=s._RotateWithOffset=s.asm.na).apply(null,arguments)},uh=s._Round=function(){return(uh=s._Round=s.asm.oa).apply(null,arguments)},P1=s._Rsqrt=function(){return(P1=s._Rsqrt=s.asm.pa).apply(null,arguments)},ch=s._ScatterNd=function(){return(ch=s._ScatterNd=s.asm.qa).apply(null,arguments)},ga=s._SelectV2=function(){return(ga=s._SelectV2=s.asm.ra).apply(null,arguments)},L1=s._Sigmoid=function(){return(L1=s._Sigmoid=s.asm.sa).apply(null,arguments)},W1=s._Sin=function(){return(W1=s._Sin=s.asm.ta).apply(null,arguments)},Ng=s._Softmax=function(){return(Ng=s._Softmax=s.asm.ua).apply(null,arguments)},hh=s._Sqrt=function(){return(hh=s._Sqrt=s.asm.va).apply(null,arguments)},B1=s._Square=function(){return(B1=s._Square=s.asm.wa).apply(null,arguments)},V1=s._SquaredDifference=function(){return(V1=s._SquaredDifference=s.asm.xa).apply(null,arguments)},U1=s._Step=function(){return(U1=s._Step=s.asm.ya).apply(null,arguments)},j1=s._StridedSlice=function(){return(j1=s._StridedSlice=s.asm.za).apply(null,arguments)},H1=s._Sub=function(){return(H1=s._Sub=s.asm.Aa).apply(null,arguments)},G1=s._Sum=function(){return(G1=s._Sum=s.asm.Ba).apply(null,arguments)},q1=s._Tanh=function(){return(q1=s._Tanh=s.asm.Ca).apply(null,arguments)},X1=s._Tile=function(){return(X1=s._Tile=s.asm.Da).apply(null,arguments)},K1=s._TopK=function(){return(K1=s._TopK=s.asm.Ea).apply(null,arguments)},Z1=s._Transpose=function(){return(Z1=s._Transpose=s.asm.Fa).apply(null,arguments)},Y1=s.__FusedMatMul=function(){return(Y1=s.__FusedMatMul=s.asm.Ga).apply(null,arguments)},J1=s._malloc=function(){return(J1=s._malloc=s.asm.Ha).apply(null,arguments)},Q1=s._free=function(){return(Q1=s._free=s.asm.Ia).apply(null,arguments)},dh=s.stackSave=function(){return(dh=s.stackSave=s.asm.Ja).apply(null,arguments)},ph=s.stackRestore=function(){return(ph=s.stackRestore=s.asm.Ka).apply(null,arguments)},nu=s.stackAlloc=function(){return(nu=s.stackAlloc=s.asm.La).apply(null,arguments)};s.cwrap=Y;var Wi;function ef(K){this.name="ExitStatus",this.message="Program terminated with exit("+K+")",this.status=K}Kr=function K(){Wi||ru(),Wi||(Kr=K)};function ru(K){if(K=K||u,Yn>0||(Un(),Yn>0))return;function ne(){Wi||(Wi=!0,s.calledRun=!0,!U&&(En(),on(),i(s),s.onRuntimeInitialized&&s.onRuntimeInitialized(),Kt()))}s.setStatus?(s.setStatus("Running..."),setTimeout(function(){setTimeout(function(){s.setStatus("")},1),ne()},1)):ne()}if(s.run=ru,s.preInit)for(typeof s.preInit=="function"&&(s.preInit=[s.preInit]);s.preInit.length>0;)s.preInit.pop()();return ru(),a.ready}}();typeof e=="object"&&typeof t=="object"?t.exports=n:typeof define=="function"&&define.amd?define([],function(){return n}):typeof e=="object"&&(e.WasmBackendModule=n)}),S8=wt((e,t)=>{(function(n,r,a){function s(c){var u=this,h=l();u.next=function(){var d=2091639*u.s0+u.c*23283064365386963e-26;return u.s0=u.s1,u.s1=u.s2,u.s2=d-(u.c=d|0)},u.c=1,u.s0=h(" "),u.s1=h(" "),u.s2=h(" "),u.s0-=h(c),u.s0<0&&(u.s0+=1),u.s1-=h(c),u.s1<0&&(u.s1+=1),u.s2-=h(c),u.s2<0&&(u.s2+=1),h=null}function i(c,u){return u.c=c.c,u.s0=c.s0,u.s1=c.s1,u.s2=c.s2,u}function o(c,u){var h=new s(c),d=u&&u.state,p=h.next;return p.int32=function(){return h.next()*4294967296|0},p.double=function(){return p()+(p()*2097152|0)*11102230246251565e-32},p.quick=p,d&&(typeof d=="object"&&i(d,h),p.state=function(){return i(h,{})}),p}function l(){var c=4022871197,u=function(h){h=String(h);for(var d=0;d>>0,p-=c,p*=c,c=p>>>0,p-=c,c+=p*4294967296}return(c>>>0)*23283064365386963e-26};return u}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.alea=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),T8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.x=0,c.y=0,c.z=0,c.w=0,c.next=function(){var d=c.x^c.x<<11;return c.x=c.y,c.y=c.z,c.z=c.w,c.w^=c.w>>>19^d^d>>>8},l===(l|0)?c.x=l:u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor128=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),C8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.x^c.x>>>2;return c.x=c.y,c.y=c.z,c.z=c.w,c.w=c.v,(c.d=c.d+362437|0)+(c.v=c.v^c.v<<4^(d^d<<1))|0},c.x=0,c.y=0,c.z=0,c.w=0,c.v=0,l===(l|0)?c.x=l:u+=l;for(var h=0;h>>4),c.next()}function i(l,c){return c.x=l.x,c.y=l.y,c.z=l.z,c.w=l.w,c.v=l.v,c.d=l.d,c}function o(l,c){var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorwow=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),E8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.x,d=c.i,p,f,m;return p=h[d],p^=p>>>7,f=p^p<<24,p=h[d+1&7],f^=p^p>>>10,p=h[d+3&7],f^=p^p>>>3,p=h[d+4&7],f^=p^p<<7,p=h[d+7&7],p=p^p<<13,f^=p^p<<9,h[d]=f,c.i=d+1&7,f};function u(h,d){var p,f,m=[];if(d===(d|0))f=m[0]=d;else for(d=""+d,p=0;p0;--p)h.next()}u(c,l)}function i(l,c){return c.x=l.x.slice(),c.i=l.i,c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.x&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xorshift7=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),R8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this;c.next=function(){var h=c.w,d=c.X,p=c.i,f,m;return c.w=h=h+1640531527|0,m=d[p+34&127],f=d[p=p+1&127],m^=m<<13,f^=f<<17,m^=m>>>15,f^=f>>>12,m=d[p]=m^f,c.i=p,m+(h^h>>>16)|0};function u(h,d){var p,f,m,A,y,g=[],w=128;for(d===(d|0)?(f=d,d=null):(d=d+"\0",f=0,w=Math.max(w,d.length)),m=0,A=-32;A>>15,f^=f<<4,f^=f>>>13,A>=0&&(y=y+1640531527|0,p=g[A&127]^=f+y,m=p==0?m+1:0);for(m>=128&&(g[(d&&d.length||0)&127]=-1),m=127,A=4*128;A>0;--A)f=g[m+34&127],p=g[m=m+1&127],f^=f<<13,p^=p<<17,f^=f>>>15,p^=p>>>12,g[m]=f^p;h.w=y,h.X=g,h.i=m}u(c,l)}function i(l,c){return c.i=l.i,c.w=l.w,c.X=l.X.slice(),c}function o(l,c){l==null&&(l=+new Date);var u=new s(l),h=c&&c.state,d=function(){return(u.next()>>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(h.X&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.xor4096=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),M8=wt((e,t)=>{(function(n,r,a){function s(l){var c=this,u="";c.next=function(){var d=c.b,p=c.c,f=c.d,m=c.a;return d=d<<25^d>>>7^p,p=p-f|0,f=f<<24^f>>>8^m,m=m-d|0,c.b=d=d<<20^d>>>12^p,c.c=p=p-f|0,c.d=f<<16^p>>>16^m,c.a=m-d|0},c.a=0,c.b=0,c.c=2654435769|0,c.d=1367130551,l===Math.floor(l)?(c.a=l/4294967296|0,c.b=l|0):u+=l;for(var h=0;h>>0)/4294967296};return d.double=function(){do var p=u.next()>>>11,f=(u.next()>>>0)/4294967296,m=(p+f)/(1<<21);while(m===0);return m},d.int32=u.next,d.quick=d,h&&(typeof h=="object"&&i(h,u),d.state=function(){return i(u,{})}),d}r&&r.exports?r.exports=o:a&&a.amd?a(function(){return o}):this.tychei=o})(e,typeof t=="object"&&t,typeof define=="function"&&define)}),F8=wt((e,t)=>{(function(n,r,a){var s=256,i=6,o=52,l="random",c=a.pow(s,i),u=a.pow(2,o),h=u*2,d=s-1,p;function f(_,x,N){var T=[];x=x==!0?{entropy:!0}:x||{};var C=g(y(x.entropy?[_,b(r)]:_==null?w():_,3),T),F=new m(T),D=function(){for(var L=F.g(i),V=c,U=0;L=h;)L/=2,V/=2,U>>>=1;return(L+U)/V};return D.int32=function(){return F.g(4)|0},D.quick=function(){return F.g(4)/4294967296},D.double=D,g(b(F.S),r),(x.pass||N||function(L,V,U,j){return j&&(j.S&&A(j,F),L.state=function(){return A(F,{})}),U?(a[l]=L,V):L})(D,C,"global"in x?x.global:this==a,x.state)}function m(_){var x,N=_.length,T=this,C=0,F=T.i=T.j=0,D=T.S=[];for(N||(_=[N++]);C{var n=S8(),r=T8(),a=C8(),s=E8(),i=R8(),o=M8(),l=F8();l.alea=n,l.xor128=r,l.xorwow=a,l.xorshift7=s,l.xor4096=i,l.tychei=o,t.exports=l}),$8=wt(()=>{}),D8="3.3.0",O8="3.3.0",z8="3.3.0",P8="3.3.0",L8="3.3.0",W8=1e-7,B8=1e-4,wh=class{constructor(e,t){this.backend=e,this.dataMover=t,this.data=new WeakMap,this.dataIdsCount=0}get(e){return this.data.has(e)||this.dataMover.moveData(this.backend,e),this.data.get(e)}set(e,t){this.dataIdsCount++,this.data.set(e,t)}has(e){return this.data.has(e)}delete(e){return this.dataIdsCount--,this.data.delete(e)}numDataIds(){return this.dataIdsCount}},uu=class{refCount(e){return Qn("refCount")}incRef(e){return Qn("incRef")}timerAvailable(){return!0}time(e){return Qn("time")}read(e){return Qn("read")}readSync(e){return Qn("readSync")}numDataIds(){return Qn("numDataIds")}disposeData(e,t){return Qn("disposeData")}write(e,t,n){return Qn("write")}move(e,t,n,r,a){return Qn("move")}memory(){return Qn("memory")}floatPrecision(){return Qn("floatPrecision")}epsilon(){return this.floatPrecision()===32?W8:B8}dispose(){return Qn("dispose")}};function Qn(e){throw new Error(`'${e}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`)}function Ug(e){let t=e.length,n=0,r=0;for(;t>0;)r=Math.random()*t|0,t--,n=e[t],e[t]=e[r],e[r]=n}function V8(e,t){if(e.length!==t.length)throw new Error(`Array sizes must match to be shuffled together First array length was ${e.length}Second array length was ${t.length}`);let n=e.length,r,a,s=0;for(;n>0;)s=Math.random()*n|0,n--,r=e[n],a=t[n],e[n]=e[s],t[n]=t[s],e[s]=r,t[s]=a}function cu(e,t,n){return Math.max(e,Math.min(t,n))}function U8(e){return e%2==0?e:e+1}function j8(e){let t=0;for(let n=0;nn+` Shapes ${e} and ${t} must match`)}function as(e){M(e!=null,()=>"The input to the tensor constructor must be a non-null value.")}function ss(e,t=[],n=!1){if(t==null&&(t=[]),Array.isArray(e)||rn(e)&&!n)for(let r=0;r0,n){return new Promise((r,a)=>{let s=0,i=()=>{if(e()){r();return}s++;let o=t(s);if(n!=null&&s>=n){a();return}setTimeout(i,o)};i()})}function J8(e,t){let n=1,r=-1;for(let s=0;s=0)n*=e[s];else if(e[s]===-1){if(r!==-1)throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${r} and dim ${s}`);r=s}else if(e[s]<0)throw Error(`Shapes can not be < 0. Found ${e[s]} at dim ${s}`);if(r===-1){if(t>0&&t!==n)throw Error(`Size(${t}) must match the product of shape ${e}`);return e}if(n===0)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}`);let a=e.slice();return a[r]=t/n,a}function er(e,t){let n=t.length;return e=e==null?t.map((r,a)=>a):[].concat(e),M(e.every(r=>r>=-n&&r`All values in axis param must be in range [-${n}, ${n}) but got axis ${e}`),M(e.every(r=>Vt(r)),()=>`All values in axis param must be integers but got axis ${e}`),e.map(r=>r<0?n+r:r)}function jg(e,t){let n=[],r=[],a=t!=null&&Array.isArray(t)&&t.length===0,s=t==null||a?null:er(t,e).sort(),i=0;for(let o=0;oo)&&e[o]===1&&(n.push(e[o]),r.push(o)),s[i]<=o&&i++}e[o]!==1&&(n.push(e[o]),r.push(o))}return{newShape:n,keptDims:r}}function Hg(e,t){let n=null;if(e==null||e==="float32")n=new Float32Array(t);else if(e==="int32")n=new Int32Array(t);else if(e==="bool")n=new Uint8Array(t);else throw new Error(`Unknown data type ${e}`);return n}function Gg(e,t){let n=null;if(e==null||e==="float32")n=new Float32Array(t);else if(e==="int32")n=new Int32Array(t);else if(e==="bool")n=new Uint8Array(t);else if(e==="string")n=new Array(t);else throw new Error(`Unknown data type ${e}`);return n}function qg(e,t){for(let n=0;nt+=n.length),t}function ba(e){return typeof e=="string"||e instanceof String}function Zg(e){return typeof e=="boolean"}function Yg(e){return typeof e=="number"}function bh(e){return Array.isArray(e)?bh(e[0]):e instanceof Float32Array?"float32":e instanceof Int32Array||e instanceof Uint8Array?"int32":Yg(e)?"float32":ba(e)?"string":Zg(e)?"bool":"float32"}function _a(e){return!!(e&&e.constructor&&e.call&&e.apply)}function _h(e,t){for(let n=t;n=0;--r)n[r]=n[r+1]*e[r+1];return n}function Jg(e,t,n){let r=new Array;if(t.length===1){let a=t[0];for(let s=0;so*l);for(let o=0;or*a);if(n===0)return[];if(n!==t.length)throw new Error(`[${e}] does not match the input size ${t.length}.`);return Jg(0,e,t)}function sf(e,t){let n=vh(e,t);for(let r=0;rr*a,1);if(t==null||t==="float32")return Zi(e,new Float32Array(n));if(t==="int32")return Zi(e,new Int32Array(n));if(t==="bool")return Zi(e,new Uint8Array(n));throw new Error(`Unknown data type ${t}`)}function of(e){e.forEach(t=>{M(Number.isInteger(t)&&t>=0,()=>`Tensor must have a shape comprised of positive integers but got shape [${e}].`)})}function tk(e,t,n){if(t===0)return 0;if(t===1)return e[0];let r=e[e.length-1];for(let a=0;a{let[n,r]=t.split(":");this.urlFlags[n]=ak(n,r)})}};function rk(e){let t={};return e.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g,(n,...r)=>(sk(t,r[0],r[1]),r.join("="))),t}function sk(e,t,n){e[decodeURIComponent(t)]=decodeURIComponent(n||"")}function ak(e,t){if(t=t.toLowerCase(),t==="true"||t==="false")return t==="true";if(`${+t}`===t)return+t;throw new Error(`Could not parse value flag value ${t} for flag ${e}.`)}function J(){return fr}var fr=null;function ik(e){fr=e}var uf;function t5(){if(uf==null){let e;if(typeof window!="undefined")e=window;else if(typeof global!="undefined")e=global;else if(typeof process!="undefined")e=process;else if(typeof self!="undefined")e=self;else throw new Error("Could not find a global object");uf=e}return uf}function ok(){let e=t5();return e._tfGlobals==null&&(e._tfGlobals=new Map),e._tfGlobals}function cf(e,t){let n=ok();if(n.has(e))return n.get(e);{let r=t();return n.set(e,r),n.get(e)}}var Yi="Abs",Ji="Acos",Qi="Acosh",va="Add",is="AddN",kh="All",Ih="Any",os="ArgMax",du="ArgMin",eo="Asin",to="Asinh",no="Atan",ro="Atanh",ao="Atan2",ls="AvgPool",Nh="AvgPoolGrad",pu="AvgPool3D",Sh="AvgPool3DGrad",us="BatchMatMul",fu="BatchToSpaceND",Th="Bincount",n5="BroadcastTo",cs="Cast",hs="Ceil",ka="ClipByValue",Ch="Complex",mu="ComplexAbs",so="Concat",ds="Conv2D",Eh="Conv2DBackpropFilter",ps="Conv2DBackpropInput",Au="Conv3D",Rh="Conv3DBackpropFilterV2",Mh="Conv3DBackpropInputV2",fs="Cos",io="Cosh",ms="Cumsum",oo="CropAndResize",Fh="DenseBincount",lo="DepthToSpace",As="DepthwiseConv2dNative",$h="DepthwiseConv2dNativeBackpropFilter",Dh="DepthwiseConv2dNativeBackpropInput",Oh="Diag",yu="Dilation2D",zh="Dilation2DBackpropInput",Ph="Dilation2DBackpropFilter",ys="RealDiv",uo="Elu",Lh="EluGrad",co="Erf",ho="Equal",gs="Exp",po="ExpandDims",fo="Expm1",Wh="FFT",gu="Fill",mo="FlipLeftRight",xs="Floor",ws="FloorDiv",bs="FusedBatchNorm",Ao="GatherV2",yo="GatherNd",go="Greater",_s="GreaterEqual",vs="Identity",Bh="IFFT",Vh="Imag",xo="IsFinite",wo="IsInf",bo="IsNan",ks="LeakyRelu",_o="Less",vo="LessEqual",Uh="LinSpace",Is="Log",ko="Log1p",Io="LogicalAnd",xu="LogicalNot",wu="LogicalOr",r5="LogSoftmax",bu="LRN",jh="LRNGrad",Ns="Max",Ss="Maximum",Ts="MaxPool",Hh="MaxPoolGrad",_u="MaxPool3D",Gh="MaxPool3DGrad",qh="MaxPoolWithArgmax",Cs="Mean",Es="Min",Rs="Minimum",vu="MirrorPad",No="Mod",Xh="Multinomial",Ms="Multiply",So="Neg",To="NotEqual",Co="NonMaxSuppressionV3",Eo="NonMaxSuppressionV4",Ro="NonMaxSuppressionV5",Mo="OnesLike",Fs="OneHot",Fo="Pack",$s="PadV2",lk="Pool",Ds="Pow",Os="Prelu",$o="Prod",ku="Range",Kh="Real",Do="Reciprocal",zs="Relu",Oo="Reshape",Iu="ResizeNearestNeighbor",Zh="ResizeNearestNeighborGrad",Ps="ResizeBilinear",Yh="ResizeBilinearGrad",Ls="Relu6",Ws="Reverse",Bs="Round",Vs="Rsqrt",zo="ScatterNd",Po="Select",Lo="Selu",Wo="Slice",Us="Sin",Bo="Sinh",Vo="Sign",js="Sigmoid",Uo="Softplus",Hs="Sqrt",Gs="Sum",Nu="SpaceToBatchND",jo="SplitV",qs="Softmax",Xs="SquaredDifference",Su="Square",Ks="Sub",Jh="SparseToDense",Ho="StridedSlice",Go="Tan",Zs="Tanh",Ia="Tile",qo="TopK",Qh="Transform",Ys="Transpose",ed="Unique",Xo="Unpack",Tu="UnsortedSegmentSum",Ko="ZerosLike",Na="Step",td="FromPixels",Zo="RotateWithOffset",Js="_FusedMatMul",Qs="FusedConv2D",ei="FusedDepthwiseConv2D",Yo=cf("kernelRegistry",()=>new Map),Cu=cf("gradRegistry",()=>new Map);function nd(e,t){let n=hf(e,t);return Yo.get(n)}function df(e){return Cu.get(e)}function Jo(e){let t=Yo.entries(),n=[];for(;;){let{done:r,value:a}=t.next();if(r)break;let[s,i]=a,[o]=s.split("_");o===e&&n.push(i)}return n}function ti(e){let{kernelName:t,backendName:n}=e,r=hf(t,n);Yo.has(r)&&console.warn(`The kernel '${t}' for backend '${n}' is already registered`),Yo.set(r,e)}function a5(e){let{kernelName:t}=e;Cu.has(t)&&J().getBool("DEBUG")&&console.warn(`Overriding the gradient for '${t}'`),Cu.set(t,e)}function uk(e,t){let n=hf(e,t);if(!Yo.has(n))throw new Error(`The kernel '${e}' for backend '${t}' is not registered`);Yo.delete(n)}function ck(e){if(!Cu.has(e))throw new Error(`The gradient '${e}' for backend is not registered`);Cu.delete(e)}function hk(e,t){Jo(e).forEach(n=>{let r=Object.assign({},n,{backendName:t});ti(r)})}function hf(e,t){return`${t}_${e}`}var v={};Oe(v,{arraysEqual:()=>ea,assert:()=>M,assertNonNegativeIntegerDimensions:()=>of,assertNonNull:()=>as,assertShapesMatch:()=>nn,bytesFromStringArray:()=>Kg,bytesPerElement:()=>af,checkConversionForErrors:()=>qg,clamp:()=>cu,computeStrides:()=>Ki,createScalarValue:()=>dk,createShuffledIndices:()=>Z8,decodeString:()=>ad,distSquared:()=>G8,encodeString:()=>Ru,fetch:()=>pk,flatten:()=>ss,getArrayFromDType:()=>Gg,getTypedArrayFromDType:()=>Hg,hasEncodingLoss:()=>Q8,indexToLoc:()=>nk,inferDtype:()=>bh,inferFromImplicitShape:()=>J8,isBoolean:()=>Zg,isFunction:()=>_a,isInt:()=>Vt,isNumber:()=>Yg,isPromise:()=>lf,isScalarShape:()=>q8,isString:()=>ba,isTypedArray:()=>rn,isValidDtype:()=>Xg,locToIndex:()=>tk,makeOnesTypedArray:()=>sf,makeZerosNestedTypedArray:()=>ek,makeZerosTypedArray:()=>vh,nearestDivisor:()=>_h,nearestLargerEven:()=>U8,now:()=>Eu,parseAxisParam:()=>er,randUniform:()=>H8,repeatedTry:()=>Y8,rightPad:()=>hu,shuffle:()=>Ug,shuffleCombo:()=>V8,sizeFromShape:()=>Ft,sizeToSquarishShape:()=>K8,squeezeShape:()=>jg,sum:()=>j8,tanh:()=>X8,toNestedArray:()=>Zi,toTypedArray:()=>rd});function dk(e,t){return t==="string"?Ru(e):rd([e],t)}function fk(e,t){return e instanceof Float32Array&&t==="float32"||e instanceof Int32Array&&t==="int32"||e instanceof Uint8Array&&t==="bool"}function rd(e,t){if(t==="string")throw new Error("Cannot convert a string[] to a TypedArray");if(Array.isArray(e)&&(e=ss(e)),J().getBool("DEBUG")&&qg(e,t),fk(e,t))return e;if(t==null||t==="float32"||t==="complex64")return new Float32Array(e);if(t==="int32")return new Int32Array(e);if(t==="bool"){let n=new Uint8Array(e.length);for(let r=0;r{r=n()},s,i=Eu();if(this.backendTimer.timerAvailable())s=this.backendTimer.time(a);else{a();for(let o of r)o.dataSync();s=Promise.resolve({kernelMs:Eu()-i})}if(J().getBool("CHECK_COMPUTATION_FOR_ERRORS"))for(let o=0;o{mk(c,l.dtype,e)})}return{kernelName:e,outputs:r,inputs:t,timeMs:s.then(o=>o.kernelMs),extraInfo:s.then(o=>o.getExtraProfileInfo!=null?o.getExtraProfileInfo():"")}}logKernelProfile(e){let{kernelName:t,outputs:n,timeMs:r,inputs:a,extraInfo:s}=e;n.forEach(i=>{Promise.all([i.data(),r,s]).then(o=>{this.logger.logKernelProfile(t,i,o[0],o[1],a,o[2])})})}};function mk(e,t,n){if(t!=="float32")return!1;for(let r=0;r0?f:""} `}}console.log(`%c${o} %c${i} %c${l}D ${u} %c${c} %c${h} %c${s}`,"font-weight:bold","color:red","color:blue","color: orange","color: green","color: steelblue")}};function gk(e,t,n){let r={},a={};for(let l=0;lr[m.id]=!0),p=!0,a[c.id]=!0;break}if(p)break}}let s={};s[n.id]=!0;let i={};for(let l=e.length-1;l>=0;l--){let c=e[l],u=c.inputs;for(let h=0;h=0;a--){let s=t[a],i=[];if(s.outputs.forEach(l=>{let c=e[l.id];c!=null?i.push(c):i.push(null)}),s.gradient==null)throw new Error(`Cannot compute gradient: gradient function not found for ${s.kernelName}.`);let o=s.gradient(i);for(let l in s.inputs){if(!(l in o))throw new Error(`Cannot backprop through input ${l}. Available gradients found: ${Object.keys(o)}.`);let c=n(()=>o[l]());if(c.dtype!=="float32")throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input ${l} must have 'float32' dtype, but has '${c.dtype}'`);let u=s.inputs[l];if(!ea(c.shape,u.shape))throw new Error(`Error in gradient for op ${s.kernelName}. The gradient of input '${l}' has shape '${c.shape}', which does not match the shape of the input '${u.shape}'`);if(e[u.id]==null)e[u.id]=c;else{let h=e[u.id];e[u.id]=r(h,c),h.dispose()}}}}var s5=20,Mu=3,pf=7;function bk(e,t,n,r){let a=Ki(t),s=wk(e,t,n,a),i=t.length,o=sd(e,t,n,a,s),l=["Tensor"];return r&&(l.push(` dtype: ${n}`),l.push(` rank: ${i}`),l.push(` shape: [${t}]`),l.push(" values:")),l.push(o.map(c=>" "+c).join(` -`)),l.join(` -`)}function wk(e,t,n,r){let a=Ft(t),s=r[r.length-1],i=new Array(s).fill(0),o=t.length,l=n==="complex64"?$u(e):e;if(o>1)for(let c=0;cs5){let A=Mu*i,y=Array.from(e.slice(0,A)),g=Array.from(e.slice((o-Mu)*i,o*i));return n==="complex64"&&(y=$u(y),g=$u(g)),["["+y.map((w,b)=>Fu(w,a[b],n)).join(", ")+", ..., "+g.map((w,b)=>Fu(w,a[o-Mu+b],n)).join(", ")+"]"]}let m=n==="complex64"?$u(e):Array.from(e);return["["+m.map((A,y)=>Fu(A,a[y],n)).join(", ")+"]"]}let c=t.slice(1),u=r.slice(1),h=r[0]*i,d=[];if(o>s5){for(let m=0;m`Length of values '${r}' does not match the size inferred by the shape '${this.size}'.`)}if(t==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||Gg(t,this.size),this.strides=Ki(e)}set(e,...t){t.length===0&&(t=[0]),M(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let n=this.locToIndex(t);this.values[n]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let r of e){if(r<0||r>=this.shape[t]){let a=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(a)}t++}let n=e[e.length-1];for(let r=0;rad(n))}catch(n){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();let e=Cr().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>ad(t))}catch(t){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();let e=await Cr().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(Cr().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return Qo.print(this,e)}clone(){return this.throwIfDisposed(),Qo.clone(this)}toString(e=!1){let t=this.dataSync();return bk(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Qo.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),Cr().makeVariable(this,e,t,n)}};Object.defineProperty(Ve,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function Z(){return cf("Tensor",()=>Ve)}Z();var Du=class extends Ve{constructor(e,t,n,r){super(e.shape,e.dtype,e.dataId,r);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(!ea(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);Cr().disposeTensor(this),this.dataId=e.dataId,Cr().incRef(this,null)}dispose(){Cr().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(Du,Symbol.hasInstance,{value:e=>e instanceof Ve&&e.assign!=null&&e.assign instanceof Function});var mr={};Oe(mr,{assertTypesMatch:()=>o5,getTensorsInContainer:()=>ff,isTensorInList:()=>Nk,makeTypesMatch:()=>bt});var mf;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(mf||(mf={}));var Af;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(Af||(Af={}));var yf;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(yf||(yf={}));var gf;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(gf||(gf={}));var xf;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(xf||(xf={}));var Sk={float32:gf,int32:Af,bool:yf,complex64:xf};function tr(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return Sk[e][t]}function id(e){return tr(e,"int32")}function bt(e,t){if(e.dtype===t.dtype)return[e,t];let n=tr(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function o5(e,t){M(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function Nk(e,t){return t.some(n=>n.id===e.id)}function ff(e){let t=[],n=new Set;return l5(e,t,n),t}function l5(e,t,n){if(e==null)return;if(e instanceof Ve){t.push(e);return}if(!Tk(e))return;let r=e;for(let a in r){let s=r[a];n.has(s)||(n.add(s),l5(s,t,n))}}function Tk(e){return Array.isArray(e)||typeof e=="object"}function wf(e){return e.kernelName!=null}var u5=class{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!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(let e in this.registeredVariables)this.registeredVariables[e].dispose()}},Ou=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new u5}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{e.setupFunc!=null&&e.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){Jo(e).forEach(t=>{t.disposeFunc!=null&&t.disposeFunc(this.registry[e])})}initializeBackend(e){let t=this.registryFactory[e];if(t==null)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{let n=t.factory();if(n&&!(n instanceof uu)&&typeof n.then=="function"){let r=++this.pendingBackendInitId,a=n.then(s=>r(rthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(r),()=>(r=t(),r instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),r))}scopedRun(e,t,n){e();try{let r=n();return t(),r}catch(r){throw t(),r}}nextTensorId(){return Ou.nextTensorId++}nextVariableId(){return Ou.nextVariableId++}clone(e){let t=$.runKernel(vs,{x:e}),n={x:e},r=s=>({x:()=>{let i="float32",o={x:s},l={dtype:i};return $.runKernel(cs,o,l)}}),a=[];return this.addTapeNode(this.state.activeScope.name,n,[t],r,a,{}),t}runKernel(e,t,n){if(nd(e,this.backendName)==null)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){let r=this.backend.numDataIds(),a=0;n.forEach(o=>{a+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=r-t-a-s;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],r=this.isTapeOn(),a=this.state.numBytes,s=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let o,l=wf(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(wf(e)){let{kernelName:p,inputs:f,attrs:m}=e;this.backendName==null&&this.backend;let A=nd(p,this.backendName);M(A!=null,()=>`Cannot find registered kernel '${p}' for backend '${this.backendName}'`),i=()=>{let y=this.backend.numDataIds();o=A.kernelFunc({inputs:f,attrs:m,backend:this.backend});let g=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,y,g);let w=g.map(b=>{if(b.rank!=null)return b;let{dataId:_,shape:x,dtype:N}=b;return this.makeTensorFromDataId(_,x,N)});if(r){let b=this.getTensorsForGradient(p,f,w);n=this.saveTensorsForBackwardMode(b)}return w}}else{let{forwardFunc:p}=e,f=m=>{!r||(n=m.map(A=>this.keep(this.clone(A))))};i=()=>{let m=this.backend.numDataIds();o=this.tidy(()=>p(this.backend,f));let A=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,m,A),A}}let{inputs:c,attrs:u}=e,h=wf(e)?null:e.backwardsFunc,d;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(d=this.profiler.profileKernel(l,c,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(d),t=d.outputs)}),r&&this.addTapeNode(l,c,t,h,n,u),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-a,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(c).map(p=>c[p]!=null?c[p].shape:null),outputShapes:t.map(p=>p.shape),kernelTimeMs:d.timeMs,extraInfo:d.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,n){let r=df(e);if(r!=null){let a=r.inputsToSave||[],s=r.outputsToSave||[],i;r.saveAllInputs?(M(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),i=Object.keys(t).map(l=>t[l])):i=a.map(l=>t[l]);let o=n.filter((l,c)=>s[c]);return i.concat(o)}return[]}makeTensor(e,t,n,r){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",r=r||this.backend;let a=e;n==="string"&&ba(e[0])&&(a=e.map(o=>Ru(o)));let s=r.write(a,t,n),i=new Ve(t,n,s,this.nextTensorId());if(this.trackTensor(i,r),n==="string"){let o=this.state.tensorInfo.get(s),l=Kg(a);this.state.numBytes+=l-o.bytes,o.bytes=l}return i}makeTensorFromDataId(e,t,n,r){n=n||"float32";let a=new Ve(t,n,e,this.nextTensorId());return this.trackTensor(a,r),a}makeVariable(e,t=!0,n,r){n=n||this.nextVariableId().toString(),r!=null&&r!==e.dtype&&(e=e.cast(r));let a=new Du(e,t,n,this.nextTensorId());if(this.state.registeredVariables[a.name]!=null)throw new Error(`Variable with name ${a.name} was already registered`);return this.state.registeredVariables[a.name]=a,this.incRef(a,this.backend),a}trackTensor(e,t){this.state.numTensors++,e.dtype==="string"&&this.state.numStringTensors++;let n=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(n=e.size*af(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 Du||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;let t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,e.dtype==="string"&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),e.dtype!=="complex64"&&e.dtype!=="string"){let n=e.size*af(e.dtype);this.state.numBytes-=n}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(let e in this.state.registeredVariables){let t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),this.state.registeredVariables[e.name]!=null&&delete this.state.registeredVariables[e.name]}memory(){let 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,e.reasons==null&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;let 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(r=>r.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let r of this.state.activeProfile.kernels)r.kernelTimeMs=await r.kernelTimeMs,r.extraInfo=await r.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,r,a,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:a},o=df(e);o!=null&&(r=o.gradFunc),r!=null&&(i.gradient=l=>(l=l.map((c,u)=>{if(c==null){let h=n[u],d=vh(h.size,h.dtype);return this.makeTensor(d,h.shape,h.dtype)}return c}),r(l.length>1?l:l[0],a,s))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){let t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){let t=ff(e),n=new Set(t.map(a=>a.id));for(let a=0;a{!a.kept&&a.scopeId===r.id&&this.track(a)})}gradients(e,t,n,r=!1){if(M(t.length>0,()=>"gradients() received an empty list of xs."),n!=null&&n.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);let a=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));M(a instanceof Ve,()=>"The result y returned by f() must be a tensor.");let s=gk(this.state.activeTape,t,a);if(!r&&s.length===0&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{let i={};i[a.id]=n==null?Ck(a.shape):n,xk(i,s,l=>this.tidy(l),Ek);let o=t.map(l=>i[l.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(l=>{for(let c of l.saved)c.dispose()}),this.state.activeTape=null),{value:a,grads:o}})}customGrad(e){return M(_a(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{M(t.every(i=>i instanceof Ve),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,r={};t.forEach((i,o)=>{r[o]=i});let a=(i,o)=>(n=e(...t,o),M(n.value instanceof Ve,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),M(_a(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),s=(i,o)=>{let l=n.gradFunc(i,o),c=Array.isArray(l)?l:[l];M(c.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(...)."),M(c.every(h=>h instanceof Ve),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");let u={};return c.forEach((h,d)=>{u[d]=()=>h}),u};return this.runKernelFunc({forwardFunc:a,backwardsFunc:s,inputs:r})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){let t=Eu(),n=await this.backend.time(e);return n.wallMs=Eu()-t,n}track(e){return this.state.activeScope!=null&&(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 u5;for(let e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}};Ou.nextTensorId=0;Ou.nextVariableId=0;function Ck(e){let t=sf(Ft(e),"float32");return $.makeTensor(t,e,"float32")}function c5(){let e=t5();if(e._tfengine==null){let t=new e5(e);e._tfengine=new Ou(t)}return ik(e._tfengine.ENV),vk(()=>e._tfengine),e._tfengine}var $=c5();function Ek(e,t){let n={a:e,b:t};return $.runKernel(va,n)}var zu={};Oe(zu,{isBrowser:()=>h5,isMobile:()=>Rk});function Mk(){return typeof navigator!="undefined"&&navigator!=null}function Rk(){if(Mk()){let e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/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(e.substr(0,4))}return!1}function h5(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var Ar=J();Ar.registerFlag("DEBUG",()=>!1,e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});Ar.registerFlag("IS_BROWSER",()=>h5());Ar.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");Ar.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));Ar.registerFlag("PROD",()=>!1);Ar.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>Ar.getBool("DEBUG"));Ar.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);Ar.registerFlag("IS_TEST",()=>!1);Ar.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);Ar.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Er(e,t){let n=e;if(rn(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let r=[];for(;Array.isArray(n)||rn(n)&&t!=="string";)r.push(n.length),n=n[0];return Array.isArray(e)&&J().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&d5(e,r,[]),r}function d5(e,t,n){if(n=n||[],!Array.isArray(e)&&!rn(e)){M(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}M(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),M(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let r=t.slice(1);for(let a=0;a=0&&(a=r),p5(r,a,t,n),e==null||!rn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let o=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Er(e,a);!rn(e)&&!Array.isArray(e)&&(e=[e]);let i=a!=="string"?rd(e,a):ss(e,[],!0);return $.makeTensor(i,s,a)}function Pu(e,t,n,r="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((a,s)=>E(a,`${t}[${s}]`,n,r))}var f5="__op";function O(e){let t=Object.keys(e);if(t.length!==1)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],r=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+f5;let a=(...s)=>{$.startScope(n);try{let i=r(...s);return lf(i)&&console.error("Cannot return a Promise inside of tidy."),$.endScope(i),i}catch(i){throw $.endScope(null),i}};return Object.defineProperty(a,"name",{value:n,configurable:!0}),a}function Fk(e,t){let n=E(e,"real","complex"),r=E(t,"imag","complex");nn(n.shape,r.shape,`real and imag shapes, ${n.shape} and ${r.shape}, must match in call to tf.complex().`);let a={real:n,imag:r};return $.runKernel(Ch,a)}var Sa=O({complex_:Fk});function Ta(e,t,n,r){if(r==null&&(r=bh(e)),r==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!rn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(t!=null){of(t);let a=Ft(t),s=Ft(n);M(a===s,()=>`Based on the provided shape, [${t}], the tensor should have ${a} values but has ${s}`);for(let i=0;i`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!rn(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=r!=="string"?rd(e,r):ss(e,[],!0),$.makeTensor(e,t,r)}function yr(e,t,n){let r=Er(e,n);return Ta(e,t,r,n)}var bf={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},od=4;async function Dk(e,t){let n=[],r=[],a=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let d=await l.bytes(),p=d.reduce((A,y)=>A+y.length,0)+od*d.length,f=new Uint8Array(p),m=0;for(let A=0;A{if(t+=s.byteLength,n.push(s.byteLength===s.buffer.byteLength?s:new s.constructor(s)),!(s instanceof Float32Array||s instanceof Int32Array||s instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${s.constructor.name}`)});let r=new Uint8Array(t),a=0;return n.forEach(s=>{r.set(new Uint8Array(s.buffer),a),a+=s.byteLength}),r.buffer}var _f=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function A5(e){return _f?Buffer.byteLength(e):new Blob([e]).size}function zk(e){if(_f)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let r=0,a=t.length;r{t+=a.byteLength});let n=new Uint8Array(t),r=0;return e.forEach(a=>{n.set(new Uint8Array(a),r),r+=a.byteLength}),n.buffer}function y5(e){let t="/";for(e=e.trim();e.endsWith(t);)e=e.slice(0,e.length-1);let n=e.split(t);return n[n.length-1]}function Lu(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:e.modelTopology==null?0:A5(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:A5(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function Lk(){let e=n=>{let r=n<<13,a=0;for(;(r&8388608)==0;)a-=8388608,r<<=1;return r&=~8388608,a+=947912704,r|a},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let n=1024;n<2048;n++)t[n]=939524096+(n-1024<<13);return t}function Wk(){let 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}function Bk(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function Ok(){let e=Lk(),t=Wk(),n=Bk();return r=>{let a=new ArrayBuffer(4*r.length),s=new Uint32Array(a);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=l}return new Float32Array(a)}}var Nt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Nt.instance==null&&(Nt.instance=new Nt),Nt.instance}static registerSaveRouter(e){Nt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Nt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Nt.getHandlers(e,"save")}static getLoadHandlers(e,t){return Nt.getHandlers(e,"load",t)}static getHandlers(e,t,n){let r=[];return(t==="load"?Nt.getInstance().loadRouters:Nt.getInstance().saveRouters).forEach(a=>{let s=a(e,n);s!==null&&r.push(s)}),r}},Vk=e=>Nt.registerSaveRouter(e),Uk=e=>Nt.registerLoadRouter(e),jk=e=>Nt.getSaveHandlers(e),Hk=(e,t)=>Nt.getLoadHandlers(e,t),kf="tensorflowjs",If=1,ni="models_store",Ca="model_info_store";function g5(){if(!J().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");let e=typeof window=="undefined"?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(t==null)throw new Error("The current browser does not appear to support IndexedDB.");return t}function Nf(e){let t=e.result;t.createObjectStore(ni,{keyPath:"modelPath"}),t.createObjectStore(Ca,{keyPath:"modelPath"})}var ri=class{constructor(e){if(this.indexedDB=g5(),e==null||!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((n,r)=>{let a=this.indexedDB.open(kf,If);a.onupgradeneeded=()=>Nf(a),a.onsuccess=()=>{let s=a.result;if(t==null){let i=s.transaction(ni,"readonly"),o=i.objectStore(ni).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),r(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(o.result.modelArtifacts)},o.onerror=l=>(s.close(),r(o.error)),i.oncomplete=()=>s.close()}else{let i=Lu(t),o=s.transaction(Ca,"readwrite"),l=o.objectStore(Ca),c=l.put({modelPath:this.modelPath,modelArtifactsInfo:i}),u;c.onsuccess=()=>{u=s.transaction(ni,"readwrite");let h=u.objectStore(ni).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});h.onsuccess=()=>n({modelArtifactsInfo:i}),h.onerror=d=>{l=o.objectStore(Ca);let p=l.delete(this.modelPath);p.onsuccess=()=>(s.close(),r(h.error)),p.onerror=f=>(s.close(),r(h.error))}},c.onerror=h=>(s.close(),r(c.error)),o.oncomplete=()=>{u==null?s.close():u.oncomplete=()=>s.close()}}},a.onerror=s=>r(a.error)})}};ri.URL_SCHEME="indexeddb://";var x5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ri.URL_SCHEME)?Gk(e.slice(ri.URL_SCHEME.length)):null;Nt.registerSaveRouter(x5);Nt.registerLoadRouter(x5);function Gk(e){return new ri(e)}function qk(e){return e.startsWith(ri.URL_SCHEME)?e.slice(ri.URL_SCHEME.length):e}var Xk=class{constructor(){this.indexedDB=g5()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(kf,If);n.onupgradeneeded=()=>Nf(n),n.onsuccess=()=>{let r=n.result,a=r.transaction(Ca,"readonly"),s=a.objectStore(Ca).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(r.close(),t(s.error)),a.oncomplete=()=>r.close()},n.onerror=r=>t(n.error)})}async removeModel(e){return e=qk(e),new Promise((t,n)=>{let r=this.indexedDB.open(kf,If);r.onupgradeneeded=()=>Nf(r),r.onsuccess=()=>{let a=r.result,s=a.transaction(Ca,"readwrite"),i=s.objectStore(Ca),o=i.get(e),l;o.onsuccess=()=>{if(o.result==null)return a.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let c=i.delete(e),u=()=>{l=a.transaction(ni,"readwrite");let h=l.objectStore(ni).delete(e);h.onsuccess=()=>t(o.result.modelArtifactsInfo),h.onerror=d=>n(o.error)};c.onsuccess=u,c.onerror=h=>(u(),a.close(),n(o.error))}},o.onerror=c=>(a.close(),n(o.error)),s.oncomplete=()=>{l==null?a.close():l.oncomplete=()=>a.close()}},r.onerror=a=>n(r.error)})}},ta="/",el="tensorflowjs_models",w5="info",Kk="model_topology",Zk="weight_specs",Yk="weight_data",Jk="model_metadata";function b5(e){return{info:[el,e,w5].join(ta),topology:[el,e,Kk].join(ta),weightSpecs:[el,e,Zk].join(ta),weightData:[el,e,Yk].join(ta),modelMetadata:[el,e,Jk].join(ta)}}function Qk(e){let t=e.split(ta);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(ta)}function e9(e){return e.startsWith(ai.URL_SCHEME)?e.slice(ai.URL_SCHEME.length):e}var ai=class{constructor(e){if(!J().getBool("IS_BROWSER")||typeof window=="undefined"||typeof window.localStorage=="undefined")throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,e==null||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=b5(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.");{let t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),r=Lu(e);try{this.LS.setItem(this.keys.info,JSON.stringify(r)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,zk(e.weightData));let a={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};return e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),this.LS.setItem(this.keys.modelMetadata,JSON.stringify(a)),{modelArtifactsInfo:r}}catch(a){throw this.LS.removeItem(this.keys.info),this.LS.removeItem(this.keys.topology),this.LS.removeItem(this.keys.weightSpecs),this.LS.removeItem(this.keys.weightData),this.LS.removeItem(this.keys.modelMetadata),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${r.modelTopologyBytes}, weightSpecsBytes=${r.weightSpecsBytes}, weightDataBytes=${r.weightDataBytes}.`)}}}async load(){let e=JSON.parse(this.LS.getItem(this.keys.info));if(e==null)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if(e.modelTopologyType!=="JSON")throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");let t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(n==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;let r=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(r==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=r;let a=this.LS.getItem(this.keys.modelMetadata);if(a!=null){let i=JSON.parse(a);t.format=i.format,t.generatedBy=i.generatedBy,t.convertedBy=i.convertedBy,i.signature!=null&&(t.signature=i.signature),i.userDefinedMetadata!=null&&(t.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(t.modelInitializer=i.modelInitializer)}let s=this.LS.getItem(this.keys.weightData);if(s==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=Pk(s),t}};ai.URL_SCHEME="localstorage://";var _5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ai.URL_SCHEME)?t9(e.slice(ai.URL_SCHEME.length)):null;Nt.registerSaveRouter(_5);Nt.registerLoadRouter(_5);function t9(e){return new ai(e)}var n9=class{constructor(){M(J().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),M(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=el+ta,n=ta+w5;for(let r=0;r"scheme must not be undefined or null."),e.endsWith(tl)&&(e=e.slice(0,e.indexOf(tl))),M(e.length>0,()=>"scheme must not be an empty string.");let n=Hn.getInstance();M(n.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),n.managers[e]=t}static getManager(e){let t=this.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}};function ld(e){if(e.indexOf(tl)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Hn.getSchemes().join(",")}`);return{scheme:e.split(tl)[0],path:e.split(tl)[1]}}async function v5(e,t,n=!1){M(e!==t,()=>`Old path and new path are the same: '${e}'`);let r=Nt.getLoadHandlers(e);M(r.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),M(r.length<2,()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`);let a=r[0],s=Nt.getSaveHandlers(t);M(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),M(s.length<2,()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`);let i=s[0],o=ld(e).scheme,l=ld(e).path,c=o===ld(e).scheme,u=await a.load();n&&c&&await Hn.getManager(o).removeModel(l);let h=await i.save(u);return n&&!c&&await Hn.getManager(o).removeModel(l),h.modelArtifactsInfo}async function r9(){let e=Hn.getSchemes(),t={};for(let n of e){let r=await Hn.getManager(n).listModels();for(let a in r){let s=n+tl+a;t[s]=r[a]}}return t}async function a9(e){let t=ld(e);return Hn.getManager(t.scheme).removeModel(t.path)}async function s9(e,t){return v5(e,t,!1)}async function i9(e,t){return v5(e,t,!0)}var o9=class{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return this.textEncoder==null&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}};if(J().get("IS_BROWSER")){J().setPlatform("browser",new o9);try{Hn.registerManager(ai.URL_SCHEME,new n9)}catch(e){}try{Hn.registerManager(ri.URL_SCHEME,new Xk)}catch(e){}}var l9={importFetch:()=>m8()},Sf,u9=class{constructor(){this.util=require("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return J().global.fetch!=null?J().global.fetch(e,t):(Sf==null&&(Sf=l9.importFetch()),Sf(e,t))}now(){let e=process.hrtime();return e[0]*1e3+e[1]/1e6}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return e.length===0?"":new this.util.TextDecoder(t).decode(e)}};J().get("IS_NODE")&&J().setPlatform("node",new u9);function We(e,t="float32",n){return t=t||"float32",of(e),new $t(e,t,n)}function c9(e,t){let n=E(e,"x","cast");if(!Xg(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if(t==="string"&&n.dtype!=="string"||t!=="string"&&n.dtype==="string")throw new Error("Only strings can be casted to strings");let r={x:n},a={dtype:t};return $.runKernel(cs,r,a)}var ye=O({cast_:c9});function h9(e){let t={x:E(e,"x","clone","string_or_numeric")};return $.runKernel(vs,t)}var Rr=O({clone_:h9});function k5(e,t=!1){console.log(e.toString(t))}c5();var d9={buffer:We,cast:ye,clone:Rr,print:k5};kk(d9);var wn={};Oe(wn,{browserFiles:()=>p9,browserHTTPRequest:()=>m9,concatenateArrayBuffers:()=>vf,copyModel:()=>s9,decodeWeights:()=>m5,encodeWeights:()=>Dk,fromMemory:()=>A9,getLoadHandlers:()=>Hk,getModelArtifactsInfoForJSON:()=>Lu,getSaveHandlers:()=>jk,http:()=>Cf,isHTTPScheme:()=>Tf,listModels:()=>r9,loadWeights:()=>f9,moveModel:()=>i9,registerLoadRouter:()=>Uk,registerSaveRouter:()=>Vk,removeModel:()=>a9,weightsLoaderFactory:()=>I5,withSaveHandler:()=>y9});var g9="model",x9=".json",w9=".weights.bin";function N5(e){return new Promise(t=>setTimeout(t)).then(e)}var nl=class{constructor(e){if(!J().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(nl.URL_SCHEME)&&(e=e.slice(nl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=g9),this.modelTopologyFileName=e+x9,this.weightDataFileName=e+w9}async save(e){if(typeof document=="undefined")throw new Error("Browser downloads are not supported in this environment since `document` is not present");let t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{let n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer);let a=window.URL.createObjectURL(new Blob([JSON.stringify(r)],{type:"application/json"})),s=this.jsonAnchor==null?document.createElement("a"):this.jsonAnchor;if(s.download=this.modelTopologyFileName,s.href=a,await N5(()=>s.dispatchEvent(new MouseEvent("click"))),e.weightData!=null){let i=this.weightDataAnchor==null?document.createElement("a"):this.weightDataAnchor;i.download=this.weightDataFileName,i.href=t,await N5(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:Lu(e)}}}};nl.URL_SCHEME="downloads://";var b9=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.files=e}async load(){let e=this.files[0],t=this.files.slice(1);return new Promise((n,r)=>{let a=new FileReader;a.onload=s=>{let i=JSON.parse(s.target.result),o=i.modelTopology;if(o==null){r(new Error(`modelTopology field is missing from file ${e.name}`));return}t.length===0&&n({modelTopology:o});let l=i.weightsManifest;if(l==null){r(new Error(`weightManifest field is missing from file ${e.name}`));return}let c;try{c=this.checkManifestAndWeightFiles(l,t)}catch(p){r(p);return}let u=[],h=[],d=[];l.forEach(p=>{p.paths.forEach(f=>{h.push(f),d.push(null)}),u.push(...p.weights)}),l.forEach(p=>{p.paths.forEach(f=>{let m=new FileReader;m.onload=A=>{let y=A.target.result,g=h.indexOf(f);if(d[g]=y,d.indexOf(null)===-1){let w={modelTopology:o,weightSpecs:u,weightData:vf(d),format:i.format,generatedBy:i.generatedBy,convertedBy:i.convertedBy};i.signature!=null&&(w.signature=i.signature),i.userDefinedMetadata!=null&&(w.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(w.modelInitializer=i.modelInitializer),n(w)}},m.onerror=A=>r(`Failed to weights data from file of path '${f}'.`),m.readAsArrayBuffer(c[f])})})},a.onerror=s=>r(`Failed to read model topology and weights manifest JSON from file '${e.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),a.readAsText(e)})}checkManifestAndWeightFiles(e,t){let n=[],r=t.map(s=>y5(s.name)),a={};for(let s of e)s.paths.forEach(i=>{let o=y5(i);if(n.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(n.push(o),r.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);a[i]=t[r.indexOf(o)]});if(n.length!==t.length)throw new Error(`Mismatch in the number of files in weights manifest (${n.length}) and the number of weight files provided (${t.length}).`);return a}},v9=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(nl.URL_SCHEME)?_9(e.slice(nl.URL_SCHEME.length)):null;Nt.registerSaveRouter(v9);function _9(e="model"){return new nl(e)}function p9(e){return new b9(e)}function S5(e,t,n,r){i(e),n=n==null?0:n,r=r==null?1:r,o(n,r);let a=0,s=l=>(l.then(c=>{let u=n+ ++a/e.length*(r-n);return t(u),c}),l);function i(l){M(l!=null&&Array.isArray(l)&&l.length>0,()=>"promises must be a none empty array")}function o(l,c){M(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${l}`),M(c>=0&&c<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${c}`),M(c>=l,()=>`startFraction must be no more than endFraction, but got startFraction ${l} and endFraction ${c}`)}return Promise.all(e.map(s))}async function T5(e,t){t==null&&(t={});let n=t.fetchFunc==null?J().platform.fetch:t.fetchFunc,r=e.map(c=>n(c,t.requestInit,{isBinary:!0})),a=0,s=.5,i=(t.onProgress==null?await Promise.all(r):await S5(r,t.onProgress,a,s)).map(c=>c.arrayBuffer()),o=.5,l=1;return t.onProgress==null?await Promise.all(i):await S5(i,t.onProgress,o,l)}async function f9(e,t="",n,r){return I5(a=>T5(a,{requestInit:r}))(e,t,n)}function I5(e){return async(t,n="",r)=>{let a=t.map(()=>!1),s={},i=r!=null?r.map(()=>!1):[],o=[];if(t.forEach((p,f)=>{let m=0;p.weights.forEach(A=>{let y="quantization"in A?A.quantization.dtype:A.dtype,g=bf[y]*Ft(A.shape),w=()=>{a[f]=!0,s[f]==null&&(s[f]=[]),s[f].push({manifestEntry:A,groupOffset:m,sizeBytes:g})};r!=null?r.forEach((b,_)=>{b===A.name&&(w(),i[_]=!0)}):w(),o.push(A.name),m+=g})}),!i.every(p=>p)){let p=r.filter((f,m)=>!i[m]);throw new Error(`Could not find weights in manifest with names: ${p.join(", ")}. -Manifest JSON has weights with names: ${o.join(", ")}.`)}let l=a.reduce((p,f,m)=>(f&&p.push(m),p),[]),c=[];l.forEach(p=>{t[p].paths.forEach(f=>{let m=n+(n.endsWith("/")?"":"/")+f;c.push(m)})});let u=await e(c),h={},d=0;return l.forEach(p=>{let f=t[p].paths.length,m=0;for(let w=0;w{let b=A.slice(w.groupOffset,w.groupOffset+w.sizeBytes),_=m5(b,[w.manifestEntry]);for(let x in _)h[x]=_[x]}),d+=f}),h}}var k9="application/octet-stream",I9="application/json",Ef=class{constructor(e,t){if(this.DEFAULT_METHOD="POST",t==null&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,t.fetchFunc!=null?(M(typeof t.fetchFunc=="function",()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"),this.fetch=t.fetchFunc):this.fetch=J().platform.fetch,M(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&M(e.length===2,()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`),this.path=e,t.requestInit!=null&&t.requestInit.body!=null)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");let t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;let n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer),t.body.append("model.json",new Blob([JSON.stringify(r)],{type:I9}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:k9}),"model.weights.bin");let a=await this.fetch(this.path,t);if(a.ok)return{modelArtifactsInfo:Lu(e),responses:[a]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${a.status}.`)}async load(){let 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(p){let f=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?f+=" 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.":f+=" Please make sure the server is serving valid JSON for this request.",new Error(f)}let n=t.modelTopology,r=t.weightsManifest,a=t.generatedBy,s=t.convertedBy,i=t.format,o=t.signature,l=t.userDefinedMetadata;if(n==null&&r==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);let c,u;r!=null&&([c,u]=await this.loadWeights(r));let h={modelTopology:n,weightSpecs:c,weightData:u,generatedBy:a,convertedBy:s,format:i};o!=null&&(h.signature=o),l!=null&&(h.userDefinedMetadata=l);let d=t.modelInitializer;return d&&(h.modelInitializer=d),h}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,r]=N9(t),a=this.weightPathPrefix||n,s=[];for(let c of e)s.push(...c.weights);let i=[],o=[];for(let c of e)for(let u of c.paths)this.weightUrlConverter!=null?o.push(this.weightUrlConverter(u)):i.push(a+u+r);this.weightUrlConverter&&i.push(...await Promise.all(o));let l=await T5(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,vf(l)]}};Ef.URL_SCHEME_REGEX=/^https?:\/\//;function N9(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),r=e.substring(0,t),a=n>t?e.substring(n):"";return[r+"/",a]}function Tf(e){return e.match(Ef.URL_SCHEME_REGEX)!=null}var C5=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(r=>Tf(r)):n=Tf(e),n)return Cf(e,t)}return null};Nt.registerSaveRouter(C5);Nt.registerLoadRouter(C5);function Cf(e,t){return new Ef(e,t)}function m9(e,t){return Cf(e,t)}var Rf=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},S9=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function A9(e,t,n,r){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Rf(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Rf({modelTopology:e})):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Rf({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:r}))}function y9(e){return new S9(e)}var E5={};Oe(E5,{confusionMatrix:()=>T9});function C9(e,t,n=!1,r=!1){let a=E(e,"a","matMul"),s=E(t,"b","matMul");[a,s]=bt(a,s);let i={a,b:s},o={transposeA:n,transposeB:r};return $.runKernel(us,i,o)}var Ge=O({matMul_:C9});function E9(e,t,n=1,r=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let a={indices:E(e,"indices","oneHot","int32")},s={depth:t,onValue:n,offValue:r};return $.runKernel(Fs,a,s)}var rl=O({oneHot_:E9});function R9(e,t){let n=E(e,"x","transpose");if(t==null&&(t=n.shape.map((s,i)=>i).reverse()),M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(s=>{M(s>=0&&s`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let r={x:n},a={perm:t};return $.runKernel(Ys,r,a)}var nt=O({transpose_:R9});function M9(e,t,n){let r=E(e,"labels","confusionMatrix"),a=E(t,"predictions","confusionMatrix");M(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),M(r.rank===1,()=>`Expected the rank of labels to be 1, but got ${r.rank}`),M(a.rank===1,()=>`Expected the rank of predictions to be 1, but got ${a.rank}`),M(r.shape[0]===a.shape[0],()=>`Mismatch in the number of examples: ${r.shape[0]} vs. ${a.shape[0]}. Labels and predictions should have the same number of elements.`),M(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let s=rl(ye(r,"int32"),n),i=rl(ye(a,"int32"),n),o=nt(s),l=Ge(o,i);return ye(l,"int32")}var T9=O({confusionMatrix_:M9}),al={};Oe(al,{fromPixels:()=>D9,fromPixelsAsync:()=>F9,toPixels:()=>$9});function ud(e,t,n){if(as(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let r=Er(e,n);if(r.length!==3&&r.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Ta(e,t,r,n)}var sl;function R5(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(e==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,r=!1,a=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)r=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)a=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)s=!0;else if(e.getContext!=null)i=!0;else if(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)o=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);if(a){let d=2;if(a&&e.readyState element.")}if(nd(td,$.backendName)!=null){let d={pixels:e},p={numChannels:t};return $.runKernel(td,d,p)}let[l,c]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height],u;i?u=e.getContext("2d").getImageData(0,0,l,c).data:r||n?u=e.data:(s||a||o)&&(sl==null&&(sl=document.createElement("canvas").getContext("2d")),sl.canvas.width=l,sl.canvas.height=c,sl.drawImage(e,0,0,l,c),u=sl.getImageData(0,0,l,c).data);let h;if(t===4)h=new Int32Array(u);else{let d=l*c;h=new Int32Array(d*t);for(let p=0;p4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let i=await n.data(),o=n.dtype==="float32"?255:1,l=new Uint8ClampedArray(a*r*4);for(let c=0;c1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${p}.`)}else if(n.dtype==="int32"&&(p<0||p>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${p}.`);s===1?(u[0]=p*o,u[1]=p*o,u[2]=p*o):u[d]=p*o}let h=c*4;l[h+0]=Math.round(u[0]),l[h+1]=Math.round(u[1]),l[h+2]=Math.round(u[2]),l[h+3]=Math.round(u[3])}if(t!=null){t.width=a,t.height=r;let c=t.getContext("2d"),u=new ImageData(l,a,r);c.putImageData(u,0,0)}return n!==e&&n.dispose(),l}var D9=O({fromPixels_:R5}),Mf={};Oe(Mf,{prepareAndValidate:()=>M5});function M5(e,t){let n=e.shape.length,r=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(r<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${r}.`);if(t.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[r-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[r-1]} vs. ${n}`);if(Ft(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let a=t.shape,s=a[a.length-1],i=1;for(let h=0;hh/c),1].slice(0,s);return[l,i,c,u]}var Ff={};Oe(Ff,{calculateShapes:()=>F5,validateInput:()=>Df,validateUpdateShape:()=>$f});function $f(e,t,n){let r=t.rank>1?t.shape[t.rank-1]:1,a=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: ${r}, and batchDim: ${a}.`;if(n.rank1?t.shape[r-1]:1,s=n.length,i=1;for(let h=a;hW9,computeFlatOffset:()=>V9,computeOutShape:()=>$5,getNormalizedAxes:()=>O5,isSliceContinous:()=>B9,maskToAxes:()=>cd,parseSliceParams:()=>V5,sliceInfo:()=>U9,startForAxis:()=>W5,startIndicesWithElidedDims:()=>z5,stopForAxis:()=>B5,stopIndicesWithElidedDims:()=>P5,stridesForAxis:()=>L5,stridesWithElidedDims:()=>D5});function W9(e,t,n){let r=e.shape.length;M(r===t.length,()=>`Error in slice${r}D: Length of begin ${t} must match the rank of the array (${r}).`),M(r===n.length,()=>`Error in slice${r}D: Length of size ${n} must match the rank of the array (${r}).`);for(let a=0;a`Error in slice${r}D: begin[${a}] + size[${a}] (${t[a]+n[a]}) would overflow input.shape[${a}] (${e.shape[a]})`)}function cd(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function $5(e,t,n){let r=[];for(let a=0;a0){let p=t[0],f=n+1;u=z5(i,p,f,r,e),h=P5(o,p,f,a,e),d=D5(s,p,f,e)}else for(let p=0;p-1)s[o]=0;else{let l=U5(t,n,o),c=r[l];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let l=U5(t,n,o),c=r[l];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),i=cu(0,i,l-1),i}function B5(e,t,n,r,a,s){let i=t[a],o=n[a]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),o>0?i=cu(0,i,l):i=cu(-1,i,l-1),i}function B9(e,t,n){let r=n.length;for(let a=0;a1){r=a;break}for(let a=r+1;a0||n[a]!==e[a])return!1;return!0}function V9(e,t){let n=e.length>0?e[e.length-1]:1;for(let r=0;r{M(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return n==null?s=new Array(a).fill(-1):typeof n=="number"?s=[n,...new Array(a-1).fill(-1)]:n.lengthi>=0?i:(M(i===-1,()=>`Negative size values should be exactly -1 but got ${i} for the slice() size at index ${o}.`),e.shape[o]-r[o])),[r,s]}function U9(e,t,n,r,a,s,i,o,l){let c=t.slice(),u=n.slice(),h=r;r==null&&(h=new Array(c.length));let d=cd(i);if(d.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(i!==0&&o!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(i!==0&&l!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let p=e.length-c.length,f=cd(o),m=e.slice();f.forEach(x=>{c[x]=0,u[x]=1,m.splice(x,0,1)});let{begin:A,end:y,strides:g}=O5(m,d,p,c,u,h,a,s,i);c=A,u=y,h=g;let w=cd(l);w.forEach(x=>{u[x]=c[x]+1,h[x]=1});let b=$5(c,u,h),_=b.filter((x,N)=>w.indexOf(N)===-1);return{nonStrided:h.every(x=>x===1),$begin:c,$end:u,$strides:h,size:b,newShape:m,outShape:_}}var re={};Oe(re,{Serializable:()=>H5,SerializationMap:()=>si,registerClass:()=>Ea});var H5=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},si=class{constructor(){this.classNameMap={}}static getMap(){return si.instance==null&&(si.instance=new si),si.instance}static register(e){si.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function Ea(e){M(e.className!=null,()=>"Class being registered does not have the static className property defined."),M(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),M(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),si.register(e)}var G5={};Oe(G5,{TEST_EPSILON_FLOAT16:()=>q5,encodeStrings:()=>X5,expectArrayBuffersEqual:()=>K9,expectArraysClose:()=>j9,expectArraysEqual:()=>G9,expectNumbersClose:()=>q9,expectPromiseToFail:()=>H9,expectValuesInRange:()=>X9,testEpsilon:()=>Of});var Z9=.001,q5=.1;function j9(e,t,n){return n==null&&(n=Of()),zf(e,t,(r,a)=>Pf(r,a,n))}function Of(){return $.backend.floatPrecision()===32?Z9:q5}function zf(e,t,n){let r=!0;if((rn(e)||rn(t))&&(r=!1),rn(e)&&rn(t)&&(r=!0),r){let i=e.constructor.name,o=t.constructor.name;if(i!==o)throw new Error(`Arrays are of different type. Actual: ${i}. Expected: ${o}`)}if(Array.isArray(e)&&Array.isArray(t)){let i=Er(e),o=Er(t);if(!ea(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let a=rn(e)?e:ss(e),s=rn(t)?t:ss(t);if(a.length!==s.length)throw new Error(`Arrays have different lengths actual: ${a.length} vs expected: ${s.length}. -Actual: ${a}. -Expected: ${s}.`);for(let i=0;it.fail(),()=>t())}function G9(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return ba(e)||ba(e[0])||ba(t)||ba(t[0])?zf(e,n,(r,a)=>r==a):zf(e,t,(r,a)=>Pf(r,a,0))}function q9(e,t,n){if(n==null&&(n=Of()),!Pf(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function Pf(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function X9(e,t,n){for(let r=0;rn)throw new Error(`Value out of range:${e[r]} low: ${t}, high: ${n}`)}function K9(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function X5(e){for(let t=0;tt.dispose())}function Ut(e){return $.keep(e)}function nI(e){return $.time(e)}function rI(e){return $.setBackend(e)}function aI(){return $.ready()}function sI(){return $.backendName}function iI(e){$.removeBackend(e)}function Wf(e){return $.findBackend(e)}function oI(e){return $.findBackendFactory(e)}function il(e,t,n=1){return $.registerBackend(e,t,n)}function K5(){return $.backend}function lI(e,t){J().setPlatform(e,t)}function uI(e,t){let n=E(e,"a","add"),r=E(t,"b","add");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(va,a)}var se=O({add_:uI});function cI(e,t){let n=E(e,"a","floorDiv"),r=E(t,"b","floorDiv");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ws,a)}var dd=O({floorDiv_:cI});function hI(e,t){let n=E(e,"a","div"),r=E(t,"b","div");if([n,r]=bt(n,r),n.dtype==="int32"&&r.dtype==="int32")return dd(n,r);let a={a:n,b:r},s={};return $.runKernel(ys,a,s)}var me=O({div_:hI});function dI(e,t){let n=E(e,"a","mul"),r=E(t,"b","mul");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ms,a)}var P=O({mul_:dI});function pI(e){let t=E(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return $.runKernel(mu,n)}else{let n={x:t};return $.runKernel(Yi,n)}}var Dt=O({abs_:pI});function fI(e){let t={x:E(e,"x","acos")};return $.runKernel(Ji,t)}var Bf=O({acos_:fI});function mI(e){let t={x:E(e,"x","acosh")};return $.runKernel(Qi,t)}var Vf=O({acosh_:mI});function AI(e){M(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),M(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((a,s)=>E(a,`tensors${s}`,"addN")),n=t[0];t.forEach(a=>{if(a.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(a=>{if(!ea(a.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let r=t;return $.runKernel(is,r)}var Ra=O({addN_:AI});function yI(e,t=null,n=!1){let r={x:E(e,"x","all","bool")},a={axis:t,keepDims:n};return $.runKernel(kh,r,a)}var pd=O({all_:yI});function gI(e,t=null,n=!1){let r={x:E(e,"x","any","bool")},a={axis:t,keepDims:n};return $.runKernel(Ih,r,a)}var Wu=O({any_:gI});function xI(e,t=0){let n={x:E(e,"x","argMax")},r={axis:t};return $.runKernel(os,n,r)}var ii=O({argMax_:xI});function wI(e,t=0){let n={x:E(e,"x","argMin")},r={axis:t};return $.runKernel(du,n,r)}var Uf=O({argMin_:wI});function bI(e){let t={x:E(e,"x","asin")};return $.runKernel(eo,t)}var jf=O({asin_:bI});function _I(e){let t={x:E(e,"x","asinh")};return $.runKernel(to,t)}var Hf=O({asinh_:_I});function vI(e){let t={x:E(e,"x","atan")};return $.runKernel(no,t)}var Gf=O({atan_:vI});function kI(e,t){let n=E(e,"a","atan2"),r=E(t,"b","atan2");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ao,a)}var qf=O({atan2_:kI});function II(e){let t={x:E(e,"x","atanh")};return $.runKernel(ro,t)}var Xf=O({atanh_:II});function NI(e,t,n,r,a="NHWC",s){let i=e[3],o=[...t,i],l=Z5(a);return Bu(e,o,n,s,r,null,null,l)}function Y5(e,t,n,r,a,s,i="channelsLast"){let[o,l]=fd(t),c;if(i==="channelsLast")c=[o,l,e[3],e[3]];else if(i==="channelsFirst")c=[o,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Bu(e,c,n,r,a,s,!1,i)}function SI(e,t,n,r,a,s,i="NDHWC"){let[o,l,c]=Kf(t),u,h;if(i==="NDHWC")h="channelsLast",u=[o,l,c,e[4],e[4]];else if(i==="NCDHW")h="channelsFirst",u=[o,l,c,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return J5(e,u,n,r,a,!1,h,s)}function Bu(e,t,n,r,a,s,i=!1,o="channelsLast"){let[l,c,u,h]=[-1,-1,-1,-1];if(o==="channelsLast")[l,c,u,h]=e;else if(o==="channelsFirst")[l,h,c,u]=e;else throw new Error(`Unknown dataFormat ${o}`);let[d,p,,f]=t,[m,A]=fd(n),[y,g]=fd(r),w=ol(d,y),b=ol(p,g),{padInfo:_,outHeight:x,outWidth:N}=TI(a,c,u,m,A,w,b,s,o),T=i?f*h:f,C;return o==="channelsFirst"?C=[l,T,x,N]:o==="channelsLast"&&(C=[l,x,N,T]),{batchSize:l,dataFormat:o,inHeight:c,inWidth:u,inChannels:h,outHeight:x,outWidth:N,outChannels:T,padInfo:_,strideHeight:m,strideWidth:A,filterHeight:d,filterWidth:p,effectiveFilterHeight:w,effectiveFilterWidth:b,dilationHeight:y,dilationWidth:g,inShape:e,outShape:C,filterShape:t}}function J5(e,t,n,r,a,s=!1,i="channelsLast",o){let[l,c,u,h,d]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[l,c,u,h,d]=e;else if(i==="channelsFirst")[l,d,c,u,h]=e;else throw new Error(`Unknown dataFormat ${i}`);let[p,f,m,,A]=t,[y,g,w]=Kf(n),[b,_,x]=Kf(r),N=ol(p,b),T=ol(f,_),C=ol(m,x),{padInfo:F,outDepth:D,outHeight:L,outWidth:V}=CI(a,c,u,h,y,g,w,N,T,C,o),U=s?A*d:A,j;return i==="channelsFirst"?j=[l,U,D,L,V]:i==="channelsLast"&&(j=[l,D,L,V,U]),{batchSize:l,dataFormat:i,inDepth:c,inHeight:u,inWidth:h,inChannels:d,outDepth:D,outHeight:L,outWidth:V,outChannels:U,padInfo:F,strideDepth:y,strideHeight:g,strideWidth:w,filterDepth:p,filterHeight:f,filterWidth:m,effectiveFilterDepth:N,effectiveFilterHeight:T,effectiveFilterWidth:C,dilationDepth:b,dilationHeight:_,dilationWidth:x,inShape:e,outShape:j,filterShape:t}}function EI(e,t,n,r,a){r==null&&(r=Zf(e,t,n));let s=e[0],i=e[1],o=oi((s-t+2*r)/n+1,a),l=oi((i-t+2*r)/n+1,a);return[o,l]}function RI(e,t,n,r,a,s){a==null&&(a=Zf(e,t,r));let i=e[0],o=e[1],l=e[2],c=oi((i-t+2*a)/r+1,s),u=oi((o-t+2*a)/r+1,s),h=oi((l-t+2*a)/r+1,s);return[c,u,h,n]}function Zf(e,t,n,r=1){let a=ol(t,r);return Math.floor((e[0]*(n-1)-n+a)/2)}function fd(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function Kf(e){return typeof e=="number"?[e,e,e]:e}function ol(e,t){return t<=1?e:e+(e-1)*(t-1)}function TI(e,t,n,r,a,s,i,o,l){let c,u,h;if(typeof e=="number"){c={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let d=EI([t,n],s,r,e,o);u=d[0],h=d[1]}else if(e==="same"){u=Math.ceil(t/r),h=Math.ceil(n/a);let d=Math.max(0,(u-1)*r+s-t),p=Math.max(0,(h-1)*a+i-n),f=Math.floor(d/2),m=d-f,A=Math.floor(p/2),y=p-A;c={top:f,bottom:m,left:A,right:y,type:"SAME"}}else if(e==="valid")c={top:0,bottom:0,left:0,right:0,type:"VALID"},u=Math.ceil((t-s+1)/r),h=Math.ceil((n-i+1)/a);else if(typeof e=="object"){let d=l==="channelsLast"?e[1][0]:e[2][0],p=l==="channelsLast"?e[1][1]:e[2][1],f=l==="channelsLast"?e[2][0]:e[3][0],m=l==="channelsLast"?e[2][1]:e[3][1];c={top:d,bottom:p,left:f,right:m,type:d===0&&p===0&&f===0&&m===0?"VALID":"EXPLICIT"},u=oi((t-s+d+p)/r+1,o),h=oi((n-i+f+m)/a+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:c,outHeight:u,outWidth:h}}function CI(e,t,n,r,a,s,i,o,l,c,u){let h,d,p,f;if(typeof e=="number"){h={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let m=RI([t,n,r,1],o,1,a,e,u);d=m[0],p=m[1],f=m[2]}else if(e==="same"){d=Math.ceil(t/a),p=Math.ceil(n/s),f=Math.ceil(r/i);let m=(d-1)*a+o-t,A=(p-1)*s+l-n,y=(f-1)*i+c-r,g=Math.floor(m/2),w=m-g,b=Math.floor(A/2),_=A-b,x=Math.floor(y/2),N=y-x;h={top:b,bottom:_,left:x,right:N,front:g,back:w,type:"SAME"}}else if(e==="valid")h={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},d=Math.ceil((t-o+1)/a),p=Math.ceil((n-l+1)/s),f=Math.ceil((r-c+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:h,outDepth:d,outHeight:p,outWidth:f}}function oi(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 Ma(e){let[t,n,r]=fd(e);return t===1&&n===1&&r===1}function Fr(e,t){return Ma(e)||Ma(t)}function Z5(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function MI(e,t){let n={x:E(e,"x","reshape","string_or_numeric")},r={shape:t};return $.runKernel(Oo,n,r)}var H=O({reshape_:MI});function FI(e,t,n,r,a){let s=E(e,"x","avgPool","float32"),i=1;M(Fr(n,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`);let o=s,l=!1;s.rank===3&&(l=!0,o=H(s,[1,s.shape[0],s.shape[1],s.shape[2]])),M(o.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${o.rank}.`),a!=null&&M(Vt(r),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(ls,c,u);return h=ye(h,s.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Vu=O({avgPool_:FI});function $I(e,t,n,r,a,s="NDHWC"){let i=E(e,"x","avgPool3d","float32"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(pu,c,u);return h=ye(h,o.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var Yf=O({avgPool3d_:$I});function DI(e,t=0){M(e.length>=1,()=>"Pass at least one tensor to concat");let n=Pu(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${s.dtype}. `)}),n.length===1)return Rr(n[0]);let r=n,a={axis:t};return $.runKernel(so,r,a)}var rt=O({concat_:DI});function OI(e){let t={x:E(e,"x","sigmoid")};return $.runKernel(js,t)}var Rn=O({sigmoid_:OI});function zI(e,t,n){let r=E(e,"x","slice","string_or_numeric");if(r.rank===0)throw new Error("Slicing scalar is not possible");let a={x:r},s={begin:t,size:n};return $.runKernel(Wo,a,s)}var Ee=O({slice_:zI});function PI(e){let t={x:E(e,"x","tanh")};return $.runKernel(Zs,t)}var ll=O({tanh_:PI});function LI(e,t,n,r,a,s){let i=E(e,"forgetBias","basicLSTMCell"),o=E(t,"lstmKernel","basicLSTMCell"),l=E(n,"lstmBias","basicLSTMCell"),c=E(r,"data","basicLSTMCell"),u=E(a,"c","basicLSTMCell"),h=E(s,"h","basicLSTMCell"),d=rt([c,h],1),p=Ge(d,o),f=se(p,l),m=f.shape[0],A=f.shape[1]/4,y=[m,A],g=Ee(f,[0,0],y),w=Ee(f,[0,A],y),b=Ee(f,[0,A*2],y),_=Ee(f,[0,A*3],y),x=se(P(Rn(g),ll(w)),P(u,Rn(se(i,b)))),N=P(ll(x),Rn(_));return[x,N]}var WI=O({basicLSTMCell_:LI});function BI(e,t,n){let r=E(e,"x","batchToSpaceND"),a=t.reduce((o,l)=>o*l);M(r.rank>=1+t.length,()=>`input rank is ${r.rank} but should be > than blockShape.length ${t.length}`),M(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),M(r.shape[0]%a==0,()=>`input tensor batch is ${r.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${a}`);let s={x:r},i={blockShape:t,crops:n};return $.runKernel(fu,s,i)}var Uu=O({batchToSpaceND_:BI});function VI(e){let t;return e.rank===0||e.rank===1?t=H(e,[1,1,1,e.size]):e.rank===2?t=H(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function UI(e,t,n,r,a,s){s==null&&(s=.001);let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;r!=null&&(u=E(r,"offset","batchNorm")),M(o.rank===l.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),M(u==null||o.rank===u.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),M(c==null||o.rank===c.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let h={x:VI(i),scale:c,offset:u,mean:o,variance:l},d={varianceEpsilon:s},p=$.runKernel(bs,h,d);return H(p,i.shape)}var li=O({batchNorm_:UI});function jI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${i.rank}.`),M(o.rank===2||o.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`),M(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${u.rank}.`),li(i,o,l,u,c,s)}var Q5=O({batchNorm2d_:jI});function HI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${i.rank}.`),M(o.rank===3||o.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`),M(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${u.rank}.`),li(i,o,l,u,c,s)}var ex=O({batchNorm3d_:HI});function GI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${i.rank}.`),M(o.rank===4||o.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`),M(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${u.rank}.`),li(i,o,l,u,c,s)}var tx=O({batchNorm4d_:GI});function qI(e,t,n){let r=E(e,"x","bincount"),a=E(t,"weights","bincount");M(r.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${r.dtype}`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(a.size===r.size||a.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${r.shape}, weights shape: ${a.shape}.`);let s={x:r,weights:a},i={size:n};return $.runKernel(Th,s,i)}var nx=O({bincount_:qI});function XI(e,t){let n=E(e,"broadcastTo","x"),r=n.shape;if(t.some(l=>!(l>0)||l%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let l=n.shape.slice();for(;l.length=0;l--)if(a[l]===t[l])s[l]=1;else if(n.shape[l]!==1)throw new Error(`broadcastTo(): [${r}] cannot be broadcast to [${t}].`);if(s.map((l,c)=>l>1?c:-1).filter(l=>l>=0).length===0)return Rr(n);let i={x:n},o={reps:s};return $.runKernel(Ia,i,o)}var ju=O({broadcastTo_:XI});function KI(e){let t={x:E(e,"x","ceil")};return $.runKernel(hs,t)}var Jf=O({ceil_:KI});function ZI(e,t,n){let r=E(e,"x","clipByValue");M(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let a={x:r},s={clipValueMin:t,clipValueMax:n};return $.runKernel(ka,a,s)}var bn=O({clipByValue_:ZI});function YI(e){return rt(e,0)}var rx=O({concat1d_:YI});function JI(e,t){return rt(e,t)}var ul=O({concat2d_:JI});function QI(e,t){return rt(e,t)}var ax=O({concat3d_:QI});function eN(e,t){return rt(e,t)}var sx=O({concat4d_:eN});function tN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","conv2d"),l=E(t,"filter","conv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h=a==="NHWC"?c.shape[3]:c.shape[1];M(h===l.shape[2],()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${l.shape[2]}.`),M(Fr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`);let d={x:c,filter:l},p={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},f=$.runKernel(ds,d,p);return u?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var na=O({conv2d_:tN});function nN(e,t,n,r,a="NWC",s=1,i){let o=E(e,"x","conv1d"),l=E(t,"filter","conv1d"),c=o,u=!1;o.rank===2&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1]])),M(c.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${c.rank}.`),M(l.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(c.shape[2]===l.shape[1],()=>`Error in conv1d: depth of input (${c.shape[2]}) must match input depth for filter ${l.shape[1]}.`),M(Fr(n,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`),M(a==="NWC",()=>`Error in conv1d: got dataFormat of ${a} but only NWC is currently supported.`);let h=H(l,[1,l.shape[0],l.shape[1],l.shape[2]]),d=H(c,[c.shape[0],1,c.shape[1],c.shape[2]]),p=na(d,h,[1,n],r,"NHWC",[1,s],i);return u?H(p,[p.shape[2],p.shape[3]]):H(p,[p.shape[0],p.shape[2],p.shape[3]])}var md=O({conv1d_:nN});function rN(e,t,n,r,a,s="NHWC",i){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let o=e,l=t,c=!1;t.rank===3&&(c=!0,l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),M(o.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`),M(l.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`),M(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let u=s==="NHWC"?o[3]:o[1],h=s==="NHWC"?l.shape[3]:l.shape[1];M(u===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${u}) must match input depth for filter ${n.shape[2]}.`),M(h===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`),i!=null&&M(Vt(a),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let d={dy:l,filter:n},p={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,inputShape:o},f=$.runKernel(ps,d,p);return c?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var Qf=O({conv2DBackpropInput_:rN});function aN(e,t,n,r,a,s){let i=E(e,"x","conv2dTranspose"),o=E(t,"filter","conv2dTranspose");return Qf(n,i,o,r,a,"NHWC",s)}var Ad=O({conv2dTranspose_:aN});function sN(e,t,n,r,a="NDHWC",s=[1,1,1]){let i=E(e,"x","conv3d"),o=E(t,"filter","conv3d"),l=i,c=!1;i.rank===4&&(c=!0,l=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(l.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`),M(o.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`),M(l.shape[4]===o.shape[3],()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`),M(Fr(n,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NDHWC",()=>`Error in conv3d: got dataFormat of ${a} but only NDHWC is currently supported.`);let u={x:l,filter:o},h={strides:n,pad:r,dataFormat:a,dilations:s},d=$.runKernel(Au,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var em=O({conv3d_:sN});function iN(e,t,n,r,a){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let s=e,i=t,o=!1;t.rank===4&&(o=!0,i=H(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);let l=s[4],c=i.shape[4];M(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),M(i.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${i.rank}`),M(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),M(l===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`),M(c===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${c}) must match output depth for filter ${n.shape[4]}.`);let u={dy:i,filter:n},h={pad:a,strides:r,inputShape:s},d=$.runKernel(Mh,u,h);return o?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var ix=O({conv3DBackpropInput_:iN});function oN(e,t,n,r,a){let s=E(e,"x","conv3dTranspose"),i=E(t,"filter","conv3dTranspose");return ix(n,s,i,r,a)}var lN=O({conv3dTranspose_:oN});function uN(e){let t={x:E(e,"x","cos")};return $.runKernel(fs,t)}var Hu=O({cos_:uN});function cN(e){let t={x:E(e,"x","cosh")};return $.runKernel(io,t)}var yd=O({cosh_:cN});function hN(e,t=0,n=!1,r=!1){let a={x:E(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:r};return $.runKernel(ms,a,s)}var gd=O({cumsum_:hN});function dN(e,t,n,r=!1){let a=E(e,"x","denseBincount"),s=E(t,"weights","denseBincount");M(a.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${a.dtype}`),M(a.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${a.rank}.`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(s.size===a.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${a.shape}, weights shape: ${s.shape}.`);let i={x:a,weights:s},o={size:n,binaryOutput:r};return $.runKernel(Fh,i,o)}var ox=O({denseBincount_:dN});function pN(e,t,n="NHWC"){let r=E(e,"x","depthToSpace"),a=n==="NHWC"?r.shape[1]:r.shape[2],s=n==="NHWC"?r.shape[2]:r.shape[3],i=n==="NHWC"?r.shape[3]:r.shape[1];M(a*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${a} and ${t} for depthToSpace with input shape - ${r.shape}`),M(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${s} and ${t} for depthToSpace with input shape - ${r.shape}`),M(i%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${r.shape}`);let o={x:r},l={blockSize:t,dataFormat:n};return $.runKernel(lo,o,l)}var tm=O({depthToSpace_:pN});function fN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","depthwiseConv2d"),l=E(t,"filter","depthwiseConv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[3]===l.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${c.shape[3]}) must match the inChannels dimension in filter ${l.shape[2]}.`),i!=null&&M(Vt(r),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h={x:c,filter:l},d={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},p=$.runKernel(As,h,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var cl=O({depthwiseConv2d_:fN});function mN(e){let t={x:E(e,"x","diag")};return $.runKernel(Oh,t)}var AN=O({diag_:mN});function yN(e,t,n,r,a=[1,1],s="NHWC"){let i=E(e,"x","dilation2d"),o=E(t,"filter","dilation2d");M(i.rank===3||i.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${i.rank}.`),M(o.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`),M(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let l=i,c=!1;i.rank===3&&(l=H(i,[1,i.shape[0],i.shape[1],i.shape[2]]),c=!0);let u={x:l,filter:o},h={strides:n,pad:r,dilations:a},d=$.runKernel(yu,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var nm=O({dilation2d_:yN});function gN(e,t){let n=e.length,r=[];for(let a=0;a1&&i===1&&r.unshift(s)}return r}function Ot(e,t){let n=[];for(let r=0;r1)&&n.unshift(s)}return n}function mt(e,t){let n=[],r=Math.max(e.length,t.length);for(let a=0;a"The first dimension of `a` must match the size of `condition`."),s.rank!==1&&nn(s.shape,l.shape,"Error in where: ");let c={condition:s,t:o,e:l};return $.runKernel(Po,c)}var _n=O({where_:wN});function bN(e){let t={x:E(e,"x","zerosLike")};return $.runKernel(Ko,t)}var je=O({zerosLike_:bN});function _N(e,t){let n=E(e,"a","div"),r=E(t,"b","div");[n,r]=bt(n,r);let a=me(n,r),s=je(a),i=Fa(r,s);return _n(i,s,a)}var rm=O({divNoNan_:_N});function vN(e,t){let n=E(e,"t1","dot"),r=E(t,"t2","dot");M((n.rank===1||n.rank===2)&&(r.rank===1||r.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${r.rank}.`);let a=n.rank===1?n.size:n.shape[1],s=r.rank===1?r.size:r.shape[0];if(M(a===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${a} and ${s}.`),n.rank===1&&r.rank===1){let i=H(n,[1,-1]),o=H(r,[-1,1]),l=Ge(i,o);return H(l,[])}else if(n.rank===1&&r.rank===2){let i=H(n,[1,-1]),o=H(r,[r.shape[0],r.shape[1]]),l=Ge(i,o);return H(l,[l.size])}else if(n.rank===2&&r.rank===1){let i=H(r,[-1,1]),o=Ge(n,i);return H(o,[o.size])}else{let i=H(r,[r.shape[0],r.shape[1]]);return Ge(n,i)}}var lx=O({dot_:vN});function kN(e){let t={x:E(e,"x","elu")};return $.runKernel(uo,t)}var hl=O({elu_:kN});function IN(e){let t=E(e,"x","erf");M(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=ye(t,"float32"));let n={x:t};return $.runKernel(co,n)}var am=O({erf_:IN});function NN(e){let t={x:E(e,"x","exp")};return $.runKernel(gs,t)}var Gn=O({exp_:NN});function SN(e,t=0){let n=E(e,"x","expandDims","string_or_numeric");M(t<=n.rank,()=>"Axis must be <= rank of the tensor");let r={input:n},a={dim:t};return $.runKernel(po,r,a)}var Yt=O({expandDims_:SN});function TN(e){let t={x:E(e,"x","expm1")};return $.runKernel(fo,t)}var sm=O({expm1_:TN});function CN(e,t){let n=E(e,"x","tile","string_or_numeric");M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let r={x:n},a={reps:t};return $.runKernel(Ia,r,a)}var $a=O({tile_:CN});function EN(e,t,n,r="float32"){t==null&&(t=e);let a=We([e,t],r),s=e<=t?e:t;for(let o=0;o`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${s.rank}.`),M(Vt(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=H(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let l={x:i},c={depthRadius:t,bias:n,alpha:r,beta:a},u=$.runKernel(bu,l,c);return o?H(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var om=O({localResponseNormalization_:VN});function UN(e){let t={x:E(e,"x","log")};return $.runKernel(Is,t)}var Mn=O({log_:UN});function jN(e){let t={x:E(e,"x","log1p")};return $.runKernel(ko,t)}var bd=O({log1p_:jN});function HN(e){return M(_a(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let r=E(t,"x","tf.grad","string_or_numeric"),a=n!=null?E(n,"dy","tf.grad"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(r),[r],a);return a!=null&&nn(s.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),_d(i),i[0]})}}function GN(e){return M(_a(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{M(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let r=Pu(t,"args","tf.grads","string_or_numeric"),a=n!=null?E(n,"dy","tf.grads"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(...r),r,a);return a!=null&&nn(s.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),_d(i),i})}}function qN(e){return M(_a(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{M(t instanceof Ve,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),M(n==null||n instanceof Ve,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:r,value:a}=$.gradients(()=>e(t),[t],n);return _d(r),{grad:r[0],value:a}}}function XN(e){return M(_a(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{M(Array.isArray(t)&&t.every(a=>a instanceof Ve),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),M(n==null||n instanceof Ve,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let r=$.gradients(()=>e(...t),t,n);return n!=null&&nn(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),_d(r.grads),r}}function px(e,t){M(_a(e),()=>"The f passed in variableGrads(f) must be a function"),M(t==null||Array.isArray(t)&&t.every(c=>c instanceof Du),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let c in $.registeredVariables)t.push($.registeredVariables[c])}let r=n?t.filter(c=>!c.trainable):null,a=t.length;t=t.filter(c=>c.trainable),M(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`);let s=!0,{value:i,grads:o}=$.gradients(e,t,null,s);M(o.some(c=>c!=null),()=>"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()."),M(i.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${i.rank} tensor`);let l={};return t.forEach((c,u)=>{o[u]!=null&&(l[c.name]=o[u])}),r!=null&&r.forEach(c=>l[c.name]=null),{value:i,grads:l}}function $r(e){return $.customGrad(e)}function _d(e){if(e.filter(t=>t==null).length>0)throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that - the f you passed encloses all operations that lead from x to y.`)}function KN(e){let t={x:E(e,"x","neg")};return $.runKernel(So,t)}var _t=O({neg_:KN});function ZN(e){let t={x:E(e,"x","softplus")};return $.runKernel(Uo,t)}var pl=O({softplus_:ZN});function YN(e){let t=E(e,"x","logSigmoid");return $r(n=>({value:_t(pl(_t(n))),gradFunc:r=>P(r,Rn(_t(n)))}))(t)}var fx=O({logSigmoid_:YN});function JN(e,t=null,n=!1){let r={x:E(e,"x","max")},a={reductionIndices:t,keepDims:n};return $.runKernel(Ns,r,a)}var vn=O({max_:JN});function QN(e,t){let n=E(e,"a","sub"),r=E(t,"b","sub");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ks,a)}var Ae=O({sub_:QN});function eS(e,t=null,n=!1){let r=E(e,"x","sum");r.dtype==="bool"&&(r=ye(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(Gs,a,s)}var Ce=O({sum_:eS});function tS(e,t=-1){let n=E(e,"logits","logSoftmax");if(t===-1&&(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 $r((r,a)=>{let s=!0,i=vn(r,t,!0),o=Ae(r,i),l=Ae(ye(o,"float32"),Mn(Ce(Gn(o),t,s)));return a([l]),{value:l,gradFunc:(c,u)=>{let[h]=u,d=!0,p=Gn(h);return Ae(c,P(Ce(c,t,d),p))}}})(n)}var vd=O({logSoftmax_:tS});function lm(e,t){for(let n=0;ne[s]);return[n,a]}function hi(e,t){let n=t.map(r=>1);return mx(e,n,t)}function nS(e,t,n){M(lm(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function yx(e,t){if(lm(e,t))return null;let n=[];for(let r=0;rn.push(r)),n}function um(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function rS(e,t){let n=[];for(let r=t-e;r`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),M(Fr(n,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`),a!=null&&M(Vt(r),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(Ts,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Ku=O({maxPool_:uS});function cS(e,t=[1,1,1],n,r,a,s="NDHWC"){let i=E(e,"x","maxPool3d"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(_u,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var hm=O({maxPool3d_:cS});function hS(e,t,n,r,a=!1){let s={x:E(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:r,includeBatchInIndex:a},o=$.runKernel(qh,s,i);return{result:o[0],indexes:o[1]}}var xx=O({maxPoolWithArgmax_:hS});function dS(e,t){let n=E(e,"a","maximum"),r=E(t,"b","maximum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=ye(n,"int32"),r=ye(r,"int32")),mt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Ss,a)}var Dr=O({maximum_:dS});function pS(e,t=null,n=!1){let r={x:E(e,"x","mean")},a={axis:t,keepDims:n};return $.runKernel(Cs,r,a)}var vt=O({mean_:pS});function fS(e,t=null,n=!1){let r={x:E(e,"x","min")},a={axis:t,keepDims:n};return $.runKernel(Es,r,a)}var fl=O({min_:fS});function mS(e,t){let n=E(e,"a","minimum"),r=E(t,"b","minimum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=ye(n,"int32"),r=ye(r,"int32")),mt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Rs,a)}var ml=O({minimum_:mS});function AS(e,t,n){M(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let r=E(e,"x","mirrorPad");if(r.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");M(t.length===r.rank,()=>`Padding doesn't match input. Must be ${r.rank}. Got ${t.length}.`);let a=n==="reflect"?1:0;for(let o=0;o"Invalid number of paddings. Must be length of 2 each."),M(t[o][0]>=0&&t[o][0]<=r.shape[o]-a&&t[o][1]>=0&&t[o][1]<=r.shape[o]-a,()=>`Padding in dimension ${o} cannot be greater than or equal to ${r.shape[o]-a} or less than 0 for input of shape ${r.shape}`);let s={paddings:t,mode:n},i={x:r};return $.runKernel(vu,i,s)}var dm=O({mirrorPad_:AS});function yS(e,t){let n=E(e,"a","mod"),r=E(t,"b","mod");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(No,a)}var pm=O({mod_:yS});function gS(e){let t=E(e,"x","square"),n={};return $.runKernel("Square",{x:t},n)}var it=O({square_:gS});function xS(e,t=null,n=!1){e=E(e,"x","moments");let r=er(t,e.shape),a=vt(e,r,n),s=a.shape;n||(s=hi(a.shape,r));let i=it(Ae(ye(e,"float32"),H(a,s))),o=vt(i,r,n);return{mean:a,variance:o}}var Id=O({moments_:xS});function wS(e,t,n,r){let a=E(t,"data","multiRNNCell"),s=Pu(n,"c","multiRNNCell"),i=Pu(r,"h","multiRNNCell"),o=a,l=[];for(let h=0;h2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);n=n||Math.random();let o={logits:i===1?H(a,[1,-1]):a},l={numSamples:t,seed:n,normalized:r},c=$.runKernel(Xh,o,l);return i===1?H(c,[c.size]):c}var wx=O({multinomial_:_S});function vS(e,t){let n=E(e,"a","notEqual"),r=E(t,"b","notEqual");[n,r]=bt(n,r),mt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(To,a)}var di=O({notEqual_:vS});function Ct(e,t="float32"){if(t==="complex64"){let r=Ct(e,"float32"),a=Ct(e,"float32");return Sa(r,a)}let n=vh(Ft(e),t);return $.makeTensor(n,e,t)}function Or(e,t="float32"){if(t==="complex64"){let r=Or(e,"float32"),a=Ct(e,"float32");return Sa(r,a)}let n=sf(Ft(e),t);return $.makeTensor(n,e,t)}function kS(e){let t={x:E(e,"x","onesLike")};return $.runKernel(Mo,t)}var Fn=O({onesLike_:kS});function IS(e,t){let n=E(e,"v1","outerProduct"),r=E(t,"v2","outerProduct");M(n.rank===1&&r.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${r.rank}.`);let a=H(n,[-1,1]),s=H(r,[1,-1]);return Ge(a,s)}var NS=O({outerProduct_:IS});function SS(e,t,n=0){let r=E(e,"x","pad");if(r.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let a={paddings:t,constantValue:n},s={x:r};return $.runKernel($s,s,a)}var ra=O({pad_:SS});function TS(e,t,n=0){return M(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),ra(e,[t],n)}var CS=O({pad1d_:TS});function ES(e,t,n=0){return M(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ra(e,t,n)}var RS=O({pad2d_:ES});function MS(e,t,n=0){return M(t.length===3&&t[0].length===2&&t[1].length===2&&t[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ra(e,t,n)}var FS=O({pad3d_:MS});function $S(e,t,n=0){return M(t.length===4&&t[0].length===2&&t[1].length===2&&t[2].length===2&&t[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ra(e,t,n)}var DS=O({pad4d_:$S});function OS(e,t,n){let r=E(e,"x","spaceToBatchND");M(r.rank>=1+t.length,()=>`input rank ${r.rank} should be > than [blockShape] ${t.length}`),M(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),M(r.shape.reduce((i,o,l)=>l>0&&l<=t.length?i&&(o+n[l-1][0]+n[l-1][1])%t[l-1]==0:i,!0),()=>`input spatial dimensions ${r.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let a={x:r},s={blockShape:t,paddings:n};return $.runKernel(Nu,a,s)}var Zu=O({spaceToBatchND_:OS});function LS(e,t,n,r,a,s){a==null&&(a=[1,1]),s==null&&(s=1),r===0&&(r="valid");let i=E(e,"x","maxPool"),o=i,l=!1;i.rank===3&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2]])),M(Fr(s,a),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${a}'`);let c=Y5(o.shape,t,s,a,r),u=[c.dilationHeight,c.dilationWidth],h;r==="same"?h=PS([c.filterHeight,c.filterWidth],u):h=[[0,0],[0,0]];let d=u[0]===1&&u[1]===1,[p,f]=zS([c.inHeight,c.inWidth],u,h),m=d?r:"valid",A=d?o:Zu(o,u,p),y=(n==="avg"?()=>Vu(A,t,s,m):()=>Ku(A,t,s,m))(),g=d?y:Uu(y,u,f);return l?H(g,[g.shape[1],g.shape[2],g.shape[3]]):g}function zS(e,t,n){let r=n.map(u=>u[0]),a=n.map(u=>u[1]),s=e.concat(r,a),i=t.map((u,h)=>(u-s[h]%u)%u),o=a.map((u,h)=>u+i[h]),l=t.map((u,h)=>[r[h],o[h]]),c=t.map((u,h)=>[0,i[h]]);return[l,c]}function PS(e,t){let n=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),r=n.map(s=>Math.floor(s/2)),a=n.map((s,i)=>s-r[i]);return n.map((s,i)=>[r[i],a[i]])}var bx=O({pool_:LS});function WS(e,t){let n=E(e,"base","pow"),r=E(t,"exp","pow");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ds,a)}var aa=O({pow_:WS});function BS(e,t){let n=E(e,"x","prelu"),r=E(t,"alpha","prelu"),a={x:n,alpha:r};return $.runKernel(Os,a)}var Yu=O({prelu_:BS});function VS(e,t=null,n=!1){let r=E(e,"x","prod");r.dtype==="bool"&&(r=ye(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel($o,a,s)}var Nd=O({prod_:VS});function US(e,t,n){let r=Ft(e),a=null;if(n==null||n==="float32")a=new Float32Array(r);else if(n==="int32")a=new Int32Array(r);else if(n==="bool")a=new Uint8Array(r);else throw new Error(`Unknown data type ${n}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*r*i,t=this.mean+this.stdDev*a*i,(!this.truncated||this.isValidTruncated(e))&&(n=!0)}return(!this.truncated||this.isValidTruncated(t))&&(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return this.dtype==null||this.dtype==="float32"?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}},HS=class{constructor(e,t,n,r){this.alpha=e,this.beta=1/t,this.dtype=n;let a=r||Math.random();this.randu=fm.alea(a.toString()),this.randn=new mm(0,1,n,!1,this.randu()),e<1?this.d=e+2/3:this.d=e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,r,a,s;for(;;){do r=this.randn.nextValue(),s=1+this.c*r;while(s<=0);if(s*=s*s,e=r*r,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),a=this.randu(),athis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,r==null&&(r=Math.random()),typeof r=="number"&&(r=r.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=fm.alea(r)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function qS(e,t,n=1,r="float32",a){if(n==null&&(n=1),r==null&&(r="float32"),r!=="float32"&&r!=="int32")throw new Error(`Unsupported data type ${r}`);let s=new HS(t,n,r,a),i=We(e,r);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),$n(t,0)}var rT=O({reverse1d_:nT});function aT(e,t){let n=E(e,"x","reverse");return M(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),$n(n,t)}var sT=O({reverse2d_:aT});function iT(e,t){let n=E(e,"x","reverse");return M(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),$n(n,t)}var oT=O({reverse3d_:iT});function lT(e,t){let n=E(e,"x","reverse");return M(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),$n(n,t)}var uT=O({reverse4d_:lT});function cT(e){let t={x:E(e,"x","round")};return $.runKernel(Bs,t)}var ym=O({round_:cT});function hT(e){let t={x:E(e,"x","rsqrt")};return $.runKernel(Vs,t)}var Cd=O({rsqrt_:hT});function ge(e,t){if((rn(e)&&t!=="string"||Array.isArray(e))&&t!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(t==="string"&&rn(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Ta(e,[],[],t)}function dT(e){let t={x:E(e,"x","selu")};return $.runKernel(Lo,t)}var Ed=O({selu_:dT});function pT(e,t,n,r,a,s=[1,1],i="NHWC"){let o=E(e,"x","separableConv2d"),l=E(t,"depthwiseFilter","separableConv2d"),c=E(n,"pointwiseFilter","separableConv2d"),u=o,h=!1;if(o.rank===3&&(h=!0,u=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),i==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");M(u.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${u.rank}.`),M(l.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`),M(c.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${c.shape[0]}.`),M(c.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${c.shape[1]}.`);let d=l.shape[2],p=l.shape[3];M(c.shape[2]===d*p,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${d*p}, but got ${c.shape[2]}.`);let f=cl(u,l,r,a,i,s),m=na(f,c,1,"valid",i);return h?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var gm=O({separableConv2d_:pT});async function fT(e,t){let n=E(e,"x","setdiff1d"),r=E(t,"y","setdiff1d");M(n.dtype===r.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${r.dtype}).`),M(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),M(r.rank===1,()=>`y should be 1D tensor, but got y (${r.shape}).`);let a=await n.data(),s=await r.data(),i=new Set(s),o=0;for(let u=0;u`slice1d expects a rank-1 tensor, but got a rank-${r.rank} tensor`),Ee(r,[t],[n])}var Fd=O({slice1d_:gT});function xT(e,t,n){let r=E(e,"x","slice2d");return M(r.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var wm=O({slice2d_:xT});function wT(e,t,n){let r=E(e,"x","slice3d");return M(r.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var $d=O({slice3d_:wT});function bT(e,t,n){let r=E(e,"x","slice4d");return M(r.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var Qu=O({slice4d_:bT});function _T(e,t=-1){let n=E(e,"logits","softmax","float32");if(t===-1&&(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}`);let r={logits:n},a={dim:t};return $.runKernel(qs,r,a)}var ec=O({softmax_:_T});function vT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Wh,t)}var tc=O({fft_:vT});function kT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Bh,t)}var yl=O({ifft_:kT});function IT(e){let t=e.shape[e.shape.length-1],n=e.size/t,r;if(t<=2){let a=H(e,[n,t]);r=yl(a)}else{let a=[n,2*(t-1)],s=H(Ju(e),[n,t]),i=H(xd(e),[n,t]),o=$n(Ee(s,[0,1],[n,t-2]),1),l=P($n(Ee(i,[0,1],[n,t-2]),1),ge(-1)),c=rt([s,o],1),u=rt([i,l],1),h=H(Sa(c,u),[a[0],a[1]]);r=yl(h)}if(r=Ju(r),e.rank===3&&e.shape[0]!==0){let a=r,s=e.shape[0];r=H(r,[s,r.shape[0]/s,r.shape[1]]),a.dispose()}return r}var Dd=O({irfft_:IT});function NT(e,t,n=0){let r={x:E(e,"x","split")},a={numOrSizeSplits:t,axis:n};return $.runKernel(jo,r,a)}var zt=O({split_:NT});function ST(e,t){M(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],r=e.size/n,a;if(t!=null&&t0),m=e.shape.map(A=>A);m[e.shape.length-1]=t,a=Ee(e,f,m),n=t}else if(t!=null&&t>n){let f=e.shape.map(m=>m);f[e.shape.length-1]=t-n,a=rt([e,Ct(f)],e.shape.length-1),n=t}else a=e;let s=je(a),i=H(Sa(a,s),[r,n]),o=tc(i),l=Math.floor(n/2)+1,c=Ju(o),u=xd(o),h=zt(c,[l,n-l],c.shape.length-1),d=zt(u,[l,n-l],u.shape.length-1),p=a.shape.slice();return p[a.shape.length-1]=l,H(Sa(h[0],d[0]),p)}var nc=O({rfft_:ST});function TT(e){let t={x:E(e,"x","sqrt")};return $.runKernel(Hs,t)}var Jt=O({sqrt_:TT});function CT(e,t){let n=E(e,"a","squaredDifference"),r=E(t,"b","squaredDifference");[n,r]=bt(n,r),mt(n.shape,r.shape);let a={a:n,b:r},s={};return $.runKernel(Xs,a,s)}var Od=O({squaredDifference_:CT});function ET(e,t){let n=E(e,"x","squeeze");return H(n,jg(n.shape,t).newShape)}var Oa=O({squeeze_:ET});function RT(e,t=0){let n=Pu(e,"tensors","stack","string_or_numeric");M(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&M(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let r=n,a={axis:t};return $.runKernel(Fo,r,a)}var un=O({stack_:RT});function MT(e,t=0){let n={x:E(e,"x","step")},r={alpha:t};return $.runKernel(Na,n,r)}var gl=O({step_:MT});function FT(e,t,n,r,a=0,s=0,i=0,o=0,l=0){let c={x:E(e,"x","stridedSlice")},u={begin:t,end:n,strides:r,beginMask:a,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};return $.runKernel(Ho,c,u)}var bm=O({stridedSlice_:FT});function $T(e){let t={x:E(e,"x","tan")};return $.runKernel(Go,t)}var _m=O({tan_:$T});function sn(e,t){as(e);let n=Er(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Ta(e,null,n,t)}function kn(e,t,n){if(as(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let r=Er(e,n);if(r.length!==2&&r.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Ta(e,t,r,n)}function DT(e,t,n){if(as(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let r=Er(e,n);if(r.length!==4&&r.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Ta(e,t,r,n)}function OT(e,t,n){if(as(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let r=Er(e,n);if(r.length!==5&&r.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Ta(e,t,r,n)}function zT(e,t,n){if(as(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let r=Er(e,n);if(r.length!==6&&r.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||r,Ta(e,t,r,n)}function PT(e,t=1,n=!0){let r=E(e,"x","topk");if(r.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let a=r.shape[r.shape.length-1];if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);let s={x:r},i={k:t,sorted:n},[o,l]=$.runKernel(qo,s,i);return{values:o,indices:l}}var vm=O({topk_:PT});function LT(e,t=0,n=1,r,a){if(r!=null&&r==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new mm(t,n,r,!0,a),i=We(e,r);for(let o=0;o0,()=>"The input tensor must be at least 1D");let r={x:n},a={axis:t},[s,i]=$.runKernel(ed,r,a);return{values:s,indices:i}}var Pd=O({unique_:WT});function BT(e,t,n){let r=E(e,"x","unsortedSegmentSum"),a=E(t,"segmentIds","unsortedSegmentSum","int32");M(Vt(n),()=>"numSegments must be of dtype int");let s={x:r,segmentIds:a},i={numSegments:n};return $.runKernel(Tu,s,i)}var km=O({unsortedSegmentSum_:BT});function VT(e,t=0){let n=E(e,"x","unstack","string_or_numeric");M(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let r={value:n},a={axis:t};return $.runKernel(Xo,r,a)}var ar=O({unstack_:VT});function kx(e,t=!0,n,r){return $.makeVariable(e,t,n,r)}function Ix(e,t){let n=[];for(let s=0;s0,()=>"mask cannot be scalar"),nn(o.slice(s,s+i),a.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let m=s;m"Shape mismatch in v and x");let l=ge(1),c=Ae(l,o),u=P(Ae(i,s),c);if(a){M(r!=null,()=>"When using zeroDebias: true, step is required.");let h=E(r,"step","movingAverage");u=me(u,Ae(l,aa(o,h)))}return se(s,u)}var XT=O({movingAverage_:qT});function KT(e,t,n){let r=E(e,"indices","scatterND","int32"),a=E(t,"updates","scatterND");Df(a,r,n);let s={indices:r,updates:a},i={shape:n};return $.runKernel(zo,s,i)}var Sx=O({scatterND_:KT});function ZT(e,t,n,r){if(e.dtype!=="int32")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}.`);let a=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}.`);let i=t.size;if(!(t.rank===0||t.rank===1&&i===a))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${a}]`);if(t.dtype!==r.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function YT(e,t,n,r=0){let a=E(e,"sparseIndices","sparseToDense","int32"),s=E(t,"sparseValues","sparseToDense"),i=E(r,"defaultValue","sparseToDense",s.dtype);ZT(a,s,n,i);let o={sparseIndices:a,sparseValues:s,defaultValue:i},l={outputShape:n};return $.runKernel(Jh,o,l)}var Nm=O({sparseToDense_:YT});function JT(e,t){let n=E(t,"indices","gatherND","int32"),r={params:E(e,"x","gatherND"),indices:n};return $.runKernel(yo,r)}var Tx=O({gatherND_:JT});function QT(e,t){if(t==null)return e.shape.slice();if(ea(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let r=0;r`x has to be a floating point tensor since it's going to be scaled, but got a ${a.dtype} tensor instead.`),M(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof Ve?a.clone():a;let s=QT(a,n),i=1-t,o=me(dl(se(Al(s,0,1,"float32",r),i)),i);return P(a,o)}var Cx=O({dropout_:eC});function Ex(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function Sm(e,t,n){let r=1-e%2,a=new Float32Array(e);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${r.rank}`),M(r.rank-1===a.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${r.rank} and targets rank ${a.rank}`),nn(r.shape.slice(0,r.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=r.shape[r.shape.length-1];M(n>0&&n<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`);let i=await r.data(),o=await a.data(),[l,c]=[i.length/s,s],u=Hg("bool",l);for(let h=0;hA.value-m.value),u[h]=0;for(let m=0;mrC,depthwiseConv2d:()=>aC,matMul:()=>sC});function iC(e,t,n,r,a,s="NHWC",i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]])),M(o.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`),M(l.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`),M(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let c=s==="NHWC"?o.shape[3]:o.shape[1],u=s==="NHWC"?l.shape[3]:l.shape[1];M(c===n[2],()=>`Error in conv2dDerFilter: depth of input ${c}) must match input depth in filter (${n[2]}.`),M(u===n[3],()=>`Error in conv2dDerFilter: depth of dy (${u}) must match output depth for filter (${n[3]}).`),i!=null&&M(Vt(a),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let h={x:o,dy:l},d={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,filterShape:n};return $.runKernel(Eh,h,d)}var Tm=O({conv2DBackpropFilter_:iC});function Wd(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return P(e,gl(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function Bd(e,t){let n=t,r=Ot(e.shape,t.shape);return r.length>0&&(n=Ce(n,r)),H(n,e.shape)}function Vd(e,t,n,r){if(t==="linear")return e;if(t==="relu")return zr(e);if(t==="elu")return hl(e);if(t==="relu6")return Td(e);if(t==="prelu")return Yu(e,n);if(t==="leakyrelu")return qu(e,r);throw new Error(`Unknown fused activation ${t}.`)}var Ud=(e,t)=>!(e>0)||t==="linear";function oC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(l=l||"linear",Ud($.state.gradientDepth,l)===!1){let _=na(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Vd(_,l,c,u)}let h=E(e,"x","conv2d"),d=E(t,"filter","conv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${d.rank}.`),i!=null&&M(Vt(r),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(p.shape[3]===d.shape[2],()=>`Error in conv2d: depth of input (${p.shape[3]}) must match input depth for filter ${d.shape[2]}.`),M(Fr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NHWC",()=>`Error in conv2d: got dataFormat of ${a} but only NHWC is currently supported.`);let m=Bu(p.shape,d.shape,n,s,r,i),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),mt(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused conv2d"));let g=(_,x)=>{let[N,T,C,F]=x,D=Wd(_,C,l);M(Ma(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let L=Qf(T.shape,D,N,n,r),V=Tm(T,D,N.shape,n,r),U=[L,V];if(F!=null){let j=Bd(F,D);U.push(j)}return U},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?$r((_,x,N)=>{let T=$.runKernel(Qs,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):$r((_,x,N,T)=>{let C=$.runKernel(Qs,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var rC=O({fusedConv2d_:oC});function lC(e,t,n,r,a,s=[1,1],i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={x:o,dy:l},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,filterShape:n};return $.runKernel($h,c,u)}var Rx=O({depthwiseConv2dNativeBackpropFilter_:lC});function uC(e,t,n,r,a,s=[1,1],i){let o=t,l=!1;t.rank===3&&(l=!0,o=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={dy:o,filter:n},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,inputShape:e},h=$.runKernel(Dh,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Mx=O({depthwiseConv2dNativeBackpropInput_:uC});function cC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(Ud($.state.gradientDepth,l)===!1){let _=cl(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Vd(_,l,c,u)}let h=E(e,"x","depthwiseConv2d"),d=E(t,"filter","depthwiseConv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${d.rank}.`),M(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]}.`),s==null&&(s=[1,1]),M(Fr(n,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),i!=null&&M(Vt(r),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${i} but got pad ${r}.`);let m=Bu(p.shape,d.shape,n,s,r,i,!0),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),mt(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused depthwiseConv2d"));let g=(_,x)=>{M(Ma(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[N,T,C,F]=x,D=Wd(_,C,l),L=Mx(T.shape,D,N,n,r,s,i),V=Rx(T,D,N.shape,n,r,s,i);if(F!=null){let U=Bd(A,D);return[L,V,U]}return[L,V]},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?$r((_,x,N)=>{let T=$.runKernel(ei,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):$r((_,x,N,T)=>{let C=$.runKernel(ei,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var aC=O({fusedDepthwiseConv2d_:cC});function hC({a:e,b:t,transposeA:n=!1,transposeB:r=!1,bias:a,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o}){if(Ud($.state.gradientDepth,s)===!1){let F=Ge(e,t,n,r);return a!=null&&(F=se(F,a)),Vd(F,s,i,o)}let l=E(e,"a","fused matMul"),c=E(t,"b","fused matMul");[l,c]=bt(l,c);let u=n?l.shape[l.rank-2]:l.shape[l.rank-1],h=r?c.shape[c.rank-1]:c.shape[c.rank-2],d=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=r?c.shape[c.rank-2]:c.shape[c.rank-1],f=l.shape.slice(0,-2),m=c.shape.slice(0,-2),A=Ft(f),y=Ft(m);M(l.rank>=2&&c.rank>=2&&l.rank===c.rank,()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${l.rank} and ${c.rank}.`),M(ea(f,m),()=>`Error in fused matMul: outer dimensions (${f}) and (${m}) of Tensors with shapes ${l.shape} and ${c.shape} must match.`),M(u===h,()=>`Error in fused matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${l.shape} and ${c.shape} and transposeA=${n} and transposeB=${r} must match.`);let g=l.shape.slice(0,-2).concat([d,p]),w=n?H(l,[A,u,d]):H(l,[A,d,u]),b=r?H(c,[y,p,h]):H(c,[y,h,p]),_;a!=null&&(_=E(a,"bias","fused matMul"),[_]=bt(_,l),mt(g,_.shape));let x;i!=null&&(x=E(i,"prelu weights","fused matMul"));let N=(F,D)=>{let[L,V,U,j]=D,X=Wd(H(F,U.shape),U,s),G,ee;if(!n&&!r?(G=Ge(X,V,!1,!0),ee=Ge(L,X,!0,!1)):!n&&r?(G=Ge(X,V,!1,!1),ee=Ge(X,L,!0,!1)):n&&!r?(G=Ge(V,X,!1,!0),ee=Ge(L,X,!1,!1)):(G=Ge(V,X,!0,!0),ee=Ge(X,L,!0,!0)),a!=null){let Y=Bd(j,X);return[G,ee,Y]}else return[G,ee]},T={a:w,b,bias:_,preluActivationWeights:x},C={transposeA:n,transposeB:r,activation:s,leakyreluAlpha:o};return a==null?$r((F,D,L)=>{let V=$.runKernel(Js,T,C);return L([F,D,V]),{value:H(V,g),gradFunc:N}})(w,b):$r((F,D,L,V)=>{let U=$.runKernel(Js,T,C);return V([F,D,U,L]),{value:H(U,g),gradFunc:N}})(w,b,_)}var sC=O({fusedMatMul_:hC});function dC(e){return Sm(e,.54,.46)}var pC=O({hammingWindow_:dC});function fC(e){return Sm(e,.5,.5)}var Fx=O({hannWindow_:fC});function mC(e,t,n,r=!1,a=0){let s=0,i=[];for(;s+t<=e.size;)i.push(Ee(e,s,t)),s+=n;if(r)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&o.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${c},4] but had shape ${o.shape}.`),M(l.rank===1&&l.shape[0]===c,()=>`Error in cropAndResize: boxInd must be have size [${c}] but had shape ${o.shape}.`),M(r.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${r.length}.`),M(r[0]>=1&&r[1]>=1,()=>`cropSize must be atleast [1,1], but was ${r}`),M(a==="bilinear"||a==="nearest",()=>`method must be bilinear or nearest, but was ${a}`);let u={image:i,boxes:o,boxInd:l},h={method:a,extrapolationValue:s,cropSize:r};return $.runKernel(oo,u,h)}var xC=O({cropAndResize_:gC});function wC(e){let t=E(e,"image","flipLeftRight","float32");M(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return $.runKernel(mo,n,{})}var bC=O({flipLeftRight_:wC});function _C(e,t,n=0,r=.5){let a=E(e,"image","rotateWithOffset","float32");M(a.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${a.rank}.`);let s={image:a},i={radians:t,fillValue:n,center:r};return $.runKernel(Zo,s,i)}var vC=O({rotateWithOffset_:_C});function xl(e,t,n,r,a,s){r==null&&(r=.5),a==null&&(a=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return n=Math.min(n,i),M(0<=r&&r<=1,()=>`iouThreshold must be in [0, 1], but was '${r}'`),M(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),M(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),M(t.rank===1,()=>"scores must be a 1D tensor"),M(t.shape[0]===i,()=>`scores has incompatible shape with boxes. Expected ${i}, but was ${t.shape[0]}`),M(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s}}function kC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppression"),i=E(t,"scores","nonMaxSuppression"),o=xl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l={maxOutputSize:n,iouThreshold:r,scoreThreshold:a};return $.runKernel(Co,{boxes:s,scores:i},l)}var IC=O({nonMaxSuppression_:kC});function SC(e,t,n){let r=NC(e,t,n),a=r<0?-(r+1):r;e.splice(a,0,t)}function NC(e,t,n){return CC(e,t,n||TC)}function TC(e,t){return e>t?1:e>>1);let o=n(t,e[s]);o>0?r=s+1:(a=s,i=!o)}return i?r:-r-1}function Dx(e,t,n,r,a){return Cm(e,t,n,r,a,0)}function Ox(e,t,n,r,a,s){return Cm(e,t,n,r,a,0,!1,s,!0)}function zx(e,t,n,r,a,s){return Cm(e,t,n,r,a,s,!0)}function Cm(e,t,n,r,a,s,i=!1,o=!1,l=!1){let c=[];for(let A=0;Aa&&c.push({score:t[A],boxIndex:A,suppressBeginIndex:0});c.sort(Px);let u=s>0?-.5/s:0,h=[],d=[];for(;h.length0;){let A=c.pop(),{score:y,boxIndex:g,suppressBeginIndex:w}=A;if(y=w;--_){let x=EC(e,g,h[_]);if(x>=r){b=!0;break}if(A.score=A.score*RC(r,u,x),A.score<=a)break}A.suppressBeginIndex=h.length,b||(A.score===y?(h.push(g),d.push(A.score)):A.score>a&&SC(c,A,Px))}let p=h.length,f=n-p;o&&f>0&&(h.push(...new Array(f).fill(0)),d.push(...new Array(f).fill(0)));let m={selectedIndices:h};return i&&(m.selectedScores=d),l&&(m.validOutputs=p),m}function EC(e,t,n){let r=e.subarray(t*4,t*4+4),a=e.subarray(n*4,n*4+4),s=Math.min(r[0],r[2]),i=Math.min(r[1],r[3]),o=Math.max(r[0],r[2]),l=Math.max(r[1],r[3]),c=Math.min(a[0],a[2]),u=Math.min(a[1],a[3]),h=Math.max(a[0],a[2]),d=Math.max(a[1],a[3]),p=(o-s)*(l-i),f=(h-c)*(d-u);if(p<=0||f<=0)return 0;let m=Math.max(s,c),A=Math.max(i,u),y=Math.min(o,h),g=Math.min(l,d),w=Math.max(y-m,0)*Math.max(g-A,0);return w/(p+f-w)}function RC(e,t,n){let r=Math.exp(t*n*n);return n<=e?r:0}function Px(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function MC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppressionAsync"),i=E(t,"scores","nonMaxSuppressionAsync"),o=xl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l=await Promise.all([s.data(),i.data()]),c=l[0],u=l[1],{selectedIndices:h}=Dx(c,u,n,r,a);return s!==e&&s.dispose(),i!==t&&i.dispose(),sn(h,"int32")}var FC=MC;function $C(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=xl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c={boxes:i,scores:o},u={maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s},h=$.runKernel(Ro,c,u);return{selectedIndices:h[0],selectedScores:h[1]}}var DC=O({nonMaxSuppressionWithScore_:$C});async function OC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=xl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c=await Promise.all([i.data(),o.data()]),u=c[0],h=c[1],{selectedIndices:d,selectedScores:p}=zx(u,h,n,r,a,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:sn(d,"int32"),selectedScores:sn(p)}}var zC=OC;function PC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=xl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,d={boxes:i,scores:o},p={maxOutputSize:c,iouThreshold:u,scoreThreshold:h,padToMaxOutputSize:s},f=$.runKernel(Eo,d,p);return{selectedIndices:f[0],validOutputs:f[1]}}var LC=O({nonMaxSuppressionPadded_:PC});async function WC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=xl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,[d,p]=await Promise.all([i.data(),o.data()]),{selectedIndices:f,validOutputs:m}=Ox(d,p,c,u,h,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:sn(f,"int32"),validOutputs:ge(m,"int32")}}var BC=WC;function VC(e,t,n=!1,r=!1){let a=E(e,"images","resizeBilinear");M(a.rank===3||a.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),M(r===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Ps,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Lx=O({resizeBilinear_:VC});function UC(e,t,n=!1,r=!1){let a=E(e,"images","resizeNearestNeighbor");M(a.rank===3||a.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),M(a.dtype==="float32"||a.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),M(r===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Iu,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Wx=O({resizeNearestNeighbor_:UC});function jC(e,t,n="nearest",r="constant",a=0,s){let i=E(e,"image","transform","float32"),o=E(t,"transforms","transform","float32");M(i.rank===4,()=>`Error in transform: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&(o.shape[0]===i.shape[0]||o.shape[0]===1)&&o.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),M(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let l={image:i,transforms:o},c={interpolation:n,fillMode:r,fillValue:a,outputShape:s};return $.runKernel(Qh,l,c)}var HC=O({transform_:jC});function GC(e,t,n){M(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),M(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let r=E(e,"a","bandPart");M(r.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${r.rank}.`);let a=r.shape,[s,i]=r.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(n<=i))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),n<0&&(n=i);let o=H(Sd(0,s,1,"int32"),[-1,1]),l=Sd(0,i,1,"int32"),c=Ae(o,l),u=rr(ci(c,ge(+t,"int32")),Da(c,ge(-n,"int32"))),h=Ct([s,i],r.dtype);return H(un(ar(H(r,[-1,s,i])).map(d=>_n(u,d,h))),a)}var qC=O({bandPart_:GC});function XC(e){let t;if(Array.isArray(e)){t=!1,M(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let a=e[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[s].shape[0]} vs. ${a})`)}else t=!0,e=zt(e,e.shape[0],0).map(a=>Oa(a,[0]));M(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],r=e;for(let a=0;a{let s=r[a];if(a>0)for(let i=0;i=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return Bx(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((l,c)=>l*c),r=ar(H(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),a=[],s=[];r.forEach(l=>{let[c,u]=Bx(l,t);a.push(c),s.push(u)});let i=H(un(a,0),e.shape),o=H(un(s,0),e.shape);return[i,o]}}function Bx(e,t=!1){return $.tidy(()=>{M(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],r=e.shape[1],a=im(n),s=Rr(e),i=kn([[1]],[1,1]),o=Rr(i),l=n>=r?r:n;for(let c=0;c{let p=Ee(s,[c,c],[n-c,1]),f=Ld(p),m=Ee(s,[c,c],[1,1]),A=_n(nr(m,0),kn([[-1]]),kn([[1]])),y=Ae(m,P(A,f)),g=me(p,y);g.shape[0]===1?o=Rr(i):o=rt([i,Ee(g,[1,0],[g.shape[0]-1,g.shape[1]])],0);let w=_t(me(Ge(A,y),f)),b=Ee(s,[c,0],[n-c,r]),_=P(w,o),x=nt(o);if(c===0)s=Ae(b,Ge(_,Ge(x,b)));else{let C=Ae(b,Ge(_,Ge(x,b)));s=rt([Ee(s,[0,0],[c,r]),C],0)}let N=nt(_),T=Ee(a,[0,c],[n,a.shape[1]-c]);if(c===0)a=Ae(T,Ge(Ge(T,o),N));else{let C=Ae(T,Ge(Ge(T,o),N));a=rt([Ee(a,[0,0],[n,c]),C],1)}return[o,s,a]}),ve([u,h,d])}return!t&&n>r&&(a=Ee(a,[0,0],[n,r]),s=Ee(s,[0,0],[r,r])),[a,s]})}var YC=O({qr_:ZC}),cn;(function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(cn||(cn={}));function JC(e,t,n=cn.SUM_BY_NONZERO_WEIGHTS){let r=E(e,"losses","computeWeightedLoss"),a=null;t!=null&&(a=E(t,"weights","computeWeightedLoss"));let s=a==null?r:P(r,a);if(n===cn.NONE)return s;if(n===cn.SUM)return Ce(s);if(n===cn.MEAN){if(a==null)return vt(s);{let i=r.size/a.size,o=me(Ce(s),Ce(a));return i>1?me(o,ge(i)):o}}if(n===cn.SUM_BY_NONZERO_WEIGHTS){if(a==null)return me(Ce(s),ge(r.size));{let i=P(a,Or(r.shape)),o=ye(Ce(di(i,ge(0))),"float32");return me(Ce(s),o)}}throw Error(`Unknown reduction: ${n}`)}var sa=O({computeWeightedLoss_:JC});function QC(e,t,n,r=cn.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","absoluteDifference"),s=E(t,"predictions","absoluteDifference"),i=null;n!=null&&(i=E(n,"weights","absoluteDifference")),nn(a.shape,s.shape,"Error in absoluteDifference: ");let o=Dt(Ae(a,s));return sa(o,i,r)}var eE=O({absoluteDifference_:QC});function tE(e,t,n,r,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","cosineDistance"),i=E(t,"predictions","cosineDistance"),o=null;r!=null&&(o=E(r,"weights","cosineDistance")),nn(s.shape,i.shape,"Error in cosineDistance: ");let l=ge(1),c=Ae(l,Ce(P(s,i),n,!0));return sa(c,o,a)}var nE=O({cosineDistance_:tE});function rE(e,t,n,r=cn.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","hingeLoss"),s=E(t,"predictions","hingeLoss"),i=null;n!=null&&(i=E(n,"weights","hingeLoss")),nn(a.shape,s.shape,"Error in hingeLoss: ");let o=ge(1);a=Ae(P(ge(2),a),o);let l=zr(Ae(o,P(a,s)));return sa(l,i,r)}var aE=O({hingeLoss_:rE});function sE(e,t,n,r=1,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","huberLoss"),i=E(t,"predictions","huberLoss"),o=null;n!=null&&(o=E(n,"weights","huberLoss")),nn(s.shape,i.shape,"Error in huberLoss: ");let l=ge(r),c=Dt(Ae(i,s)),u=ml(c,l),h=Ae(c,u),d=se(P(ge(.5),it(u)),P(l,h));return sa(d,o,a)}var iE=O({huberLoss_:sE});function oE(e,t,n,r=1e-7,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","logLoss"),i=E(t,"predictions","logLoss"),o=null;n!=null&&(o=E(n,"weights","logLoss")),nn(s.shape,i.shape,"Error in logLoss: ");let l=ge(1),c=ge(r),u=_t(P(s,Mn(se(i,c)))),h=P(Ae(l,s),Mn(se(Ae(l,i),c))),d=Ae(u,h);return sa(d,o,a)}var lE=O({logLoss_:oE});function uE(e,t,n,r=cn.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","meanSquaredError"),s=E(t,"predictions","meanSquaredError"),i=null;n!=null&&(i=E(n,"weights","meanSquaredError")),nn(a.shape,s.shape,"Error in meanSquaredError: ");let o=Od(a,s);return sa(o,i,r)}var cE=O({meanSquaredError_:uE});function hE(e,t){let n=E(e,"labels","sigmoidCrossEntropyWithLogits"),r=E(t,"logits","sigmoidCrossEntropyWithLogits");nn(n.shape,r.shape,"Error in sigmoidCrossEntropyWithLogits: ");let a=zr(r),s=P(r,n),i=bd(Gn(_t(Dt(r))));return se(Ae(a,s),i)}function dE(e,t,n,r=0,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"multiClassLabels","sigmoidCrossEntropy"),i=E(t,"logits","sigmoidCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","sigmoidCrossEntropy")),nn(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),r>0){let c=ge(r),u=ge(1),h=ge(.5);s=se(P(s,Ae(u,c)),P(h,c))}let l=hE(s,i);return sa(l,o,a)}var pE=O({sigmoidCrossEntropy_:dE});function fE(e,t,n=-1){if(n===-1&&(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}`);return $r((r,a,s)=>{let i=cm(a,[n],!0),o=Ae(ye(a,"float32"),i);s([r,o]);let l=_t(P(o,r));return{value:Ce(l,[n]),gradFunc:(c,u)=>{let[h,d]=u,p=hi(c.shape,[n]);return[P(H(c,p),Ae(ye(h,"float32"),Gn(d))),P(H(c,p),Ae(Gn(d),ye(h,"float32")))]}}})(e,t)}function mE(e,t,n,r=0,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"onehotLabels","softmaxCrossEntropy"),i=E(t,"logits","softmaxCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","softmaxCrossEntropy")),nn(s.shape,i.shape,"Error in softmaxCrossEntropy: "),r>0){let c=ge(r),u=ge(1),h=ge(s.shape[1]);s=se(P(s,Ae(u,c)),me(c,h))}let l=fE(s,i);return sa(l,o,a)}var AE=O({softmaxCrossEntropy_:mE}),yE={fft:tc,ifft:yl,rfft:nc,irfft:Dd},gE={hammingWindow:pC,hannWindow:Fx,frame:$x,stft:yC},ze={flipLeftRight:bC,resizeNearestNeighbor:Wx,resizeBilinear:Lx,rotateWithOffset:vC,cropAndResize:xC,nonMaxSuppression:IC,nonMaxSuppressionAsync:FC,nonMaxSuppressionWithScore:DC,nonMaxSuppressionWithScoreAsync:zC,nonMaxSuppressionPadded:LC,nonMaxSuppressionPaddedAsync:BC,transform:HC},Vx={bandPart:qC,gramSchmidt:KC,qr:YC},xE={absoluteDifference:eE,computeWeightedLoss:sa,cosineDistance:nE,hingeLoss:aE,huberLoss:iE,logLoss:lE,meanSquaredError:cE,sigmoidCrossEntropy:pE,softmaxCrossEntropy:AE},ia=class extends H5{minimize(e,t=!1,n){let{value:r,grads:a}=this.computeGradients(e,n);if(n!=null){let s=n.map(i=>({name:i.name,tensor:a[i.name]}));this.applyGradients(s)}else this.applyGradients(a);return ve(a),t?r:(r.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return px(e,t)}dispose(){this.iterations_!=null&&ve(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:ge(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(ia,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var jd=class extends ia{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:z(()=>je(r).variable(a))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;z(()=>{let l=se(P(i,this.rho),P(it(s),1-this.rho)),c=P(me(Jt(se(o,this.epsilon)),Jt(se(i,this.epsilon))),s),u=se(P(o,this.rho),P(it(c),1-this.rho));i.assign(l),o.assign(u);let h=se(P(c,-this.learningRate),r);r.assign(h)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(ve(this.accumulatedGrads.map(e=>e.variable)),ve(this.accumulatedUpdates.map(e=>e.variable)))}async getWeights(){let e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=e.length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.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)}};jd.className="Adadelta";Ea(jd);var Hd=class extends ia{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulatedGrads[n]==null){let i=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:z(()=>Gu(r.shape,this.initialAccumulatorValue).variable(i))}}let a=Array.isArray(e)?e[n].tensor:e[t];if(a==null)return;let s=this.accumulatedGrads[n].variable;z(()=>{let i=se(s,it(a));s.assign(i);let o=se(P(me(a,Jt(se(i,$.backend.epsilon()))),-this.learningRate),r);r.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&ve(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);let t=!1;this.accumulatedGrads=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};Hd.className="Adagrad";Ea(Hd);var Gd=class extends ia{constructor(e,t,n,r=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],z(()=>{this.accBeta1=ge(t).variable(),this.accBeta2=ge(n).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=Ae(1,this.accBeta1),r=Ae(1,this.accBeta2);t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:z(()=>je(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${a}/v`,variable:z(()=>je(i).variable(o))});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedSecondMoment[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=se(P(u,this.beta2),P(it(l),1-this.beta2)),p=me(h,n),f=me(d,r);c.assign(h),u.assign(d);let m=se(P(me(p,se(Jt(f),this.epsilon)),-this.learningRate),i);i.assign(m)}),this.accBeta1.assign(P(this.accBeta1,this.beta1)),this.accBeta2.assign(P(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&ve(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&ve(this.accumulatedSecondMoment.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e),z(()=>{this.accBeta1.assign(aa(this.beta1,this.iterations_+1)),this.accBeta2.assign(aa(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.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)}};Gd.className="Adam";Ea(Gd);var qd=class extends ia{constructor(e,t,n,r=null,a=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=a,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],z(()=>{this.iteration=ge(0).variable(),this.accBeta1=ge(t).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=Ae(1,this.accBeta1),r=me(-this.learningRate,se(P(this.iteration,this.decay),1));t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:je(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${a}/v`,variable:je(i).variable(o)});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedWeightedInfNorm[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=P(u,this.beta2),p=Dt(l),f=Dr(d,p);c.assign(h),u.assign(f);let m=se(P(me(r,n),me(h,se(f,this.epsilon))),i);i.assign(m)}),this.iteration.assign(se(this.iteration,1)),this.accBeta1.assign(P(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&ve(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&ve(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)}};qd.className="Adamax";Ea(qd);var rc=class extends ia{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=Array.isArray(e)?e[n].tensor:e[t];if(r==null)return;let a=$.registeredVariables[t];z(()=>{let s=se(P(this.c,r),a);a.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=Ut(ge(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(e=await this.extractIterations(e),e.length!==0)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}};rc.className="SGD";Ea(rc);var Xd=class extends rc{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=ge(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulations[n]==null){let i=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(i))}}let a=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];s!=null&&z(()=>{let i,o=se(P(this.m,a),s);this.useNesterov?i=se(P(this.c,se(s,P(o,this.m))),r):i=se(P(this.c,o),r),a.assign(o),r.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&ve(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);let t=!1;this.accumulations=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}};Xd.className="Momentum";Ea(Xd);var Kd=class extends ia{constructor(e,t=.9,n=0,r=null,a=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=r,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=a,r==null&&(this.epsilon=$.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:z(()=>je(r).variable(a))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(a))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;z(()=>{let l=se(P(i,this.decay),P(it(s),1-this.decay));if(this.centered){let c=this.accumulatedMeanGrads[n].variable,u=se(P(c,this.decay),P(s,1-this.decay)),h=me(P(s,this.learningRate),Jt(Ae(l,se(it(u),this.epsilon)))),d=se(P(o,this.momentum),h);i.assign(l),c.assign(u),o.assign(d);let p=Ae(r,d);r.assign(p)}else{let c=se(P(i,this.decay),P(it(s),1-this.decay)),u=se(P(o,this.momentum),me(P(s,this.learningRate),Jt(se(c,this.epsilon))));i.assign(c),o.assign(u);let h=Ae(r,u);r.assign(h)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&ve(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&ve(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&ve(this.accumulatedMoments.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(r=>({originalName:r.name,variable:r.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)}};Kd.className="RMSProp";Ea(Kd);var pi=class{static sgd(e){return new rc(e)}static momentum(e,t,n=!1){return new Xd(e,t,n)}static rmsprop(e,t=.9,n=0,r=null,a=!1){return new Kd(e,t,n,r,a)}static adam(e=.001,t=.9,n=.999,r=null){return new Gd(e,t,n,r)}static adadelta(e=.001,t=.95,n=null){return new jd(e,t,n)}static adamax(e=.002,t=.9,n=.999,r=null,a=0){return new qd(e,t,n,r,a)}static adagrad(e,t=.1){return new Hd(e,t)}},fi={sgd:pi.sgd,momentum:pi.momentum,adadelta:pi.adadelta,adagrad:pi.adagrad,rmsprop:pi.rmsprop,adamax:pi.adamax,adam:pi.adam},wE=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function Zd(){return new Promise(e=>wE(()=>e()))}var R={};Oe(R,{ERF_A1:()=>RE,ERF_A2:()=>ME,ERF_A3:()=>FE,ERF_A4:()=>$E,ERF_A5:()=>DE,ERF_P:()=>EE,PARALLELIZE_THRESHOLD:()=>Em,SELU_SCALE:()=>jx,SELU_SCALEALPHA:()=>Ux,applyActivation:()=>Vd,assertAndGetBroadcastShape:()=>mt,assertAxesAreInnerMostDims:()=>nS,assertParamsConsistent:()=>bE,assignToTypedArray:()=>UE,axesAreInnerMostDims:()=>lm,calculateShapes:()=>F5,combineLocations:()=>mx,complexWithEvenIndex:()=>WE,complexWithOddIndex:()=>BE,computeConv2DInfo:()=>Bu,computeConv3DInfo:()=>J5,computeDefaultPad:()=>Zf,computeDilation2DInfo:()=>NI,computeOptimalWindowSize:()=>vE,computeOutAndReduceShapes:()=>Ax,computeOutShape:()=>_E,computePool2DInfo:()=>Y5,computePool3DInfo:()=>SI,convertConv2DDataFormat:()=>Z5,eitherStridesOrDilationsAreOne:()=>Fr,expandShapeToKeepDim:()=>hi,exponent:()=>HE,exponents:()=>jE,fromStringArrayToUint8:()=>XE,fromUint8ToStringArray:()=>qE,getAxesPermutation:()=>yx,getBroadcastDims:()=>gN,getComplexWithIndex:()=>VE,getFusedBiasGradient:()=>Bd,getFusedDyActivation:()=>Wd,getImageCenter:()=>kE,getInnerMostAxes:()=>rS,getPermuted:()=>NE,getReductionAxes:()=>Ot,getReshaped:()=>IE,getReshapedPermuted:()=>SE,getSliceBeginCoords:()=>TE,getSliceSize:()=>CE,getUndoAxesPermutation:()=>um,log:()=>zE,mergeRealAndImagArrays:()=>PE,prepareAndValidate:()=>M5,prepareSplitSize:()=>GE,segment_util:()=>Hx,shouldFuse:()=>Ud,slice_util:()=>ln,splitRealAndImagArrays:()=>LE,tupleValuesAreOne:()=>Ma,upcastType:()=>tr,validateInput:()=>Df,validateUpdateShape:()=>$f,warn:()=>OE});function bE(e,t){let n=e[0].length;e.forEach((a,s)=>{M(a.length===n,()=>`Error in concat${n}D: rank of tensors[${s}] must be the same as the rank of the rest (${n})`)}),M(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let r=e[0];e.forEach((a,s)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${s}] (${a}) does not match the shape of the rest (${r}) along the non-concatenated axis ${s}.`)})}function _E(e,t){let n=e[0].slice();for(let r=1;r=t*2+1||i%2==1?s.push(i):a.push(i);r.push(...a),r.push(0),r.push(...s)}return r}function SE(e,t,n,r=!0){let a=[];r?a.push(e[0]/n):a.push(e[0]*n);for(let s=1;s"Number of splits must evenly divide the axis."),r=new Array(t).fill(e.shape[n]/t);else{let a=t.reduce((i,o)=>(o===-1&&(i+=1),i),0);M(a<=1,()=>"There should be only one negative value in split array.");let s=t.indexOf(-1);if(s!==-1){let i=t.reduce((o,l)=>l>0?o+l:o);t[s]=e.shape[n]-i}M(e.shape[n]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),r=t}return r}var Hx={};Oe(Hx,{collectGatherOpShapeInfo:()=>YE,computeOutShape:()=>ZE,segOpComputeOptimalWindowSize:()=>KE});function KE(e,t){let n=!1,r;for(e<=Em?(r=e,n=!0):r=_h(e,Math.floor(Math.sqrt(e)));!n;)r>t||r===e?n=!0:r=_h(e,r+1);return r}function ZE(e,t,n){let r=[],a=e.length;for(let s=0;sa))throw new Error(`Expect batchDims in the range of [-${a}, ${a}], but got ${r}`);if(r<0&&(r+=a),r>s)throw new Error(`batchDims (${r}) must be less than rank(x) ( - ${s}).`);if(nad(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function XE(e){return e.map(t=>Ru(t))}var Pr={};Oe(Pr,{nonMaxSuppressionV3Impl:()=>Dx,nonMaxSuppressionV4Impl:()=>Ox,nonMaxSuppressionV5Impl:()=>zx,whereImpl:()=>Ix});function _e(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var JE=Pr.whereImpl,Yd=class extends uu{constructor(){super();this.blockSize=48,this.firstUse=!0,this.data=new wh(this,Mr())}nextDataId(){return Yd.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,J().get("IS_NODE")&&R.warn(` -============================ -Hi there \u{1F44B}. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details. -============================`));let r={id:this.nextDataId()};return this.data.set(r,{values:e,dtype:n,refCount:1}),r}makeTensorInfo(e,t,n){let r;if(t==="string"&&n!=null&&n.length>0&&v.isString(n[0])){let a=n.map(s=>v.encodeString(s));r=this.write(a,e,t)}else r=this.write(n,e,t);return{dataId:r,shape:e,dtype:t}}refCount(e){return this.data.has(e)?this.data.get(e).refCount:0}incRef(e){let t=this.data.get(e);t.refCount++}decRef(e){if(this.data.has(e)){let t=this.data.get(e);t.refCount--}}move(e,t,n,r,a){this.data.set(e,{values:t,dtype:r,refCount:a})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:n}=this.data.get(e);if(t==="complex64"){let r=this.readSync(n.real.dataId),a=this.readSync(n.imag.dataId);return R.mergeRealAndImagArrays(r,a)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId),n=t;if(e.dtype==="string")try{n=t.map(r=>v.decodeString(r))}catch(r){throw new Error("Failed to decode encoded string bytes into utf-8")}return We(e.shape,e.dtype,n)}makeOutput(e,t,n){let r=this.write(e,t,n);return Mr().makeTensorFromDataId(r,t,n,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;let{complexTensorInfos:n}=this.data.get(e);n!=null&&(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){let t=v.now();return e(),{kernelMs:v.now()-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){_e([e],"where");let t=this.readSync(e.dataId);return JE(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};Yd.nextDataId=0;var Rm={};Oe(Rm,{addImpl:()=>qx,bincountImpl:()=>Mm,bincountReduceImpl:()=>Xx,ceilImpl:()=>Kx,concatImpl:()=>Fm,expImpl:()=>Zx,expm1Impl:()=>Yx,floorImpl:()=>Jx,gatherV2Impl:()=>Qx,greaterImpl:()=>ew,lessImpl:()=>tw,linSpaceImpl:()=>nw,logImpl:()=>rw,maxImpl:()=>aw,maximumImpl:()=>sw,minimumImpl:()=>iw,multiplyImpl:()=>$m,negImpl:()=>ow,notEqualImpl:()=>lw,prodImpl:()=>uw,rangeImpl:()=>Om,rsqrtImpl:()=>cw,simpleAbsImpl:()=>Gx,sliceImpl:()=>Jd,squaredDifferenceImpl:()=>hw,stridedSliceImpl:()=>dw,subImpl:()=>pw,tileImpl:()=>fw,topKImpl:()=>mw,transposeImpl:()=>Dm,uniqueImpl:()=>Aw});function Gx(e){let t=new Float32Array(e.length);for(let n=0;n{let{x:t}=e.inputs,n=e.backend;_e(t,"abs");let r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId).values;return r=Gx(a),n.makeOutput(r,t.shape,"float32")},eR={kernelName:Yi,backendName:"cpu",kernelFunc:QE};function Et(e){return(t,n,r,a,s)=>{let i=R.assertAndGetBroadcastShape(t,n),o=i.length,l=v.computeStrides(i),c=v.sizeFromShape(i),u=v.getTypedArrayFromDType(s,c),h=t.length,d=n.length,p=v.computeStrides(t),f=v.computeStrides(n),m=R.getBroadcastDims(t,i),A=R.getBroadcastDims(n,i);if(m.length+A.length===0)for(let y=0;yw[N]=0);let b=v.locToIndex(w,h,p),_=g.slice(-d);A.forEach(N=>_[N]=0);let x=v.locToIndex(_,d,f);u[y]=e(r[b],a[x])}return[u,i]}}function Dn(e){let{inputs:t,backend:n}=e,{real:r,imag:a}=t,s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,o=n.makeTensorInfo(r.shape,"complex64"),l=n.data.get(o.dataId);return l.complexTensorInfos={real:n.makeTensorInfo(r.shape,"float32",s),imag:n.makeTensorInfo(a.shape,"float32",i)},o}var tR={kernelName:Ch,backendName:"cpu",kernelFunc:Dn};function Qd(e,t,n="float32"){if(n==="complex64"){let a=Qd(e,t,"float32"),s=Qd(e,t,"float32");return Dn({inputs:{real:a,imag:s},backend:e})}let r=v.makeZerosTypedArray(v.sizeFromShape(t),n);return e.makeTensorInfo(t,n,r)}function Lr(e){let{inputs:t,backend:n}=e,{x:r}=t;return n.incRef(r.dataId),{dataId:r.dataId,shape:r.shape,dtype:r.dtype}}var nR={kernelName:vs,backendName:"cpu",kernelFunc:Lr};function mi(e){let{inputs:t,backend:n}=e,{input:r}=t,a=n.data.get(r.dataId).complexTensorInfos.real,s=n.data.get(a.dataId).values;return n.makeTensorInfo(a.shape,a.dtype,s)}var rR={kernelName:Kh,backendName:"cpu",kernelFunc:mi};function Pa(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dtype:s}=r;if(s==="complex64"){if(a.dtype==="complex64")return Lr({inputs:{x:a},backend:n});let i=Qd(n,a.shape,a.dtype),o=Pa({inputs:{x:a},backend:n,attrs:{dtype:"float32"}}),l=Dn({inputs:{real:o,imag:i},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}if(a.dtype==="complex64"){let i=mi({inputs:{input:a},backend:n}),o=Pa({inputs:{x:i},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(i),o}if(!v.hasEncodingLoss(a.dtype,s)){let i=Lr({inputs:{x:a},backend:n});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(s==="int32"){let i=n.data.get(a.dataId).values,o=Int32Array.from(i);return n.makeTensorInfo(a.shape,"int32",o)}if(s==="bool"){let i=n.data.get(a.dataId).values,o=v.toTypedArray([0],a.dtype),[l,c]=Et((u,h)=>u!==h?1:0)(a.shape,[],i,o,"bool");return n.makeTensorInfo(c,"bool",l)}throw new Error(`Error in Cast: failed to cast ${a.dtype} to ${s}`)}var aR={kernelName:cs,backendName:"cpu",kernelFunc:Pa};function jt(e,t,n,r){return n==null?({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;_e([i,o],e);let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}:({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let c=Pa({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),u=l.data.get(c.dataId),h=u.complexTensorInfos.real,d=u.complexTensorInfos.imag,p=l.data.get(h.dataId).values,f=l.data.get(d.dataId).values,m=Pa({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),A=l.data.get(m.dataId),y=A.complexTensorInfos.real,g=A.complexTensorInfos.imag,w=l.data.get(y.dataId).values,b=l.data.get(g.dataId).values,[_,x,N]=n(i.shape,o.shape,p,f,w,b),T=l.makeTensorInfo(N,"float32",_),C=l.makeTensorInfo(N,"float32",x),F=Dn({inputs:{real:T,imag:C},backend:l});return l.disposeIntermediateTensorInfo(c),l.disposeIntermediateTensorInfo(m),l.disposeIntermediateTensorInfo(T),l.disposeIntermediateTensorInfo(C),F}else{let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}}}function zm(e){return(t,n,r,a,s,i)=>{let o=R.assertAndGetBroadcastShape(t,n),l=v.sizeFromShape(o),c=o.length,u=v.computeStrides(o),h=v.getTypedArrayFromDType("float32",l),d=v.getTypedArrayFromDType("float32",l),p=R.getBroadcastDims(t,o),f=R.getBroadcastDims(n,o),m=R.mergeRealAndImagArrays(r,a),A=R.mergeRealAndImagArrays(s,i),y=t.length,g=v.computeStrides(t),w=n.length,b=v.computeStrides(n);if(p.length+f.length===0)for(let _=0;_N[L]=0);let T=v.locToIndex(N,y,g),C=x.slice(-w);f.forEach(L=>C[L]=0);let F=v.locToIndex(C,w,b),D=e(m[T*2],m[T*2+1],A[F*2],A[F*2+1]);h[_]=D.real,d[_]=D.imag}return[h,d,o]}}var qx=Et((e,t)=>e+t),sR=zm((e,t,n,r)=>({real:e+n,imag:t+r})),ac=jt(va,qx,sR),iR={kernelName:va,backendName:"cpu",kernelFunc:ac};function Mm(e,t,n,r,a){let s=v.sizeFromShape(r),i=v.makeZerosTypedArray(a,n);for(let o=0;o=a||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function Xx(e,t,n,r=!1){let a=e.shape[0],s=e.shape[1],i=We([a,n],t.dtype);for(let o=0;o=n||(r?i.set(1,o,c):t.size>0?i.set(i.get(o,c)+t.get(o,l),o,c):i.set(i.get(o,c)+1,o,c))}return i}function wl(e){return(t,n,r)=>{let a=v.getTypedArrayFromDType(n,t.length);for(let s=0;s{let{x:i}=r;if(_e(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=v.sizeFromShape(i.shape),u=n||i.dtype,h=v.getArrayFromDType(u,c);for(let d=0;d{let{x:i}=r;if(_e(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=n||i.dtype,u=t(l,c,a);return o.makeTensorInfo(i.shape,c,u)}}var Kx=wl(e=>Math.ceil(e)),oR=bl(hs,Kx),lR={kernelName:hs,backendName:"cpu",kernelFunc:oR};function Fm(e,t,n,r){let a=v.getArrayFromDType(n,v.sizeFromShape(t));if(r&&n!=="string"){let s=0;e.forEach(i=>{let o=v.sizeFromShape(i.shape);a.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=n==="string"?R.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let c=0;cMath.exp(e)),yw=bl(gs,Zx),uR={kernelName:gs,backendName:"cpu",kernelFunc:yw},Yx=wl(e=>Math.expm1(e)),cR=bl(fo,Yx),hR={kernelName:fo,backendName:"cpu",kernelFunc:cR},Jx=wl(e=>Math.floor(e)),dR=bl(xs,Jx),pR={kernelName:xs,backendName:"cpu",kernelFunc:dR};function Qx(e,t,n){let r=We(n,e.dtype);for(let a=0;ae>t?1:0),fR=jt(go,ew,null,"bool"),mR={kernelName:go,backendName:"cpu",kernelFunc:fR},tw=Et((e,t)=>eMath.log(e)),gR=bl(Is,rw),xR={kernelName:Is,backendName:"cpu",kernelFunc:gR};function aw(e,t,n,r){let a=v.getTypedArrayFromDType(r,v.sizeFromShape(n));for(let s=0;so&&(o=c)}a[s]=o}return a}var sw=Et((e,t)=>Math.max(e,t)),wR=jt(Ss,sw),bR={kernelName:Ss,backendName:"cpu",kernelFunc:wR},iw=Et((e,t)=>Math.min(e,t)),_R=jt(Rs,iw),vR={kernelName:Rs,backendName:"cpu",kernelFunc:_R},$m=Et((e,t)=>e*t),kR=zm((e,t,n,r)=>({real:e*n-t*r,imag:e*r+t*n})),Pm=jt(Ms,$m,kR),IR={kernelName:Ms,backendName:"cpu",kernelFunc:Pm};function ow(e,t,n){let r=v.createScalarValue(-1,n);return $m([],t,r,e,n)}function NR(e){let{inputs:t,backend:n}=e,{x:r}=t;_e(r,"neg");let a=n.data.get(r.dataId).values,[s,i]=ow(a,r.shape,r.dtype);return n.makeTensorInfo(i,r.dtype,s)}var SR={kernelName:So,backendName:"cpu",kernelFunc:NR},lw=Et((e,t)=>e!==t?1:0),TR=jt(To,lw,null,"bool"),CR={kernelName:To,backendName:"cpu",kernelFunc:TR};function Dm(e,t,n,r,a){let s=t.length,i=v.sizeFromShape(t),o=v.computeStrides(t),l=v.computeStrides(a),c=v.getTypedArrayFromDType(n,v.sizeFromShape(a));for(let u=0;un.disposeIntermediateTensorInfo(g)),n.makeTensorInfo(y,A,f)}var MR={kernelName:$o,backendName:"cpu",kernelFunc:RR};function Om(e,t,n,r){let a=e===t,s=e1;if(a||s||i)return v.makeZerosTypedArray(0,r);let o=Math.abs(Math.ceil((t-e)/n)),l=v.makeZerosTypedArray(o,r);t1/Math.sqrt(e)),FR=bl(Vs,cw),$R={kernelName:Vs,backendName:"cpu",kernelFunc:FR};function Jd(e,t,n,r,a){let s=ln.isSliceContinous(r,t,n),i=v.sizeFromShape(n),o=v.computeStrides(r);if(s){let h=ln.computeFlatOffset(t,o);return a==="string"?e.slice(h,h+i):e.subarray(h,h+i)}let l=a==="string"?R.fromUint8ToStringArray(e):e,c=We(r,a,l),u=We(n,a);for(let h=0;hf+t[m]);u.set(c.get(...p),...d)}return a==="string"?R.fromStringArrayToUint8(u.values):u.values}function Ai(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,size:i}=r;_e(a,"slice");let[o,l]=ln.parseSliceParams(a,s,i);ln.assertParamsValid(a,o,l);let c=n.data.get(a.dataId).values,u=Jd(c,o,l,a.shape,a.dtype);return n.makeTensorInfo(l,a.dtype,u)}var DR={kernelName:Wo,backendName:"cpu",kernelFunc:Ai},hw=Et((e,t)=>{let n=e-t;return n*n}),OR=jt(Xs,hw),zR={kernelName:Xs,backendName:"cpu",kernelFunc:OR};function dw(e,t,n,r){let a=We(e,t.dtype);for(let s=0;se-t),PR=zm((e,t,n,r)=>({real:e-n,imag:t-r})),Lm=jt(Ks,pw,PR),LR={kernelName:Ks,backendName:"cpu",kernelFunc:Lm};function fw(e,t){let n=new Array(e.rank);for(let a=0;aw.value-g.value);let m=h*r,A=l.subarray(m,m+r),y=c.subarray(m,m+r);for(let g=0;g{for(let A=0;Anew Yd,1);var xw=at(uo,e=>e>=0?e:Math.exp(e)-1),WR={kernelName:uo,backendName:"cpu",kernelFunc:xw};function ww(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{alpha:s}=r;_e([a],"leakyRelu");let i=v.sizeFromShape(a.shape),o=n.data.get(a.dataId).values,l=v.getTypedArrayFromDType("float32",i);for(let c=0;ce<0?t*e:e);function bw(e){let{inputs:t,backend:n}=e,{x:r,alpha:a}=t;_e([r,a],"prelu");let s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,[o,l]=VR(r.shape,a.shape,s,i,r.dtype);return n.makeTensorInfo(l,r.dtype,o)}var UR={kernelName:Os,backendName:"cpu",kernelFunc:bw},_w=at(zs,e=>Math.max(0,e)),jR={kernelName:zs,backendName:"cpu",kernelFunc:_w},vw=at(Ls,e=>Math.min(Math.max(0,e),6)),HR={kernelName:Ls,backendName:"cpu",kernelFunc:vw};function Wm(e,t,n,r,a){if(n==="linear")return Lr({inputs:{x:t},backend:e});if(n==="relu")return _w({inputs:{x:t},backend:e});if(n==="elu")return xw({inputs:{x:t},backend:e});if(n==="relu6")return vw({inputs:{x:t},backend:e});if(n==="prelu")return bw({inputs:{x:t,alpha:r},backend:e});if(n==="leakyrelu")return ww({inputs:{x:t},backend:e,attrs:{alpha:a}});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function At(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{shape:s}=r,i=v.sizeFromShape(a.shape),o=v.inferFromImplicitShape(s,i),l=v.sizeFromShape(o);v.assert(i===l,()=>`The new shape (${o}) has ${l} elements and the old shape (${a.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`),n.incRef(a.dataId);let c=n.data.get(a.dataId);if(c.complexTensorInfos!=null){let u=c.complexTensorInfos.real,h=c.complexTensorInfos.imag;u.shape=o,h.shape=o}return{dataId:a.dataId,shape:o,dtype:a.dtype}}var GR={kernelName:Oo,backendName:"cpu",kernelFunc:At};function kw(e){let{inputs:t,backend:n,attrs:r}=e,{a,b:s}=t,{transposeA:i,transposeB:o}=r;_e([a,s],"matMul");let l=a.shape.length,c=s.shape.length,u=i?a.shape[l-2]:a.shape[l-1],h=o?s.shape[c-1]:s.shape[c-2],d=i?a.shape[l-1]:a.shape[l-2],p=o?s.shape[c-2]:s.shape[c-1],f=a.shape.slice(0,-2),m=s.shape.slice(0,-2),A=v.sizeFromShape(f),y=v.sizeFromShape(m),g=A===y||A===1||y===1;v.assert(l>=2&&c>=2&&g,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${f}) and (${m}).`);let w=(A>y?a.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,p]);v.assert(u===h,()=>`Error in matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${a.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let b=i?[A,u,d]:[A,d,u],_=o?[y,p,h]:[y,h,p],x=At({inputs:{x:a},backend:n,attrs:{shape:b}}),N=At({inputs:{x:s},backend:n,attrs:{shape:_}}),T=i?x.shape[1]:x.shape[2],C=i?x.shape[2]:x.shape[1],F=o?N.shape[1]:N.shape[2],D=Math.max(A,y),L=n.data.get(x.dataId).values,V=n.data.get(N.dataId).values,U=v.computeStrides(x.shape),j=v.computeStrides(N.shape),[X,G,ee]=i?[U[0],1,U[1]]:[U[0],U[1],1],[Y,ae,te]=o?[1,j[1],j[0]]:[j[1],1,j[0]],oe=C*F,Q=We([D,C,F],x.dtype),he=Q.values,le=n.blockSize;for(let fe=0;feMath.acos(e)),YR={kernelName:Ji,backendName:"cpu",kernelFunc:ZR},JR=at(Qi,e=>Math.acosh(e)),QR={kernelName:Qi,backendName:"cpu",kernelFunc:JR};function eM(e){let{inputs:t,backend:n}=e,r=t;_e(t,"addN");let a=r.map(o=>n.data.get(o.dataId).values),s=We(r[0].shape,r[0].dtype),i=s.values;for(let o=0;og&&(g=_,w=b)}p[A]=w}return c.forEach(A=>n.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var oM={kernelName:os,backendName:"cpu",kernelFunc:iM};function lM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s}=r;_e(a,"argMin");let i=v.parseAxisParam(s,a.shape),o=R.getAxesPermutation(i,a.shape.length),l=a,c=[];o!=null&&(l=sr({inputs:{x:a},backend:n,attrs:{perm:o}}),c.push(l),i=R.getInnerMostAxes(i.length,l.shape.length)),i=[i[0]],R.assertAxesAreInnerMostDims("argMin",i,l.shape.length);let[u,h]=R.computeOutAndReduceShapes(l.shape,i),d=v.sizeFromShape(u),p=v.makeZerosTypedArray(d,"int32"),f=v.sizeFromShape(h),m=n.data.get(l.dataId).values;for(let A=0;An.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var uM={kernelName:du,backendName:"cpu",kernelFunc:lM},cM=at(eo,e=>Math.asin(e)),hM={kernelName:eo,backendName:"cpu",kernelFunc:cM},dM=at(to,e=>Math.asinh(e)),pM={kernelName:to,backendName:"cpu",kernelFunc:dM},fM=at(no,e=>Math.atan(e)),mM={kernelName:no,backendName:"cpu",kernelFunc:fM},AM=Et((e,t)=>Math.atan2(e,t)),yM=jt(ao,AM),gM={kernelName:ao,backendName:"cpu",kernelFunc:yM},xM=at(ro,e=>Math.atanh(e)),wM={kernelName:ro,backendName:"cpu",kernelFunc:xM};function Bm(e,t,n,r,a,s){let i=a.strideHeight,o=a.strideWidth,l=a.dilationHeight,c=a.dilationWidth,u=a.effectiveFilterHeight,h=a.effectiveFilterWidth,d=a.padInfo.top,p=a.padInfo.left,f=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=We(a.outShape,n),A=m.values,y=a.outShape[1]*a.outShape[2]*a.outShape[3],g=a.outShape[2]*a.outShape[3],w=a.outShape[3];for(let b=0;bG?G=le:s==="avg"&&(ee+=le,Y++)}if(isNaN(G))break}let ae=L+V*w+N;A[ae]=s==="avg"?ee/Y:G}}}return m}function Iw(e,t,n,r,a=!1,s=!1){let i=We(r.outShape,"int32"),o=r.strideHeight,l=r.strideWidth,c=r.dilationHeight,u=r.dilationWidth,h=r.effectiveFilterHeight,d=r.effectiveFilterWidth,p=r.padInfo.top,f=r.padInfo.left,m=We(t,n,e);for(let A=0;AF&&(F=X,a?D=s?((A*r.inHeight+L)*r.inWidth+U)*r.inChannels+y:(L*r.inWidth+U)*r.inChannels+y:D=V*d+j)}}i.set(D,A,g,x,y)}}return i}function Nw(e,t,n,r,a,s){let i=a.strideDepth,o=a.strideHeight,l=a.strideWidth,c=a.dilationDepth,u=a.dilationHeight,h=a.dilationWidth,d=a.effectiveFilterDepth,p=a.effectiveFilterHeight,f=a.effectiveFilterWidth,m=a.padInfo.front,A=a.padInfo.top,y=a.padInfo.left,g=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,w=We(a.outShape,n),b=w.values,_=a.outShape[1]*a.outShape[2]*a.outShape[3]*a.outShape[4],x=a.outShape[2]*a.outShape[3]*a.outShape[4],N=a.outShape[3]*a.outShape[4],T=a.outShape[4];for(let C=0;Cke?ke=Be:s==="avg"&&(Se+=Be,Me++),isNaN(ke))break}if(isNaN(ke))break}if(isNaN(ke))break}let De=pe+L;b[De]=s==="avg"?Se/Me:ke}}}}return w}function bM(e,t){let n=We(t.outShape,"int32"),r=t.strideDepth,a=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,c=t.effectiveFilterDepth,u=t.effectiveFilterHeight,h=t.effectiveFilterWidth,d=t.padInfo.front,p=t.padInfo.top,f=t.padInfo.left;for(let m=0;m=V&&(V=te,U=X*u*h+ee*u+ae)}}}n.set(U,m,y,_,C,A)}}}return n}function _M(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t;_e(a,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=r,c=1;v.assert(R.eitherStridesOrDilationsAreOne(i,c),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Lr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Bm(d,a.shape,a.dtype,p,u,"avg");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var vM={kernelName:ls,backendName:"cpu",kernelFunc:_M};function kM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;_e(a,"avgPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Nw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"avg");return n.makeTensorInfo(d.shape,"float32",d.values)}var IM={kernelName:pu,backendName:"cpu",kernelFunc:kM};function NM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;_e([a,s],"avgPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=u.strideDepth,d=u.strideHeight,p=u.strideWidth,f=u.filterDepth,m=u.filterHeight,A=u.filterWidth,y=u.dilationDepth,g=u.dilationHeight,w=u.dilationWidth,b=u.effectiveFilterDepth,_=u.effectiveFilterHeight,x=u.effectiveFilterWidth,N=b-1-u.padInfo.front,T=x-1-u.padInfo.left,C=_-1-u.padInfo.top,F=We(s.shape,"float32"),D=1/(f*m*A),L=n.bufferSync(a);for(let V=0;V=u.outDepth||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(Y+he)/d;if(!(le<0||le>=u.outHeight||Math.floor(le)!==le))for(let fe=0;fe=u.outWidth||Math.floor(pe)!==pe||(te+=L.get(V,Q,le,pe,U))}}}F.set(te*D,V,j,X,G,U)}return n.makeTensorInfo(F.shape,F.dtype,F.values)}var SM={kernelName:Sh,backendName:"cpu",kernelFunc:NM};function TM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,i=s;_e([a,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:c}=r,u=R.computePool2DInfo(i.shape,o,l,1,c),h=u.strideHeight,d=u.strideWidth,p=u.filterHeight,f=u.filterWidth,m=u.dilationHeight,A=u.dilationWidth,y=u.effectiveFilterHeight,g=u.effectiveFilterWidth,w=g-1-u.padInfo.left,b=y-1-u.padInfo.top,_=We(i.shape,"float32"),x=1/(p*f),N=n.data.get(a.dataId).values,T=We(a.shape,"float32",N);for(let C=0;C=u.outHeight||Math.floor(G)!==G))for(let ee=0;ee=u.outWidth||Math.floor(Y)!==Y||(j+=T.get(C,G,Y,F))}}_.set(j*x,C,D,L,F)}return n.makeTensorInfo(_.shape,_.dtype,_.values)}var CM={kernelName:Nh,backendName:"cpu",kernelFunc:TM};function EM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,scale:s,offset:i,mean:o,variance:l}=t;v.assert(o.shape.length===l.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),v.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),v.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),_e([a,o,l,s,i],"batchNorm");let{varianceEpsilon:c}=r;c==null&&(c=.001);let u=n.data.get(a.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]),f=i?n.data.get(i.dataId).values:new Float32Array([0]),m=new Float32Array(u.length),A=f.length,y=p.length,g=d.length,w=h.length,b=0,_=0,x=0,N=0;for(let T=0;T=A&&(b=0),_>=w&&(_=0),x>=y&&(x=0),N>=g&&(N=0);return n.makeTensorInfo(a.shape,a.dtype,m)}var RM={kernelName:bs,backendName:"cpu",kernelFunc:EM};function MM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{blockShape:s,crops:i}=r;_e([a],"batchToSpaceND");let o=s.reduce((y,g)=>y*g),l=R.getReshaped(a.shape,s,o),c=R.getPermuted(l.length,s.length),u=R.getReshapedPermuted(a.shape,s,o),h=R.getSliceBeginCoords(i,s.length),d=R.getSliceSize(u,i,s.length),p=At({inputs:{x:a},backend:n,attrs:{shape:l}}),f=sr({inputs:{x:p},backend:n,attrs:{perm:c}}),m=At({inputs:{x:f},backend:n,attrs:{shape:u}}),A=Ai({inputs:{x:m},backend:n,attrs:{begin:h,size:d}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var FM={kernelName:fu,backendName:"cpu",kernelFunc:MM};function $M(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,weights:s}=t,{size:i}=r,o=n.data.get(a.dataId).values,l=n.data.get(s.dataId).values,c=Mm(o,l,s.dtype,s.shape,i);return n.makeTensorInfo([i],s.dtype,c)}var DM={kernelName:Th,backendName:"cpu",kernelFunc:$M},OM=at(ka,(e,t)=>{let n=t;return e>n.clipValueMax?n.clipValueMax:e{let{x:t}=e.inputs,n=e.backend,r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId),s=a.complexTensorInfos.real,i=a.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(i.dataId).values;for(let c=0;cm.shape),s);if(v.sizeFromShape(i)===0)return n.makeTensorInfo(i,t[0].dtype,[]);let o=t.filter(m=>v.sizeFromShape(m.shape)>0);if(o.length===1)return Lr({inputs:{x:o[0]},backend:n});let l=o.map(m=>m.shape);if(R.assertParamsConsistent(l,s),o[0].dtype==="complex64"){let m=o.map(b=>mi({inputs:{input:b},backend:n})),A=o.map(b=>_l({inputs:{input:b},backend:n})),y=vl({inputs:m,backend:n,attrs:{axis:s}}),g=vl({inputs:A,backend:n,attrs:{axis:s}}),w=Dn({inputs:{real:y,imag:g},backend:n});return m.forEach(b=>n.disposeIntermediateTensorInfo(b)),A.forEach(b=>n.disposeIntermediateTensorInfo(b)),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(g),w}let c=o.map(m=>{let A=v.sizeFromShape(m.shape.slice(s));return At({inputs:{x:m},backend:n,attrs:{shape:[-1,A]}})}),u=c.map(m=>({vals:n.data.get(m.dataId).values,shape:m.shape}));i=R.computeOutShape(c.map(m=>m.shape),1);let h=c[0].shape[0]===1,d=Fm(u,i,t[0].dtype,h),p=R.computeOutShape(o.map(m=>m.shape),s),f=n.makeTensorInfo(p,t[0].dtype,d);return c.forEach(m=>n.disposeIntermediateTensorInfo(m)),f}var BM={kernelName:so,backendName:"cpu",kernelFunc:vl};function Sw(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:c,dimRoundingMode:u}=r;_e([a,s],"conv2d");let h=R.convertConv2DDataFormat(l),d=R.computeConv2DInfo(a.shape,s.shape,i,c,o,u,!1,h),p=d.filterHeight,f=d.filterWidth,m=d.dilationHeight,A=d.dilationWidth,y=d.padInfo.left,g=d.padInfo.top,w=d.dataFormat==="channelsLast",b=new $t(d.outShape,a.dtype),_=v.computeStrides(a.shape),x=v.computeStrides(s.shape),N=_[0],T=w?_[1]:_[2],C=w?_[2]:1,F=w?1:_[1],D=b.strides[0],L=w?b.strides[1]:b.strides[2],V=w?b.strides[2]:1,U=w?1:b.strides[1],j=n.data.get(a.dataId).values,X=n.data.get(s.dataId).values,G=b.values;for(let ee=0;ee=d.inHeight)continue;let fe=he*x[0],pe=Y+le*T;for(let ke=0;ke=d.inWidth)continue;let Qe=fe+De*x[1],et=pe+Fe*C,st=Qe;for(let Ke=0;Ke=c.inDepth)continue;let ee=X*C[0],Y=D+G*T[1];for(let ae=0;ae=c.inHeight)continue;let le=ee+Q*C[1],fe=Y+he*T[2];for(let pe=0;pe=c.inWidth)continue;let Fe=le+Me*C[2],Qe=fe+De*c.inChannels,et=Fe;for(let st=0;stMath.cos(e)),eF={kernelName:fs,backendName:"cpu",kernelFunc:QM},tF=at(io,e=>Math.cosh(e)),nF={kernelName:io,backendName:"cpu",kernelFunc:tF};function rF(e){let{inputs:t,backend:n,attrs:r}=e,{image:a,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:c}=r,[u,h,d,p]=a.shape,f=s.shape[0],[m,A]=o,y=We([f,m,A,p],"float32"),g=n.data.get(s.dataId).values,w=n.data.get(i.dataId).values,b=n.data.get(a.dataId).values,_=v.computeStrides(a.shape),x=v.computeStrides(y.shape);for(let N=0;N=u)continue;let U=m>1?(D-C)*(h-1)/(m-1):0,j=A>1?(L-F)*(d-1)/(A-1):0;for(let X=0;X1?C*(h-1)+X*U:.5*(C+D)*(h-1);if(G<0||G>h-1){for(let ee=0;ee1?F*(d-1)+te*j:.5*(F+L)*(d-1);if(oe<0||oe>d-1){for(let fe=0;fe1?F*(d-1)+ee*j:.5*(F+L)*(d-1);if(Y<0||Y>d-1){for(let oe=0;oey+f-g-1:(y,g)=>y+g;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`),v.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=a.shape[0],l=a.shape[1],c=a.shape[2],u=a.shape[3],h=l*s,d=c*s,p=u/(s*s),f=n.data.get(a.dataId).values,m=new Float32Array(o*h*d*p),A=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${d}'`);let p=R.computeConv2DInfo(a.shape,s.shape,i,d,o,c,!0),{filterHeight:f,filterWidth:m,dilationHeight:A,dilationWidth:y,padInfo:g}=p,w=g.left,b=g.top,_=p.outChannels/p.inChannels,x=new $t(p.outShape,a.dtype),N=n.data.get(a.dataId).values,T=n.data.get(s.dataId).values,C=x.values;for(let F=0;F=p.inHeight)continue;let ee=X*h[0],Y=D+G*u[1];for(let ae=0;ae=p.inWidth)continue;let le=ee+Q*h[1],fe=Y+he*p.inChannels,pe=te,ke=le;for(let Se=0;Se{let{x:r,filter:a}=e,{strides:s,pad:i,dilations:o}=n,l=t,c=l.data.get(r.dataId).values,u=r.shape.length,h=l.data.get(a.dataId).values,d=a.shape.length,{batchSize:p,inHeight:f,inWidth:m,inChannels:A,outHeight:y,outWidth:g,padInfo:w,strideHeight:b,strideWidth:_,filterHeight:x,filterWidth:N,dilationHeight:T,dilationWidth:C,outShape:F}=R.computeDilation2DInfo(r.shape,a.shape,s,i,"NHWC",o),D=v.sizeFromShape(F),L=F.length,V=v.getArrayFromDType(r.dtype,D);for(let U=0;U=0&&Q=0&&leae&&(ae=ke)}}}let te=v.locToIndex([U,j,G,Y],L,v.computeStrides(F));V[te]=ae}}}return{dataId:l.write(v.toTypedArray(V,r.dtype),F,r.dtype),shape:F,dtype:r.dtype}}},xF={kernelName:Ph,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${Ph}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),D=v.makeZerosNestedTypedArray(a.shape,a.dtype);for(let L=0;L=0&&oe=0&&heee&&(ee=le,Y=te,ae=Q)}}}D[Y][ae][G]+=F[L][V][j][G]}}}return{dataId:c.write(v.toTypedArray(D,r.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}},wF={kernelName:zh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${zh}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),D=v.makeZerosNestedTypedArray(r.shape,r.dtype);for(let L=0;L=0&&oe=0&&heee&&(ee=le,Y=oe,ae=he)}}}D[L][Y][ae][G]+=F[L][V][j][G]}}}return{dataId:c.write(v.toTypedArray(D,r.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}};function bF(e){let{inputs:t,backend:n}=e,{dy:r,y:a}=t;_e([r,a],"eluGrad");let s=new Float32Array(v.sizeFromShape(a.shape)),i=n.data.get(a.dataId).values,o=n.data.get(r.dataId).values;for(let l=0;l=1?s[l]=o[l]:s[l]=o[l]*(c+1)}return n.makeTensorInfo(a.shape,"float32",s)}var _F={kernelName:Lh,backendName:"cpu",kernelFunc:bF},vF=Et((e,t)=>e===t?1:0),Cw=jt(ho,vF,null,"bool"),kF={kernelName:ho,backendName:"cpu",kernelFunc:Cw},IF=R.ERF_P,NF=R.ERF_A1,SF=R.ERF_A2,TF=R.ERF_A3,CF=R.ERF_A4,EF=R.ERF_A5,RF=at(co,e=>{let t=Math.sign(e),n=Math.abs(e),r=1/(1+IF*n);return t*(1-((((EF*r+CF)*r+TF)*r+SF)*r+NF)*r*Math.exp(-n*n))}),MF={kernelName:co,backendName:"cpu",kernelFunc:RF};function ep(e){let{inputs:t,backend:n,attrs:r}=e,{input:a}=t,{dim:s}=r,i=a.shape.length,o=a.shape.slice(),l=s;return s<0&&(v.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),At({inputs:{x:a},backend:n,attrs:{shape:o}})}var FF={kernelName:po,backendName:"cpu",kernelFunc:ep},$F=Et((e,t)=>e/t),Vm=jt(ys,$F),Um={kernelName:ys,backendName:"cpu",kernelFunc:Vm};function Ew(e,t,n){let r=e.shape,a=r[0],s=r[1],i=n.data.get(e.dataId),o=i.complexTensorInfos.real,l=i.complexTensorInfos.imag,c=[a,s],u=v.sizeFromShape(c),h=v.getTypedArrayFromDType("float32",u),d=v.getTypedArrayFromDType("float32",u);for(let A=0;A{let{image:r}=e,a=n,s=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[i,o,l,c]=r.shape,u=a.data.get(r.dataId).values;for(let h=0;h=0&&wMath.floor(e/t)),jF=jt(ws,UF,null,"int32"),HF={kernelName:ws,backendName:"cpu",kernelFunc:jF};function GF(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Sw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=ac({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Wm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var qF={kernelName:Qs,backendName:"cpu",kernelFunc:GF};function XF(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Tw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=ac({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Wm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var KF={kernelName:ei,backendName:"cpu",kernelFunc:XF};function ZF(e){let{inputs:t,backend:n}=e,{params:r,indices:a}=t,s=v.sizeFromShape(r.shape),i=a.shape,o=i[i.length-1],[l,c,u,h]=R.prepareAndValidate(r,a);if(c===0)return n.makeTensorInfo(l,r.dtype,[]);let d=We([c,u],r.dtype),p=n.data.get(a.dataId).values,f=n.data.get(r.dataId).values;for(let m=0;m=s/u)throw new Error(`Invalid indices: ${A} does not index into ${r.shape}`);for(let g=0;ge>=t?1:0),t$=jt(_s,e$,null,"bool"),n$={kernelName:_s,backendName:"cpu",kernelFunc:t$};function r$(e){let{inputs:t,backend:n}=e,{input:r}=t,a=v.sizeFromShape(r.shape),s=r.shape[r.shape.length-1],i=a/s,o=At({inputs:{x:r},backend:n,attrs:{shape:[i,s]}}),l=Ew(o,!0,n),c=At({inputs:{x:l},backend:n,attrs:{shape:r.shape}});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(l),c}var a$={kernelName:Bh,backendName:"cpu",kernelFunc:r$},s$=at(xo,e=>Number.isFinite(e)?1:0,"bool"),i$={kernelName:xo,backendName:"cpu",kernelFunc:s$},o$=at(wo,e=>Math.abs(e)===Infinity?1:0,"bool"),l$={kernelName:wo,backendName:"cpu",kernelFunc:o$},u$=at(bo,e=>Number.isNaN(e)?1:0,"bool"),c$={kernelName:bo,backendName:"cpu",kernelFunc:u$},h$=Et((e,t)=>e<=t?1:0),d$=jt(vo,h$,null,"bool"),p$={kernelName:vo,backendName:"cpu",kernelFunc:d$};function f$(e){let{backend:t,attrs:n}=e,{start:r,stop:a,num:s}=n,i=nw(r,a,s);return t.makeTensorInfo([i.length],"float32",i)}var m$={kernelName:Uh,backendName:"cpu",kernelFunc:f$},A$=at(ko,e=>Math.log1p(e)),y$={kernelName:ko,backendName:"cpu",kernelFunc:A$},g$=Et((e,t)=>e&&t),x$=jt(Io,g$,null,"bool"),w$={kernelName:Io,backendName:"cpu",kernelFunc:x$},b$=at(xu,e=>e?0:1,"bool"),_$={kernelName:xu,backendName:"cpu",kernelFunc:b$},v$=Et((e,t)=>e||t),k$=jt(wu,v$,null,"bool"),I$={kernelName:wu,backendName:"cpu",kernelFunc:k$};function N$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=r;_e(a,"LRN");let c=a.shape[3],u=c-1,h=n.data.get(a.dataId).values,d=v.sizeFromShape(a.shape),p=new Float32Array(d);function f(m){let A=m%c,y=m-A+Math.max(0,A-s),g=m-A+Math.min(A+s,u),w=0;for(;y<=g;y++){let b=h[y];w+=b*b}return w}for(let m=0;m`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Lr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Bm(d,a.shape,a.dtype,p,u,"max");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var M$={kernelName:Ts,backendName:"cpu",kernelFunc:R$};function F$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;_e(a,"maxPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Nw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"max");return n.makeTensorInfo(d.shape,"float32",d.values)}var $$={kernelName:_u,backendName:"cpu",kernelFunc:F$};function D$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;_e([a,s],"maxPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=n.bufferSync(s),d=bM(h,u),p=u.strideDepth,f=u.strideHeight,m=u.strideWidth,A=u.dilationDepth,y=u.dilationHeight,g=u.dilationWidth,w=u.effectiveFilterDepth,b=u.effectiveFilterHeight,_=u.effectiveFilterWidth,x=w-1-u.padInfo.front,N=_-1-u.padInfo.left,T=b-1-u.padInfo.top,C=We(s.shape,"float32"),F=n.bufferSync(a);for(let D=0;D=u.outDepth||Math.floor(te)!==te))for(let oe=0;oe=u.outHeight||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(ee+he)/m;if(le<0||le>=u.outWidth||Math.floor(le)!==le)continue;let fe=w*b*_-1-d.get(D,te,Q,le,L),pe=ae*b*_+oe*_+he,ke=fe===pe?1:0;ke!==0&&(Y+=F.get(D,te,Q,le,L)*ke)}}}C.set(Y,D,V,U,j,L)}return n.makeTensorInfo(C.shape,C.dtype,C.values)}var O$={kernelName:Gh,backendName:"cpu",kernelFunc:D$};function z$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s,output:i}=t,o=s;_e([s,i],"maxPoolGrad");let{filterSize:l,strides:c,pad:u,dimRoundingMode:h}=r,d=R.computePool2DInfo(o.shape,l,c,1,u,h),p=n.data.get(o.dataId).values,f=We(d.outShape,o.dtype,Iw(p,o.shape,o.dtype,d).values),m=d.strideHeight,A=d.strideWidth,y=d.dilationHeight,g=d.dilationWidth,w=d.effectiveFilterHeight,b=d.effectiveFilterWidth,_=b-1-d.padInfo.left,x=w-1-d.padInfo.top,N=We(o.shape,"float32"),T=n.data.get(a.dataId).values,C=We(a.shape,"float32",T);for(let F=0;F=d.outHeight||Math.floor(ee)!==ee))for(let Y=0;Y=d.outWidth||Math.floor(ae)!==ae)continue;let te=w*b-1-f.get(F,ee,ae,D),oe=G*b+Y,Q=te===oe?1:0;Q!==0&&(X+=C.get(F,ee,ae,D)*Q)}}N.set(X,F,L,V,D)}return n.makeTensorInfo(N.shape,N.dtype,N.values)}var P$={kernelName:Hh,backendName:"cpu",kernelFunc:z$};function L$(e,t,n,r,a){let s=v.computeStrides(t),i=Bm(e,t,n,s,a,"max"),o=Iw(e,t,n,a,!0,r);return[i.values,o.values]}var W$={kernelName:qh,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{x:r}=e,{filterSize:a,strides:s,pad:i,includeBatchInIndex:o}=t,l=n;_e(r,"MaxPoolWithArgmax");let c=l.data.get(r.dataId).values,u=R.computePool2DInfo(r.shape,a,s,[1,1],i),[h,d]=L$(c,r.shape,r.dtype,o,u),p=l.write(h,u.outShape,r.dtype),f=l.write(d,u.outShape,r.dtype);return[{dataId:p,shape:u.outShape,dtype:r.dtype},{dataId:f,shape:u.outShape,dtype:"int32"}]}};function tp(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;_e(a,"sum");let o;a.dtype==="bool"?o=Pa({inputs:{x:a},backend:n,attrs:{dtype:"int32"}}):o=Lr({inputs:{x:a},backend:n});let l=o.shape.length,c=v.parseAxisParam(s,o.shape),u=R.getAxesPermutation(c,l),h=c,d=o;u!=null&&(d=sr({inputs:{x:o},backend:n,attrs:{perm:u}}),h=R.getInnerMostAxes(h.length,l)),R.assertAxesAreInnerMostDims("sum",h,d.shape.length);let[p,f]=R.computeOutAndReduceShapes(d.shape,h),m=R.upcastType(d.dtype,"int32"),A=Qd(n,p,m),y=v.sizeFromShape(f),g=n.data.get(A.dataId).values,w=n.data.get(d.dataId).values;for(let b=0;bn.disposeIntermediateTensorInfo(m)),f}var U$={kernelName:Cs,backendName:"cpu",kernelFunc:V$};function j$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;_e(a,"min");let o=v.parseAxisParam(s,a.shape),l=o,c=R.getAxesPermutation(l,a.shape.length),u=a;c!=null&&(u=sr({inputs:{x:a},backend:n,attrs:{perm:c}}),l=R.getInnerMostAxes(l.length,a.shape.length)),R.assertAxesAreInnerMostDims("min",l,u.shape.length);let[h,d]=R.computeOutAndReduceShapes(u.shape,l),p=v.sizeFromShape(d),f=v.makeZerosTypedArray(v.sizeFromShape(h),u.dtype),m=n.data.get(u.dataId).values;for(let y=0;yg[0]+a.shape[w]+g[1]),l=s.map(g=>g[0]),c=s.map((g,w)=>g[0]+a.shape[w]),u=i==="reflect"?0:1,h=n.data.get(a.dataId).values,d=a.shape.length,p=v.computeStrides(a.shape),f=v.sizeFromShape(o),m=o.length,A=v.computeStrides(o),y=v.getTypedArrayFromDType(a.dtype,f);for(let g=0;g=c[_]&&(w[_]=(c[_]-1)*2-w[_]+u);w=w.map((_,x)=>_-l[x]);let b=v.locToIndex(w,d,p);y[g]=h[b]}return{dataId:n.write(y,o,a.dtype),shape:o,dtype:a.dtype}}var q$={kernelName:vu,backendName:"cpu",kernelFunc:G$},X$=Et((e,t)=>{let n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t}),K$=jt(No,X$),Z$={kernelName:No,backendName:"cpu",kernelFunc:K$},Y$=Xi(Bg());function Mw(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{dim:s}=r,i=a.shape.length,o=s;if(o===-1&&(o=i-1),o!==i-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${i} and dim was ${o}`);let l=v.parseAxisParam([o],a.shape),c=Rw({inputs:{x:a},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),u=R.expandShapeToKeepDim(c.shape,l),h=At({inputs:{x:c},backend:n,attrs:{shape:u}}),d=Lm({inputs:{a,b:h},backend:n}),p=yw({inputs:{x:d},backend:n}),f=tp({inputs:{x:p},backend:n,attrs:{axis:l,keepDims:!1}}),m=At({inputs:{x:f},backend:n,attrs:{shape:u}}),A=Vm({inputs:{a:p,b:m},backend:n});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var J$={kernelName:qs,backendName:"cpu",kernelFunc:Mw};function Q$(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{numSamples:s,seed:i,normalized:o}=r;_e(a,"multinomial");let l=o?a:Mw({inputs:{logits:a},backend:n,attrs:{dim:-1}}),c=l.shape[0],u=l.shape[1],h=n.data.get(l.dataId).values,d=[c,s],p=v.makeZerosTypedArray(v.sizeFromShape(d),"int32");for(let f=0;f=0&&u[h]{v.assertShapesMatch(s,u.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===u.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(u=>{let h=ep({inputs:{input:u},backend:n,attrs:{dim:a}});return o.push(h),h}),c=vl({inputs:l,backend:n,attrs:{axis:a}});return o.forEach(u=>n.disposeIntermediateTensorInfo(u)),c}var fD={kernelName:Fo,backendName:"cpu",kernelFunc:$w};function mD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{paddings:s,constantValue:i}=r;_e(a,"pad");let o=s.map((y,g)=>y[0]+a.shape[g]+y[1]),l=s.map(y=>y[0]),c=n.data.get(a.dataId).values,u=v.sizeFromShape(a.shape),h=a.shape.length,d=v.computeStrides(a.shape),p=v.sizeFromShape(o),f=o.length,m=v.computeStrides(o),A=v.getTypedArrayFromDType(a.dtype,p);i!==0&&A.fill(i);for(let y=0;yb+l[_]),w=v.locToIndex(g,f,m);A[w]=c[y]}return{dataId:n.write(A,o,a.dtype),shape:o,dtype:a.dtype}}var Dw={kernelName:$s,backendName:"cpu",kernelFunc:mD},AD=Et((e,t)=>Math.pow(e,t)),yD=jt(Ds,AD),gD={kernelName:Ds,backendName:"cpu",kernelFunc:yD};function xD(e){let{backend:t,attrs:n}=e,{start:r,stop:a,dtype:s,step:i}=n,o=Om(r,a,i,s);return t.makeTensorInfo([o.length],s,o)}var wD={kernelName:ku,backendName:"cpu",kernelFunc:xD},bD=at(Do,e=>1/e),_D={kernelName:Do,backendName:"cpu",kernelFunc:bD};function vD(e){let{inputs:t,backend:n,attrs:r}=e,{images:a}=t,{alignCorners:s,halfPixelCenters:i,size:o}=r;_e(a,"resizeBilinear");let l=v.computeStrides(a.shape),[c,u]=o,[h,d,p,f]=a.shape,m=n.data.get(a.dataId).values,A=new Float32Array(v.sizeFromShape([h,c,u,f])),y=[s&&c>1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=0,b=y[0]/g[0],_=y[1]/g[1];for(let x=0;x1?c-1:c,i&&p>1?u-1:u],A=[i&&d>1?d-1:d,i&&p>1?p-1:p],y=m[0]/A[0],g=m[1]/A[1],w=n.data.get(s.dataId).values,b=0;for(let _=0;_1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=y[0]/g[0],b=y[1]/g[1],_=0;for(let x=0;x1?u-1:u,i&&f>1?h-1:h],g=[i&&p>1?p-1:p,i&&f>1?f-1:f],w=y[0]/g[0],b=y[1]/g[1],_=1/w,x=1/b,N=Math.ceil(_)*2+2,T=Math.ceil(x)*2+2;for(let C=0;C=p)continue;let Q=F+oe*l[1],he=oe*w,le=Math.min(u-1,i?Math.round(he):Math.floor(he));if(D===le)for(let fe=0;fe=f)continue;let ke=Q+pe*l[2],Se=pe*b,Me=Math.min(h-1,i?Math.round(Se):Math.floor(Se));j===Me&&(ae+=A[ke+Y])}}m[X+Y]=ae}}}}return n.makeTensorInfo(a.shape,a.dtype,m)}var ED={kernelName:Zh,backendName:"cpu",kernelFunc:CD};function RD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dims:s}=r;_e(a,"reverse");let i=a.shape.length,o=v.parseAxisParam(s,a.shape);if(i===0)return Lr({inputs:{x:a},backend:n});let l=new $t(a.shape,a.dtype),c=n.bufferSync(a);for(let u=0;ud[p]=a.shape[p]-1-d[p]),l.set(c.get(...d),...h)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}var MD={kernelName:Ws,backendName:"cpu",kernelFunc:RD},FD={kernelName:Zo,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{image:r}=e,{radians:a,fillValue:s,center:i}=t,o=n,l=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[c,u,h,d]=r.shape,[p,f]=R.getImageCenter(i,u,h),m=255,A=Math.sin(a),y=Math.cos(a),g=o.data.get(r.dataId).values;for(let w=0;w=0&&V=0&&U{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1}),DD={kernelName:Bs,backendName:"cpu",kernelFunc:$D};function Ow(e,t,n,r,a,s,i,o,l,c){let u=[r/a,a],h=e.values,d=t.values;if(r===0)return We(n,t.dtype);let p=We(u,t.dtype);p.values.fill(l);for(let f=0;f=r/a)throw new Error(`Invalid indices: ${m} does not index into ${n}`);for(let y=0;y1||a.shape.length===1?1:v.sizeFromShape(a.shape.slice(1));for(let f=0;fe>=0?BD*e:WD*(Math.exp(e)-1)),UD={kernelName:Lo,backendName:"cpu",kernelFunc:VD},jD=at(js,e=>1/(1+Math.exp(-e))),HD={kernelName:js,backendName:"cpu",kernelFunc:jD},GD=at(Vo,e=>e<0?-1:e>0?1:0),qD={kernelName:Vo,backendName:"cpu",kernelFunc:GD},XD=at(Us,e=>Math.sin(e)),KD={kernelName:Us,backendName:"cpu",kernelFunc:XD},ZD=at(Bo,e=>Math.sinh(e)),YD={kernelName:Bo,backendName:"cpu",kernelFunc:ZD},JD=11920928955078125e-23,zw=Math.log(JD)+2,QD=at(Uo,e=>{let t=e>-zw,n=e{let d=[...u];d[o]=h;let p=Ai({inputs:{x:a},backend:n,attrs:{begin:c,size:d}});return c[o]+=h,p})}var iO={kernelName:jo,backendName:"cpu",kernelFunc:sO},oO=at(Hs,e=>Math.sqrt(e)),lO={kernelName:Hs,backendName:"cpu",kernelFunc:oO},uO={kernelName:Su,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:n}=e,r=t;_e(n,"square");let a=r.data.get(n.dataId).values,s=new Float32Array(a.length);for(let i=0;i{let n=t;return isNaN(e)?NaN:e>0?1:n.alpha}),hO={kernelName:Na,backendName:"cpu",kernelFunc:cO};function dO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:c,ellipsisMask:u,newAxisMask:h,shrinkAxisMask:d}=r;_e(a,"stridedSlice");let{nonStrided:p,$begin:f,$strides:m,size:A,newShape:y,outShape:g}=ln.sliceInfo(a.shape,s,i,o,l,c,u,h,d),w=At({inputs:{x:a},backend:n,attrs:{shape:y}}),b;if(p){let x=Ai({inputs:{x:w},backend:n,attrs:{begin:f,size:A}});b=At({inputs:{x},backend:n,attrs:{shape:g}}),n.disposeIntermediateTensorInfo(x)}else if(g.some(x=>x===0))b=n.makeTensorInfo(g,a.dtype,[]);else{let x=n.bufferSync(w),N=dw(g,x,m,f);b=n.makeTensorInfo(N.shape,N.dtype,N.values)}let _=At({inputs:{x:b},backend:n,attrs:{shape:g}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(b),_}var pO={kernelName:Ho,backendName:"cpu",kernelFunc:dO},fO=at(Go,e=>Math.tan(e)),mO={kernelName:Go,backendName:"cpu",kernelFunc:fO},AO=at(Zs,e=>Math.tanh(e)),yO={kernelName:Zs,backendName:"cpu",kernelFunc:AO};function gO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{reps:s}=r;_e(a,"tile");let i=fw(n.bufferSync(a),s);return n.makeTensorInfo(i.shape,i.dtype,i.values)}var xO={kernelName:Ia,backendName:"cpu",kernelFunc:gO};function wO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{k:s,sorted:i}=r;_e(a,"topk");let o=n.data.get(a.dataId).values,[l,c]=mw(o,a.shape,a.dtype,s,i);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(c.shape,c.dtype,c.values)]}var bO={kernelName:qo,backendName:"cpu",kernelFunc:wO};function kO(e){let{inputs:t,attrs:n,backend:r}=e,{image:a,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:c}=n,[u,h,d,p]=a.shape,[f,m]=c!=null?c:[h,d],A=[u,f,m,p],y=v.computeStrides(a.shape),g=y[0],w=y[1],b=y[2],_=v.getTypedArrayFromDType(a.dtype,v.sizeFromShape(A));_.fill(l);let x=r.data.get(a.dataId).values,N=r.data.get(s.dataId).values;for(let T=0;Tt-1)if(t<=1)n=0;else{let r=2*t;n-=r*Math.trunc(n/r),n>=t&&(n=r-n-1)}return v.clamp(0,n,t-1)}function SO(e,t){let n=e;if(n<0)if(t<=1)n=0;else{let r=t-1;n+=t*(Math.trunc(-n/r)+1)}else if(n>t-1)if(t<=1)n=0;else{let r=t-1;n-=t*Math.trunc(n/r)}return v.clamp(0,n,t-1)}function TO(e,t){return e}function CO(e,t){return v.clamp(0,e,t-1)}function sc(e,t,n,r,a,s,i,o,l,c,u){let h=i*r+o*a+l*s+c;return 0<=o&&on.disposeIntermediateTensorInfo(f)),p}var DO={kernelName:Tu,backendName:"cpu",kernelFunc:$O},OO=[KR,eR,YR,QR,iR,tM,rM,sM,oM,uM,hM,pM,mM,gM,wM,vM,IM,SM,CM,qR,RM,FM,DM,aR,lR,zM,tR,LM,BM,jM,GM,VM,ZM,JM,XM,eF,nF,aF,iF,lF,cF,hF,pF,mF,yF,gF,wF,xF,Um,WR,_F,kF,MF,uR,FF,hR,LF,BF,VF,pR,HF,qF,KF,YF,QF,mR,n$,nR,a$,WM,i$,l$,c$,BR,yR,p$,m$,xR,y$,w$,_$,I$,S$,C$,bR,M$,$$,O$,P$,W$,E$,U$,H$,vR,q$,Z$,eD,IR,SR,rD,iD,uD,CR,hD,pD,fD,Dw,gD,UR,MR,wD,rR,_D,jR,HR,GR,kD,ND,TD,ED,MD,FD,DD,$R,zD,LD,UD,HD,qD,KD,YD,DR,J$,eO,nO,aO,iO,lO,uO,zR,hO,pO,LR,B$,mO,yO,xO,bO,ER,IO,RO,FO,DO,dD];for(let e of OO)ti(e);var Lw={};Oe(Lw,{assertNotComplex:()=>kl,bindCanvasToFramebuffer:()=>LO,bindColorTextureToFramebuffer:()=>ap,bindTextureToProgramUniformSampler:()=>eb,bindTextureUnit:()=>Yw,bindVertexBufferToProgramAttribute:()=>Gm,callAndCheck:()=>we,canBeRepresented:()=>Ww,createFragmentShader:()=>Uw,createFramebuffer:()=>Zw,createProgram:()=>jw,createStaticIndexBuffer:()=>qw,createStaticVertexBuffer:()=>Gw,createTexture:()=>Xw,createVertexShader:()=>Vw,getBatchDim:()=>yi,getExtensionOrThrow:()=>ic,getFramebufferErrorMessage:()=>tb,getMaxTexturesInShader:()=>ab,getNumChannels:()=>zO,getProgramUniformLocation:()=>Qw,getProgramUniformLocationOrThrow:()=>Jw,getRowsCols:()=>gi,getShapeAs3D:()=>sp,getTextureShapeFromLogicalShape:()=>nb,getWebGLDisjointQueryTimerVersion:()=>sb,getWebGLErrorMessage:()=>Bw,getWebGLMaxTextureSize:()=>rb,hasExtension:()=>qn,isCapableOfRenderingToFloatTexture:()=>ib,isDownloadFloatTextureEnabled:()=>ob,isReshapeFree:()=>lc,isWebGLFenceEnabled:()=>lb,isWebGLVersionEnabled:()=>Xm,linkProgram:()=>Hw,resetMaxTextureSize:()=>WO,resetMaxTexturesInShader:()=>BO,unbindColorTextureFromFramebuffer:()=>qm,unbindTextureUnit:()=>PO,validateFramebuffer:()=>oc,validateProgram:()=>rp,validateTextureSize:()=>Kw});var xi={},Km={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function ip(e,t){xi[e]=t}function Wr(e){if(!(e in xi)){let n=VO(e);if(n!==null)xi[e]=n;else return console.log("Could not get context for WebGL version",e),null}let t=xi[e];return t.isContextLost()?(delete xi[e],Wr(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),xi[e])}function UO(e){if(typeof OffscreenCanvas!="undefined"&&e===2)return new OffscreenCanvas(300,150);if(typeof document!="undefined")return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}function VO(e){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=UO(e);return t.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete xi[e]},!1),e===1?t.getContext("webgl",Km)||t.getContext("experimental-webgl",Km):t.getContext("webgl2",Km)}var uc;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(uc||(uc={}));var Xn;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(Xn||(Xn={}));var Qt;(function(e){e[e.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",e[e.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",e[e.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",e[e.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",e[e.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(Qt||(Qt={}));function cc(e,t){return[t,e]}function jO(e,t){return e*t}function hc(e){let t=v.sizeFromShape(e),n=Math.ceil(t/4);return v.sizeToSquarishShape(n)}function Il(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function HO(e,t){let[n,r]=Il(e,t);return n*r*4}function Zm(e,t){let n=e,r,a,s,i,o,l,c,u,h,d;return J().getNumber("WEBGL_VERSION")===2?(r=n.R32F,a=n.R16F,s=n.RGBA16F,i=n.RGBA32F,o=n.RED,c=4,u=1,h=n.HALF_FLOAT,d=n.FLOAT):(r=e.RGBA,a=e.RGBA,s=e.RGBA,i=n.RGBA,o=e.RGBA,c=4,u=4,h=t!=null?t.HALF_FLOAT_OES:null,d=e.FLOAT),l=e.RGBA,{internalFormatFloat:r,internalFormatHalfFloat:a,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:c,defaultNumChannels:u,textureTypeHalfFloat:h,textureTypeFloat:d}}function we(e,t){let n=t();return J().getBool("DEBUG")&&GO(e),n}function GO(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+Bw(e,t))}var qO=596e-10,XO=65504;function Ww(e){return!!(J().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||qOe.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function Vw(e,t){let n=oa(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(we(e,()=>e.shaderSource(n,t)),we(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function Uw(e,t){let n=oa(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(we(e,()=>e.shaderSource(n,t)),we(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw KO(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}var ZO=/ERROR: [0-9]+:([0-9]+):/g;function KO(e,t){let n=ZO.exec(t);if(n==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let r=+n[1],a=e.split(` -`),s=a.length.toString().length+2,i=a.map((h,d)=>v.rightPad((d+1).toString(),s)+h),o=0;for(let h=0;he.createProgram(),"Unable to create WebGLProgram.")}function Hw(e,t){if(we(e,()=>e.linkProgram(t)),e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function rp(e,t){if(we(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function Gw(e,t){let n=oa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return we(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),we(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function qw(e,t){let n=oa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return we(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n)),we(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function zO(){return J().getNumber("WEBGL_VERSION")===2?1:4}function Xw(e){return oa(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function Kw(e,t){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let r=`[${e}x${t}]`;throw new Error("Requested texture size "+r+" is invalid.")}if(e>n||t>n){let r=`[${e}x${t}]`,a=`[${n}x${n}]`;throw new Error("Requested texture size "+r+" greater than WebGL maximum on this browser / GPU "+a+".")}}function Zw(e){return oa(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function Gm(e,t,n,r,a,s,i){let o=e.getAttribLocation(t,n);return o===-1?!1:(we(e,()=>e.bindBuffer(e.ARRAY_BUFFER,r)),we(e,()=>e.vertexAttribPointer(o,a,e.FLOAT,!1,s,i)),we(e,()=>e.enableVertexAttribArray(o)),!0)}function Yw(e,t,n){ub(e,n),we(e,()=>e.activeTexture(e.TEXTURE0+n)),we(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function PO(e,t){ub(e,t),we(e,()=>e.activeTexture(e.TEXTURE0+t)),we(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function Jw(e,t,n){return oa(e,()=>e.getUniformLocation(t,n),'uniform "'+n+'" not present in program.')}function Qw(e,t,n){return e.getUniformLocation(t,n)}function eb(e,t,n,r){we(e,()=>Yw(e,t,r)),we(e,()=>e.uniform1i(n,r))}function LO(e){we(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),we(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),we(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function ap(e,t,n){we(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,n)),we(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function qm(e,t){we(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),we(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function oc(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+tb(e,t))}function tb(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}`}}function oa(e,t,n){let r=we(e,()=>t());if(r==null)throw new Error(n);return r}function ub(e,t){let n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=t+e.TEXTURE0;if(rn){let a=`[gl.TEXTURE0, gl.TEXTURE${n}]`;throw new Error(`textureUnit must be in ${a}.`)}}function yi(e,t=2){return v.sizeFromShape(e.slice(0,e.length-t))}function gi(e){if(e.length===0)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 sp(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[yi(e),...gi(e)]),t}function nb(e,t=!1){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");t&&(n=n*2,e=e.map((a,s)=>s>=e.length-2?v.nearestLargerEven(e[s]):e[s]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=v.squeezeShape(e).newShape);let r=v.sizeFromShape(e);if(e.length<=1&&r<=n)return[1,r];if(e.length===2&&e[0]<=n&&e[1]<=n)return e;if(e.length===3&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(e.length===3&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(e.length===4&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(e.length===4&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){let a=yi(e),s=2,i=2;return e.length&&([s,i]=gi(e)),r=a*(s/2)*(i/2),v.sizeToSquarishShape(r).map(o=>o*2)}return v.sizeToSquarishShape(r)}function op(e){return e%2==0}function lc(e,t){if(e=e.slice(-2),t=t.slice(-2),v.arraysEqual(e,t)||!e.length||!t.length||e[0]===0||e[1]===0||t[0]===0||t[1]===0)return!0;if(e.length!==t.length){let n=e.slice(-1)[0],r=t.slice(-1)[0];if(n===r||op(n)&&op(r)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&op(e[0])&&op(t[0])}var lp,up;function rb(e){if(lp==null){let t=Wr(e);lp=t.getParameter(t.MAX_TEXTURE_SIZE)}return lp}function WO(){lp=null}function BO(){up=null}function ab(e){if(up==null){let t=Wr(e);up=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,up)}function sb(e){if(e===0)return 0;let t,n=Wr(e);return qn(n,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:qn(n,"EXT_disjoint_timer_query")?t=1:t=0,t}function qn(e,t){return e.getExtension(t)!=null}function Xm(e){try{if(Wr(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function ib(e){if(e===0)return!1;let t=Wr(e);if(e===1){if(!qn(t,"OES_texture_float"))return!1}else if(!qn(t,"EXT_color_buffer_float"))return!1;return Ym(t)}function ob(e){if(e===0)return!1;let t=Wr(e);if(e===1){if(!qn(t,"OES_texture_float")||!qn(t,"WEBGL_color_buffer_float"))return!1}else{if(qn(t,"EXT_color_buffer_float"))return Ym(t);let n="EXT_color_buffer_half_float";if(qn(t,n)){let r=t.getExtension(n);return YO(t,r)}return!1}return Ym(t)}function Ym(e){let t=Zm(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let r=1,a=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,r,a,0,t.textureFormatFloat,t.textureTypeFloat,null);let s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let 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(s),i}function YO(e,t){let n=Zm(e,t),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);let a=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,a,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(r),e.deleteFramebuffer(i),o}function lb(e){return e!==2?!1:Wr(e).fenceSync!=null}function kl(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var Re=J();Re.registerFlag("HAS_WEBGL",()=>Re.getNumber("WEBGL_VERSION")>0);Re.registerFlag("WEBGL_VERSION",()=>Xm(2)?2:Xm(1)?1:0);Re.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);Re.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>Re.get("WEBGL_VERSION")===2);Re.registerFlag("WEBGL_CPU_FORWARD",()=>!0);Re.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);Re.registerFlag("WEBGL_PACK",()=>Re.getBool("HAS_WEBGL"));Re.registerFlag("WEBGL_PACK_NORMALIZATION",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_CLIP",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>!1);Re.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_REDUCE",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_LAZILY_UNPACK",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_CONV_IM2COL",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>rb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>ab(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=Re.getNumber("WEBGL_VERSION");return e===0?0:sb(e)});Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>Re.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!zu.isMobile());Re.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>ib(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>Re.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:Re.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));Re.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>ob(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_FENCE_API_ENABLED",()=>lb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>Re.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);Re.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)});Re.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>zu.isMobile()&&Re.getBool("IS_CHROME")?1:-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)});function hn(){let e,t,n,r,a,s,i,o,l,c;return J().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",n="out",r="in",a="texture",s="outputColor",i="out vec4 outputColor;",o=` +var __defProp = Object.defineProperty; +var __export = (target, all5) => { + for (var name in all5) + __defProp(target, name, {get: all5[name], enumerable: true}); +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; + +// src/helpers.ts +function log(...msg) { + const dt = new Date(); + const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; + if (msg) + console.log(ts, "Human:", ...msg); +} +var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); +}; +function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); +} + +// src/sysinfo.ts +function info() { + let platform; + let agent; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + platform = raw[0].match(/\(([^()]+)\)/g)[0].replace(/\(|\)/g, ""); + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return {platform, agent}; +} + +// dist/tfjs.esm.js +var tfjs_esm_exports = {}; +__export(tfjs_esm_exports, { + Abs: () => Abs, + Acos: () => Acos, + Acosh: () => Acosh, + AdadeltaOptimizer: () => AdadeltaOptimizer, + AdagradOptimizer: () => AdagradOptimizer, + AdamOptimizer: () => AdamOptimizer, + AdamaxOptimizer: () => AdamaxOptimizer, + Add: () => Add, + AddN: () => AddN, + All: () => All, + Any: () => Any, + ArgMax: () => ArgMax, + ArgMin: () => ArgMin, + Asin: () => Asin, + Asinh: () => Asinh, + Atan: () => Atan, + Atan2: () => Atan2, + Atanh: () => Atanh, + AvgPool: () => AvgPool, + AvgPool3D: () => AvgPool3D, + AvgPool3DGrad: () => AvgPool3DGrad, + AvgPoolGrad: () => AvgPoolGrad, + BackendWasm: () => BackendWasm, + BatchMatMul: () => BatchMatMul, + BatchToSpaceND: () => BatchToSpaceND, + Bincount: () => Bincount, + BroadcastTo: () => BroadcastTo, + Callback: () => Callback, + CallbackList: () => CallbackList, + Cast: () => Cast, + Ceil: () => Ceil, + ClipByValue: () => ClipByValue, + Complex: () => Complex, + ComplexAbs: () => ComplexAbs, + Concat: () => Concat, + Conv2D: () => Conv2D, + Conv2DBackpropFilter: () => Conv2DBackpropFilter, + Conv2DBackpropInput: () => Conv2DBackpropInput, + Conv3D: () => Conv3D, + Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, + Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, + Cos: () => Cos, + Cosh: () => Cosh, + CropAndResize: () => CropAndResize, + Cumsum: () => Cumsum, + CustomCallback: () => CustomCallback, + DataStorage: () => DataStorage, + DenseBincount: () => DenseBincount, + DepthToSpace: () => DepthToSpace, + DepthwiseConv2dNative: () => DepthwiseConv2dNative, + DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, + DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, + Diag: () => Diag, + Dilation2D: () => Dilation2D, + Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, + Dilation2DBackpropInput: () => Dilation2DBackpropInput, + ENV: () => ENV, + EarlyStopping: () => EarlyStopping, + Elu: () => Elu, + EluGrad: () => EluGrad, + Environment: () => Environment, + Equal: () => Equal, + Erf: () => Erf, + Exp: () => Exp, + ExpandDims: () => ExpandDims, + Expm1: () => Expm1, + FFT: () => FFT, + Fill: () => Fill, + FlipLeftRight: () => FlipLeftRight, + Floor: () => Floor, + FloorDiv: () => FloorDiv, + FromPixels: () => FromPixels, + FusedBatchNorm: () => FusedBatchNorm, + FusedConv2D: () => FusedConv2D, + FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, + GPGPUContext: () => GPGPUContext, + GatherNd: () => GatherNd, + GatherV2: () => GatherV2, + GraphModel: () => GraphModel, + Greater: () => Greater, + GreaterEqual: () => GreaterEqual, + History: () => History, + IFFT: () => IFFT, + Identity: () => Identity, + Imag: () => Imag, + InputSpec: () => InputSpec, + IsFinite: () => IsFinite, + IsInf: () => IsInf, + IsNan: () => IsNan, + KernelBackend: () => KernelBackend, + LRN: () => LRN, + LRNGrad: () => LRNGrad, + LayerVariable: () => LayerVariable, + LayersModel: () => LayersModel, + LeakyRelu: () => LeakyRelu, + Less: () => Less, + LessEqual: () => LessEqual, + LinSpace: () => LinSpace, + Log: () => Log, + Log1p: () => Log1p, + LogSoftmax: () => LogSoftmax, + LogicalAnd: () => LogicalAnd, + LogicalNot: () => LogicalNot, + LogicalOr: () => LogicalOr, + MathBackendCPU: () => MathBackendCPU, + MathBackendWebGL: () => MathBackendWebGL, + Max: () => Max, + MaxPool: () => MaxPool, + MaxPool3D: () => MaxPool3D, + MaxPool3DGrad: () => MaxPool3DGrad, + MaxPoolGrad: () => MaxPoolGrad, + MaxPoolWithArgmax: () => MaxPoolWithArgmax, + Maximum: () => Maximum, + Mean: () => Mean, + Min: () => Min, + Minimum: () => Minimum, + MirrorPad: () => MirrorPad, + Mod: () => Mod, + MomentumOptimizer: () => MomentumOptimizer, + Multinomial: () => Multinomial, + Multiply: () => Multiply, + Neg: () => Neg, + NonMaxSuppressionV3: () => NonMaxSuppressionV3, + NonMaxSuppressionV4: () => NonMaxSuppressionV4, + NonMaxSuppressionV5: () => NonMaxSuppressionV5, + NotEqual: () => NotEqual, + OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, + OneHot: () => OneHot, + OnesLike: () => OnesLike, + Optimizer: () => Optimizer, + Pack: () => Pack, + PadV2: () => PadV2, + Pool: () => Pool, + Pow: () => Pow, + Prelu: () => Prelu, + Prod: () => Prod, + RMSPropOptimizer: () => RMSPropOptimizer, + RNN: () => RNN, + Range: () => Range, + Rank: () => Rank, + Real: () => Real, + RealDiv: () => RealDiv, + Reciprocal: () => Reciprocal, + Reduction: () => Reduction, + Relu: () => Relu, + Relu6: () => Relu6, + Reshape: () => Reshape, + ResizeBilinear: () => ResizeBilinear, + ResizeBilinearGrad: () => ResizeBilinearGrad, + ResizeNearestNeighbor: () => ResizeNearestNeighbor, + ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, + Reverse: () => Reverse, + RotateWithOffset: () => RotateWithOffset, + Round: () => Round, + Rsqrt: () => Rsqrt, + SGDOptimizer: () => SGDOptimizer, + ScatterNd: () => ScatterNd, + Select: () => Select, + Selu: () => Selu, + Sequential: () => Sequential, + Sigmoid: () => Sigmoid, + Sign: () => Sign, + Sin: () => Sin, + Sinh: () => Sinh, + Slice: () => Slice, + Softmax: () => Softmax, + Softplus: () => Softplus, + SpaceToBatchND: () => SpaceToBatchND, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + Sub: () => Sub, + Sum: () => Sum, + SymbolicTensor: () => SymbolicTensor, + Tan: () => Tan, + Tanh: () => Tanh, + Tensor: () => Tensor, + TensorBuffer: () => TensorBuffer, + Tile: () => Tile, + TopK: () => TopK, + Transform: () => Transform, + Transpose: () => Transpose, + Unique: () => Unique, + Unpack: () => Unpack, + UnsortedSegmentSum: () => UnsortedSegmentSum, + Variable: () => Variable, + ZerosLike: () => ZerosLike, + _FusedMatMul: () => _FusedMatMul, + abs: () => abs, + acos: () => acos, + acosh: () => acosh, + add: () => add2, + addN: () => addN, + all: () => all, + any: () => any, + argMax: () => argMax, + argMin: () => argMin, + asin: () => asin, + asinh: () => asinh, + atan: () => atan, + atan2: () => atan2, + atanh: () => atanh, + avgPool: () => avgPool, + avgPool3d: () => avgPool3d, + backend: () => backend, + backend_util: () => backend_util_exports, + basicLSTMCell: () => basicLSTMCell, + batchNorm: () => batchNorm, + batchNorm2d: () => batchNorm2d, + batchNorm3d: () => batchNorm3d, + batchNorm4d: () => batchNorm4d, + batchToSpaceND: () => batchToSpaceND, + bincount: () => bincount, + booleanMaskAsync: () => booleanMaskAsync, + broadcastTo: () => broadcastTo, + browser: () => browser_exports, + buffer: () => buffer, + callbacks: () => callbacks, + cast: () => cast, + ceil: () => ceil, + clipByValue: () => clipByValue, + clone: () => clone, + complex: () => complex, + concat: () => concat, + concat1d: () => concat1d, + concat2d: () => concat2d, + concat3d: () => concat3d, + concat4d: () => concat4d, + constraints: () => exports_constraints_exports, + conv1d: () => conv1d, + conv2d: () => conv2d, + conv2dTranspose: () => conv2dTranspose, + conv3d: () => conv3d, + conv3dTranspose: () => conv3dTranspose, + copyRegisteredKernels: () => copyRegisteredKernels, + cos: () => cos, + cosh: () => cosh, + cosineWindow: () => cosineWindow, + cumsum: () => cumsum, + customGrad: () => customGrad, + data: () => dist_exports, + denseBincount: () => denseBincount, + deprecationWarn: () => deprecationWarn, + depthToSpace: () => depthToSpace, + depthwiseConv2d: () => depthwiseConv2d, + deregisterOp: () => deregisterOp, + device_util: () => device_util_exports, + diag: () => diag, + dilation2d: () => dilation2d, + disableDeprecationWarnings: () => disableDeprecationWarnings, + dispose: () => dispose, + disposeVariables: () => disposeVariables, + div: () => div, + divNoNan: () => divNoNan, + dot: () => dot, + dropout: () => dropout, + elu: () => elu, + enableDebugMode: () => enableDebugMode, + enableProdMode: () => enableProdMode, + enclosingPowerOfTwo: () => enclosingPowerOfTwo, + engine: () => engine, + env: () => env, + equal: () => equal, + erf: () => erf, + exp: () => exp, + expandDims: () => expandDims, + expm1: () => expm1, + eye: () => eye, + fft: () => fft, + fill: () => fill, + findBackend: () => findBackend, + findBackendFactory: () => findBackendFactory, + floor: () => floor, + floorDiv: () => floorDiv, + forceHalfFloat: () => forceHalfFloat, + fused: () => fused_ops_exports, + gather: () => gather, + gatherND: () => gatherND, + gather_util: () => gather_nd_util_exports, + getBackend: () => getBackend, + getGradient: () => getGradient, + getKernel: () => getKernel, + getKernelsForBackend: () => getKernelsForBackend, + gpgpu_util: () => gpgpu_util_exports, + grad: () => grad, + grads: () => grads, + greater: () => greater, + greaterEqual: () => greaterEqual, + ifft: () => ifft, + imag: () => imag, + image: () => image, + inTopKAsync: () => inTopKAsync, + initializers: () => exports_initializers_exports, + input: () => input, + io: () => io_exports, + irfft: () => irfft, + isFinite: () => isFinite2, + isInf: () => isInf, + isNaN: () => isNaN2, + keep: () => keep, + kernel_impls: () => kernel_impls_exports, + layers: () => exports_layers_exports, + leakyRelu: () => leakyRelu, + less: () => less, + lessEqual: () => lessEqual, + linalg: () => linalg, + linspace: () => linspace, + loadGraphModel: () => loadGraphModel, + loadLayersModel: () => loadLayersModel, + localResponseNormalization: () => localResponseNormalization, + log: () => log2, + log1p: () => log1p, + logSigmoid: () => logSigmoid, + logSoftmax: () => logSoftmax, + logSumExp: () => logSumExp, + logicalAnd: () => logicalAnd, + logicalNot: () => logicalNot, + logicalOr: () => logicalOr, + logicalXor: () => logicalXor, + losses: () => losses, + matMul: () => matMul, + math: () => math_exports, + max: () => max, + maxPool: () => maxPool, + maxPool3d: () => maxPool3d, + maxPoolWithArgmax: () => maxPoolWithArgmax, + maximum: () => maximum, + mean: () => mean, + memory: () => memory, + metrics: () => exports_metrics_exports, + min: () => min, + minimum: () => minimum, + mirrorPad: () => mirrorPad, + mod: () => mod, + model: () => model, + models: () => exports_models_exports, + moments: () => moments, + movingAverage: () => movingAverage, + mul: () => mul, + multiRNNCell: () => multiRNNCell, + multinomial: () => multinomial, + neg: () => neg, + nextFrame: () => nextFrame, + norm: () => norm, + notEqual: () => notEqual, + oneHot: () => oneHot, + ones: () => ones2, + onesLike: () => onesLike, + op: () => op, + outerProduct: () => outerProduct, + pad: () => pad, + pad1d: () => pad1d, + pad2d: () => pad2d, + pad3d: () => pad3d, + pad4d: () => pad4d, + pool: () => pool, + pow: () => pow, + prelu: () => prelu, + print: () => print2, + prod: () => prod, + profile: () => profile, + rand: () => rand, + randomGamma: () => randomGamma, + randomNormal: () => randomNormal, + randomUniform: () => randomUniform, + range: () => range, + ready: () => ready, + real: () => real, + reciprocal: () => reciprocal, + registerBackend: () => registerBackend, + registerCallbackConstructor: () => registerCallbackConstructor, + registerGradient: () => registerGradient, + registerKernel: () => registerKernel, + registerOp: () => registerOp, + regularizers: () => exports_regularizers_exports, + relu: () => relu, + relu6: () => relu6, + removeBackend: () => removeBackend, + reshape: () => reshape, + reverse: () => reverse, + reverse1d: () => reverse1d, + reverse2d: () => reverse2d, + reverse3d: () => reverse3d, + reverse4d: () => reverse4d, + rfft: () => rfft, + round: () => round2, + rsqrt: () => rsqrt, + scalar: () => scalar, + scatterND: () => scatterND, + scatter_util: () => scatter_nd_util_exports, + selu: () => selu, + separableConv2d: () => separableConv2d, + sequential: () => sequential, + serialization: () => serialization_exports, + setBackend: () => setBackend, + setPlatform: () => setPlatform, + setWasmPath: () => setWasmPath, + setWasmPaths: () => setWasmPaths, + setWebGLContext: () => setWebGLContext, + setdiff1dAsync: () => setdiff1dAsync, + shared: () => shared_exports, + sigmoid: () => sigmoid, + sign: () => sign, + signal: () => signal, + sin: () => sin, + sinh: () => sinh, + slice: () => slice, + slice1d: () => slice1d, + slice2d: () => slice2d, + slice3d: () => slice3d, + slice4d: () => slice4d, + slice_util: () => slice_util_exports, + softmax: () => softmax, + softplus: () => softplus, + spaceToBatchND: () => spaceToBatchND, + sparseToDense: () => sparseToDense, + spectral: () => spectral, + split: () => split, + sqrt: () => sqrt, + square: () => square, + squaredDifference: () => squaredDifference, + squeeze: () => squeeze, + stack: () => stack, + step: () => step, + stridedSlice: () => stridedSlice, + sub: () => sub, + sum: () => sum2, + sumOutType: () => sumOutType, + tan: () => tan, + tanh: () => tanh2, + tensor: () => tensor, + tensor1d: () => tensor1d, + tensor2d: () => tensor2d, + tensor3d: () => tensor3d, + tensor4d: () => tensor4d, + tensor5d: () => tensor5d, + tensor6d: () => tensor6d, + tensor_util: () => tensor_util_exports, + test_util: () => test_util_exports, + tidy: () => tidy, + tile: () => tile, + time: () => time, + topk: () => topk, + train: () => train, + transpose: () => transpose, + truncatedNormal: () => truncatedNormal, + unique: () => unique, + unregisterGradient: () => unregisterGradient, + unregisterKernel: () => unregisterKernel, + unsortedSegmentSum: () => unsortedSegmentSum, + unstack: () => unstack, + upcastType: () => upcastType, + util: () => util_exports, + valueAndGrad: () => valueAndGrad, + valueAndGrads: () => valueAndGrads, + variable: () => variable, + variableGrads: () => variableGrads, + version: () => version13, + version_converter: () => version11, + version_core: () => version6, + version_cpu: () => version7, + version_layers: () => version10, + version_wasm: () => version9, + version_webgl: () => version8, + webgl: () => webgl, + webgl_util: () => webgl_util_exports, + where: () => where, + whereAsync: () => whereAsync, + zeros: () => zeros, + zerosLike: () => zerosLike +}); +var __create = Object.create; +var __defProp2 = Object.defineProperty; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __markAsModule = (target) => __defProp2(target, "__esModule", {value: true}); +var __commonJS = (cb, mod42) => () => (mod42 || cb((mod42 = {exports: {}}).exports, mod42), mod42.exports); +var __export2 = (target, all42) => { + for (var name in all42) + __defProp2(target, name, {get: all42[name], enumerable: true}); +}; +var __exportStar = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp2(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable}); + } + return target; +}; +var __toModule = (module) => { + return __exportStar(__markAsModule(__defProp2(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); +}; +var require_browser = __commonJS(() => { +}); +var require_alea = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = data2.toString(); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor128 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorwow = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorshift7 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor4096 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_tychei = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_crypto = __commonJS(() => { +}); +var require_seedrandom = __commonJS((exports, module) => { + (function(pool3, math) { + var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + math["seed" + rngname] = seedrandom5; + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } + })([], Math); +}); +var require_seedrandom2 = __commonJS((exports, module) => { + var alea5 = require_alea(); + var xor128 = require_xor128(); + var xorwow = require_xorwow(); + var xorshift7 = require_xorshift7(); + var xor4096 = require_xor4096(); + var tychei = require_tychei(); + var sr = require_seedrandom(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; +}); +var require_path = __commonJS(() => { +}); +var require_worker_threads = __commonJS(() => { +}); +var require_perf_hooks = __commonJS(() => { +}); +var require_tfjs_backend_wasm_threaded_simd = __commonJS((exports, module) => { + var WasmBackendModuleThreadedSimd = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModuleThreadedSimd2) { + WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; + function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; + } + function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; + } + function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; + } + function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; + } + function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; + } + var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; + if (ENVIRONMENT_IS_PTHREAD) { + buffer2 = Module["buffer"]; + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + var nodeWorkerThreads; + try { + nodeWorkerThreads = require_worker_threads(); + } catch (e) { + console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); + throw e; + } + global.Worker = nodeWorkerThreads.Worker; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (typeof _scriptDir !== "undefined" && _scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + if (ENVIRONMENT_IS_NODE) { + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + } else { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + if (ENVIRONMENT_IS_NODE) { + if (typeof performance === "undefined") { + global.performance = require_perf_hooks().performance; + } + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var Atomics_load = Atomics.load; + var Atomics_store = Atomics.store; + var Atomics_compareExchange = Atomics.compareExchange; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var wasmModule; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function writeArrayToMemory(array2, buffer3) { + GROWABLE_HEAP_I8().set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer2 = Module["buffer"]; + } else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536, shared: true}); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } + } + if (wasmMemory) { + buffer2 = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer2.byteLength; + updateGlobalBufferAndViews(buffer2); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + if (ENVIRONMENT_IS_PTHREAD) + runtimeInitialized = true; + function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; + } + function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module2; + if (!ENVIRONMENT_IS_PTHREAD) { + var numWorkersToLoad = PThread.unusedWorkers.length; + PThread.unusedWorkers.forEach(function(w) { + PThread.loadWasmModuleToWorker(w, function() { + if (!--numWorkersToLoad) + removeRunDependency("wasm-instantiate"); + }); + }); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var ASM_CONSTS = {8991: function($0, $1) { + setTimeout(function() { + __emscripten_do_dispatch_to_thread($0, $1); + }, 0); + }}; + function initPthreadsJS() { + PThread.initRuntime(); + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _emscripten_futex_wake(addr, count2) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0) + return -28; + if (count2 == 0) + return 0; + if (count2 >= 2147483647) + count2 = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count2; + mainThreadWoken = 1; + if (count2 <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; + } + Module["_emscripten_futex_wake"] = _emscripten_futex_wake; + function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = void 0; + } + function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({cmd: "cancel"}); + } + function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + var worker = pthread.worker; + PThread.returnWorkerToPool(worker); + } + } + var PThread = {unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { + var pthreadPoolSize = 8; + for (var i = 0; i < pthreadPoolSize; ++i) { + PThread.allocateUnusedWorker(); + } + }, initRuntime: function() { + var tb = _malloc(228); + for (var i = 0; i < 228 / 4; ++i) + GROWABLE_HEAP_U32()[tb / 4 + i] = 0; + GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; + var headPtr = tb + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); + __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(tb); + }, initWorker: function() { + }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { + }, runExitHandlers: function() { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) + ___pthread_tsd_run_dtors(); + }, threadExit: function(exitCode) { + var tb = _pthread_self(); + if (tb) { + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); + PThread.runExitHandlers(); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exit"}); + } + } + }, threadCancel: function() { + PThread.runExitHandlers(); + var tb = _pthread_self(); + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, -1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + postMessage({cmd: "cancelDone"}); + }, terminateAllThreads: function() { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker = PThread.unusedWorkers[i]; + worker.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker = PThread.runningWorkers[i]; + var pthread = worker.pthread; + PThread.freeThreadData(pthread); + worker.terminate(); + } + PThread.runningWorkers = []; + }, freeThreadData: function(pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; + GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, returnWorkerToPool: function(worker) { + PThread.runWithoutMainThreadQueuedCalls(function() { + delete PThread.pthreads[worker.pthread.threadInfoStruct]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + PThread.freeThreadData(worker.pthread); + worker.pthread = void 0; + }); + }, runWithoutMainThreadQueuedCalls: function(func2) { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; + try { + func2(); + } finally { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; + } + }, receiveObjectTransfer: function(data2) { + }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { + worker.onmessage = function(e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker.pthread) + PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } else { + console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = void 0; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } else if (cmd === "spawnThread") { + spawnThread(e.data); + } else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } else if (cmd === "killThread") { + killThread(d["thread"]); + } else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } else if (cmd === "loaded") { + worker.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker); + if (worker.runPthread) { + worker.runPthread(); + delete worker.runPthread; + } + } else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "exit") { + var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); + if (detached) { + PThread.returnWorkerToPool(worker); + } + } else if (cmd === "exitProcess") { + try { + exit(d["returnCode"]); + } catch (e2) { + if (e2 instanceof ExitStatus) + return; + throw e2; + } + } else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker); + } else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } else if (e.data.target === "setimmediate") { + worker.postMessage(e.data); + } else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = void 0; + }; + worker.onerror = function(e) { + err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); + }; + if (ENVIRONMENT_IS_NODE) { + worker.on("message", function(data2) { + worker.onmessage({data: data2}); + }); + worker.on("error", function(data2) { + worker.onerror(data2); + }); + worker.on("exit", function(data2) { + }); + } + worker.postMessage({cmd: "load", urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, wasmMemory, wasmModule}); + }, allocateUnusedWorker: function() { + var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, getNewWorker: function() { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, busySpinWait: function(msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { + } + }}; + function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); + } + Module["establishStackSpace"] = establishStackSpace; + function getNoExitRuntime() { + return noExitRuntime; + } + Module["getNoExitRuntime"] = getNoExitRuntime; + function invokeEntryPoint(ptr, arg) { + return wasmTable.get(ptr)(arg); + } + Module["invokeEntryPoint"] = invokeEntryPoint; + function ___assert_fail(condition, filename, line, func2) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); + } + function ___call_main(argc, argv) { + var returnCode = _main(argc, argv); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function() { + return performance.now() - Module["__performance_now_clock_drift"]; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; + } + function _atexit(func2, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); + } + function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({cmd: "processQueuedMainThreadWork"}); + } else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({targetThread: targetThreadId, cmd: "processThreadQueue"}); + } else { + var pthread = PThread.pthreads[targetThreadId]; + var worker = pthread && pthread.worker; + if (!worker) { + return; + } + worker.postMessage({cmd: "processThreadQueue"}); + } + return 1; + } + function _abort() { + abort(); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + } + function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + } + return 0; + } + } + function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); + } + function _emscripten_num_logical_cores() { + if (ENVIRONMENT_IS_NODE) + return require("os").cpus().length; + return navigator["hardwareConcurrency"]; + } + function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack2 = stackSave(); + var serializedNumCallArgs = numCallArgs; + var args = stackAlloc(serializedNumCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + var arg = arguments[2 + i]; + GROWABLE_HEAP_F64()[b + i] = arg; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); + stackRestore(stack2); + return ret; + } + var _emscripten_receive_on_main_thread_js_callArgs = []; + var readAsmConstArgsArray = []; + function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; + } + function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; + return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); + } + function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var JSEvents = {inEventHandler: 0, removeAllEventListeners: function() { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, registerRemoveEventListeners: function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i2 in arrA) { + if (arrA[i2] != arrB[i2]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({targetFunction, precedence, argsList}); + JSEvents.deferredCalls.sort(function(x, y) { + return x.precedence < y.precedence; + }); + }, removeDeferredCalls: function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, canPerformEventHandlerRequests: function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, runDeferredCalls: function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, _removeHandler: function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, registerOrRemoveHandler: function(eventHandler) { + var jsEventHandler = function jsEventHandler2(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, getTargetThreadForEventCallback: function(targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, getNodeNameForTarget: function(target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, fullscreenEnabled: function() { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + }}; + function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; + } + function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); + } + function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); + } + function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; + } + var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); + return domElement; + } + function findCanvasEventTarget(target) { + return findEventTarget(target); + } + function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) + return -4; + if (canvas2.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; + } + if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { + if (canvas2.offscreenCanvas) + canvas2 = canvas2.offscreenCanvas; + var autoResizeViewport = false; + if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { + var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; + } + canvas2.width = width; + canvas2.height = height; + if (autoResizeViewport) { + canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } else if (canvas2.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } else { + return -4; + } + return 0; + } + function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (canvas2) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } + } + function _emscripten_set_current_thread_status(newStatus) { + } + function _emscripten_set_thread_name(threadId, name) { + } + function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function(index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function(mode, first, count2, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count2, primcount); + }; + ctx["drawElementsInstanced"] = function(mode, count2, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count2, type, indices, primcount); + }; + return 1; + } + } + function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function() { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function(vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function(vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function(vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } + } + function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function(n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } + } + function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); + } + var GL = {counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, getNewId: function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, getSource: function(shader, count2, string, length) { + var source = ""; + for (var i = 0; i < count2; ++i) { + var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); + } + return source; + }, createContext: function(canvas2, webGLContextAttributes) { + var ctx = canvas2.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, registerContext: function(ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); + var context = {handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx}; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, makeContextCurrent: function(contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, getContext: function(contextHandle) { + return GL.contexts[contextHandle]; + }, deleteContext: function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, initExtensions: function(context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx2 = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx2); + __webgl_enable_OES_vertex_array_object(GLctx2); + __webgl_enable_WEBGL_draw_buffers(GLctx2); + GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx2); + var exts = GLctx2.getSupportedExtensions() || []; + exts.forEach(function(ext) { + if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { + GLctx2.getExtension(ext); + } + }); + }, populateUniformTable: function(program) { + var p2 = GL.programs[program]; + var ptable = GL.programInfos[program] = {uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1}; + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p2, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p2, i); + var name = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); + if (name.slice(-1) == "]") { + name = name.slice(0, name.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name + "[" + j + "]"; + loc = GLctx.getUniformLocation(p2, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + }}; + var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; + function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = {alpha: !!GROWABLE_HEAP_I32()[a + (0 >> 2)], depth: !!GROWABLE_HEAP_I32()[a + (4 >> 2)], stencil: !!GROWABLE_HEAP_I32()[a + (8 >> 2)], antialias: !!GROWABLE_HEAP_I32()[a + (12 >> 2)], premultipliedAlpha: !!GROWABLE_HEAP_I32()[a + (16 >> 2)], preserveDrawingBuffer: !!GROWABLE_HEAP_I32()[a + (20 >> 2)], powerPreference: __emscripten_webgl_power_preferences[powerPreference], failIfMajorPerformanceCaveat: !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)]}; + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas2, contextAttributes); + return contextHandle; + } + function _emscripten_webgl_create_context(a0, a12) { + return _emscripten_webgl_do_create_context(a0, a12); + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd); + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); + } + function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; + var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); + } + num += len; + } + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + function _pthread_cleanup_pop(execute2) { + var routine = PThread.threadExitHandlers.pop(); + if (execute2) + routine(); + } + function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function() { + wasmTable.get(routine)(arg); + }); + } + function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker = PThread.getNewWorker(); + if (worker.pthread !== void 0) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = PThread.pthreads[threadParams.pthread_ptr] = {worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr}; + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); + worker.pthread = pthread; + var msg = {cmd: "run", start_routine: threadParams.startRoutine, arg: threadParams.arg, threadInfoStruct: threadParams.pthread_ptr, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize}; + worker.runPthread = function() { + msg.time = performance.now(); + worker.postMessage(msg, threadParams.transferList); + }; + if (worker.loaded) { + worker.runPthread(); + delete worker.runPthread; + } + } + function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + if (attr && attr != -1) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; + detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; + } else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } else { + stackBase -= stackSize; + assert3(stackBase > 0); + } + var threadInfoStruct = _malloc(228); + for (var i = 0; i < 228 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = {stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList}; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } else { + spawnThread(threadParams); + } + return 0; + } + function _sysconf(name) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name); + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); + var GLctx; + var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; + var asmLibraryArg = {e: ___assert_fail, r: ___call_main, x: __emscripten_notify_thread_queue, b: _abort, y: _emscripten_asm_const_int, j: _emscripten_conditional_set_current_thread_status, c: _emscripten_futex_wait, d: _emscripten_futex_wake, f: _emscripten_get_now, p: _emscripten_memcpy_big, z: _emscripten_num_logical_cores, u: _emscripten_receive_on_main_thread_js, q: _emscripten_resize_heap, v: _emscripten_set_canvas_element_size, i: _emscripten_set_current_thread_status, t: _emscripten_set_thread_name, w: _emscripten_webgl_create_context, m: _fd_close, n: _fd_seek, g: _fd_write, o: initPthreadsJS, a: wasmMemory || Module["wasmMemory"], k: _pthread_cleanup_pop, l: _pthread_cleanup_push, h: _pthread_create, s: _sysconf}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["db"]).apply(null, arguments); + }; + var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["fb"]).apply(null, arguments); + }; + var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["gb"]).apply(null, arguments); + }; + var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { + return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["hb"]).apply(null, arguments); + }; + var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["ib"]).apply(null, arguments); + }; + var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["jb"]).apply(null, arguments); + }; + var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["kb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["lb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["mb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["nb"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["ob"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["pb"]).apply(null, arguments); + }; + var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9880; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11368; + Module["cwrap"] = cwrap; + Module["PThread"] = PThread; + Module["PThread"] = PThread; + Module["wasmMemory"] = wasmMemory; + Module["ExitStatus"] = ExitStatus; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + if (ENVIRONMENT_IS_PTHREAD) { + readyPromiseResolve(Module); + postMessage({cmd: "loaded"}); + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (!implicit) { + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exitProcess", returnCode: status}); + throw new ExitStatus(status); + } else { + } + } + if (noExitRuntime) { + } else { + PThread.terminateAllThreads(); + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + if (ENVIRONMENT_IS_PTHREAD) { + noExitRuntime = false; + PThread.initWorker(); + } + run2(); + return WasmBackendModuleThreadedSimd2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModuleThreadedSimd; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModuleThreadedSimd; + }); + else if (typeof exports === "object") + exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; +}); +var require_tfjs_backend_wasm = __commonJS((exports, module) => { + var WasmBackendModule = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModule2) { + WasmBackendModule2 = WasmBackendModule2 || {}; + var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function writeArrayToMemory(array2, buffer3) { + HEAP8.set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["g"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["m"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + var asmLibraryArg = {a: _abort, d: _emscripten_memcpy_big, e: _emscripten_resize_heap, f: _fd_close, c: _fd_seek, b: _fd_write}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["h"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["i"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["j"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["k"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["l"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["n"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["o"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["p"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["q"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["r"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["s"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["t"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["u"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["v"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["w"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["x"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["y"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["z"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["La"]).apply(null, arguments); + }; + Module["cwrap"] = cwrap; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run2(); + return WasmBackendModule2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; +}); +var require_alea2 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = String(data2); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor1282 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorwow2 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xorshift72 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_xor40962 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_tychei2 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); +}); +var require_seedrandom3 = __commonJS((exports, module) => { + (function(global2, pool3, math) { + var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } else { + math["seed" + rngname] = seedrandom5; + } + })(typeof self !== "undefined" ? self : exports, [], Math); +}); +var require_seedrandom4 = __commonJS((exports, module) => { + var alea5 = require_alea2(); + var xor128 = require_xor1282(); + var xorwow = require_xorwow2(); + var xorshift7 = require_xorshift72(); + var xor4096 = require_xor40962(); + var tychei = require_tychei2(); + var sr = require_seedrandom3(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; +}); +var require_string_decoder = __commonJS(() => { +}); +var version = "3.3.0"; +var version2 = "3.3.0"; +var version3 = "3.3.0"; +var version4 = "3.3.0"; +var version5 = "3.3.0"; +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var EPSILON_FLOAT32 = 1e-7; +var EPSILON_FLOAT16 = 1e-4; +var DataStorage = class { + constructor(backend22, dataMover) { + this.backend = backend22; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } +}; +var KernelBackend = class { + refCount(dataId) { + return notYetImplemented("refCount"); + } + incRef(dataId) { + return notYetImplemented("incRef"); + } + timerAvailable() { + return true; + } + time(f) { + return notYetImplemented("time"); + } + read(dataId) { + return notYetImplemented("read"); + } + readSync(dataId) { + return notYetImplemented("readSync"); + } + numDataIds() { + return notYetImplemented("numDataIds"); + } + disposeData(dataId, force) { + return notYetImplemented("disposeData"); + } + write(values, shape, dtype) { + return notYetImplemented("write"); + } + move(dataId, values, shape, dtype, refCount) { + return notYetImplemented("move"); + } + memory() { + return notYetImplemented("memory"); + } + floatPrecision() { + return notYetImplemented("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + dispose() { + return notYetImplemented("dispose"); + } +}; +function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function shuffle(array2) { + let counter = array2.length; + let temp = 0; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + array2[counter] = array2[index]; + array2[index] = temp; + } +} +function shuffleCombo(array2, array22) { + if (array2.length !== array22.length) { + throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); + } + let counter = array2.length; + let temp, temp2; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + temp2 = array22[counter]; + array2[counter] = array2[index]; + array22[counter] = array22[index]; + array2[index] = temp; + array22[index] = temp2; + } +} +function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); +} +function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; +} +function sum(arr) { + let sum6 = 0; + for (let i = 0; i < arr.length; i++) { + sum6 += arr[i]; + } + return sum6; +} +function randUniform(a, b) { + const r = Math.random(); + return b * r + (1 - r) * a; +} +function distSquared(a, b) { + let result = 0; + for (let i = 0; i < a.length; i++) { + const diff = Number(a[i]) - Number(b[i]); + result += diff * diff; + } + return result; +} +function assert(expr, msg) { + if (!expr) { + throw new Error(typeof msg === "string" ? msg : msg()); + } +} +function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { + assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); +} +function assertNonNull(a) { + assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); +} +function flatten(arr, result = [], skipTypedArray = false) { + if (result == null) { + result = []; + } + if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { + for (let i = 0; i < arr.length; ++i) { + flatten(arr[i], result, skipTypedArray); + } + } else { + result.push(arr); + } + return result; +} +function sizeFromShape(shape) { + if (shape.length === 0) { + return 1; + } + let size = shape[0]; + for (let i = 1; i < shape.length; i++) { + size *= shape[i]; + } + return size; +} +function isScalarShape(shape) { + return shape.length === 0; +} +function arraysEqual(n1, n2) { + if (n1 === n2) { + return true; + } + if (n1 == null || n2 == null) { + return false; + } + if (n1.length !== n2.length) { + return false; + } + for (let i = 0; i < n1.length; i++) { + if (n1[i] !== n2[i]) { + return false; + } + } + return true; +} +function isInt(a) { + return a % 1 === 0; +} +function tanh(x) { + if (Math.tanh != null) { + return Math.tanh(x); + } + if (x === Infinity) { + return 1; + } else if (x === -Infinity) { + return -1; + } else { + const e2x = Math.exp(2 * x); + return (e2x - 1) / (e2x + 1); + } +} +function sizeToSquarishShape(size) { + const width = Math.ceil(Math.sqrt(size)); + return [width, Math.ceil(size / width)]; +} +function createShuffledIndices(n) { + const shuffledIndices = new Uint32Array(n); + for (let i = 0; i < n; ++i) { + shuffledIndices[i] = i; + } + shuffle(shuffledIndices); + return shuffledIndices; +} +function rightPad(a, size) { + if (size <= a.length) { + return a; + } + return a + " ".repeat(size - a.length); +} +function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { + return new Promise((resolve, reject) => { + let tryCount = 0; + const tryFn = () => { + if (checkFn()) { + resolve(); + return; + } + tryCount++; + const nextBackoff = delayFn(tryCount); + if (maxCounter != null && tryCount >= maxCounter) { + reject(); + return; + } + setTimeout(tryFn, nextBackoff); + }; + tryFn(); + }); +} +function inferFromImplicitShape(shape, size) { + let shapeProd = 1; + let implicitIdx = -1; + for (let i = 0; i < shape.length; ++i) { + if (shape[i] >= 0) { + shapeProd *= shape[i]; + } else if (shape[i] === -1) { + if (implicitIdx !== -1) { + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + } + implicitIdx = i; + } else if (shape[i] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + } + } + if (implicitIdx === -1) { + if (size > 0 && size !== shapeProd) { + throw Error(`Size(${size}) must match the product of shape ${shape}`); + } + return shape; + } + if (shapeProd === 0) { + throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); + } + if (size % shapeProd !== 0) { + throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); + } + const newShape = shape.slice(); + newShape[implicitIdx] = size / shapeProd; + return newShape; +} +function parseAxisParam(axis, shape) { + const rank = shape.length; + axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); + assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); + return axis.map((a) => a < 0 ? rank + a : a); +} +function squeezeShape(shape, axis) { + const newShape = []; + const keptDims = []; + const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; + const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); + let j = 0; + for (let i = 0; i < shape.length; ++i) { + if (axes != null) { + if (axes[j] === i && shape[i] !== 1) { + throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); + } + if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + if (axes[j] <= i) { + j++; + } + } + if (shape[i] !== 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + } + return {newShape, keptDims}; +} +function getTypedArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function getArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else if (dtype === "string") { + values = new Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; +} +function checkConversionForErrors(vals, dtype) { + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); + } + } +} +function isValidDtype(dtype) { + return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; +} +function hasEncodingLoss(oldType, newType) { + if (newType === "complex64") { + return false; + } + if (newType === "float32" && oldType !== "complex64") { + return false; + } + if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { + return false; + } + if (newType === "bool" && oldType === "bool") { + return false; + } + return true; +} +function isTypedArray(a) { + return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; +} +function bytesPerElement(dtype) { + if (dtype === "float32" || dtype === "int32") { + return 4; + } else if (dtype === "complex64") { + return 8; + } else if (dtype === "bool") { + return 1; + } else { + throw new Error(`Unknown dtype ${dtype}`); + } +} +function bytesFromStringArray(arr) { + if (arr == null) { + return 0; + } + let bytes = 0; + arr.forEach((x) => bytes += x.length); + return bytes; +} +function isString(value) { + return typeof value === "string" || value instanceof String; +} +function isBoolean(value) { + return typeof value === "boolean"; +} +function isNumber(value) { + return typeof value === "number"; +} +function inferDtype(values) { + if (Array.isArray(values)) { + return inferDtype(values[0]); + } + if (values instanceof Float32Array) { + return "float32"; + } else if (values instanceof Int32Array || values instanceof Uint8Array) { + return "int32"; + } else if (isNumber(values)) { + return "float32"; + } else if (isString(values)) { + return "string"; + } else if (isBoolean(values)) { + return "bool"; + } + return "float32"; +} +function isFunction(f) { + return !!(f && f.constructor && f.call && f.apply); +} +function nearestDivisor(size, start) { + for (let i = start; i < size; ++i) { + if (size % i === 0) { + return i; + } + } + return size; +} +function computeStrides(shape) { + const rank = shape.length; + if (rank < 2) { + return []; + } + const strides = new Array(rank - 1); + strides[rank - 2] = shape[rank - 1]; + for (let i = rank - 3; i >= 0; --i) { + strides[i] = strides[i + 1] * shape[i + 1]; + } + return strides; +} +function createNestedArray(offset, shape, a) { + const ret = new Array(); + if (shape.length === 1) { + const d = shape[0]; + for (let i = 0; i < d; i++) { + ret[i] = a[offset + i]; + } + } else { + const d = shape[0]; + const rest = shape.slice(1); + const len = rest.reduce((acc, c) => acc * c); + for (let i = 0; i < d; i++) { + ret[i] = createNestedArray(offset + i * len, rest, a); + } + } + return ret; +} +function toNestedArray(shape, a) { + if (shape.length === 0) { + return a[0]; + } + const size = shape.reduce((acc, c) => acc * c); + if (size === 0) { + return []; + } + if (size !== a.length) { + throw new Error(`[${shape}] does not match the input size ${a.length}.`); + } + return createNestedArray(0, shape, a); +} +function makeOnesTypedArray(size, dtype) { + const array2 = makeZerosTypedArray(size, dtype); + for (let i = 0; i < array2.length; i++) { + array2[i] = 1; + } + return array2; +} +function makeZerosTypedArray(size, dtype) { + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(size); + } else if (dtype === "int32") { + return new Int32Array(size); + } else if (dtype === "bool") { + return new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function makeZerosNestedTypedArray(shape, dtype) { + const size = shape.reduce((prev, curr) => prev * curr, 1); + if (dtype == null || dtype === "float32") { + return toNestedArray(shape, new Float32Array(size)); + } else if (dtype === "int32") { + return toNestedArray(shape, new Int32Array(size)); + } else if (dtype === "bool") { + return toNestedArray(shape, new Uint8Array(size)); + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function assertNonNegativeIntegerDimensions(shape) { + shape.forEach((dimSize) => { + assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); + }); +} +function locToIndex(locs, rank, strides) { + if (rank === 0) { + return 0; + } else if (rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += strides[i] * locs[i]; + } + return index; +} +function indexToLoc(index, rank, strides) { + if (rank === 0) { + return []; + } else if (rank === 1) { + return [index]; + } + const locs = new Array(rank); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / strides[i]); + index -= locs[i] * strides[i]; + } + locs[locs.length - 1] = index; + return locs; +} +function isPromise(object2) { + return object2 && object2.then && typeof object2.then === "function"; +} +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; +var Environment = class { + constructor(global2) { + this.global = global2; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = {evaluationFn, setHook}; + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (isPromise(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { + return; + } + const urlParams = getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); + keyValues.forEach((keyValue) => { + const [key, value] = keyValue.split(":"); + this.urlFlags[key] = parseValue(key, value); + }); + } + } +}; +function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join("="); + }); + return params; +} +function decodeParam(params, name, value) { + params[decodeURIComponent(name)] = decodeURIComponent(value || ""); +} +function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === "true" || value === "false") { + return value === "true"; + } else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); +} +function env() { + return ENV; +} +var ENV = null; +function setEnvironmentGlobal(environment) { + ENV = environment; +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var globalNameSpace; +function getGlobalNamespace() { + if (globalNameSpace == null) { + let ns; + if (typeof window !== "undefined") { + ns = window; + } else if (typeof global !== "undefined") { + ns = global; + } else if (typeof process !== "undefined") { + ns = process; + } else if (typeof self !== "undefined") { + ns = self; + } else { + throw new Error("Could not find a global object"); + } + globalNameSpace = ns; + } + return globalNameSpace; +} +function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; +} +function getGlobal(key, init2) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } else { + const singleton = init2(); + globalMap.set(key, singleton); + return globalMap.get(key); + } +} +var Abs = "Abs"; +var Acos = "Acos"; +var Acosh = "Acosh"; +var Add = "Add"; +var AddN = "AddN"; +var All = "All"; +var Any = "Any"; +var ArgMax = "ArgMax"; +var ArgMin = "ArgMin"; +var Asin = "Asin"; +var Asinh = "Asinh"; +var Atan = "Atan"; +var Atanh = "Atanh"; +var Atan2 = "Atan2"; +var AvgPool = "AvgPool"; +var AvgPoolGrad = "AvgPoolGrad"; +var AvgPool3D = "AvgPool3D"; +var AvgPool3DGrad = "AvgPool3DGrad"; +var BatchMatMul = "BatchMatMul"; +var BatchToSpaceND = "BatchToSpaceND"; +var Bincount = "Bincount"; +var BroadcastTo = "BroadcastTo"; +var Cast = "Cast"; +var Ceil = "Ceil"; +var ClipByValue = "ClipByValue"; +var Complex = "Complex"; +var ComplexAbs = "ComplexAbs"; +var Concat = "Concat"; +var Conv2D = "Conv2D"; +var Conv2DBackpropFilter = "Conv2DBackpropFilter"; +var Conv2DBackpropInput = "Conv2DBackpropInput"; +var Conv3D = "Conv3D"; +var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; +var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; +var Cos = "Cos"; +var Cosh = "Cosh"; +var Cumsum = "Cumsum"; +var CropAndResize = "CropAndResize"; +var DenseBincount = "DenseBincount"; +var DepthToSpace = "DepthToSpace"; +var DepthwiseConv2dNative = "DepthwiseConv2dNative"; +var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; +var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; +var Diag = "Diag"; +var Dilation2D = "Dilation2D"; +var Dilation2DBackpropInput = "Dilation2DBackpropInput"; +var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; +var RealDiv = "RealDiv"; +var Elu = "Elu"; +var EluGrad = "EluGrad"; +var Erf = "Erf"; +var Equal = "Equal"; +var Exp = "Exp"; +var ExpandDims = "ExpandDims"; +var Expm1 = "Expm1"; +var FFT = "FFT"; +var Fill = "Fill"; +var FlipLeftRight = "FlipLeftRight"; +var Floor = "Floor"; +var FloorDiv = "FloorDiv"; +var FusedBatchNorm = "FusedBatchNorm"; +var GatherV2 = "GatherV2"; +var GatherNd = "GatherNd"; +var Greater = "Greater"; +var GreaterEqual = "GreaterEqual"; +var Identity = "Identity"; +var IFFT = "IFFT"; +var Imag = "Imag"; +var IsFinite = "IsFinite"; +var IsInf = "IsInf"; +var IsNan = "IsNan"; +var LeakyRelu = "LeakyRelu"; +var Less = "Less"; +var LessEqual = "LessEqual"; +var LinSpace = "LinSpace"; +var Log = "Log"; +var Log1p = "Log1p"; +var LogicalAnd = "LogicalAnd"; +var LogicalNot = "LogicalNot"; +var LogicalOr = "LogicalOr"; +var LogSoftmax = "LogSoftmax"; +var LRN = "LRN"; +var LRNGrad = "LRNGrad"; +var Max = "Max"; +var Maximum = "Maximum"; +var MaxPool = "MaxPool"; +var MaxPoolGrad = "MaxPoolGrad"; +var MaxPool3D = "MaxPool3D"; +var MaxPool3DGrad = "MaxPool3DGrad"; +var MaxPoolWithArgmax = "MaxPoolWithArgmax"; +var Mean = "Mean"; +var Min = "Min"; +var Minimum = "Minimum"; +var MirrorPad = "MirrorPad"; +var Mod = "Mod"; +var Multinomial = "Multinomial"; +var Multiply = "Multiply"; +var Neg = "Neg"; +var NotEqual = "NotEqual"; +var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; +var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; +var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; +var OnesLike = "OnesLike"; +var OneHot = "OneHot"; +var Pack = "Pack"; +var PadV2 = "PadV2"; +var Pool = "Pool"; +var Pow = "Pow"; +var Prelu = "Prelu"; +var Prod = "Prod"; +var Range = "Range"; +var Real = "Real"; +var Reciprocal = "Reciprocal"; +var Relu = "Relu"; +var Reshape = "Reshape"; +var ResizeNearestNeighbor = "ResizeNearestNeighbor"; +var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; +var ResizeBilinear = "ResizeBilinear"; +var ResizeBilinearGrad = "ResizeBilinearGrad"; +var Relu6 = "Relu6"; +var Reverse = "Reverse"; +var Round = "Round"; +var Rsqrt = "Rsqrt"; +var ScatterNd = "ScatterNd"; +var Select = "Select"; +var Selu = "Selu"; +var Slice = "Slice"; +var Sin = "Sin"; +var Sinh = "Sinh"; +var Sign = "Sign"; +var Sigmoid = "Sigmoid"; +var Softplus = "Softplus"; +var Sqrt = "Sqrt"; +var Sum = "Sum"; +var SpaceToBatchND = "SpaceToBatchND"; +var SplitV = "SplitV"; +var Softmax = "Softmax"; +var SquaredDifference = "SquaredDifference"; +var Square = "Square"; +var Sub = "Sub"; +var SparseToDense = "SparseToDense"; +var StridedSlice = "StridedSlice"; +var Tan = "Tan"; +var Tanh = "Tanh"; +var Tile = "Tile"; +var TopK = "TopK"; +var Transform = "Transform"; +var Transpose = "Transpose"; +var Unique = "Unique"; +var Unpack = "Unpack"; +var UnsortedSegmentSum = "UnsortedSegmentSum"; +var ZerosLike = "ZerosLike"; +var Step = "Step"; +var FromPixels = "FromPixels"; +var RotateWithOffset = "RotateWithOffset"; +var _FusedMatMul = "_FusedMatMul"; +var FusedConv2D = "FusedConv2D"; +var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); +var gradRegistry = getGlobal("gradRegistry", () => new Map()); +function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); +} +function getGradient(kernelName) { + return gradRegistry.get(kernelName); +} +function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const {done, value} = it.next(); + if (done) { + break; + } + const [key, config3] = value; + const [backend22] = key.split("_"); + if (backend22 === backendName) { + result.push(config3); + } + } + return result; +} +function registerKernel(config3) { + const {kernelName, backendName} = config3; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); + } + kernelRegistry.set(key, config3); +} +function registerGradient(config3) { + const {kernelName} = config3; + if (gradRegistry.has(kernelName)) { + if (env().getBool("DEBUG")) { + console.warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config3); +} +function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); + } + kernelRegistry.delete(key); +} +function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); +} +function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach((kernelConfig) => { + const newKernelConfig = Object.assign({}, kernelConfig, {backendName: newBackendName}); + registerKernel(newKernelConfig); + }); +} +function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; +} +var util_exports = {}; +__export2(util_exports, { + arraysEqual: () => arraysEqual, + assert: () => assert, + assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, + assertNonNull: () => assertNonNull, + assertShapesMatch: () => assertShapesMatch, + bytesFromStringArray: () => bytesFromStringArray, + bytesPerElement: () => bytesPerElement, + checkConversionForErrors: () => checkConversionForErrors, + clamp: () => clamp, + computeStrides: () => computeStrides, + createScalarValue: () => createScalarValue, + createShuffledIndices: () => createShuffledIndices, + decodeString: () => decodeString, + distSquared: () => distSquared, + encodeString: () => encodeString, + fetch: () => fetch2, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + indexToLoc: () => indexToLoc, + inferDtype: () => inferDtype, + inferFromImplicitShape: () => inferFromImplicitShape, + isBoolean: () => isBoolean, + isFunction: () => isFunction, + isInt: () => isInt, + isNumber: () => isNumber, + isPromise: () => isPromise, + isScalarShape: () => isScalarShape, + isString: () => isString, + isTypedArray: () => isTypedArray, + isValidDtype: () => isValidDtype, + locToIndex: () => locToIndex, + makeOnesTypedArray: () => makeOnesTypedArray, + makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, + makeZerosTypedArray: () => makeZerosTypedArray, + nearestDivisor: () => nearestDivisor, + nearestLargerEven: () => nearestLargerEven, + now: () => now2, + parseAxisParam: () => parseAxisParam, + randUniform: () => randUniform, + repeatedTry: () => repeatedTry, + rightPad: () => rightPad, + shuffle: () => shuffle, + shuffleCombo: () => shuffleCombo, + sizeFromShape: () => sizeFromShape, + sizeToSquarishShape: () => sizeToSquarishShape, + squeezeShape: () => squeezeShape, + sum: () => sum, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function createScalarValue(value, dtype) { + if (dtype === "string") { + return encodeString(value); + } + return toTypedArray([value], dtype); +} +function noConversionNeeded(a, dtype) { + return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; +} +function toTypedArray(a, dtype) { + if (dtype === "string") { + throw new Error("Cannot convert a string[] to a TypedArray"); + } + if (Array.isArray(a)) { + a = flatten(a); + } + if (env().getBool("DEBUG")) { + checkConversionForErrors(a, dtype); + } + if (noConversionNeeded(a, dtype)) { + return a; + } + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(a); + } else if (dtype === "int32") { + return new Int32Array(a); + } else if (dtype === "bool") { + const bool = new Uint8Array(a.length); + for (let i = 0; i < bool.length; ++i) { + if (Math.round(a[i]) !== 0) { + bool[i] = 1; + } + } + return bool; + } else { + throw new Error(`Unknown data type ${dtype}`); + } +} +function now2() { + return env().platform.now(); +} +function fetch2(path, requestInits) { + return env().platform.fetch(path, requestInits); +} +function encodeString(s, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.encode(s, encoding); +} +function decodeString(bytes, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.decode(bytes, encoding); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var Profiler = class { + constructor(backendTimer, logger) { + this.backendTimer = backendTimer; + this.logger = logger; + if (logger == null) { + this.logger = new Logger(); + } + } + profileKernel(kernelName, inputs, f) { + let outputs; + const holdResultWrapperFn = () => { + outputs = f(); + }; + let timer; + const start = now2(); + if (this.backendTimer.timerAvailable()) { + timer = this.backendTimer.time(holdResultWrapperFn); + } else { + holdResultWrapperFn(); + for (const output of outputs) { + output.dataSync(); + } + timer = Promise.resolve({kernelMs: now2() - start}); + } + if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { + for (let i = 0; i < outputs.length; i++) { + const output = outputs[i]; + output.data().then((tensorVals) => { + checkComputationForErrors(tensorVals, output.dtype, kernelName); + }); + } + } + const kernelProfile = { + kernelName, + outputs, + inputs, + timeMs: timer.then((timing) => timing.kernelMs), + extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") + }; + return kernelProfile; + } + logKernelProfile(kernelProfile) { + const {kernelName, outputs, timeMs, inputs, extraInfo} = kernelProfile; + outputs.forEach((result) => { + Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { + this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); + }); + }); + } +}; +function checkComputationForErrors(vals, dtype, kernelName) { + if (dtype !== "float32") { + return false; + } + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + console.warn(`Found ${num} in the result of '${kernelName}'`); + return true; + } + } + return false; +} +var Logger = class { + logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name2 in inputs) { + const input2 = inputs[name2]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; + } + } + console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } +}; +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function getFilteredNodesXToY(tape, xs, y) { + const tensorsFromX = {}; + const nodesFromX = {}; + for (let i = 0; i < xs.length; i++) { + tensorsFromX[xs[i].id] = true; + } + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (const inputName in nodeInputs) { + const input2 = nodeInputs[inputName]; + let anyInputFromX = false; + for (let j = 0; j < xs.length; j++) { + if (tensorsFromX[input2.id]) { + node.outputs.forEach((output) => tensorsFromX[output.id] = true); + anyInputFromX = true; + nodesFromX[node.id] = true; + break; + } + } + if (anyInputFromX) { + break; + } + } + } + const tensorsLeadToY = {}; + tensorsLeadToY[y.id] = true; + const nodesToY = {}; + for (let i = tape.length - 1; i >= 0; i--) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (let j = 0; j < node.outputs.length; j++) { + if (tensorsLeadToY[node.outputs[j].id]) { + for (const inputName in nodeInputs) { + tensorsLeadToY[nodeInputs[inputName].id] = true; + nodesToY[node.id] = true; + } + break; + } + } + } + const filteredTape = []; + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + if (nodesFromX[node.id] && nodesToY[node.id]) { + const prunedInputs = {}; + for (const inputName in node.inputs) { + const nodeInput = node.inputs[inputName]; + if (tensorsFromX[nodeInput.id]) { + prunedInputs[inputName] = nodeInput; + } + } + const prunedNode = Object.assign({}, node); + prunedNode.inputs = prunedInputs; + prunedNode.outputs = node.outputs; + filteredTape.push(prunedNode); + } + } + return filteredTape; +} +function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { + for (let i = filteredTape.length - 1; i >= 0; i--) { + const node = filteredTape[i]; + const dys = []; + node.outputs.forEach((o) => { + const gradTensor = tensorAccumulatedGradientMap[o.id]; + if (gradTensor != null) { + dys.push(gradTensor); + } else { + dys.push(null); + } + }); + if (node.gradient == null) { + throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); + } + const inputGradients = node.gradient(dys); + for (const inputName in node.inputs) { + if (!(inputName in inputGradients)) { + throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); + } + const dx = tidy2(() => inputGradients[inputName]()); + if (dx.dtype !== "float32") { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); + } + const x = node.inputs[inputName]; + if (!arraysEqual(dx.shape, x.shape)) { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); + } + if (tensorAccumulatedGradientMap[x.id] == null) { + tensorAccumulatedGradientMap[x.id] = dx; + } else { + const curGradient = tensorAccumulatedGradientMap[x.id]; + tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); + curGradient.dispose(); + } + } + } +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var FORMAT_LIMIT_NUM_VALS = 20; +var FORMAT_NUM_FIRST_LAST_VALS = 3; +var FORMAT_NUM_SIG_DIGITS = 7; +function tensorToString(vals, shape, dtype, verbose) { + const strides = computeStrides(shape); + const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); + const rank = shape.length; + const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); + const lines2 = ["Tensor"]; + if (verbose) { + lines2.push(` dtype: ${dtype}`); + lines2.push(` rank: ${rank}`); + lines2.push(` shape: [${shape}]`); + lines2.push(` values:`); + } + lines2.push(valsLines.map((l) => " " + l).join("\n")); + return lines2.join("\n"); +} +function computeMaxSizePerColumn(vals, shape, dtype, strides) { + const n = sizeFromShape(shape); + const numCols = strides[strides.length - 1]; + const padPerCol = new Array(numCols).fill(0); + const rank = shape.length; + const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; + if (rank > 1) { + for (let row = 0; row < n / numCols; row++) { + const offset = row * numCols; + for (let j = 0; j < numCols; j++) { + padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); + } + } + } + return padPerCol; +} +function valToString(val, pad3, dtype) { + let valStr; + if (Array.isArray(val)) { + valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; + } else if (isString(val)) { + valStr = `'${val}'`; + } else if (dtype === "bool") { + valStr = boolNumToString(val); + } else { + valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); + } + return rightPad(valStr, pad3); +} +function boolNumToString(v) { + return v === 0 ? "false" : "true"; +} +function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { + const storagePerElement = dtype === "complex64" ? 2 : 1; + const size = shape[0]; + const rank = shape.length; + if (rank === 0) { + if (dtype === "complex64") { + const complexTuple = createComplexTuples(vals); + return [valToString(complexTuple[0], 0, dtype)]; + } + if (dtype === "bool") { + return [boolNumToString(vals[0])]; + } + return [vals[0].toString()]; + } + if (rank === 1) { + if (size > FORMAT_LIMIT_NUM_VALS) { + const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; + let firstVals = Array.from(vals.slice(0, firstValsSize)); + let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); + if (dtype === "complex64") { + firstVals = createComplexTuples(firstVals); + lastVals = createComplexTuples(lastVals); + } + return [ + "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + ]; + } + const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); + return [ + "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + ]; + } + const subshape = shape.slice(1); + const substrides = strides.slice(1); + const stride = strides[0] * storagePerElement; + const lines2 = []; + if (size > FORMAT_LIMIT_NUM_VALS) { + for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); + } + lines2.push("..."); + for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } else { + for (let i = 0; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } + const sep = rank === 2 ? "," : ""; + lines2[0] = "[" + lines2[0] + sep; + for (let i = 1; i < lines2.length - 1; i++) { + lines2[i] = " " + lines2[i] + sep; + } + let newLineSep = ",\n"; + for (let i = 2; i < rank; i++) { + newLineSep += "\n"; + } + lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); + return lines2; +} +function createComplexTuples(vals) { + const complexTuples = []; + for (let i = 0; i < vals.length; i += 2) { + complexTuples.push([vals[i], vals[i + 1]]); + } + return complexTuples; +} +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var TensorBuffer = class { + constructor(shape, dtype, values) { + this.dtype = dtype; + this.shape = shape.slice(); + this.size = sizeFromShape(shape); + if (values != null) { + const n = values.length; + assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (dtype === "complex64") { + throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); + } + this.values = values || getArrayFromDType(dtype, this.size); + this.strides = computeStrides(shape); + } + set(value, ...locs) { + if (locs.length === 0) { + locs = [0]; + } + assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); + const index = this.locToIndex(locs); + this.values[index] = value; + } + get(...locs) { + if (locs.length === 0) { + locs = [0]; + } + let i = 0; + for (const loc of locs) { + if (loc < 0 || loc >= this.shape[i]) { + const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; + throw new Error(msg); + } + i++; + } + let index = locs[locs.length - 1]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index += this.strides[i2] * locs[i2]; + } + return this.values[index]; + } + locToIndex(locs) { + if (this.rank === 0) { + return 0; + } else if (this.rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += this.strides[i] * locs[i]; + } + return index; + } + indexToLoc(index) { + if (this.rank === 0) { + return []; + } else if (this.rank === 1) { + return [index]; + } + const locs = new Array(this.shape.length); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / this.strides[i]); + index -= locs[i] * this.strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + get rank() { + return this.shape.length; + } + toTensor() { + return trackerFn().makeTensor(this.values, this.shape, this.dtype); + } +}; +var trackerFn = null; +var opHandler = null; +var deprecationWarningFn = null; +function setTensorTracker(fn) { + trackerFn = fn; +} +function setOpHandler(handler) { + opHandler = handler; +} +function setDeprecationWarningFn(fn) { + deprecationWarningFn = fn; +} +var Tensor = class { + constructor(shape, dtype, dataId, id) { + this.kept = false; + this.isDisposedInternal = false; + this.shape = shape.slice(); + this.dtype = dtype || "float32"; + this.size = sizeFromShape(shape); + this.strides = computeStrides(shape); + this.dataId = dataId; + this.id = id; + this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + const vals = await this.data(); + return opHandler.buffer(this.shape, this.dtype, vals); + } + bufferSync() { + return opHandler.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + const vals = await this.data(); + return toNestedArray(this.shape, vals); + } + arraySync() { + return toNestedArray(this.shape, this.dataSync()); + } + async data() { + this.throwIfDisposed(); + const data2 = trackerFn().read(this.dataId); + if (this.dtype === "string") { + const bytes = await data2; + try { + return bytes.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + dataSync() { + this.throwIfDisposed(); + const data2 = trackerFn().readSync(this.dataId); + if (this.dtype === "string") { + try { + return data2.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + async bytes() { + this.throwIfDisposed(); + const data2 = await trackerFn().read(this.dataId); + if (this.dtype === "string") { + return data2; + } else { + return new Uint8Array(data2.buffer); + } + } + dispose() { + if (this.isDisposed) { + return; + } + trackerFn().disposeTensor(this); + this.isDisposedInternal = true; + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) { + throw new Error(`Tensor is disposed.`); + } + } + print(verbose = false) { + return opHandler.print(this, verbose); + } + clone() { + this.throwIfDisposed(); + return opHandler.clone(this); + } + toString(verbose = false) { + const vals = this.dataSync(); + return tensorToString(vals, this.shape, this.dtype, verbose); + } + cast(dtype) { + this.throwIfDisposed(); + return opHandler.cast(this, dtype); + } + variable(trainable = true, name, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name, dtype); + } +}; +Object.defineProperty(Tensor, Symbol.hasInstance, { + value: (instance) => { + return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; + } +}); +function getGlobalTensorClass() { + return getGlobal("Tensor", () => { + return Tensor; + }); +} +getGlobalTensorClass(); +var Variable = class extends Tensor { + constructor(initialValue, trainable, name, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name; + } + assign(newValue) { + if (newValue.dtype !== this.dtype) { + throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); + } + if (!arraysEqual(newValue.shape, this.shape)) { + throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); + } + trackerFn().disposeTensor(this); + this.dataId = newValue.dataId; + trackerFn().incRef(this, null); + } + dispose() { + trackerFn().disposeVariable(this); + this.isDisposedInternal = true; + } +}; +Object.defineProperty(Variable, Symbol.hasInstance, { + value: (instance) => { + return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; + } +}); +var tensor_util_exports = {}; +__export2(tensor_util_exports, { + assertTypesMatch: () => assertTypesMatch, + getTensorsInContainer: () => getTensorsInContainer, + isTensorInList: () => isTensorInList, + makeTypesMatch: () => makeTypesMatch +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var Rank; +(function(Rank2) { + Rank2["R0"] = "R0"; + Rank2["R1"] = "R1"; + Rank2["R2"] = "R2"; + Rank2["R3"] = "R3"; + Rank2["R4"] = "R4"; + Rank2["R5"] = "R5"; + Rank2["R6"] = "R6"; +})(Rank || (Rank = {})); +var UpcastInt32AndMap; +(function(UpcastInt32AndMap2) { + UpcastInt32AndMap2["float32"] = "float32"; + UpcastInt32AndMap2["int32"] = "int32"; + UpcastInt32AndMap2["bool"] = "int32"; + UpcastInt32AndMap2["complex64"] = "complex64"; +})(UpcastInt32AndMap || (UpcastInt32AndMap = {})); +var UpcastBoolAndMap; +(function(UpcastBoolAndMap2) { + UpcastBoolAndMap2["float32"] = "float32"; + UpcastBoolAndMap2["int32"] = "int32"; + UpcastBoolAndMap2["bool"] = "bool"; + UpcastBoolAndMap2["complex64"] = "complex64"; +})(UpcastBoolAndMap || (UpcastBoolAndMap = {})); +var UpcastFloat32AndMap; +(function(UpcastFloat32AndMap2) { + UpcastFloat32AndMap2["float32"] = "float32"; + UpcastFloat32AndMap2["int32"] = "float32"; + UpcastFloat32AndMap2["bool"] = "float32"; + UpcastFloat32AndMap2["complex64"] = "complex64"; +})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); +var UpcastComplex64AndMap; +(function(UpcastComplex64AndMap2) { + UpcastComplex64AndMap2["float32"] = "complex64"; + UpcastComplex64AndMap2["int32"] = "complex64"; + UpcastComplex64AndMap2["bool"] = "complex64"; + UpcastComplex64AndMap2["complex64"] = "complex64"; +})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); +var upcastTypeMap = { + float32: UpcastFloat32AndMap, + int32: UpcastInt32AndMap, + bool: UpcastBoolAndMap, + complex64: UpcastComplex64AndMap +}; +function upcastType(typeA, typeB) { + if (typeA === "string" || typeB === "string") { + if (typeA === "string" && typeB === "string") { + return "string"; + } + throw new Error(`Can not upcast ${typeA} with ${typeB}`); + } + return upcastTypeMap[typeA][typeB]; +} +function sumOutType(type) { + return upcastType(type, "int32"); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function makeTypesMatch(a, b) { + if (a.dtype === b.dtype) { + return [a, b]; + } + const dtype = upcastType(a.dtype, b.dtype); + return [a.cast(dtype), b.cast(dtype)]; +} +function assertTypesMatch(a, b) { + assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); +} +function isTensorInList(tensor2, tensorList) { + return tensorList.some((x) => x.id === tensor2.id); +} +function getTensorsInContainer(result) { + const list = []; + const seen = new Set(); + walkTensorContainer(result, list, seen); + return list; +} +function walkTensorContainer(container, list, seen) { + if (container == null) { + return; + } + if (container instanceof Tensor) { + list.push(container); + return; + } + if (!isIterable(container)) { + return; + } + const iterable = container; + for (const k in iterable) { + const val = iterable[k]; + if (!seen.has(val)) { + seen.add(val); + walkTensorContainer(val, list, seen); + } + } +} +function isIterable(obj) { + return Array.isArray(obj) || typeof obj === "object"; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function isRegisteredKernelInvocation(kernelInvocation) { + return kernelInvocation.kernelName != null; +} +var EngineState = class { + constructor() { + this.registeredVariables = {}; + this.nextTapeNodeId = 0; + this.numBytes = 0; + this.numTensors = 0; + this.numStringTensors = 0; + this.numDataBuffers = 0; + this.gradientDepth = 0; + this.kernelDepth = 0; + this.scopeStack = []; + this.numDataMovesStack = []; + this.nextScopeId = 0; + this.tensorInfo = new WeakMap(); + this.profiling = false; + this.activeProfile = { + newBytes: 0, + newTensors: 0, + peakBytes: 0, + kernels: [], + result: null, + get kernelNames() { + return Array.from(new Set(this.kernels.map((k) => k.name))); + } + }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } +}; +var Engine = class { + constructor(ENV5) { + this.ENV = ENV5; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { + }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + if (this.backendInstance == null) { + const {name, asyncInit} = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + if (backendName in this.registryFactory) { + const {asyncInit} = this.initializeBackend(backendName); + if (asyncInit) { + return null; + } + } else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = {factory, priority}; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const {success, asyncInit} = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + this.profiler = new Profiler(this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = getKernelsForBackend(this.backendName); + kernels.forEach((kernel) => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = getKernelsForBackend(backendName); + kernels.forEach((kernel) => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend22 = registryFactoryEntry.factory(); + if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { + const promiseId = ++this.pendingBackendInitId; + const success = backend22.then((backendInstance) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }).catch((err) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return {success, asyncInit: true}; + } else { + this.registry[backendName] = backend22; + return {success: true, asyncInit: false}; + } + } catch (err) { + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return {success: false, asyncInit: false}; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error("No backend found in registry."); + } + return Object.keys(this.registryFactory).sort((a, b) => { + return this.registryFactory[b].priority - this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const {success, asyncInit} = this.initializeBackend(backendName); + if (asyncInit || success) { + return {name: backendName, asyncInit}; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + moveData(backend22, dataId) { + const info2 = this.state.tensorInfo.get(dataId); + const srcBackend = info2.backend; + const values = this.readSync(dataId); + const refCount = srcBackend.refCount(dataId); + srcBackend.disposeData(dataId, true); + info2.backend = backend22; + backend22.move(dataId, values, info2.shape, info2.dtype, refCount); + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name = null; + if (fn == null) { + if (typeof nameOrFn !== "function") { + throw new Error("Please provide a function to tidy()"); + } + fn = nameOrFn; + } else { + if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + } + if (typeof fn !== "function") { + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + } + name = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error("Cannot return a Promise inside of tidy."); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + clone(x) { + const y = ENGINE.runKernel(Identity, {x}); + const inputs = {x}; + const grad2 = (dy) => ({ + x: () => { + const dtype = "float32"; + const gradInputs = {x: dy}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, gradInputs, attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); + return y; + } + runKernel(kernelName, inputs, attrs) { + const hasKernel = getKernel(kernelName, this.backendName) != null; + if (!hasKernel) { + throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); + } + return this.runKernelFunc({kernelName, inputs, attrs}); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + let numOutputDataIds = 0; + outInfos.forEach((info2) => { + numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; + }); + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + runKernelFunc(kernelParams) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc3; + if (this.backendName == null) { + this.backend; + } + let out; + const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (isRegisteredKernelInvocation(kernelParams)) { + const {kernelName, inputs: inputs2, attrs: attrs2} = kernelParams; + if (this.backendName == null) { + this.backend; + } + const kernel = getKernel(kernelName, this.backendName); + assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({inputs: inputs2, attrs: attrs2, backend: this.backend}); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map((outInfo) => { + if (outInfo.rank != null) { + return outInfo; + } + const {dataId, shape, dtype} = outInfo; + return this.makeTensorFromDataId(dataId, shape, dtype); + }); + if (isTapeOn) { + const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } else { + const {forwardFunc} = kernelParams; + const saveFunc = (tensors) => { + if (!isTapeOn) { + return; + } + saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + }; + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); + } + return outs; + }; + } + const {inputs, attrs} = kernelParams; + const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { + outputs = kernelFunc3(); + } else { + kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); + if (this.ENV.getBool("DEBUG")) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelOrScopeName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map((item) => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return Array.isArray(out) ? outputs : outputs[0]; + } + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + return saved; + } + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + return []; + } + makeTensor(values, shape, dtype, backend22) { + if (values == null) { + throw new Error("Values passed to engine.makeTensor() are null"); + } + dtype = dtype || "float32"; + backend22 = backend22 || this.backend; + let backendVals = values; + if (dtype === "string" && isString(values[0])) { + backendVals = values.map((d) => encodeString(d)); + } + const dataId = backend22.write(backendVals, shape, dtype); + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + if (dtype === "string") { + const info2 = this.state.tensorInfo.get(dataId); + const newBytes = bytesFromStringArray(backendVals); + this.state.numBytes += newBytes - info2.bytes; + info2.bytes = newBytes; + } + return t; + } + makeTensorFromDataId(dataId, shape, dtype, backend22) { + dtype = dtype || "float32"; + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + return t; + } + makeVariable(initialValue, trainable = true, name, dtype) { + name = name || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + trackTensor(a, backend22) { + this.state.numTensors++; + if (a.dtype === "string") { + this.state.numStringTensors++; + } + let bytes = 0; + if (a.dtype !== "complex64" && a.dtype !== "string") { + bytes = a.size * bytesPerElement(a.dtype); + } + this.state.numBytes += bytes; + if (!this.state.tensorInfo.has(a.dataId)) { + this.state.numDataBuffers++; + this.state.tensorInfo.set(a.dataId, { + backend: backend22 || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes + }); + } + if (!(a instanceof Variable)) { + this.track(a); + } + } + incRef(a, backend22) { + this.trackTensor(a, backend22); + this.backend.incRef(a.dataId); + } + removeDataId(dataId, backend22) { + if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { + this.state.tensorInfo.delete(dataId); + this.state.numDataBuffers--; + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + const info2 = this.state.tensorInfo.get(a.dataId); + this.state.numTensors--; + if (a.dtype === "string") { + this.state.numStringTensors--; + this.state.numBytes -= info2.bytes; + } + if (a.dtype !== "complex64" && a.dtype !== "string") { + const bytes = a.size * bytesPerElement(a.dtype); + this.state.numBytes -= bytes; + } + if (info2.backend.disposeData(a.dataId)) { + this.removeDataId(a.dataId, info2.backend); + } + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info2 = this.backend.memory(); + info2.numTensors = this.state.numTensors; + info2.numDataBuffers = this.state.numDataBuffers; + info2.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info2.unreliable = true; + if (info2.reasons == null) { + info2.reasons = []; + } + info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); + } + return info2; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = {id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved}; + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = makeZerosTypedArray(output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(name) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name) { + scopeInfo.name = name; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + endScope(result) { + const tensorsToTrackInParent = getTensorsInContainer(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor2 = this.state.activeScope.track[i]; + if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { + tensor2.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; + tensorsToTrackInParent.forEach((tensor2) => { + if (!tensor2.kept && tensor2.scopeId === oldScope.id) { + this.track(tensor2); + } + }); + } + gradients(f, xs, dy, allowNoGradients = false) { + assert(xs.length > 0, () => "gradients() received an empty list of xs."); + if (dy != null && dy.dtype !== "float32") { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); + assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); + const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { + throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); + } + return this.tidy("backward", () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; + backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); + const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + this.state.activeTape.forEach((node) => { + for (const tensor2 of node.saved) { + tensor2.dispose(); + } + }); + this.state.activeTape = null; + } + return {value: y, grads: grads2}; + }); + } + customGrad(f) { + assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); + return (...inputs) => { + assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let res; + const inputMap = {}; + inputs.forEach((input2, i) => { + inputMap[i] = input2; + }); + const forwardFunc = (_, save) => { + res = f(...[...inputs, save]); + assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); + assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); + return res.value; + }; + const backwardsFunc = (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; + assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); + assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); + const gradMap = {}; + grads2.forEach((grad2, i) => { + gradMap[i] = () => grad2; + }); + return gradMap; + }; + return this.runKernelFunc({ + forwardFunc, + backwardsFunc, + inputs: inputMap + }); + }; + } + readSync(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.readSync(dataId); + } + read(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.read(dataId); + } + async time(query) { + const start = now2(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = now2() - start; + return timingInfo; + } + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + reset() { + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } +}; +Engine.nextTensorId = 0; +Engine.nextVariableId = 0; +function ones(shape) { + const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); + return ENGINE.makeTensor(values, shape, "float32"); +} +function getOrMakeEngine() { + const ns = getGlobalNamespace(); + if (ns._tfengine == null) { + const environment = new Environment(ns); + ns._tfengine = new Engine(environment); + } + setEnvironmentGlobal(ns._tfengine.ENV); + setTensorTracker(() => ns._tfengine); + return ns._tfengine; +} +var ENGINE = getOrMakeEngine(); +function add(a, b) { + const inputs = {a, b}; + return ENGINE.runKernel(Add, inputs); +} +var device_util_exports = {}; +__export2(device_util_exports, { + isBrowser: () => isBrowser, + isMobile: () => isMobile +}); +/** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function _isNavigatorDefined() { + return typeof navigator !== "undefined" && navigator != null; +} +function isMobile() { + if (_isNavigatorDefined()) { + const a = navigator.userAgent || navigator.vendor || window.opera; + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); + } + return false; +} +function isBrowser() { + return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var ENV2 = env(); +ENV2.registerFlag("DEBUG", () => false, (debugValue) => { + if (debugValue) { + console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); + } +}); +ENV2.registerFlag("IS_BROWSER", () => isBrowser()); +ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); +ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); +ENV2.registerFlag("PROD", () => false); +ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); +ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); +ENV2.registerFlag("IS_TEST", () => false); +ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); +ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function inferShape(val, dtype) { + let firstElem = val; + if (isTypedArray(val)) { + return dtype === "string" ? [] : [val.length]; + } + if (!Array.isArray(val)) { + return []; + } + const shape = []; + while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { + shape.push(firstElem.length); + firstElem = firstElem[0]; + } + if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { + deepAssertShapeConsistency(val, shape, []); + } + return shape; +} +function deepAssertShapeConsistency(val, shape, indices) { + indices = indices || []; + if (!Array.isArray(val) && !isTypedArray(val)) { + assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); + return; + } + assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); + assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); + const subShape = shape.slice(1); + for (let i = 0; i < val.length; ++i) { + deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); + } +} +function assertDtype(expectedDtype, actualDType, argName, functionName) { + if (expectedDtype === "string_or_numeric") { + return; + } + if (expectedDtype == null) { + throw new Error(`Expected dtype cannot be null.`); + } + if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { + throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); + } +} +function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { + if (x instanceof Tensor) { + assertDtype(parseAsDtype, x.dtype, argName, functionName); + return x; + } + let inferredDtype = inferDtype(x); + if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { + inferredDtype = parseAsDtype; + } + assertDtype(parseAsDtype, inferredDtype, argName, functionName); + if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { + const type = x == null ? "null" : x.constructor.name; + throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); + } + const inferredShape = inferShape(x, inferredDtype); + if (!isTypedArray(x) && !Array.isArray(x)) { + x = [x]; + } + const skipTypedArray = true; + const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); + return ENGINE.makeTensor(values, inferredShape, inferredDtype); +} +function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { + if (!Array.isArray(arg)) { + throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); + } + const tensors = arg; + return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var OP_SCOPE_SUFFIX = "__op"; +function op(f) { + const keys = Object.keys(f); + if (keys.length !== 1) { + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); + } + let opName = keys[0]; + const fn = f[opName]; + if (opName.endsWith("_")) { + opName = opName.substring(0, opName.length - 1); + } + opName = opName + OP_SCOPE_SUFFIX; + const f2 = (...args) => { + ENGINE.startScope(opName); + try { + const result = fn(...args); + if (isPromise(result)) { + console.error("Cannot return a Promise inside of tidy."); + } + ENGINE.endScope(result); + return result; + } catch (ex) { + ENGINE.endScope(null); + throw ex; + } + }; + Object.defineProperty(f2, "name", {value: opName, configurable: true}); + return f2; +} +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function complex_(real4, imag4) { + const $real = convertToTensor(real4, "real", "complex"); + const $imag = convertToTensor(imag4, "imag", "complex"); + assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); + const inputs = {real: $real, imag: $imag}; + return ENGINE.runKernel(Complex, inputs); +} +var complex = op({complex_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function makeTensor(values, shape, inferredShape, dtype) { + if (dtype == null) { + dtype = inferDtype(values); + } + if (dtype === "complex64") { + throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); + } + if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { + throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); + } + if (shape != null) { + assertNonNegativeIntegerDimensions(shape); + const providedSize = sizeFromShape(shape); + const inferredSize = sizeFromShape(inferredShape); + assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); + for (let i = 0; i < inferredShape.length; ++i) { + const inferred = inferredShape[i]; + const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; + assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); + } + } + if (!isTypedArray(values) && !Array.isArray(values)) { + values = [values]; + } + shape = shape || inferredShape; + values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); + return ENGINE.makeTensor(values, shape, dtype); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function tensor(values, shape, dtype) { + const inferredShape = inferShape(values, dtype); + return makeTensor(values, shape, inferredShape, dtype); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DTYPE_VALUE_SIZE_MAP = { + float32: 4, + float16: 2, + int32: 4, + uint16: 2, + uint8: 1, + bool: 1, + complex64: 8 +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var NUM_BYTES_STRING_LENGTH = 4; +async function encodeWeights(tensors, group) { + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + } + const spec = {name, shape: t.shape, dtype: t.dtype}; + if (t.dtype === "string") { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i2 = 0; i2 < vals.length; i2++) { + const val = vals[i2]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return {data: concatenateTypedArrays(tensorValues), specs}; +} +function decodeWeights(buffer2, specs) { + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = sizeFromShape(shape); + let values; + if ("quantization" in spec) { + const quantization = spec.quantization; + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + if (!("min" in quantization && "scale" in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); + } + } else if (quantization.dtype === "float16") { + if (dtype !== "float32") { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); + } + } else { + throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); + if (dtype === "float32") { + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } else if (quantization.dtype === "float16") { + if (float16Decode === void 0) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } else { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); + } + } else if (dtype === "int32") { + if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } else if (dtype === "string") { + const size2 = sizeFromShape(spec.shape); + values = []; + for (let i = 0; i < size2; i++) { + const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } else { + const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); + if (dtype === "float32") { + values = new Float32Array(byteBuffer); + } else if (dtype === "int32") { + values = new Int32Array(byteBuffer); + } else if (dtype === "bool") { + values = new Uint8Array(byteBuffer); + } else if (dtype === "complex64") { + values = new Float32Array(byteBuffer); + const real4 = new Float32Array(values.length / 2); + const image3 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image3[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image3, shape, "float32"); + out[name] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name] = tensor(values, shape, dtype); + } + } + return out; +} +function concatenateTypedArrays(xs) { + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; +} +var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); +function stringByteLength(str) { + if (useNodeBuffer) { + return Buffer.byteLength(str); + } + return new Blob([str]).size; +} +function arrayBufferToBase64String(buffer2) { + if (useNodeBuffer) { + return Buffer.from(buffer2).toString("base64"); + } + const buf = new Uint8Array(buffer2); + let s = ""; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); +} +function base64StringToArrayBuffer(str) { + if (useNodeBuffer) { + const buf = Buffer.from(str, "base64"); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str); + const buffer2 = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer2.set([s.charCodeAt(i)], i); + } + return buffer2.buffer; +} +function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer2) => { + totalByteLength += buffer2.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer2) => { + temp.set(new Uint8Array(buffer2), offset); + offset += buffer2.byteLength; + }); + return temp.buffer; +} +function basename(path) { + const SEPARATOR = "/"; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; +} +function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("Expected JSON model topology, received ArrayBuffer."); + } + return { + dateSaved: new Date(), + modelTopologyType: "JSON", + modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength + }; +} +function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + e -= 8388608; + m <<= 1; + } + m &= ~8388608; + e += 947912704; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 939524096 + (i - 1024 << 13); + } + return mantisaTable; +} +function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + exponentTable[63] = 3347054592; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + return exponentTable; +} +function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; +} +function getFloat16Decoder() { + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer2 = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer2); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer2); + }; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var IORouterRegistry = class { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, "save"); + } + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, "load", loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; + routers.forEach((router) => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } +}; +var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); +var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); +var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); +var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DATABASE_NAME = "tensorflowjs"; +var DATABASE_VERSION = 1; +var MODEL_STORE_NAME = "models_store"; +var INFO_STORE_NAME = "model_info_store"; +function getIndexedDBFactory() { + if (!env().getBool("IS_BROWSER")) { + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + } + const theWindow = typeof window === "undefined" ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; + if (factory == null) { + throw new Error("The current browser does not appear to support IndexedDB."); + } + return factory; +} +function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, {keyPath: "modelPath"}); + db.createObjectStore(INFO_STORE_NAME, {keyPath: "modelPath"}); +} +var BrowserIndexedDB = class { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + } else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = (error) => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } else { + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({modelPath: this.modelPath, modelArtifactsInfo}); + let modelTx; + putInfoRequest.onsuccess = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({modelArtifactsInfo}); + putModelRequest.onerror = (error) => { + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = (error2) => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = (error) => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +BrowserIndexedDB.URL_SCHEME = "indexeddb://"; +var indexedDBRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(indexedDBRouter); +IORouterRegistry.registerLoadRouter(indexedDBRouter); +function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); +} +function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; +} +var BrowserIndexedDBManager = class { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, "readonly"); + const store = tx.objectStore(INFO_STORE_NAME); + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = (error) => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); + } else { + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); + }; + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = (error) => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = (error) => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PATH_SEPARATOR = "/"; +var PATH_PREFIX = "tensorflowjs_models"; +var INFO_SUFFIX = "info"; +var MODEL_TOPOLOGY_SUFFIX = "model_topology"; +var WEIGHT_SPECS_SUFFIX = "weight_specs"; +var WEIGHT_DATA_SUFFIX = "weight_data"; +var MODEL_METADATA_SUFFIX = "model_metadata"; +function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; +} +function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); +} +function maybeStripScheme2(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; +} +var BrowserLocalStorage = class { + constructor(modelPath) { + if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { + throw new Error("The current environment does not support local storage."); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error("For local storage, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); + const result = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy + }; + if (modelArtifacts.signature != null) { + result.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + result.modelInitializer = modelArtifacts.modelInitializer; + } + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); + return {modelArtifactsInfo}; + } catch (err) { + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + async load() { + const info2 = JSON.parse(this.LS.getItem(this.keys.info)); + if (info2 == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info2.modelTopologyType !== "JSON") { + throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); + } + const out = {}; + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + } + out.modelTopology = topology; + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + } + out.weightSpecs = weightSpecs; + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata["format"]; + out.generatedBy = metadata["generatedBy"]; + out.convertedBy = metadata["convertedBy"]; + if (metadata["signature"] != null) { + out.signature = metadata["signature"]; + } + if (metadata["userDefinedMetadata"] != null) { + out.userDefinedMetadata = metadata["userDefinedMetadata"]; + } + if (metadata["modelInitializer"] != null) { + out.modelInitializer = metadata["modelInitializer"]; + } + } + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + } + out.weightData = base64StringToArrayBuffer(weightDataBase64); + return out; + } +}; +BrowserLocalStorage.URL_SCHEME = "localstorage://"; +var localStorageRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(localStorageRouter); +IORouterRegistry.registerLoadRouter(localStorageRouter); +function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); +} +var BrowserLocalStorageManager = class { + constructor() { + assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); + assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme2(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info2 = JSON.parse(this.LS.getItem(keys.info)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + return info2; + } +}; +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var URL_SCHEME_SUFFIX = "://"; +var ModelStoreManagerRegistry = class { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + static registerManager(scheme, manager) { + assert(scheme != null, () => "scheme must not be undefined or null."); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + assert(scheme.length > 0, () => "scheme must not be an empty string."); + const registry = ModelStoreManagerRegistry.getInstance(); + assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } +}; +function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1] + }; +} +async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); + assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); + assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); + assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; +} +async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; +} +async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); +} +async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PlatformBrowser = class { + fetch(path, init2) { + return fetch(path, init2); + } + now() { + return performance.now(); + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); + } + if (this.textEncoder == null) { + this.textEncoder = new TextEncoder(); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + return new TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_BROWSER")) { + env().setPlatform("browser", new PlatformBrowser()); + try { + ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); + } catch (err) { + } + try { + ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); + } catch (err) { + } +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var getNodeFetch = { + importFetch: () => require_browser() +}; +var systemFetch; +var PlatformNode = class { + constructor() { + this.util = require("util"); + this.textEncoder = new this.util.TextEncoder(); + } + fetch(path, requestInits) { + if (env().global.fetch != null) { + return env().global.fetch(path, requestInits); + } + if (systemFetch == null) { + systemFetch = getNodeFetch.importFetch(); + } + return systemFetch(path, requestInits); + } + now() { + const time2 = process.hrtime(); + return time2[0] * 1e3 + time2[1] / 1e6; + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + if (bytes.length === 0) { + return ""; + } + return new this.util.TextDecoder(encoding).decode(bytes); + } +}; +if (env().get("IS_NODE")) { + env().setPlatform("node", new PlatformNode()); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function buffer(shape, dtype = "float32", values) { + dtype = dtype || "float32"; + assertNonNegativeIntegerDimensions(shape); + return new TensorBuffer(shape, dtype, values); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function cast_(x, dtype) { + const $x = convertToTensor(x, "x", "cast"); + if (!isValidDtype(dtype)) { + throw new Error(`Failed to cast to unknown dtype ${dtype}`); + } + if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { + throw new Error("Only strings can be casted to strings"); + } + const inputs = {x: $x}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, inputs, attrs); +} +var cast = op({cast_}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function clone_(x) { + const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); + const inputs = {x: $x}; + return ENGINE.runKernel(Identity, inputs); +} +var clone = op({clone_}); +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function print2(x, verbose = false) { + console.log(x.toString(verbose)); +} +/** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +getOrMakeEngine(); +var opHandler2 = { + buffer, + cast, + clone, + print: print2 +}; +setOpHandler(opHandler2); +var io_exports = {}; +__export2(io_exports, { + browserFiles: () => browserFiles, + browserHTTPRequest: () => browserHTTPRequest, + concatenateArrayBuffers: () => concatenateArrayBuffers, + copyModel: () => copyModel, + decodeWeights: () => decodeWeights, + encodeWeights: () => encodeWeights, + fromMemory: () => fromMemory, + getLoadHandlers: () => getLoadHandlers, + getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, + getSaveHandlers: () => getSaveHandlers, + http: () => http, + isHTTPScheme: () => isHTTPScheme, + listModels: () => listModels, + loadWeights: () => loadWeights, + moveModel: () => moveModel, + registerLoadRouter: () => registerLoadRouter, + registerSaveRouter: () => registerSaveRouter, + removeModel: () => removeModel, + weightsLoaderFactory: () => weightsLoaderFactory, + withSaveHandler: () => withSaveHandler +}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var DEFAULT_FILE_NAME_PREFIX = "model"; +var DEFAULT_JSON_EXTENSION_NAME = ".json"; +var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; +function defer(f) { + return new Promise((resolve) => setTimeout(resolve)).then(f); +} +var BrowserDownloads = class { + constructor(fileNamePrefix) { + if (!env().getBool("IS_BROWSER")) { + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof document === "undefined") { + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], {type: "application/octet-stream"})); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); + } else { + const weightsManifest = [{ + paths: ["./" + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: "application/json"})); + const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); + } + return {modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts)}; + } + } +}; +BrowserDownloads.URL_SCHEME = "downloads://"; +var BrowserFiles = class { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); + } + this.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({modelTopology}); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event2) => { + const weightData = event2.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + const result = { + modelTopology, + weightSpecs, + weightData: concatenateArrayBuffers(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.signature != null) { + result.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + result.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + result.modelInitializer = modelJSON.modelInitializer; + } + resolve(result); + } + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.map((file) => basename(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach((path) => { + const pathBasename = basename(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } else { + pathToFile[path] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); + } + return pathToFile; + } +}; +var browserDownloadsRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } else { + return null; + } + } +}; +IORouterRegistry.registerSaveRouter(browserDownloadsRouter); +function browserDownloads(fileNamePrefix = "model") { + return new BrowserDownloads(fileNamePrefix); +} +function browserFiles(files) { + return new BrowserFiles(files); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then((value) => { + const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises2) { + assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); + } + function checkFraction(startFraction2, endFraction2) { + assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); + assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); + assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); + } + return Promise.all(promises.map(registerMonitor)); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; + const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, {isBinary: true})); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map((response) => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; +} +async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, {requestInit}); + const loadWeights2 = weightsLoaderFactory(fetchWeights); + return loadWeights2(manifest, filePathPrefix, weightNames); +} +function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = "", weightNames) => { + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach((weightsEntry) => { + const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; + const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every((found) => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. +Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); + } + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach((i) => { + manifest[i].paths.forEach((filepath) => { + const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach((i) => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + groupBytes += buffers[bufferIndexOffset + i2].byteLength; + } + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); + groupByteBuffer.set(buffer2, groupBufferOffset); + groupBufferOffset += buffer2.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach((weightsEntry) => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); + for (const name in nameToTensorMap) { + weightsTensorMap[name] = nameToTensorMap[name]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; +var JSON_TYPE = "application/json"; +var HTTPRequest = class { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = "POST"; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); + this.fetch = loadOptions.fetchFunc; + } else { + this.fetch = env().platform.fetch; + } + assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); + if (Array.isArray(path)) { + assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); + } + const init2 = Object.assign({method: this.DEFAULT_METHOD}, this.requestInit); + init2.body = new FormData(); + const weightsManifest = [{ + paths: ["./model.weights.bin"], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: JSON_TYPE}), "model.json"); + if (modelArtifacts.weightData != null) { + init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], {type: OCTET_STREAM_MIME_TYPE}), "model.weights.bin"); + } + const response = await this.fetch(this.path, init2); + if (response.ok) { + return { + modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), + responses: [response] + }; + } else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); + } + } + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); + } + let modelConfig; + try { + modelConfig = await modelConfigRequest.json(); + } catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + if (this.path.endsWith(".pb")) { + message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; + } else { + message += " Please make sure the server is serving valid JSON for this request."; + } + throw new Error(message); + } + const modelTopology = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const signature = modelConfig.signature; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + generatedBy, + convertedBy, + format + }; + if (signature != null) { + artifacts.signature = signature; + } + if (userDefinedMetadata != null) { + artifacts.userDefinedMetadata = userDefinedMetadata; + } + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, concatenateArrayBuffers(buffers)]; + } +}; +HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; +function parseUrl(url) { + const lastSlash = url.lastIndexOf("/"); + const lastSearchParam = url.lastIndexOf("?"); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; + return [prefix + "/", suffix]; +} +function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; +} +var httpRouter = (url, loadOptions) => { + if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { + return null; + } else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); + } else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; +}; +IORouterRegistry.registerSaveRouter(httpRouter); +IORouterRegistry.registerLoadRouter(httpRouter); +function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); +} +function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var PassthroughLoader = class { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } +}; +var PassthroughSaver = class { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } +}; +function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({modelTopology: modelArtifacts}); + } + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } +} +function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); +} +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var math_exports = {}; +__export2(math_exports, { + confusionMatrix: () => confusionMatrix +}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function matMul_(a, b, transposeA = false, transposeB = false) { + let $a = convertToTensor(a, "a", "matMul"); + let $b = convertToTensor(b, "b", "matMul"); + [$a, $b] = makeTypesMatch($a, $b); + const inputs = {a: $a, b: $b}; + const attrs = {transposeA, transposeB}; + return ENGINE.runKernel(BatchMatMul, inputs, attrs); +} +var matMul = op({matMul_}); +/** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function oneHot_(indices, depth, onValue = 1, offValue = 0) { + if (depth < 2) { + throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); + } + const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); + const inputs = {indices: $indices}; + const attrs = {depth, onValue, offValue}; + return ENGINE.runKernel(OneHot, inputs, attrs); +} +var oneHot = op({oneHot_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function transpose_(x, perm) { + const $x = convertToTensor(x, "x", "transpose"); + if (perm == null) { + perm = $x.shape.map((s, i) => i).reverse(); + } + assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); + perm.forEach((axis) => { + assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); + }); + if ($x.rank <= 1) { + return $x.clone(); + } + const inputs = {x: $x}; + const attrs = {perm}; + return ENGINE.runKernel(Transpose, inputs, attrs); +} +var transpose = op({transpose_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function confusionMatrix_(labels2, predictions, numClasses) { + const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); + const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); + assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); + assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); + assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); + assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); + assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); + const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); + const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); + const oneHotLabelsT = transpose(oneHotLabels); + const product = matMul(oneHotLabelsT, oneHotPredictions); + return cast(product, "int32"); +} +var confusionMatrix = op({confusionMatrix_}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var browser_exports = {}; +__export2(browser_exports, { + fromPixels: () => fromPixels, + fromPixelsAsync: () => fromPixelsAsync, + toPixels: () => toPixels +}); +/** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +function tensor3d(values, shape, dtype) { + assertNonNull(values); + if (shape != null && shape.length !== 3) { + throw new Error("tensor3d() requires shape to have three numbers"); + } + const inferredShape = inferShape(values, dtype); + if (inferredShape.length !== 3 && inferredShape.length !== 1) { + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + } + if (inferredShape.length === 1 && shape == null) { + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + } + return makeTensor(values, shape, inferredShape, dtype); +} +/** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ +var fromPixels2DContext; +function fromPixels_(pixels, numChannels = 3) { + if (numChannels > 4) { + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + } + if (pixels == null) { + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + } + let isPixelData2 = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + let isImageBitmap = false; + if (pixels.data instanceof Uint8Array) { + isPixelData2 = true; + } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { + isImageData = true; + } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { + isVideo = true; + } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { + isImage = true; + } else if (pixels.getContext != null) { + isCanvasLike = true; + } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { + isImageBitmap = true; + } else { + throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { + throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the s5){let A=Mu*i,y=Array.from(e.slice(0,A)),g=Array.from(e.slice((o-Mu)*i,o*i));return n==="complex64"&&(y=$u(y),g=$u(g)),["["+y.map((w,b)=>Fu(w,a[b],n)).join(", ")+", ..., "+g.map((w,b)=>Fu(w,a[o-Mu+b],n)).join(", ")+"]"]}let m=n==="complex64"?$u(e):Array.from(e);return["["+m.map((A,y)=>Fu(A,a[y],n)).join(", ")+"]"]}let c=t.slice(1),u=r.slice(1),h=r[0]*i,d=[];if(o>s5){for(let m=0;m`Length of values '${r}' does not match the size inferred by the shape '${this.size}'.`)}if(t==="complex64")throw new Error("complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).");this.values=n||Gg(t,this.size),this.strides=Ki(e)}set(e,...t){t.length===0&&(t=[0]),M(t.length===this.rank,()=>`The number of provided coordinates (${t.length}) must match the rank (${this.rank})`);let n=this.locToIndex(t);this.values[n]=e}get(...e){e.length===0&&(e=[0]);let t=0;for(let r of e){if(r<0||r>=this.shape[t]){let a=`Requested out of range element at ${e}. Buffer shape=${this.shape}`;throw new Error(a)}t++}let n=e[e.length-1];for(let r=0;rad(n))}catch(n){throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes().")}}return e}dataSync(){this.throwIfDisposed();let e=Cr().readSync(this.dataId);if(this.dtype==="string")try{return e.map(t=>ad(t))}catch(t){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();let e=await Cr().read(this.dataId);return this.dtype==="string"?e:new Uint8Array(e.buffer)}dispose(){this.isDisposed||(Cr().disposeTensor(this),this.isDisposedInternal=!0)}get isDisposed(){return this.isDisposedInternal}throwIfDisposed(){if(this.isDisposed)throw new Error("Tensor is disposed.")}print(e=!1){return Qo.print(this,e)}clone(){return this.throwIfDisposed(),Qo.clone(this)}toString(e=!1){let t=this.dataSync();return _k(t,this.shape,this.dtype,e)}cast(e){return this.throwIfDisposed(),Qo.cast(this,e)}variable(e=!0,t,n){return this.throwIfDisposed(),Cr().makeVariable(this,e,t,n)}};Object.defineProperty(Ve,Symbol.hasInstance,{value:e=>!!e&&e.data!=null&&e.dataSync!=null&&e.throwIfDisposed!=null});function Z(){return cf("Tensor",()=>Ve)}Z();var Du=class extends Ve{constructor(e,t,n,r){super(e.shape,e.dtype,e.dataId,r);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(!ea(e.shape,this.shape))throw new Error(`shape of the new value (${e.shape}) and previous value (${this.shape}) must match`);Cr().disposeTensor(this),this.dataId=e.dataId,Cr().incRef(this,null)}dispose(){Cr().disposeVariable(this),this.isDisposedInternal=!0}};Object.defineProperty(Du,Symbol.hasInstance,{value:e=>e instanceof Ve&&e.assign!=null&&e.assign instanceof Function});var mr={};Oe(mr,{assertTypesMatch:()=>o5,getTensorsInContainer:()=>ff,isTensorInList:()=>Sk,makeTypesMatch:()=>bt});var mf;(function(e){e.R0="R0",e.R1="R1",e.R2="R2",e.R3="R3",e.R4="R4",e.R5="R5",e.R6="R6"})(mf||(mf={}));var Af;(function(e){e.float32="float32",e.int32="int32",e.bool="int32",e.complex64="complex64"})(Af||(Af={}));var yf;(function(e){e.float32="float32",e.int32="int32",e.bool="bool",e.complex64="complex64"})(yf||(yf={}));var gf;(function(e){e.float32="float32",e.int32="float32",e.bool="float32",e.complex64="complex64"})(gf||(gf={}));var xf;(function(e){e.float32="complex64",e.int32="complex64",e.bool="complex64",e.complex64="complex64"})(xf||(xf={}));var Tk={float32:gf,int32:Af,bool:yf,complex64:xf};function nr(e,t){if(e==="string"||t==="string"){if(e==="string"&&t==="string")return"string";throw new Error(`Can not upcast ${e} with ${t}`)}return Tk[e][t]}function id(e){return nr(e,"int32")}function bt(e,t){if(e.dtype===t.dtype)return[e,t];let n=nr(e.dtype,t.dtype);return[e.cast(n),t.cast(n)]}function o5(e,t){M(e.dtype===t.dtype,()=>`The dtypes of the first(${e.dtype}) and second(${t.dtype}) input must match`)}function Sk(e,t){return t.some(n=>n.id===e.id)}function ff(e){let t=[],n=new Set;return l5(e,t,n),t}function l5(e,t,n){if(e==null)return;if(e instanceof Ve){t.push(e);return}if(!Ck(e))return;let r=e;for(let a in r){let s=r[a];n.has(s)||(n.add(s),l5(s,t,n))}}function Ck(e){return Array.isArray(e)||typeof e=="object"}function wf(e){return e.kernelName!=null}var u5=class{constructor(){this.registeredVariables={},this.nextTapeNodeId=0,this.numBytes=0,this.numTensors=0,this.numStringTensors=0,this.numDataBuffers=0,this.gradientDepth=0,this.kernelDepth=0,this.scopeStack=[],this.numDataMovesStack=[],this.nextScopeId=0,this.tensorInfo=new WeakMap,this.profiling=!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(let e in this.registeredVariables)this.registeredVariables[e].dispose()}},Ou=class{constructor(e){this.ENV=e,this.registry={},this.registryFactory={},this.pendingBackendInitId=0,this.state=new u5}async ready(){if(this.pendingBackendInit!=null)return this.pendingBackendInit.then(()=>{});if(this.backendInstance!=null)return;let e=this.getSortedBackends();for(let t=0;t{e.setupFunc!=null&&e.setupFunc(this.backendInstance)})}disposeRegisteredKernels(e){Jo(e).forEach(t=>{t.disposeFunc!=null&&t.disposeFunc(this.registry[e])})}initializeBackend(e){let t=this.registryFactory[e];if(t==null)throw new Error(`Cannot initialize backend ${e}, no registration found.`);try{let n=t.factory();if(n&&!(n instanceof uu)&&typeof n.then=="function"){let r=++this.pendingBackendInitId,a=n.then(s=>r(rthis.registryFactory[t].priority-this.registryFactory[e].priority)}initializeBackendsAndReturnBest(){let e=this.getSortedBackends();for(let t=0;tthis.startScope(n),()=>this.endScope(r),()=>(r=t(),r instanceof Promise&&console.error("Cannot return a Promise inside of tidy."),r))}scopedRun(e,t,n){e();try{let r=n();return t(),r}catch(r){throw t(),r}}nextTensorId(){return Ou.nextTensorId++}nextVariableId(){return Ou.nextVariableId++}clone(e){let t=$.runKernel(vs,{x:e}),n={x:e},r=s=>({x:()=>{let i="float32",o={x:s},l={dtype:i};return $.runKernel(cs,o,l)}}),a=[];return this.addTapeNode(this.state.activeScope.name,n,[t],r,a,{}),t}runKernel(e,t,n){if(nd(e,this.backendName)==null)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){let r=this.backend.numDataIds(),a=0;n.forEach(o=>{a+=o.dtype==="complex64"?3:1});let s=this.state.numDataMovesStack[this.state.numDataMovesStack.length-1],i=r-t-a-s;if(i>0)throw new Error(`Backend '${this.backendName}' has an internal memory leak (${i} data ids) after running '${e}'`)}runKernelFunc(e){let t,n=[],r=this.isTapeOn(),a=this.state.numBytes,s=this.state.numTensors;this.shouldCheckForMemLeaks()&&this.state.numDataMovesStack.push(0);let i;this.backendName==null&&this.backend;let o,l=wf(e)?e.kernelName:this.state.activeScope!=null?this.state.activeScope.name:"";if(wf(e)){let{kernelName:p,inputs:f,attrs:m}=e;this.backendName==null&&this.backend;let A=nd(p,this.backendName);M(A!=null,()=>`Cannot find registered kernel '${p}' for backend '${this.backendName}'`),i=()=>{let y=this.backend.numDataIds();o=A.kernelFunc({inputs:f,attrs:m,backend:this.backend});let g=Array.isArray(o)?o:[o];this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(p,y,g);let w=g.map(b=>{if(b.rank!=null)return b;let{dataId:_,shape:x,dtype:N}=b;return this.makeTensorFromDataId(_,x,N)});if(r){let b=this.getTensorsForGradient(p,f,w);n=this.saveTensorsForBackwardMode(b)}return w}}else{let{forwardFunc:p}=e,f=m=>{!r||(n=m.map(A=>this.keep(this.clone(A))))};i=()=>{let m=this.backend.numDataIds();o=this.tidy(()=>p(this.backend,f));let A=Array.isArray(o)?o:[o];return this.shouldCheckForMemLeaks()&&this.checkKernelForMemLeak(l,m,A),A}}let{inputs:c,attrs:u}=e,h=wf(e)?null:e.backwardsFunc,d;return this.scopedRun(()=>this.state.kernelDepth++,()=>this.state.kernelDepth--,()=>{!this.ENV.getBool("DEBUG")&&!this.state.profiling?t=i():(d=this.profiler.profileKernel(l,c,()=>i()),this.ENV.getBool("DEBUG")&&this.profiler.logKernelProfile(d),t=d.outputs)}),r&&this.addTapeNode(l,c,t,h,n,u),this.state.profiling&&this.state.activeProfile.kernels.push({name:l,bytesAdded:this.state.numBytes-a,totalBytesSnapshot:this.state.numBytes,tensorsAdded:this.state.numTensors-s,totalTensorsSnapshot:this.state.numTensors,inputShapes:Object.keys(c).map(p=>c[p]!=null?c[p].shape:null),outputShapes:t.map(p=>p.shape),kernelTimeMs:d.timeMs,extraInfo:d.extraInfo}),Array.isArray(o)?t:t[0]}saveTensorsForBackwardMode(e){return e.map(t=>this.keep(this.clone(t)))}getTensorsForGradient(e,t,n){let r=df(e);if(r!=null){let a=r.inputsToSave||[],s=r.outputsToSave||[],i;r.saveAllInputs?(M(Array.isArray(t),()=>"saveAllInputs is true, expected inputs to be an array."),i=Object.keys(t).map(l=>t[l])):i=a.map(l=>t[l]);let o=n.filter((l,c)=>s[c]);return i.concat(o)}return[]}makeTensor(e,t,n,r){if(e==null)throw new Error("Values passed to engine.makeTensor() are null");n=n||"float32",r=r||this.backend;let a=e;n==="string"&&ba(e[0])&&(a=e.map(o=>Ru(o)));let s=r.write(a,t,n),i=new Ve(t,n,s,this.nextTensorId());if(this.trackTensor(i,r),n==="string"){let o=this.state.tensorInfo.get(s),l=Kg(a);this.state.numBytes+=l-o.bytes,o.bytes=l}return i}makeTensorFromDataId(e,t,n,r){n=n||"float32";let a=new Ve(t,n,e,this.nextTensorId());return this.trackTensor(a,r),a}makeVariable(e,t=!0,n,r){n=n||this.nextVariableId().toString(),r!=null&&r!==e.dtype&&(e=e.cast(r));let a=new Du(e,t,n,this.nextTensorId());if(this.state.registeredVariables[a.name]!=null)throw new Error(`Variable with name ${a.name} was already registered`);return this.state.registeredVariables[a.name]=a,this.incRef(a,this.backend),a}trackTensor(e,t){this.state.numTensors++,e.dtype==="string"&&this.state.numStringTensors++;let n=0;e.dtype!=="complex64"&&e.dtype!=="string"&&(n=e.size*af(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 Du||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;let t=this.state.tensorInfo.get(e.dataId);if(this.state.numTensors--,e.dtype==="string"&&(this.state.numStringTensors--,this.state.numBytes-=t.bytes),e.dtype!=="complex64"&&e.dtype!=="string"){let n=e.size*af(e.dtype);this.state.numBytes-=n}t.backend.disposeData(e.dataId)&&this.removeDataId(e.dataId,t.backend)}disposeVariables(){for(let e in this.state.registeredVariables){let t=this.state.registeredVariables[e];this.disposeVariable(t)}}disposeVariable(e){this.disposeTensor(e),this.state.registeredVariables[e.name]!=null&&delete this.state.registeredVariables[e.name]}memory(){let 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,e.reasons==null&&(e.reasons=[]),e.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)")),e}async profile(e){this.state.profiling=!0;let 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(r=>r.totalBytesSnapshot)),this.state.activeProfile.newBytes=this.state.numBytes-t,this.state.activeProfile.newTensors=this.state.numTensors-n;for(let r of this.state.activeProfile.kernels)r.kernelTimeMs=await r.kernelTimeMs,r.extraInfo=await r.extraInfo;return this.state.activeProfile}isTapeOn(){return this.state.gradientDepth>0&&this.state.kernelDepth===0}addTapeNode(e,t,n,r,a,s){let i={id:this.state.nextTapeNodeId++,kernelName:e,inputs:t,outputs:n,saved:a},o=df(e);o!=null&&(r=o.gradFunc),r!=null&&(i.gradient=l=>(l=l.map((c,u)=>{if(c==null){let h=n[u],d=vh(h.size,h.dtype);return this.makeTensor(d,h.shape,h.dtype)}return c}),r(l.length>1?l:l[0],a,s))),this.state.activeTape.push(i)}keep(e){return e.kept=!0,e}startTape(){this.state.gradientDepth===0&&(this.state.activeTape=[]),this.state.gradientDepth++}endTape(){this.state.gradientDepth--}startScope(e){let t={track:[],name:"unnamed scope",id:this.state.nextScopeId++};e&&(t.name=e),this.state.scopeStack.push(t),this.state.activeScope=t}endScope(e){let t=ff(e),n=new Set(t.map(a=>a.id));for(let a=0;a{!a.kept&&a.scopeId===r.id&&this.track(a)})}gradients(e,t,n,r=!1){if(M(t.length>0,()=>"gradients() received an empty list of xs."),n!=null&&n.dtype!=="float32")throw new Error(`dy must have 'float32' dtype, but has '${n.dtype}'`);let a=this.scopedRun(()=>this.startTape(),()=>this.endTape(),()=>this.tidy("forward",e));M(a instanceof Ve,()=>"The result y returned by f() must be a tensor.");let s=xk(this.state.activeTape,t,a);if(!r&&s.length===0&&t.length>0)throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y.");return this.tidy("backward",()=>{let i={};i[a.id]=n==null?Ek(a.shape):n,wk(i,s,l=>this.tidy(l),Rk);let o=t.map(l=>i[l.id]);return this.state.gradientDepth===0&&(this.state.activeTape.forEach(l=>{for(let c of l.saved)c.dispose()}),this.state.activeTape=null),{value:a,grads:o}})}customGrad(e){return M(_a(e),()=>"The f passed in customGrad(f) must be a function."),(...t)=>{M(t.every(i=>i instanceof Ve),()=>"The args passed in customGrad(f)(x1, x2,...) must all be tensors");let n,r={};t.forEach((i,o)=>{r[o]=i});let a=(i,o)=>(n=e(...t,o),M(n.value instanceof Ve,()=>"The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"),M(_a(n.gradFunc),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."),n.value),s=(i,o)=>{let l=n.gradFunc(i,o),c=Array.isArray(l)?l:[l];M(c.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(...)."),M(c.every(h=>h instanceof Ve),()=>"The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors.");let u={};return c.forEach((h,d)=>{u[d]=()=>h}),u};return this.runKernelFunc({forwardFunc:a,backwardsFunc:s,inputs:r})}}readSync(e){return this.state.tensorInfo.get(e).backend.readSync(e)}read(e){return this.state.tensorInfo.get(e).backend.read(e)}async time(e){let t=Eu(),n=await this.backend.time(e);return n.wallMs=Eu()-t,n}track(e){return this.state.activeScope!=null&&(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 u5;for(let e in this.registry)this.disposeRegisteredKernels(e),this.registry[e].dispose(),delete this.registry[e];this.backendName=null,this.backendInstance=null,this.pendingBackendInit=null}};Ou.nextTensorId=0;Ou.nextVariableId=0;function Ek(e){let t=sf(Ft(e),"float32");return $.makeTensor(t,e,"float32")}function c5(){let e=t5();if(e._tfengine==null){let t=new e5(e);e._tfengine=new Ou(t)}return ok(e._tfengine.ENV),kk(()=>e._tfengine),e._tfengine}var $=c5();function Rk(e,t){let n={a:e,b:t};return $.runKernel(va,n)}var zu={};Oe(zu,{isBrowser:()=>h5,isMobile:()=>Mk});function Fk(){return typeof navigator!="undefined"&&navigator!=null}function Mk(){if(Fk()){let e=navigator.userAgent||navigator.vendor||window.opera;return/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/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(e.substr(0,4))}return!1}function h5(){return typeof window!="undefined"&&window.document!=null||typeof WorkerGlobalScope!="undefined"}var Ar=J();Ar.registerFlag("DEBUG",()=>!1,e=>{e&&console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance.")});Ar.registerFlag("IS_BROWSER",()=>h5());Ar.registerFlag("IS_NODE",()=>typeof process!="undefined"&&typeof process.versions!="undefined"&&typeof process.versions.node!="undefined");Ar.registerFlag("IS_CHROME",()=>typeof navigator!="undefined"&&navigator!=null&&navigator.userAgent!=null&&/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor));Ar.registerFlag("PROD",()=>!1);Ar.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY",()=>Ar.getBool("DEBUG"));Ar.registerFlag("DEPRECATION_WARNINGS_ENABLED",()=>!0);Ar.registerFlag("IS_TEST",()=>!1);Ar.registerFlag("CHECK_COMPUTATION_FOR_ERRORS",()=>!0);Ar.registerFlag("WRAP_TO_IMAGEBITMAP",()=>!1);function Er(e,t){let n=e;if(rn(e))return t==="string"?[]:[e.length];if(!Array.isArray(e))return[];let r=[];for(;Array.isArray(n)||rn(n)&&t!=="string";)r.push(n.length),n=n[0];return Array.isArray(e)&&J().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")&&d5(e,r,[]),r}function d5(e,t,n){if(n=n||[],!Array.isArray(e)&&!rn(e)){M(t.length===0,()=>`Element arr[${n.join("][")}] is a primitive, but should be an array/TypedArray of ${t[0]} elements`);return}M(t.length>0,()=>`Element arr[${n.join("][")}] should be a primitive, but is an array of ${e.length} elements`),M(e.length===t[0],()=>`Element arr[${n.join("][")}] should have ${t[0]} elements, but has ${e.length} elements`);let r=t.slice(1);for(let a=0;a=0&&(a=r),p5(r,a,t,n),e==null||!rn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string"){let o=e==null?"null":e.constructor.name;throw new Error(`Argument '${t}' passed to '${n}' must be a Tensor or TensorLike, but got '${o}'`)}let s=Er(e,a);!rn(e)&&!Array.isArray(e)&&(e=[e]);let i=a!=="string"?rd(e,a):ss(e,[],!0);return $.makeTensor(i,s,a)}function Pu(e,t,n,r="numeric"){if(!Array.isArray(e))throw new Error(`Argument ${t} passed to ${n} must be a \`Tensor[]\` or \`TensorLike[]\``);return e.map((a,s)=>E(a,`${t}[${s}]`,n,r))}var f5="__op";function O(e){let t=Object.keys(e);if(t.length!==1)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],r=e[n];n.endsWith("_")&&(n=n.substring(0,n.length-1)),n=n+f5;let a=(...s)=>{$.startScope(n);try{let i=r(...s);return lf(i)&&console.error("Cannot return a Promise inside of tidy."),$.endScope(i),i}catch(i){throw $.endScope(null),i}};return Object.defineProperty(a,"name",{value:n,configurable:!0}),a}function $k(e,t){let n=E(e,"real","complex"),r=E(t,"imag","complex");nn(n.shape,r.shape,`real and imag shapes, ${n.shape} and ${r.shape}, must match in call to tf.complex().`);let a={real:n,imag:r};return $.runKernel(Ch,a)}var Sa=O({complex_:$k});function Ta(e,t,n,r){if(r==null&&(r=bh(e)),r==="complex64")throw new Error("Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).");if(!rn(e)&&!Array.isArray(e)&&typeof e!="number"&&typeof e!="boolean"&&typeof e!="string")throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray");if(t!=null){of(t);let a=Ft(t),s=Ft(n);M(a===s,()=>`Based on the provided shape, [${t}], the tensor should have ${a} values but has ${s}`);for(let i=0;i`Error creating a new Tensor. Inferred shape (${n}) does not match the provided shape (${t}). `)}}return!rn(e)&&!Array.isArray(e)&&(e=[e]),t=t||n,e=r!=="string"?rd(e,r):ss(e,[],!0),$.makeTensor(e,t,r)}function yr(e,t,n){let r=Er(e,n);return Ta(e,t,r,n)}var bf={float32:4,float16:2,int32:4,uint16:2,uint8:1,bool:1,complex64:8},od=4;async function Ok(e,t){let n=[],r=[],a=Array.isArray(e)?e.map(i=>i.name):Object.keys(e);for(let i=0;i{let d=await l.bytes(),p=d.reduce((A,y)=>A+y.length,0)+od*d.length,f=new Uint8Array(p),m=0;for(let A=0;A{if(t+=s.byteLength,n.push(s.byteLength===s.buffer.byteLength?s:new s.constructor(s)),!(s instanceof Float32Array||s instanceof Int32Array||s instanceof Uint8Array))throw new Error(`Unsupported TypedArray subtype: ${s.constructor.name}`)});let r=new Uint8Array(t),a=0;return n.forEach(s=>{r.set(new Uint8Array(s.buffer),a),a+=s.byteLength}),r.buffer}var _f=typeof Buffer!="undefined"&&(typeof Blob=="undefined"||typeof atob=="undefined"||typeof btoa=="undefined");function A5(e){return _f?Buffer.byteLength(e):new Blob([e]).size}function Pk(e){if(_f)return Buffer.from(e).toString("base64");let t=new Uint8Array(e),n="";for(let r=0,a=t.length;r{t+=a.byteLength});let n=new Uint8Array(t),r=0;return e.forEach(a=>{n.set(new Uint8Array(a),r),r+=a.byteLength}),n.buffer}function y5(e){let t="/";for(e=e.trim();e.endsWith(t);)e=e.slice(0,e.length-1);let n=e.split(t);return n[n.length-1]}function Lu(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("Expected JSON model topology, received ArrayBuffer.");return{dateSaved:new Date,modelTopologyType:"JSON",modelTopologyBytes:e.modelTopology==null?0:A5(JSON.stringify(e.modelTopology)),weightSpecsBytes:e.weightSpecs==null?0:A5(JSON.stringify(e.weightSpecs)),weightDataBytes:e.weightData==null?0:e.weightData.byteLength}}function Wk(){let e=n=>{let r=n<<13,a=0;for(;(r&8388608)==0;)a-=8388608,r<<=1;return r&=~8388608,a+=947912704,r|a},t=new Uint32Array(2048);t[0]=0;for(let n=1;n<1024;n++)t[n]=e(n);for(let n=1024;n<2048;n++)t[n]=939524096+(n-1024<<13);return t}function Bk(){let 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}function Vk(){let e=new Uint32Array(64);for(let t=0;t<64;t++)e[t]=1024;return e[0]=e[32]=0,e}function zk(){let e=Wk(),t=Bk(),n=Vk();return r=>{let a=new ArrayBuffer(4*r.length),s=new Uint32Array(a);for(let i=0;i>10]+(o&1023)]+t[o>>10];s[i]=l}return new Float32Array(a)}}var Nt=class{constructor(){this.saveRouters=[],this.loadRouters=[]}static getInstance(){return Nt.instance==null&&(Nt.instance=new Nt),Nt.instance}static registerSaveRouter(e){Nt.getInstance().saveRouters.push(e)}static registerLoadRouter(e){Nt.getInstance().loadRouters.push(e)}static getSaveHandlers(e){return Nt.getHandlers(e,"save")}static getLoadHandlers(e,t){return Nt.getHandlers(e,"load",t)}static getHandlers(e,t,n){let r=[];return(t==="load"?Nt.getInstance().loadRouters:Nt.getInstance().saveRouters).forEach(a=>{let s=a(e,n);s!==null&&r.push(s)}),r}},Uk=e=>Nt.registerSaveRouter(e),jk=e=>Nt.registerLoadRouter(e),Hk=e=>Nt.getSaveHandlers(e),Gk=(e,t)=>Nt.getLoadHandlers(e,t),kf="tensorflowjs",If=1,ni="models_store",Ca="model_info_store";function g5(){if(!J().getBool("IS_BROWSER"))throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser.");let e=typeof window=="undefined"?self:window,t=e.indexedDB||e.mozIndexedDB||e.webkitIndexedDB||e.msIndexedDB||e.shimIndexedDB;if(t==null)throw new Error("The current browser does not appear to support IndexedDB.");return t}function Nf(e){let t=e.result;t.createObjectStore(ni,{keyPath:"modelPath"}),t.createObjectStore(Ca,{keyPath:"modelPath"})}var ri=class{constructor(e){if(this.indexedDB=g5(),e==null||!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((n,r)=>{let a=this.indexedDB.open(kf,If);a.onupgradeneeded=()=>Nf(a),a.onsuccess=()=>{let s=a.result;if(t==null){let i=s.transaction(ni,"readonly"),o=i.objectStore(ni).get(this.modelPath);o.onsuccess=()=>{if(o.result==null)return s.close(),r(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`));n(o.result.modelArtifacts)},o.onerror=l=>(s.close(),r(o.error)),i.oncomplete=()=>s.close()}else{let i=Lu(t),o=s.transaction(Ca,"readwrite"),l=o.objectStore(Ca),c=l.put({modelPath:this.modelPath,modelArtifactsInfo:i}),u;c.onsuccess=()=>{u=s.transaction(ni,"readwrite");let h=u.objectStore(ni).put({modelPath:this.modelPath,modelArtifacts:t,modelArtifactsInfo:i});h.onsuccess=()=>n({modelArtifactsInfo:i}),h.onerror=d=>{l=o.objectStore(Ca);let p=l.delete(this.modelPath);p.onsuccess=()=>(s.close(),r(h.error)),p.onerror=f=>(s.close(),r(h.error))}},c.onerror=h=>(s.close(),r(c.error)),o.oncomplete=()=>{u==null?s.close():u.oncomplete=()=>s.close()}}},a.onerror=s=>r(a.error)})}};ri.URL_SCHEME="indexeddb://";var x5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ri.URL_SCHEME)?qk(e.slice(ri.URL_SCHEME.length)):null;Nt.registerSaveRouter(x5);Nt.registerLoadRouter(x5);function qk(e){return new ri(e)}function Xk(e){return e.startsWith(ri.URL_SCHEME)?e.slice(ri.URL_SCHEME.length):e}var Kk=class{constructor(){this.indexedDB=g5()}async listModels(){return new Promise((e,t)=>{let n=this.indexedDB.open(kf,If);n.onupgradeneeded=()=>Nf(n),n.onsuccess=()=>{let r=n.result,a=r.transaction(Ca,"readonly"),s=a.objectStore(Ca).getAll();s.onsuccess=()=>{let i={};for(let o of s.result)i[o.modelPath]=o.modelArtifactsInfo;e(i)},s.onerror=i=>(r.close(),t(s.error)),a.oncomplete=()=>r.close()},n.onerror=r=>t(n.error)})}async removeModel(e){return e=Xk(e),new Promise((t,n)=>{let r=this.indexedDB.open(kf,If);r.onupgradeneeded=()=>Nf(r),r.onsuccess=()=>{let a=r.result,s=a.transaction(Ca,"readwrite"),i=s.objectStore(Ca),o=i.get(e),l;o.onsuccess=()=>{if(o.result==null)return a.close(),n(new Error(`Cannot find model with path '${e}' in IndexedDB.`));{let c=i.delete(e),u=()=>{l=a.transaction(ni,"readwrite");let h=l.objectStore(ni).delete(e);h.onsuccess=()=>t(o.result.modelArtifactsInfo),h.onerror=d=>n(o.error)};c.onsuccess=u,c.onerror=h=>(u(),a.close(),n(o.error))}},o.onerror=c=>(a.close(),n(o.error)),s.oncomplete=()=>{l==null?a.close():l.oncomplete=()=>a.close()}},r.onerror=a=>n(r.error)})}},ta="/",el="tensorflowjs_models",w5="info",Zk="model_topology",Yk="weight_specs",Jk="weight_data",Qk="model_metadata";function b5(e){return{info:[el,e,w5].join(ta),topology:[el,e,Zk].join(ta),weightSpecs:[el,e,Yk].join(ta),weightData:[el,e,Jk].join(ta),modelMetadata:[el,e,Qk].join(ta)}}function e9(e){let t=e.split(ta);if(t.length<3)throw new Error(`Invalid key format: ${e}`);return t.slice(1,t.length-1).join(ta)}function t9(e){return e.startsWith(ai.URL_SCHEME)?e.slice(ai.URL_SCHEME.length):e}var ai=class{constructor(e){if(!J().getBool("IS_BROWSER")||typeof window=="undefined"||typeof window.localStorage=="undefined")throw new Error("The current environment does not support local storage.");if(this.LS=window.localStorage,e==null||!e)throw new Error("For local storage, modelPath must not be null, undefined or empty.");this.modelPath=e,this.keys=b5(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.");{let t=JSON.stringify(e.modelTopology),n=JSON.stringify(e.weightSpecs),r=Lu(e);try{this.LS.setItem(this.keys.info,JSON.stringify(r)),this.LS.setItem(this.keys.topology,t),this.LS.setItem(this.keys.weightSpecs,n),this.LS.setItem(this.keys.weightData,Pk(e.weightData));let a={format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy};return e.signature!=null&&(a.signature=e.signature),e.userDefinedMetadata!=null&&(a.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(a.modelInitializer=e.modelInitializer),this.LS.setItem(this.keys.modelMetadata,JSON.stringify(a)),{modelArtifactsInfo:r}}catch(a){throw this.LS.removeItem(this.keys.info),this.LS.removeItem(this.keys.topology),this.LS.removeItem(this.keys.weightSpecs),this.LS.removeItem(this.keys.weightData),this.LS.removeItem(this.keys.modelMetadata),new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${r.modelTopologyBytes}, weightSpecsBytes=${r.weightSpecsBytes}, weightDataBytes=${r.weightDataBytes}.`)}}}async load(){let e=JSON.parse(this.LS.getItem(this.keys.info));if(e==null)throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);if(e.modelTopologyType!=="JSON")throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet.");let t={},n=JSON.parse(this.LS.getItem(this.keys.topology));if(n==null)throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`);t.modelTopology=n;let r=JSON.parse(this.LS.getItem(this.keys.weightSpecs));if(r==null)throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`);t.weightSpecs=r;let a=this.LS.getItem(this.keys.modelMetadata);if(a!=null){let i=JSON.parse(a);t.format=i.format,t.generatedBy=i.generatedBy,t.convertedBy=i.convertedBy,i.signature!=null&&(t.signature=i.signature),i.userDefinedMetadata!=null&&(t.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(t.modelInitializer=i.modelInitializer)}let s=this.LS.getItem(this.keys.weightData);if(s==null)throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`);return t.weightData=Lk(s),t}};ai.URL_SCHEME="localstorage://";var _5=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(ai.URL_SCHEME)?n9(e.slice(ai.URL_SCHEME.length)):null;Nt.registerSaveRouter(_5);Nt.registerLoadRouter(_5);function n9(e){return new ai(e)}var r9=class{constructor(){M(J().getBool("IS_BROWSER"),()=>"Current environment is not a web browser"),M(typeof window=="undefined"||typeof window.localStorage!="undefined",()=>"Current browser does not appear to support localStorage"),this.LS=window.localStorage}async listModels(){let e={},t=el+ta,n=ta+w5;for(let r=0;r"scheme must not be undefined or null."),e.endsWith(tl)&&(e=e.slice(0,e.indexOf(tl))),M(e.length>0,()=>"scheme must not be an empty string.");let n=Hn.getInstance();M(n.managers[e]==null,()=>`A model store manager is already registered for scheme '${e}'.`),n.managers[e]=t}static getManager(e){let t=this.getInstance().managers[e];if(t==null)throw new Error(`Cannot find model manager for scheme '${e}'`);return t}static getSchemes(){return Object.keys(this.getInstance().managers)}};function ld(e){if(e.indexOf(tl)===-1)throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${Hn.getSchemes().join(",")}`);return{scheme:e.split(tl)[0],path:e.split(tl)[1]}}async function v5(e,t,n=!1){M(e!==t,()=>`Old path and new path are the same: '${e}'`);let r=Nt.getLoadHandlers(e);M(r.length>0,()=>`Copying failed because no load handler is found for source URL ${e}.`),M(r.length<2,()=>`Copying failed because more than one (${r.length}) load handlers for source URL ${e}.`);let a=r[0],s=Nt.getSaveHandlers(t);M(s.length>0,()=>`Copying failed because no save handler is found for destination URL ${t}.`),M(s.length<2,()=>`Copying failed because more than one (${r.length}) save handlers for destination URL ${t}.`);let i=s[0],o=ld(e).scheme,l=ld(e).path,c=o===ld(e).scheme,u=await a.load();n&&c&&await Hn.getManager(o).removeModel(l);let h=await i.save(u);return n&&!c&&await Hn.getManager(o).removeModel(l),h.modelArtifactsInfo}async function a9(){let e=Hn.getSchemes(),t={};for(let n of e){let r=await Hn.getManager(n).listModels();for(let a in r){let s=n+tl+a;t[s]=r[a]}}return t}async function s9(e){let t=ld(e);return Hn.getManager(t.scheme).removeModel(t.path)}async function i9(e,t){return v5(e,t,!1)}async function o9(e,t){return v5(e,t,!0)}var l9=class{fetch(e,t){return fetch(e,t)}now(){return performance.now()}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Browser's encoder only supports utf-8, but got ${t}`);return this.textEncoder==null&&(this.textEncoder=new TextEncoder),this.textEncoder.encode(e)}decode(e,t){return new TextDecoder(t).decode(e)}};if(J().get("IS_BROWSER")){J().setPlatform("browser",new l9);try{Hn.registerManager(ai.URL_SCHEME,new r9)}catch(e){}try{Hn.registerManager(ri.URL_SCHEME,new Kk)}catch(e){}}var u9={importFetch:()=>A8()},Sf,c9=class{constructor(){this.util=require("util"),this.textEncoder=new this.util.TextEncoder}fetch(e,t){return J().global.fetch!=null?J().global.fetch(e,t):(Sf==null&&(Sf=u9.importFetch()),Sf(e,t))}now(){let e=process.hrtime();return e[0]*1e3+e[1]/1e6}encode(e,t){if(t!=="utf-8"&&t!=="utf8")throw new Error(`Node built-in encoder only supports utf-8, but got ${t}`);return this.textEncoder.encode(e)}decode(e,t){return e.length===0?"":new this.util.TextDecoder(t).decode(e)}};J().get("IS_NODE")&&J().setPlatform("node",new c9);function We(e,t="float32",n){return t=t||"float32",of(e),new $t(e,t,n)}function h9(e,t){let n=E(e,"x","cast");if(!Xg(t))throw new Error(`Failed to cast to unknown dtype ${t}`);if(t==="string"&&n.dtype!=="string"||t!=="string"&&n.dtype==="string")throw new Error("Only strings can be casted to strings");let r={x:n},a={dtype:t};return $.runKernel(cs,r,a)}var ye=O({cast_:h9});function d9(e){let t={x:E(e,"x","clone","string_or_numeric")};return $.runKernel(vs,t)}var Rr=O({clone_:d9});function k5(e,t=!1){console.log(e.toString(t))}c5();var p9={buffer:We,cast:ye,clone:Rr,print:k5};Ik(p9);var wn={};Oe(wn,{browserFiles:()=>f9,browserHTTPRequest:()=>A9,concatenateArrayBuffers:()=>vf,copyModel:()=>i9,decodeWeights:()=>m5,encodeWeights:()=>Ok,fromMemory:()=>y9,getLoadHandlers:()=>Gk,getModelArtifactsInfoForJSON:()=>Lu,getSaveHandlers:()=>Hk,http:()=>Cf,isHTTPScheme:()=>Tf,listModels:()=>a9,loadWeights:()=>m9,moveModel:()=>o9,registerLoadRouter:()=>jk,registerSaveRouter:()=>Uk,removeModel:()=>s9,weightsLoaderFactory:()=>I5,withSaveHandler:()=>g9});var x9="model",w9=".json",b9=".weights.bin";function N5(e){return new Promise(t=>setTimeout(t)).then(e)}var nl=class{constructor(e){if(!J().getBool("IS_BROWSER"))throw new Error("browserDownloads() cannot proceed because the current environment is not a browser.");e.startsWith(nl.URL_SCHEME)&&(e=e.slice(nl.URL_SCHEME.length)),(e==null||e.length===0)&&(e=x9),this.modelTopologyFileName=e+w9,this.weightDataFileName=e+b9}async save(e){if(typeof document=="undefined")throw new Error("Browser downloads are not supported in this environment since `document` is not present");let t=window.URL.createObjectURL(new Blob([e.weightData],{type:"application/octet-stream"}));if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet.");{let n=[{paths:["./"+this.weightDataFileName],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer);let a=window.URL.createObjectURL(new Blob([JSON.stringify(r)],{type:"application/json"})),s=this.jsonAnchor==null?document.createElement("a"):this.jsonAnchor;if(s.download=this.modelTopologyFileName,s.href=a,await N5(()=>s.dispatchEvent(new MouseEvent("click"))),e.weightData!=null){let i=this.weightDataAnchor==null?document.createElement("a"):this.weightDataAnchor;i.download=this.weightDataFileName,i.href=t,await N5(()=>i.dispatchEvent(new MouseEvent("click")))}return{modelArtifactsInfo:Lu(e)}}}};nl.URL_SCHEME="downloads://";var _9=class{constructor(e){if(e==null||e.length<1)throw new Error(`When calling browserFiles, at least 1 file is required, but received ${e}`);this.files=e}async load(){let e=this.files[0],t=this.files.slice(1);return new Promise((n,r)=>{let a=new FileReader;a.onload=s=>{let i=JSON.parse(s.target.result),o=i.modelTopology;if(o==null){r(new Error(`modelTopology field is missing from file ${e.name}`));return}t.length===0&&n({modelTopology:o});let l=i.weightsManifest;if(l==null){r(new Error(`weightManifest field is missing from file ${e.name}`));return}let c;try{c=this.checkManifestAndWeightFiles(l,t)}catch(p){r(p);return}let u=[],h=[],d=[];l.forEach(p=>{p.paths.forEach(f=>{h.push(f),d.push(null)}),u.push(...p.weights)}),l.forEach(p=>{p.paths.forEach(f=>{let m=new FileReader;m.onload=A=>{let y=A.target.result,g=h.indexOf(f);if(d[g]=y,d.indexOf(null)===-1){let w={modelTopology:o,weightSpecs:u,weightData:vf(d),format:i.format,generatedBy:i.generatedBy,convertedBy:i.convertedBy};i.signature!=null&&(w.signature=i.signature),i.userDefinedMetadata!=null&&(w.userDefinedMetadata=i.userDefinedMetadata),i.modelInitializer!=null&&(w.modelInitializer=i.modelInitializer),n(w)}},m.onerror=A=>r(`Failed to weights data from file of path '${f}'.`),m.readAsArrayBuffer(c[f])})})},a.onerror=s=>r(`Failed to read model topology and weights manifest JSON from file '${e.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`),a.readAsText(e)})}checkManifestAndWeightFiles(e,t){let n=[],r=t.map(s=>y5(s.name)),a={};for(let s of e)s.paths.forEach(i=>{let o=y5(i);if(n.indexOf(o)!==-1)throw new Error(`Duplicate file basename found in weights manifest: '${o}'`);if(n.push(o),r.indexOf(o)===-1)throw new Error(`Weight file with basename '${o}' is not provided.`);a[i]=t[r.indexOf(o)]});if(n.length!==t.length)throw new Error(`Mismatch in the number of files in weights manifest (${n.length}) and the number of weight files provided (${t.length}).`);return a}},k9=e=>J().getBool("IS_BROWSER")&&!Array.isArray(e)&&e.startsWith(nl.URL_SCHEME)?v9(e.slice(nl.URL_SCHEME.length)):null;Nt.registerSaveRouter(k9);function v9(e="model"){return new nl(e)}function f9(e){return new _9(e)}function S5(e,t,n,r){i(e),n=n==null?0:n,r=r==null?1:r,o(n,r);let a=0,s=l=>(l.then(c=>{let u=n+ ++a/e.length*(r-n);return t(u),c}),l);function i(l){M(l!=null&&Array.isArray(l)&&l.length>0,()=>"promises must be a none empty array")}function o(l,c){M(l>=0&&l<=1,()=>`Progress fraction must be in range [0, 1], but got startFraction ${l}`),M(c>=0&&c<=1,()=>`Progress fraction must be in range [0, 1], but got endFraction ${c}`),M(c>=l,()=>`startFraction must be no more than endFraction, but got startFraction ${l} and endFraction ${c}`)}return Promise.all(e.map(s))}async function T5(e,t){t==null&&(t={});let n=t.fetchFunc==null?J().platform.fetch:t.fetchFunc,r=e.map(c=>n(c,t.requestInit,{isBinary:!0})),a=0,s=.5,i=(t.onProgress==null?await Promise.all(r):await S5(r,t.onProgress,a,s)).map(c=>c.arrayBuffer()),o=.5,l=1;return t.onProgress==null?await Promise.all(i):await S5(i,t.onProgress,o,l)}async function m9(e,t="",n,r){return I5(a=>T5(a,{requestInit:r}))(e,t,n)}function I5(e){return async(t,n="",r)=>{let a=t.map(()=>!1),s={},i=r!=null?r.map(()=>!1):[],o=[];if(t.forEach((p,f)=>{let m=0;p.weights.forEach(A=>{let y="quantization"in A?A.quantization.dtype:A.dtype,g=bf[y]*Ft(A.shape),w=()=>{a[f]=!0,s[f]==null&&(s[f]=[]),s[f].push({manifestEntry:A,groupOffset:m,sizeBytes:g})};r!=null?r.forEach((b,_)=>{b===A.name&&(w(),i[_]=!0)}):w(),o.push(A.name),m+=g})}),!i.every(p=>p)){let p=r.filter((f,m)=>!i[m]);throw new Error(`Could not find weights in manifest with names: ${p.join(", ")}. -Manifest JSON has weights with names: ${o.join(", ")}.`)}let l=a.reduce((p,f,m)=>(f&&p.push(m),p),[]),c=[];l.forEach(p=>{t[p].paths.forEach(f=>{let m=n+(n.endsWith("/")?"":"/")+f;c.push(m)})});let u=await e(c),h={},d=0;return l.forEach(p=>{let f=t[p].paths.length,m=0;for(let w=0;w{let b=A.slice(w.groupOffset,w.groupOffset+w.sizeBytes),_=m5(b,[w.manifestEntry]);for(let x in _)h[x]=_[x]}),d+=f}),h}}var I9="application/octet-stream",N9="application/json",Ef=class{constructor(e,t){if(this.DEFAULT_METHOD="POST",t==null&&(t={}),this.weightPathPrefix=t.weightPathPrefix,this.onProgress=t.onProgress,this.weightUrlConverter=t.weightUrlConverter,t.fetchFunc!=null?(M(typeof t.fetchFunc=="function",()=>"Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"),this.fetch=t.fetchFunc):this.fetch=J().platform.fetch,M(e!=null&&e.length>0,()=>"URL path for http must not be null, undefined or empty."),Array.isArray(e)&&M(e.length===2,()=>`URL paths for http must have a length of 2, (actual length is ${e.length}).`),this.path=e,t.requestInit!=null&&t.requestInit.body!=null)throw new Error("requestInit is expected to have no pre-existing body, but has one.");this.requestInit=t.requestInit||{}}async save(e){if(e.modelTopology instanceof ArrayBuffer)throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet.");let t=Object.assign({method:this.DEFAULT_METHOD},this.requestInit);t.body=new FormData;let n=[{paths:["./model.weights.bin"],weights:e.weightSpecs}],r={modelTopology:e.modelTopology,format:e.format,generatedBy:e.generatedBy,convertedBy:e.convertedBy,weightsManifest:n};e.signature!=null&&(r.signature=e.signature),e.userDefinedMetadata!=null&&(r.userDefinedMetadata=e.userDefinedMetadata),e.modelInitializer!=null&&(r.modelInitializer=e.modelInitializer),t.body.append("model.json",new Blob([JSON.stringify(r)],{type:N9}),"model.json"),e.weightData!=null&&t.body.append("model.weights.bin",new Blob([e.weightData],{type:I9}),"model.weights.bin");let a=await this.fetch(this.path,t);if(a.ok)return{modelArtifactsInfo:Lu(e),responses:[a]};throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${a.status}.`)}async load(){let 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(p){let f=`Failed to parse model JSON of response from ${this.path}.`;throw this.path.endsWith(".pb")?f+=" 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.":f+=" Please make sure the server is serving valid JSON for this request.",new Error(f)}let n=t.modelTopology,r=t.weightsManifest,a=t.generatedBy,s=t.convertedBy,i=t.format,o=t.signature,l=t.userDefinedMetadata;if(n==null&&r==null)throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`);let c,u;r!=null&&([c,u]=await this.loadWeights(r));let h={modelTopology:n,weightSpecs:c,weightData:u,generatedBy:a,convertedBy:s,format:i};o!=null&&(h.signature=o),l!=null&&(h.userDefinedMetadata=l);let d=t.modelInitializer;return d&&(h.modelInitializer=d),h}async loadWeights(e){let t=Array.isArray(this.path)?this.path[1]:this.path,[n,r]=S9(t),a=this.weightPathPrefix||n,s=[];for(let c of e)s.push(...c.weights);let i=[],o=[];for(let c of e)for(let u of c.paths)this.weightUrlConverter!=null?o.push(this.weightUrlConverter(u)):i.push(a+u+r);this.weightUrlConverter&&i.push(...await Promise.all(o));let l=await T5(i,{requestInit:this.requestInit,fetchFunc:this.fetch,onProgress:this.onProgress});return[s,vf(l)]}};Ef.URL_SCHEME_REGEX=/^https?:\/\//;function S9(e){let t=e.lastIndexOf("/"),n=e.lastIndexOf("?"),r=e.substring(0,t),a=n>t?e.substring(n):"";return[r+"/",a]}function Tf(e){return e.match(Ef.URL_SCHEME_REGEX)!=null}var C5=(e,t)=>{if(typeof fetch=="undefined"&&(t==null||t.fetchFunc==null))return null;{let n=!0;if(Array.isArray(e)?n=e.every(r=>Tf(r)):n=Tf(e),n)return Cf(e,t)}return null};Nt.registerSaveRouter(C5);Nt.registerLoadRouter(C5);function Cf(e,t){return new Ef(e,t)}function A9(e,t){return Cf(e,t)}var Rf=class{constructor(e){this.modelArtifacts=e}async load(){return this.modelArtifacts}},T9=class{constructor(e){this.saveHandler=e}async save(e){return this.saveHandler(e)}};function y9(e,t,n,r){return arguments.length===1?e.modelTopology!=null||e.weightSpecs!=null?new Rf(e):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Rf({modelTopology:e})):(console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."),new Rf({modelTopology:e,weightSpecs:t,weightData:n,trainingConfig:r}))}function g9(e){return new T9(e)}var E5={};Oe(E5,{confusionMatrix:()=>C9});function E9(e,t,n=!1,r=!1){let a=E(e,"a","matMul"),s=E(t,"b","matMul");[a,s]=bt(a,s);let i={a,b:s},o={transposeA:n,transposeB:r};return $.runKernel(us,i,o)}var Ge=O({matMul_:E9});function R9(e,t,n=1,r=0){if(t<2)throw new Error(`Error in oneHot: depth must be >=2, but it is ${t}`);let a={indices:E(e,"indices","oneHot","int32")},s={depth:t,onValue:n,offValue:r};return $.runKernel(Fs,a,s)}var rl=O({oneHot_:R9});function M9(e,t){let n=E(e,"x","transpose");if(t==null&&(t=n.shape.map((s,i)=>i).reverse()),M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of perm ${t}.`),t.forEach(s=>{M(s>=0&&s`All entries in 'perm' must be between 0 and ${n.rank-1} but got ${t}`)}),n.rank<=1)return n.clone();let r={x:n},a={perm:t};return $.runKernel(Ys,r,a)}var nt=O({transpose_:M9});function F9(e,t,n){let r=E(e,"labels","confusionMatrix"),a=E(t,"predictions","confusionMatrix");M(n==null||n>0&&Number.isInteger(n),()=>`If provided, numClasses must be a positive integer, but got ${n}`),M(r.rank===1,()=>`Expected the rank of labels to be 1, but got ${r.rank}`),M(a.rank===1,()=>`Expected the rank of predictions to be 1, but got ${a.rank}`),M(r.shape[0]===a.shape[0],()=>`Mismatch in the number of examples: ${r.shape[0]} vs. ${a.shape[0]}. Labels and predictions should have the same number of elements.`),M(n>0&&Number.isInteger(n),()=>`numClasses is required to be a positive integer, but got ${n}`);let s=rl(ye(r,"int32"),n),i=rl(ye(a,"int32"),n),o=nt(s),l=Ge(o,i);return ye(l,"int32")}var C9=O({confusionMatrix_:F9}),al={};Oe(al,{fromPixels:()=>O9,fromPixelsAsync:()=>$9,toPixels:()=>D9});function ud(e,t,n){if(as(e),t!=null&&t.length!==3)throw new Error("tensor3d() requires shape to have three numbers");let r=Er(e,n);if(r.length!==3&&r.length!==1)throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor3d() requires shape to be provided when `values` are a flat array");return Ta(e,t,r,n)}var sl;function R5(e,t=3){if(t>4)throw new Error("Cannot construct Tensor with more than 4 channels from pixels.");if(e==null)throw new Error("pixels passed to tf.browser.fromPixels() can not be null");let n=!1,r=!1,a=!1,s=!1,i=!1,o=!1;if(e.data instanceof Uint8Array)n=!0;else if(typeof ImageData!="undefined"&&e instanceof ImageData)r=!0;else if(typeof HTMLVideoElement!="undefined"&&e instanceof HTMLVideoElement)a=!0;else if(typeof HTMLImageElement!="undefined"&&e instanceof HTMLImageElement)s=!0;else if(e.getContext!=null)i=!0;else if(typeof ImageBitmap!="undefined"&&e instanceof ImageBitmap)o=!0;else throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${e.constructor.name}`);if(a){let d=2;if(a&&e.readyState element.")}if(nd(td,$.backendName)!=null){let d={pixels:e},p={numChannels:t};return $.runKernel(td,d,p)}let[l,c]=a?[e.videoWidth,e.videoHeight]:[e.width,e.height],u;i?u=e.getContext("2d").getImageData(0,0,l,c).data:r||n?u=e.data:(s||a||o)&&(sl==null&&(sl=document.createElement("canvas").getContext("2d")),sl.canvas.width=l,sl.canvas.height=c,sl.drawImage(e,0,0,l,c),u=sl.getImageData(0,0,l,c).data);let h;if(t===4)h=new Int32Array(u);else{let d=l*c;h=new Int32Array(d*t);for(let p=0;p4||s===2)throw new Error(`toPixels only supports depth of size 1, 3 or 4 but got ${s}`);if(n.dtype!=="float32"&&n.dtype!=="int32")throw new Error(`Unsupported type for toPixels: ${n.dtype}. Please use float32 or int32 tensors.`);let i=await n.data(),o=n.dtype==="float32"?255:1,l=new Uint8ClampedArray(a*r*4);for(let c=0;c1)throw new Error(`Tensor values for a float32 Tensor must be in the range [0 - 1] but encountered ${p}.`)}else if(n.dtype==="int32"&&(p<0||p>255))throw new Error(`Tensor values for a int32 Tensor must be in the range [0 - 255] but encountered ${p}.`);s===1?(u[0]=p*o,u[1]=p*o,u[2]=p*o):u[d]=p*o}let h=c*4;l[h+0]=Math.round(u[0]),l[h+1]=Math.round(u[1]),l[h+2]=Math.round(u[2]),l[h+3]=Math.round(u[3])}if(t!=null){t.width=a,t.height=r;let c=t.getContext("2d"),u=new ImageData(l,a,r);c.putImageData(u,0,0)}return n!==e&&n.dispose(),l}var O9=O({fromPixels_:R5}),Mf={};Oe(Mf,{prepareAndValidate:()=>M5});function M5(e,t){let n=e.shape.length,r=t.shape.length;if(n<1)throw new Error(`tf.gatherND() expects the input to be rank 1 or higher, but the rank was ${n}.`);if(r<1)throw new Error(`tf.gatherND() expects the indices to be rank 1 or higher, but the rank was ${r}.`);if(t.dtype!=="int32")throw new Error(`tf.gatherND() expects the indices to be int32 type, but the dtype was ${t.dtype}.`);if(t.shape[r-1]>n)throw new Error(`index innermost dimension length must be <= tensor rank; saw: ${t.shape[r-1]} vs. ${n}`);if(Ft(e.shape)===0)throw new Error(`Requested more than 0 entries, but input is empty. Input shape: ${e.shape}.`);let a=t.shape,s=a[a.length-1],i=1;for(let h=0;hh/c),1].slice(0,s);return[l,i,c,u]}var Ff={};Oe(Ff,{calculateShapes:()=>F5,validateInput:()=>Df,validateUpdateShape:()=>$f});function $f(e,t,n){let r=t.rank>1?t.shape[t.rank-1]:1,a=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: ${r}, and batchDim: ${a}.`;if(n.rank1?t.shape[r-1]:1,s=n.length,i=1;for(let h=a;hB9,computeFlatOffset:()=>U9,computeOutShape:()=>$5,getNormalizedAxes:()=>O5,isSliceContinous:()=>V9,maskToAxes:()=>cd,parseSliceParams:()=>V5,sliceInfo:()=>j9,startForAxis:()=>W5,startIndicesWithElidedDims:()=>z5,stopForAxis:()=>B5,stopIndicesWithElidedDims:()=>P5,stridesForAxis:()=>L5,stridesWithElidedDims:()=>D5});function B9(e,t,n){let r=e.shape.length;M(r===t.length,()=>`Error in slice${r}D: Length of begin ${t} must match the rank of the array (${r}).`),M(r===n.length,()=>`Error in slice${r}D: Length of size ${n} must match the rank of the array (${r}).`);for(let a=0;a`Error in slice${r}D: begin[${a}] + size[${a}] (${t[a]+n[a]}) would overflow input.shape[${a}] (${e.shape[a]})`)}function cd(e){let t=[],n=0;for(;e>0;)e&1&&t.push(n),e/=2,n++;return t}function $5(e,t,n){let r=[];for(let a=0;a0){let p=t[0],f=n+1;u=z5(i,p,f,r,e),h=P5(o,p,f,a,e),d=D5(s,p,f,e)}else for(let p=0;p-1)s[o]=0;else{let l=U5(t,n,o),c=r[l];e&1<-1)s[o]=Number.MAX_SAFE_INTEGER;else{let l=U5(t,n,o),c=r[l];e&1<0?i=Number.MIN_SAFE_INTEGER:i=Number.MAX_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),i=cu(0,i,l-1),i}function B5(e,t,n,r,a,s){let i=t[a],o=n[a]||1;(e&1<0?i=Number.MAX_SAFE_INTEGER:i=Number.MIN_SAFE_INTEGER);let l=r[a];return i<0&&(i+=l),o>0?i=cu(0,i,l):i=cu(-1,i,l-1),i}function V9(e,t,n){let r=n.length;for(let a=0;a1){r=a;break}for(let a=r+1;a0||n[a]!==e[a])return!1;return!0}function U9(e,t){let n=e.length>0?e[e.length-1]:1;for(let r=0;r{M(i!==-1,()=>"slice() does not support negative begin indexing.")});let s;return n==null?s=new Array(a).fill(-1):typeof n=="number"?s=[n,...new Array(a-1).fill(-1)]:n.lengthi>=0?i:(M(i===-1,()=>`Negative size values should be exactly -1 but got ${i} for the slice() size at index ${o}.`),e.shape[o]-r[o])),[r,s]}function j9(e,t,n,r,a,s,i,o,l){let c=t.slice(),u=n.slice(),h=r;r==null&&(h=new Array(c.length));let d=cd(i);if(d.length>1)throw new Error("Multiple ellipses in slice is not allowed.");if(i!==0&&o!==0)throw new Error("Using both ellipsisMask and newAxisMask is not yet supported.");if(i!==0&&l!==0)throw new Error("Using both ellipsisMask and shrinkAxisMask is not yet supported.");let p=e.length-c.length,f=cd(o),m=e.slice();f.forEach(x=>{c[x]=0,u[x]=1,m.splice(x,0,1)});let{begin:A,end:y,strides:g}=O5(m,d,p,c,u,h,a,s,i);c=A,u=y,h=g;let w=cd(l);w.forEach(x=>{u[x]=c[x]+1,h[x]=1});let b=$5(c,u,h),_=b.filter((x,N)=>w.indexOf(N)===-1);return{nonStrided:h.every(x=>x===1),$begin:c,$end:u,$strides:h,size:b,newShape:m,outShape:_}}var re={};Oe(re,{Serializable:()=>H5,SerializationMap:()=>si,registerClass:()=>Ea});var H5=class{getClassName(){return this.constructor.className}static fromConfig(e,t){return new e(t)}},si=class{constructor(){this.classNameMap={}}static getMap(){return si.instance==null&&(si.instance=new si),si.instance}static register(e){si.getMap().classNameMap[e.className]=[e,e.fromConfig]}};function Ea(e){M(e.className!=null,()=>"Class being registered does not have the static className property defined."),M(typeof e.className=="string",()=>"className is required to be a string, but got type "+typeof e.className),M(e.className.length>0,()=>"Class being registered has an empty-string as its className, which is disallowed."),si.register(e)}var G5={};Oe(G5,{TEST_EPSILON_FLOAT16:()=>q5,encodeStrings:()=>X5,expectArrayBuffersEqual:()=>Z9,expectArraysClose:()=>H9,expectArraysEqual:()=>q9,expectNumbersClose:()=>X9,expectPromiseToFail:()=>G9,expectValuesInRange:()=>K9,testEpsilon:()=>Of});var Y9=.001,q5=.1;function H9(e,t,n){return n==null&&(n=Of()),zf(e,t,(r,a)=>Pf(r,a,n))}function Of(){return $.backend.floatPrecision()===32?Y9:q5}function zf(e,t,n){let r=!0;if((rn(e)||rn(t))&&(r=!1),rn(e)&&rn(t)&&(r=!0),r){let i=e.constructor.name,o=t.constructor.name;if(i!==o)throw new Error(`Arrays are of different type. Actual: ${i}. Expected: ${o}`)}if(Array.isArray(e)&&Array.isArray(t)){let i=Er(e),o=Er(t);if(!ea(i,o))throw new Error(`Arrays have different shapes. Actual: [${i}]. Expected: [${o}]`)}let a=rn(e)?e:ss(e),s=rn(t)?t:ss(t);if(a.length!==s.length)throw new Error(`Arrays have different lengths actual: ${a.length} vs expected: ${s.length}. -Actual: ${a}. -Expected: ${s}.`);for(let i=0;it.fail(),()=>t())}function q9(e,t){let n=typeof t=="string"||typeof t=="number"||typeof t=="boolean"?[t]:t;return ba(e)||ba(e[0])||ba(t)||ba(t[0])?zf(e,n,(r,a)=>r==a):zf(e,t,(r,a)=>Pf(r,a,0))}function X9(e,t,n){if(n==null&&(n=Of()),!Pf(e,t,n))throw new Error(`Numbers differ: actual === ${e}, expected === ${t}`)}function Pf(e,t,n){return!isFinite(e)&&!isFinite(t)?!0:!(isNaN(e)||isNaN(t)||Math.abs(e-t)>n)}function K9(e,t,n){for(let r=0;rn)throw new Error(`Value out of range:${e[r]} low: ${t}, high: ${n}`)}function Z9(e,t){expect(new Float32Array(e)).toEqual(new Float32Array(t))}function X5(e){for(let t=0;tt.dispose())}function Ut(e){return $.keep(e)}function rI(e){return $.time(e)}function aI(e){return $.setBackend(e)}function sI(){return $.ready()}function iI(){return $.backendName}function oI(e){$.removeBackend(e)}function Wf(e){return $.findBackend(e)}function lI(e){return $.findBackendFactory(e)}function il(e,t,n=1){return $.registerBackend(e,t,n)}function K5(){return $.backend}function uI(e,t){J().setPlatform(e,t)}function cI(e,t){let n=E(e,"a","add"),r=E(t,"b","add");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(va,a)}var se=O({add_:cI});function hI(e,t){let n=E(e,"a","floorDiv"),r=E(t,"b","floorDiv");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ws,a)}var dd=O({floorDiv_:hI});function dI(e,t){let n=E(e,"a","div"),r=E(t,"b","div");if([n,r]=bt(n,r),n.dtype==="int32"&&r.dtype==="int32")return dd(n,r);let a={a:n,b:r},s={};return $.runKernel(ys,a,s)}var me=O({div_:dI});function pI(e,t){let n=E(e,"a","mul"),r=E(t,"b","mul");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ms,a)}var P=O({mul_:pI});function fI(e){let t=E(e,"x","abs");if(t.dtype==="complex64"){let n={x:t};return $.runKernel(mu,n)}else{let n={x:t};return $.runKernel(Yi,n)}}var Dt=O({abs_:fI});function mI(e){let t={x:E(e,"x","acos")};return $.runKernel(Ji,t)}var Bf=O({acos_:mI});function AI(e){let t={x:E(e,"x","acosh")};return $.runKernel(Qi,t)}var Vf=O({acosh_:AI});function yI(e){M(Array.isArray(e),()=>"The argument passed to tf.addN() must be a list of tensors"),M(e.length>=1,()=>`Must pass at least one tensor to tf.addN(), but got ${e.length}`);let t=e.map((a,s)=>E(a,`tensors${s}`,"addN")),n=t[0];t.forEach(a=>{if(a.dtype!==n.dtype)throw new Error("All tensors passed to tf.addN() must have the same dtype")}),t.forEach(a=>{if(!ea(a.shape,n.shape))throw new Error("All tensors passed to tf.addN() must have the same shape")});let r=t;return $.runKernel(is,r)}var Ra=O({addN_:yI});function gI(e,t=null,n=!1){let r={x:E(e,"x","all","bool")},a={axis:t,keepDims:n};return $.runKernel(kh,r,a)}var pd=O({all_:gI});function xI(e,t=null,n=!1){let r={x:E(e,"x","any","bool")},a={axis:t,keepDims:n};return $.runKernel(Ih,r,a)}var Wu=O({any_:xI});function wI(e,t=0){let n={x:E(e,"x","argMax")},r={axis:t};return $.runKernel(os,n,r)}var ii=O({argMax_:wI});function bI(e,t=0){let n={x:E(e,"x","argMin")},r={axis:t};return $.runKernel(du,n,r)}var Uf=O({argMin_:bI});function _I(e){let t={x:E(e,"x","asin")};return $.runKernel(eo,t)}var jf=O({asin_:_I});function vI(e){let t={x:E(e,"x","asinh")};return $.runKernel(to,t)}var Hf=O({asinh_:vI});function kI(e){let t={x:E(e,"x","atan")};return $.runKernel(no,t)}var Gf=O({atan_:kI});function II(e,t){let n=E(e,"a","atan2"),r=E(t,"b","atan2");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(ao,a)}var qf=O({atan2_:II});function NI(e){let t={x:E(e,"x","atanh")};return $.runKernel(ro,t)}var Xf=O({atanh_:NI});function SI(e,t,n,r,a="NHWC",s){let i=e[3],o=[...t,i],l=Z5(a);return Bu(e,o,n,s,r,null,null,l)}function Y5(e,t,n,r,a,s,i="channelsLast"){let[o,l]=fd(t),c;if(i==="channelsLast")c=[o,l,e[3],e[3]];else if(i==="channelsFirst")c=[o,l,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return Bu(e,c,n,r,a,s,!1,i)}function TI(e,t,n,r,a,s,i="NDHWC"){let[o,l,c]=Kf(t),u,h;if(i==="NDHWC")h="channelsLast",u=[o,l,c,e[4],e[4]];else if(i==="NCDHW")h="channelsFirst",u=[o,l,c,e[1],e[1]];else throw new Error(`Unknown dataFormat ${i}`);return J5(e,u,n,r,a,!1,h,s)}function Bu(e,t,n,r,a,s,i=!1,o="channelsLast"){let[l,c,u,h]=[-1,-1,-1,-1];if(o==="channelsLast")[l,c,u,h]=e;else if(o==="channelsFirst")[l,h,c,u]=e;else throw new Error(`Unknown dataFormat ${o}`);let[d,p,,f]=t,[m,A]=fd(n),[y,g]=fd(r),w=ol(d,y),b=ol(p,g),{padInfo:_,outHeight:x,outWidth:N}=CI(a,c,u,m,A,w,b,s,o),T=i?f*h:f,C;return o==="channelsFirst"?C=[l,T,x,N]:o==="channelsLast"&&(C=[l,x,N,T]),{batchSize:l,dataFormat:o,inHeight:c,inWidth:u,inChannels:h,outHeight:x,outWidth:N,outChannels:T,padInfo:_,strideHeight:m,strideWidth:A,filterHeight:d,filterWidth:p,effectiveFilterHeight:w,effectiveFilterWidth:b,dilationHeight:y,dilationWidth:g,inShape:e,outShape:C,filterShape:t}}function J5(e,t,n,r,a,s=!1,i="channelsLast",o){let[l,c,u,h,d]=[-1,-1,-1,-1,-1];if(i==="channelsLast")[l,c,u,h,d]=e;else if(i==="channelsFirst")[l,d,c,u,h]=e;else throw new Error(`Unknown dataFormat ${i}`);let[p,f,m,,A]=t,[y,g,w]=Kf(n),[b,_,x]=Kf(r),N=ol(p,b),T=ol(f,_),C=ol(m,x),{padInfo:F,outDepth:D,outHeight:L,outWidth:V}=EI(a,c,u,h,y,g,w,N,T,C,o),U=s?A*d:A,j;return i==="channelsFirst"?j=[l,U,D,L,V]:i==="channelsLast"&&(j=[l,D,L,V,U]),{batchSize:l,dataFormat:i,inDepth:c,inHeight:u,inWidth:h,inChannels:d,outDepth:D,outHeight:L,outWidth:V,outChannels:U,padInfo:F,strideDepth:y,strideHeight:g,strideWidth:w,filterDepth:p,filterHeight:f,filterWidth:m,effectiveFilterDepth:N,effectiveFilterHeight:T,effectiveFilterWidth:C,dilationDepth:b,dilationHeight:_,dilationWidth:x,inShape:e,outShape:j,filterShape:t}}function RI(e,t,n,r,a){r==null&&(r=Zf(e,t,n));let s=e[0],i=e[1],o=oi((s-t+2*r)/n+1,a),l=oi((i-t+2*r)/n+1,a);return[o,l]}function MI(e,t,n,r,a,s){a==null&&(a=Zf(e,t,r));let i=e[0],o=e[1],l=e[2],c=oi((i-t+2*a)/r+1,s),u=oi((o-t+2*a)/r+1,s),h=oi((l-t+2*a)/r+1,s);return[c,u,h,n]}function Zf(e,t,n,r=1){let a=ol(t,r);return Math.floor((e[0]*(n-1)-n+a)/2)}function fd(e){return typeof e=="number"?[e,e,e]:e.length===2?[e[0],e[1],1]:e}function Kf(e){return typeof e=="number"?[e,e,e]:e}function ol(e,t){return t<=1?e:e+(e-1)*(t-1)}function CI(e,t,n,r,a,s,i,o,l){let c,u,h;if(typeof e=="number"){c={top:e,bottom:e,left:e,right:e,type:e===0?"VALID":"NUMBER"};let d=RI([t,n],s,r,e,o);u=d[0],h=d[1]}else if(e==="same"){u=Math.ceil(t/r),h=Math.ceil(n/a);let d=Math.max(0,(u-1)*r+s-t),p=Math.max(0,(h-1)*a+i-n),f=Math.floor(d/2),m=d-f,A=Math.floor(p/2),y=p-A;c={top:f,bottom:m,left:A,right:y,type:"SAME"}}else if(e==="valid")c={top:0,bottom:0,left:0,right:0,type:"VALID"},u=Math.ceil((t-s+1)/r),h=Math.ceil((n-i+1)/a);else if(typeof e=="object"){let d=l==="channelsLast"?e[1][0]:e[2][0],p=l==="channelsLast"?e[1][1]:e[2][1],f=l==="channelsLast"?e[2][0]:e[3][0],m=l==="channelsLast"?e[2][1]:e[3][1];c={top:d,bottom:p,left:f,right:m,type:d===0&&p===0&&f===0&&m===0?"VALID":"EXPLICIT"},u=oi((t-s+d+p)/r+1,o),h=oi((n-i+f+m)/a+1,o)}else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:c,outHeight:u,outWidth:h}}function EI(e,t,n,r,a,s,i,o,l,c,u){let h,d,p,f;if(typeof e=="number"){h={top:e,bottom:e,left:e,right:e,front:e,back:e,type:e===0?"VALID":"NUMBER"};let m=MI([t,n,r,1],o,1,a,e,u);d=m[0],p=m[1],f=m[2]}else if(e==="same"){d=Math.ceil(t/a),p=Math.ceil(n/s),f=Math.ceil(r/i);let m=(d-1)*a+o-t,A=(p-1)*s+l-n,y=(f-1)*i+c-r,g=Math.floor(m/2),w=m-g,b=Math.floor(A/2),_=A-b,x=Math.floor(y/2),N=y-x;h={top:b,bottom:_,left:x,right:N,front:g,back:w,type:"SAME"}}else if(e==="valid")h={top:0,bottom:0,left:0,right:0,front:0,back:0,type:"VALID"},d=Math.ceil((t-o+1)/a),p=Math.ceil((n-l+1)/s),f=Math.ceil((r-c+1)/i);else throw Error(`Unknown padding parameter: ${e}`);return{padInfo:h,outDepth:d,outHeight:p,outWidth:f}}function oi(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 Ma(e){let[t,n,r]=fd(e);return t===1&&n===1&&r===1}function Fr(e,t){return Ma(e)||Ma(t)}function Z5(e){if(e==="NHWC")return"channelsLast";if(e==="NCHW")return"channelsFirst";throw new Error(`Unknown dataFormat ${e}`)}function FI(e,t){let n={x:E(e,"x","reshape","string_or_numeric")},r={shape:t};return $.runKernel(Oo,n,r)}var H=O({reshape_:FI});function $I(e,t,n,r,a){let s=E(e,"x","avgPool","float32"),i=1;M(Fr(n,i),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`);let o=s,l=!1;s.rank===3&&(l=!0,o=H(s,[1,s.shape[0],s.shape[1],s.shape[2]])),M(o.rank===4,()=>`Error in avgPool: x must be rank 4 but got rank ${o.rank}.`),a!=null&&M(Vt(r),()=>`Error in avgPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(ls,c,u);return h=ye(h,s.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Vu=O({avgPool_:$I});function DI(e,t,n,r,a,s="NDHWC"){let i=E(e,"x","avgPool3d","float32"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in avgPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in avgPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in avgPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(pu,c,u);return h=ye(h,o.dtype),l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var Yf=O({avgPool3d_:DI});function OI(e,t=0){M(e.length>=1,()=>"Pass at least one tensor to concat");let n=Pu(e,"tensors","concat","string_or_numeric");if(n[0].dtype==="complex64"&&n.forEach(s=>{if(s.dtype!=="complex64")throw new Error(`Cannot concatenate complex64 tensors with a tensor - with dtype ${s.dtype}. `)}),n.length===1)return Rr(n[0]);let r=n,a={axis:t};return $.runKernel(so,r,a)}var rt=O({concat_:OI});function zI(e){let t={x:E(e,"x","sigmoid")};return $.runKernel(js,t)}var Rn=O({sigmoid_:zI});function PI(e,t,n){let r=E(e,"x","slice","string_or_numeric");if(r.rank===0)throw new Error("Slicing scalar is not possible");let a={x:r},s={begin:t,size:n};return $.runKernel(Wo,a,s)}var Ee=O({slice_:PI});function LI(e){let t={x:E(e,"x","tanh")};return $.runKernel(Zs,t)}var ll=O({tanh_:LI});function WI(e,t,n,r,a,s){let i=E(e,"forgetBias","basicLSTMCell"),o=E(t,"lstmKernel","basicLSTMCell"),l=E(n,"lstmBias","basicLSTMCell"),c=E(r,"data","basicLSTMCell"),u=E(a,"c","basicLSTMCell"),h=E(s,"h","basicLSTMCell"),d=rt([c,h],1),p=Ge(d,o),f=se(p,l),m=f.shape[0],A=f.shape[1]/4,y=[m,A],g=Ee(f,[0,0],y),w=Ee(f,[0,A],y),b=Ee(f,[0,A*2],y),_=Ee(f,[0,A*3],y),x=se(P(Rn(g),ll(w)),P(u,Rn(se(i,b)))),N=P(ll(x),Rn(_));return[x,N]}var BI=O({basicLSTMCell_:WI});function VI(e,t,n){let r=E(e,"x","batchToSpaceND"),a=t.reduce((o,l)=>o*l);M(r.rank>=1+t.length,()=>`input rank is ${r.rank} but should be > than blockShape.length ${t.length}`),M(n.length===t.length,()=>`crops.length is ${n.length} but should be equal to blockShape.length ${t.length}`),M(r.shape[0]%a==0,()=>`input tensor batch is ${r.shape[0]} but is not divisible by the product of the elements of blockShape ${t.join(" * ")} === ${a}`);let s={x:r},i={blockShape:t,crops:n};return $.runKernel(fu,s,i)}var Uu=O({batchToSpaceND_:VI});function UI(e){let t;return e.rank===0||e.rank===1?t=H(e,[1,1,1,e.size]):e.rank===2?t=H(e,[1,1,e.shape[0],e.shape[1]]):e.rank===3?t=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]):t=e,t}function jI(e,t,n,r,a,s){s==null&&(s=.001);let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;r!=null&&(u=E(r,"offset","batchNorm")),M(o.rank===l.rank,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),M(u==null||o.rank===u.rank,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),M(c==null||o.rank===c.rank,()=>"Batch normalization gradient requires mean and scale to have equal ranks.");let h={x:UI(i),scale:c,offset:u,mean:o,variance:l},d={varianceEpsilon:s},p=$.runKernel(bs,h,d);return H(p,i.shape)}var li=O({batchNorm_:jI});function HI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===2,()=>`Error in batchNorm2D: x must be rank 2 but got rank ${i.rank}.`),M(o.rank===2||o.rank===1,()=>`Error in batchNorm2D: mean must be rank 2 or rank 1 but got rank ${o.rank}.`),M(l.rank===2||l.rank===1,()=>`Error in batchNorm2D: variance must be rank 2 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===2||c.rank===1,()=>`Error in batchNorm2D: scale must be rank 2 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===2||u.rank===1,()=>`Error in batchNorm2D: offset must be rank 2 or rank 1 but got rank ${u.rank}.`),li(i,o,l,u,c,s)}var Q5=O({batchNorm2d_:HI});function GI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===3,()=>`Error in batchNorm3D: x must be rank 3 but got rank ${i.rank}.`),M(o.rank===3||o.rank===1,()=>`Error in batchNorm3D: mean must be rank 3 or rank 1 but got rank ${o.rank}.`),M(l.rank===3||l.rank===1,()=>`Error in batchNorm3D: variance must be rank 3 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===3||c.rank===1,()=>`Error in batchNorm3D: scale must be rank 3 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===3||u.rank===1,()=>`Error in batchNorm3D: offset must be rank 3 or rank 1 but got rank ${u.rank}.`),li(i,o,l,u,c,s)}var ex=O({batchNorm3d_:GI});function qI(e,t,n,r,a,s){let i=E(e,"x","batchNorm"),o=E(t,"mean","batchNorm"),l=E(n,"variance","batchNorm"),c;a!=null&&(c=E(a,"scale","batchNorm"));let u;return r!=null&&(u=E(r,"offset","batchNorm")),M(i.rank===4,()=>`Error in batchNorm4D: x must be rank 4 but got rank ${i.rank}.`),M(o.rank===4||o.rank===1,()=>`Error in batchNorm4D: mean must be rank 4 or rank 1 but got rank ${o.rank}.`),M(l.rank===4||l.rank===1,()=>`Error in batchNorm4D: variance must be rank 4 or rank 1 but got rank ${l.rank}.`),c!=null&&M(c.rank===4||c.rank===1,()=>`Error in batchNorm4D: scale must be rank 4 or rank 1 but got rank ${c.rank}.`),u!=null&&M(u.rank===4||u.rank===1,()=>`Error in batchNorm4D: offset must be rank 4 or rank 1 but got rank ${u.rank}.`),li(i,o,l,u,c,s)}var tx=O({batchNorm4d_:qI});function XI(e,t,n){let r=E(e,"x","bincount"),a=E(t,"weights","bincount");M(r.dtype==="int32",()=>`Error in bincount: input dtype must be int32, but got ${r.dtype}`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(a.size===r.size||a.size===0,()=>`Error in bincount: weights must have the same size as input or0-length, but got input shape: ${r.shape}, weights shape: ${a.shape}.`);let s={x:r,weights:a},i={size:n};return $.runKernel(Th,s,i)}var nx=O({bincount_:XI});function KI(e,t){let n=E(e,"broadcastTo","x"),r=n.shape;if(t.some(l=>!(l>0)||l%1!=0))throw new Error(`broadcastTo(): Invalid broadcast shape [${t}].`);if(t.lengthn.rank){let l=n.shape.slice();for(;l.length=0;l--)if(a[l]===t[l])s[l]=1;else if(n.shape[l]!==1)throw new Error(`broadcastTo(): [${r}] cannot be broadcast to [${t}].`);if(s.map((l,c)=>l>1?c:-1).filter(l=>l>=0).length===0)return Rr(n);let i={x:n},o={reps:s};return $.runKernel(Ia,i,o)}var ju=O({broadcastTo_:KI});function ZI(e){let t={x:E(e,"x","ceil")};return $.runKernel(hs,t)}var Jf=O({ceil_:ZI});function YI(e,t,n){let r=E(e,"x","clipByValue");M(t<=n,()=>`Error in clip: min (${t}) must be less than or equal to max (${n}).`);let a={x:r},s={clipValueMin:t,clipValueMax:n};return $.runKernel(ka,a,s)}var bn=O({clipByValue_:YI});function JI(e){return rt(e,0)}var rx=O({concat1d_:JI});function QI(e,t){return rt(e,t)}var ul=O({concat2d_:QI});function eN(e,t){return rt(e,t)}var ax=O({concat3d_:eN});function tN(e,t){return rt(e,t)}var sx=O({concat4d_:tN});function nN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","conv2d"),l=E(t,"filter","conv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in conv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in conv2d: filter must be rank 4, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h=a==="NHWC"?c.shape[3]:c.shape[1];M(h===l.shape[2],()=>`Error in conv2d: depth of input (${h}) must match input depth for filter ${l.shape[2]}.`),M(Fr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`);let d={x:c,filter:l},p={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},f=$.runKernel(ds,d,p);return u?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var na=O({conv2d_:nN});function rN(e,t,n,r,a="NWC",s=1,i){let o=E(e,"x","conv1d"),l=E(t,"filter","conv1d"),c=o,u=!1;o.rank===2&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1]])),M(c.rank===3,()=>`Error in conv1d: input must be rank 3, but got rank ${c.rank}.`),M(l.rank===3,()=>`Error in conv1d: filter must be rank 3, but got rank ${l.rank}.`),i!=null&&M(Vt(r),()=>`Error in conv1d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(c.shape[2]===l.shape[1],()=>`Error in conv1d: depth of input (${c.shape[2]}) must match input depth for filter ${l.shape[1]}.`),M(Fr(n,s),()=>`Error in conv1D: Either stride or dilation must be 1. Got stride ${n} and dilation '${s}'`),M(a==="NWC",()=>`Error in conv1d: got dataFormat of ${a} but only NWC is currently supported.`);let h=H(l,[1,l.shape[0],l.shape[1],l.shape[2]]),d=H(c,[c.shape[0],1,c.shape[1],c.shape[2]]),p=na(d,h,[1,n],r,"NHWC",[1,s],i);return u?H(p,[p.shape[2],p.shape[3]]):H(p,[p.shape[0],p.shape[2],p.shape[3]])}var md=O({conv1d_:rN});function aN(e,t,n,r,a,s="NHWC",i){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let o=e,l=t,c=!1;t.rank===3&&(c=!0,l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]),o=[1,e[0],e[1],e[2]]),M(o.length===4,()=>`Error in conv2dDerInput: inShape must be length 4, but got length ${o.length}.`),M(l.rank===4,()=>`Error in conv2dDerInput: dy must be rank 4, but got rank ${l.rank}`),M(n.rank===4,()=>`Error in conv2dDerInput: filter must be rank 4, but got rank ${n.rank}`);let u=s==="NHWC"?o[3]:o[1],h=s==="NHWC"?l.shape[3]:l.shape[1];M(u===n.shape[2],()=>`Error in conv2dDerInput: depth of input (${u}) must match input depth for filter ${n.shape[2]}.`),M(h===n.shape[3],()=>`Error in conv2dDerInput: depth of output (${h}) must match output depth for filter ${n.shape[3]}.`),i!=null&&M(Vt(a),()=>`Error in conv2dDerInput: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let d={dy:l,filter:n},p={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,inputShape:o},f=$.runKernel(ps,d,p);return c?H(f,[f.shape[1],f.shape[2],f.shape[3]]):f}var Qf=O({conv2DBackpropInput_:aN});function sN(e,t,n,r,a,s){let i=E(e,"x","conv2dTranspose"),o=E(t,"filter","conv2dTranspose");return Qf(n,i,o,r,a,"NHWC",s)}var Ad=O({conv2dTranspose_:sN});function iN(e,t,n,r,a="NDHWC",s=[1,1,1]){let i=E(e,"x","conv3d"),o=E(t,"filter","conv3d"),l=i,c=!1;i.rank===4&&(c=!0,l=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(l.rank===5,()=>`Error in conv3d: input must be rank 5, but got rank ${l.rank}.`),M(o.rank===5,()=>`Error in conv3d: filter must be rank 5, but got rank ${o.rank}.`),M(l.shape[4]===o.shape[3],()=>`Error in conv3d: depth of input (${l.shape[4]}) must match input depth for filter ${o.shape[3]}.`),M(Fr(n,s),()=>`Error in conv3D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NDHWC",()=>`Error in conv3d: got dataFormat of ${a} but only NDHWC is currently supported.`);let u={x:l,filter:o},h={strides:n,pad:r,dataFormat:a,dilations:s},d=$.runKernel(Au,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var em=O({conv3d_:iN});function oN(e,t,n,r,a){M(e.length===t.rank,()=>`Length of inShape (${e.length}) and rank of dy (${t.rank}) must match`);let s=e,i=t,o=!1;t.rank===4&&(o=!0,i=H(t,[1,t.shape[0],t.shape[1],t.shape[2],t.shape[3]]),s=[1,e[0],e[1],e[2],e[3]]);let l=s[4],c=i.shape[4];M(s.length===5,()=>`Error in conv3dDerInput: inShape must be length 5, but got length ${s.length}.`),M(i.rank===5,()=>`Error in conv3dDerInput: dy must be rank 5, but got rank ${i.rank}`),M(n.rank===5,()=>`Error in conv3dDerInput: filter must be rank 5, but got rank ${n.rank}`),M(l===n.shape[3],()=>`Error in conv3dDerInput: depth of input (${l}) must match input depth for filter ${n.shape[3]}.`),M(c===n.shape[4],()=>`Error in conv3dDerInput: depth of output (${c}) must match output depth for filter ${n.shape[4]}.`);let u={dy:i,filter:n},h={pad:a,strides:r,inputShape:s},d=$.runKernel(Mh,u,h);return o?H(d,[d.shape[1],d.shape[2],d.shape[3],d.shape[4]]):d}var ix=O({conv3DBackpropInput_:oN});function lN(e,t,n,r,a){let s=E(e,"x","conv3dTranspose"),i=E(t,"filter","conv3dTranspose");return ix(n,s,i,r,a)}var uN=O({conv3dTranspose_:lN});function cN(e){let t={x:E(e,"x","cos")};return $.runKernel(fs,t)}var Hu=O({cos_:cN});function hN(e){let t={x:E(e,"x","cosh")};return $.runKernel(io,t)}var yd=O({cosh_:hN});function dN(e,t=0,n=!1,r=!1){let a={x:E(e,"x","cumsum")},s={axis:t,exclusive:n,reverse:r};return $.runKernel(ms,a,s)}var gd=O({cumsum_:dN});function pN(e,t,n,r=!1){let a=E(e,"x","denseBincount"),s=E(t,"weights","denseBincount");M(a.dtype==="int32",()=>`Error in denseBincount: input dtype must be int32, but got ${a.dtype}`),M(a.rank<=2,()=>`Error in denseBincount: input must be at most rank 2, but got rank ${a.rank}.`),M(n>=0,()=>`size must be non-negative, but got ${n}.`),M(s.size===a.size||s.size===0,()=>`Error in denseBincount: weights must have the same shape as x or 0-length, but got x shape: ${a.shape}, weights shape: ${s.shape}.`);let i={x:a,weights:s},o={size:n,binaryOutput:r};return $.runKernel(Fh,i,o)}var ox=O({denseBincount_:pN});function fN(e,t,n="NHWC"){let r=E(e,"x","depthToSpace"),a=n==="NHWC"?r.shape[1]:r.shape[2],s=n==="NHWC"?r.shape[2]:r.shape[3],i=n==="NHWC"?r.shape[3]:r.shape[1];M(a*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${a} and ${t} for depthToSpace with input shape - ${r.shape}`),M(s*t>=0,()=>`Negative dimension size caused by overflow when multiplying - ${s} and ${t} for depthToSpace with input shape - ${r.shape}`),M(i%(t*t)==0,()=>`Dimension size must be evenly divisible by ${t*t} but is ${i} for depthToSpace with input shape ${r.shape}`);let o={x:r},l={blockSize:t,dataFormat:n};return $.runKernel(lo,o,l)}var tm=O({depthToSpace_:fN});function mN(e,t,n,r,a="NHWC",s=[1,1],i){let o=E(e,"x","depthwiseConv2d"),l=E(t,"filter","depthwiseConv2d"),c=o,u=!1;o.rank===3&&(u=!0,c=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),M(c.rank===4,()=>`Error in depthwiseConv2d: input must be rank 4, but got rank ${c.rank}.`),M(l.rank===4,()=>`Error in depthwiseConv2d: filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[3]===l.shape[2],()=>`Error in depthwiseConv2d: number of input channels (${c.shape[3]}) must match the inChannels dimension in filter ${l.shape[2]}.`),i!=null&&M(Vt(r),()=>`Error in depthwiseConv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`);let h={x:c,filter:l},d={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i},p=$.runKernel(As,h,d);return u?H(p,[p.shape[1],p.shape[2],p.shape[3]]):p}var cl=O({depthwiseConv2d_:mN});function AN(e){let t={x:E(e,"x","diag")};return $.runKernel(Oh,t)}var yN=O({diag_:AN});function gN(e,t,n,r,a=[1,1],s="NHWC"){let i=E(e,"x","dilation2d"),o=E(t,"filter","dilation2d");M(i.rank===3||i.rank===4,()=>`Error in dilation2d: input must be rank 3 or 4, but got rank ${i.rank}.`),M(o.rank===3,()=>`Error in dilation2d: filter must be rank 3, but got rank ${o.rank}.`),M(s==="NHWC",()=>`Error in dilation2d: Only NHWC is currently supported, but got dataFormat of ${s}`);let l=i,c=!1;i.rank===3&&(l=H(i,[1,i.shape[0],i.shape[1],i.shape[2]]),c=!0);let u={x:l,filter:o},h={strides:n,pad:r,dilations:a},d=$.runKernel(yu,u,h);return c?H(d,[d.shape[1],d.shape[2],d.shape[3]]):d}var nm=O({dilation2d_:gN});function xN(e,t){let n=e.length,r=[];for(let a=0;a1&&i===1&&r.unshift(s)}return r}function Ot(e,t){let n=[];for(let r=0;r1)&&n.unshift(s)}return n}function mt(e,t){let n=[],r=Math.max(e.length,t.length);for(let a=0;a"The first dimension of `a` must match the size of `condition`."),s.rank!==1&&nn(s.shape,l.shape,"Error in where: ");let c={condition:s,t:o,e:l};return $.runKernel(Po,c)}var _n=O({where_:bN});function _N(e){let t={x:E(e,"x","zerosLike")};return $.runKernel(Ko,t)}var je=O({zerosLike_:_N});function vN(e,t){let n=E(e,"a","div"),r=E(t,"b","div");[n,r]=bt(n,r);let a=me(n,r),s=je(a),i=Fa(r,s);return _n(i,s,a)}var rm=O({divNoNan_:vN});function kN(e,t){let n=E(e,"t1","dot"),r=E(t,"t2","dot");M((n.rank===1||n.rank===2)&&(r.rank===1||r.rank===2),()=>`Error in dot: inputs must all be rank 1 or 2, but got ranks ${n.rank} and ${r.rank}.`);let a=n.rank===1?n.size:n.shape[1],s=r.rank===1?r.size:r.shape[0];if(M(a===s,()=>`Error in dot: inner dimensions of inputs must match, but got ${a} and ${s}.`),n.rank===1&&r.rank===1){let i=H(n,[1,-1]),o=H(r,[-1,1]),l=Ge(i,o);return H(l,[])}else if(n.rank===1&&r.rank===2){let i=H(n,[1,-1]),o=H(r,[r.shape[0],r.shape[1]]),l=Ge(i,o);return H(l,[l.size])}else if(n.rank===2&&r.rank===1){let i=H(r,[-1,1]),o=Ge(n,i);return H(o,[o.size])}else{let i=H(r,[r.shape[0],r.shape[1]]);return Ge(n,i)}}var lx=O({dot_:kN});function IN(e){let t={x:E(e,"x","elu")};return $.runKernel(uo,t)}var hl=O({elu_:IN});function NN(e){let t=E(e,"x","erf");M(t.dtype==="int32"||t.dtype==="float32",()=>"Input dtype must be `int32` or `float32`."),t.dtype==="int32"&&(t=ye(t,"float32"));let n={x:t};return $.runKernel(co,n)}var am=O({erf_:NN});function SN(e){let t={x:E(e,"x","exp")};return $.runKernel(gs,t)}var Gn=O({exp_:SN});function TN(e,t=0){let n=E(e,"x","expandDims","string_or_numeric");M(t<=n.rank,()=>"Axis must be <= rank of the tensor");let r={input:n},a={dim:t};return $.runKernel(po,r,a)}var Yt=O({expandDims_:TN});function CN(e){let t={x:E(e,"x","expm1")};return $.runKernel(fo,t)}var sm=O({expm1_:CN});function EN(e,t){let n=E(e,"x","tile","string_or_numeric");M(n.rank===t.length,()=>`Error in transpose: rank of input ${n.rank} must match length of reps ${t}.`);let r={x:n},a={reps:t};return $.runKernel(Ia,r,a)}var $a=O({tile_:EN});function RN(e,t,n,r="float32"){t==null&&(t=e);let a=We([e,t],r),s=e<=t?e:t;for(let o=0;o`Error in localResponseNormalization: x must be rank 3 or 4 but got - rank ${s.rank}.`),M(Vt(t),()=>`Error in localResponseNormalization: depthRadius must be an integer but got depthRadius ${t}.`);let i=s,o=!1;s.rank===3&&(o=!0,i=H(s,[1,s.shape[0],s.shape[1],s.shape[2]]));let l={x:i},c={depthRadius:t,bias:n,alpha:r,beta:a},u=$.runKernel(bu,l,c);return o?H(u,[u.shape[1],u.shape[2],u.shape[3]]):u}var om=O({localResponseNormalization_:UN});function jN(e){let t={x:E(e,"x","log")};return $.runKernel(Is,t)}var Mn=O({log_:jN});function HN(e){let t={x:E(e,"x","log1p")};return $.runKernel(ko,t)}var bd=O({log1p_:HN});function GN(e){return M(_a(e),()=>"The f passed in grad(f) must be a function"),(t,n)=>{let r=E(t,"x","tf.grad","string_or_numeric"),a=n!=null?E(n,"dy","tf.grad"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(r),[r],a);return a!=null&&nn(s.shape,a.shape,"The shape of dy passed in grad(f)(x, dy) must match the shape returned by f(x)"),_d(i),i[0]})}}function qN(e){return M(_a(e),()=>"The f passed in grads(f) must be a function"),(t,n)=>{M(Array.isArray(t),()=>"The args passed in grads(f)(args) must be an array of `Tensor`s or `TensorLike`s");let r=Pu(t,"args","tf.grads","string_or_numeric"),a=n!=null?E(n,"dy","tf.grads"):null;return $.tidy(()=>{let{value:s,grads:i}=$.gradients(()=>e(...r),r,a);return a!=null&&nn(s.shape,a.shape,"The shape of dy passed in grads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),_d(i),i})}}function XN(e){return M(_a(e),()=>"The f passed in valueAndGrad(f) must be a function"),(t,n)=>{M(t instanceof Ve,()=>"The x passed in valueAndGrad(f)(x) must be a tensor"),M(n==null||n instanceof Ve,()=>"The dy passed in valueAndGrad(f)(x, dy) must be a tensor");let{grads:r,value:a}=$.gradients(()=>e(t),[t],n);return _d(r),{grad:r[0],value:a}}}function KN(e){return M(_a(e),()=>"The f passed in valueAndGrads(f) must be a function"),(t,n)=>{M(Array.isArray(t)&&t.every(a=>a instanceof Ve),()=>"The args passed in valueAndGrads(f)(args) must be array of tensors"),M(n==null||n instanceof Ve,()=>"The dy passed in valueAndGrads(f)(args, dy) must be a tensor");let r=$.gradients(()=>e(...t),t,n);return n!=null&&nn(r.value.shape,n.shape,"The shape of dy passed in valueAndGrads(f)([x1,...], dy) must match the shape returned by f([x1,...])"),_d(r.grads),r}}function px(e,t){M(_a(e),()=>"The f passed in variableGrads(f) must be a function"),M(t==null||Array.isArray(t)&&t.every(c=>c instanceof Du),()=>"The varList passed in variableGrads(f, varList) must be an array of variables");let n=t!=null;if(!n){t=[];for(let c in $.registeredVariables)t.push($.registeredVariables[c])}let r=n?t.filter(c=>!c.trainable):null,a=t.length;t=t.filter(c=>c.trainable),M(t.length>0,()=>`variableGrads() expects at least one of the input variables to be trainable, but none of the ${a} variables is trainable.`);let s=!0,{value:i,grads:o}=$.gradients(e,t,null,s);M(o.some(c=>c!=null),()=>"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()."),M(i.rank===0,()=>`The f passed in variableGrads(f) must return a scalar, but it returned a rank-${i.rank} tensor`);let l={};return t.forEach((c,u)=>{o[u]!=null&&(l[c.name]=o[u])}),r!=null&&r.forEach(c=>l[c.name]=null),{value:i,grads:l}}function $r(e){return $.customGrad(e)}function _d(e){if(e.filter(t=>t==null).length>0)throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that - the f you passed encloses all operations that lead from x to y.`)}function ZN(e){let t={x:E(e,"x","neg")};return $.runKernel(So,t)}var _t=O({neg_:ZN});function YN(e){let t={x:E(e,"x","softplus")};return $.runKernel(Uo,t)}var pl=O({softplus_:YN});function JN(e){let t=E(e,"x","logSigmoid");return $r(n=>({value:_t(pl(_t(n))),gradFunc:r=>P(r,Rn(_t(n)))}))(t)}var fx=O({logSigmoid_:JN});function QN(e,t=null,n=!1){let r={x:E(e,"x","max")},a={reductionIndices:t,keepDims:n};return $.runKernel(Ns,r,a)}var vn=O({max_:QN});function eS(e,t){let n=E(e,"a","sub"),r=E(t,"b","sub");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ks,a)}var Ae=O({sub_:eS});function tS(e,t=null,n=!1){let r=E(e,"x","sum");r.dtype==="bool"&&(r=ye(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel(Gs,a,s)}var Ce=O({sum_:tS});function nS(e,t=-1){let n=E(e,"logits","logSoftmax");if(t===-1&&(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 $r((r,a)=>{let s=!0,i=vn(r,t,!0),o=Ae(r,i),l=Ae(ye(o,"float32"),Mn(Ce(Gn(o),t,s)));return a([l]),{value:l,gradFunc:(c,u)=>{let[h]=u,d=!0,p=Gn(h);return Ae(c,P(Ce(c,t,d),p))}}})(n)}var vd=O({logSoftmax_:nS});function lm(e,t){for(let n=0;ne[s]);return[n,a]}function hi(e,t){let n=t.map(r=>1);return mx(e,n,t)}function rS(e,t,n){M(lm(t,n),()=>`${e} supports only inner-most axes for now. Got axes ${t} and rank-${n} input.`)}function yx(e,t){if(lm(e,t))return null;let n=[];for(let r=0;rn.push(r)),n}function um(e){return e.map((t,n)=>[n,t]).sort((t,n)=>t[1]-n[1]).map(t=>t[0])}function aS(e,t){let n=[];for(let r=t-e;r`Error in maxPool: input must be rank 4 but got rank ${o.rank}.`),M(Fr(n,i),()=>`Error in maxPool: Either strides or dilations must be 1. Got strides ${n} and dilations '${i}'`),a!=null&&M(Vt(r),()=>`Error in maxPool: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a},h=$.runKernel(Ts,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Ku=O({maxPool_:cS});function hS(e,t=[1,1,1],n,r,a,s="NDHWC"){let i=E(e,"x","maxPool3d"),o=i,l=!1;i.rank===4&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2],i.shape[3]])),M(o.rank===5,()=>`Error in maxPool3d: x must be rank 5 but got rank ${o.rank}.`),M(s==="NDHWC",()=>`Error in maxPool3d: Only NDHWC is currently supported, but got dataFormat of ${s}`),a!=null&&M(Vt(r),()=>`Error in maxPool3d: pad must be an integer when using, dimRoundingMode ${a} but got pad ${r}.`);let c={x:o},u={filterSize:t,strides:n,pad:r,dimRoundingMode:a,dataFormat:s},h=$.runKernel(_u,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3],h.shape[4]]):h}var hm=O({maxPool3d_:hS});function dS(e,t,n,r,a=!1){let s={x:E(e,"x","maxPoolWithArgmax")},i={filterSize:t,strides:n,pad:r,includeBatchInIndex:a},o=$.runKernel(qh,s,i);return{result:o[0],indexes:o[1]}}var xx=O({maxPoolWithArgmax_:dS});function pS(e,t){let n=E(e,"a","maximum"),r=E(t,"b","maximum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=ye(n,"int32"),r=ye(r,"int32")),mt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Ss,a)}var Dr=O({maximum_:pS});function fS(e,t=null,n=!1){let r={x:E(e,"x","mean")},a={axis:t,keepDims:n};return $.runKernel(Cs,r,a)}var vt=O({mean_:fS});function mS(e,t=null,n=!1){let r={x:E(e,"x","min")},a={axis:t,keepDims:n};return $.runKernel(Es,r,a)}var fl=O({min_:mS});function AS(e,t){let n=E(e,"a","minimum"),r=E(t,"b","minimum");[n,r]=bt(n,r),n.dtype==="bool"&&(n=ye(n,"int32"),r=ye(r,"int32")),mt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(Rs,a)}var ml=O({minimum_:AS});function yS(e,t,n){M(n==="reflect"||n==="symmetric",()=>`Invalid mode. Mode must be either reflect or symmetric. Got ${n}.`);let r=E(e,"x","mirrorPad");if(r.rank===0)throw new Error("mirrorPad(scalar) is not defined. Pass non-scalar to mirrorPad");M(t.length===r.rank,()=>`Padding doesn't match input. Must be ${r.rank}. Got ${t.length}.`);let a=n==="reflect"?1:0;for(let o=0;o"Invalid number of paddings. Must be length of 2 each."),M(t[o][0]>=0&&t[o][0]<=r.shape[o]-a&&t[o][1]>=0&&t[o][1]<=r.shape[o]-a,()=>`Padding in dimension ${o} cannot be greater than or equal to ${r.shape[o]-a} or less than 0 for input of shape ${r.shape}`);let s={paddings:t,mode:n},i={x:r};return $.runKernel(vu,i,s)}var dm=O({mirrorPad_:yS});function gS(e,t){let n=E(e,"a","mod"),r=E(t,"b","mod");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(No,a)}var pm=O({mod_:gS});function xS(e){let t=E(e,"x","square"),n={};return $.runKernel("Square",{x:t},n)}var it=O({square_:xS});function wS(e,t=null,n=!1){e=E(e,"x","moments");let r=tr(t,e.shape),a=vt(e,r,n),s=a.shape;n||(s=hi(a.shape,r));let i=it(Ae(ye(e,"float32"),H(a,s))),o=vt(i,r,n);return{mean:a,variance:o}}var Id=O({moments_:wS});function bS(e,t,n,r){let a=E(t,"data","multiRNNCell"),s=Pu(n,"c","multiRNNCell"),i=Pu(r,"h","multiRNNCell"),o=a,l=[];for(let h=0;h2)throw new Error(`Rank of probabilities must be 1 or 2, but is ${i}`);n=n||Math.random();let o={logits:i===1?H(a,[1,-1]):a},l={numSamples:t,seed:n,normalized:r},c=$.runKernel(Xh,o,l);return i===1?H(c,[c.size]):c}var wx=O({multinomial_:vS});function kS(e,t){let n=E(e,"a","notEqual"),r=E(t,"b","notEqual");[n,r]=bt(n,r),mt(n.shape,r.shape);let a={a:n,b:r};return $.runKernel(To,a)}var di=O({notEqual_:kS});function Ct(e,t="float32"){if(t==="complex64"){let r=Ct(e,"float32"),a=Ct(e,"float32");return Sa(r,a)}let n=vh(Ft(e),t);return $.makeTensor(n,e,t)}function Or(e,t="float32"){if(t==="complex64"){let r=Or(e,"float32"),a=Ct(e,"float32");return Sa(r,a)}let n=sf(Ft(e),t);return $.makeTensor(n,e,t)}function IS(e){let t={x:E(e,"x","onesLike")};return $.runKernel(Mo,t)}var Fn=O({onesLike_:IS});function NS(e,t){let n=E(e,"v1","outerProduct"),r=E(t,"v2","outerProduct");M(n.rank===1&&r.rank===1,()=>`Error in outerProduct: inputs must be rank 1, but got ranks ${n.rank} and ${r.rank}.`);let a=H(n,[-1,1]),s=H(r,[1,-1]);return Ge(a,s)}var SS=O({outerProduct_:NS});function TS(e,t,n=0){let r=E(e,"x","pad");if(r.rank===0)throw new Error("pad(scalar) is not defined. Pass non-scalar to pad");let a={paddings:t,constantValue:n},s={x:r};return $.runKernel($s,s,a)}var ra=O({pad_:TS});function CS(e,t,n=0){return M(t.length===2,()=>"Invalid number of paddings. Must be length of 2."),ra(e,[t],n)}var ES=O({pad1d_:CS});function RS(e,t,n=0){return M(t.length===2&&t[0].length===2&&t[1].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ra(e,t,n)}var MS=O({pad2d_:RS});function FS(e,t,n=0){return M(t.length===3&&t[0].length===2&&t[1].length===2&&t[2].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ra(e,t,n)}var $S=O({pad3d_:FS});function DS(e,t,n=0){return M(t.length===4&&t[0].length===2&&t[1].length===2&&t[2].length===2&&t[3].length===2,()=>"Invalid number of paddings. Must be length of 2 each."),ra(e,t,n)}var OS=O({pad4d_:DS});function zS(e,t,n){let r=E(e,"x","spaceToBatchND");M(r.rank>=1+t.length,()=>`input rank ${r.rank} should be > than [blockShape] ${t.length}`),M(n.length===t.length,()=>`paddings.shape[0] ${n.length} must be equal to [blockShape] ${t.length}`),M(r.shape.reduce((i,o,l)=>l>0&&l<=t.length?i&&(o+n[l-1][0]+n[l-1][1])%t[l-1]==0:i,!0),()=>`input spatial dimensions ${r.shape.slice(1)} with paddings ${n.toString()} must be divisible by blockShapes ${t.toString()}`);let a={x:r},s={blockShape:t,paddings:n};return $.runKernel(Nu,a,s)}var Zu=O({spaceToBatchND_:zS});function WS(e,t,n,r,a,s){a==null&&(a=[1,1]),s==null&&(s=1),r===0&&(r="valid");let i=E(e,"x","maxPool"),o=i,l=!1;i.rank===3&&(l=!0,o=H(i,[1,i.shape[0],i.shape[1],i.shape[2]])),M(Fr(s,a),()=>`Error in pool: Either strides or dilations must be 1. Got strides ${s} and dilations '${a}'`);let c=Y5(o.shape,t,s,a,r),u=[c.dilationHeight,c.dilationWidth],h;r==="same"?h=LS([c.filterHeight,c.filterWidth],u):h=[[0,0],[0,0]];let d=u[0]===1&&u[1]===1,[p,f]=PS([c.inHeight,c.inWidth],u,h),m=d?r:"valid",A=d?o:Zu(o,u,p),y=(n==="avg"?()=>Vu(A,t,s,m):()=>Ku(A,t,s,m))(),g=d?y:Uu(y,u,f);return l?H(g,[g.shape[1],g.shape[2],g.shape[3]]):g}function PS(e,t,n){let r=n.map(u=>u[0]),a=n.map(u=>u[1]),s=e.concat(r,a),i=t.map((u,h)=>(u-s[h]%u)%u),o=a.map((u,h)=>u+i[h]),l=t.map((u,h)=>[r[h],o[h]]),c=t.map((u,h)=>[0,i[h]]);return[l,c]}function LS(e,t){let n=e.map((s,i)=>s+(s-1)*(t[i]-1)).map(s=>s-1),r=n.map(s=>Math.floor(s/2)),a=n.map((s,i)=>s-r[i]);return n.map((s,i)=>[r[i],a[i]])}var bx=O({pool_:WS});function BS(e,t){let n=E(e,"base","pow"),r=E(t,"exp","pow");[n,r]=bt(n,r);let a={a:n,b:r};return $.runKernel(Ds,a)}var aa=O({pow_:BS});function VS(e,t){let n=E(e,"x","prelu"),r=E(t,"alpha","prelu"),a={x:n,alpha:r};return $.runKernel(Os,a)}var Yu=O({prelu_:VS});function US(e,t=null,n=!1){let r=E(e,"x","prod");r.dtype==="bool"&&(r=ye(r,"int32"));let a={x:r},s={axis:t,keepDims:n};return $.runKernel($o,a,s)}var Nd=O({prod_:US});function jS(e,t,n){let r=Ft(e),a=null;if(n==null||n==="float32")a=new Float32Array(r);else if(n==="int32")a=new Int32Array(r);else if(n==="bool")a=new Uint8Array(r);else throw new Error(`Unknown data type ${n}`);for(let s=0;s=1||s===0);let i=Math.sqrt(-2*Math.log(s)/s);e=this.mean+this.stdDev*r*i,t=this.mean+this.stdDev*a*i,(!this.truncated||this.isValidTruncated(e))&&(n=!0)}return(!this.truncated||this.isValidTruncated(t))&&(this.nextVal=this.convertValue(t)),this.convertValue(e)}convertValue(e){return this.dtype==null||this.dtype==="float32"?e:Math.round(e)}isValidTruncated(e){return e<=this.upper&&e>=this.lower}},GS=class{constructor(e,t,n,r){this.alpha=e,this.beta=1/t,this.dtype=n;let a=r||Math.random();this.randu=fm.alea(a.toString()),this.randn=new mm(0,1,n,!1,this.randu()),e<1?this.d=e+2/3:this.d=e-1/3,this.c=1/Math.sqrt(9*this.d)}nextValue(){let e,t,n,r,a,s;for(;;){do r=this.randn.nextValue(),s=1+this.c*r;while(s<=0);if(s*=s*s,e=r*r,t=1-.331*e*e,n=.5*e+this.d*(1-s+Math.log(s)),a=this.randu(),athis.dtype==null||this.dtype==="float32",this.min=e,this.range=t-e,this.dtype=n,r==null&&(r=Math.random()),typeof r=="number"&&(r=r.toString()),!this.canReturnFloat()&&this.range<=1)throw new Error(`The difference between ${e} - ${t} <= 1 and dtype is not float`);this.random=fm.alea(r)}convertValue(e){return this.canReturnFloat()?e:Math.round(e)}nextValue(){return this.convertValue(this.min+this.range*this.random())}};function XS(e,t,n=1,r="float32",a){if(n==null&&(n=1),r==null&&(r="float32"),r!=="float32"&&r!=="int32")throw new Error(`Unsupported data type ${r}`);let s=new GS(t,n,r,a),i=We(e,r);for(let o=0;o`Error in reverse1D: x must be rank 1 but got rank ${t.rank}.`),$n(t,0)}var aT=O({reverse1d_:rT});function sT(e,t){let n=E(e,"x","reverse");return M(n.rank===2,()=>`Error in reverse2D: x must be rank 2 but got rank ${n.rank}.`),$n(n,t)}var iT=O({reverse2d_:sT});function oT(e,t){let n=E(e,"x","reverse");return M(n.rank===3,()=>`Error in reverse3D: x must be rank 3 but got rank ${n.rank}.`),$n(n,t)}var lT=O({reverse3d_:oT});function uT(e,t){let n=E(e,"x","reverse");return M(n.rank===4,()=>`Error in reverse4D: x must be rank 4 but got rank ${n.rank}.`),$n(n,t)}var cT=O({reverse4d_:uT});function hT(e){let t={x:E(e,"x","round")};return $.runKernel(Bs,t)}var ym=O({round_:hT});function dT(e){let t={x:E(e,"x","rsqrt")};return $.runKernel(Vs,t)}var Cd=O({rsqrt_:dT});function ge(e,t){if((rn(e)&&t!=="string"||Array.isArray(e))&&t!=="complex64")throw new Error("Error creating a new Scalar: value must be a primitive (number|boolean|string)");if(t==="string"&&rn(e)&&!(e instanceof Uint8Array))throw new Error("When making a scalar from encoded string, the value must be `Uint8Array`.");return Ta(e,[],[],t)}function pT(e){let t={x:E(e,"x","selu")};return $.runKernel(Lo,t)}var Ed=O({selu_:pT});function fT(e,t,n,r,a,s=[1,1],i="NHWC"){let o=E(e,"x","separableConv2d"),l=E(t,"depthwiseFilter","separableConv2d"),c=E(n,"pointwiseFilter","separableConv2d"),u=o,h=!1;if(o.rank===3&&(h=!0,u=H(o,[1,o.shape[0],o.shape[1],o.shape[2]])),i==="NCHW")throw new Error("separableConv2d currently does not support dataFormat NCHW; only NHWC is supported");M(u.rank===4,()=>`Error in separableConv2d: input must be rank 4, but got rank ${u.rank}.`),M(l.rank===4,()=>`Error in separableConv2d: depthwise filter must be rank 4, but got rank ${l.rank}.`),M(c.rank===4,()=>`Error in separableConv2d: pointwise filter must be rank 4, but got rank ${l.rank}.`),M(c.shape[0]===1,()=>`Error in separableConv2d: the first dimension of pointwise filter must be 1, but got ${c.shape[0]}.`),M(c.shape[1]===1,()=>`Error in separableConv2d: the second dimension of pointwise filter must be 1, but got ${c.shape[1]}.`);let d=l.shape[2],p=l.shape[3];M(c.shape[2]===d*p,()=>`Error in separableConv2d: the third dimension of pointwise filter must be ${d*p}, but got ${c.shape[2]}.`);let f=cl(u,l,r,a,i,s),m=na(f,c,1,"valid",i);return h?H(m,[m.shape[1],m.shape[2],m.shape[3]]):m}var gm=O({separableConv2d_:fT});async function mT(e,t){let n=E(e,"x","setdiff1d"),r=E(t,"y","setdiff1d");M(n.dtype===r.dtype,()=>`x and y should have the same dtype, but got x (${n.dtype}) and y (${r.dtype}).`),M(n.rank===1,()=>`x should be 1D tensor, but got x (${n.shape}).`),M(r.rank===1,()=>`y should be 1D tensor, but got y (${r.shape}).`);let a=await n.data(),s=await r.data(),i=new Set(s),o=0;for(let u=0;u`slice1d expects a rank-1 tensor, but got a rank-${r.rank} tensor`),Ee(r,[t],[n])}var Fd=O({slice1d_:xT});function wT(e,t,n){let r=E(e,"x","slice2d");return M(r.rank===2,()=>`slice2d expects a rank-2 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var wm=O({slice2d_:wT});function bT(e,t,n){let r=E(e,"x","slice3d");return M(r.rank===3,()=>`slice3d expects a rank-3 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var $d=O({slice3d_:bT});function _T(e,t,n){let r=E(e,"x","slice4d");return M(r.rank===4,()=>`slice4d expects a rank-4 tensor, but got a rank-${r.rank} tensor`),Ee(r,t,n)}var Qu=O({slice4d_:_T});function vT(e,t=-1){let n=E(e,"logits","softmax","float32");if(t===-1&&(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}`);let r={logits:n},a={dim:t};return $.runKernel(qs,r,a)}var ec=O({softmax_:vT});function kT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.fft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Wh,t)}var tc=O({fft_:kT});function IT(e){M(e.dtype==="complex64",()=>`The dtype for tf.spectral.ifft() must be complex64 but got ${e.dtype}.`);let t={input:e};return $.runKernel(Bh,t)}var yl=O({ifft_:IT});function NT(e){let t=e.shape[e.shape.length-1],n=e.size/t,r;if(t<=2){let a=H(e,[n,t]);r=yl(a)}else{let a=[n,2*(t-1)],s=H(Ju(e),[n,t]),i=H(xd(e),[n,t]),o=$n(Ee(s,[0,1],[n,t-2]),1),l=P($n(Ee(i,[0,1],[n,t-2]),1),ge(-1)),c=rt([s,o],1),u=rt([i,l],1),h=H(Sa(c,u),[a[0],a[1]]);r=yl(h)}if(r=Ju(r),e.rank===3&&e.shape[0]!==0){let a=r,s=e.shape[0];r=H(r,[s,r.shape[0]/s,r.shape[1]]),a.dispose()}return r}var Dd=O({irfft_:NT});function ST(e,t,n=0){let r={x:E(e,"x","split")},a={numOrSizeSplits:t,axis:n};return $.runKernel(jo,r,a)}var zt=O({split_:ST});function TT(e,t){M(e.dtype==="float32",()=>`The dtype for rfft() must be real value but got ${e.dtype}`);let n=e.shape[e.shape.length-1],r=e.size/n,a;if(t!=null&&t0),m=e.shape.map(A=>A);m[e.shape.length-1]=t,a=Ee(e,f,m),n=t}else if(t!=null&&t>n){let f=e.shape.map(m=>m);f[e.shape.length-1]=t-n,a=rt([e,Ct(f)],e.shape.length-1),n=t}else a=e;let s=je(a),i=H(Sa(a,s),[r,n]),o=tc(i),l=Math.floor(n/2)+1,c=Ju(o),u=xd(o),h=zt(c,[l,n-l],c.shape.length-1),d=zt(u,[l,n-l],u.shape.length-1),p=a.shape.slice();return p[a.shape.length-1]=l,H(Sa(h[0],d[0]),p)}var nc=O({rfft_:TT});function CT(e){let t={x:E(e,"x","sqrt")};return $.runKernel(Hs,t)}var Jt=O({sqrt_:CT});function ET(e,t){let n=E(e,"a","squaredDifference"),r=E(t,"b","squaredDifference");[n,r]=bt(n,r),mt(n.shape,r.shape);let a={a:n,b:r},s={};return $.runKernel(Xs,a,s)}var Od=O({squaredDifference_:ET});function RT(e,t){let n=E(e,"x","squeeze");return H(n,jg(n.shape,t).newShape)}var Oa=O({squeeze_:RT});function MT(e,t=0){let n=Pu(e,"tensors","stack","string_or_numeric");M(n.length>=1,()=>"Pass at least one tensor to tf.stack"),n.length>0&&M(t<=n[0].rank,()=>"Axis must be <= rank of the tensor");let r=n,a={axis:t};return $.runKernel(Fo,r,a)}var un=O({stack_:MT});function FT(e,t=0){let n={x:E(e,"x","step")},r={alpha:t};return $.runKernel(Na,n,r)}var gl=O({step_:FT});function $T(e,t,n,r,a=0,s=0,i=0,o=0,l=0){let c={x:E(e,"x","stridedSlice")},u={begin:t,end:n,strides:r,beginMask:a,endMask:s,ellipsisMask:i,newAxisMask:o,shrinkAxisMask:l};return $.runKernel(Ho,c,u)}var bm=O({stridedSlice_:$T});function DT(e){let t={x:E(e,"x","tan")};return $.runKernel(Go,t)}var _m=O({tan_:DT});function sn(e,t){as(e);let n=Er(e,t);if(n.length!==1)throw new Error("tensor1d() requires values to be a flat/TypedArray");return Ta(e,null,n,t)}function kn(e,t,n){if(as(e),t!=null&&t.length!==2)throw new Error("tensor2d() requires shape to have two numbers");let r=Er(e,n);if(r.length!==2&&r.length!==1)throw new Error("tensor2d() requires values to be number[][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor2d() requires shape to be provided when `values` are a flat/TypedArray");return Ta(e,t,r,n)}function OT(e,t,n){if(as(e),t!=null&&t.length!==4)throw new Error("tensor4d() requires shape to have four numbers");let r=Er(e,n);if(r.length!==4&&r.length!==1)throw new Error("tensor4d() requires values to be number[][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor4d() requires shape to be provided when `values` are a flat array");return Ta(e,t,r,n)}function zT(e,t,n){if(as(e),t!=null&&t.length!==5)throw new Error("tensor5d() requires shape to have five numbers");let r=Er(e,n);if(r.length!==5&&r.length!==1)throw new Error("tensor5d() requires values to be number[][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor5d() requires shape to be provided when `values` are a flat array");return Ta(e,t,r,n)}function PT(e,t,n){if(as(e),t!=null&&t.length!==6)throw new Error("tensor6d() requires shape to have six numbers");let r=Er(e,n);if(r.length!==6&&r.length!==1)throw new Error("tensor6d() requires values to be number[][][][][][] or flat/TypedArray");if(r.length===1&&t==null)throw new Error("tensor6d() requires shape to be provided when `values` are a flat array");return t=t||r,Ta(e,t,r,n)}function LT(e,t=1,n=!0){let r=E(e,"x","topk");if(r.rank===0)throw new Error("topk() expects the input to be of rank 1 or higher");let a=r.shape[r.shape.length-1];if(t>a)throw new Error(`'k' passed to topk() must be <= the last dimension (${a}) but got ${t}`);let s={x:r},i={k:t,sorted:n},[o,l]=$.runKernel(qo,s,i);return{values:o,indices:l}}var vm=O({topk_:LT});function WT(e,t=0,n=1,r,a){if(r!=null&&r==="bool")throw new Error("Unsupported data type $ { dtype }");let s=new mm(t,n,r,!0,a),i=We(e,r);for(let o=0;o0,()=>"The input tensor must be at least 1D");let r={x:n},a={axis:t},[s,i]=$.runKernel(ed,r,a);return{values:s,indices:i}}var Pd=O({unique_:BT});function VT(e,t,n){let r=E(e,"x","unsortedSegmentSum"),a=E(t,"segmentIds","unsortedSegmentSum","int32");M(Vt(n),()=>"numSegments must be of dtype int");let s={x:r,segmentIds:a},i={numSegments:n};return $.runKernel(Tu,s,i)}var km=O({unsortedSegmentSum_:VT});function UT(e,t=0){let n=E(e,"x","unstack","string_or_numeric");M(t>=-n.shape.length&&t`Axis = ${t} is not in [-${n.shape.length}, ${n.shape.length})`);let r={value:n},a={axis:t};return $.runKernel(Xo,r,a)}var sr=O({unstack_:UT});function kx(e,t=!0,n,r){return $.makeVariable(e,t,n,r)}function Ix(e,t){let n=[];for(let s=0;s0,()=>"mask cannot be scalar"),nn(o.slice(s,s+i),a.shape,"mask's shape must match the first K dimensions of tensor's shape,");let l=1;for(let m=s;m"Shape mismatch in v and x");let l=ge(1),c=Ae(l,o),u=P(Ae(i,s),c);if(a){M(r!=null,()=>"When using zeroDebias: true, step is required.");let h=E(r,"step","movingAverage");u=me(u,Ae(l,aa(o,h)))}return se(s,u)}var KT=O({movingAverage_:XT});function ZT(e,t,n){let r=E(e,"indices","scatterND","int32"),a=E(t,"updates","scatterND");Df(a,r,n);let s={indices:r,updates:a},i={shape:n};return $.runKernel(zo,s,i)}var Sx=O({scatterND_:ZT});function YT(e,t,n,r){if(e.dtype!=="int32")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}.`);let a=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}.`);let i=t.size;if(!(t.rank===0||t.rank===1&&i===a))throw new Error(`sparseValues has incorrect shape ${t.shape}, should be [] or [${a}]`);if(t.dtype!==r.dtype)throw new Error("sparseValues.dtype must match defaultValues.dtype")}function JT(e,t,n,r=0){let a=E(e,"sparseIndices","sparseToDense","int32"),s=E(t,"sparseValues","sparseToDense"),i=E(r,"defaultValue","sparseToDense",s.dtype);YT(a,s,n,i);let o={sparseIndices:a,sparseValues:s,defaultValue:i},l={outputShape:n};return $.runKernel(Jh,o,l)}var Nm=O({sparseToDense_:JT});function QT(e,t){let n=E(t,"indices","gatherND","int32"),r={params:E(e,"x","gatherND"),indices:n};return $.runKernel(yo,r)}var Tx=O({gatherND_:QT});function eC(e,t){if(t==null)return e.shape.slice();if(ea(e.shape,t))return t;if(e.shape.length===t.length){let n=[];for(let r=0;r`x has to be a floating point tensor since it's going to be scaled, but got a ${a.dtype} tensor instead.`),M(t>=0&&t<1,()=>`rate must be a float in the range [0, 1), but got ${t}.`),t===0)return e instanceof Ve?a.clone():a;let s=eC(a,n),i=1-t,o=me(dl(se(Al(s,0,1,"float32",r),i)),i);return P(a,o)}var Cx=O({dropout_:tC});function Ex(e){return Math.floor(Math.pow(2,Math.ceil(Math.log(e)/Math.log(2))))}function Sm(e,t,n){let r=1-e%2,a=new Float32Array(e);for(let s=0;s1,()=>`inTopK() expects the predictions to be of rank 2 or higher, but got ${r.rank}`),M(r.rank-1===a.rank,()=>`predictions rank should be 1 larger than targets rank, but got predictions rank ${r.rank} and targets rank ${a.rank}`),nn(r.shape.slice(0,r.shape.length-1),a.shape,"predictions's shape should be align with the targets' shape, except the last dimension.");let s=r.shape[r.shape.length-1];M(n>0&&n<=s,()=>`'k' passed to inTopK() must be > 0 && <= the predictions last dimension (${s}), but got ${n}`);let i=await r.data(),o=await a.data(),[l,c]=[i.length/s,s],u=Hg("bool",l);for(let h=0;hA.value-m.value),u[h]=0;for(let m=0;maC,depthwiseConv2d:()=>sC,matMul:()=>iC});function oC(e,t,n,r,a,s="NHWC",i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]])),M(o.rank===4,()=>`Error in conv2dDerFilter: input must be rank 4, but got shape ${o.shape}.`),M(l.rank===4,()=>`Error in conv2dDerFilter: dy must be rank 4, but got shape ${l.shape}.`),M(n.length===4,()=>`Error in conv2dDerFilter: filterShape must be length 4, but got ${n}.`);let c=s==="NHWC"?o.shape[3]:o.shape[1],u=s==="NHWC"?l.shape[3]:l.shape[1];M(c===n[2],()=>`Error in conv2dDerFilter: depth of input ${c}) must match input depth in filter (${n[2]}.`),M(u===n[3],()=>`Error in conv2dDerFilter: depth of dy (${u}) must match output depth for filter (${n[3]}).`),i!=null&&M(Vt(a),()=>`Error in conv2dDerFilter: pad must be an integer when using, dimRoundingMode ${i} but got pad ${a}.`);let h={x:o,dy:l},d={strides:r,pad:a,dataFormat:s,dimRoundingMode:i,filterShape:n};return $.runKernel(Eh,h,d)}var Tm=O({conv2DBackpropFilter_:oC});function Wd(e,t,n){if(n==null||n==="linear")return e;if(n==="relu")return P(e,gl(t));throw new Error(`Cannot compute gradient for fused activation ${n}.`)}function Bd(e,t){let n=t,r=Ot(e.shape,t.shape);return r.length>0&&(n=Ce(n,r)),H(n,e.shape)}function Vd(e,t,n,r){if(t==="linear")return e;if(t==="relu")return zr(e);if(t==="elu")return hl(e);if(t==="relu6")return Td(e);if(t==="prelu")return Yu(e,n);if(t==="leakyrelu")return qu(e,r);throw new Error(`Unknown fused activation ${t}.`)}var Ud=(e,t)=>!(e>0)||t==="linear";function lC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(l=l||"linear",Ud($.state.gradientDepth,l)===!1){let _=na(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Vd(_,l,c,u)}let h=E(e,"x","conv2d"),d=E(t,"filter","conv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused conv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused conv2d: filter must be rank 4, but got rank ${d.rank}.`),i!=null&&M(Vt(r),()=>`Error in fused conv2d: pad must be an integer when using, dimRoundingMode ${i} but got pad ${r}.`),M(p.shape[3]===d.shape[2],()=>`Error in conv2d: depth of input (${p.shape[3]}) must match input depth for filter ${d.shape[2]}.`),M(Fr(n,s),()=>`Error in conv2D: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),M(a==="NHWC",()=>`Error in conv2d: got dataFormat of ${a} but only NHWC is currently supported.`);let m=Bu(p.shape,d.shape,n,s,r,i),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),mt(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused conv2d"));let g=(_,x)=>{let[N,T,C,F]=x,D=Wd(_,C,l);M(Ma(s),()=>`Error in gradient of fused conv2D: dilation rates greater than 1 are not yet supported in gradients. Got dilations '${s}'`);let L=Qf(T.shape,D,N,n,r),V=Tm(T,D,N.shape,n,r),U=[L,V];if(F!=null){let j=Bd(F,D);U.push(j)}return U},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?$r((_,x,N)=>{let T=$.runKernel(Qs,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):$r((_,x,N,T)=>{let C=$.runKernel(Qs,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var aC=O({fusedConv2d_:lC});function uC(e,t,n,r,a,s=[1,1],i){let o=e;e.rank===3&&(o=H(e,[1,e.shape[0],e.shape[1],e.shape[2]]));let l=t;l.rank===3&&(l=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={x:o,dy:l},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,filterShape:n};return $.runKernel($h,c,u)}var Rx=O({depthwiseConv2dNativeBackpropFilter_:uC});function cC(e,t,n,r,a,s=[1,1],i){let o=t,l=!1;t.rank===3&&(l=!0,o=H(t,[1,t.shape[0],t.shape[1],t.shape[2]]));let c={dy:o,filter:n},u={strides:r,pad:a,dimRoundingMode:i,dilations:s,inputShape:e},h=$.runKernel(Dh,c,u);return l?H(h,[h.shape[1],h.shape[2],h.shape[3]]):h}var Mx=O({depthwiseConv2dNativeBackpropInput_:cC});function hC({x:e,filter:t,strides:n,pad:r,dataFormat:a="NHWC",dilations:s=[1,1],dimRoundingMode:i,bias:o,activation:l="linear",preluActivationWeights:c,leakyreluAlpha:u}){if(Ud($.state.gradientDepth,l)===!1){let _=cl(e,t,n,r,a,s,i);return o!=null&&(_=se(_,o)),Vd(_,l,c,u)}let h=E(e,"x","depthwiseConv2d"),d=E(t,"filter","depthwiseConv2d"),p=h,f=!1;h.rank===3&&(f=!0,p=H(h,[1,h.shape[0],h.shape[1],h.shape[2]])),M(p.rank===4,()=>`Error in fused depthwiseConv2d: input must be rank 4, but got rank ${p.rank}.`),M(d.rank===4,()=>`Error in fused depthwiseConv2d: filter must be rank 4, but got rank ${d.rank}.`),M(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]}.`),s==null&&(s=[1,1]),M(Fr(n,s),()=>`Error in fused depthwiseConv2d: Either strides or dilations must be 1. Got strides ${n} and dilations '${s}'`),i!=null&&M(Vt(r),()=>`Error in fused depthwiseConv2d: pad must be an integer when using dimRoundingMode ${i} but got pad ${r}.`);let m=Bu(p.shape,d.shape,n,s,r,i,!0),A;o!=null&&(A=E(o,"bias","fused conv2d"),[A]=bt(A,h),mt(m.outShape,A.shape));let y;c!=null&&(y=E(c,"prelu weights","fused depthwiseConv2d"));let g=(_,x)=>{M(Ma(s),()=>`Error in gradient of fused depthwiseConv2d: dilation rates greater than 1 are not yet supported. Got dilations '${s}'`);let[N,T,C,F]=x,D=Wd(_,C,l),L=Mx(T.shape,D,N,n,r,s,i),V=Rx(T,D,N.shape,n,r,s,i);if(F!=null){let U=Bd(A,D);return[L,V,U]}return[L,V]},w={x:p,filter:d,bias:A,preluActivationWeights:y},b={strides:n,pad:r,dataFormat:a,dilations:s,dimRoundingMode:i,activation:l,leakyreluAlpha:u};return o==null?$r((_,x,N)=>{let T=$.runKernel(ei,w,b);return N([x,_,T]),f&&(T=H(T,[T.shape[1],T.shape[2],T.shape[3]])),{value:T,gradFunc:g}})(p,d):$r((_,x,N,T)=>{let C=$.runKernel(ei,w,b);return T([x,_,C,N]),f&&(C=H(C,[C.shape[1],C.shape[2],C.shape[3]])),{value:C,gradFunc:g}})(p,d,A)}var sC=O({fusedDepthwiseConv2d_:hC});function dC({a:e,b:t,transposeA:n=!1,transposeB:r=!1,bias:a,activation:s="linear",preluActivationWeights:i,leakyreluAlpha:o}){if(Ud($.state.gradientDepth,s)===!1){let F=Ge(e,t,n,r);return a!=null&&(F=se(F,a)),Vd(F,s,i,o)}let l=E(e,"a","fused matMul"),c=E(t,"b","fused matMul");[l,c]=bt(l,c);let u=n?l.shape[l.rank-2]:l.shape[l.rank-1],h=r?c.shape[c.rank-1]:c.shape[c.rank-2],d=n?l.shape[l.rank-1]:l.shape[l.rank-2],p=r?c.shape[c.rank-2]:c.shape[c.rank-1],f=l.shape.slice(0,-2),m=c.shape.slice(0,-2),A=Ft(f),y=Ft(m);M(l.rank>=2&&c.rank>=2&&l.rank===c.rank,()=>`Error in fused matMul: inputs must have the same rank of at least 2, got ranks ${l.rank} and ${c.rank}.`),M(ea(f,m),()=>`Error in fused matMul: outer dimensions (${f}) and (${m}) of Tensors with shapes ${l.shape} and ${c.shape} must match.`),M(u===h,()=>`Error in fused matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${l.shape} and ${c.shape} and transposeA=${n} and transposeB=${r} must match.`);let g=l.shape.slice(0,-2).concat([d,p]),w=n?H(l,[A,u,d]):H(l,[A,d,u]),b=r?H(c,[y,p,h]):H(c,[y,h,p]),_;a!=null&&(_=E(a,"bias","fused matMul"),[_]=bt(_,l),mt(g,_.shape));let x;i!=null&&(x=E(i,"prelu weights","fused matMul"));let N=(F,D)=>{let[L,V,U,j]=D,X=Wd(H(F,U.shape),U,s),G,ee;if(!n&&!r?(G=Ge(X,V,!1,!0),ee=Ge(L,X,!0,!1)):!n&&r?(G=Ge(X,V,!1,!1),ee=Ge(X,L,!0,!1)):n&&!r?(G=Ge(V,X,!1,!0),ee=Ge(L,X,!1,!1)):(G=Ge(V,X,!0,!0),ee=Ge(X,L,!0,!0)),a!=null){let Y=Bd(j,X);return[G,ee,Y]}else return[G,ee]},T={a:w,b,bias:_,preluActivationWeights:x},C={transposeA:n,transposeB:r,activation:s,leakyreluAlpha:o};return a==null?$r((F,D,L)=>{let V=$.runKernel(Js,T,C);return L([F,D,V]),{value:H(V,g),gradFunc:N}})(w,b):$r((F,D,L,V)=>{let U=$.runKernel(Js,T,C);return V([F,D,U,L]),{value:H(U,g),gradFunc:N}})(w,b,_)}var iC=O({fusedMatMul_:dC});function pC(e){return Sm(e,.54,.46)}var fC=O({hammingWindow_:pC});function mC(e){return Sm(e,.5,.5)}var Fx=O({hannWindow_:mC});function AC(e,t,n,r=!1,a=0){let s=0,i=[];for(;s+t<=e.size;)i.push(Ee(e,s,t)),s+=n;if(r)for(;s`Error in cropAndResize: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&o.shape[1]===4,()=>`Error in cropAndResize: boxes must be have size [${c},4] but had shape ${o.shape}.`),M(l.rank===1&&l.shape[0]===c,()=>`Error in cropAndResize: boxInd must be have size [${c}] but had shape ${o.shape}.`),M(r.length===2,()=>`Error in cropAndResize: cropSize must be of length 2, but got length ${r.length}.`),M(r[0]>=1&&r[1]>=1,()=>`cropSize must be atleast [1,1], but was ${r}`),M(a==="bilinear"||a==="nearest",()=>`method must be bilinear or nearest, but was ${a}`);let u={image:i,boxes:o,boxInd:l},h={method:a,extrapolationValue:s,cropSize:r};return $.runKernel(oo,u,h)}var wC=O({cropAndResize_:xC});function bC(e){let t=E(e,"image","flipLeftRight","float32");M(t.rank===4,()=>`Error in flipLeftRight: image must be rank 4,but got rank ${t.rank}.`);let n={image:t};return $.runKernel(mo,n,{})}var _C=O({flipLeftRight_:bC});function vC(e,t,n=0,r=.5){let a=E(e,"image","rotateWithOffset","float32");M(a.rank===4,()=>`Error in rotateWithOffset: image must be rank 4,but got rank ${a.rank}.`);let s={image:a},i={radians:t,fillValue:n,center:r};return $.runKernel(Zo,s,i)}var kC=O({rotateWithOffset_:vC});function xl(e,t,n,r,a,s){r==null&&(r=.5),a==null&&(a=Number.NEGATIVE_INFINITY),s==null&&(s=0);let i=e.shape[0];return n=Math.min(n,i),M(0<=r&&r<=1,()=>`iouThreshold must be in [0, 1], but was '${r}'`),M(e.rank===2,()=>`boxes must be a 2D tensor, but was of rank '${e.rank}'`),M(e.shape[1]===4,()=>`boxes must have 4 columns, but 2nd dimension was ${e.shape[1]}`),M(t.rank===1,()=>"scores must be a 1D tensor"),M(t.shape[0]===i,()=>`scores has incompatible shape with boxes. Expected ${i}, but was ${t.shape[0]}`),M(0<=s&&s<=1,()=>`softNmsSigma must be in [0, 1], but was '${s}'`),{maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s}}function IC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppression"),i=E(t,"scores","nonMaxSuppression"),o=xl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l={maxOutputSize:n,iouThreshold:r,scoreThreshold:a};return $.runKernel(Co,{boxes:s,scores:i},l)}var NC=O({nonMaxSuppression_:IC});function TC(e,t,n){let r=SC(e,t,n),a=r<0?-(r+1):r;e.splice(a,0,t)}function SC(e,t,n){return EC(e,t,n||CC)}function CC(e,t){return e>t?1:e>>1);let o=n(t,e[s]);o>0?r=s+1:(a=s,i=!o)}return i?r:-r-1}function Dx(e,t,n,r,a){return Cm(e,t,n,r,a,0)}function Ox(e,t,n,r,a,s){return Cm(e,t,n,r,a,0,!1,s,!0)}function zx(e,t,n,r,a,s){return Cm(e,t,n,r,a,s,!0)}function Cm(e,t,n,r,a,s,i=!1,o=!1,l=!1){let c=[];for(let A=0;Aa&&c.push({score:t[A],boxIndex:A,suppressBeginIndex:0});c.sort(Px);let u=s>0?-.5/s:0,h=[],d=[];for(;h.length0;){let A=c.pop(),{score:y,boxIndex:g,suppressBeginIndex:w}=A;if(y=w;--_){let x=RC(e,g,h[_]);if(x>=r){b=!0;break}if(A.score=A.score*MC(r,u,x),A.score<=a)break}A.suppressBeginIndex=h.length,b||(A.score===y?(h.push(g),d.push(A.score)):A.score>a&&TC(c,A,Px))}let p=h.length,f=n-p;o&&f>0&&(h.push(...new Array(f).fill(0)),d.push(...new Array(f).fill(0)));let m={selectedIndices:h};return i&&(m.selectedScores=d),l&&(m.validOutputs=p),m}function RC(e,t,n){let r=e.subarray(t*4,t*4+4),a=e.subarray(n*4,n*4+4),s=Math.min(r[0],r[2]),i=Math.min(r[1],r[3]),o=Math.max(r[0],r[2]),l=Math.max(r[1],r[3]),c=Math.min(a[0],a[2]),u=Math.min(a[1],a[3]),h=Math.max(a[0],a[2]),d=Math.max(a[1],a[3]),p=(o-s)*(l-i),f=(h-c)*(d-u);if(p<=0||f<=0)return 0;let m=Math.max(s,c),A=Math.max(i,u),y=Math.min(o,h),g=Math.min(l,d),w=Math.max(y-m,0)*Math.max(g-A,0);return w/(p+f-w)}function MC(e,t,n){let r=Math.exp(t*n*n);return n<=e?r:0}function Px(e,t){return e.score-t.score||e.score===t.score&&t.boxIndex-e.boxIndex}async function FC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY){let s=E(e,"boxes","nonMaxSuppressionAsync"),i=E(t,"scores","nonMaxSuppressionAsync"),o=xl(s,i,n,r,a);n=o.maxOutputSize,r=o.iouThreshold,a=o.scoreThreshold;let l=await Promise.all([s.data(),i.data()]),c=l[0],u=l[1],{selectedIndices:h}=Dx(c,u,n,r,a);return s!==e&&s.dispose(),i!==t&&i.dispose(),sn(h,"int32")}var $C=FC;function DC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=xl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c={boxes:i,scores:o},u={maxOutputSize:n,iouThreshold:r,scoreThreshold:a,softNmsSigma:s},h=$.runKernel(Ro,c,u);return{selectedIndices:h[0],selectedScores:h[1]}}var OC=O({nonMaxSuppressionWithScore_:DC});async function zC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=0){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=xl(i,o,n,r,a,s);n=l.maxOutputSize,r=l.iouThreshold,a=l.scoreThreshold,s=l.softNmsSigma;let c=await Promise.all([i.data(),o.data()]),u=c[0],h=c[1],{selectedIndices:d,selectedScores:p}=zx(u,h,n,r,a,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:sn(d,"int32"),selectedScores:sn(p)}}var PC=zC;function LC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppression"),o=E(t,"scores","nonMaxSuppression"),l=xl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,d={boxes:i,scores:o},p={maxOutputSize:c,iouThreshold:u,scoreThreshold:h,padToMaxOutputSize:s},f=$.runKernel(Eo,d,p);return{selectedIndices:f[0],validOutputs:f[1]}}var WC=O({nonMaxSuppressionPadded_:LC});async function BC(e,t,n,r=.5,a=Number.NEGATIVE_INFINITY,s=!1){let i=E(e,"boxes","nonMaxSuppressionAsync"),o=E(t,"scores","nonMaxSuppressionAsync"),l=xl(i,o,n,r,a,null),c=l.maxOutputSize,u=l.iouThreshold,h=l.scoreThreshold,[d,p]=await Promise.all([i.data(),o.data()]),{selectedIndices:f,validOutputs:m}=Ox(d,p,c,u,h,s);return i!==e&&i.dispose(),o!==t&&o.dispose(),{selectedIndices:sn(f,"int32"),validOutputs:ge(m,"int32")}}var VC=BC;function UC(e,t,n=!1,r=!1){let a=E(e,"images","resizeBilinear");M(a.rank===3||a.rank===4,()=>`Error in resizeBilinear: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeBilinear: new shape must 2D, but got shape ${t}.`),M(r===!1||n===!1,()=>"Error in resizeBilinear: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Ps,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Lx=O({resizeBilinear_:UC});function jC(e,t,n=!1,r=!1){let a=E(e,"images","resizeNearestNeighbor");M(a.rank===3||a.rank===4,()=>`Error in resizeNearestNeighbor: x must be rank 3 or 4, but got rank ${a.rank}.`),M(t.length===2,()=>`Error in resizeNearestNeighbor: new shape must 2D, but got shape ${t}.`),M(a.dtype==="float32"||a.dtype==="int32",()=>"`images` must have `int32` or `float32` as dtype"),M(r===!1||n===!1,()=>"Error in resizeNearestNeighbor: If halfPixelCenters is true, alignCorners must be false.");let s=a,i=!1;a.rank===3&&(i=!0,s=H(a,[1,a.shape[0],a.shape[1],a.shape[2]]));let[]=t,o={images:s},l={alignCorners:n,halfPixelCenters:r,size:t},c=$.runKernel(Iu,o,l);return i?H(c,[c.shape[1],c.shape[2],c.shape[3]]):c}var Wx=O({resizeNearestNeighbor_:jC});function HC(e,t,n="nearest",r="constant",a=0,s){let i=E(e,"image","transform","float32"),o=E(t,"transforms","transform","float32");M(i.rank===4,()=>`Error in transform: image must be rank 4,but got rank ${i.rank}.`),M(o.rank===2&&(o.shape[0]===i.shape[0]||o.shape[0]===1)&&o.shape[1]===8,()=>"Error in transform: Input transform should be batch x 8 or 1 x 8"),M(s==null||s.length===2,()=>`Error in transform: outputShape must be [height, width] or null, but got ${s}.`);let l={image:i,transforms:o},c={interpolation:n,fillMode:r,fillValue:a,outputShape:s};return $.runKernel(Qh,l,c)}var GC=O({transform_:HC});function qC(e,t,n){M(t%1==0,()=>`bandPart(): numLower must be an integer, got ${t}.`),M(n%1==0,()=>`bandPart(): numUpper must be an integer, got ${n}.`);let r=E(e,"a","bandPart");M(r.rank>=2,()=>`bandPart(): Rank must be at least 2, got ${r.rank}.`);let a=r.shape,[s,i]=r.shape.slice(-2);if(!(t<=s))throw new Error(`bandPart(): numLower (${t}) must not be greater than the number of rows (${s}).`);if(!(n<=i))throw new Error(`bandPart(): numUpper (${n}) must not be greater than the number of columns (${i}).`);t<0&&(t=s),n<0&&(n=i);let o=H(Sd(0,s,1,"int32"),[-1,1]),l=Sd(0,i,1,"int32"),c=Ae(o,l),u=ar(ci(c,ge(+t,"int32")),Da(c,ge(-n,"int32"))),h=Ct([s,i],r.dtype);return H(un(sr(H(r,[-1,s,i])).map(d=>_n(u,d,h))),a)}var XC=O({bandPart_:qC});function KC(e){let t;if(Array.isArray(e)){t=!1,M(e!=null&&e.length>0,()=>"Gram-Schmidt process: input must not be null, undefined, or empty");let a=e[0].shape[0];for(let s=1;s`Gram-Schmidt: Non-unique lengths found in the input vectors: (${e[s].shape[0]} vs. ${a})`)}else t=!0,e=zt(e,e.shape[0],0).map(a=>Oa(a,[0]));M(e.length<=e[0].shape[0],()=>`Gram-Schmidt: Number of vectors (${e.length}) exceeds number of dimensions (${e[0].shape[0]}).`);let n=[],r=e;for(let a=0;a{let s=r[a];if(a>0)for(let i=0;i=2,()=>`qr() requires input tensor to have a rank >= 2, but got rank ${e.rank}`),e.rank===2)return Bx(e,t);{let n=e.shape.slice(0,e.shape.length-2).reduce((l,c)=>l*c),r=sr(H(e,[n,e.shape[e.shape.length-2],e.shape[e.shape.length-1]]),0),a=[],s=[];r.forEach(l=>{let[c,u]=Bx(l,t);a.push(c),s.push(u)});let i=H(un(a,0),e.shape),o=H(un(s,0),e.shape);return[i,o]}}function Bx(e,t=!1){return $.tidy(()=>{M(e.shape.length===2,()=>`qr2d() requires a 2D Tensor, but got a ${e.shape.length}D Tensor.`);let n=e.shape[0],r=e.shape[1],a=im(n),s=Rr(e),i=kn([[1]],[1,1]),o=Rr(i),l=n>=r?r:n;for(let c=0;c{let p=Ee(s,[c,c],[n-c,1]),f=Ld(p),m=Ee(s,[c,c],[1,1]),A=_n(rr(m,0),kn([[-1]]),kn([[1]])),y=Ae(m,P(A,f)),g=me(p,y);g.shape[0]===1?o=Rr(i):o=rt([i,Ee(g,[1,0],[g.shape[0]-1,g.shape[1]])],0);let w=_t(me(Ge(A,y),f)),b=Ee(s,[c,0],[n-c,r]),_=P(w,o),x=nt(o);if(c===0)s=Ae(b,Ge(_,Ge(x,b)));else{let C=Ae(b,Ge(_,Ge(x,b)));s=rt([Ee(s,[0,0],[c,r]),C],0)}let N=nt(_),T=Ee(a,[0,c],[n,a.shape[1]-c]);if(c===0)a=Ae(T,Ge(Ge(T,o),N));else{let C=Ae(T,Ge(Ge(T,o),N));a=rt([Ee(a,[0,0],[n,c]),C],1)}return[o,s,a]}),ve([u,h,d])}return!t&&n>r&&(a=Ee(a,[0,0],[n,r]),s=Ee(s,[0,0],[r,r])),[a,s]})}var JC=O({qr_:YC}),cn;(function(e){e[e.NONE=0]="NONE",e[e.MEAN=1]="MEAN",e[e.SUM=2]="SUM",e[e.SUM_BY_NONZERO_WEIGHTS=3]="SUM_BY_NONZERO_WEIGHTS"})(cn||(cn={}));function QC(e,t,n=cn.SUM_BY_NONZERO_WEIGHTS){let r=E(e,"losses","computeWeightedLoss"),a=null;t!=null&&(a=E(t,"weights","computeWeightedLoss"));let s=a==null?r:P(r,a);if(n===cn.NONE)return s;if(n===cn.SUM)return Ce(s);if(n===cn.MEAN){if(a==null)return vt(s);{let i=r.size/a.size,o=me(Ce(s),Ce(a));return i>1?me(o,ge(i)):o}}if(n===cn.SUM_BY_NONZERO_WEIGHTS){if(a==null)return me(Ce(s),ge(r.size));{let i=P(a,Or(r.shape)),o=ye(Ce(di(i,ge(0))),"float32");return me(Ce(s),o)}}throw Error(`Unknown reduction: ${n}`)}var sa=O({computeWeightedLoss_:QC});function eE(e,t,n,r=cn.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","absoluteDifference"),s=E(t,"predictions","absoluteDifference"),i=null;n!=null&&(i=E(n,"weights","absoluteDifference")),nn(a.shape,s.shape,"Error in absoluteDifference: ");let o=Dt(Ae(a,s));return sa(o,i,r)}var tE=O({absoluteDifference_:eE});function nE(e,t,n,r,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","cosineDistance"),i=E(t,"predictions","cosineDistance"),o=null;r!=null&&(o=E(r,"weights","cosineDistance")),nn(s.shape,i.shape,"Error in cosineDistance: ");let l=ge(1),c=Ae(l,Ce(P(s,i),n,!0));return sa(c,o,a)}var rE=O({cosineDistance_:nE});function aE(e,t,n,r=cn.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","hingeLoss"),s=E(t,"predictions","hingeLoss"),i=null;n!=null&&(i=E(n,"weights","hingeLoss")),nn(a.shape,s.shape,"Error in hingeLoss: ");let o=ge(1);a=Ae(P(ge(2),a),o);let l=zr(Ae(o,P(a,s)));return sa(l,i,r)}var sE=O({hingeLoss_:aE});function iE(e,t,n,r=1,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","huberLoss"),i=E(t,"predictions","huberLoss"),o=null;n!=null&&(o=E(n,"weights","huberLoss")),nn(s.shape,i.shape,"Error in huberLoss: ");let l=ge(r),c=Dt(Ae(i,s)),u=ml(c,l),h=Ae(c,u),d=se(P(ge(.5),it(u)),P(l,h));return sa(d,o,a)}var oE=O({huberLoss_:iE});function lE(e,t,n,r=1e-7,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"labels","logLoss"),i=E(t,"predictions","logLoss"),o=null;n!=null&&(o=E(n,"weights","logLoss")),nn(s.shape,i.shape,"Error in logLoss: ");let l=ge(1),c=ge(r),u=_t(P(s,Mn(se(i,c)))),h=P(Ae(l,s),Mn(se(Ae(l,i),c))),d=Ae(u,h);return sa(d,o,a)}var uE=O({logLoss_:lE});function cE(e,t,n,r=cn.SUM_BY_NONZERO_WEIGHTS){let a=E(e,"labels","meanSquaredError"),s=E(t,"predictions","meanSquaredError"),i=null;n!=null&&(i=E(n,"weights","meanSquaredError")),nn(a.shape,s.shape,"Error in meanSquaredError: ");let o=Od(a,s);return sa(o,i,r)}var hE=O({meanSquaredError_:cE});function dE(e,t){let n=E(e,"labels","sigmoidCrossEntropyWithLogits"),r=E(t,"logits","sigmoidCrossEntropyWithLogits");nn(n.shape,r.shape,"Error in sigmoidCrossEntropyWithLogits: ");let a=zr(r),s=P(r,n),i=bd(Gn(_t(Dt(r))));return se(Ae(a,s),i)}function pE(e,t,n,r=0,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"multiClassLabels","sigmoidCrossEntropy"),i=E(t,"logits","sigmoidCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","sigmoidCrossEntropy")),nn(s.shape,i.shape,"Error in sigmoidCrossEntropy: "),r>0){let c=ge(r),u=ge(1),h=ge(.5);s=se(P(s,Ae(u,c)),P(h,c))}let l=dE(s,i);return sa(l,o,a)}var fE=O({sigmoidCrossEntropy_:pE});function mE(e,t,n=-1){if(n===-1&&(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}`);return $r((r,a,s)=>{let i=cm(a,[n],!0),o=Ae(ye(a,"float32"),i);s([r,o]);let l=_t(P(o,r));return{value:Ce(l,[n]),gradFunc:(c,u)=>{let[h,d]=u,p=hi(c.shape,[n]);return[P(H(c,p),Ae(ye(h,"float32"),Gn(d))),P(H(c,p),Ae(Gn(d),ye(h,"float32")))]}}})(e,t)}function AE(e,t,n,r=0,a=cn.SUM_BY_NONZERO_WEIGHTS){let s=E(e,"onehotLabels","softmaxCrossEntropy"),i=E(t,"logits","softmaxCrossEntropy"),o=null;if(n!=null&&(o=E(n,"weights","softmaxCrossEntropy")),nn(s.shape,i.shape,"Error in softmaxCrossEntropy: "),r>0){let c=ge(r),u=ge(1),h=ge(s.shape[1]);s=se(P(s,Ae(u,c)),me(c,h))}let l=mE(s,i);return sa(l,o,a)}var yE=O({softmaxCrossEntropy_:AE}),gE={fft:tc,ifft:yl,rfft:nc,irfft:Dd},xE={hammingWindow:fC,hannWindow:Fx,frame:$x,stft:gC},ze={flipLeftRight:_C,resizeNearestNeighbor:Wx,resizeBilinear:Lx,rotateWithOffset:kC,cropAndResize:wC,nonMaxSuppression:NC,nonMaxSuppressionAsync:$C,nonMaxSuppressionWithScore:OC,nonMaxSuppressionWithScoreAsync:PC,nonMaxSuppressionPadded:WC,nonMaxSuppressionPaddedAsync:VC,transform:GC},Vx={bandPart:XC,gramSchmidt:ZC,qr:JC},wE={absoluteDifference:tE,computeWeightedLoss:sa,cosineDistance:rE,hingeLoss:sE,huberLoss:oE,logLoss:uE,meanSquaredError:hE,sigmoidCrossEntropy:fE,softmaxCrossEntropy:yE},ia=class extends H5{minimize(e,t=!1,n){let{value:r,grads:a}=this.computeGradients(e,n);if(n!=null){let s=n.map(i=>({name:i.name,tensor:a[i.name]}));this.applyGradients(s)}else this.applyGradients(a);return ve(a),t?r:(r.dispose(),null)}get iterations(){return this.iterations_==null&&(this.iterations_=0),this.iterations_}incrementIterations(){this.iterations_=this.iterations+1}computeGradients(e,t){return px(e,t)}dispose(){this.iterations_!=null&&ve(this.iterations_)}async saveIterations(){return this.iterations_==null&&(this.iterations_=0),{name:"iter",tensor:ge(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(ia,Symbol.hasInstance,{value:e=>e.minimize!=null&&e.computeGradients!=null&&e.applyGradients!=null});var jd=class extends ia{constructor(e,t,n=null){super();this.learningRate=e,this.rho=t,this.epsilon=n,this.accumulatedGrads=[],this.accumulatedUpdates=[],n==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedGrads[n]==null&&(this.accumulatedGrads[n]={originalName:`${t}/accum_grad`,variable:z(()=>je(r).variable(a))}),this.accumulatedUpdates[n]==null&&(this.accumulatedUpdates[n]={originalName:`${t}/accum_var`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedGrads[n].variable,o=this.accumulatedUpdates[n].variable;z(()=>{let l=se(P(i,this.rho),P(it(s),1-this.rho)),c=P(me(Jt(se(o,this.epsilon)),Jt(se(i,this.epsilon))),s),u=se(P(o,this.rho),P(it(c),1-this.rho));i.assign(l),o.assign(u);let h=se(P(c,-this.learningRate),r);r.assign(h)})}),this.incrementIterations()}dispose(){this.accumulatedUpdates!=null&&(ve(this.accumulatedGrads.map(e=>e.variable)),ve(this.accumulatedUpdates.map(e=>e.variable)))}async getWeights(){let e=[...this.accumulatedGrads,...this.accumulatedUpdates];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=e.length/2,n=!1;this.accumulatedGrads=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedUpdates=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.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)}};jd.className="Adadelta";Ea(jd);var Hd=class extends ia{constructor(e,t=.1){super();this.learningRate=e,this.initialAccumulatorValue=t,this.accumulatedGrads=[]}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulatedGrads[n]==null){let i=!1;this.accumulatedGrads[n]={originalName:`${t}/accumulator`,variable:z(()=>Gu(r.shape,this.initialAccumulatorValue).variable(i))}}let a=Array.isArray(e)?e[n].tensor:e[t];if(a==null)return;let s=this.accumulatedGrads[n].variable;z(()=>{let i=se(s,it(a));s.assign(i);let o=se(P(me(a,Jt(se(i,$.backend.epsilon()))),-this.learningRate),r);r.assign(o)})}),this.incrementIterations()}dispose(){this.accumulatedGrads!=null&&ve(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);let t=!1;this.accumulatedGrads=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,initialAccumulatorValue:this.initialAccumulatorValue}}static fromConfig(e,t){return new e(t.learningRate,t.initialAccumulatorValue)}};Hd.className="Adagrad";Ea(Hd);var Gd=class extends ia{constructor(e,t,n,r=null){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.accumulatedFirstMoment=[],this.accumulatedSecondMoment=[],z(()=>{this.accBeta1=ge(t).variable(),this.accBeta2=ge(n).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=Ae(1,this.accBeta1),r=Ae(1,this.accBeta2);t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:z(()=>je(i).variable(o))}),this.accumulatedSecondMoment[s]==null&&(this.accumulatedSecondMoment[s]={originalName:`${a}/v`,variable:z(()=>je(i).variable(o))});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedSecondMoment[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=se(P(u,this.beta2),P(it(l),1-this.beta2)),p=me(h,n),f=me(d,r);c.assign(h),u.assign(d);let m=se(P(me(p,se(Jt(f),this.epsilon)),-this.learningRate),i);i.assign(m)}),this.accBeta1.assign(P(this.accBeta1,this.beta1)),this.accBeta2.assign(P(this.accBeta2,this.beta2))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.accBeta2.dispose(),this.accumulatedFirstMoment!=null&&ve(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedSecondMoment!=null&&ve(this.accumulatedSecondMoment.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedFirstMoment,...this.accumulatedSecondMoment];return[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e),z(()=>{this.accBeta1.assign(aa(this.beta1,this.iterations_+1)),this.accBeta2.assign(aa(this.beta2,this.iterations_+1))});let t=e.length/2,n=!1;this.accumulatedFirstMoment=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedSecondMoment=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.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)}};Gd.className="Adam";Ea(Gd);var qd=class extends ia{constructor(e,t,n,r=null,a=0){super();this.learningRate=e,this.beta1=t,this.beta2=n,this.epsilon=r,this.decay=a,this.accumulatedFirstMoment=[],this.accumulatedWeightedInfNorm=[],z(()=>{this.iteration=ge(0).variable(),this.accBeta1=ge(t).variable()}),r==null&&(this.epsilon=$.backend.epsilon())}applyGradients(e){let t=Array.isArray(e)?e.map(n=>n.name):Object.keys(e);z(()=>{let n=Ae(1,this.accBeta1),r=me(-this.learningRate,se(P(this.iteration,this.decay),1));t.forEach((a,s)=>{let i=$.registeredVariables[a],o=!1;this.accumulatedFirstMoment[s]==null&&(this.accumulatedFirstMoment[s]={originalName:`${a}/m`,variable:je(i).variable(o)}),this.accumulatedWeightedInfNorm[s]==null&&(this.accumulatedWeightedInfNorm[s]={originalName:`${a}/v`,variable:je(i).variable(o)});let l=Array.isArray(e)?e[s].tensor:e[a];if(l==null)return;let c=this.accumulatedFirstMoment[s].variable,u=this.accumulatedWeightedInfNorm[s].variable,h=se(P(c,this.beta1),P(l,1-this.beta1)),d=P(u,this.beta2),p=Dt(l),f=Dr(d,p);c.assign(h),u.assign(f);let m=se(P(me(r,n),me(h,se(f,this.epsilon))),i);i.assign(m)}),this.iteration.assign(se(this.iteration,1)),this.accBeta1.assign(P(this.accBeta1,this.beta1))}),this.incrementIterations()}dispose(){this.accBeta1.dispose(),this.iteration.dispose(),this.accumulatedFirstMoment!=null&&ve(this.accumulatedFirstMoment.map(e=>e.variable)),this.accumulatedWeightedInfNorm!=null&&ve(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)}};qd.className="Adamax";Ea(qd);var rc=class extends ia{constructor(e){super();this.learningRate=e,this.setLearningRate(e)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=Array.isArray(e)?e[n].tensor:e[t];if(r==null)return;let a=$.registeredVariables[t];z(()=>{let s=se(P(this.c,r),a);a.assign(s)})}),this.incrementIterations()}setLearningRate(e){this.learningRate=e,this.c!=null&&this.c.dispose(),this.c=Ut(ge(-e))}dispose(){this.c.dispose()}async getWeights(){return[await this.saveIterations()]}async setWeights(e){if(e=await this.extractIterations(e),e.length!==0)throw new Error("SGD optimizer does not have settable weights.")}getConfig(){return{learningRate:this.learningRate}}static fromConfig(e,t){return new e(t.learningRate)}};rc.className="SGD";Ea(rc);var Xd=class extends rc{constructor(e,t,n=!1){super(e);this.learningRate=e,this.momentum=t,this.useNesterov=n,this.accumulations=[],this.m=ge(this.momentum)}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t];if(this.accumulations[n]==null){let i=!1;this.accumulations[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(i))}}let a=this.accumulations[n].variable,s=Array.isArray(e)?e[n].tensor:e[t];s!=null&&z(()=>{let i,o=se(P(this.m,a),s);this.useNesterov?i=se(P(this.c,se(s,P(o,this.m))),r):i=se(P(this.c,o),r),a.assign(o),r.assign(i)})}),this.incrementIterations()}dispose(){this.m.dispose(),this.accumulations!=null&&ve(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);let t=!1;this.accumulations=e.map(n=>({originalName:n.name,variable:n.tensor.variable(t)}))}getConfig(){return{learningRate:this.learningRate,momentum:this.momentum,useNesterov:this.useNesterov}}static fromConfig(e,t){return new e(t.learningRate,t.momentum,t.useNesterov)}};Xd.className="Momentum";Ea(Xd);var Kd=class extends ia{constructor(e,t=.9,n=0,r=null,a=!1){super();if(this.learningRate=e,this.decay=t,this.momentum=n,this.epsilon=r,this.accumulatedMeanSquares=[],this.accumulatedMoments=[],this.accumulatedMeanGrads=[],this.centered=a,r==null&&(this.epsilon=$.backend.epsilon()),e==null)throw new Error("learningRate for RMSPropOptimizer must be defined.")}applyGradients(e){(Array.isArray(e)?e.map(t=>t.name):Object.keys(e)).forEach((t,n)=>{let r=$.registeredVariables[t],a=!1;this.accumulatedMeanSquares[n]==null&&(this.accumulatedMeanSquares[n]={originalName:`${t}/rms`,variable:z(()=>je(r).variable(a))}),this.accumulatedMoments[n]==null&&(this.accumulatedMoments[n]={originalName:`${t}/momentum`,variable:z(()=>je(r).variable(a))}),this.accumulatedMeanGrads[n]==null&&this.centered&&(this.accumulatedMeanGrads[n]={originalName:`${t}/mg`,variable:z(()=>je(r).variable(a))});let s=Array.isArray(e)?e[n].tensor:e[t];if(s==null)return;let i=this.accumulatedMeanSquares[n].variable,o=this.accumulatedMoments[n].variable;z(()=>{let l=se(P(i,this.decay),P(it(s),1-this.decay));if(this.centered){let c=this.accumulatedMeanGrads[n].variable,u=se(P(c,this.decay),P(s,1-this.decay)),h=me(P(s,this.learningRate),Jt(Ae(l,se(it(u),this.epsilon)))),d=se(P(o,this.momentum),h);i.assign(l),c.assign(u),o.assign(d);let p=Ae(r,d);r.assign(p)}else{let c=se(P(i,this.decay),P(it(s),1-this.decay)),u=se(P(o,this.momentum),me(P(s,this.learningRate),Jt(se(c,this.epsilon))));i.assign(c),o.assign(u);let h=Ae(r,u);r.assign(h)}})}),this.incrementIterations()}dispose(){this.accumulatedMeanSquares!=null&&ve(this.accumulatedMeanSquares.map(e=>e.variable)),this.accumulatedMeanGrads!=null&&this.centered&&ve(this.accumulatedMeanGrads.map(e=>e.variable)),this.accumulatedMoments!=null&&ve(this.accumulatedMoments.map(e=>e.variable))}async getWeights(){let e=[...this.accumulatedMeanSquares,...this.accumulatedMoments];return this.centered&&e.push(...this.accumulatedMeanGrads),[await this.saveIterations()].concat(e.map(t=>({name:t.originalName,tensor:t.variable})))}async setWeights(e){e=await this.extractIterations(e);let t=this.centered?e.length/3:e.length/2,n=!1;this.accumulatedMeanSquares=e.slice(0,t).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.accumulatedMoments=e.slice(t,t*2).map(r=>({originalName:r.name,variable:r.tensor.variable(n)})),this.centered&&(this.accumulatedMeanGrads=e.slice(t*2,t*3).map(r=>({originalName:r.name,variable:r.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)}};Kd.className="RMSProp";Ea(Kd);var pi=class{static sgd(e){return new rc(e)}static momentum(e,t,n=!1){return new Xd(e,t,n)}static rmsprop(e,t=.9,n=0,r=null,a=!1){return new Kd(e,t,n,r,a)}static adam(e=.001,t=.9,n=.999,r=null){return new Gd(e,t,n,r)}static adadelta(e=.001,t=.95,n=null){return new jd(e,t,n)}static adamax(e=.002,t=.9,n=.999,r=null,a=0){return new qd(e,t,n,r,a)}static adagrad(e,t=.1){return new Hd(e,t)}},fi={sgd:pi.sgd,momentum:pi.momentum,adadelta:pi.adadelta,adagrad:pi.adagrad,rmsprop:pi.rmsprop,adamax:pi.adamax,adam:pi.adam},bE=(()=>typeof requestAnimationFrame!="undefined"?requestAnimationFrame:typeof setImmediate!="undefined"?setImmediate:e=>e())();function Zd(){return new Promise(e=>bE(()=>e()))}var R={};Oe(R,{ERF_A1:()=>ME,ERF_A2:()=>FE,ERF_A3:()=>$E,ERF_A4:()=>DE,ERF_A5:()=>OE,ERF_P:()=>RE,PARALLELIZE_THRESHOLD:()=>Em,SELU_SCALE:()=>jx,SELU_SCALEALPHA:()=>Ux,applyActivation:()=>Vd,assertAndGetBroadcastShape:()=>mt,assertAxesAreInnerMostDims:()=>rS,assertParamsConsistent:()=>_E,assignToTypedArray:()=>jE,axesAreInnerMostDims:()=>lm,calculateShapes:()=>F5,combineLocations:()=>mx,complexWithEvenIndex:()=>BE,complexWithOddIndex:()=>VE,computeConv2DInfo:()=>Bu,computeConv3DInfo:()=>J5,computeDefaultPad:()=>Zf,computeDilation2DInfo:()=>SI,computeOptimalWindowSize:()=>kE,computeOutAndReduceShapes:()=>Ax,computeOutShape:()=>vE,computePool2DInfo:()=>Y5,computePool3DInfo:()=>TI,convertConv2DDataFormat:()=>Z5,eitherStridesOrDilationsAreOne:()=>Fr,expandShapeToKeepDim:()=>hi,exponent:()=>GE,exponents:()=>HE,fromStringArrayToUint8:()=>KE,fromUint8ToStringArray:()=>XE,getAxesPermutation:()=>yx,getBroadcastDims:()=>xN,getComplexWithIndex:()=>UE,getFusedBiasGradient:()=>Bd,getFusedDyActivation:()=>Wd,getImageCenter:()=>IE,getInnerMostAxes:()=>aS,getPermuted:()=>SE,getReductionAxes:()=>Ot,getReshaped:()=>NE,getReshapedPermuted:()=>TE,getSliceBeginCoords:()=>CE,getSliceSize:()=>EE,getUndoAxesPermutation:()=>um,log:()=>PE,mergeRealAndImagArrays:()=>LE,prepareAndValidate:()=>M5,prepareSplitSize:()=>qE,segment_util:()=>Hx,shouldFuse:()=>Ud,slice_util:()=>ln,splitRealAndImagArrays:()=>WE,tupleValuesAreOne:()=>Ma,upcastType:()=>nr,validateInput:()=>Df,validateUpdateShape:()=>$f,warn:()=>zE});function _E(e,t){let n=e[0].length;e.forEach((a,s)=>{M(a.length===n,()=>`Error in concat${n}D: rank of tensors[${s}] must be the same as the rank of the rest (${n})`)}),M(t>=0&&t`Error in concat${n}D: axis must be between 0 and ${n-1}.`);let r=e[0];e.forEach((a,s)=>{for(let i=0;i`Error in concat${n}D: Shape of tensors[${s}] (${a}) does not match the shape of the rest (${r}) along the non-concatenated axis ${s}.`)})}function vE(e,t){let n=e[0].slice();for(let r=1;r=t*2+1||i%2==1?s.push(i):a.push(i);r.push(...a),r.push(0),r.push(...s)}return r}function TE(e,t,n,r=!0){let a=[];r?a.push(e[0]/n):a.push(e[0]*n);for(let s=1;s"Number of splits must evenly divide the axis."),r=new Array(t).fill(e.shape[n]/t);else{let a=t.reduce((i,o)=>(o===-1&&(i+=1),i),0);M(a<=1,()=>"There should be only one negative value in split array.");let s=t.indexOf(-1);if(s!==-1){let i=t.reduce((o,l)=>l>0?o+l:o);t[s]=e.shape[n]-i}M(e.shape[n]===t.reduce((i,o)=>i+o),()=>"The sum of sizes must match the size of the axis dimension."),r=t}return r}var Hx={};Oe(Hx,{collectGatherOpShapeInfo:()=>JE,computeOutShape:()=>YE,segOpComputeOptimalWindowSize:()=>ZE});function ZE(e,t){let n=!1,r;for(e<=Em?(r=e,n=!0):r=_h(e,Math.floor(Math.sqrt(e)));!n;)r>t||r===e?n=!0:r=_h(e,r+1);return r}function YE(e,t,n){let r=[],a=e.length;for(let s=0;sa))throw new Error(`Expect batchDims in the range of [-${a}, ${a}], but got ${r}`);if(r<0&&(r+=a),r>s)throw new Error(`batchDims (${r}) must be less than rank(x) ( - ${s}).`);if(nad(t))}catch(t){throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${t}`)}}function KE(e){return e.map(t=>Ru(t))}var Pr={};Oe(Pr,{nonMaxSuppressionV3Impl:()=>Dx,nonMaxSuppressionV4Impl:()=>Ox,nonMaxSuppressionV5Impl:()=>zx,whereImpl:()=>Ix});function _e(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the CPU backend.`)})}var QE=Pr.whereImpl,Yd=class extends uu{constructor(){super();this.blockSize=48,this.firstUse=!0,this.data=new wh(this,Mr())}nextDataId(){return Yd.nextDataId++}write(e,t,n){this.firstUse&&(this.firstUse=!1,J().get("IS_NODE")&&R.warn(` -============================ -Hi there \u{1F44B}. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details. -============================`));let r={id:this.nextDataId()};return this.data.set(r,{values:e,dtype:n,refCount:1}),r}makeTensorInfo(e,t,n){let r;if(t==="string"&&n!=null&&n.length>0&&v.isString(n[0])){let a=n.map(s=>v.encodeString(s));r=this.write(a,e,t)}else r=this.write(n,e,t);return{dataId:r,shape:e,dtype:t}}refCount(e){return this.data.has(e)?this.data.get(e).refCount:0}incRef(e){let t=this.data.get(e);t.refCount++}decRef(e){if(this.data.has(e)){let t=this.data.get(e);t.refCount--}}move(e,t,n,r,a){this.data.set(e,{values:t,dtype:r,refCount:a})}numDataIds(){return this.data.numDataIds()}async read(e){return this.readSync(e)}readSync(e){let{dtype:t,complexTensorInfos:n}=this.data.get(e);if(t==="complex64"){let r=this.readSync(n.real.dataId),a=this.readSync(n.imag.dataId);return R.mergeRealAndImagArrays(r,a)}return this.data.get(e).values}bufferSync(e){let t=this.readSync(e.dataId),n=t;if(e.dtype==="string")try{n=t.map(r=>v.decodeString(r))}catch(r){throw new Error("Failed to decode encoded string bytes into utf-8")}return We(e.shape,e.dtype,n)}makeOutput(e,t,n){let r=this.write(e,t,n);return Mr().makeTensorFromDataId(r,t,n,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;let{complexTensorInfos:n}=this.data.get(e);n!=null&&(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){let t=v.now();return e(),{kernelMs:v.now()-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){_e([e],"where");let t=this.readSync(e.dataId);return QE(e.shape,t)}dispose(){}floatPrecision(){return 32}epsilon(){return super.epsilon()}};Yd.nextDataId=0;var Rm={};Oe(Rm,{addImpl:()=>qx,bincountImpl:()=>Mm,bincountReduceImpl:()=>Xx,ceilImpl:()=>Kx,concatImpl:()=>Fm,expImpl:()=>Zx,expm1Impl:()=>Yx,floorImpl:()=>Jx,gatherV2Impl:()=>Qx,greaterImpl:()=>ew,lessImpl:()=>tw,linSpaceImpl:()=>nw,logImpl:()=>rw,maxImpl:()=>aw,maximumImpl:()=>sw,minimumImpl:()=>iw,multiplyImpl:()=>$m,negImpl:()=>ow,notEqualImpl:()=>lw,prodImpl:()=>uw,rangeImpl:()=>Om,rsqrtImpl:()=>cw,simpleAbsImpl:()=>Gx,sliceImpl:()=>Jd,squaredDifferenceImpl:()=>hw,stridedSliceImpl:()=>dw,subImpl:()=>pw,tileImpl:()=>fw,topKImpl:()=>mw,transposeImpl:()=>Dm,uniqueImpl:()=>Aw});function Gx(e){let t=new Float32Array(e.length);for(let n=0;n{let{x:t}=e.inputs,n=e.backend;_e(t,"abs");let r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId).values;return r=Gx(a),n.makeOutput(r,t.shape,"float32")},tR={kernelName:Yi,backendName:"cpu",kernelFunc:eR};function Et(e){return(t,n,r,a,s)=>{let i=R.assertAndGetBroadcastShape(t,n),o=i.length,l=v.computeStrides(i),c=v.sizeFromShape(i),u=v.getTypedArrayFromDType(s,c),h=t.length,d=n.length,p=v.computeStrides(t),f=v.computeStrides(n),m=R.getBroadcastDims(t,i),A=R.getBroadcastDims(n,i);if(m.length+A.length===0)for(let y=0;yw[N]=0);let b=v.locToIndex(w,h,p),_=g.slice(-d);A.forEach(N=>_[N]=0);let x=v.locToIndex(_,d,f);u[y]=e(r[b],a[x])}return[u,i]}}function Dn(e){let{inputs:t,backend:n}=e,{real:r,imag:a}=t,s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,o=n.makeTensorInfo(r.shape,"complex64"),l=n.data.get(o.dataId);return l.complexTensorInfos={real:n.makeTensorInfo(r.shape,"float32",s),imag:n.makeTensorInfo(a.shape,"float32",i)},o}var nR={kernelName:Ch,backendName:"cpu",kernelFunc:Dn};function Qd(e,t,n="float32"){if(n==="complex64"){let a=Qd(e,t,"float32"),s=Qd(e,t,"float32");return Dn({inputs:{real:a,imag:s},backend:e})}let r=v.makeZerosTypedArray(v.sizeFromShape(t),n);return e.makeTensorInfo(t,n,r)}function Lr(e){let{inputs:t,backend:n}=e,{x:r}=t;return n.incRef(r.dataId),{dataId:r.dataId,shape:r.shape,dtype:r.dtype}}var rR={kernelName:vs,backendName:"cpu",kernelFunc:Lr};function mi(e){let{inputs:t,backend:n}=e,{input:r}=t,a=n.data.get(r.dataId).complexTensorInfos.real,s=n.data.get(a.dataId).values;return n.makeTensorInfo(a.shape,a.dtype,s)}var aR={kernelName:Kh,backendName:"cpu",kernelFunc:mi};function Pa(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dtype:s}=r;if(s==="complex64"){if(a.dtype==="complex64")return Lr({inputs:{x:a},backend:n});let i=Qd(n,a.shape,a.dtype),o=Pa({inputs:{x:a},backend:n,attrs:{dtype:"float32"}}),l=Dn({inputs:{real:o,imag:i},backend:n});return n.disposeIntermediateTensorInfo(i),n.disposeIntermediateTensorInfo(o),l}if(a.dtype==="complex64"){let i=mi({inputs:{input:a},backend:n}),o=Pa({inputs:{x:i},backend:n,attrs:{dtype:s}});return n.disposeIntermediateTensorInfo(i),o}if(!v.hasEncodingLoss(a.dtype,s)){let i=Lr({inputs:{x:a},backend:n});return{dataId:i.dataId,shape:i.shape,dtype:s}}if(s==="int32"){let i=n.data.get(a.dataId).values,o=Int32Array.from(i);return n.makeTensorInfo(a.shape,"int32",o)}if(s==="bool"){let i=n.data.get(a.dataId).values,o=v.toTypedArray([0],a.dtype),[l,c]=Et((u,h)=>u!==h?1:0)(a.shape,[],i,o,"bool");return n.makeTensorInfo(c,"bool",l)}throw new Error(`Error in Cast: failed to cast ${a.dtype} to ${s}`)}var sR={kernelName:cs,backendName:"cpu",kernelFunc:Pa};function jt(e,t,n,r){return n==null?({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;_e([i,o],e);let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}:({inputs:a,backend:s})=>{let{a:i,b:o}=a,l=s;if(i.dtype==="complex64"||o.dtype==="complex64"){let c=Pa({inputs:{x:i},backend:l,attrs:{dtype:"complex64"}}),u=l.data.get(c.dataId),h=u.complexTensorInfos.real,d=u.complexTensorInfos.imag,p=l.data.get(h.dataId).values,f=l.data.get(d.dataId).values,m=Pa({inputs:{x:o},backend:l,attrs:{dtype:"complex64"}}),A=l.data.get(m.dataId),y=A.complexTensorInfos.real,g=A.complexTensorInfos.imag,w=l.data.get(y.dataId).values,b=l.data.get(g.dataId).values,[_,x,N]=n(i.shape,o.shape,p,f,w,b),T=l.makeTensorInfo(N,"float32",_),C=l.makeTensorInfo(N,"float32",x),F=Dn({inputs:{real:T,imag:C},backend:l});return l.disposeIntermediateTensorInfo(c),l.disposeIntermediateTensorInfo(m),l.disposeIntermediateTensorInfo(T),l.disposeIntermediateTensorInfo(C),F}else{let c=l.data.get(i.dataId).values,u=l.data.get(o.dataId).values,h=r||i.dtype,[d,p]=t(i.shape,o.shape,c,u,h);return l.makeTensorInfo(p,h,d)}}}function zm(e){return(t,n,r,a,s,i)=>{let o=R.assertAndGetBroadcastShape(t,n),l=v.sizeFromShape(o),c=o.length,u=v.computeStrides(o),h=v.getTypedArrayFromDType("float32",l),d=v.getTypedArrayFromDType("float32",l),p=R.getBroadcastDims(t,o),f=R.getBroadcastDims(n,o),m=R.mergeRealAndImagArrays(r,a),A=R.mergeRealAndImagArrays(s,i),y=t.length,g=v.computeStrides(t),w=n.length,b=v.computeStrides(n);if(p.length+f.length===0)for(let _=0;_N[L]=0);let T=v.locToIndex(N,y,g),C=x.slice(-w);f.forEach(L=>C[L]=0);let F=v.locToIndex(C,w,b),D=e(m[T*2],m[T*2+1],A[F*2],A[F*2+1]);h[_]=D.real,d[_]=D.imag}return[h,d,o]}}var qx=Et((e,t)=>e+t),iR=zm((e,t,n,r)=>({real:e+n,imag:t+r})),ac=jt(va,qx,iR),oR={kernelName:va,backendName:"cpu",kernelFunc:ac};function Mm(e,t,n,r,a){let s=v.sizeFromShape(r),i=v.makeZerosTypedArray(a,n);for(let o=0;o=a||(s>0?i[l]+=t[o]:i[l]+=1)}return i}function Xx(e,t,n,r=!1){let a=e.shape[0],s=e.shape[1],i=We([a,n],t.dtype);for(let o=0;o=n||(r?i.set(1,o,c):t.size>0?i.set(i.get(o,c)+t.get(o,l),o,c):i.set(i.get(o,c)+1,o,c))}return i}function wl(e){return(t,n,r)=>{let a=v.getTypedArrayFromDType(n,t.length);for(let s=0;s{let{x:i}=r;if(_e(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=v.sizeFromShape(i.shape),u=n||i.dtype,h=v.getArrayFromDType(u,c);for(let d=0;d{let{x:i}=r;if(_e(i,e),i.dtype==="string"||n==="string")throw new Error("unaryKernelFunc does not support string input/output");let o=s,l=o.data.get(i.dataId).values,c=n||i.dtype,u=t(l,c,a);return o.makeTensorInfo(i.shape,c,u)}}var Kx=wl(e=>Math.ceil(e)),lR=bl(hs,Kx),uR={kernelName:hs,backendName:"cpu",kernelFunc:lR};function Fm(e,t,n,r){let a=v.getArrayFromDType(n,v.sizeFromShape(t));if(r&&n!=="string"){let s=0;e.forEach(i=>{let o=v.sizeFromShape(i.shape);a.set(i.vals,s),s+=o})}else{let s=0;e.forEach(i=>{let o=n==="string"?R.fromUint8ToStringArray(i.vals):i.vals,l=0;for(let c=0;cMath.exp(e)),yw=bl(gs,Zx),cR={kernelName:gs,backendName:"cpu",kernelFunc:yw},Yx=wl(e=>Math.expm1(e)),hR=bl(fo,Yx),dR={kernelName:fo,backendName:"cpu",kernelFunc:hR},Jx=wl(e=>Math.floor(e)),pR=bl(xs,Jx),fR={kernelName:xs,backendName:"cpu",kernelFunc:pR};function Qx(e,t,n){let r=We(n,e.dtype);for(let a=0;ae>t?1:0),mR=jt(go,ew,null,"bool"),AR={kernelName:go,backendName:"cpu",kernelFunc:mR},tw=Et((e,t)=>eMath.log(e)),xR=bl(Is,rw),wR={kernelName:Is,backendName:"cpu",kernelFunc:xR};function aw(e,t,n,r){let a=v.getTypedArrayFromDType(r,v.sizeFromShape(n));for(let s=0;so&&(o=c)}a[s]=o}return a}var sw=Et((e,t)=>Math.max(e,t)),bR=jt(Ss,sw),_R={kernelName:Ss,backendName:"cpu",kernelFunc:bR},iw=Et((e,t)=>Math.min(e,t)),vR=jt(Rs,iw),kR={kernelName:Rs,backendName:"cpu",kernelFunc:vR},$m=Et((e,t)=>e*t),IR=zm((e,t,n,r)=>({real:e*n-t*r,imag:e*r+t*n})),Pm=jt(Ms,$m,IR),NR={kernelName:Ms,backendName:"cpu",kernelFunc:Pm};function ow(e,t,n){let r=v.createScalarValue(-1,n);return $m([],t,r,e,n)}function SR(e){let{inputs:t,backend:n}=e,{x:r}=t;_e(r,"neg");let a=n.data.get(r.dataId).values,[s,i]=ow(a,r.shape,r.dtype);return n.makeTensorInfo(i,r.dtype,s)}var TR={kernelName:So,backendName:"cpu",kernelFunc:SR},lw=Et((e,t)=>e!==t?1:0),CR=jt(To,lw,null,"bool"),ER={kernelName:To,backendName:"cpu",kernelFunc:CR};function Dm(e,t,n,r,a){let s=t.length,i=v.sizeFromShape(t),o=v.computeStrides(t),l=v.computeStrides(a),c=v.getTypedArrayFromDType(n,v.sizeFromShape(a));for(let u=0;un.disposeIntermediateTensorInfo(g)),n.makeTensorInfo(y,A,f)}var FR={kernelName:$o,backendName:"cpu",kernelFunc:MR};function Om(e,t,n,r){let a=e===t,s=e1;if(a||s||i)return v.makeZerosTypedArray(0,r);let o=Math.abs(Math.ceil((t-e)/n)),l=v.makeZerosTypedArray(o,r);t1/Math.sqrt(e)),$R=bl(Vs,cw),DR={kernelName:Vs,backendName:"cpu",kernelFunc:$R};function Jd(e,t,n,r,a){let s=ln.isSliceContinous(r,t,n),i=v.sizeFromShape(n),o=v.computeStrides(r);if(s){let h=ln.computeFlatOffset(t,o);return a==="string"?e.slice(h,h+i):e.subarray(h,h+i)}let l=a==="string"?R.fromUint8ToStringArray(e):e,c=We(r,a,l),u=We(n,a);for(let h=0;hf+t[m]);u.set(c.get(...p),...d)}return a==="string"?R.fromStringArrayToUint8(u.values):u.values}function Ai(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,size:i}=r;_e(a,"slice");let[o,l]=ln.parseSliceParams(a,s,i);ln.assertParamsValid(a,o,l);let c=n.data.get(a.dataId).values,u=Jd(c,o,l,a.shape,a.dtype);return n.makeTensorInfo(l,a.dtype,u)}var OR={kernelName:Wo,backendName:"cpu",kernelFunc:Ai},hw=Et((e,t)=>{let n=e-t;return n*n}),zR=jt(Xs,hw),PR={kernelName:Xs,backendName:"cpu",kernelFunc:zR};function dw(e,t,n,r){let a=We(e,t.dtype);for(let s=0;se-t),LR=zm((e,t,n,r)=>({real:e-n,imag:t-r})),Lm=jt(Ks,pw,LR),WR={kernelName:Ks,backendName:"cpu",kernelFunc:Lm};function fw(e,t){let n=new Array(e.rank);for(let a=0;aw.value-g.value);let m=h*r,A=l.subarray(m,m+r),y=c.subarray(m,m+r);for(let g=0;g{for(let A=0;Anew Yd,1);var xw=at(uo,e=>e>=0?e:Math.exp(e)-1),BR={kernelName:uo,backendName:"cpu",kernelFunc:xw};function ww(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{alpha:s}=r;_e([a],"leakyRelu");let i=v.sizeFromShape(a.shape),o=n.data.get(a.dataId).values,l=v.getTypedArrayFromDType("float32",i);for(let c=0;ce<0?t*e:e);function bw(e){let{inputs:t,backend:n}=e,{x:r,alpha:a}=t;_e([r,a],"prelu");let s=n.data.get(r.dataId).values,i=n.data.get(a.dataId).values,[o,l]=UR(r.shape,a.shape,s,i,r.dtype);return n.makeTensorInfo(l,r.dtype,o)}var jR={kernelName:Os,backendName:"cpu",kernelFunc:bw},_w=at(zs,e=>Math.max(0,e)),HR={kernelName:zs,backendName:"cpu",kernelFunc:_w},vw=at(Ls,e=>Math.min(Math.max(0,e),6)),GR={kernelName:Ls,backendName:"cpu",kernelFunc:vw};function Wm(e,t,n,r,a){if(n==="linear")return Lr({inputs:{x:t},backend:e});if(n==="relu")return _w({inputs:{x:t},backend:e});if(n==="elu")return xw({inputs:{x:t},backend:e});if(n==="relu6")return vw({inputs:{x:t},backend:e});if(n==="prelu")return bw({inputs:{x:t,alpha:r},backend:e});if(n==="leakyrelu")return ww({inputs:{x:t},backend:e,attrs:{alpha:a}});throw new Error(`Activation ${n} has not been implemented for the CPU backend.`)}function At(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{shape:s}=r,i=v.sizeFromShape(a.shape),o=v.inferFromImplicitShape(s,i),l=v.sizeFromShape(o);v.assert(i===l,()=>`The new shape (${o}) has ${l} elements and the old shape (${a.shape}) has ${i} elements. The new shape and old shape must have the same number of elements.`),n.incRef(a.dataId);let c=n.data.get(a.dataId);if(c.complexTensorInfos!=null){let u=c.complexTensorInfos.real,h=c.complexTensorInfos.imag;u.shape=o,h.shape=o}return{dataId:a.dataId,shape:o,dtype:a.dtype}}var qR={kernelName:Oo,backendName:"cpu",kernelFunc:At};function kw(e){let{inputs:t,backend:n,attrs:r}=e,{a,b:s}=t,{transposeA:i,transposeB:o}=r;_e([a,s],"matMul");let l=a.shape.length,c=s.shape.length,u=i?a.shape[l-2]:a.shape[l-1],h=o?s.shape[c-1]:s.shape[c-2],d=i?a.shape[l-1]:a.shape[l-2],p=o?s.shape[c-2]:s.shape[c-1],f=a.shape.slice(0,-2),m=s.shape.slice(0,-2),A=v.sizeFromShape(f),y=v.sizeFromShape(m),g=A===y||A===1||y===1;v.assert(l>=2&&c>=2&&g,()=>`Error in matMul: the input batch dimensions must either be the same or at least one input batch dimension must be 1. Got input batch dimensions of (${f}) and (${m}).`);let w=(A>y?a.shape.slice(0,-2):s.shape.slice(0,-2)).concat([d,p]);v.assert(u===h,()=>`Error in matMul: inner shapes (${u}) and (${h}) of Tensors with shapes ${a.shape} and ${s.shape} and transposeA=${i} and transposeB=${o} must match.`);let b=i?[A,u,d]:[A,d,u],_=o?[y,p,h]:[y,h,p],x=At({inputs:{x:a},backend:n,attrs:{shape:b}}),N=At({inputs:{x:s},backend:n,attrs:{shape:_}}),T=i?x.shape[1]:x.shape[2],C=i?x.shape[2]:x.shape[1],F=o?N.shape[1]:N.shape[2],D=Math.max(A,y),L=n.data.get(x.dataId).values,V=n.data.get(N.dataId).values,U=v.computeStrides(x.shape),j=v.computeStrides(N.shape),[X,G,ee]=i?[U[0],1,U[1]]:[U[0],U[1],1],[Y,ae,te]=o?[1,j[1],j[0]]:[j[1],1,j[0]],oe=C*F,Q=We([D,C,F],x.dtype),he=Q.values,le=n.blockSize;for(let fe=0;feMath.acos(e)),JR={kernelName:Ji,backendName:"cpu",kernelFunc:YR},QR=at(Qi,e=>Math.acosh(e)),eM={kernelName:Qi,backendName:"cpu",kernelFunc:QR};function tM(e){let{inputs:t,backend:n}=e,r=t;_e(t,"addN");let a=r.map(o=>n.data.get(o.dataId).values),s=We(r[0].shape,r[0].dtype),i=s.values;for(let o=0;og&&(g=_,w=b)}p[A]=w}return c.forEach(A=>n.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var lM={kernelName:os,backendName:"cpu",kernelFunc:oM};function uM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s}=r;_e(a,"argMin");let i=v.parseAxisParam(s,a.shape),o=R.getAxesPermutation(i,a.shape.length),l=a,c=[];o!=null&&(l=ir({inputs:{x:a},backend:n,attrs:{perm:o}}),c.push(l),i=R.getInnerMostAxes(i.length,l.shape.length)),i=[i[0]],R.assertAxesAreInnerMostDims("argMin",i,l.shape.length);let[u,h]=R.computeOutAndReduceShapes(l.shape,i),d=v.sizeFromShape(u),p=v.makeZerosTypedArray(d,"int32"),f=v.sizeFromShape(h),m=n.data.get(l.dataId).values;for(let A=0;An.disposeIntermediateTensorInfo(A)),n.makeTensorInfo(u,"int32",p)}var cM={kernelName:du,backendName:"cpu",kernelFunc:uM},hM=at(eo,e=>Math.asin(e)),dM={kernelName:eo,backendName:"cpu",kernelFunc:hM},pM=at(to,e=>Math.asinh(e)),fM={kernelName:to,backendName:"cpu",kernelFunc:pM},mM=at(no,e=>Math.atan(e)),AM={kernelName:no,backendName:"cpu",kernelFunc:mM},yM=Et((e,t)=>Math.atan2(e,t)),gM=jt(ao,yM),xM={kernelName:ao,backendName:"cpu",kernelFunc:gM},wM=at(ro,e=>Math.atanh(e)),bM={kernelName:ro,backendName:"cpu",kernelFunc:wM};function Bm(e,t,n,r,a,s){let i=a.strideHeight,o=a.strideWidth,l=a.dilationHeight,c=a.dilationWidth,u=a.effectiveFilterHeight,h=a.effectiveFilterWidth,d=a.padInfo.top,p=a.padInfo.left,f=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,m=We(a.outShape,n),A=m.values,y=a.outShape[1]*a.outShape[2]*a.outShape[3],g=a.outShape[2]*a.outShape[3],w=a.outShape[3];for(let b=0;bG?G=le:s==="avg"&&(ee+=le,Y++)}if(isNaN(G))break}let ae=L+V*w+N;A[ae]=s==="avg"?ee/Y:G}}}return m}function Iw(e,t,n,r,a=!1,s=!1){let i=We(r.outShape,"int32"),o=r.strideHeight,l=r.strideWidth,c=r.dilationHeight,u=r.dilationWidth,h=r.effectiveFilterHeight,d=r.effectiveFilterWidth,p=r.padInfo.top,f=r.padInfo.left,m=We(t,n,e);for(let A=0;AF&&(F=X,a?D=s?((A*r.inHeight+L)*r.inWidth+U)*r.inChannels+y:(L*r.inWidth+U)*r.inChannels+y:D=V*d+j)}}i.set(D,A,g,x,y)}}return i}function Nw(e,t,n,r,a,s){let i=a.strideDepth,o=a.strideHeight,l=a.strideWidth,c=a.dilationDepth,u=a.dilationHeight,h=a.dilationWidth,d=a.effectiveFilterDepth,p=a.effectiveFilterHeight,f=a.effectiveFilterWidth,m=a.padInfo.front,A=a.padInfo.top,y=a.padInfo.left,g=s==="max"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,w=We(a.outShape,n),b=w.values,_=a.outShape[1]*a.outShape[2]*a.outShape[3]*a.outShape[4],x=a.outShape[2]*a.outShape[3]*a.outShape[4],N=a.outShape[3]*a.outShape[4],T=a.outShape[4];for(let C=0;Cke?ke=Be:s==="avg"&&(Se+=Be,Me++),isNaN(ke))break}if(isNaN(ke))break}if(isNaN(ke))break}let De=pe+L;b[De]=s==="avg"?Se/Me:ke}}}}return w}function _M(e,t){let n=We(t.outShape,"int32"),r=t.strideDepth,a=t.strideHeight,s=t.strideWidth,i=t.dilationDepth,o=t.dilationHeight,l=t.dilationWidth,c=t.effectiveFilterDepth,u=t.effectiveFilterHeight,h=t.effectiveFilterWidth,d=t.padInfo.front,p=t.padInfo.top,f=t.padInfo.left;for(let m=0;m=V&&(V=te,U=X*u*h+ee*u+ae)}}}n.set(U,m,y,_,C,A)}}}return n}function vM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t;_e(a,"avgPool");let{filterSize:s,strides:i,pad:o,dimRoundingMode:l}=r,c=1;v.assert(R.eitherStridesOrDilationsAreOne(i,c),()=>`Error in avgPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Lr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Bm(d,a.shape,a.dtype,p,u,"avg");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var kM={kernelName:ls,backendName:"cpu",kernelFunc:vM};function IM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;_e(a,"avgPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Nw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"avg");return n.makeTensorInfo(d.shape,"float32",d.values)}var NM={kernelName:pu,backendName:"cpu",kernelFunc:IM};function SM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;_e([a,s],"avgPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=u.strideDepth,d=u.strideHeight,p=u.strideWidth,f=u.filterDepth,m=u.filterHeight,A=u.filterWidth,y=u.dilationDepth,g=u.dilationHeight,w=u.dilationWidth,b=u.effectiveFilterDepth,_=u.effectiveFilterHeight,x=u.effectiveFilterWidth,N=b-1-u.padInfo.front,T=x-1-u.padInfo.left,C=_-1-u.padInfo.top,F=We(s.shape,"float32"),D=1/(f*m*A),L=n.bufferSync(a);for(let V=0;V=u.outDepth||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(Y+he)/d;if(!(le<0||le>=u.outHeight||Math.floor(le)!==le))for(let fe=0;fe=u.outWidth||Math.floor(pe)!==pe||(te+=L.get(V,Q,le,pe,U))}}}F.set(te*D,V,j,X,G,U)}return n.makeTensorInfo(F.shape,F.dtype,F.values)}var TM={kernelName:Sh,backendName:"cpu",kernelFunc:SM};function CM(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,i=s;_e([a,s],"avgPoolGrad");let{filterSize:o,strides:l,pad:c}=r,u=R.computePool2DInfo(i.shape,o,l,1,c),h=u.strideHeight,d=u.strideWidth,p=u.filterHeight,f=u.filterWidth,m=u.dilationHeight,A=u.dilationWidth,y=u.effectiveFilterHeight,g=u.effectiveFilterWidth,w=g-1-u.padInfo.left,b=y-1-u.padInfo.top,_=We(i.shape,"float32"),x=1/(p*f),N=n.data.get(a.dataId).values,T=We(a.shape,"float32",N);for(let C=0;C=u.outHeight||Math.floor(G)!==G))for(let ee=0;ee=u.outWidth||Math.floor(Y)!==Y||(j+=T.get(C,G,Y,F))}}_.set(j*x,C,D,L,F)}return n.makeTensorInfo(_.shape,_.dtype,_.values)}var EM={kernelName:Nh,backendName:"cpu",kernelFunc:CM};function RM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,scale:s,offset:i,mean:o,variance:l}=t;v.assert(o.shape.length===l.shape.length,()=>"Batch normalization gradient requires mean and variance to have equal ranks."),v.assert(i==null||o.shape.length===i.shape.length,()=>"Batch normalization gradient requires mean and offset to have equal ranks."),v.assert(s==null||o.shape.length===s.shape.length,()=>"Batch normalization gradient requires mean and scale to have equal ranks."),_e([a,o,l,s,i],"batchNorm");let{varianceEpsilon:c}=r;c==null&&(c=.001);let u=n.data.get(a.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]),f=i?n.data.get(i.dataId).values:new Float32Array([0]),m=new Float32Array(u.length),A=f.length,y=p.length,g=d.length,w=h.length,b=0,_=0,x=0,N=0;for(let T=0;T=A&&(b=0),_>=w&&(_=0),x>=y&&(x=0),N>=g&&(N=0);return n.makeTensorInfo(a.shape,a.dtype,m)}var MM={kernelName:bs,backendName:"cpu",kernelFunc:RM};function FM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{blockShape:s,crops:i}=r;_e([a],"batchToSpaceND");let o=s.reduce((y,g)=>y*g),l=R.getReshaped(a.shape,s,o),c=R.getPermuted(l.length,s.length),u=R.getReshapedPermuted(a.shape,s,o),h=R.getSliceBeginCoords(i,s.length),d=R.getSliceSize(u,i,s.length),p=At({inputs:{x:a},backend:n,attrs:{shape:l}}),f=ir({inputs:{x:p},backend:n,attrs:{perm:c}}),m=At({inputs:{x:f},backend:n,attrs:{shape:u}}),A=Ai({inputs:{x:m},backend:n,attrs:{begin:h,size:d}});return n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var $M={kernelName:fu,backendName:"cpu",kernelFunc:FM};function DM(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,weights:s}=t,{size:i}=r,o=n.data.get(a.dataId).values,l=n.data.get(s.dataId).values,c=Mm(o,l,s.dtype,s.shape,i);return n.makeTensorInfo([i],s.dtype,c)}var OM={kernelName:Th,backendName:"cpu",kernelFunc:DM},zM=at(ka,(e,t)=>{let n=t;return e>n.clipValueMax?n.clipValueMax:e{let{x:t}=e.inputs,n=e.backend,r=new Float32Array(v.sizeFromShape(t.shape)),a=n.data.get(t.dataId),s=a.complexTensorInfos.real,i=a.complexTensorInfos.imag,o=n.data.get(s.dataId).values,l=n.data.get(i.dataId).values;for(let c=0;cm.shape),s);if(v.sizeFromShape(i)===0)return n.makeTensorInfo(i,t[0].dtype,[]);let o=t.filter(m=>v.sizeFromShape(m.shape)>0);if(o.length===1)return Lr({inputs:{x:o[0]},backend:n});let l=o.map(m=>m.shape);if(R.assertParamsConsistent(l,s),o[0].dtype==="complex64"){let m=o.map(b=>mi({inputs:{input:b},backend:n})),A=o.map(b=>_l({inputs:{input:b},backend:n})),y=vl({inputs:m,backend:n,attrs:{axis:s}}),g=vl({inputs:A,backend:n,attrs:{axis:s}}),w=Dn({inputs:{real:y,imag:g},backend:n});return m.forEach(b=>n.disposeIntermediateTensorInfo(b)),A.forEach(b=>n.disposeIntermediateTensorInfo(b)),n.disposeIntermediateTensorInfo(y),n.disposeIntermediateTensorInfo(g),w}let c=o.map(m=>{let A=v.sizeFromShape(m.shape.slice(s));return At({inputs:{x:m},backend:n,attrs:{shape:[-1,A]}})}),u=c.map(m=>({vals:n.data.get(m.dataId).values,shape:m.shape}));i=R.computeOutShape(c.map(m=>m.shape),1);let h=c[0].shape[0]===1,d=Fm(u,i,t[0].dtype,h),p=R.computeOutShape(o.map(m=>m.shape),s),f=n.makeTensorInfo(p,t[0].dtype,d);return c.forEach(m=>n.disposeIntermediateTensorInfo(m)),f}var VM={kernelName:so,backendName:"cpu",kernelFunc:vl};function Sw(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s}=t,{strides:i,pad:o,dataFormat:l,dilations:c,dimRoundingMode:u}=r;_e([a,s],"conv2d");let h=R.convertConv2DDataFormat(l),d=R.computeConv2DInfo(a.shape,s.shape,i,c,o,u,!1,h),p=d.filterHeight,f=d.filterWidth,m=d.dilationHeight,A=d.dilationWidth,y=d.padInfo.left,g=d.padInfo.top,w=d.dataFormat==="channelsLast",b=new $t(d.outShape,a.dtype),_=v.computeStrides(a.shape),x=v.computeStrides(s.shape),N=_[0],T=w?_[1]:_[2],C=w?_[2]:1,F=w?1:_[1],D=b.strides[0],L=w?b.strides[1]:b.strides[2],V=w?b.strides[2]:1,U=w?1:b.strides[1],j=n.data.get(a.dataId).values,X=n.data.get(s.dataId).values,G=b.values;for(let ee=0;ee=d.inHeight)continue;let fe=he*x[0],pe=Y+le*T;for(let ke=0;ke=d.inWidth)continue;let Qe=fe+De*x[1],et=pe+Fe*C,st=Qe;for(let Ke=0;Ke=c.inDepth)continue;let ee=X*C[0],Y=D+G*T[1];for(let ae=0;ae=c.inHeight)continue;let le=ee+Q*C[1],fe=Y+he*T[2];for(let pe=0;pe=c.inWidth)continue;let Fe=le+Me*C[2],Qe=fe+De*c.inChannels,et=Fe;for(let st=0;stMath.cos(e)),tF={kernelName:fs,backendName:"cpu",kernelFunc:eF},nF=at(io,e=>Math.cosh(e)),rF={kernelName:io,backendName:"cpu",kernelFunc:nF};function aF(e){let{inputs:t,backend:n,attrs:r}=e,{image:a,boxes:s,boxInd:i}=t,{cropSize:o,method:l,extrapolationValue:c}=r,[u,h,d,p]=a.shape,f=s.shape[0],[m,A]=o,y=We([f,m,A,p],"float32"),g=n.data.get(s.dataId).values,w=n.data.get(i.dataId).values,b=n.data.get(a.dataId).values,_=v.computeStrides(a.shape),x=v.computeStrides(y.shape);for(let N=0;N=u)continue;let U=m>1?(D-C)*(h-1)/(m-1):0,j=A>1?(L-F)*(d-1)/(A-1):0;for(let X=0;X1?C*(h-1)+X*U:.5*(C+D)*(h-1);if(G<0||G>h-1){for(let ee=0;ee1?F*(d-1)+te*j:.5*(F+L)*(d-1);if(oe<0||oe>d-1){for(let fe=0;fe1?F*(d-1)+ee*j:.5*(F+L)*(d-1);if(Y<0||Y>d-1){for(let oe=0;oey+f-g-1:(y,g)=>y+g;for(let y=0;y`Only NHWC dataFormat supported on CPU for depthToSpace. Got ${i}`),v.assert(s>1,()=>`blockSize should be > 1 for depthToSpace, but was: ${s}`);let o=a.shape[0],l=a.shape[1],c=a.shape[2],u=a.shape[3],h=l*s,d=c*s,p=u/(s*s),f=n.data.get(a.dataId).values,m=new Float32Array(o*h*d*p),A=0;for(let y=0;y`Error in depthwiseConv2d: Either strides or dilations must be 1. Got strides ${i} and dilations '${d}'`);let p=R.computeConv2DInfo(a.shape,s.shape,i,d,o,c,!0),{filterHeight:f,filterWidth:m,dilationHeight:A,dilationWidth:y,padInfo:g}=p,w=g.left,b=g.top,_=p.outChannels/p.inChannels,x=new $t(p.outShape,a.dtype),N=n.data.get(a.dataId).values,T=n.data.get(s.dataId).values,C=x.values;for(let F=0;F=p.inHeight)continue;let ee=X*h[0],Y=D+G*u[1];for(let ae=0;ae=p.inWidth)continue;let le=ee+Q*h[1],fe=Y+he*p.inChannels,pe=te,ke=le;for(let Se=0;Se{let{x:r,filter:a}=e,{strides:s,pad:i,dilations:o}=n,l=t,c=l.data.get(r.dataId).values,u=r.shape.length,h=l.data.get(a.dataId).values,d=a.shape.length,{batchSize:p,inHeight:f,inWidth:m,inChannels:A,outHeight:y,outWidth:g,padInfo:w,strideHeight:b,strideWidth:_,filterHeight:x,filterWidth:N,dilationHeight:T,dilationWidth:C,outShape:F}=R.computeDilation2DInfo(r.shape,a.shape,s,i,"NHWC",o),D=v.sizeFromShape(F),L=F.length,V=v.getArrayFromDType(r.dtype,D);for(let U=0;U=0&&Q=0&&leae&&(ae=ke)}}}let te=v.locToIndex([U,j,G,Y],L,v.computeStrides(F));V[te]=ae}}}return{dataId:l.write(v.toTypedArray(V,r.dtype),F,r.dtype),shape:F,dtype:r.dtype}}},wF={kernelName:Ph,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${Ph}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),D=v.makeZerosNestedTypedArray(a.shape,a.dtype);for(let L=0;L=0&&oe=0&&heee&&(ee=le,Y=te,ae=Q)}}}D[Y][ae][G]+=F[L][V][j][G]}}}return{dataId:c.write(v.toTypedArray(D,r.dtype),a.shape,a.dtype),shape:a.shape,dtype:a.dtype}}},bF={kernelName:zh,backendName:"cpu",kernelFunc:({inputs:e,backend:t,attrs:n})=>{let{x:r,filter:a,dy:s}=e,{strides:i,pad:o,dilations:l}=n,c=t,u=v.toNestedArray(r.shape,c.data.get(r.dataId).values),h=v.toNestedArray(a.shape,c.data.get(a.dataId).values),{batchSize:d,inHeight:p,inWidth:f,inChannels:m,outHeight:A,outWidth:y,padInfo:g,strideHeight:w,strideWidth:b,filterHeight:_,filterWidth:x,dilationHeight:N,dilationWidth:T,outShape:C}=R.computeDilation2DInfo(r.shape,a.shape,i,o,"NHWC",l);v.assert(s.rank===C.length,()=>`Error in ${zh}, dy must have the same rank as output ${C.length}, but got ${s.rank}`);let F=v.toNestedArray(C,c.data.get(s.dataId).values),D=v.makeZerosNestedTypedArray(r.shape,r.dtype);for(let L=0;L=0&&oe=0&&heee&&(ee=le,Y=oe,ae=he)}}}D[L][Y][ae][G]+=F[L][V][j][G]}}}return{dataId:c.write(v.toTypedArray(D,r.dtype),r.shape,r.dtype),shape:r.shape,dtype:r.dtype}}};function _F(e){let{inputs:t,backend:n}=e,{dy:r,y:a}=t;_e([r,a],"eluGrad");let s=new Float32Array(v.sizeFromShape(a.shape)),i=n.data.get(a.dataId).values,o=n.data.get(r.dataId).values;for(let l=0;l=1?s[l]=o[l]:s[l]=o[l]*(c+1)}return n.makeTensorInfo(a.shape,"float32",s)}var vF={kernelName:Lh,backendName:"cpu",kernelFunc:_F},kF=Et((e,t)=>e===t?1:0),Cw=jt(ho,kF,null,"bool"),IF={kernelName:ho,backendName:"cpu",kernelFunc:Cw},NF=R.ERF_P,SF=R.ERF_A1,TF=R.ERF_A2,CF=R.ERF_A3,EF=R.ERF_A4,RF=R.ERF_A5,MF=at(co,e=>{let t=Math.sign(e),n=Math.abs(e),r=1/(1+NF*n);return t*(1-((((RF*r+EF)*r+CF)*r+TF)*r+SF)*r*Math.exp(-n*n))}),FF={kernelName:co,backendName:"cpu",kernelFunc:MF};function ep(e){let{inputs:t,backend:n,attrs:r}=e,{input:a}=t,{dim:s}=r,i=a.shape.length,o=a.shape.slice(),l=s;return s<0&&(v.assert(-(i+1)<=s,()=>`Axis must be in the interval [${-(i+1)}, ${i}]`),l=i+s+1),o.splice(l,0,1),At({inputs:{x:a},backend:n,attrs:{shape:o}})}var $F={kernelName:po,backendName:"cpu",kernelFunc:ep},DF=Et((e,t)=>e/t),Vm=jt(ys,DF),Um={kernelName:ys,backendName:"cpu",kernelFunc:Vm};function Ew(e,t,n){let r=e.shape,a=r[0],s=r[1],i=n.data.get(e.dataId),o=i.complexTensorInfos.real,l=i.complexTensorInfos.imag,c=[a,s],u=v.sizeFromShape(c),h=v.getTypedArrayFromDType("float32",u),d=v.getTypedArrayFromDType("float32",u);for(let A=0;A{let{image:r}=e,a=n,s=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[i,o,l,c]=r.shape,u=a.data.get(r.dataId).values;for(let h=0;h=0&&wMath.floor(e/t)),HF=jt(ws,jF,null,"int32"),GF={kernelName:ws,backendName:"cpu",kernelFunc:HF};function qF(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Sw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=ac({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Wm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var XF={kernelName:Qs,backendName:"cpu",kernelFunc:qF};function KF(e){let{inputs:t,backend:n,attrs:r}=e,{x:a,filter:s,bias:i,preluActivationWeights:o}=t,{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d,activation:p,leakyreluAlpha:f}=r,m=Tw({inputs:{x:a,filter:s},backend:n,attrs:{strides:l,pad:c,dataFormat:u,dilations:h,dimRoundingMode:d}});if(i){let A=m;m=ac({inputs:{a:m,b:i},backend:n}),n.disposeIntermediateTensorInfo(A)}if(p){let A=m;m=Wm(n,m,p,o,f),n.disposeIntermediateTensorInfo(A)}return m}var ZF={kernelName:ei,backendName:"cpu",kernelFunc:KF};function YF(e){let{inputs:t,backend:n}=e,{params:r,indices:a}=t,s=v.sizeFromShape(r.shape),i=a.shape,o=i[i.length-1],[l,c,u,h]=R.prepareAndValidate(r,a);if(c===0)return n.makeTensorInfo(l,r.dtype,[]);let d=We([c,u],r.dtype),p=n.data.get(a.dataId).values,f=n.data.get(r.dataId).values;for(let m=0;m=s/u)throw new Error(`Invalid indices: ${A} does not index into ${r.shape}`);for(let g=0;ge>=t?1:0),n$=jt(_s,t$,null,"bool"),r$={kernelName:_s,backendName:"cpu",kernelFunc:n$};function a$(e){let{inputs:t,backend:n}=e,{input:r}=t,a=v.sizeFromShape(r.shape),s=r.shape[r.shape.length-1],i=a/s,o=At({inputs:{x:r},backend:n,attrs:{shape:[i,s]}}),l=Ew(o,!0,n),c=At({inputs:{x:l},backend:n,attrs:{shape:r.shape}});return n.disposeIntermediateTensorInfo(o),n.disposeIntermediateTensorInfo(l),c}var s$={kernelName:Bh,backendName:"cpu",kernelFunc:a$},i$=at(xo,e=>Number.isFinite(e)?1:0,"bool"),o$={kernelName:xo,backendName:"cpu",kernelFunc:i$},l$=at(wo,e=>Math.abs(e)===Infinity?1:0,"bool"),u$={kernelName:wo,backendName:"cpu",kernelFunc:l$},c$=at(bo,e=>Number.isNaN(e)?1:0,"bool"),h$={kernelName:bo,backendName:"cpu",kernelFunc:c$},d$=Et((e,t)=>e<=t?1:0),p$=jt(vo,d$,null,"bool"),f$={kernelName:vo,backendName:"cpu",kernelFunc:p$};function m$(e){let{backend:t,attrs:n}=e,{start:r,stop:a,num:s}=n,i=nw(r,a,s);return t.makeTensorInfo([i.length],"float32",i)}var A$={kernelName:Uh,backendName:"cpu",kernelFunc:m$},y$=at(ko,e=>Math.log1p(e)),g$={kernelName:ko,backendName:"cpu",kernelFunc:y$},x$=Et((e,t)=>e&&t),w$=jt(Io,x$,null,"bool"),b$={kernelName:Io,backendName:"cpu",kernelFunc:w$},_$=at(xu,e=>e?0:1,"bool"),v$={kernelName:xu,backendName:"cpu",kernelFunc:_$},k$=Et((e,t)=>e||t),I$=jt(wu,k$,null,"bool"),N$={kernelName:wu,backendName:"cpu",kernelFunc:I$};function S$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{depthRadius:s,bias:i,alpha:o,beta:l}=r;_e(a,"LRN");let c=a.shape[3],u=c-1,h=n.data.get(a.dataId).values,d=v.sizeFromShape(a.shape),p=new Float32Array(d);function f(m){let A=m%c,y=m-A+Math.max(0,A-s),g=m-A+Math.min(A+s,u),w=0;for(;y<=g;y++){let b=h[y];w+=b*b}return w}for(let m=0;m`Error in maxPool: Either strides or dilations must be 1. Got strides ${i} and dilations '${c}'`);let u=R.computePool2DInfo(a.shape,s,i,c,o,l),h;if(u.filterWidth===1&&u.filterHeight===1&&v.arraysEqual(u.inShape,u.outShape))h=Lr({inputs:{x:a},backend:n});else{let d=n.data.get(a.dataId).values,p=v.computeStrides(a.shape),f=Bm(d,a.shape,a.dtype,p,u,"max");h=n.makeTensorInfo(u.outShape,a.dtype,f.values)}return h}var F$={kernelName:Ts,backendName:"cpu",kernelFunc:M$};function $$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{filterSize:s,strides:i,pad:o,dimRoundingMode:l,dataFormat:c}=r;_e(a,"maxPool3d");let u=R.computePool3DInfo(a.shape,s,i,1,o,l,c),h=n.data.get(a.dataId).values,d=Nw(h,a.shape,a.dtype,v.computeStrides(a.shape),u,"max");return n.makeTensorInfo(d.shape,"float32",d.values)}var D$={kernelName:_u,backendName:"cpu",kernelFunc:$$};function O$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s}=t,{filterSize:i,strides:o,pad:l,dimRoundingMode:c}=r;_e([a,s],"maxPool3DGrad");let u=R.computePool3DInfo(s.shape,i,o,1,l,c),h=n.bufferSync(s),d=_M(h,u),p=u.strideDepth,f=u.strideHeight,m=u.strideWidth,A=u.dilationDepth,y=u.dilationHeight,g=u.dilationWidth,w=u.effectiveFilterDepth,b=u.effectiveFilterHeight,_=u.effectiveFilterWidth,x=w-1-u.padInfo.front,N=_-1-u.padInfo.left,T=b-1-u.padInfo.top,C=We(s.shape,"float32"),F=n.bufferSync(a);for(let D=0;D=u.outDepth||Math.floor(te)!==te))for(let oe=0;oe=u.outHeight||Math.floor(Q)!==Q))for(let he=0;he<_;he+=g){let le=(ee+he)/m;if(le<0||le>=u.outWidth||Math.floor(le)!==le)continue;let fe=w*b*_-1-d.get(D,te,Q,le,L),pe=ae*b*_+oe*_+he,ke=fe===pe?1:0;ke!==0&&(Y+=F.get(D,te,Q,le,L)*ke)}}}C.set(Y,D,V,U,j,L)}return n.makeTensorInfo(C.shape,C.dtype,C.values)}var z$={kernelName:Gh,backendName:"cpu",kernelFunc:O$};function P$(e){let{inputs:t,backend:n,attrs:r}=e,{dy:a,input:s,output:i}=t,o=s;_e([s,i],"maxPoolGrad");let{filterSize:l,strides:c,pad:u,dimRoundingMode:h}=r,d=R.computePool2DInfo(o.shape,l,c,1,u,h),p=n.data.get(o.dataId).values,f=We(d.outShape,o.dtype,Iw(p,o.shape,o.dtype,d).values),m=d.strideHeight,A=d.strideWidth,y=d.dilationHeight,g=d.dilationWidth,w=d.effectiveFilterHeight,b=d.effectiveFilterWidth,_=b-1-d.padInfo.left,x=w-1-d.padInfo.top,N=We(o.shape,"float32"),T=n.data.get(a.dataId).values,C=We(a.shape,"float32",T);for(let F=0;F=d.outHeight||Math.floor(ee)!==ee))for(let Y=0;Y=d.outWidth||Math.floor(ae)!==ae)continue;let te=w*b-1-f.get(F,ee,ae,D),oe=G*b+Y,Q=te===oe?1:0;Q!==0&&(X+=C.get(F,ee,ae,D)*Q)}}N.set(X,F,L,V,D)}return n.makeTensorInfo(N.shape,N.dtype,N.values)}var L$={kernelName:Hh,backendName:"cpu",kernelFunc:P$};function W$(e,t,n,r,a){let s=v.computeStrides(t),i=Bm(e,t,n,s,a,"max"),o=Iw(e,t,n,a,!0,r);return[i.values,o.values]}var B$={kernelName:qh,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{x:r}=e,{filterSize:a,strides:s,pad:i,includeBatchInIndex:o}=t,l=n;_e(r,"MaxPoolWithArgmax");let c=l.data.get(r.dataId).values,u=R.computePool2DInfo(r.shape,a,s,[1,1],i),[h,d]=W$(c,r.shape,r.dtype,o,u),p=l.write(h,u.outShape,r.dtype),f=l.write(d,u.outShape,r.dtype);return[{dataId:p,shape:u.outShape,dtype:r.dtype},{dataId:f,shape:u.outShape,dtype:"int32"}]}};function tp(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;_e(a,"sum");let o;a.dtype==="bool"?o=Pa({inputs:{x:a},backend:n,attrs:{dtype:"int32"}}):o=Lr({inputs:{x:a},backend:n});let l=o.shape.length,c=v.parseAxisParam(s,o.shape),u=R.getAxesPermutation(c,l),h=c,d=o;u!=null&&(d=ir({inputs:{x:o},backend:n,attrs:{perm:u}}),h=R.getInnerMostAxes(h.length,l)),R.assertAxesAreInnerMostDims("sum",h,d.shape.length);let[p,f]=R.computeOutAndReduceShapes(d.shape,h),m=R.upcastType(d.dtype,"int32"),A=Qd(n,p,m),y=v.sizeFromShape(f),g=n.data.get(A.dataId).values,w=n.data.get(d.dataId).values;for(let b=0;bn.disposeIntermediateTensorInfo(m)),f}var j$={kernelName:Cs,backendName:"cpu",kernelFunc:U$};function H$(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{axis:s,keepDims:i}=r;_e(a,"min");let o=v.parseAxisParam(s,a.shape),l=o,c=R.getAxesPermutation(l,a.shape.length),u=a;c!=null&&(u=ir({inputs:{x:a},backend:n,attrs:{perm:c}}),l=R.getInnerMostAxes(l.length,a.shape.length)),R.assertAxesAreInnerMostDims("min",l,u.shape.length);let[h,d]=R.computeOutAndReduceShapes(u.shape,l),p=v.sizeFromShape(d),f=v.makeZerosTypedArray(v.sizeFromShape(h),u.dtype),m=n.data.get(u.dataId).values;for(let y=0;yg[0]+a.shape[w]+g[1]),l=s.map(g=>g[0]),c=s.map((g,w)=>g[0]+a.shape[w]),u=i==="reflect"?0:1,h=n.data.get(a.dataId).values,d=a.shape.length,p=v.computeStrides(a.shape),f=v.sizeFromShape(o),m=o.length,A=v.computeStrides(o),y=v.getTypedArrayFromDType(a.dtype,f);for(let g=0;g=c[_]&&(w[_]=(c[_]-1)*2-w[_]+u);w=w.map((_,x)=>_-l[x]);let b=v.locToIndex(w,d,p);y[g]=h[b]}return{dataId:n.write(y,o,a.dtype),shape:o,dtype:a.dtype}}var X$={kernelName:vu,backendName:"cpu",kernelFunc:q$},K$=Et((e,t)=>{let n=e%t;return e<0&&t<0||e>=0&&t>=0?n:(n+t)%t}),Z$=jt(No,K$),Y$={kernelName:No,backendName:"cpu",kernelFunc:Z$},J$=Xi(Bg());function Mw(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{dim:s}=r,i=a.shape.length,o=s;if(o===-1&&(o=i-1),o!==i-1)throw Error(`Softmax along a non-last dimension is not yet supported. Logits was rank ${i} and dim was ${o}`);let l=v.parseAxisParam([o],a.shape),c=Rw({inputs:{x:a},backend:n,attrs:{reductionIndices:l,keepDims:!1}}),u=R.expandShapeToKeepDim(c.shape,l),h=At({inputs:{x:c},backend:n,attrs:{shape:u}}),d=Lm({inputs:{a,b:h},backend:n}),p=yw({inputs:{x:d},backend:n}),f=tp({inputs:{x:p},backend:n,attrs:{axis:l,keepDims:!1}}),m=At({inputs:{x:f},backend:n,attrs:{shape:u}}),A=Vm({inputs:{a:p,b:m},backend:n});return n.disposeIntermediateTensorInfo(c),n.disposeIntermediateTensorInfo(h),n.disposeIntermediateTensorInfo(d),n.disposeIntermediateTensorInfo(p),n.disposeIntermediateTensorInfo(f),n.disposeIntermediateTensorInfo(m),A}var Q$={kernelName:qs,backendName:"cpu",kernelFunc:Mw};function eD(e){let{inputs:t,backend:n,attrs:r}=e,{logits:a}=t,{numSamples:s,seed:i,normalized:o}=r;_e(a,"multinomial");let l=o?a:Mw({inputs:{logits:a},backend:n,attrs:{dim:-1}}),c=l.shape[0],u=l.shape[1],h=n.data.get(l.dataId).values,d=[c,s],p=v.makeZerosTypedArray(v.sizeFromShape(d),"int32");for(let f=0;f=0&&u[h]{v.assertShapesMatch(s,u.shape,"All tensors passed to stack must have matching shapes"),v.assert(i===u.dtype,()=>"All tensors passed to stack must have matching dtypes")});let o=[],l=t.map(u=>{let h=ep({inputs:{input:u},backend:n,attrs:{dim:a}});return o.push(h),h}),c=vl({inputs:l,backend:n,attrs:{axis:a}});return o.forEach(u=>n.disposeIntermediateTensorInfo(u)),c}var mD={kernelName:Fo,backendName:"cpu",kernelFunc:$w};function AD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{paddings:s,constantValue:i}=r;_e(a,"pad");let o=s.map((y,g)=>y[0]+a.shape[g]+y[1]),l=s.map(y=>y[0]),c=n.data.get(a.dataId).values,u=v.sizeFromShape(a.shape),h=a.shape.length,d=v.computeStrides(a.shape),p=v.sizeFromShape(o),f=o.length,m=v.computeStrides(o),A=v.getTypedArrayFromDType(a.dtype,p);i!==0&&A.fill(i);for(let y=0;yb+l[_]),w=v.locToIndex(g,f,m);A[w]=c[y]}return{dataId:n.write(A,o,a.dtype),shape:o,dtype:a.dtype}}var Dw={kernelName:$s,backendName:"cpu",kernelFunc:AD},yD=Et((e,t)=>Math.pow(e,t)),gD=jt(Ds,yD),xD={kernelName:Ds,backendName:"cpu",kernelFunc:gD};function wD(e){let{backend:t,attrs:n}=e,{start:r,stop:a,dtype:s,step:i}=n,o=Om(r,a,i,s);return t.makeTensorInfo([o.length],s,o)}var bD={kernelName:ku,backendName:"cpu",kernelFunc:wD},_D=at(Do,e=>1/e),vD={kernelName:Do,backendName:"cpu",kernelFunc:_D};function kD(e){let{inputs:t,backend:n,attrs:r}=e,{images:a}=t,{alignCorners:s,halfPixelCenters:i,size:o}=r;_e(a,"resizeBilinear");let l=v.computeStrides(a.shape),[c,u]=o,[h,d,p,f]=a.shape,m=n.data.get(a.dataId).values,A=new Float32Array(v.sizeFromShape([h,c,u,f])),y=[s&&c>1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=0,b=y[0]/g[0],_=y[1]/g[1];for(let x=0;x1?c-1:c,i&&p>1?u-1:u],A=[i&&d>1?d-1:d,i&&p>1?p-1:p],y=m[0]/A[0],g=m[1]/A[1],w=n.data.get(s.dataId).values,b=0;for(let _=0;_1?d-1:d,s&&u>1?p-1:p],g=[s&&c>1?c-1:c,s&&u>1?u-1:u],w=y[0]/g[0],b=y[1]/g[1],_=0;for(let x=0;x1?u-1:u,i&&f>1?h-1:h],g=[i&&p>1?p-1:p,i&&f>1?f-1:f],w=y[0]/g[0],b=y[1]/g[1],_=1/w,x=1/b,N=Math.ceil(_)*2+2,T=Math.ceil(x)*2+2;for(let C=0;C=p)continue;let Q=F+oe*l[1],he=oe*w,le=Math.min(u-1,i?Math.round(he):Math.floor(he));if(D===le)for(let fe=0;fe=f)continue;let ke=Q+pe*l[2],Se=pe*b,Me=Math.min(h-1,i?Math.round(Se):Math.floor(Se));j===Me&&(ae+=A[ke+Y])}}m[X+Y]=ae}}}}return n.makeTensorInfo(a.shape,a.dtype,m)}var RD={kernelName:Zh,backendName:"cpu",kernelFunc:ED};function MD(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{dims:s}=r;_e(a,"reverse");let i=a.shape.length,o=v.parseAxisParam(s,a.shape);if(i===0)return Lr({inputs:{x:a},backend:n});let l=new $t(a.shape,a.dtype),c=n.bufferSync(a);for(let u=0;ud[p]=a.shape[p]-1-d[p]),l.set(c.get(...d),...h)}return n.makeTensorInfo(l.shape,l.dtype,l.values)}var FD={kernelName:Ws,backendName:"cpu",kernelFunc:MD},$D={kernelName:Zo,backendName:"cpu",kernelFunc:({inputs:e,attrs:t,backend:n})=>{let{image:r}=e,{radians:a,fillValue:s,center:i}=t,o=n,l=v.getTypedArrayFromDType(r.dtype,v.sizeFromShape(r.shape)),[c,u,h,d]=r.shape,[p,f]=R.getImageCenter(i,u,h),m=255,A=Math.sin(a),y=Math.cos(a),g=o.data.get(r.dataId).values;for(let w=0;w=0&&V=0&&U{let t=Math.floor(e);return e-t<.5?Math.floor(e):e-t>.5?Math.ceil(e):t%2==0?t:t+1}),OD={kernelName:Bs,backendName:"cpu",kernelFunc:DD};function Ow(e,t,n,r,a,s,i,o,l,c){let u=[r/a,a],h=e.values,d=t.values;if(r===0)return We(n,t.dtype);let p=We(u,t.dtype);p.values.fill(l);for(let f=0;f=r/a)throw new Error(`Invalid indices: ${m} does not index into ${n}`);for(let y=0;y1||a.shape.length===1?1:v.sizeFromShape(a.shape.slice(1));for(let f=0;fe>=0?VD*e:BD*(Math.exp(e)-1)),jD={kernelName:Lo,backendName:"cpu",kernelFunc:UD},HD=at(js,e=>1/(1+Math.exp(-e))),GD={kernelName:js,backendName:"cpu",kernelFunc:HD},qD=at(Vo,e=>e<0?-1:e>0?1:0),XD={kernelName:Vo,backendName:"cpu",kernelFunc:qD},KD=at(Us,e=>Math.sin(e)),ZD={kernelName:Us,backendName:"cpu",kernelFunc:KD},YD=at(Bo,e=>Math.sinh(e)),JD={kernelName:Bo,backendName:"cpu",kernelFunc:YD},QD=11920928955078125e-23,zw=Math.log(QD)+2,eO=at(Uo,e=>{let t=e>-zw,n=e{let d=[...u];d[o]=h;let p=Ai({inputs:{x:a},backend:n,attrs:{begin:c,size:d}});return c[o]+=h,p})}var oO={kernelName:jo,backendName:"cpu",kernelFunc:iO},lO=at(Hs,e=>Math.sqrt(e)),uO={kernelName:Hs,backendName:"cpu",kernelFunc:lO},cO={kernelName:Su,backendName:"cpu",kernelFunc:({inputs:e,backend:t})=>{let{x:n}=e,r=t;_e(n,"square");let a=r.data.get(n.dataId).values,s=new Float32Array(a.length);for(let i=0;i{let n=t;return isNaN(e)?NaN:e>0?1:n.alpha}),dO={kernelName:Na,backendName:"cpu",kernelFunc:hO};function pO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{begin:s,end:i,strides:o,beginMask:l,endMask:c,ellipsisMask:u,newAxisMask:h,shrinkAxisMask:d}=r;_e(a,"stridedSlice");let{nonStrided:p,$begin:f,$strides:m,size:A,newShape:y,outShape:g}=ln.sliceInfo(a.shape,s,i,o,l,c,u,h,d),w=At({inputs:{x:a},backend:n,attrs:{shape:y}}),b;if(p){let x=Ai({inputs:{x:w},backend:n,attrs:{begin:f,size:A}});b=At({inputs:{x},backend:n,attrs:{shape:g}}),n.disposeIntermediateTensorInfo(x)}else if(g.some(x=>x===0))b=n.makeTensorInfo(g,a.dtype,[]);else{let x=n.bufferSync(w),N=dw(g,x,m,f);b=n.makeTensorInfo(N.shape,N.dtype,N.values)}let _=At({inputs:{x:b},backend:n,attrs:{shape:g}});return n.disposeIntermediateTensorInfo(w),n.disposeIntermediateTensorInfo(b),_}var fO={kernelName:Ho,backendName:"cpu",kernelFunc:pO},mO=at(Go,e=>Math.tan(e)),AO={kernelName:Go,backendName:"cpu",kernelFunc:mO},yO=at(Zs,e=>Math.tanh(e)),gO={kernelName:Zs,backendName:"cpu",kernelFunc:yO};function xO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{reps:s}=r;_e(a,"tile");let i=fw(n.bufferSync(a),s);return n.makeTensorInfo(i.shape,i.dtype,i.values)}var wO={kernelName:Ia,backendName:"cpu",kernelFunc:xO};function bO(e){let{inputs:t,backend:n,attrs:r}=e,{x:a}=t,{k:s,sorted:i}=r;_e(a,"topk");let o=n.data.get(a.dataId).values,[l,c]=mw(o,a.shape,a.dtype,s,i);return[n.makeTensorInfo(l.shape,l.dtype,l.values),n.makeTensorInfo(c.shape,c.dtype,c.values)]}var _O={kernelName:qo,backendName:"cpu",kernelFunc:bO};function IO(e){let{inputs:t,attrs:n,backend:r}=e,{image:a,transforms:s}=t,{interpolation:i,fillMode:o,fillValue:l,outputShape:c}=n,[u,h,d,p]=a.shape,[f,m]=c!=null?c:[h,d],A=[u,f,m,p],y=v.computeStrides(a.shape),g=y[0],w=y[1],b=y[2],_=v.getTypedArrayFromDType(a.dtype,v.sizeFromShape(A));_.fill(l);let x=r.data.get(a.dataId).values,N=r.data.get(s.dataId).values;for(let T=0;Tt-1)if(t<=1)n=0;else{let r=2*t;n-=r*Math.trunc(n/r),n>=t&&(n=r-n-1)}return v.clamp(0,n,t-1)}function TO(e,t){let n=e;if(n<0)if(t<=1)n=0;else{let r=t-1;n+=t*(Math.trunc(-n/r)+1)}else if(n>t-1)if(t<=1)n=0;else{let r=t-1;n-=t*Math.trunc(n/r)}return v.clamp(0,n,t-1)}function CO(e,t){return e}function EO(e,t){return v.clamp(0,e,t-1)}function sc(e,t,n,r,a,s,i,o,l,c,u){let h=i*r+o*a+l*s+c;return 0<=o&&on.disposeIntermediateTensorInfo(f)),p}var OO={kernelName:Tu,backendName:"cpu",kernelFunc:DO},zO=[ZR,tR,JR,eM,oR,nM,aM,iM,lM,cM,dM,fM,AM,xM,bM,kM,NM,TM,EM,XR,MM,$M,OM,sR,uR,PM,nR,WM,VM,HM,qM,UM,YM,QM,KM,tF,rF,sF,oF,uF,hF,dF,fF,AF,gF,xF,bF,wF,Um,BR,vF,IF,FF,cR,$F,dR,WF,VF,UF,fR,GF,XF,ZF,JF,e$,AR,r$,rR,s$,BM,o$,u$,h$,VR,gR,f$,A$,wR,g$,b$,v$,N$,T$,E$,_R,F$,D$,z$,L$,B$,R$,j$,G$,kR,X$,Y$,tD,NR,TR,aD,oD,cD,ER,dD,fD,mD,Dw,xD,jR,FR,bD,aR,vD,HR,GR,qR,ID,SD,CD,RD,FD,$D,OD,DR,PD,WD,jD,GD,XD,ZD,JD,OR,Q$,tO,rO,sO,oO,uO,cO,PR,dO,fO,WR,V$,AO,gO,wO,_O,RR,NO,MO,$O,OO,pD];for(let e of zO)ti(e);var Lw={};Oe(Lw,{assertNotComplex:()=>kl,bindCanvasToFramebuffer:()=>WO,bindColorTextureToFramebuffer:()=>ap,bindTextureToProgramUniformSampler:()=>eb,bindTextureUnit:()=>Yw,bindVertexBufferToProgramAttribute:()=>Gm,callAndCheck:()=>we,canBeRepresented:()=>Ww,createFragmentShader:()=>Uw,createFramebuffer:()=>Zw,createProgram:()=>jw,createStaticIndexBuffer:()=>qw,createStaticVertexBuffer:()=>Gw,createTexture:()=>Xw,createVertexShader:()=>Vw,getBatchDim:()=>yi,getExtensionOrThrow:()=>ic,getFramebufferErrorMessage:()=>tb,getMaxTexturesInShader:()=>ab,getNumChannels:()=>PO,getProgramUniformLocation:()=>Qw,getProgramUniformLocationOrThrow:()=>Jw,getRowsCols:()=>gi,getShapeAs3D:()=>sp,getTextureShapeFromLogicalShape:()=>nb,getWebGLDisjointQueryTimerVersion:()=>sb,getWebGLErrorMessage:()=>Bw,getWebGLMaxTextureSize:()=>rb,hasExtension:()=>qn,isCapableOfRenderingToFloatTexture:()=>ib,isDownloadFloatTextureEnabled:()=>ob,isReshapeFree:()=>lc,isWebGLFenceEnabled:()=>lb,isWebGLVersionEnabled:()=>Xm,linkProgram:()=>Hw,resetMaxTextureSize:()=>BO,resetMaxTexturesInShader:()=>VO,unbindColorTextureFromFramebuffer:()=>qm,unbindTextureUnit:()=>LO,validateFramebuffer:()=>oc,validateProgram:()=>rp,validateTextureSize:()=>Kw});var xi={},Km={alpha:!1,antialias:!1,premultipliedAlpha:!1,preserveDrawingBuffer:!1,depth:!1,stencil:!1,failIfMajorPerformanceCaveat:!0};function ip(e,t){xi[e]=t}function Wr(e){if(!(e in xi)){let n=UO(e);if(n!==null)xi[e]=n;else return console.log("Could not get context for WebGL version",e),null}let t=xi[e];return t.isContextLost()?(delete xi[e],Wr(e)):(t.disable(t.DEPTH_TEST),t.disable(t.STENCIL_TEST),t.disable(t.BLEND),t.disable(t.DITHER),t.disable(t.POLYGON_OFFSET_FILL),t.disable(t.SAMPLE_COVERAGE),t.enable(t.SCISSOR_TEST),t.enable(t.CULL_FACE),t.cullFace(t.BACK),xi[e])}function jO(e){if(typeof OffscreenCanvas!="undefined"&&e===2)return new OffscreenCanvas(300,150);if(typeof document!="undefined")return document.createElement("canvas");throw new Error("Cannot create a canvas in this context")}function UO(e){if(e!==1&&e!==2)throw new Error("Cannot get WebGL rendering context, WebGL is disabled.");let t=jO(e);return t.addEventListener("webglcontextlost",n=>{n.preventDefault(),delete xi[e]},!1),e===1?t.getContext("webgl",Km)||t.getContext("experimental-webgl",Km):t.getContext("webgl2",Km)}var uc;(function(e){e[e.DENSE=0]="DENSE",e[e.SHARED_BATCH=1]="SHARED_BATCH"})(uc||(uc={}));var Xn;(function(e){e[e.RENDER=0]="RENDER",e[e.UPLOAD=1]="UPLOAD",e[e.PIXELS=2]="PIXELS",e[e.DOWNLOAD=3]="DOWNLOAD"})(Xn||(Xn={}));var Qt;(function(e){e[e.UNPACKED_FLOAT16=0]="UNPACKED_FLOAT16",e[e.UNPACKED_FLOAT32=1]="UNPACKED_FLOAT32",e[e.PACKED_4X1_UNSIGNED_BYTE=2]="PACKED_4X1_UNSIGNED_BYTE",e[e.PACKED_2X2_FLOAT32=3]="PACKED_2X2_FLOAT32",e[e.PACKED_2X2_FLOAT16=4]="PACKED_2X2_FLOAT16"})(Qt||(Qt={}));function cc(e,t){return[t,e]}function HO(e,t){return e*t}function hc(e){let t=v.sizeFromShape(e),n=Math.ceil(t/4);return v.sizeToSquarishShape(n)}function Il(e,t){return[Math.max(1,Math.ceil(t/2)),Math.max(1,Math.ceil(e/2))]}function GO(e,t){let[n,r]=Il(e,t);return n*r*4}function Zm(e,t){let n=e,r,a,s,i,o,l,c,u,h,d;return J().getNumber("WEBGL_VERSION")===2?(r=n.R32F,a=n.R16F,s=n.RGBA16F,i=n.RGBA32F,o=n.RED,c=4,u=1,h=n.HALF_FLOAT,d=n.FLOAT):(r=e.RGBA,a=e.RGBA,s=e.RGBA,i=n.RGBA,o=e.RGBA,c=4,u=4,h=t!=null?t.HALF_FLOAT_OES:null,d=e.FLOAT),l=e.RGBA,{internalFormatFloat:r,internalFormatHalfFloat:a,internalFormatPackedHalfFloat:s,internalFormatPackedFloat:i,textureFormatFloat:o,downloadTextureFormat:l,downloadUnpackNumChannels:c,defaultNumChannels:u,textureTypeHalfFloat:h,textureTypeFloat:d}}function we(e,t){let n=t();return J().getBool("DEBUG")&&qO(e),n}function qO(e){let t=e.getError();if(t!==e.NO_ERROR)throw new Error("WebGL Error: "+Bw(e,t))}var XO=596e-10,KO=65504;function Ww(e){return!!(J().getBool("WEBGL_RENDER_FLOAT32_ENABLED")||e===0||XOe.getExtension(t),'Extension "'+t+'" not supported on this browser.')}function Vw(e,t){let n=oa(e,()=>e.createShader(e.VERTEX_SHADER),"Unable to create vertex WebGLShader.");if(we(e,()=>e.shaderSource(n,t)),we(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw console.log(e.getShaderInfoLog(n)),new Error("Failed to compile vertex shader.");return n}function Uw(e,t){let n=oa(e,()=>e.createShader(e.FRAGMENT_SHADER),"Unable to create fragment WebGLShader.");if(we(e,()=>e.shaderSource(n,t)),we(e,()=>e.compileShader(n)),e.getShaderParameter(n,e.COMPILE_STATUS)===!1)throw ZO(t,e.getShaderInfoLog(n)),new Error("Failed to compile fragment shader.");return n}var YO=/ERROR: [0-9]+:([0-9]+):/g;function ZO(e,t){let n=YO.exec(t);if(n==null){console.log(`Couldn't parse line number in error: ${t}`),console.log(e);return}let r=+n[1],a=e.split(` -`),s=a.length.toString().length+2,i=a.map((h,d)=>v.rightPad((d+1).toString(),s)+h),o=0;for(let h=0;he.createProgram(),"Unable to create WebGLProgram.")}function Hw(e,t){if(we(e,()=>e.linkProgram(t)),e.getProgramParameter(t,e.LINK_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Failed to link vertex and fragment shaders.")}function rp(e,t){if(we(e,()=>e.validateProgram(t)),e.getProgramParameter(t,e.VALIDATE_STATUS)===!1)throw console.log(e.getProgramInfoLog(t)),new Error("Shader program validation failed.")}function Gw(e,t){let n=oa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return we(e,()=>e.bindBuffer(e.ARRAY_BUFFER,n)),we(e,()=>e.bufferData(e.ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function qw(e,t){let n=oa(e,()=>e.createBuffer(),"Unable to create WebGLBuffer");return we(e,()=>e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,n)),we(e,()=>e.bufferData(e.ELEMENT_ARRAY_BUFFER,t,e.STATIC_DRAW)),n}function PO(){return J().getNumber("WEBGL_VERSION")===2?1:4}function Xw(e){return oa(e,()=>e.createTexture(),"Unable to create WebGLTexture.")}function Kw(e,t){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");if(e<=0||t<=0){let r=`[${e}x${t}]`;throw new Error("Requested texture size "+r+" is invalid.")}if(e>n||t>n){let r=`[${e}x${t}]`,a=`[${n}x${n}]`;throw new Error("Requested texture size "+r+" greater than WebGL maximum on this browser / GPU "+a+".")}}function Zw(e){return oa(e,()=>e.createFramebuffer(),"Unable to create WebGLFramebuffer.")}function Gm(e,t,n,r,a,s,i){let o=e.getAttribLocation(t,n);return o===-1?!1:(we(e,()=>e.bindBuffer(e.ARRAY_BUFFER,r)),we(e,()=>e.vertexAttribPointer(o,a,e.FLOAT,!1,s,i)),we(e,()=>e.enableVertexAttribArray(o)),!0)}function Yw(e,t,n){ub(e,n),we(e,()=>e.activeTexture(e.TEXTURE0+n)),we(e,()=>e.bindTexture(e.TEXTURE_2D,t))}function LO(e,t){ub(e,t),we(e,()=>e.activeTexture(e.TEXTURE0+t)),we(e,()=>e.bindTexture(e.TEXTURE_2D,null))}function Jw(e,t,n){return oa(e,()=>e.getUniformLocation(t,n),'uniform "'+n+'" not present in program.')}function Qw(e,t,n){return e.getUniformLocation(t,n)}function eb(e,t,n,r){we(e,()=>Yw(e,t,r)),we(e,()=>e.uniform1i(n,r))}function WO(e){we(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,null)),we(e,()=>e.viewport(0,0,e.canvas.width,e.canvas.height)),we(e,()=>e.scissor(0,0,e.canvas.width,e.canvas.height))}function ap(e,t,n){we(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,n)),we(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0))}function qm(e,t){we(e,()=>e.bindFramebuffer(e.FRAMEBUFFER,t)),we(e,()=>e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,null,0))}function oc(e){let t=e.checkFramebufferStatus(e.FRAMEBUFFER);if(t!==e.FRAMEBUFFER_COMPLETE)throw new Error("Error binding framebuffer: "+tb(e,t))}function tb(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}`}}function oa(e,t,n){let r=we(e,()=>t());if(r==null)throw new Error(n);return r}function ub(e,t){let n=e.MAX_COMBINED_TEXTURE_IMAGE_UNITS-1,r=t+e.TEXTURE0;if(rn){let a=`[gl.TEXTURE0, gl.TEXTURE${n}]`;throw new Error(`textureUnit must be in ${a}.`)}}function yi(e,t=2){return v.sizeFromShape(e.slice(0,e.length-t))}function gi(e){if(e.length===0)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 sp(e){let t=[1,1,1];return e.length===0||e.length===1&&e[0]===1||(t=[yi(e),...gi(e)]),t}function nb(e,t=!1){let n=J().getNumber("WEBGL_MAX_TEXTURE_SIZE");t&&(n=n*2,e=e.map((a,s)=>s>=e.length-2?v.nearestLargerEven(e[s]):e[s]),e.length===1&&(e=[2,e[0]])),e.length!==2&&(e=v.squeezeShape(e).newShape);let r=v.sizeFromShape(e);if(e.length<=1&&r<=n)return[1,r];if(e.length===2&&e[0]<=n&&e[1]<=n)return e;if(e.length===3&&e[0]*e[1]<=n&&e[2]<=n)return[e[0]*e[1],e[2]];if(e.length===3&&e[0]<=n&&e[1]*e[2]<=n)return[e[0],e[1]*e[2]];if(e.length===4&&e[0]*e[1]*e[2]<=n&&e[3]<=n)return[e[0]*e[1]*e[2],e[3]];if(e.length===4&&e[0]<=n&&e[1]*e[2]*e[3]<=n)return[e[0],e[1]*e[2]*e[3]];if(t){let a=yi(e),s=2,i=2;return e.length&&([s,i]=gi(e)),r=a*(s/2)*(i/2),v.sizeToSquarishShape(r).map(o=>o*2)}return v.sizeToSquarishShape(r)}function op(e){return e%2==0}function lc(e,t){if(e=e.slice(-2),t=t.slice(-2),v.arraysEqual(e,t)||!e.length||!t.length||e[0]===0||e[1]===0||t[0]===0||t[1]===0)return!0;if(e.length!==t.length){let n=e.slice(-1)[0],r=t.slice(-1)[0];if(n===r||op(n)&&op(r)&&(e[0]===1||t[0]===1))return!0}return e[1]===t[1]&&op(e[0])&&op(t[0])}var lp,up;function rb(e){if(lp==null){let t=Wr(e);lp=t.getParameter(t.MAX_TEXTURE_SIZE)}return lp}function BO(){lp=null}function VO(){up=null}function ab(e){if(up==null){let t=Wr(e);up=t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS)}return Math.min(16,up)}function sb(e){if(e===0)return 0;let t,n=Wr(e);return qn(n,"EXT_disjoint_timer_query_webgl2")&&e===2?t=2:qn(n,"EXT_disjoint_timer_query")?t=1:t=0,t}function qn(e,t){return e.getExtension(t)!=null}function Xm(e){try{if(Wr(e)!=null)return!0}catch(t){return console.log("Error when getting WebGL context: ",t),!1}return!1}function ib(e){if(e===0)return!1;let t=Wr(e);if(e===1){if(!qn(t,"OES_texture_float"))return!1}else if(!qn(t,"EXT_color_buffer_float"))return!1;return Ym(t)}function ob(e){if(e===0)return!1;let t=Wr(e);if(e===1){if(!qn(t,"OES_texture_float")||!qn(t,"WEBGL_color_buffer_float"))return!1}else{if(qn(t,"EXT_color_buffer_float"))return Ym(t);let n="EXT_color_buffer_half_float";if(qn(t,n)){let r=t.getExtension(n);return JO(t,r)}return!1}return Ym(t)}function Ym(e){let t=Zm(e),n=e.createTexture();e.bindTexture(e.TEXTURE_2D,n);let r=1,a=1;e.texImage2D(e.TEXTURE_2D,0,t.internalFormatFloat,r,a,0,t.textureFormatFloat,t.textureTypeFloat,null);let s=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,s),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);let 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(s),i}function JO(e,t){let n=Zm(e,t),r=e.createTexture();e.bindTexture(e.TEXTURE_2D,r);let a=1,s=1;e.texImage2D(e.TEXTURE_2D,0,n.internalFormatHalfFloat,a,s,0,n.textureFormatFloat,n.textureTypeHalfFloat,null);let i=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,i),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,r,0);let o=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindTexture(e.TEXTURE_2D,null),e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteTexture(r),e.deleteFramebuffer(i),o}function lb(e){return e!==2?!1:Wr(e).fenceSync!=null}function kl(e,t){Array.isArray(e)||(e=[e]),e.forEach(n=>{n!=null&&v.assert(n.dtype!=="complex64",()=>`${t} does not support complex64 tensors in the WebGL backend.`)})}var Re=J();Re.registerFlag("HAS_WEBGL",()=>Re.getNumber("WEBGL_VERSION")>0);Re.registerFlag("WEBGL_VERSION",()=>Xm(2)?2:Xm(1)?1:0);Re.registerFlag("WEBGL_CHECK_NUMERICAL_PROBLEMS",()=>!1);Re.registerFlag("WEBGL_BUFFER_SUPPORTED",()=>Re.get("WEBGL_VERSION")===2);Re.registerFlag("WEBGL_CPU_FORWARD",()=>!0);Re.registerFlag("WEBGL_FORCE_F16_TEXTURES",()=>!1);Re.registerFlag("WEBGL_PACK",()=>Re.getBool("HAS_WEBGL"));Re.registerFlag("WEBGL_PACK_NORMALIZATION",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_CLIP",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_DEPTHWISECONV",()=>!1);Re.registerFlag("WEBGL_PACK_BINARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_UNARY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_ARRAY_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_IMAGE_OPERATIONS",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_PACK_REDUCE",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_LAZILY_UNPACK",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_CONV_IM2COL",()=>Re.getBool("WEBGL_PACK"));Re.registerFlag("WEBGL_MAX_TEXTURE_SIZE",()=>rb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_MAX_TEXTURES_IN_SHADER",()=>ab(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION",()=>{let e=Re.getNumber("WEBGL_VERSION");return e===0?0:sb(e)});Re.registerFlag("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE",()=>Re.getNumber("WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION")>0&&!zu.isMobile());Re.registerFlag("WEBGL_RENDER_FLOAT32_CAPABLE",()=>ib(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_RENDER_FLOAT32_ENABLED",()=>Re.getBool("WEBGL_FORCE_F16_TEXTURES")?!1:Re.getBool("WEBGL_RENDER_FLOAT32_CAPABLE"));Re.registerFlag("WEBGL_DOWNLOAD_FLOAT_ENABLED",()=>ob(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_FENCE_API_ENABLED",()=>lb(Re.getNumber("WEBGL_VERSION")));Re.registerFlag("WEBGL_SIZE_UPLOAD_UNIFORM",()=>Re.getBool("WEBGL_RENDER_FLOAT32_ENABLED")?4:0);Re.registerFlag("WEBGL_DELETE_TEXTURE_THRESHOLD",()=>-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never delete) or at least 0, but got ${e}.`)});Re.registerFlag("WEBGL_FLUSH_THRESHOLD",()=>zu.isMobile()&&Re.getBool("IS_CHROME")?1:-1,e=>{if(e<0&&e!==-1)throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never manual flush) or at least 0, but got ${e}.`)});function hn(){let e,t,n,r,a,s,i,o,l,c;return J().getNumber("WEBGL_VERSION")===2?(e="#version 300 es",t="in",n="out",r="in",a="texture",s="outputColor",i="out vec4 outputColor;",o=` +var Human = (() => { + var __defProp = Object.defineProperty; + var __export = (target, all5) => { + for (var name in all5) + __defProp(target, name, {get: all5[name], enumerable: true}); + }; + var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); + }; + var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); + }; + var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; + }; + + // src/human.ts + var human_exports = {}; + __export(human_exports, { + Human: () => Human, + default: () => Human + }); + + // src/helpers.ts + function log(...msg) { + const dt = new Date(); + const ts = `${dt.getHours().toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")}:${dt.getSeconds().toString().padStart(2, "0")}.${dt.getMilliseconds().toString().padStart(3, "0")}`; + if (msg) + console.log(ts, "Human:", ...msg); + } + var now = () => { + if (typeof performance !== "undefined") + return performance.now(); + return parseInt((Number(process.hrtime.bigint()) / 1e3 / 1e3).toString()); + }; + function mergeDeep(...objects) { + const isObject = (obj) => obj && typeof obj === "object"; + return objects.reduce((prev, obj) => { + Object.keys(obj || {}).forEach((key) => { + const pVal = prev[key]; + const oVal = obj[key]; + if (Array.isArray(pVal) && Array.isArray(oVal)) + prev[key] = pVal.concat(...oVal); + else if (isObject(pVal) && isObject(oVal)) + prev[key] = mergeDeep(pVal, oVal); + else + prev[key] = oVal; + }); + return prev; + }, {}); + } + + // src/sysinfo.ts + function info() { + let platform; + let agent; + if (typeof navigator !== "undefined") { + const raw = navigator.userAgent.match(/\(([^()]+)\)/g); + if (raw && raw[0]) { + platform = raw[0].match(/\(([^()]+)\)/g)[0].replace(/\(|\)/g, ""); + agent = navigator.userAgent.replace(raw[0], ""); + if (platform[1]) + agent = agent.replace(raw[1], ""); + agent = agent.replace(/ /g, " "); + } + } else if (typeof process !== "undefined") { + platform = `${process.platform} ${process.arch}`; + agent = `NodeJS ${process.version}`; + } + return {platform, agent}; + } + + // dist/tfjs.esm.js + var tfjs_esm_exports = {}; + __export(tfjs_esm_exports, { + Abs: () => Abs, + Acos: () => Acos, + Acosh: () => Acosh, + AdadeltaOptimizer: () => AdadeltaOptimizer, + AdagradOptimizer: () => AdagradOptimizer, + AdamOptimizer: () => AdamOptimizer, + AdamaxOptimizer: () => AdamaxOptimizer, + Add: () => Add, + AddN: () => AddN, + All: () => All, + Any: () => Any, + ArgMax: () => ArgMax, + ArgMin: () => ArgMin, + Asin: () => Asin, + Asinh: () => Asinh, + Atan: () => Atan, + Atan2: () => Atan2, + Atanh: () => Atanh, + AvgPool: () => AvgPool, + AvgPool3D: () => AvgPool3D, + AvgPool3DGrad: () => AvgPool3DGrad, + AvgPoolGrad: () => AvgPoolGrad, + BackendWasm: () => BackendWasm, + BatchMatMul: () => BatchMatMul, + BatchToSpaceND: () => BatchToSpaceND, + Bincount: () => Bincount, + BroadcastTo: () => BroadcastTo, + Callback: () => Callback, + CallbackList: () => CallbackList, + Cast: () => Cast, + Ceil: () => Ceil, + ClipByValue: () => ClipByValue, + Complex: () => Complex, + ComplexAbs: () => ComplexAbs, + Concat: () => Concat, + Conv2D: () => Conv2D, + Conv2DBackpropFilter: () => Conv2DBackpropFilter, + Conv2DBackpropInput: () => Conv2DBackpropInput, + Conv3D: () => Conv3D, + Conv3DBackpropFilterV2: () => Conv3DBackpropFilterV2, + Conv3DBackpropInputV2: () => Conv3DBackpropInputV2, + Cos: () => Cos, + Cosh: () => Cosh, + CropAndResize: () => CropAndResize, + Cumsum: () => Cumsum, + CustomCallback: () => CustomCallback, + DataStorage: () => DataStorage, + DenseBincount: () => DenseBincount, + DepthToSpace: () => DepthToSpace, + DepthwiseConv2dNative: () => DepthwiseConv2dNative, + DepthwiseConv2dNativeBackpropFilter: () => DepthwiseConv2dNativeBackpropFilter, + DepthwiseConv2dNativeBackpropInput: () => DepthwiseConv2dNativeBackpropInput, + Diag: () => Diag, + Dilation2D: () => Dilation2D, + Dilation2DBackpropFilter: () => Dilation2DBackpropFilter, + Dilation2DBackpropInput: () => Dilation2DBackpropInput, + ENV: () => ENV, + EarlyStopping: () => EarlyStopping, + Elu: () => Elu, + EluGrad: () => EluGrad, + Environment: () => Environment, + Equal: () => Equal, + Erf: () => Erf, + Exp: () => Exp, + ExpandDims: () => ExpandDims, + Expm1: () => Expm1, + FFT: () => FFT, + Fill: () => Fill, + FlipLeftRight: () => FlipLeftRight, + Floor: () => Floor, + FloorDiv: () => FloorDiv, + FromPixels: () => FromPixels, + FusedBatchNorm: () => FusedBatchNorm, + FusedConv2D: () => FusedConv2D, + FusedDepthwiseConv2D: () => FusedDepthwiseConv2D, + GPGPUContext: () => GPGPUContext, + GatherNd: () => GatherNd, + GatherV2: () => GatherV2, + GraphModel: () => GraphModel, + Greater: () => Greater, + GreaterEqual: () => GreaterEqual, + History: () => History, + IFFT: () => IFFT, + Identity: () => Identity, + Imag: () => Imag, + InputSpec: () => InputSpec, + IsFinite: () => IsFinite, + IsInf: () => IsInf, + IsNan: () => IsNan, + KernelBackend: () => KernelBackend, + LRN: () => LRN, + LRNGrad: () => LRNGrad, + LayerVariable: () => LayerVariable, + LayersModel: () => LayersModel, + LeakyRelu: () => LeakyRelu, + Less: () => Less, + LessEqual: () => LessEqual, + LinSpace: () => LinSpace, + Log: () => Log, + Log1p: () => Log1p, + LogSoftmax: () => LogSoftmax, + LogicalAnd: () => LogicalAnd, + LogicalNot: () => LogicalNot, + LogicalOr: () => LogicalOr, + MathBackendCPU: () => MathBackendCPU, + MathBackendWebGL: () => MathBackendWebGL, + Max: () => Max, + MaxPool: () => MaxPool, + MaxPool3D: () => MaxPool3D, + MaxPool3DGrad: () => MaxPool3DGrad, + MaxPoolGrad: () => MaxPoolGrad, + MaxPoolWithArgmax: () => MaxPoolWithArgmax, + Maximum: () => Maximum, + Mean: () => Mean, + Min: () => Min, + Minimum: () => Minimum, + MirrorPad: () => MirrorPad, + Mod: () => Mod, + MomentumOptimizer: () => MomentumOptimizer, + Multinomial: () => Multinomial, + Multiply: () => Multiply, + Neg: () => Neg, + NonMaxSuppressionV3: () => NonMaxSuppressionV3, + NonMaxSuppressionV4: () => NonMaxSuppressionV4, + NonMaxSuppressionV5: () => NonMaxSuppressionV5, + NotEqual: () => NotEqual, + OP_SCOPE_SUFFIX: () => OP_SCOPE_SUFFIX, + OneHot: () => OneHot, + OnesLike: () => OnesLike, + Optimizer: () => Optimizer, + Pack: () => Pack, + PadV2: () => PadV2, + Pool: () => Pool, + Pow: () => Pow, + Prelu: () => Prelu, + Prod: () => Prod, + RMSPropOptimizer: () => RMSPropOptimizer, + RNN: () => RNN, + Range: () => Range, + Rank: () => Rank, + Real: () => Real, + RealDiv: () => RealDiv, + Reciprocal: () => Reciprocal, + Reduction: () => Reduction, + Relu: () => Relu, + Relu6: () => Relu6, + Reshape: () => Reshape, + ResizeBilinear: () => ResizeBilinear, + ResizeBilinearGrad: () => ResizeBilinearGrad, + ResizeNearestNeighbor: () => ResizeNearestNeighbor, + ResizeNearestNeighborGrad: () => ResizeNearestNeighborGrad, + Reverse: () => Reverse, + RotateWithOffset: () => RotateWithOffset, + Round: () => Round, + Rsqrt: () => Rsqrt, + SGDOptimizer: () => SGDOptimizer, + ScatterNd: () => ScatterNd, + Select: () => Select, + Selu: () => Selu, + Sequential: () => Sequential, + Sigmoid: () => Sigmoid, + Sign: () => Sign, + Sin: () => Sin, + Sinh: () => Sinh, + Slice: () => Slice, + Softmax: () => Softmax, + Softplus: () => Softplus, + SpaceToBatchND: () => SpaceToBatchND, + SparseToDense: () => SparseToDense, + SplitV: () => SplitV, + Sqrt: () => Sqrt, + Square: () => Square, + SquaredDifference: () => SquaredDifference, + Step: () => Step, + StridedSlice: () => StridedSlice, + Sub: () => Sub, + Sum: () => Sum, + SymbolicTensor: () => SymbolicTensor, + Tan: () => Tan, + Tanh: () => Tanh, + Tensor: () => Tensor, + TensorBuffer: () => TensorBuffer, + Tile: () => Tile, + TopK: () => TopK, + Transform: () => Transform, + Transpose: () => Transpose, + Unique: () => Unique, + Unpack: () => Unpack, + UnsortedSegmentSum: () => UnsortedSegmentSum, + Variable: () => Variable, + ZerosLike: () => ZerosLike, + _FusedMatMul: () => _FusedMatMul, + abs: () => abs, + acos: () => acos, + acosh: () => acosh, + add: () => add2, + addN: () => addN, + all: () => all, + any: () => any, + argMax: () => argMax, + argMin: () => argMin, + asin: () => asin, + asinh: () => asinh, + atan: () => atan, + atan2: () => atan2, + atanh: () => atanh, + avgPool: () => avgPool, + avgPool3d: () => avgPool3d, + backend: () => backend, + backend_util: () => backend_util_exports, + basicLSTMCell: () => basicLSTMCell, + batchNorm: () => batchNorm, + batchNorm2d: () => batchNorm2d, + batchNorm3d: () => batchNorm3d, + batchNorm4d: () => batchNorm4d, + batchToSpaceND: () => batchToSpaceND, + bincount: () => bincount, + booleanMaskAsync: () => booleanMaskAsync, + broadcastTo: () => broadcastTo, + browser: () => browser_exports, + buffer: () => buffer, + callbacks: () => callbacks, + cast: () => cast, + ceil: () => ceil, + clipByValue: () => clipByValue, + clone: () => clone, + complex: () => complex, + concat: () => concat, + concat1d: () => concat1d, + concat2d: () => concat2d, + concat3d: () => concat3d, + concat4d: () => concat4d, + constraints: () => exports_constraints_exports, + conv1d: () => conv1d, + conv2d: () => conv2d, + conv2dTranspose: () => conv2dTranspose, + conv3d: () => conv3d, + conv3dTranspose: () => conv3dTranspose, + copyRegisteredKernels: () => copyRegisteredKernels, + cos: () => cos, + cosh: () => cosh, + cosineWindow: () => cosineWindow, + cumsum: () => cumsum, + customGrad: () => customGrad, + data: () => dist_exports, + denseBincount: () => denseBincount, + deprecationWarn: () => deprecationWarn, + depthToSpace: () => depthToSpace, + depthwiseConv2d: () => depthwiseConv2d, + deregisterOp: () => deregisterOp, + device_util: () => device_util_exports, + diag: () => diag, + dilation2d: () => dilation2d, + disableDeprecationWarnings: () => disableDeprecationWarnings, + dispose: () => dispose, + disposeVariables: () => disposeVariables, + div: () => div, + divNoNan: () => divNoNan, + dot: () => dot, + dropout: () => dropout, + elu: () => elu, + enableDebugMode: () => enableDebugMode, + enableProdMode: () => enableProdMode, + enclosingPowerOfTwo: () => enclosingPowerOfTwo, + engine: () => engine, + env: () => env, + equal: () => equal, + erf: () => erf, + exp: () => exp, + expandDims: () => expandDims, + expm1: () => expm1, + eye: () => eye, + fft: () => fft, + fill: () => fill, + findBackend: () => findBackend, + findBackendFactory: () => findBackendFactory, + floor: () => floor, + floorDiv: () => floorDiv, + forceHalfFloat: () => forceHalfFloat, + fused: () => fused_ops_exports, + gather: () => gather, + gatherND: () => gatherND, + gather_util: () => gather_nd_util_exports, + getBackend: () => getBackend, + getGradient: () => getGradient, + getKernel: () => getKernel, + getKernelsForBackend: () => getKernelsForBackend, + gpgpu_util: () => gpgpu_util_exports, + grad: () => grad, + grads: () => grads, + greater: () => greater, + greaterEqual: () => greaterEqual, + ifft: () => ifft, + imag: () => imag, + image: () => image, + inTopKAsync: () => inTopKAsync, + initializers: () => exports_initializers_exports, + input: () => input, + io: () => io_exports, + irfft: () => irfft, + isFinite: () => isFinite2, + isInf: () => isInf, + isNaN: () => isNaN2, + keep: () => keep, + kernel_impls: () => kernel_impls_exports, + layers: () => exports_layers_exports, + leakyRelu: () => leakyRelu, + less: () => less, + lessEqual: () => lessEqual, + linalg: () => linalg, + linspace: () => linspace, + loadGraphModel: () => loadGraphModel, + loadLayersModel: () => loadLayersModel, + localResponseNormalization: () => localResponseNormalization, + log: () => log2, + log1p: () => log1p, + logSigmoid: () => logSigmoid, + logSoftmax: () => logSoftmax, + logSumExp: () => logSumExp, + logicalAnd: () => logicalAnd, + logicalNot: () => logicalNot, + logicalOr: () => logicalOr, + logicalXor: () => logicalXor, + losses: () => losses, + matMul: () => matMul, + math: () => math_exports, + max: () => max, + maxPool: () => maxPool, + maxPool3d: () => maxPool3d, + maxPoolWithArgmax: () => maxPoolWithArgmax, + maximum: () => maximum, + mean: () => mean, + memory: () => memory, + metrics: () => exports_metrics_exports, + min: () => min, + minimum: () => minimum, + mirrorPad: () => mirrorPad, + mod: () => mod, + model: () => model, + models: () => exports_models_exports, + moments: () => moments, + movingAverage: () => movingAverage, + mul: () => mul, + multiRNNCell: () => multiRNNCell, + multinomial: () => multinomial, + neg: () => neg, + nextFrame: () => nextFrame, + norm: () => norm, + notEqual: () => notEqual, + oneHot: () => oneHot, + ones: () => ones2, + onesLike: () => onesLike, + op: () => op, + outerProduct: () => outerProduct, + pad: () => pad, + pad1d: () => pad1d, + pad2d: () => pad2d, + pad3d: () => pad3d, + pad4d: () => pad4d, + pool: () => pool, + pow: () => pow, + prelu: () => prelu, + print: () => print2, + prod: () => prod, + profile: () => profile, + rand: () => rand, + randomGamma: () => randomGamma, + randomNormal: () => randomNormal, + randomUniform: () => randomUniform, + range: () => range, + ready: () => ready, + real: () => real, + reciprocal: () => reciprocal, + registerBackend: () => registerBackend, + registerCallbackConstructor: () => registerCallbackConstructor, + registerGradient: () => registerGradient, + registerKernel: () => registerKernel, + registerOp: () => registerOp, + regularizers: () => exports_regularizers_exports, + relu: () => relu, + relu6: () => relu6, + removeBackend: () => removeBackend, + reshape: () => reshape, + reverse: () => reverse, + reverse1d: () => reverse1d, + reverse2d: () => reverse2d, + reverse3d: () => reverse3d, + reverse4d: () => reverse4d, + rfft: () => rfft, + round: () => round2, + rsqrt: () => rsqrt, + scalar: () => scalar, + scatterND: () => scatterND, + scatter_util: () => scatter_nd_util_exports, + selu: () => selu, + separableConv2d: () => separableConv2d, + sequential: () => sequential, + serialization: () => serialization_exports, + setBackend: () => setBackend, + setPlatform: () => setPlatform, + setWasmPath: () => setWasmPath, + setWasmPaths: () => setWasmPaths, + setWebGLContext: () => setWebGLContext, + setdiff1dAsync: () => setdiff1dAsync, + shared: () => shared_exports, + sigmoid: () => sigmoid, + sign: () => sign, + signal: () => signal, + sin: () => sin, + sinh: () => sinh, + slice: () => slice, + slice1d: () => slice1d, + slice2d: () => slice2d, + slice3d: () => slice3d, + slice4d: () => slice4d, + slice_util: () => slice_util_exports, + softmax: () => softmax, + softplus: () => softplus, + spaceToBatchND: () => spaceToBatchND, + sparseToDense: () => sparseToDense, + spectral: () => spectral, + split: () => split, + sqrt: () => sqrt, + square: () => square, + squaredDifference: () => squaredDifference, + squeeze: () => squeeze, + stack: () => stack, + step: () => step, + stridedSlice: () => stridedSlice, + sub: () => sub, + sum: () => sum2, + sumOutType: () => sumOutType, + tan: () => tan, + tanh: () => tanh2, + tensor: () => tensor, + tensor1d: () => tensor1d, + tensor2d: () => tensor2d, + tensor3d: () => tensor3d, + tensor4d: () => tensor4d, + tensor5d: () => tensor5d, + tensor6d: () => tensor6d, + tensor_util: () => tensor_util_exports, + test_util: () => test_util_exports, + tidy: () => tidy, + tile: () => tile, + time: () => time, + topk: () => topk, + train: () => train, + transpose: () => transpose, + truncatedNormal: () => truncatedNormal, + unique: () => unique, + unregisterGradient: () => unregisterGradient, + unregisterKernel: () => unregisterKernel, + unsortedSegmentSum: () => unsortedSegmentSum, + unstack: () => unstack, + upcastType: () => upcastType, + util: () => util_exports, + valueAndGrad: () => valueAndGrad, + valueAndGrads: () => valueAndGrads, + variable: () => variable, + variableGrads: () => variableGrads, + version: () => version13, + version_converter: () => version11, + version_core: () => version6, + version_cpu: () => version7, + version_layers: () => version10, + version_wasm: () => version9, + version_webgl: () => version8, + webgl: () => webgl, + webgl_util: () => webgl_util_exports, + where: () => where, + whereAsync: () => whereAsync, + zeros: () => zeros, + zerosLike: () => zerosLike + }); + var __create = Object.create; + var __defProp2 = Object.defineProperty; + var __getProtoOf = Object.getPrototypeOf; + var __hasOwnProp = Object.prototype.hasOwnProperty; + var __getOwnPropNames = Object.getOwnPropertyNames; + var __getOwnPropDesc = Object.getOwnPropertyDescriptor; + var __markAsModule = (target) => __defProp2(target, "__esModule", {value: true}); + var __commonJS = (cb, mod42) => () => (mod42 || cb((mod42 = {exports: {}}).exports, mod42), mod42.exports); + var __export2 = (target, all42) => { + for (var name in all42) + __defProp2(target, name, {get: all42[name], enumerable: true}); + }; + var __exportStar = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp2(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable}); + } + return target; + }; + var __toModule = (module) => { + return __exportStar(__markAsModule(__defProp2(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); + }; + var require_browser = __commonJS(() => { + }); + var require_alea = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = data2.toString(); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor128 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorwow = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorshift7 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor4096 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_tychei = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_crypto = __commonJS(() => { + }); + var require_seedrandom = __commonJS((exports, module) => { + (function(pool3, math) { + var global2 = this, width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + math["seed" + rngname] = seedrandom5; + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } + })([], Math); + }); + var require_seedrandom2 = __commonJS((exports, module) => { + var alea5 = require_alea(); + var xor128 = require_xor128(); + var xorwow = require_xorwow(); + var xorshift7 = require_xorshift7(); + var xor4096 = require_xor4096(); + var tychei = require_tychei(); + var sr = require_seedrandom(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; + }); + var require_path = __commonJS(() => { + }); + var require_worker_threads = __commonJS(() => { + }); + var require_perf_hooks = __commonJS(() => { + }); + var require_tfjs_backend_wasm_threaded_simd = __commonJS((exports, module) => { + var WasmBackendModuleThreadedSimd = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModuleThreadedSimd2) { + WasmBackendModuleThreadedSimd2 = WasmBackendModuleThreadedSimd2 || {}; + function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; + } + function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; + } + function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; + } + function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; + } + function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer2) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; + } + var Module = typeof WasmBackendModuleThreadedSimd2 !== "undefined" ? WasmBackendModuleThreadedSimd2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; + if (ENVIRONMENT_IS_PTHREAD) { + buffer2 = Module["buffer"]; + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + var nodeWorkerThreads; + try { + nodeWorkerThreads = require_worker_threads(); + } catch (e) { + console.error('The "worker_threads" module is not supported in this node.js build - perhaps a newer version is needed?'); + throw e; + } + global.Worker = nodeWorkerThreads.Worker; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (typeof _scriptDir !== "undefined" && _scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + if (ENVIRONMENT_IS_NODE) { + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + } else { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + if (ENVIRONMENT_IS_NODE) { + if (typeof performance === "undefined") { + global.performance = require_perf_hooks().performance; + } + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var Atomics_load = Atomics.load; + var Atomics_store = Atomics.store; + var Atomics_compareExchange = Atomics.compareExchange; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var wasmModule; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function writeArrayToMemory(array2, buffer3) { + GROWABLE_HEAP_I8().set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer2 = Module["buffer"]; + } else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + wasmMemory = new WebAssembly.Memory({initial: INITIAL_MEMORY / 65536, maximum: 2147483648 / 65536, shared: true}); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } + } + if (wasmMemory) { + buffer2 = wasmMemory.buffer; + } + INITIAL_MEMORY = buffer2.byteLength; + updateGlobalBufferAndViews(buffer2); + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATEXIT__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + var runtimeExited = false; + if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + if (ENVIRONMENT_IS_PTHREAD) + runtimeInitialized = true; + function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + callRuntimeCallbacks(__ATMAIN__); + } + function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; + } + function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + assert3(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm-threaded-simd.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmTable = Module["asm"]["F"]; + wasmModule = module2; + if (!ENVIRONMENT_IS_PTHREAD) { + var numWorkersToLoad = PThread.unusedWorkers.length; + PThread.unusedWorkers.forEach(function(w) { + PThread.loadWasmModuleToWorker(w, function() { + if (!--numWorkersToLoad) + removeRunDependency("wasm-instantiate"); + }); + }); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + var ASM_CONSTS = {8991: function($0, $1) { + setTimeout(function() { + __emscripten_do_dispatch_to_thread($0, $1); + }, 0); + }}; + function initPthreadsJS() { + PThread.initRuntime(); + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _emscripten_futex_wake(addr, count2) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true || count2 < 0) + return -28; + if (count2 == 0) + return 0; + if (count2 >= 2147483647) + count2 = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count2; + mainThreadWoken = 1; + if (count2 <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count2); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; + } + Module["_emscripten_futex_wake"] = _emscripten_futex_wake; + function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = void 0; + } + function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({cmd: "cancel"}); + } + function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + GROWABLE_HEAP_I32()[pthread_ptr + 12 >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + var worker = pthread.worker; + PThread.returnWorkerToPool(worker); + } + } + var PThread = {unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function() { + var pthreadPoolSize = 8; + for (var i = 0; i < pthreadPoolSize; ++i) { + PThread.allocateUnusedWorker(); + } + }, initRuntime: function() { + var tb = _malloc(228); + for (var i = 0; i < 228 / 4; ++i) + GROWABLE_HEAP_U32()[tb / 4 + i] = 0; + GROWABLE_HEAP_I32()[tb + 12 >> 2] = tb; + var headPtr = tb + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), tb + 100 >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tb + 40 >> 2, tb); + __emscripten_thread_init(tb, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(tb); + }, initWorker: function() { + }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function() { + }, runExitHandlers: function() { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && _pthread_self()) + ___pthread_tsd_run_dtors(); + }, threadExit: function(exitCode) { + var tb = _pthread_self(); + if (tb) { + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 56 >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 60 >> 2, 0); + PThread.runExitHandlers(); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exit"}); + } + } + }, threadCancel: function() { + PThread.runExitHandlers(); + var tb = _pthread_self(); + Atomics.store(GROWABLE_HEAP_U32(), tb + 4 >> 2, -1); + Atomics.store(GROWABLE_HEAP_U32(), tb + 0 >> 2, 1); + _emscripten_futex_wake(tb + 0, 2147483647); + __emscripten_thread_init(0, 0, 0); + postMessage({cmd: "cancelDone"}); + }, terminateAllThreads: function() { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker = PThread.unusedWorkers[i]; + worker.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker = PThread.runningWorkers[i]; + var pthread = worker.pthread; + PThread.freeThreadData(pthread); + worker.terminate(); + } + PThread.runningWorkers = []; + }, freeThreadData: function(pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2]; + GROWABLE_HEAP_I32()[pthread.threadInfoStruct + 100 >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, returnWorkerToPool: function(worker) { + PThread.runWithoutMainThreadQueuedCalls(function() { + delete PThread.pthreads[worker.pthread.threadInfoStruct]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + PThread.freeThreadData(worker.pthread); + worker.pthread = void 0; + }); + }, runWithoutMainThreadQueuedCalls: function(func2) { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 0; + try { + func2(); + } finally { + GROWABLE_HEAP_I32()[__emscripten_allow_main_runtime_queued_calls >> 2] = 1; + } + }, receiveObjectTransfer: function(data2) { + }, loadWasmModuleToWorker: function(worker, onFinishedLoading) { + worker.onmessage = function(e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker.pthread) + PThread.currentProxiedOperationCallerThread = worker.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } else { + console.error('Internal error! Worker sent a message "' + cmd + '" to target pthread ' + d["targetThread"] + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = void 0; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } else if (cmd === "spawnThread") { + spawnThread(e.data); + } else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } else if (cmd === "killThread") { + killThread(d["thread"]); + } else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } else if (cmd === "loaded") { + worker.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker); + if (worker.runPthread) { + worker.runPthread(); + delete worker.runPthread; + } + } else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } else if (cmd === "exit") { + var detached = worker.pthread && Atomics.load(GROWABLE_HEAP_U32(), worker.pthread.threadInfoStruct + 64 >> 2); + if (detached) { + PThread.returnWorkerToPool(worker); + } + } else if (cmd === "exitProcess") { + try { + exit(d["returnCode"]); + } catch (e2) { + if (e2 instanceof ExitStatus) + return; + throw e2; + } + } else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker); + } else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } else if (e.data.target === "setimmediate") { + worker.postMessage(e.data); + } else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = void 0; + }; + worker.onerror = function(e) { + err("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message); + }; + if (ENVIRONMENT_IS_NODE) { + worker.on("message", function(data2) { + worker.onmessage({data: data2}); + }); + worker.on("error", function(data2) { + worker.onerror(data2); + }); + worker.on("exit", function(data2) { + }); + } + worker.postMessage({cmd: "load", urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, wasmMemory, wasmModule}); + }, allocateUnusedWorker: function() { + var pthreadMainJs = locateFile("tfjs-backend-wasm-threaded-simd.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, getNewWorker: function() { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, busySpinWait: function(msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { + } + }}; + function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); + } + Module["establishStackSpace"] = establishStackSpace; + function getNoExitRuntime() { + return noExitRuntime; + } + Module["getNoExitRuntime"] = getNoExitRuntime; + function invokeEntryPoint(ptr, arg) { + return wasmTable.get(ptr)(arg); + } + Module["invokeEntryPoint"] = invokeEntryPoint; + function ___assert_fail(condition, filename, line, func2) { + abort("Assertion failed: " + UTF8ToString(condition) + ", at: " + [filename ? UTF8ToString(filename) : "unknown filename", line, func2 ? UTF8ToString(func2) : "unknown function"]); + } + function ___call_main(argc, argv) { + var returnCode = _main(argc, argv); + } + var _emscripten_get_now; + if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process["hrtime"](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function() { + return performance.now() - Module["__performance_now_clock_drift"]; + }; + } else if (typeof dateNow !== "undefined") { + _emscripten_get_now = dateNow; + } else + _emscripten_get_now = function() { + return performance.now(); + }; + function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; + } + function _atexit(func2, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func2, arg); + } + function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({cmd: "processQueuedMainThreadWork"}); + } else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({targetThread: targetThreadId, cmd: "processThreadQueue"}); + } else { + var pthread = PThread.pthreads[targetThreadId]; + var worker = pthread && pthread.worker; + if (!worker) { + return; + } + worker.postMessage({cmd: "processThreadQueue"}); + } + return 1; + } + function _abort() { + abort(); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + } + function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & true) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), __emscripten_main_thread_futex >> 2, addr); + } + return 0; + } + } + function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); + } + function _emscripten_num_logical_cores() { + if (ENVIRONMENT_IS_NODE) + return require("os").cpus().length; + return navigator["hardwareConcurrency"]; + } + function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack2 = stackSave(); + var serializedNumCallArgs = numCallArgs; + var args = stackAlloc(serializedNumCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + var arg = arguments[2 + i]; + GROWABLE_HEAP_F64()[b + i] = arg; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, serializedNumCallArgs, args, sync); + stackRestore(stack2); + return ret; + } + var _emscripten_receive_on_main_thread_js_callArgs = []; + var readAsmConstArgsArray = []; + function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while (ch = GROWABLE_HEAP_U8()[sigPtr++]) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; + } + function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func2 = !isEmAsmConst ? proxiedFunctionTable[index] : ASM_CONSTS[-index - 1]; + return func2.apply(null, _emscripten_receive_on_main_thread_js_callArgs); + } + function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var JSEvents = {inEventHandler: 0, removeAllEventListeners: function() { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, registerRemoveEventListeners: function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, deferredCalls: [], deferCall: function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i2 in arrA) { + if (arrA[i2] != arrB[i2]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({targetFunction, precedence, argsList}); + JSEvents.deferredCalls.sort(function(x, y) { + return x.precedence < y.precedence; + }); + }, removeDeferredCalls: function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, canPerformEventHandlerRequests: function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, runDeferredCalls: function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, eventHandlers: [], removeAllHandlersOnTarget: function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, _removeHandler: function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, registerOrRemoveHandler: function(eventHandler) { + var jsEventHandler = function jsEventHandler2(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, queueEventHandlerOnThread_iiii: function(targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = eventData; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, getTargetThreadForEventCallback: function(targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, getNodeNameForTarget: function(target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, fullscreenEnabled: function() { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + }}; + function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; + } + function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[varargs + 4 >> 2] = width; + GROWABLE_HEAP_I32()[varargs + 8 >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); + } + function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); + } + function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; + } + var specialHTMLTargets = [0, typeof document !== "undefined" ? document : 0, typeof window !== "undefined" ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document !== "undefined" ? document.querySelector(target) : void 0); + return domElement; + } + function findCanvasEventTarget(target) { + return findEventTarget(target); + } + function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) + return -4; + if (canvas2.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 4 >> 2] = height; + } + if (canvas2.offscreenCanvas || !canvas2.controlTransferredOffscreen) { + if (canvas2.offscreenCanvas) + canvas2 = canvas2.offscreenCanvas; + var autoResizeViewport = false; + if (canvas2.GLctxObject && canvas2.GLctxObject.GLctx) { + var prevViewport = canvas2.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = prevViewport[0] === 0 && prevViewport[1] === 0 && prevViewport[2] === canvas2.width && prevViewport[3] === canvas2.height; + } + canvas2.width = width; + canvas2.height = height; + if (autoResizeViewport) { + canvas2.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } else if (canvas2.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[canvas2.canvasSharedPtr + 8 >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } else { + return -4; + } + return 0; + } + function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas2 = findCanvasEventTarget(target); + if (canvas2) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } + } + function _emscripten_set_current_thread_status(newStatus) { + } + function _emscripten_set_thread_name(threadId, name) { + } + function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function(index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function(mode, first, count2, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count2, primcount); + }; + ctx["drawElementsInstanced"] = function(mode, count2, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count2, type, indices, primcount); + }; + return 1; + } + } + function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function() { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function(vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function(vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function(vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } + } + function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function(n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } + } + function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); + } + var GL = {counter: 1, buffers: [], programs: [], framebuffers: [], renderbuffers: [], textures: [], uniforms: [], shaders: [], vaos: [], contexts: {}, offscreenCanvases: {}, timerQueriesEXT: [], programInfos: {}, stringCache: {}, unpackAlignment: 4, recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, getNewId: function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, getSource: function(shader, count2, string, length) { + var source = ""; + for (var i = 0; i < count2; ++i) { + var len = length ? GROWABLE_HEAP_I32()[length + i * 4 >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[string + i * 4 >> 2], len < 0 ? void 0 : len); + } + return source; + }, createContext: function(canvas2, webGLContextAttributes) { + var ctx = canvas2.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, registerContext: function(ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[handle + 4 >> 2] = _pthread_self(); + var context = {handle, attributes: webGLContextAttributes, version: webGLContextAttributes.majorVersion, GLctx: ctx}; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, makeContextCurrent: function(contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, getContext: function(contextHandle) { + return GL.contexts[contextHandle]; + }, deleteContext: function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = void 0; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, initExtensions: function(context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx2 = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx2); + __webgl_enable_OES_vertex_array_object(GLctx2); + __webgl_enable_WEBGL_draw_buffers(GLctx2); + GLctx2.disjointTimerQueryExt = GLctx2.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx2); + var exts = GLctx2.getSupportedExtensions() || []; + exts.forEach(function(ext) { + if (ext.indexOf("lose_context") < 0 && ext.indexOf("debug") < 0) { + GLctx2.getExtension(ext); + } + }); + }, populateUniformTable: function(program) { + var p2 = GL.programs[program]; + var ptable = GL.programInfos[program] = {uniforms: {}, maxUniformLength: 0, maxAttributeLength: -1, maxUniformBlockNameLength: -1}; + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p2, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p2, i); + var name = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); + if (name.slice(-1) == "]") { + name = name.slice(0, name.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p2, name); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name + "[" + j + "]"; + loc = GLctx.getUniformLocation(p2, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + }}; + var __emscripten_webgl_power_preferences = ["default", "low-power", "high-performance"]; + function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = {alpha: !!GROWABLE_HEAP_I32()[a + (0 >> 2)], depth: !!GROWABLE_HEAP_I32()[a + (4 >> 2)], stencil: !!GROWABLE_HEAP_I32()[a + (8 >> 2)], antialias: !!GROWABLE_HEAP_I32()[a + (12 >> 2)], premultipliedAlpha: !!GROWABLE_HEAP_I32()[a + (16 >> 2)], preserveDrawingBuffer: !!GROWABLE_HEAP_I32()[a + (20 >> 2)], powerPreference: __emscripten_webgl_power_preferences[powerPreference], failIfMajorPerformanceCaveat: !!GROWABLE_HEAP_I32()[a + (28 >> 2)], majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)]}; + var canvas2 = findCanvasEventTarget(target); + if (!canvas2) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas2, contextAttributes); + return contextHandle; + } + function _emscripten_webgl_create_context(a0, a12) { + return _emscripten_webgl_do_create_context(a0, a12); + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd); + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, offset_low, offset_high, whence, newOffset); + } + function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, fd, iov, iovcnt, pnum); + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[iov + i * 8 >> 2]; + var len = GROWABLE_HEAP_I32()[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, GROWABLE_HEAP_U8()[ptr + j]); + } + num += len; + } + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + function _pthread_cleanup_pop(execute2) { + var routine = PThread.threadExitHandlers.pop(); + if (execute2) + routine(); + } + function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function() { + wasmTable.get(routine)(arg); + }); + } + function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker = PThread.getNewWorker(); + if (worker.pthread !== void 0) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[tlsMemory + i * 4 >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = PThread.pthreads[threadParams.pthread_ptr] = {worker, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize, allocatedOwnStack: threadParams.allocatedOwnStack, threadInfoStruct: threadParams.pthread_ptr}; + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (64 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (100 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (76 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 8 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 + 12 >> 2), threadParams.detached); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (172 >> 2), global_locale); + worker.pthread = pthread; + var msg = {cmd: "run", start_routine: threadParams.startRoutine, arg: threadParams.arg, threadInfoStruct: threadParams.pthread_ptr, stackBase: threadParams.stackBase, stackSize: threadParams.stackSize}; + worker.runPthread = function() { + msg.time = performance.now(); + worker.postMessage(msg, threadParams.transferList); + }; + if (worker.loaded) { + worker.runPthread(); + delete worker.runPthread; + } + } + function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + if (attr && attr != -1) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[attr + 8 >> 2]; + detached = GROWABLE_HEAP_I32()[attr + 12 >> 2] !== 0; + } else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } else { + stackBase -= stackSize; + assert3(stackBase > 0); + } + var threadInfoStruct = _malloc(228); + for (var i = 0; i < 228 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[threadInfoStruct + 12 >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 152; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = {stackBase, stackSize, allocatedOwnStack, detached, startRoutine: start_routine, pthread_ptr: threadInfoStruct, arg, transferList}; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } else { + spawnThread(threadParams); + } + return 0; + } + function _sysconf(name) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, name); + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + case 80: + case 81: + case 79: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; + } + if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); + var GLctx; + var proxiedFunctionTable = [null, _atexit, _emscripten_set_canvas_element_size_main_thread, _fd_close, _fd_seek, _fd_write, _sysconf]; + var asmLibraryArg = {e: ___assert_fail, r: ___call_main, x: __emscripten_notify_thread_queue, b: _abort, y: _emscripten_asm_const_int, j: _emscripten_conditional_set_current_thread_status, c: _emscripten_futex_wait, d: _emscripten_futex_wake, f: _emscripten_get_now, p: _emscripten_memcpy_big, z: _emscripten_num_logical_cores, u: _emscripten_receive_on_main_thread_js, q: _emscripten_resize_heap, v: _emscripten_set_canvas_element_size, i: _emscripten_set_current_thread_status, t: _emscripten_set_thread_name, w: _emscripten_webgl_create_context, m: _fd_close, n: _fd_seek, g: _fd_write, o: initPthreadsJS, a: wasmMemory || Module["wasmMemory"], k: _pthread_cleanup_pop, l: _pthread_cleanup_push, h: _pthread_create, s: _sysconf}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["La"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["Ma"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["Na"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["Oa"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["Pa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["Qa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["Ra"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["Sa"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Ta"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ua"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Va"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Wa"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Xa"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Ya"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Za"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["_a"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["$a"]).apply(null, arguments); + }; + var ___errno_location = Module["___errno_location"] = function() { + return (___errno_location = Module["___errno_location"] = Module["asm"]["ab"]).apply(null, arguments); + }; + var _emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = function() { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = Module["asm"]["bb"]).apply(null, arguments); + }; + var _pthread_self = Module["_pthread_self"] = function() { + return (_pthread_self = Module["_pthread_self"] = Module["asm"]["cb"]).apply(null, arguments); + }; + var ___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = function() { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = Module["asm"]["db"]).apply(null, arguments); + }; + var _emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = function() { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["eb"]).apply(null, arguments); + }; + var _emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = function() { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["fb"]).apply(null, arguments); + }; + var _emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = function() { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["gb"]).apply(null, arguments); + }; + var __emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = function() { + return (__emscripten_do_dispatch_to_thread = Module["__emscripten_do_dispatch_to_thread"] = Module["asm"]["hb"]).apply(null, arguments); + }; + var _emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = function() { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["ib"]).apply(null, arguments); + }; + var _emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = function() { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["jb"]).apply(null, arguments); + }; + var __emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = function() { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = Module["asm"]["kb"]).apply(null, arguments); + }; + var _emscripten_tls_init = Module["_emscripten_tls_init"] = function() { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = Module["asm"]["lb"]).apply(null, arguments); + }; + var __emscripten_thread_init = Module["__emscripten_thread_init"] = function() { + return (__emscripten_thread_init = Module["__emscripten_thread_init"] = Module["asm"]["mb"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["nb"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["ob"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["pb"]).apply(null, arguments); + }; + var _emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = function() { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["qb"]).apply(null, arguments); + }; + var _memalign = Module["_memalign"] = function() { + return (_memalign = Module["_memalign"] = Module["asm"]["rb"]).apply(null, arguments); + }; + var __emscripten_allow_main_runtime_queued_calls = Module["__emscripten_allow_main_runtime_queued_calls"] = 9880; + var __emscripten_main_thread_futex = Module["__emscripten_main_thread_futex"] = 11368; + Module["cwrap"] = cwrap; + Module["PThread"] = PThread; + Module["PThread"] = PThread; + Module["wasmMemory"] = wasmMemory; + Module["ExitStatus"] = ExitStatus; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + if (ENVIRONMENT_IS_PTHREAD) { + readyPromiseResolve(Module); + postMessage({cmd: "loaded"}); + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (!implicit) { + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({cmd: "exitProcess", returnCode: status}); + throw new ExitStatus(status); + } else { + } + } + if (noExitRuntime) { + } else { + PThread.terminateAllThreads(); + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); + } + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + if (ENVIRONMENT_IS_PTHREAD) { + noExitRuntime = false; + PThread.initWorker(); + } + run2(); + return WasmBackendModuleThreadedSimd2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModuleThreadedSimd; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModuleThreadedSimd; + }); + else if (typeof exports === "object") + exports["WasmBackendModuleThreadedSimd"] = WasmBackendModuleThreadedSimd; + }); + var require_tfjs_backend_wasm = __commonJS((exports, module) => { + var WasmBackendModule = function() { + var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(WasmBackendModule2) { + WasmBackendModule2 = WasmBackendModule2 || {}; + var Module = typeof WasmBackendModule2 !== "undefined" ? WasmBackendModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = function(status, toThrow) { + throw toThrow; + }; + var ENVIRONMENT_IS_WEB = false; + var ENVIRONMENT_IS_WORKER = false; + var ENVIRONMENT_IS_NODE = false; + var ENVIRONMENT_IS_SHELL = false; + ENVIRONMENT_IS_WEB = typeof window === "object"; + ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; + ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; + ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readAsync, readBinary, setWindowTitle; + var nodeFS; + var nodePath; + if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require_path().dirname(scriptDirectory) + "/"; + } else { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + if (!nodeFS) + nodeFS = require("fs"); + if (!nodePath) + nodePath = require_path(); + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert3(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + thisProgram = process["argv"][1].replace(/\\/g, "/"); + } + arguments_ = process["argv"].slice(2); + process["on"]("uncaughtException", function(ex) { + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + process["on"]("unhandledRejection", abort); + quit_ = function(status) { + process["exit"](status); + }; + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } else if (ENVIRONMENT_IS_SHELL) { + if (typeof read != "undefined") { + read_ = function shell_read(f) { + return read(f); + }; + } + readBinary = function readBinary2(f) { + var data2; + if (typeof readbuffer === "function") { + return new Uint8Array(readbuffer(f)); + } + data2 = read(f, "binary"); + assert3(typeof data2 === "object"); + return data2; + }; + if (typeof scriptArgs != "undefined") { + arguments_ = scriptArgs; + } else if (typeof arguments != "undefined") { + arguments_ = arguments; + } + if (typeof quit === "function") { + quit_ = function(status) { + quit(status); + }; + } + if (typeof print !== "undefined") { + if (typeof console === "undefined") + console = {}; + console.log = print; + console.warn = console.error = typeof printErr !== "undefined" ? printErr : print; + } + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptDir) { + scriptDirectory = _scriptDir; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } else { + scriptDirectory = ""; + } + { + read_ = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function() { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function(title) { + document.title = title; + }; + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + arguments_ = Module["arguments"]; + if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; + if (Module["quit"]) + quit_ = Module["quit"]; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + var noExitRuntime = Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert3(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func2 = Module["_" + ident]; + assert3(func2, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func2; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = {string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + }}; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func2 = getCFunc(ident); + var cArgs = []; + var stack2 = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack2 === 0) + stack2 = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func2.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack2 !== 0) + stackRestore(stack2); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + }; + } + var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; + function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heap[endPtr] && !(endPtr >= endIdx)) + ++endPtr; + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ""; + while (idx < endPtr) { + var u0 = heap[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + } + return str; + } + function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function writeArrayToMemory(array2, buffer3) { + HEAP8.set(array2, buffer3); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer2, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; + function updateGlobalBufferAndViews(buf) { + buffer2 = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); + } + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATMAIN__ = []; + var __ATPOSTRUN__ = []; + var runtimeInitialized = false; + __ATINIT__.push({func: function() { + ___wasm_call_ctors(); + }}); + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__ATINIT__); + } + function preMain() { + callRuntimeCallbacks(__ATMAIN__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var runDependencyWatcher = null; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + function hasPrefix(str, prefix) { + return String.prototype.startsWith ? str.startsWith(prefix) : str.indexOf(prefix) === 0; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); + } + var fileURIPrefix = "file://"; + function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); + } + var wasmBinaryFile = "tfjs-backend-wasm.wasm"; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } catch (err2) { + abort(err2); + } + } + function getBinaryPromise() { + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }).catch(function() { + return getBinary(wasmBinaryFile); + }); + } else { + if (readAsync) { + return new Promise(function(resolve, reject) { + readAsync(wasmBinaryFile, function(response) { + resolve(new Uint8Array(response)); + }, reject); + }); + } + } + } + return Promise.resolve().then(function() { + return getBinary(wasmBinaryFile); + }); + } + function createWasm() { + var info2 = {a: asmLibraryArg}; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["g"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["m"]; + removeRunDependency("wasm-instantiate"); + } + addRunDependency("wasm-instantiate"); + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info2); + }).then(receiver, function(reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { + return fetch(wasmBinaryFile, {credentials: "same-origin"}).then(function(response) { + var result = WebAssembly.instantiateStreaming(response, info2); + return result.then(receiveInstantiatedSource, function(reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info2, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync().catch(readyPromiseReject); + return {}; + } + function callRuntimeCallbacks(callbacks2) { + while (callbacks2.length > 0) { + var callback = callbacks2.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func2 = callback.func; + if (typeof func2 === "number") { + if (callback.arg === void 0) { + wasmTable.get(func2)(); + } else { + wasmTable.get(func2)(callback.arg); + } + } else { + func2(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _abort() { + abort(); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer2.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = _emscripten_get_heap_size(); + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + var SYSCALLS = {mappings: {}, buffers: [null, [], []], printChar: function(stream, curr) { + var buffer3 = SYSCALLS.buffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer3, 0)); + buffer3.length = 0; + } else { + buffer3.push(curr); + } + }, varargs: void 0, get: function() { + SYSCALLS.varargs += 4; + var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; + return ret; + }, getStr: function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, get64: function(low, high) { + return low; + }}; + function _fd_close(fd) { + return 0; + } + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + } + function _fd_write(fd, iov, iovcnt, pnum) { + var num = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[iov + i * 8 >> 2]; + var len = HEAP32[iov + (i * 8 + 4) >> 2]; + for (var j = 0; j < len; j++) { + SYSCALLS.printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + HEAP32[pnum >> 2] = num; + return 0; + } + var asmLibraryArg = {a: _abort, d: _emscripten_memcpy_big, e: _emscripten_resize_heap, f: _fd_close, c: _fd_seek, b: _fd_write}; + var asm = createWasm(); + var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["h"]).apply(null, arguments); + }; + var _init = Module["_init"] = function() { + return (_init = Module["_init"] = Module["asm"]["i"]).apply(null, arguments); + }; + var _register_tensor = Module["_register_tensor"] = function() { + return (_register_tensor = Module["_register_tensor"] = Module["asm"]["j"]).apply(null, arguments); + }; + var _dispose_data = Module["_dispose_data"] = function() { + return (_dispose_data = Module["_dispose_data"] = Module["asm"]["k"]).apply(null, arguments); + }; + var _dispose = Module["_dispose"] = function() { + return (_dispose = Module["_dispose"] = Module["asm"]["l"]).apply(null, arguments); + }; + var _Abs = Module["_Abs"] = function() { + return (_Abs = Module["_Abs"] = Module["asm"]["n"]).apply(null, arguments); + }; + var _Add = Module["_Add"] = function() { + return (_Add = Module["_Add"] = Module["asm"]["o"]).apply(null, arguments); + }; + var _AddN = Module["_AddN"] = function() { + return (_AddN = Module["_AddN"] = Module["asm"]["p"]).apply(null, arguments); + }; + var _ArgMax = Module["_ArgMax"] = function() { + return (_ArgMax = Module["_ArgMax"] = Module["asm"]["q"]).apply(null, arguments); + }; + var _AvgPool = Module["_AvgPool"] = function() { + return (_AvgPool = Module["_AvgPool"] = Module["asm"]["r"]).apply(null, arguments); + }; + var _BatchMatMul = Module["_BatchMatMul"] = function() { + return (_BatchMatMul = Module["_BatchMatMul"] = Module["asm"]["s"]).apply(null, arguments); + }; + var _Ceil = Module["_Ceil"] = function() { + return (_Ceil = Module["_Ceil"] = Module["asm"]["t"]).apply(null, arguments); + }; + var _ClipByValue = Module["_ClipByValue"] = function() { + return (_ClipByValue = Module["_ClipByValue"] = Module["asm"]["u"]).apply(null, arguments); + }; + var _Conv2D = Module["_Conv2D"] = function() { + return (_Conv2D = Module["_Conv2D"] = Module["asm"]["v"]).apply(null, arguments); + }; + var _Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = function() { + return (_Conv2DBackpropInput = Module["_Conv2DBackpropInput"] = Module["asm"]["w"]).apply(null, arguments); + }; + var _Cos = Module["_Cos"] = function() { + return (_Cos = Module["_Cos"] = Module["asm"]["x"]).apply(null, arguments); + }; + var _CropAndResize = Module["_CropAndResize"] = function() { + return (_CropAndResize = Module["_CropAndResize"] = Module["asm"]["y"]).apply(null, arguments); + }; + var _Cumsum = Module["_Cumsum"] = function() { + return (_Cumsum = Module["_Cumsum"] = Module["asm"]["z"]).apply(null, arguments); + }; + var _DepthToSpace = Module["_DepthToSpace"] = function() { + return (_DepthToSpace = Module["_DepthToSpace"] = Module["asm"]["A"]).apply(null, arguments); + }; + var _DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = function() { + return (_DepthwiseConv2dNative = Module["_DepthwiseConv2dNative"] = Module["asm"]["B"]).apply(null, arguments); + }; + var _Equal = Module["_Equal"] = function() { + return (_Equal = Module["_Equal"] = Module["asm"]["C"]).apply(null, arguments); + }; + var _Exp = Module["_Exp"] = function() { + return (_Exp = Module["_Exp"] = Module["asm"]["D"]).apply(null, arguments); + }; + var _FlipLeftRight = Module["_FlipLeftRight"] = function() { + return (_FlipLeftRight = Module["_FlipLeftRight"] = Module["asm"]["E"]).apply(null, arguments); + }; + var _Floor = Module["_Floor"] = function() { + return (_Floor = Module["_Floor"] = Module["asm"]["F"]).apply(null, arguments); + }; + var _FloorDiv = Module["_FloorDiv"] = function() { + return (_FloorDiv = Module["_FloorDiv"] = Module["asm"]["G"]).apply(null, arguments); + }; + var _FusedBatchNorm = Module["_FusedBatchNorm"] = function() { + return (_FusedBatchNorm = Module["_FusedBatchNorm"] = Module["asm"]["H"]).apply(null, arguments); + }; + var _FusedConv2D = Module["_FusedConv2D"] = function() { + return (_FusedConv2D = Module["_FusedConv2D"] = Module["asm"]["I"]).apply(null, arguments); + }; + var _FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = function() { + return (_FusedDepthwiseConv2D = Module["_FusedDepthwiseConv2D"] = Module["asm"]["J"]).apply(null, arguments); + }; + var _Gather = Module["_Gather"] = function() { + return (_Gather = Module["_Gather"] = Module["asm"]["K"]).apply(null, arguments); + }; + var _GatherNd = Module["_GatherNd"] = function() { + return (_GatherNd = Module["_GatherNd"] = Module["asm"]["L"]).apply(null, arguments); + }; + var _Greater = Module["_Greater"] = function() { + return (_Greater = Module["_Greater"] = Module["asm"]["M"]).apply(null, arguments); + }; + var _GreaterEqual = Module["_GreaterEqual"] = function() { + return (_GreaterEqual = Module["_GreaterEqual"] = Module["asm"]["N"]).apply(null, arguments); + }; + var _LeakyRelu = Module["_LeakyRelu"] = function() { + return (_LeakyRelu = Module["_LeakyRelu"] = Module["asm"]["O"]).apply(null, arguments); + }; + var _Less = Module["_Less"] = function() { + return (_Less = Module["_Less"] = Module["asm"]["P"]).apply(null, arguments); + }; + var _LessEqual = Module["_LessEqual"] = function() { + return (_LessEqual = Module["_LessEqual"] = Module["asm"]["Q"]).apply(null, arguments); + }; + var _Log = Module["_Log"] = function() { + return (_Log = Module["_Log"] = Module["asm"]["R"]).apply(null, arguments); + }; + var _LogicalAnd = Module["_LogicalAnd"] = function() { + return (_LogicalAnd = Module["_LogicalAnd"] = Module["asm"]["S"]).apply(null, arguments); + }; + var _Max = Module["_Max"] = function() { + return (_Max = Module["_Max"] = Module["asm"]["T"]).apply(null, arguments); + }; + var _MaxPool = Module["_MaxPool"] = function() { + return (_MaxPool = Module["_MaxPool"] = Module["asm"]["U"]).apply(null, arguments); + }; + var _Maximum = Module["_Maximum"] = function() { + return (_Maximum = Module["_Maximum"] = Module["asm"]["V"]).apply(null, arguments); + }; + var _Mean = Module["_Mean"] = function() { + return (_Mean = Module["_Mean"] = Module["asm"]["W"]).apply(null, arguments); + }; + var _Min = Module["_Min"] = function() { + return (_Min = Module["_Min"] = Module["asm"]["X"]).apply(null, arguments); + }; + var _Minimum = Module["_Minimum"] = function() { + return (_Minimum = Module["_Minimum"] = Module["asm"]["Y"]).apply(null, arguments); + }; + var _Multiply = Module["_Multiply"] = function() { + return (_Multiply = Module["_Multiply"] = Module["asm"]["Z"]).apply(null, arguments); + }; + var _Neg = Module["_Neg"] = function() { + return (_Neg = Module["_Neg"] = Module["asm"]["_"]).apply(null, arguments); + }; + var _NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = function() { + return (_NonMaxSuppressionV3 = Module["_NonMaxSuppressionV3"] = Module["asm"]["$"]).apply(null, arguments); + }; + var _NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = function() { + return (_NonMaxSuppressionV4 = Module["_NonMaxSuppressionV4"] = Module["asm"]["aa"]).apply(null, arguments); + }; + var _NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = function() { + return (_NonMaxSuppressionV5 = Module["_NonMaxSuppressionV5"] = Module["asm"]["ba"]).apply(null, arguments); + }; + var _NotEqual = Module["_NotEqual"] = function() { + return (_NotEqual = Module["_NotEqual"] = Module["asm"]["ca"]).apply(null, arguments); + }; + var _OneHot = Module["_OneHot"] = function() { + return (_OneHot = Module["_OneHot"] = Module["asm"]["da"]).apply(null, arguments); + }; + var _PadV2 = Module["_PadV2"] = function() { + return (_PadV2 = Module["_PadV2"] = Module["asm"]["ea"]).apply(null, arguments); + }; + var _Pow = Module["_Pow"] = function() { + return (_Pow = Module["_Pow"] = Module["asm"]["fa"]).apply(null, arguments); + }; + var _Prelu = Module["_Prelu"] = function() { + return (_Prelu = Module["_Prelu"] = Module["asm"]["ga"]).apply(null, arguments); + }; + var _Prod = Module["_Prod"] = function() { + return (_Prod = Module["_Prod"] = Module["asm"]["ha"]).apply(null, arguments); + }; + var _RealDiv = Module["_RealDiv"] = function() { + return (_RealDiv = Module["_RealDiv"] = Module["asm"]["ia"]).apply(null, arguments); + }; + var _Relu = Module["_Relu"] = function() { + return (_Relu = Module["_Relu"] = Module["asm"]["ja"]).apply(null, arguments); + }; + var _Relu6 = Module["_Relu6"] = function() { + return (_Relu6 = Module["_Relu6"] = Module["asm"]["ka"]).apply(null, arguments); + }; + var _ResizeBilinear = Module["_ResizeBilinear"] = function() { + return (_ResizeBilinear = Module["_ResizeBilinear"] = Module["asm"]["la"]).apply(null, arguments); + }; + var _Reverse = Module["_Reverse"] = function() { + return (_Reverse = Module["_Reverse"] = Module["asm"]["ma"]).apply(null, arguments); + }; + var _RotateWithOffset = Module["_RotateWithOffset"] = function() { + return (_RotateWithOffset = Module["_RotateWithOffset"] = Module["asm"]["na"]).apply(null, arguments); + }; + var _Round = Module["_Round"] = function() { + return (_Round = Module["_Round"] = Module["asm"]["oa"]).apply(null, arguments); + }; + var _Rsqrt = Module["_Rsqrt"] = function() { + return (_Rsqrt = Module["_Rsqrt"] = Module["asm"]["pa"]).apply(null, arguments); + }; + var _ScatterNd = Module["_ScatterNd"] = function() { + return (_ScatterNd = Module["_ScatterNd"] = Module["asm"]["qa"]).apply(null, arguments); + }; + var _SelectV2 = Module["_SelectV2"] = function() { + return (_SelectV2 = Module["_SelectV2"] = Module["asm"]["ra"]).apply(null, arguments); + }; + var _Sigmoid = Module["_Sigmoid"] = function() { + return (_Sigmoid = Module["_Sigmoid"] = Module["asm"]["sa"]).apply(null, arguments); + }; + var _Sin = Module["_Sin"] = function() { + return (_Sin = Module["_Sin"] = Module["asm"]["ta"]).apply(null, arguments); + }; + var _Softmax = Module["_Softmax"] = function() { + return (_Softmax = Module["_Softmax"] = Module["asm"]["ua"]).apply(null, arguments); + }; + var _Sqrt = Module["_Sqrt"] = function() { + return (_Sqrt = Module["_Sqrt"] = Module["asm"]["va"]).apply(null, arguments); + }; + var _Square = Module["_Square"] = function() { + return (_Square = Module["_Square"] = Module["asm"]["wa"]).apply(null, arguments); + }; + var _SquaredDifference = Module["_SquaredDifference"] = function() { + return (_SquaredDifference = Module["_SquaredDifference"] = Module["asm"]["xa"]).apply(null, arguments); + }; + var _Step = Module["_Step"] = function() { + return (_Step = Module["_Step"] = Module["asm"]["ya"]).apply(null, arguments); + }; + var _StridedSlice = Module["_StridedSlice"] = function() { + return (_StridedSlice = Module["_StridedSlice"] = Module["asm"]["za"]).apply(null, arguments); + }; + var _Sub = Module["_Sub"] = function() { + return (_Sub = Module["_Sub"] = Module["asm"]["Aa"]).apply(null, arguments); + }; + var _Sum = Module["_Sum"] = function() { + return (_Sum = Module["_Sum"] = Module["asm"]["Ba"]).apply(null, arguments); + }; + var _Tanh = Module["_Tanh"] = function() { + return (_Tanh = Module["_Tanh"] = Module["asm"]["Ca"]).apply(null, arguments); + }; + var _Tile = Module["_Tile"] = function() { + return (_Tile = Module["_Tile"] = Module["asm"]["Da"]).apply(null, arguments); + }; + var _TopK = Module["_TopK"] = function() { + return (_TopK = Module["_TopK"] = Module["asm"]["Ea"]).apply(null, arguments); + }; + var _Transpose = Module["_Transpose"] = function() { + return (_Transpose = Module["_Transpose"] = Module["asm"]["Fa"]).apply(null, arguments); + }; + var __FusedMatMul = Module["__FusedMatMul"] = function() { + return (__FusedMatMul = Module["__FusedMatMul"] = Module["asm"]["Ga"]).apply(null, arguments); + }; + var _malloc = Module["_malloc"] = function() { + return (_malloc = Module["_malloc"] = Module["asm"]["Ha"]).apply(null, arguments); + }; + var _free = Module["_free"] = function() { + return (_free = Module["_free"] = Module["asm"]["Ia"]).apply(null, arguments); + }; + var stackSave = Module["stackSave"] = function() { + return (stackSave = Module["stackSave"] = Module["asm"]["Ja"]).apply(null, arguments); + }; + var stackRestore = Module["stackRestore"] = function() { + return (stackRestore = Module["stackRestore"] = Module["asm"]["Ka"]).apply(null, arguments); + }; + var stackAlloc = Module["stackAlloc"] = function() { + return (stackAlloc = Module["stackAlloc"] = Module["asm"]["La"]).apply(null, arguments); + }; + Module["cwrap"] = cwrap; + var calledRun; + function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; + } + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run2(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run2(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run2; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run2(); + return WasmBackendModule2.ready; + }; + }(); + if (typeof exports === "object" && typeof module === "object") + module.exports = WasmBackendModule; + else if (typeof define === "function" && define["amd"]) + define([], function() { + return WasmBackendModule; + }); + else if (typeof exports === "object") + exports["WasmBackendModule"] = WasmBackendModule; + }); + var require_alea2 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function Alea(seed) { + var me = this, mash = Mash(); + me.next = function() { + var t = 2091639 * me.s0 + me.c * 23283064365386963e-26; + me.s0 = me.s1; + me.s1 = me.s2; + return me.s2 = t - (me.c = t | 0); + }; + me.c = 1; + me.s0 = mash(" "); + me.s1 = mash(" "); + me.s2 = mash(" "); + me.s0 -= mash(seed); + if (me.s0 < 0) { + me.s0 += 1; + } + me.s1 -= mash(seed); + if (me.s1 < 0) { + me.s1 += 1; + } + me.s2 -= mash(seed); + if (me.s2 < 0) { + me.s2 += 1; + } + mash = null; + } + function copy(f, t) { + t.c = f.c; + t.s0 = f.s0; + t.s1 = f.s1; + t.s2 = f.s2; + return t; + } + function impl(seed, opts) { + var xg = new Alea(seed), state = opts && opts.state, prng = xg.next; + prng.int32 = function() { + return xg.next() * 4294967296 | 0; + }; + prng.double = function() { + return prng() + (prng() * 2097152 | 0) * 11102230246251565e-32; + }; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + function Mash() { + var n = 4022871197; + var mash = function(data2) { + data2 = String(data2); + for (var i = 0; i < data2.length; i++) { + n += data2.charCodeAt(i); + var h = 0.02519603282416938 * n; + n = h >>> 0; + h -= n; + h *= n; + n = h >>> 0; + h -= n; + n += h * 4294967296; + } + return (n >>> 0) * 23283064365386963e-26; + }; + return mash; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.alea = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor1282 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.next = function() { + var t = me.x ^ me.x << 11; + me.x = me.y; + me.y = me.z; + me.z = me.w; + return me.w ^= me.w >>> 19 ^ t ^ t >>> 8; + }; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor128 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorwow2 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var t = me.x ^ me.x >>> 2; + me.x = me.y; + me.y = me.z; + me.z = me.w; + me.w = me.v; + return (me.d = me.d + 362437 | 0) + (me.v = me.v ^ me.v << 4 ^ (t ^ t << 1)) | 0; + }; + me.x = 0; + me.y = 0; + me.z = 0; + me.w = 0; + me.v = 0; + if (seed === (seed | 0)) { + me.x = seed; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 64; k++) { + me.x ^= strseed.charCodeAt(k) | 0; + if (k == strseed.length) { + me.d = me.x << 10 ^ me.x >>> 4; + } + me.next(); + } + } + function copy(f, t) { + t.x = f.x; + t.y = f.y; + t.z = f.z; + t.w = f.w; + t.v = f.v; + t.d = f.d; + return t; + } + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorwow = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xorshift72 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var X = me.x, i = me.i, t, v, w; + t = X[i]; + t ^= t >>> 7; + v = t ^ t << 24; + t = X[i + 1 & 7]; + v ^= t ^ t >>> 10; + t = X[i + 3 & 7]; + v ^= t ^ t >>> 3; + t = X[i + 4 & 7]; + v ^= t ^ t << 7; + t = X[i + 7 & 7]; + t = t ^ t << 13; + v ^= t ^ t << 9; + X[i] = v; + me.i = i + 1 & 7; + return v; + }; + function init2(me2, seed2) { + var j, w, X = []; + if (seed2 === (seed2 | 0)) { + w = X[0] = seed2; + } else { + seed2 = "" + seed2; + for (j = 0; j < seed2.length; ++j) { + X[j & 7] = X[j & 7] << 15 ^ seed2.charCodeAt(j) + X[j + 1 & 7] << 13; + } + } + while (X.length < 8) + X.push(0); + for (j = 0; j < 8 && X[j] === 0; ++j) + ; + if (j == 8) + w = X[7] = -1; + else + w = X[j]; + me2.x = X; + me2.i = 0; + for (j = 256; j > 0; --j) { + me2.next(); + } + } + init2(me, seed); + } + function copy(f, t) { + t.x = f.x.slice(); + t.i = f.i; + return t; + } + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.x) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xorshift7 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_xor40962 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this; + me.next = function() { + var w = me.w, X = me.X, i = me.i, t, v; + me.w = w = w + 1640531527 | 0; + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + v = X[i] = v ^ t; + me.i = i; + return v + (w ^ w >>> 16) | 0; + }; + function init2(me2, seed2) { + var t, v, i, j, w, X = [], limit = 128; + if (seed2 === (seed2 | 0)) { + v = seed2; + seed2 = null; + } else { + seed2 = seed2 + "\0"; + v = 0; + limit = Math.max(limit, seed2.length); + } + for (i = 0, j = -32; j < limit; ++j) { + if (seed2) + v ^= seed2.charCodeAt((j + 32) % seed2.length); + if (j === 0) + w = v; + v ^= v << 10; + v ^= v >>> 15; + v ^= v << 4; + v ^= v >>> 13; + if (j >= 0) { + w = w + 1640531527 | 0; + t = X[j & 127] ^= v + w; + i = t == 0 ? i + 1 : 0; + } + } + if (i >= 128) { + X[(seed2 && seed2.length || 0) & 127] = -1; + } + i = 127; + for (j = 4 * 128; j > 0; --j) { + v = X[i + 34 & 127]; + t = X[i = i + 1 & 127]; + v ^= v << 13; + t ^= t << 17; + v ^= v >>> 15; + t ^= t >>> 12; + X[i] = v ^ t; + } + me2.w = w; + me2.X = X; + me2.i = i; + } + init2(me, seed); + } + function copy(f, t) { + t.i = f.i; + t.w = f.w; + t.X = f.X.slice(); + return t; + } + ; + function impl(seed, opts) { + if (seed == null) + seed = +new Date(); + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (state.X) + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.xor4096 = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_tychei2 = __commonJS((exports, module) => { + (function(global2, module2, define2) { + function XorGen(seed) { + var me = this, strseed = ""; + me.next = function() { + var b = me.b, c = me.c, d = me.d, a = me.a; + b = b << 25 ^ b >>> 7 ^ c; + c = c - d | 0; + d = d << 24 ^ d >>> 8 ^ a; + a = a - b | 0; + me.b = b = b << 20 ^ b >>> 12 ^ c; + me.c = c = c - d | 0; + me.d = d << 16 ^ c >>> 16 ^ a; + return me.a = a - b | 0; + }; + me.a = 0; + me.b = 0; + me.c = 2654435769 | 0; + me.d = 1367130551; + if (seed === Math.floor(seed)) { + me.a = seed / 4294967296 | 0; + me.b = seed | 0; + } else { + strseed += seed; + } + for (var k = 0; k < strseed.length + 20; k++) { + me.b ^= strseed.charCodeAt(k) | 0; + me.next(); + } + } + function copy(f, t) { + t.a = f.a; + t.b = f.b; + t.c = f.c; + t.d = f.d; + return t; + } + ; + function impl(seed, opts) { + var xg = new XorGen(seed), state = opts && opts.state, prng = function() { + return (xg.next() >>> 0) / 4294967296; + }; + prng.double = function() { + do { + var top = xg.next() >>> 11, bot = (xg.next() >>> 0) / 4294967296, result = (top + bot) / (1 << 21); + } while (result === 0); + return result; + }; + prng.int32 = xg.next; + prng.quick = prng; + if (state) { + if (typeof state == "object") + copy(state, xg); + prng.state = function() { + return copy(xg, {}); + }; + } + return prng; + } + if (module2 && module2.exports) { + module2.exports = impl; + } else if (define2 && define2.amd) { + define2(function() { + return impl; + }); + } else { + this.tychei = impl; + } + })(exports, typeof module == "object" && module, typeof define == "function" && define); + }); + var require_seedrandom3 = __commonJS((exports, module) => { + (function(global2, pool3, math) { + var width = 256, chunks = 6, digits = 52, rngname = "random", startdenom = math.pow(width, chunks), significance = math.pow(2, digits), overflow = significance * 2, mask = width - 1, nodecrypto; + function seedrandom5(seed, options, callback) { + var key = []; + options = options == true ? {entropy: true} : options || {}; + var shortseed = mixkey(flatten4(options.entropy ? [seed, tostring(pool3)] : seed == null ? autoseed() : seed, 3), key); + var arc4 = new ARC4(key); + var prng = function() { + var n = arc4.g(chunks), d = startdenom, x = 0; + while (n < significance) { + n = (n + x) * width; + d *= width; + x = arc4.g(1); + } + while (n >= overflow) { + n /= 2; + d /= 2; + x >>>= 1; + } + return (n + x) / d; + }; + prng.int32 = function() { + return arc4.g(4) | 0; + }; + prng.quick = function() { + return arc4.g(4) / 4294967296; + }; + prng.double = prng; + mixkey(tostring(arc4.S), pool3); + return (options.pass || callback || function(prng2, seed2, is_math_call, state) { + if (state) { + if (state.S) { + copy(state, arc4); + } + prng2.state = function() { + return copy(arc4, {}); + }; + } + if (is_math_call) { + math[rngname] = prng2; + return seed2; + } else + return prng2; + })(prng, shortseed, "global" in options ? options.global : this == math, options.state); + } + function ARC4(key) { + var t, keylen = key.length, me = this, i = 0, j = me.i = me.j = 0, s = me.S = []; + if (!keylen) { + key = [keylen++]; + } + while (i < width) { + s[i] = i++; + } + for (i = 0; i < width; i++) { + s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; + s[j] = t; + } + (me.g = function(count2) { + var t2, r = 0, i2 = me.i, j2 = me.j, s2 = me.S; + while (count2--) { + t2 = s2[i2 = mask & i2 + 1]; + r = r * width + s2[mask & (s2[i2] = s2[j2 = mask & j2 + t2]) + (s2[j2] = t2)]; + } + me.i = i2; + me.j = j2; + return r; + })(width); + } + function copy(f, t) { + t.i = f.i; + t.j = f.j; + t.S = f.S.slice(); + return t; + } + ; + function flatten4(obj, depth) { + var result = [], typ = typeof obj, prop; + if (depth && typ == "object") { + for (prop in obj) { + try { + result.push(flatten4(obj[prop], depth - 1)); + } catch (e) { + } + } + } + return result.length ? result : typ == "string" ? obj : obj + "\0"; + } + function mixkey(seed, key) { + var stringseed = seed + "", smear, j = 0; + while (j < stringseed.length) { + key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); + } + return tostring(key); + } + function autoseed() { + try { + var out; + if (nodecrypto && (out = nodecrypto.randomBytes)) { + out = out(width); + } else { + out = new Uint8Array(width); + (global2.crypto || global2.msCrypto).getRandomValues(out); + } + return tostring(out); + } catch (e) { + var browser = global2.navigator, plugins = browser && browser.plugins; + return [+new Date(), global2, plugins, global2.screen, tostring(pool3)]; + } + } + function tostring(a) { + return String.fromCharCode.apply(0, a); + } + mixkey(math.random(), pool3); + if (typeof module == "object" && module.exports) { + module.exports = seedrandom5; + try { + nodecrypto = require_crypto(); + } catch (ex) { + } + } else if (typeof define == "function" && define.amd) { + define(function() { + return seedrandom5; + }); + } else { + math["seed" + rngname] = seedrandom5; + } + })(typeof self !== "undefined" ? self : exports, [], Math); + }); + var require_seedrandom4 = __commonJS((exports, module) => { + var alea5 = require_alea2(); + var xor128 = require_xor1282(); + var xorwow = require_xorwow2(); + var xorshift7 = require_xorshift72(); + var xor4096 = require_xor40962(); + var tychei = require_tychei2(); + var sr = require_seedrandom3(); + sr.alea = alea5; + sr.xor128 = xor128; + sr.xorwow = xorwow; + sr.xorshift7 = xorshift7; + sr.xor4096 = xor4096; + sr.tychei = tychei; + module.exports = sr; + }); + var require_string_decoder = __commonJS(() => { + }); + var version = "3.3.0"; + var version2 = "3.3.0"; + var version3 = "3.3.0"; + var version4 = "3.3.0"; + var version5 = "3.3.0"; + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var EPSILON_FLOAT32 = 1e-7; + var EPSILON_FLOAT16 = 1e-4; + var DataStorage = class { + constructor(backend22, dataMover) { + this.backend = backend22; + this.dataMover = dataMover; + this.data = new WeakMap(); + this.dataIdsCount = 0; + } + get(dataId) { + if (!this.data.has(dataId)) { + this.dataMover.moveData(this.backend, dataId); + } + return this.data.get(dataId); + } + set(dataId, value) { + this.dataIdsCount++; + this.data.set(dataId, value); + } + has(dataId) { + return this.data.has(dataId); + } + delete(dataId) { + this.dataIdsCount--; + return this.data.delete(dataId); + } + numDataIds() { + return this.dataIdsCount; + } + }; + var KernelBackend = class { + refCount(dataId) { + return notYetImplemented("refCount"); + } + incRef(dataId) { + return notYetImplemented("incRef"); + } + timerAvailable() { + return true; + } + time(f) { + return notYetImplemented("time"); + } + read(dataId) { + return notYetImplemented("read"); + } + readSync(dataId) { + return notYetImplemented("readSync"); + } + numDataIds() { + return notYetImplemented("numDataIds"); + } + disposeData(dataId, force) { + return notYetImplemented("disposeData"); + } + write(values, shape, dtype) { + return notYetImplemented("write"); + } + move(dataId, values, shape, dtype, refCount) { + return notYetImplemented("move"); + } + memory() { + return notYetImplemented("memory"); + } + floatPrecision() { + return notYetImplemented("floatPrecision"); + } + epsilon() { + return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16; + } + dispose() { + return notYetImplemented("dispose"); + } + }; + function notYetImplemented(kernelName) { + throw new Error(`'${kernelName}' not yet implemented or not found in the registry. This kernel may not be supported by the tfjs backend you have chosen`); + } + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function shuffle(array2) { + let counter = array2.length; + let temp = 0; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + array2[counter] = array2[index]; + array2[index] = temp; + } + } + function shuffleCombo(array2, array22) { + if (array2.length !== array22.length) { + throw new Error(`Array sizes must match to be shuffled together First array length was ${array2.length}Second array length was ${array22.length}`); + } + let counter = array2.length; + let temp, temp2; + let index = 0; + while (counter > 0) { + index = Math.random() * counter | 0; + counter--; + temp = array2[counter]; + temp2 = array22[counter]; + array2[counter] = array2[index]; + array22[counter] = array22[index]; + array2[index] = temp; + array22[index] = temp2; + } + } + function clamp(min6, x, max6) { + return Math.max(min6, Math.min(x, max6)); + } + function nearestLargerEven(val) { + return val % 2 === 0 ? val : val + 1; + } + function sum(arr) { + let sum6 = 0; + for (let i = 0; i < arr.length; i++) { + sum6 += arr[i]; + } + return sum6; + } + function randUniform(a, b) { + const r = Math.random(); + return b * r + (1 - r) * a; + } + function distSquared(a, b) { + let result = 0; + for (let i = 0; i < a.length; i++) { + const diff = Number(a[i]) - Number(b[i]); + result += diff * diff; + } + return result; + } + function assert(expr, msg) { + if (!expr) { + throw new Error(typeof msg === "string" ? msg : msg()); + } + } + function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = "") { + assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`); + } + function assertNonNull(a) { + assert(a != null, () => `The input to the tensor constructor must be a non-null value.`); + } + function flatten(arr, result = [], skipTypedArray = false) { + if (result == null) { + result = []; + } + if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) { + for (let i = 0; i < arr.length; ++i) { + flatten(arr[i], result, skipTypedArray); + } + } else { + result.push(arr); + } + return result; + } + function sizeFromShape(shape) { + if (shape.length === 0) { + return 1; + } + let size = shape[0]; + for (let i = 1; i < shape.length; i++) { + size *= shape[i]; + } + return size; + } + function isScalarShape(shape) { + return shape.length === 0; + } + function arraysEqual(n1, n2) { + if (n1 === n2) { + return true; + } + if (n1 == null || n2 == null) { + return false; + } + if (n1.length !== n2.length) { + return false; + } + for (let i = 0; i < n1.length; i++) { + if (n1[i] !== n2[i]) { + return false; + } + } + return true; + } + function isInt(a) { + return a % 1 === 0; + } + function tanh(x) { + if (Math.tanh != null) { + return Math.tanh(x); + } + if (x === Infinity) { + return 1; + } else if (x === -Infinity) { + return -1; + } else { + const e2x = Math.exp(2 * x); + return (e2x - 1) / (e2x + 1); + } + } + function sizeToSquarishShape(size) { + const width = Math.ceil(Math.sqrt(size)); + return [width, Math.ceil(size / width)]; + } + function createShuffledIndices(n) { + const shuffledIndices = new Uint32Array(n); + for (let i = 0; i < n; ++i) { + shuffledIndices[i] = i; + } + shuffle(shuffledIndices); + return shuffledIndices; + } + function rightPad(a, size) { + if (size <= a.length) { + return a; + } + return a + " ".repeat(size - a.length); + } + function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter) { + return new Promise((resolve, reject) => { + let tryCount = 0; + const tryFn = () => { + if (checkFn()) { + resolve(); + return; + } + tryCount++; + const nextBackoff = delayFn(tryCount); + if (maxCounter != null && tryCount >= maxCounter) { + reject(); + return; + } + setTimeout(tryFn, nextBackoff); + }; + tryFn(); + }); + } + function inferFromImplicitShape(shape, size) { + let shapeProd = 1; + let implicitIdx = -1; + for (let i = 0; i < shape.length; ++i) { + if (shape[i] >= 0) { + shapeProd *= shape[i]; + } else if (shape[i] === -1) { + if (implicitIdx !== -1) { + throw Error(`Shapes can only have 1 implicit size. Found -1 at dim ${implicitIdx} and dim ${i}`); + } + implicitIdx = i; + } else if (shape[i] < 0) { + throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`); + } + } + if (implicitIdx === -1) { + if (size > 0 && size !== shapeProd) { + throw Error(`Size(${size}) must match the product of shape ${shape}`); + } + return shape; + } + if (shapeProd === 0) { + throw Error(`Cannot infer the missing size in [${shape}] when there are 0 elements`); + } + if (size % shapeProd !== 0) { + throw Error(`The implicit shape can't be a fractional number. Got ${size} / ${shapeProd}`); + } + const newShape = shape.slice(); + newShape[implicitIdx] = size / shapeProd; + return newShape; + } + function parseAxisParam(axis, shape) { + const rank = shape.length; + axis = axis == null ? shape.map((s, i) => i) : [].concat(axis); + assert(axis.every((ax) => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but got axis ${axis}`); + assert(axis.every((ax) => isInt(ax)), () => `All values in axis param must be integers but got axis ${axis}`); + return axis.map((a) => a < 0 ? rank + a : a); + } + function squeezeShape(shape, axis) { + const newShape = []; + const keptDims = []; + const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0; + const axes = axis == null || isEmptyArray ? null : parseAxisParam(axis, shape).sort(); + let j = 0; + for (let i = 0; i < shape.length; ++i) { + if (axes != null) { + if (axes[j] === i && shape[i] !== 1) { + throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`); + } + if ((axes[j] == null || axes[j] > i) && shape[i] === 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + if (axes[j] <= i) { + j++; + } + } + if (shape[i] !== 1) { + newShape.push(shape[i]); + keptDims.push(i); + } + } + return {newShape, keptDims}; + } + function getTypedArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; + } + function getArrayFromDType(dtype, size) { + let values = null; + if (dtype == null || dtype === "float32") { + values = new Float32Array(size); + } else if (dtype === "int32") { + values = new Int32Array(size); + } else if (dtype === "bool") { + values = new Uint8Array(size); + } else if (dtype === "string") { + values = new Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + return values; + } + function checkConversionForErrors(vals, dtype) { + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`); + } + } + } + function isValidDtype(dtype) { + return dtype === "bool" || dtype === "complex64" || dtype === "float32" || dtype === "int32" || dtype === "string"; + } + function hasEncodingLoss(oldType, newType) { + if (newType === "complex64") { + return false; + } + if (newType === "float32" && oldType !== "complex64") { + return false; + } + if (newType === "int32" && oldType !== "float32" && oldType !== "complex64") { + return false; + } + if (newType === "bool" && oldType === "bool") { + return false; + } + return true; + } + function isTypedArray(a) { + return a instanceof Float32Array || a instanceof Int32Array || a instanceof Uint8Array; + } + function bytesPerElement(dtype) { + if (dtype === "float32" || dtype === "int32") { + return 4; + } else if (dtype === "complex64") { + return 8; + } else if (dtype === "bool") { + return 1; + } else { + throw new Error(`Unknown dtype ${dtype}`); + } + } + function bytesFromStringArray(arr) { + if (arr == null) { + return 0; + } + let bytes = 0; + arr.forEach((x) => bytes += x.length); + return bytes; + } + function isString(value) { + return typeof value === "string" || value instanceof String; + } + function isBoolean(value) { + return typeof value === "boolean"; + } + function isNumber(value) { + return typeof value === "number"; + } + function inferDtype(values) { + if (Array.isArray(values)) { + return inferDtype(values[0]); + } + if (values instanceof Float32Array) { + return "float32"; + } else if (values instanceof Int32Array || values instanceof Uint8Array) { + return "int32"; + } else if (isNumber(values)) { + return "float32"; + } else if (isString(values)) { + return "string"; + } else if (isBoolean(values)) { + return "bool"; + } + return "float32"; + } + function isFunction(f) { + return !!(f && f.constructor && f.call && f.apply); + } + function nearestDivisor(size, start) { + for (let i = start; i < size; ++i) { + if (size % i === 0) { + return i; + } + } + return size; + } + function computeStrides(shape) { + const rank = shape.length; + if (rank < 2) { + return []; + } + const strides = new Array(rank - 1); + strides[rank - 2] = shape[rank - 1]; + for (let i = rank - 3; i >= 0; --i) { + strides[i] = strides[i + 1] * shape[i + 1]; + } + return strides; + } + function createNestedArray(offset, shape, a) { + const ret = new Array(); + if (shape.length === 1) { + const d = shape[0]; + for (let i = 0; i < d; i++) { + ret[i] = a[offset + i]; + } + } else { + const d = shape[0]; + const rest = shape.slice(1); + const len = rest.reduce((acc, c) => acc * c); + for (let i = 0; i < d; i++) { + ret[i] = createNestedArray(offset + i * len, rest, a); + } + } + return ret; + } + function toNestedArray(shape, a) { + if (shape.length === 0) { + return a[0]; + } + const size = shape.reduce((acc, c) => acc * c); + if (size === 0) { + return []; + } + if (size !== a.length) { + throw new Error(`[${shape}] does not match the input size ${a.length}.`); + } + return createNestedArray(0, shape, a); + } + function makeOnesTypedArray(size, dtype) { + const array2 = makeZerosTypedArray(size, dtype); + for (let i = 0; i < array2.length; i++) { + array2[i] = 1; + } + return array2; + } + function makeZerosTypedArray(size, dtype) { + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(size); + } else if (dtype === "int32") { + return new Int32Array(size); + } else if (dtype === "bool") { + return new Uint8Array(size); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + } + function makeZerosNestedTypedArray(shape, dtype) { + const size = shape.reduce((prev, curr) => prev * curr, 1); + if (dtype == null || dtype === "float32") { + return toNestedArray(shape, new Float32Array(size)); + } else if (dtype === "int32") { + return toNestedArray(shape, new Int32Array(size)); + } else if (dtype === "bool") { + return toNestedArray(shape, new Uint8Array(size)); + } else { + throw new Error(`Unknown data type ${dtype}`); + } + } + function assertNonNegativeIntegerDimensions(shape) { + shape.forEach((dimSize) => { + assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got shape [${shape}].`); + }); + } + function locToIndex(locs, rank, strides) { + if (rank === 0) { + return 0; + } else if (rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += strides[i] * locs[i]; + } + return index; + } + function indexToLoc(index, rank, strides) { + if (rank === 0) { + return []; + } else if (rank === 1) { + return [index]; + } + const locs = new Array(rank); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / strides[i]); + index -= locs[i] * strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + function isPromise(object2) { + return object2 && object2.then && typeof object2.then === "function"; + } + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var TENSORFLOWJS_FLAGS_PREFIX = "tfjsflags"; + var Environment = class { + constructor(global2) { + this.global = global2; + this.flags = {}; + this.flagRegistry = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + setPlatform(platformName, platform) { + if (this.platform != null) { + console.warn(`Platform ${this.platformName} has already been set. Overwriting the platform with ${platform}.`); + } + this.platformName = platformName; + this.platform = platform; + } + registerFlag(flagName, evaluationFn, setHook) { + this.flagRegistry[flagName] = {evaluationFn, setHook}; + if (this.urlFlags[flagName] != null) { + const flagValue = this.urlFlags[flagName]; + console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`); + this.set(flagName, flagValue); + } + } + async getAsync(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + this.flags[flagName] = await this.evaluateFlag(flagName); + return this.flags[flagName]; + } + get(flagName) { + if (flagName in this.flags) { + return this.flags[flagName]; + } + const flagValue = this.evaluateFlag(flagName); + if (isPromise(flagValue)) { + throw new Error(`Flag ${flagName} cannot be synchronously evaluated. Please use getAsync() instead.`); + } + this.flags[flagName] = flagValue; + return this.flags[flagName]; + } + getNumber(flagName) { + return this.get(flagName); + } + getBool(flagName) { + return this.get(flagName); + } + getFlags() { + return this.flags; + } + get features() { + return this.flags; + } + set(flagName, value) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot set flag ${flagName} as it has not been registered.`); + } + this.flags[flagName] = value; + if (this.flagRegistry[flagName].setHook != null) { + this.flagRegistry[flagName].setHook(value); + } + } + evaluateFlag(flagName) { + if (this.flagRegistry[flagName] == null) { + throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`); + } + return this.flagRegistry[flagName].evaluationFn(); + } + setFlags(flags) { + this.flags = Object.assign({}, flags); + } + reset() { + this.flags = {}; + this.urlFlags = {}; + this.populateURLFlags(); + } + populateURLFlags() { + if (typeof this.global === "undefined" || typeof this.global.location === "undefined" || typeof this.global.location.search === "undefined") { + return; + } + const urlParams = getQueryParams(this.global.location.search); + if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) { + const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(","); + keyValues.forEach((keyValue) => { + const [key, value] = keyValue.split(":"); + this.urlFlags[key] = parseValue(key, value); + }); + } + } + }; + function getQueryParams(queryString) { + const params = {}; + queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => { + decodeParam(params, t[0], t[1]); + return t.join("="); + }); + return params; + } + function decodeParam(params, name, value) { + params[decodeURIComponent(name)] = decodeURIComponent(value || ""); + } + function parseValue(flagName, value) { + value = value.toLowerCase(); + if (value === "true" || value === "false") { + return value === "true"; + } else if (`${+value}` === value) { + return +value; + } + throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`); + } + function env() { + return ENV; + } + var ENV = null; + function setEnvironmentGlobal(environment) { + ENV = environment; + } + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var globalNameSpace; + function getGlobalNamespace() { + if (globalNameSpace == null) { + let ns; + if (typeof window !== "undefined") { + ns = window; + } else if (typeof global !== "undefined") { + ns = global; + } else if (typeof process !== "undefined") { + ns = process; + } else if (typeof self !== "undefined") { + ns = self; + } else { + throw new Error("Could not find a global object"); + } + globalNameSpace = ns; + } + return globalNameSpace; + } + function getGlobalMap() { + const ns = getGlobalNamespace(); + if (ns._tfGlobals == null) { + ns._tfGlobals = new Map(); + } + return ns._tfGlobals; + } + function getGlobal(key, init2) { + const globalMap = getGlobalMap(); + if (globalMap.has(key)) { + return globalMap.get(key); + } else { + const singleton = init2(); + globalMap.set(key, singleton); + return globalMap.get(key); + } + } + var Abs = "Abs"; + var Acos = "Acos"; + var Acosh = "Acosh"; + var Add = "Add"; + var AddN = "AddN"; + var All = "All"; + var Any = "Any"; + var ArgMax = "ArgMax"; + var ArgMin = "ArgMin"; + var Asin = "Asin"; + var Asinh = "Asinh"; + var Atan = "Atan"; + var Atanh = "Atanh"; + var Atan2 = "Atan2"; + var AvgPool = "AvgPool"; + var AvgPoolGrad = "AvgPoolGrad"; + var AvgPool3D = "AvgPool3D"; + var AvgPool3DGrad = "AvgPool3DGrad"; + var BatchMatMul = "BatchMatMul"; + var BatchToSpaceND = "BatchToSpaceND"; + var Bincount = "Bincount"; + var BroadcastTo = "BroadcastTo"; + var Cast = "Cast"; + var Ceil = "Ceil"; + var ClipByValue = "ClipByValue"; + var Complex = "Complex"; + var ComplexAbs = "ComplexAbs"; + var Concat = "Concat"; + var Conv2D = "Conv2D"; + var Conv2DBackpropFilter = "Conv2DBackpropFilter"; + var Conv2DBackpropInput = "Conv2DBackpropInput"; + var Conv3D = "Conv3D"; + var Conv3DBackpropFilterV2 = "Conv3DBackpropFilterV2"; + var Conv3DBackpropInputV2 = "Conv3DBackpropInputV2"; + var Cos = "Cos"; + var Cosh = "Cosh"; + var Cumsum = "Cumsum"; + var CropAndResize = "CropAndResize"; + var DenseBincount = "DenseBincount"; + var DepthToSpace = "DepthToSpace"; + var DepthwiseConv2dNative = "DepthwiseConv2dNative"; + var DepthwiseConv2dNativeBackpropFilter = "DepthwiseConv2dNativeBackpropFilter"; + var DepthwiseConv2dNativeBackpropInput = "DepthwiseConv2dNativeBackpropInput"; + var Diag = "Diag"; + var Dilation2D = "Dilation2D"; + var Dilation2DBackpropInput = "Dilation2DBackpropInput"; + var Dilation2DBackpropFilter = "Dilation2DBackpropFilter"; + var RealDiv = "RealDiv"; + var Elu = "Elu"; + var EluGrad = "EluGrad"; + var Erf = "Erf"; + var Equal = "Equal"; + var Exp = "Exp"; + var ExpandDims = "ExpandDims"; + var Expm1 = "Expm1"; + var FFT = "FFT"; + var Fill = "Fill"; + var FlipLeftRight = "FlipLeftRight"; + var Floor = "Floor"; + var FloorDiv = "FloorDiv"; + var FusedBatchNorm = "FusedBatchNorm"; + var GatherV2 = "GatherV2"; + var GatherNd = "GatherNd"; + var Greater = "Greater"; + var GreaterEqual = "GreaterEqual"; + var Identity = "Identity"; + var IFFT = "IFFT"; + var Imag = "Imag"; + var IsFinite = "IsFinite"; + var IsInf = "IsInf"; + var IsNan = "IsNan"; + var LeakyRelu = "LeakyRelu"; + var Less = "Less"; + var LessEqual = "LessEqual"; + var LinSpace = "LinSpace"; + var Log = "Log"; + var Log1p = "Log1p"; + var LogicalAnd = "LogicalAnd"; + var LogicalNot = "LogicalNot"; + var LogicalOr = "LogicalOr"; + var LogSoftmax = "LogSoftmax"; + var LRN = "LRN"; + var LRNGrad = "LRNGrad"; + var Max = "Max"; + var Maximum = "Maximum"; + var MaxPool = "MaxPool"; + var MaxPoolGrad = "MaxPoolGrad"; + var MaxPool3D = "MaxPool3D"; + var MaxPool3DGrad = "MaxPool3DGrad"; + var MaxPoolWithArgmax = "MaxPoolWithArgmax"; + var Mean = "Mean"; + var Min = "Min"; + var Minimum = "Minimum"; + var MirrorPad = "MirrorPad"; + var Mod = "Mod"; + var Multinomial = "Multinomial"; + var Multiply = "Multiply"; + var Neg = "Neg"; + var NotEqual = "NotEqual"; + var NonMaxSuppressionV3 = "NonMaxSuppressionV3"; + var NonMaxSuppressionV4 = "NonMaxSuppressionV4"; + var NonMaxSuppressionV5 = "NonMaxSuppressionV5"; + var OnesLike = "OnesLike"; + var OneHot = "OneHot"; + var Pack = "Pack"; + var PadV2 = "PadV2"; + var Pool = "Pool"; + var Pow = "Pow"; + var Prelu = "Prelu"; + var Prod = "Prod"; + var Range = "Range"; + var Real = "Real"; + var Reciprocal = "Reciprocal"; + var Relu = "Relu"; + var Reshape = "Reshape"; + var ResizeNearestNeighbor = "ResizeNearestNeighbor"; + var ResizeNearestNeighborGrad = "ResizeNearestNeighborGrad"; + var ResizeBilinear = "ResizeBilinear"; + var ResizeBilinearGrad = "ResizeBilinearGrad"; + var Relu6 = "Relu6"; + var Reverse = "Reverse"; + var Round = "Round"; + var Rsqrt = "Rsqrt"; + var ScatterNd = "ScatterNd"; + var Select = "Select"; + var Selu = "Selu"; + var Slice = "Slice"; + var Sin = "Sin"; + var Sinh = "Sinh"; + var Sign = "Sign"; + var Sigmoid = "Sigmoid"; + var Softplus = "Softplus"; + var Sqrt = "Sqrt"; + var Sum = "Sum"; + var SpaceToBatchND = "SpaceToBatchND"; + var SplitV = "SplitV"; + var Softmax = "Softmax"; + var SquaredDifference = "SquaredDifference"; + var Square = "Square"; + var Sub = "Sub"; + var SparseToDense = "SparseToDense"; + var StridedSlice = "StridedSlice"; + var Tan = "Tan"; + var Tanh = "Tanh"; + var Tile = "Tile"; + var TopK = "TopK"; + var Transform = "Transform"; + var Transpose = "Transpose"; + var Unique = "Unique"; + var Unpack = "Unpack"; + var UnsortedSegmentSum = "UnsortedSegmentSum"; + var ZerosLike = "ZerosLike"; + var Step = "Step"; + var FromPixels = "FromPixels"; + var RotateWithOffset = "RotateWithOffset"; + var _FusedMatMul = "_FusedMatMul"; + var FusedConv2D = "FusedConv2D"; + var FusedDepthwiseConv2D = "FusedDepthwiseConv2D"; + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var kernelRegistry = getGlobal("kernelRegistry", () => new Map()); + var gradRegistry = getGlobal("gradRegistry", () => new Map()); + function getKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + return kernelRegistry.get(key); + } + function getGradient(kernelName) { + return gradRegistry.get(kernelName); + } + function getKernelsForBackend(backendName) { + const it = kernelRegistry.entries(); + const result = []; + while (true) { + const {done, value} = it.next(); + if (done) { + break; + } + const [key, config3] = value; + const [backend22] = key.split("_"); + if (backend22 === backendName) { + result.push(config3); + } + } + return result; + } + function registerKernel(config3) { + const {kernelName, backendName} = config3; + const key = makeKey(kernelName, backendName); + if (kernelRegistry.has(key)) { + console.warn(`The kernel '${kernelName}' for backend '${backendName}' is already registered`); + } + kernelRegistry.set(key, config3); + } + function registerGradient(config3) { + const {kernelName} = config3; + if (gradRegistry.has(kernelName)) { + if (env().getBool("DEBUG")) { + console.warn(`Overriding the gradient for '${kernelName}'`); + } + } + gradRegistry.set(kernelName, config3); + } + function unregisterKernel(kernelName, backendName) { + const key = makeKey(kernelName, backendName); + if (!kernelRegistry.has(key)) { + throw new Error(`The kernel '${kernelName}' for backend '${backendName}' is not registered`); + } + kernelRegistry.delete(key); + } + function unregisterGradient(kernelName) { + if (!gradRegistry.has(kernelName)) { + throw new Error(`The gradient '${kernelName}' for backend is not registered`); + } + gradRegistry.delete(kernelName); + } + function copyRegisteredKernels(registeredBackendName, newBackendName) { + const kernels = getKernelsForBackend(registeredBackendName); + kernels.forEach((kernelConfig) => { + const newKernelConfig = Object.assign({}, kernelConfig, {backendName: newBackendName}); + registerKernel(newKernelConfig); + }); + } + function makeKey(kernelName, backendName) { + return `${backendName}_${kernelName}`; + } + var util_exports = {}; + __export2(util_exports, { + arraysEqual: () => arraysEqual, + assert: () => assert, + assertNonNegativeIntegerDimensions: () => assertNonNegativeIntegerDimensions, + assertNonNull: () => assertNonNull, + assertShapesMatch: () => assertShapesMatch, + bytesFromStringArray: () => bytesFromStringArray, + bytesPerElement: () => bytesPerElement, + checkConversionForErrors: () => checkConversionForErrors, + clamp: () => clamp, + computeStrides: () => computeStrides, + createScalarValue: () => createScalarValue, + createShuffledIndices: () => createShuffledIndices, + decodeString: () => decodeString, + distSquared: () => distSquared, + encodeString: () => encodeString, + fetch: () => fetch2, + flatten: () => flatten, + getArrayFromDType: () => getArrayFromDType, + getTypedArrayFromDType: () => getTypedArrayFromDType, + hasEncodingLoss: () => hasEncodingLoss, + indexToLoc: () => indexToLoc, + inferDtype: () => inferDtype, + inferFromImplicitShape: () => inferFromImplicitShape, + isBoolean: () => isBoolean, + isFunction: () => isFunction, + isInt: () => isInt, + isNumber: () => isNumber, + isPromise: () => isPromise, + isScalarShape: () => isScalarShape, + isString: () => isString, + isTypedArray: () => isTypedArray, + isValidDtype: () => isValidDtype, + locToIndex: () => locToIndex, + makeOnesTypedArray: () => makeOnesTypedArray, + makeZerosNestedTypedArray: () => makeZerosNestedTypedArray, + makeZerosTypedArray: () => makeZerosTypedArray, + nearestDivisor: () => nearestDivisor, + nearestLargerEven: () => nearestLargerEven, + now: () => now2, + parseAxisParam: () => parseAxisParam, + randUniform: () => randUniform, + repeatedTry: () => repeatedTry, + rightPad: () => rightPad, + shuffle: () => shuffle, + shuffleCombo: () => shuffleCombo, + sizeFromShape: () => sizeFromShape, + sizeToSquarishShape: () => sizeToSquarishShape, + squeezeShape: () => squeezeShape, + sum: () => sum, + tanh: () => tanh, + toNestedArray: () => toNestedArray, + toTypedArray: () => toTypedArray + }); + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function createScalarValue(value, dtype) { + if (dtype === "string") { + return encodeString(value); + } + return toTypedArray([value], dtype); + } + function noConversionNeeded(a, dtype) { + return a instanceof Float32Array && dtype === "float32" || a instanceof Int32Array && dtype === "int32" || a instanceof Uint8Array && dtype === "bool"; + } + function toTypedArray(a, dtype) { + if (dtype === "string") { + throw new Error("Cannot convert a string[] to a TypedArray"); + } + if (Array.isArray(a)) { + a = flatten(a); + } + if (env().getBool("DEBUG")) { + checkConversionForErrors(a, dtype); + } + if (noConversionNeeded(a, dtype)) { + return a; + } + if (dtype == null || dtype === "float32" || dtype === "complex64") { + return new Float32Array(a); + } else if (dtype === "int32") { + return new Int32Array(a); + } else if (dtype === "bool") { + const bool = new Uint8Array(a.length); + for (let i = 0; i < bool.length; ++i) { + if (Math.round(a[i]) !== 0) { + bool[i] = 1; + } + } + return bool; + } else { + throw new Error(`Unknown data type ${dtype}`); + } + } + function now2() { + return env().platform.now(); + } + function fetch2(path, requestInits) { + return env().platform.fetch(path, requestInits); + } + function encodeString(s, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.encode(s, encoding); + } + function decodeString(bytes, encoding = "utf-8") { + encoding = encoding || "utf-8"; + return env().platform.decode(bytes, encoding); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var Profiler = class { + constructor(backendTimer, logger) { + this.backendTimer = backendTimer; + this.logger = logger; + if (logger == null) { + this.logger = new Logger(); + } + } + profileKernel(kernelName, inputs, f) { + let outputs; + const holdResultWrapperFn = () => { + outputs = f(); + }; + let timer; + const start = now2(); + if (this.backendTimer.timerAvailable()) { + timer = this.backendTimer.time(holdResultWrapperFn); + } else { + holdResultWrapperFn(); + for (const output of outputs) { + output.dataSync(); + } + timer = Promise.resolve({kernelMs: now2() - start}); + } + if (env().getBool("CHECK_COMPUTATION_FOR_ERRORS")) { + for (let i = 0; i < outputs.length; i++) { + const output = outputs[i]; + output.data().then((tensorVals) => { + checkComputationForErrors(tensorVals, output.dtype, kernelName); + }); + } + } + const kernelProfile = { + kernelName, + outputs, + inputs, + timeMs: timer.then((timing) => timing.kernelMs), + extraInfo: timer.then((timing) => timing.getExtraProfileInfo != null ? timing.getExtraProfileInfo() : "") + }; + return kernelProfile; + } + logKernelProfile(kernelProfile) { + const {kernelName, outputs, timeMs, inputs, extraInfo} = kernelProfile; + outputs.forEach((result) => { + Promise.all([result.data(), timeMs, extraInfo]).then((valueContainer) => { + this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]); + }); + }); + } + }; + function checkComputationForErrors(vals, dtype, kernelName) { + if (dtype !== "float32") { + return false; + } + for (let i = 0; i < vals.length; i++) { + const num = vals[i]; + if (isNaN(num) || !isFinite(num)) { + console.warn(`Found ${num} in the result of '${kernelName}'`); + return true; + } + } + return false; + } + var Logger = class { + logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) { + const time2 = typeof timeMs === "number" ? rightPad(`${timeMs}ms`, 9) : timeMs["error"]; + const paddedName = rightPad(name, 25); + const rank = result.rank; + const size = result.size; + const shape = rightPad(result.shape.toString(), 14); + let inputShapesDescription = ""; + for (const name2 in inputs) { + const input2 = inputs[name2]; + if (input2 != null) { + const inputShape = input2.shape || result.shape; + const inputRank = inputShape.length; + inputShapesDescription += `${name2}: ${inputRank}D ${inputRank > 0 ? inputShape : ""} `; + } + } + console.log(`%c${paddedName} %c${time2} %c${rank}D ${shape} %c${size} %c${inputShapesDescription} %c${extraInfo}`, "font-weight:bold", "color:red", "color:blue", "color: orange", "color: green", "color: steelblue"); + } + }; + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function getFilteredNodesXToY(tape, xs, y) { + const tensorsFromX = {}; + const nodesFromX = {}; + for (let i = 0; i < xs.length; i++) { + tensorsFromX[xs[i].id] = true; + } + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (const inputName in nodeInputs) { + const input2 = nodeInputs[inputName]; + let anyInputFromX = false; + for (let j = 0; j < xs.length; j++) { + if (tensorsFromX[input2.id]) { + node.outputs.forEach((output) => tensorsFromX[output.id] = true); + anyInputFromX = true; + nodesFromX[node.id] = true; + break; + } + } + if (anyInputFromX) { + break; + } + } + } + const tensorsLeadToY = {}; + tensorsLeadToY[y.id] = true; + const nodesToY = {}; + for (let i = tape.length - 1; i >= 0; i--) { + const node = tape[i]; + const nodeInputs = node.inputs; + for (let j = 0; j < node.outputs.length; j++) { + if (tensorsLeadToY[node.outputs[j].id]) { + for (const inputName in nodeInputs) { + tensorsLeadToY[nodeInputs[inputName].id] = true; + nodesToY[node.id] = true; + } + break; + } + } + } + const filteredTape = []; + for (let i = 0; i < tape.length; i++) { + const node = tape[i]; + if (nodesFromX[node.id] && nodesToY[node.id]) { + const prunedInputs = {}; + for (const inputName in node.inputs) { + const nodeInput = node.inputs[inputName]; + if (tensorsFromX[nodeInput.id]) { + prunedInputs[inputName] = nodeInput; + } + } + const prunedNode = Object.assign({}, node); + prunedNode.inputs = prunedInputs; + prunedNode.outputs = node.outputs; + filteredTape.push(prunedNode); + } + } + return filteredTape; + } + function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy2, add5) { + for (let i = filteredTape.length - 1; i >= 0; i--) { + const node = filteredTape[i]; + const dys = []; + node.outputs.forEach((o) => { + const gradTensor = tensorAccumulatedGradientMap[o.id]; + if (gradTensor != null) { + dys.push(gradTensor); + } else { + dys.push(null); + } + }); + if (node.gradient == null) { + throw new Error(`Cannot compute gradient: gradient function not found for ${node.kernelName}.`); + } + const inputGradients = node.gradient(dys); + for (const inputName in node.inputs) { + if (!(inputName in inputGradients)) { + throw new Error(`Cannot backprop through input ${inputName}. Available gradients found: ${Object.keys(inputGradients)}.`); + } + const dx = tidy2(() => inputGradients[inputName]()); + if (dx.dtype !== "float32") { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ${inputName} must have 'float32' dtype, but has '${dx.dtype}'`); + } + const x = node.inputs[inputName]; + if (!arraysEqual(dx.shape, x.shape)) { + throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input '${inputName}' has shape '${dx.shape}', which does not match the shape of the input '${x.shape}'`); + } + if (tensorAccumulatedGradientMap[x.id] == null) { + tensorAccumulatedGradientMap[x.id] = dx; + } else { + const curGradient = tensorAccumulatedGradientMap[x.id]; + tensorAccumulatedGradientMap[x.id] = add5(curGradient, dx); + curGradient.dispose(); + } + } + } + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var FORMAT_LIMIT_NUM_VALS = 20; + var FORMAT_NUM_FIRST_LAST_VALS = 3; + var FORMAT_NUM_SIG_DIGITS = 7; + function tensorToString(vals, shape, dtype, verbose) { + const strides = computeStrides(shape); + const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides); + const rank = shape.length; + const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol); + const lines2 = ["Tensor"]; + if (verbose) { + lines2.push(` dtype: ${dtype}`); + lines2.push(` rank: ${rank}`); + lines2.push(` shape: [${shape}]`); + lines2.push(` values:`); + } + lines2.push(valsLines.map((l) => " " + l).join("\n")); + return lines2.join("\n"); + } + function computeMaxSizePerColumn(vals, shape, dtype, strides) { + const n = sizeFromShape(shape); + const numCols = strides[strides.length - 1]; + const padPerCol = new Array(numCols).fill(0); + const rank = shape.length; + const valuesOrTuples = dtype === "complex64" ? createComplexTuples(vals) : vals; + if (rank > 1) { + for (let row = 0; row < n / numCols; row++) { + const offset = row * numCols; + for (let j = 0; j < numCols; j++) { + padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length); + } + } + } + return padPerCol; + } + function valToString(val, pad3, dtype) { + let valStr; + if (Array.isArray(val)) { + valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`; + } else if (isString(val)) { + valStr = `'${val}'`; + } else if (dtype === "bool") { + valStr = boolNumToString(val); + } else { + valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString(); + } + return rightPad(valStr, pad3); + } + function boolNumToString(v) { + return v === 0 ? "false" : "true"; + } + function subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) { + const storagePerElement = dtype === "complex64" ? 2 : 1; + const size = shape[0]; + const rank = shape.length; + if (rank === 0) { + if (dtype === "complex64") { + const complexTuple = createComplexTuples(vals); + return [valToString(complexTuple[0], 0, dtype)]; + } + if (dtype === "bool") { + return [boolNumToString(vals[0])]; + } + return [vals[0].toString()]; + } + if (rank === 1) { + if (size > FORMAT_LIMIT_NUM_VALS) { + const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement; + let firstVals = Array.from(vals.slice(0, firstValsSize)); + let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement)); + if (dtype === "complex64") { + firstVals = createComplexTuples(firstVals); + lastVals = createComplexTuples(lastVals); + } + return [ + "[" + firstVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + ", ..., " + lastVals.map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype)).join(", ") + "]" + ]; + } + const displayVals = dtype === "complex64" ? createComplexTuples(vals) : Array.from(vals); + return [ + "[" + displayVals.map((x, i) => valToString(x, padPerCol[i], dtype)).join(", ") + "]" + ]; + } + const subshape = shape.slice(1); + const substrides = strides.slice(1); + const stride = strides[0] * storagePerElement; + const lines2 = []; + if (size > FORMAT_LIMIT_NUM_VALS) { + for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false)); + } + lines2.push("..."); + for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } else { + for (let i = 0; i < size; i++) { + const start = i * stride; + const end = start + stride; + lines2.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1)); + } + } + const sep = rank === 2 ? "," : ""; + lines2[0] = "[" + lines2[0] + sep; + for (let i = 1; i < lines2.length - 1; i++) { + lines2[i] = " " + lines2[i] + sep; + } + let newLineSep = ",\n"; + for (let i = 2; i < rank; i++) { + newLineSep += "\n"; + } + lines2[lines2.length - 1] = " " + lines2[lines2.length - 1] + "]" + (isLast ? "" : newLineSep); + return lines2; + } + function createComplexTuples(vals) { + const complexTuples = []; + for (let i = 0; i < vals.length; i += 2) { + complexTuples.push([vals[i], vals[i + 1]]); + } + return complexTuples; + } + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var TensorBuffer = class { + constructor(shape, dtype, values) { + this.dtype = dtype; + this.shape = shape.slice(); + this.size = sizeFromShape(shape); + if (values != null) { + const n = values.length; + assert(n === this.size, () => `Length of values '${n}' does not match the size inferred by the shape '${this.size}'.`); + } + if (dtype === "complex64") { + throw new Error(`complex64 dtype TensorBuffers are not supported. Please create a TensorBuffer for the real and imaginary parts separately and call tf.complex(real, imag).`); + } + this.values = values || getArrayFromDType(dtype, this.size); + this.strides = computeStrides(shape); + } + set(value, ...locs) { + if (locs.length === 0) { + locs = [0]; + } + assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must match the rank (${this.rank})`); + const index = this.locToIndex(locs); + this.values[index] = value; + } + get(...locs) { + if (locs.length === 0) { + locs = [0]; + } + let i = 0; + for (const loc of locs) { + if (loc < 0 || loc >= this.shape[i]) { + const msg = `Requested out of range element at ${locs}. Buffer shape=${this.shape}`; + throw new Error(msg); + } + i++; + } + let index = locs[locs.length - 1]; + for (let i2 = 0; i2 < locs.length - 1; ++i2) { + index += this.strides[i2] * locs[i2]; + } + return this.values[index]; + } + locToIndex(locs) { + if (this.rank === 0) { + return 0; + } else if (this.rank === 1) { + return locs[0]; + } + let index = locs[locs.length - 1]; + for (let i = 0; i < locs.length - 1; ++i) { + index += this.strides[i] * locs[i]; + } + return index; + } + indexToLoc(index) { + if (this.rank === 0) { + return []; + } else if (this.rank === 1) { + return [index]; + } + const locs = new Array(this.shape.length); + for (let i = 0; i < locs.length - 1; ++i) { + locs[i] = Math.floor(index / this.strides[i]); + index -= locs[i] * this.strides[i]; + } + locs[locs.length - 1] = index; + return locs; + } + get rank() { + return this.shape.length; + } + toTensor() { + return trackerFn().makeTensor(this.values, this.shape, this.dtype); + } + }; + var trackerFn = null; + var opHandler = null; + var deprecationWarningFn = null; + function setTensorTracker(fn) { + trackerFn = fn; + } + function setOpHandler(handler) { + opHandler = handler; + } + function setDeprecationWarningFn(fn) { + deprecationWarningFn = fn; + } + var Tensor = class { + constructor(shape, dtype, dataId, id) { + this.kept = false; + this.isDisposedInternal = false; + this.shape = shape.slice(); + this.dtype = dtype || "float32"; + this.size = sizeFromShape(shape); + this.strides = computeStrides(shape); + this.dataId = dataId; + this.id = id; + this.rankType = this.rank < 5 ? this.rank.toString() : "higher"; + } + get rank() { + return this.shape.length; + } + async buffer() { + const vals = await this.data(); + return opHandler.buffer(this.shape, this.dtype, vals); + } + bufferSync() { + return opHandler.buffer(this.shape, this.dtype, this.dataSync()); + } + async array() { + const vals = await this.data(); + return toNestedArray(this.shape, vals); + } + arraySync() { + return toNestedArray(this.shape, this.dataSync()); + } + async data() { + this.throwIfDisposed(); + const data2 = trackerFn().read(this.dataId); + if (this.dtype === "string") { + const bytes = await data2; + try { + return bytes.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + dataSync() { + this.throwIfDisposed(); + const data2 = trackerFn().readSync(this.dataId); + if (this.dtype === "string") { + try { + return data2.map((b) => decodeString(b)); + } catch (_a) { + throw new Error("Failed to decode the string bytes into utf-8. To get the original bytes, call tensor.bytes()."); + } + } + return data2; + } + async bytes() { + this.throwIfDisposed(); + const data2 = await trackerFn().read(this.dataId); + if (this.dtype === "string") { + return data2; + } else { + return new Uint8Array(data2.buffer); + } + } + dispose() { + if (this.isDisposed) { + return; + } + trackerFn().disposeTensor(this); + this.isDisposedInternal = true; + } + get isDisposed() { + return this.isDisposedInternal; + } + throwIfDisposed() { + if (this.isDisposed) { + throw new Error(`Tensor is disposed.`); + } + } + print(verbose = false) { + return opHandler.print(this, verbose); + } + clone() { + this.throwIfDisposed(); + return opHandler.clone(this); + } + toString(verbose = false) { + const vals = this.dataSync(); + return tensorToString(vals, this.shape, this.dtype, verbose); + } + cast(dtype) { + this.throwIfDisposed(); + return opHandler.cast(this, dtype); + } + variable(trainable = true, name, dtype) { + this.throwIfDisposed(); + return trackerFn().makeVariable(this, trainable, name, dtype); + } + }; + Object.defineProperty(Tensor, Symbol.hasInstance, { + value: (instance) => { + return !!instance && instance.data != null && instance.dataSync != null && instance.throwIfDisposed != null; + } + }); + function getGlobalTensorClass() { + return getGlobal("Tensor", () => { + return Tensor; + }); + } + getGlobalTensorClass(); + var Variable = class extends Tensor { + constructor(initialValue, trainable, name, tensorId) { + super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId); + this.trainable = trainable; + this.name = name; + } + assign(newValue) { + if (newValue.dtype !== this.dtype) { + throw new Error(`dtype of the new value (${newValue.dtype}) and previous value (${this.dtype}) must match`); + } + if (!arraysEqual(newValue.shape, this.shape)) { + throw new Error(`shape of the new value (${newValue.shape}) and previous value (${this.shape}) must match`); + } + trackerFn().disposeTensor(this); + this.dataId = newValue.dataId; + trackerFn().incRef(this, null); + } + dispose() { + trackerFn().disposeVariable(this); + this.isDisposedInternal = true; + } + }; + Object.defineProperty(Variable, Symbol.hasInstance, { + value: (instance) => { + return instance instanceof Tensor && instance.assign != null && instance.assign instanceof Function; + } + }); + var tensor_util_exports = {}; + __export2(tensor_util_exports, { + assertTypesMatch: () => assertTypesMatch, + getTensorsInContainer: () => getTensorsInContainer, + isTensorInList: () => isTensorInList, + makeTypesMatch: () => makeTypesMatch + }); + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var Rank; + (function(Rank2) { + Rank2["R0"] = "R0"; + Rank2["R1"] = "R1"; + Rank2["R2"] = "R2"; + Rank2["R3"] = "R3"; + Rank2["R4"] = "R4"; + Rank2["R5"] = "R5"; + Rank2["R6"] = "R6"; + })(Rank || (Rank = {})); + var UpcastInt32AndMap; + (function(UpcastInt32AndMap2) { + UpcastInt32AndMap2["float32"] = "float32"; + UpcastInt32AndMap2["int32"] = "int32"; + UpcastInt32AndMap2["bool"] = "int32"; + UpcastInt32AndMap2["complex64"] = "complex64"; + })(UpcastInt32AndMap || (UpcastInt32AndMap = {})); + var UpcastBoolAndMap; + (function(UpcastBoolAndMap2) { + UpcastBoolAndMap2["float32"] = "float32"; + UpcastBoolAndMap2["int32"] = "int32"; + UpcastBoolAndMap2["bool"] = "bool"; + UpcastBoolAndMap2["complex64"] = "complex64"; + })(UpcastBoolAndMap || (UpcastBoolAndMap = {})); + var UpcastFloat32AndMap; + (function(UpcastFloat32AndMap2) { + UpcastFloat32AndMap2["float32"] = "float32"; + UpcastFloat32AndMap2["int32"] = "float32"; + UpcastFloat32AndMap2["bool"] = "float32"; + UpcastFloat32AndMap2["complex64"] = "complex64"; + })(UpcastFloat32AndMap || (UpcastFloat32AndMap = {})); + var UpcastComplex64AndMap; + (function(UpcastComplex64AndMap2) { + UpcastComplex64AndMap2["float32"] = "complex64"; + UpcastComplex64AndMap2["int32"] = "complex64"; + UpcastComplex64AndMap2["bool"] = "complex64"; + UpcastComplex64AndMap2["complex64"] = "complex64"; + })(UpcastComplex64AndMap || (UpcastComplex64AndMap = {})); + var upcastTypeMap = { + float32: UpcastFloat32AndMap, + int32: UpcastInt32AndMap, + bool: UpcastBoolAndMap, + complex64: UpcastComplex64AndMap + }; + function upcastType(typeA, typeB) { + if (typeA === "string" || typeB === "string") { + if (typeA === "string" && typeB === "string") { + return "string"; + } + throw new Error(`Can not upcast ${typeA} with ${typeB}`); + } + return upcastTypeMap[typeA][typeB]; + } + function sumOutType(type) { + return upcastType(type, "int32"); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function makeTypesMatch(a, b) { + if (a.dtype === b.dtype) { + return [a, b]; + } + const dtype = upcastType(a.dtype, b.dtype); + return [a.cast(dtype), b.cast(dtype)]; + } + function assertTypesMatch(a, b) { + assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and second(${b.dtype}) input must match`); + } + function isTensorInList(tensor2, tensorList) { + return tensorList.some((x) => x.id === tensor2.id); + } + function getTensorsInContainer(result) { + const list = []; + const seen = new Set(); + walkTensorContainer(result, list, seen); + return list; + } + function walkTensorContainer(container, list, seen) { + if (container == null) { + return; + } + if (container instanceof Tensor) { + list.push(container); + return; + } + if (!isIterable(container)) { + return; + } + const iterable = container; + for (const k in iterable) { + const val = iterable[k]; + if (!seen.has(val)) { + seen.add(val); + walkTensorContainer(val, list, seen); + } + } + } + function isIterable(obj) { + return Array.isArray(obj) || typeof obj === "object"; + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function isRegisteredKernelInvocation(kernelInvocation) { + return kernelInvocation.kernelName != null; + } + var EngineState = class { + constructor() { + this.registeredVariables = {}; + this.nextTapeNodeId = 0; + this.numBytes = 0; + this.numTensors = 0; + this.numStringTensors = 0; + this.numDataBuffers = 0; + this.gradientDepth = 0; + this.kernelDepth = 0; + this.scopeStack = []; + this.numDataMovesStack = []; + this.nextScopeId = 0; + this.tensorInfo = new WeakMap(); + this.profiling = false; + this.activeProfile = { + newBytes: 0, + newTensors: 0, + peakBytes: 0, + kernels: [], + result: null, + get kernelNames() { + return Array.from(new Set(this.kernels.map((k) => k.name))); + } + }; + } + dispose() { + for (const variableName in this.registeredVariables) { + this.registeredVariables[variableName].dispose(); + } + } + }; + var Engine = class { + constructor(ENV5) { + this.ENV = ENV5; + this.registry = {}; + this.registryFactory = {}; + this.pendingBackendInitId = 0; + this.state = new EngineState(); + } + async ready() { + if (this.pendingBackendInit != null) { + return this.pendingBackendInit.then(() => { + }); + } + if (this.backendInstance != null) { + return; + } + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const success = await this.initializeBackend(backendName).success; + if (success) { + await this.setBackend(backendName); + return; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + get backend() { + if (this.pendingBackendInit != null) { + throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + if (this.backendInstance == null) { + const {name, asyncInit} = this.initializeBackendsAndReturnBest(); + if (asyncInit) { + throw new Error(`The highest priority backend '${name}' has not yet been initialized. Make sure to await tf.ready() or await tf.setBackend() before calling other methods`); + } + this.setBackend(name); + } + return this.backendInstance; + } + backendNames() { + return Object.keys(this.registryFactory); + } + findBackend(backendName) { + if (!(backendName in this.registry)) { + if (backendName in this.registryFactory) { + const {asyncInit} = this.initializeBackend(backendName); + if (asyncInit) { + return null; + } + } else { + return null; + } + } + return this.registry[backendName]; + } + findBackendFactory(backendName) { + if (!(backendName in this.registryFactory)) { + return null; + } + return this.registryFactory[backendName].factory; + } + registerBackend(backendName, factory, priority = 1) { + if (backendName in this.registryFactory) { + console.warn(`${backendName} backend was already registered. Reusing existing backend factory.`); + return false; + } + this.registryFactory[backendName] = {factory, priority}; + return true; + } + async setBackend(backendName) { + if (this.registryFactory[backendName] == null) { + throw new Error(`Backend name '${backendName}' not found in registry`); + } + this.backendName = backendName; + if (this.registry[backendName] == null) { + this.backendInstance = null; + const {success, asyncInit} = this.initializeBackend(backendName); + const result = asyncInit ? await success : success; + if (!result) { + return false; + } + } + this.backendInstance = this.registry[backendName]; + this.setupRegisteredKernels(); + this.profiler = new Profiler(this.backendInstance); + return true; + } + setupRegisteredKernels() { + const kernels = getKernelsForBackend(this.backendName); + kernels.forEach((kernel) => { + if (kernel.setupFunc != null) { + kernel.setupFunc(this.backendInstance); + } + }); + } + disposeRegisteredKernels(backendName) { + const kernels = getKernelsForBackend(backendName); + kernels.forEach((kernel) => { + if (kernel.disposeFunc != null) { + kernel.disposeFunc(this.registry[backendName]); + } + }); + } + initializeBackend(backendName) { + const registryFactoryEntry = this.registryFactory[backendName]; + if (registryFactoryEntry == null) { + throw new Error(`Cannot initialize backend ${backendName}, no registration found.`); + } + try { + const backend22 = registryFactoryEntry.factory(); + if (backend22 && !(backend22 instanceof KernelBackend) && typeof backend22.then === "function") { + const promiseId = ++this.pendingBackendInitId; + const success = backend22.then((backendInstance) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.registry[backendName] = backendInstance; + this.pendingBackendInit = null; + return true; + }).catch((err) => { + if (promiseId < this.pendingBackendInitId) { + return false; + } + this.pendingBackendInit = null; + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return false; + }); + this.pendingBackendInit = success; + return {success, asyncInit: true}; + } else { + this.registry[backendName] = backend22; + return {success: true, asyncInit: false}; + } + } catch (err) { + console.warn(`Initialization of backend ${backendName} failed`); + console.warn(err.stack || err.message); + return {success: false, asyncInit: false}; + } + } + removeBackend(backendName) { + if (!(backendName in this.registryFactory)) { + throw new Error(`${backendName} backend not found in registry`); + } + if (this.backendName === backendName && this.pendingBackendInit != null) { + this.pendingBackendInitId++; + } + if (backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + delete this.registryFactory[backendName]; + if (this.backendName === backendName) { + this.pendingBackendInit = null; + this.backendName = null; + this.backendInstance = null; + } + } + getSortedBackends() { + if (Object.keys(this.registryFactory).length === 0) { + throw new Error("No backend found in registry."); + } + return Object.keys(this.registryFactory).sort((a, b) => { + return this.registryFactory[b].priority - this.registryFactory[a].priority; + }); + } + initializeBackendsAndReturnBest() { + const sortedBackends = this.getSortedBackends(); + for (let i = 0; i < sortedBackends.length; i++) { + const backendName = sortedBackends[i]; + const {success, asyncInit} = this.initializeBackend(backendName); + if (asyncInit || success) { + return {name: backendName, asyncInit}; + } + } + throw new Error(`Could not initialize any backends, all backend initializations failed.`); + } + moveData(backend22, dataId) { + const info2 = this.state.tensorInfo.get(dataId); + const srcBackend = info2.backend; + const values = this.readSync(dataId); + const refCount = srcBackend.refCount(dataId); + srcBackend.disposeData(dataId, true); + info2.backend = backend22; + backend22.move(dataId, values, info2.shape, info2.dtype, refCount); + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++; + } + } + tidy(nameOrFn, fn) { + let name = null; + if (fn == null) { + if (typeof nameOrFn !== "function") { + throw new Error("Please provide a function to tidy()"); + } + fn = nameOrFn; + } else { + if (typeof nameOrFn !== "string" && !(nameOrFn instanceof String)) { + throw new Error("When calling with two arguments, the first argument to tidy() must be a string"); + } + if (typeof fn !== "function") { + throw new Error("When calling with two arguments, the 2nd argument to tidy() must be a function"); + } + name = nameOrFn; + } + let result; + return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => { + result = fn(); + if (result instanceof Promise) { + console.error("Cannot return a Promise inside of tidy."); + } + return result; + }); + } + scopedRun(start, end, f) { + start(); + try { + const res = f(); + end(); + return res; + } catch (ex) { + end(); + throw ex; + } + } + nextTensorId() { + return Engine.nextTensorId++; + } + nextVariableId() { + return Engine.nextVariableId++; + } + clone(x) { + const y = ENGINE.runKernel(Identity, {x}); + const inputs = {x}; + const grad2 = (dy) => ({ + x: () => { + const dtype = "float32"; + const gradInputs = {x: dy}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, gradInputs, attrs); + } + }); + const saved = []; + this.addTapeNode(this.state.activeScope.name, inputs, [y], grad2, saved, {}); + return y; + } + runKernel(kernelName, inputs, attrs) { + const hasKernel = getKernel(kernelName, this.backendName) != null; + if (!hasKernel) { + throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`); + } + return this.runKernelFunc({kernelName, inputs, attrs}); + } + shouldCheckForMemLeaks() { + return this.ENV.getBool("IS_TEST"); + } + checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) { + const numDataIdsAfter = this.backend.numDataIds(); + let numOutputDataIds = 0; + outInfos.forEach((info2) => { + numOutputDataIds += info2.dtype === "complex64" ? 3 : 1; + }); + const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]; + const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves; + if (dataIdsLeaked > 0) { + throw new Error(`Backend '${this.backendName}' has an internal memory leak (${dataIdsLeaked} data ids) after running '${kernelName}'`); + } + } + runKernelFunc(kernelParams) { + let outputs; + let saved = []; + const isTapeOn = this.isTapeOn(); + const startingBytecount = this.state.numBytes; + const startingNumTensors = this.state.numTensors; + if (this.shouldCheckForMemLeaks()) { + this.state.numDataMovesStack.push(0); + } + let kernelFunc3; + if (this.backendName == null) { + this.backend; + } + let out; + const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ? kernelParams.kernelName : this.state.activeScope != null ? this.state.activeScope.name : ""; + if (isRegisteredKernelInvocation(kernelParams)) { + const {kernelName, inputs: inputs2, attrs: attrs2} = kernelParams; + if (this.backendName == null) { + this.backend; + } + const kernel = getKernel(kernelName, this.backendName); + assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`); + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = kernel.kernelFunc({inputs: inputs2, attrs: attrs2, backend: this.backend}); + const outInfos = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos); + } + const outTensors = outInfos.map((outInfo) => { + if (outInfo.rank != null) { + return outInfo; + } + const {dataId, shape, dtype} = outInfo; + return this.makeTensorFromDataId(dataId, shape, dtype); + }); + if (isTapeOn) { + const tensorsToSave = this.getTensorsForGradient(kernelName, inputs2, outTensors); + saved = this.saveTensorsForBackwardMode(tensorsToSave); + } + return outTensors; + }; + } else { + const {forwardFunc} = kernelParams; + const saveFunc = (tensors) => { + if (!isTapeOn) { + return; + } + saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + }; + kernelFunc3 = () => { + const numDataIdsBefore = this.backend.numDataIds(); + out = this.tidy(() => forwardFunc(this.backend, saveFunc)); + const outs = Array.isArray(out) ? out : [out]; + if (this.shouldCheckForMemLeaks()) { + this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs); + } + return outs; + }; + } + const {inputs, attrs} = kernelParams; + const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ? null : kernelParams.backwardsFunc; + let kernelProfile; + this.scopedRun(() => this.state.kernelDepth++, () => this.state.kernelDepth--, () => { + if (!this.ENV.getBool("DEBUG") && !this.state.profiling) { + outputs = kernelFunc3(); + } else { + kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc3()); + if (this.ENV.getBool("DEBUG")) { + this.profiler.logKernelProfile(kernelProfile); + } + outputs = kernelProfile.outputs; + } + }); + if (isTapeOn) { + this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs); + } + if (this.state.profiling) { + this.state.activeProfile.kernels.push({ + name: kernelOrScopeName, + bytesAdded: this.state.numBytes - startingBytecount, + totalBytesSnapshot: this.state.numBytes, + tensorsAdded: this.state.numTensors - startingNumTensors, + totalTensorsSnapshot: this.state.numTensors, + inputShapes: Object.keys(inputs).map((key) => inputs[key] != null ? inputs[key].shape : null), + outputShapes: outputs.map((item) => item.shape), + kernelTimeMs: kernelProfile.timeMs, + extraInfo: kernelProfile.extraInfo + }); + } + return Array.isArray(out) ? outputs : outputs[0]; + } + saveTensorsForBackwardMode(tensors) { + const saved = tensors.map((tensor2) => this.keep(this.clone(tensor2))); + return saved; + } + getTensorsForGradient(kernelName, inputs, outputs) { + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + const inputsToSave = gradConfig.inputsToSave || []; + const outputsToSave = gradConfig.outputsToSave || []; + let inputTensorsToSave; + if (gradConfig.saveAllInputs) { + assert(Array.isArray(inputs), () => "saveAllInputs is true, expected inputs to be an array."); + inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]); + } else { + inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]); + } + const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]); + return inputTensorsToSave.concat(outputTensorsToSave); + } + return []; + } + makeTensor(values, shape, dtype, backend22) { + if (values == null) { + throw new Error("Values passed to engine.makeTensor() are null"); + } + dtype = dtype || "float32"; + backend22 = backend22 || this.backend; + let backendVals = values; + if (dtype === "string" && isString(values[0])) { + backendVals = values.map((d) => encodeString(d)); + } + const dataId = backend22.write(backendVals, shape, dtype); + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + if (dtype === "string") { + const info2 = this.state.tensorInfo.get(dataId); + const newBytes = bytesFromStringArray(backendVals); + this.state.numBytes += newBytes - info2.bytes; + info2.bytes = newBytes; + } + return t; + } + makeTensorFromDataId(dataId, shape, dtype, backend22) { + dtype = dtype || "float32"; + const t = new Tensor(shape, dtype, dataId, this.nextTensorId()); + this.trackTensor(t, backend22); + return t; + } + makeVariable(initialValue, trainable = true, name, dtype) { + name = name || this.nextVariableId().toString(); + if (dtype != null && dtype !== initialValue.dtype) { + initialValue = initialValue.cast(dtype); + } + const v = new Variable(initialValue, trainable, name, this.nextTensorId()); + if (this.state.registeredVariables[v.name] != null) { + throw new Error(`Variable with name ${v.name} was already registered`); + } + this.state.registeredVariables[v.name] = v; + this.incRef(v, this.backend); + return v; + } + trackTensor(a, backend22) { + this.state.numTensors++; + if (a.dtype === "string") { + this.state.numStringTensors++; + } + let bytes = 0; + if (a.dtype !== "complex64" && a.dtype !== "string") { + bytes = a.size * bytesPerElement(a.dtype); + } + this.state.numBytes += bytes; + if (!this.state.tensorInfo.has(a.dataId)) { + this.state.numDataBuffers++; + this.state.tensorInfo.set(a.dataId, { + backend: backend22 || this.backend, + dtype: a.dtype, + shape: a.shape, + bytes + }); + } + if (!(a instanceof Variable)) { + this.track(a); + } + } + incRef(a, backend22) { + this.trackTensor(a, backend22); + this.backend.incRef(a.dataId); + } + removeDataId(dataId, backend22) { + if (this.state.tensorInfo.has(dataId) && this.state.tensorInfo.get(dataId).backend === backend22) { + this.state.tensorInfo.delete(dataId); + this.state.numDataBuffers--; + } + } + disposeTensor(a) { + if (!this.state.tensorInfo.has(a.dataId)) { + return; + } + const info2 = this.state.tensorInfo.get(a.dataId); + this.state.numTensors--; + if (a.dtype === "string") { + this.state.numStringTensors--; + this.state.numBytes -= info2.bytes; + } + if (a.dtype !== "complex64" && a.dtype !== "string") { + const bytes = a.size * bytesPerElement(a.dtype); + this.state.numBytes -= bytes; + } + if (info2.backend.disposeData(a.dataId)) { + this.removeDataId(a.dataId, info2.backend); + } + } + disposeVariables() { + for (const varName in this.state.registeredVariables) { + const v = this.state.registeredVariables[varName]; + this.disposeVariable(v); + } + } + disposeVariable(v) { + this.disposeTensor(v); + if (this.state.registeredVariables[v.name] != null) { + delete this.state.registeredVariables[v.name]; + } + } + memory() { + const info2 = this.backend.memory(); + info2.numTensors = this.state.numTensors; + info2.numDataBuffers = this.state.numDataBuffers; + info2.numBytes = this.state.numBytes; + if (this.state.numStringTensors > 0) { + info2.unreliable = true; + if (info2.reasons == null) { + info2.reasons = []; + } + info2.reasons.push("Memory usage by string tensors is approximate (2 bytes per character)"); + } + return info2; + } + async profile(query) { + this.state.profiling = true; + const startBytes = this.state.numBytes; + const startNumTensors = this.state.numTensors; + this.state.activeProfile.kernels = []; + this.state.activeProfile.result = await query(); + this.state.profiling = false; + this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map((d) => d.totalBytesSnapshot)); + this.state.activeProfile.newBytes = this.state.numBytes - startBytes; + this.state.activeProfile.newTensors = this.state.numTensors - startNumTensors; + for (const kernel of this.state.activeProfile.kernels) { + kernel.kernelTimeMs = await kernel.kernelTimeMs; + kernel.extraInfo = await kernel.extraInfo; + } + return this.state.activeProfile; + } + isTapeOn() { + return this.state.gradientDepth > 0 && this.state.kernelDepth === 0; + } + addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) { + const tapeNode = {id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved}; + const gradConfig = getGradient(kernelName); + if (gradConfig != null) { + gradientsFunc = gradConfig.gradFunc; + } + if (gradientsFunc != null) { + tapeNode.gradient = (dys) => { + dys = dys.map((dy, i) => { + if (dy == null) { + const output = outputs[i]; + const vals = makeZerosTypedArray(output.size, output.dtype); + return this.makeTensor(vals, output.shape, output.dtype); + } + return dy; + }); + return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs); + }; + } + this.state.activeTape.push(tapeNode); + } + keep(result) { + result.kept = true; + return result; + } + startTape() { + if (this.state.gradientDepth === 0) { + this.state.activeTape = []; + } + this.state.gradientDepth++; + } + endTape() { + this.state.gradientDepth--; + } + startScope(name) { + const scopeInfo = { + track: [], + name: "unnamed scope", + id: this.state.nextScopeId++ + }; + if (name) { + scopeInfo.name = name; + } + this.state.scopeStack.push(scopeInfo); + this.state.activeScope = scopeInfo; + } + endScope(result) { + const tensorsToTrackInParent = getTensorsInContainer(result); + const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map((t) => t.id)); + for (let i = 0; i < this.state.activeScope.track.length; i++) { + const tensor2 = this.state.activeScope.track[i]; + if (!tensor2.kept && !tensorsToTrackInParentSet.has(tensor2.id)) { + tensor2.dispose(); + } + } + const oldScope = this.state.scopeStack.pop(); + this.state.activeScope = this.state.scopeStack.length === 0 ? null : this.state.scopeStack[this.state.scopeStack.length - 1]; + tensorsToTrackInParent.forEach((tensor2) => { + if (!tensor2.kept && tensor2.scopeId === oldScope.id) { + this.track(tensor2); + } + }); + } + gradients(f, xs, dy, allowNoGradients = false) { + assert(xs.length > 0, () => "gradients() received an empty list of xs."); + if (dy != null && dy.dtype !== "float32") { + throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`); + } + const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy("forward", f)); + assert(y instanceof Tensor, () => "The result y returned by f() must be a tensor."); + const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y); + if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) { + throw new Error("Cannot compute gradient of y=f(x) with respect to x. Make sure that the f you passed encloses all operations that lead from x to y."); + } + return this.tidy("backward", () => { + const accumulatedGradientMap = {}; + accumulatedGradientMap[y.id] = dy == null ? ones(y.shape) : dy; + backpropagateGradients(accumulatedGradientMap, filteredTape, (f2) => this.tidy(f2), add); + const grads2 = xs.map((x) => accumulatedGradientMap[x.id]); + if (this.state.gradientDepth === 0) { + this.state.activeTape.forEach((node) => { + for (const tensor2 of node.saved) { + tensor2.dispose(); + } + }); + this.state.activeTape = null; + } + return {value: y, grads: grads2}; + }); + } + customGrad(f) { + assert(isFunction(f), () => "The f passed in customGrad(f) must be a function."); + return (...inputs) => { + assert(inputs.every((t) => t instanceof Tensor), () => "The args passed in customGrad(f)(x1, x2,...) must all be tensors"); + let res; + const inputMap = {}; + inputs.forEach((input2, i) => { + inputMap[i] = input2; + }); + const forwardFunc = (_, save) => { + res = f(...[...inputs, save]); + assert(res.value instanceof Tensor, () => "The function f passed in customGrad(f) must return an object where `obj.value` is a tensor"); + assert(isFunction(res.gradFunc), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function."); + return res.value; + }; + const backwardsFunc = (dy, saved) => { + const gradRes = res.gradFunc(dy, saved); + const grads2 = Array.isArray(gradRes) ? gradRes : [gradRes]; + assert(grads2.length === inputs.length, () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns the same number of tensors as inputs passed to f(...)."); + assert(grads2.every((t) => t instanceof Tensor), () => "The function f passed in customGrad(f) must return an object where `obj.gradFunc` is a function that returns a list of only tensors."); + const gradMap = {}; + grads2.forEach((grad2, i) => { + gradMap[i] = () => grad2; + }); + return gradMap; + }; + return this.runKernelFunc({ + forwardFunc, + backwardsFunc, + inputs: inputMap + }); + }; + } + readSync(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.readSync(dataId); + } + read(dataId) { + const info2 = this.state.tensorInfo.get(dataId); + return info2.backend.read(dataId); + } + async time(query) { + const start = now2(); + const timingInfo = await this.backend.time(query); + timingInfo.wallMs = now2() - start; + return timingInfo; + } + track(result) { + if (this.state.activeScope != null) { + result.scopeId = this.state.activeScope.id; + this.state.activeScope.track.push(result); + } + return result; + } + get registeredVariables() { + return this.state.registeredVariables; + } + reset() { + this.pendingBackendInitId++; + this.state.dispose(); + this.ENV.reset(); + this.state = new EngineState(); + for (const backendName in this.registry) { + this.disposeRegisteredKernels(backendName); + this.registry[backendName].dispose(); + delete this.registry[backendName]; + } + this.backendName = null; + this.backendInstance = null; + this.pendingBackendInit = null; + } + }; + Engine.nextTensorId = 0; + Engine.nextVariableId = 0; + function ones(shape) { + const values = makeOnesTypedArray(sizeFromShape(shape), "float32"); + return ENGINE.makeTensor(values, shape, "float32"); + } + function getOrMakeEngine() { + const ns = getGlobalNamespace(); + if (ns._tfengine == null) { + const environment = new Environment(ns); + ns._tfengine = new Engine(environment); + } + setEnvironmentGlobal(ns._tfengine.ENV); + setTensorTracker(() => ns._tfengine); + return ns._tfengine; + } + var ENGINE = getOrMakeEngine(); + function add(a, b) { + const inputs = {a, b}; + return ENGINE.runKernel(Add, inputs); + } + var device_util_exports = {}; + __export2(device_util_exports, { + isBrowser: () => isBrowser, + isMobile: () => isMobile + }); + /** + * @license + * Copyright 2017 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function _isNavigatorDefined() { + return typeof navigator !== "undefined" && navigator != null; + } + function isMobile() { + if (_isNavigatorDefined()) { + const a = navigator.userAgent || navigator.vendor || window.opera; + return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)); + } + return false; + } + function isBrowser() { + return typeof window !== "undefined" && window.document != null || typeof WorkerGlobalScope !== "undefined"; + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var ENV2 = env(); + ENV2.registerFlag("DEBUG", () => false, (debugValue) => { + if (debugValue) { + console.warn("Debugging mode is ON. The output of every math call will be downloaded to CPU and checked for NaNs. This significantly impacts performance."); + } + }); + ENV2.registerFlag("IS_BROWSER", () => isBrowser()); + ENV2.registerFlag("IS_NODE", () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined"); + ENV2.registerFlag("IS_CHROME", () => typeof navigator !== "undefined" && navigator != null && navigator.userAgent != null && /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor)); + ENV2.registerFlag("PROD", () => false); + ENV2.registerFlag("TENSORLIKE_CHECK_SHAPE_CONSISTENCY", () => ENV2.getBool("DEBUG")); + ENV2.registerFlag("DEPRECATION_WARNINGS_ENABLED", () => true); + ENV2.registerFlag("IS_TEST", () => false); + ENV2.registerFlag("CHECK_COMPUTATION_FOR_ERRORS", () => true); + ENV2.registerFlag("WRAP_TO_IMAGEBITMAP", () => false); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function inferShape(val, dtype) { + let firstElem = val; + if (isTypedArray(val)) { + return dtype === "string" ? [] : [val.length]; + } + if (!Array.isArray(val)) { + return []; + } + const shape = []; + while (Array.isArray(firstElem) || isTypedArray(firstElem) && dtype !== "string") { + shape.push(firstElem.length); + firstElem = firstElem[0]; + } + if (Array.isArray(val) && env().getBool("TENSORLIKE_CHECK_SHAPE_CONSISTENCY")) { + deepAssertShapeConsistency(val, shape, []); + } + return shape; + } + function deepAssertShapeConsistency(val, shape, indices) { + indices = indices || []; + if (!Array.isArray(val) && !isTypedArray(val)) { + assert(shape.length === 0, () => `Element arr[${indices.join("][")}] is a primitive, but should be an array/TypedArray of ${shape[0]} elements`); + return; + } + assert(shape.length > 0, () => `Element arr[${indices.join("][")}] should be a primitive, but is an array of ${val.length} elements`); + assert(val.length === shape[0], () => `Element arr[${indices.join("][")}] should have ${shape[0]} elements, but has ${val.length} elements`); + const subShape = shape.slice(1); + for (let i = 0; i < val.length; ++i) { + deepAssertShapeConsistency(val[i], subShape, indices.concat(i)); + } + } + function assertDtype(expectedDtype, actualDType, argName, functionName) { + if (expectedDtype === "string_or_numeric") { + return; + } + if (expectedDtype == null) { + throw new Error(`Expected dtype cannot be null.`); + } + if (expectedDtype !== "numeric" && expectedDtype !== actualDType || expectedDtype === "numeric" && actualDType === "string") { + throw new Error(`Argument '${argName}' passed to '${functionName}' must be ${expectedDtype} tensor, but got ${actualDType} tensor`); + } + } + function convertToTensor(x, argName, functionName, parseAsDtype = "numeric") { + if (x instanceof Tensor) { + assertDtype(parseAsDtype, x.dtype, argName, functionName); + return x; + } + let inferredDtype = inferDtype(x); + if (inferredDtype !== "string" && ["bool", "int32", "float32"].indexOf(parseAsDtype) >= 0) { + inferredDtype = parseAsDtype; + } + assertDtype(parseAsDtype, inferredDtype, argName, functionName); + if (x == null || !isTypedArray(x) && !Array.isArray(x) && typeof x !== "number" && typeof x !== "boolean" && typeof x !== "string") { + const type = x == null ? "null" : x.constructor.name; + throw new Error(`Argument '${argName}' passed to '${functionName}' must be a Tensor or TensorLike, but got '${type}'`); + } + const inferredShape = inferShape(x, inferredDtype); + if (!isTypedArray(x) && !Array.isArray(x)) { + x = [x]; + } + const skipTypedArray = true; + const values = inferredDtype !== "string" ? toTypedArray(x, inferredDtype) : flatten(x, [], skipTypedArray); + return ENGINE.makeTensor(values, inferredShape, inferredDtype); + } + function convertToTensorArray(arg, argName, functionName, parseAsDtype = "numeric") { + if (!Array.isArray(arg)) { + throw new Error(`Argument ${argName} passed to ${functionName} must be a \`Tensor[]\` or \`TensorLike[]\``); + } + const tensors = arg; + return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype)); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var OP_SCOPE_SUFFIX = "__op"; + function op(f) { + const keys = Object.keys(f); + if (keys.length !== 1) { + throw new Error(`Please provide an object with a single key (operation name) mapping to a function. Got an object with ${keys.length} keys.`); + } + let opName = keys[0]; + const fn = f[opName]; + if (opName.endsWith("_")) { + opName = opName.substring(0, opName.length - 1); + } + opName = opName + OP_SCOPE_SUFFIX; + const f2 = (...args) => { + ENGINE.startScope(opName); + try { + const result = fn(...args); + if (isPromise(result)) { + console.error("Cannot return a Promise inside of tidy."); + } + ENGINE.endScope(result); + return result; + } catch (ex) { + ENGINE.endScope(null); + throw ex; + } + }; + Object.defineProperty(f2, "name", {value: opName, configurable: true}); + return f2; + } + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function complex_(real4, imag4) { + const $real = convertToTensor(real4, "real", "complex"); + const $imag = convertToTensor(imag4, "imag", "complex"); + assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, must match in call to tf.complex().`); + const inputs = {real: $real, imag: $imag}; + return ENGINE.runKernel(Complex, inputs); + } + var complex = op({complex_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function makeTensor(values, shape, inferredShape, dtype) { + if (dtype == null) { + dtype = inferDtype(values); + } + if (dtype === "complex64") { + throw new Error(`Cannot construct a complex64 tensor directly. Please use tf.complex(real, imag).`); + } + if (!isTypedArray(values) && !Array.isArray(values) && typeof values !== "number" && typeof values !== "boolean" && typeof values !== "string") { + throw new Error("values passed to tensor(values) must be a number/boolean/string or an array of numbers/booleans/strings, or a TypedArray"); + } + if (shape != null) { + assertNonNegativeIntegerDimensions(shape); + const providedSize = sizeFromShape(shape); + const inferredSize = sizeFromShape(inferredShape); + assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ${providedSize} values but has ${inferredSize}`); + for (let i = 0; i < inferredShape.length; ++i) { + const inferred = inferredShape[i]; + const flatDimsDontMatch = i === inferredShape.length - 1 ? inferred !== sizeFromShape(shape.slice(i)) : true; + assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape (${inferredShape}) does not match the provided shape (${shape}). `); + } + } + if (!isTypedArray(values) && !Array.isArray(values)) { + values = [values]; + } + shape = shape || inferredShape; + values = dtype !== "string" ? toTypedArray(values, dtype) : flatten(values, [], true); + return ENGINE.makeTensor(values, shape, dtype); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function tensor(values, shape, dtype) { + const inferredShape = inferShape(values, dtype); + return makeTensor(values, shape, inferredShape, dtype); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var DTYPE_VALUE_SIZE_MAP = { + float32: 4, + float16: 2, + int32: 4, + uint16: 2, + uint8: 1, + bool: 1, + complex64: 8 + }; + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var NUM_BYTES_STRING_LENGTH = 4; + async function encodeWeights(tensors, group) { + const specs = []; + const dataPromises = []; + const names = Array.isArray(tensors) ? tensors.map((tensor2) => tensor2.name) : Object.keys(tensors); + for (let i = 0; i < names.length; ++i) { + const name = names[i]; + const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name]; + if (t.dtype !== "float32" && t.dtype !== "int32" && t.dtype !== "bool" && t.dtype !== "string" && t.dtype !== "complex64") { + throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`); + } + const spec = {name, shape: t.shape, dtype: t.dtype}; + if (t.dtype === "string") { + const utf8bytes = new Promise(async (resolve) => { + const vals = await t.bytes(); + const totalNumBytes = vals.reduce((p2, c) => p2 + c.length, 0) + NUM_BYTES_STRING_LENGTH * vals.length; + const bytes = new Uint8Array(totalNumBytes); + let offset = 0; + for (let i2 = 0; i2 < vals.length; i2++) { + const val = vals[i2]; + const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer); + bytes.set(bytesOfLength, offset); + offset += NUM_BYTES_STRING_LENGTH; + bytes.set(val, offset); + offset += val.length; + } + resolve(bytes); + }); + dataPromises.push(utf8bytes); + } else { + dataPromises.push(t.data()); + } + if (group != null) { + spec.group = group; + } + specs.push(spec); + } + const tensorValues = await Promise.all(dataPromises); + return {data: concatenateTypedArrays(tensorValues), specs}; + } + function decodeWeights(buffer2, specs) { + const out = {}; + let float16Decode; + let offset = 0; + for (const spec of specs) { + const name = spec.name; + const dtype = spec.dtype; + const shape = spec.shape; + const size = sizeFromShape(shape); + let values; + if ("quantization" in spec) { + const quantization = spec.quantization; + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + if (!("min" in quantization && "scale" in quantization)) { + throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} doesn't have corresponding metadata min and scale.`); + } + } else if (quantization.dtype === "float16") { + if (dtype !== "float32") { + throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} which only supports weights of type float32 not ${dtype}.`); + } + } else { + throw new Error(`Weight ${spec.name} has unknown quantization dtype ${quantization.dtype}. Supported quantization dtypes are: 'uint8', 'uint16', and 'float16'.`); + } + const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * quantizationSizeFactor); + const quantizedArray = quantization.dtype === "uint8" ? new Uint8Array(byteBuffer) : new Uint16Array(byteBuffer); + if (dtype === "float32") { + if (quantization.dtype === "uint8" || quantization.dtype === "uint16") { + values = new Float32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = v * quantization.scale + quantization.min; + } + } else if (quantization.dtype === "float16") { + if (float16Decode === void 0) { + float16Decode = getFloat16Decoder(); + } + values = float16Decode(quantizedArray); + } else { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type float32.`); + } + } else if (dtype === "int32") { + if (quantization.dtype !== "uint8" && quantization.dtype !== "uint16") { + throw new Error(`Unsupported quantization type ${quantization.dtype} for weight type int32.`); + } + values = new Int32Array(quantizedArray.length); + for (let i = 0; i < quantizedArray.length; i++) { + const v = quantizedArray[i]; + values[i] = Math.round(v * quantization.scale + quantization.min); + } + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * quantizationSizeFactor; + } else if (dtype === "string") { + const size2 = sizeFromShape(spec.shape); + values = []; + for (let i = 0; i < size2; i++) { + const byteLength = new Uint32Array(buffer2.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0]; + offset += NUM_BYTES_STRING_LENGTH; + const bytes = new Uint8Array(buffer2.slice(offset, offset + byteLength)); + values.push(bytes); + offset += byteLength; + } + } else { + const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype]; + const byteBuffer = buffer2.slice(offset, offset + size * dtypeFactor); + if (dtype === "float32") { + values = new Float32Array(byteBuffer); + } else if (dtype === "int32") { + values = new Int32Array(byteBuffer); + } else if (dtype === "bool") { + values = new Uint8Array(byteBuffer); + } else if (dtype === "complex64") { + values = new Float32Array(byteBuffer); + const real4 = new Float32Array(values.length / 2); + const image3 = new Float32Array(values.length / 2); + for (let i = 0; i < real4.length; i++) { + real4[i] = values[i * 2]; + image3[i] = values[i * 2 + 1]; + } + const realTensor = tensor(real4, shape, "float32"); + const imageTensor = tensor(image3, shape, "float32"); + out[name] = complex(realTensor, imageTensor); + realTensor.dispose(); + imageTensor.dispose(); + } else { + throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`); + } + offset += size * dtypeFactor; + } + if (dtype !== "complex64") { + out[name] = tensor(values, shape, dtype); + } + } + return out; + } + function concatenateTypedArrays(xs) { + if (xs === null) { + throw new Error(`Invalid input value: ${JSON.stringify(xs)}`); + } + let totalByteLength = 0; + const normalizedXs = []; + xs.forEach((x) => { + totalByteLength += x.byteLength; + normalizedXs.push(x.byteLength === x.buffer.byteLength ? x : new x.constructor(x)); + if (!(x instanceof Float32Array || x instanceof Int32Array || x instanceof Uint8Array)) { + throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`); + } + }); + const y = new Uint8Array(totalByteLength); + let offset = 0; + normalizedXs.forEach((x) => { + y.set(new Uint8Array(x.buffer), offset); + offset += x.byteLength; + }); + return y.buffer; + } + var useNodeBuffer = typeof Buffer !== "undefined" && (typeof Blob === "undefined" || typeof atob === "undefined" || typeof btoa === "undefined"); + function stringByteLength(str) { + if (useNodeBuffer) { + return Buffer.byteLength(str); + } + return new Blob([str]).size; + } + function arrayBufferToBase64String(buffer2) { + if (useNodeBuffer) { + return Buffer.from(buffer2).toString("base64"); + } + const buf = new Uint8Array(buffer2); + let s = ""; + for (let i = 0, l = buf.length; i < l; i++) { + s += String.fromCharCode(buf[i]); + } + return btoa(s); + } + function base64StringToArrayBuffer(str) { + if (useNodeBuffer) { + const buf = Buffer.from(str, "base64"); + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + } + const s = atob(str); + const buffer2 = new Uint8Array(s.length); + for (let i = 0; i < s.length; ++i) { + buffer2.set([s.charCodeAt(i)], i); + } + return buffer2.buffer; + } + function concatenateArrayBuffers(buffers) { + if (buffers.length === 1) { + return buffers[0]; + } + let totalByteLength = 0; + buffers.forEach((buffer2) => { + totalByteLength += buffer2.byteLength; + }); + const temp = new Uint8Array(totalByteLength); + let offset = 0; + buffers.forEach((buffer2) => { + temp.set(new Uint8Array(buffer2), offset); + offset += buffer2.byteLength; + }); + return temp.buffer; + } + function basename(path) { + const SEPARATOR = "/"; + path = path.trim(); + while (path.endsWith(SEPARATOR)) { + path = path.slice(0, path.length - 1); + } + const items = path.split(SEPARATOR); + return items[items.length - 1]; + } + function getModelArtifactsInfoForJSON(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("Expected JSON model topology, received ArrayBuffer."); + } + return { + dateSaved: new Date(), + modelTopologyType: "JSON", + modelTopologyBytes: modelArtifacts.modelTopology == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.modelTopology)), + weightSpecsBytes: modelArtifacts.weightSpecs == null ? 0 : stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)), + weightDataBytes: modelArtifacts.weightData == null ? 0 : modelArtifacts.weightData.byteLength + }; + } + function computeFloat16MantisaTable() { + const convertMantissa = (i) => { + let m = i << 13; + let e = 0; + while ((m & 8388608) === 0) { + e -= 8388608; + m <<= 1; + } + m &= ~8388608; + e += 947912704; + return m | e; + }; + const mantisaTable = new Uint32Array(2048); + mantisaTable[0] = 0; + for (let i = 1; i < 1024; i++) { + mantisaTable[i] = convertMantissa(i); + } + for (let i = 1024; i < 2048; i++) { + mantisaTable[i] = 939524096 + (i - 1024 << 13); + } + return mantisaTable; + } + function computeFloat16ExponentTable() { + const exponentTable = new Uint32Array(64); + exponentTable[0] = 0; + exponentTable[31] = 1199570944; + exponentTable[32] = 2147483648; + exponentTable[63] = 3347054592; + for (let i = 1; i < 31; i++) { + exponentTable[i] = i << 23; + } + for (let i = 33; i < 63; i++) { + exponentTable[i] = 2147483648 + (i - 32 << 23); + } + return exponentTable; + } + function computeFloat16OffsetTable() { + const offsetTable = new Uint32Array(64); + for (let i = 0; i < 64; i++) { + offsetTable[i] = 1024; + } + offsetTable[0] = offsetTable[32] = 0; + return offsetTable; + } + function getFloat16Decoder() { + const mantisaTable = computeFloat16MantisaTable(); + const exponentTable = computeFloat16ExponentTable(); + const offsetTable = computeFloat16OffsetTable(); + return (quantizedArray) => { + const buffer2 = new ArrayBuffer(4 * quantizedArray.length); + const bufferUint32View = new Uint32Array(buffer2); + for (let index = 0; index < quantizedArray.length; index++) { + const float16Bits = quantizedArray[index]; + const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 1023)] + exponentTable[float16Bits >> 10]; + bufferUint32View[index] = float32Bits; + } + return new Float32Array(buffer2); + }; + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var IORouterRegistry = class { + constructor() { + this.saveRouters = []; + this.loadRouters = []; + } + static getInstance() { + if (IORouterRegistry.instance == null) { + IORouterRegistry.instance = new IORouterRegistry(); + } + return IORouterRegistry.instance; + } + static registerSaveRouter(saveRouter) { + IORouterRegistry.getInstance().saveRouters.push(saveRouter); + } + static registerLoadRouter(loadRouter) { + IORouterRegistry.getInstance().loadRouters.push(loadRouter); + } + static getSaveHandlers(url) { + return IORouterRegistry.getHandlers(url, "save"); + } + static getLoadHandlers(url, loadOptions) { + return IORouterRegistry.getHandlers(url, "load", loadOptions); + } + static getHandlers(url, handlerType, loadOptions) { + const validHandlers = []; + const routers = handlerType === "load" ? IORouterRegistry.getInstance().loadRouters : IORouterRegistry.getInstance().saveRouters; + routers.forEach((router) => { + const handler = router(url, loadOptions); + if (handler !== null) { + validHandlers.push(handler); + } + }); + return validHandlers; + } + }; + var registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter); + var registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter); + var getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url); + var getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var DATABASE_NAME = "tensorflowjs"; + var DATABASE_VERSION = 1; + var MODEL_STORE_NAME = "models_store"; + var INFO_STORE_NAME = "model_info_store"; + function getIndexedDBFactory() { + if (!env().getBool("IS_BROWSER")) { + throw new Error("Failed to obtain IndexedDB factory because the current environmentis not a web browser."); + } + const theWindow = typeof window === "undefined" ? self : window; + const factory = theWindow.indexedDB || theWindow.mozIndexedDB || theWindow.webkitIndexedDB || theWindow.msIndexedDB || theWindow.shimIndexedDB; + if (factory == null) { + throw new Error("The current browser does not appear to support IndexedDB."); + } + return factory; + } + function setUpDatabase(openRequest) { + const db = openRequest.result; + db.createObjectStore(MODEL_STORE_NAME, {keyPath: "modelPath"}); + db.createObjectStore(INFO_STORE_NAME, {keyPath: "modelPath"}); + } + var BrowserIndexedDB = class { + constructor(modelPath) { + this.indexedDB = getIndexedDBFactory(); + if (modelPath == null || !modelPath) { + throw new Error("For IndexedDB, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } + return this.databaseAction(this.modelPath, modelArtifacts); + } + async load() { + return this.databaseAction(this.modelPath); + } + databaseAction(modelPath, modelArtifacts) { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + if (modelArtifacts == null) { + const modelTx = db.transaction(MODEL_STORE_NAME, "readonly"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const getRequest = modelStore.get(this.modelPath); + getRequest.onsuccess = () => { + if (getRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${this.modelPath}' in IndexedDB.`)); + } else { + resolve(getRequest.result.modelArtifacts); + } + }; + getRequest.onerror = (error) => { + db.close(); + return reject(getRequest.error); + }; + modelTx.oncomplete = () => db.close(); + } else { + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + let infoStore = infoTx.objectStore(INFO_STORE_NAME); + const putInfoRequest = infoStore.put({modelPath: this.modelPath, modelArtifactsInfo}); + let modelTx; + putInfoRequest.onsuccess = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const putModelRequest = modelStore.put({ + modelPath: this.modelPath, + modelArtifacts, + modelArtifactsInfo + }); + putModelRequest.onsuccess = () => resolve({modelArtifactsInfo}); + putModelRequest.onerror = (error) => { + infoStore = infoTx.objectStore(INFO_STORE_NAME); + const deleteInfoRequest = infoStore.delete(this.modelPath); + deleteInfoRequest.onsuccess = () => { + db.close(); + return reject(putModelRequest.error); + }; + deleteInfoRequest.onerror = (error2) => { + db.close(); + return reject(putModelRequest.error); + }; + }; + }; + putInfoRequest.onerror = (error) => { + db.close(); + return reject(putInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + } + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + }; + BrowserIndexedDB.URL_SCHEME = "indexeddb://"; + var indexedDBRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) { + return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length)); + } else { + return null; + } + } + }; + IORouterRegistry.registerSaveRouter(indexedDBRouter); + IORouterRegistry.registerLoadRouter(indexedDBRouter); + function browserIndexedDB(modelPath) { + return new BrowserIndexedDB(modelPath); + } + function maybeStripScheme(key) { + return key.startsWith(BrowserIndexedDB.URL_SCHEME) ? key.slice(BrowserIndexedDB.URL_SCHEME.length) : key; + } + var BrowserIndexedDBManager = class { + constructor() { + this.indexedDB = getIndexedDBFactory(); + } + async listModels() { + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const tx = db.transaction(INFO_STORE_NAME, "readonly"); + const store = tx.objectStore(INFO_STORE_NAME); + const getAllInfoRequest = store.getAll(); + getAllInfoRequest.onsuccess = () => { + const out = {}; + for (const item of getAllInfoRequest.result) { + out[item.modelPath] = item.modelArtifactsInfo; + } + resolve(out); + }; + getAllInfoRequest.onerror = (error) => { + db.close(); + return reject(getAllInfoRequest.error); + }; + tx.oncomplete = () => db.close(); + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + async removeModel(path) { + path = maybeStripScheme(path); + return new Promise((resolve, reject) => { + const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION); + openRequest.onupgradeneeded = () => setUpDatabase(openRequest); + openRequest.onsuccess = () => { + const db = openRequest.result; + const infoTx = db.transaction(INFO_STORE_NAME, "readwrite"); + const infoStore = infoTx.objectStore(INFO_STORE_NAME); + const getInfoRequest = infoStore.get(path); + let modelTx; + getInfoRequest.onsuccess = () => { + if (getInfoRequest.result == null) { + db.close(); + return reject(new Error(`Cannot find model with path '${path}' in IndexedDB.`)); + } else { + const deleteInfoRequest = infoStore.delete(path); + const deleteModelData = () => { + modelTx = db.transaction(MODEL_STORE_NAME, "readwrite"); + const modelStore = modelTx.objectStore(MODEL_STORE_NAME); + const deleteModelRequest = modelStore.delete(path); + deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo); + deleteModelRequest.onerror = (error) => reject(getInfoRequest.error); + }; + deleteInfoRequest.onsuccess = deleteModelData; + deleteInfoRequest.onerror = (error) => { + deleteModelData(); + db.close(); + return reject(getInfoRequest.error); + }; + } + }; + getInfoRequest.onerror = (error) => { + db.close(); + return reject(getInfoRequest.error); + }; + infoTx.oncomplete = () => { + if (modelTx == null) { + db.close(); + } else { + modelTx.oncomplete = () => db.close(); + } + }; + }; + openRequest.onerror = (error) => reject(openRequest.error); + }); + } + }; + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var PATH_SEPARATOR = "/"; + var PATH_PREFIX = "tensorflowjs_models"; + var INFO_SUFFIX = "info"; + var MODEL_TOPOLOGY_SUFFIX = "model_topology"; + var WEIGHT_SPECS_SUFFIX = "weight_specs"; + var WEIGHT_DATA_SUFFIX = "weight_data"; + var MODEL_METADATA_SUFFIX = "model_metadata"; + function getModelKeys(path) { + return { + info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR), + topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR), + weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR), + weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR), + modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR) + }; + } + function getModelPathFromKey(key) { + const items = key.split(PATH_SEPARATOR); + if (items.length < 3) { + throw new Error(`Invalid key format: ${key}`); + } + return items.slice(1, items.length - 1).join(PATH_SEPARATOR); + } + function maybeStripScheme2(key) { + return key.startsWith(BrowserLocalStorage.URL_SCHEME) ? key.slice(BrowserLocalStorage.URL_SCHEME.length) : key; + } + var BrowserLocalStorage = class { + constructor(modelPath) { + if (!env().getBool("IS_BROWSER") || typeof window === "undefined" || typeof window.localStorage === "undefined") { + throw new Error("The current environment does not support local storage."); + } + this.LS = window.localStorage; + if (modelPath == null || !modelPath) { + throw new Error("For local storage, modelPath must not be null, undefined or empty."); + } + this.modelPath = modelPath; + this.keys = getModelKeys(this.modelPath); + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserLocalStorage.save() does not support saving model topology in binary formats yet."); + } else { + const topology = JSON.stringify(modelArtifacts.modelTopology); + const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs); + const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts); + try { + this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo)); + this.LS.setItem(this.keys.topology, topology); + this.LS.setItem(this.keys.weightSpecs, weightSpecs); + this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData)); + const result = { + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy + }; + if (modelArtifacts.signature != null) { + result.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + result.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + result.modelInitializer = modelArtifacts.modelInitializer; + } + this.LS.setItem(this.keys.modelMetadata, JSON.stringify(result)); + return {modelArtifactsInfo}; + } catch (err) { + this.LS.removeItem(this.keys.info); + this.LS.removeItem(this.keys.topology); + this.LS.removeItem(this.keys.weightSpecs); + this.LS.removeItem(this.keys.weightData); + this.LS.removeItem(this.keys.modelMetadata); + throw new Error(`Failed to save model '${this.modelPath}' to local storage: size quota being exceeded is a possible cause of this failure: modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`); + } + } + } + async load() { + const info2 = JSON.parse(this.LS.getItem(this.keys.info)); + if (info2 == null) { + throw new Error(`In local storage, there is no model with name '${this.modelPath}'`); + } + if (info2.modelTopologyType !== "JSON") { + throw new Error("BrowserLocalStorage does not support loading non-JSON model topology yet."); + } + const out = {}; + const topology = JSON.parse(this.LS.getItem(this.keys.topology)); + if (topology == null) { + throw new Error(`In local storage, the topology of model '${this.modelPath}' is missing.`); + } + out.modelTopology = topology; + const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs)); + if (weightSpecs == null) { + throw new Error(`In local storage, the weight specs of model '${this.modelPath}' are missing.`); + } + out.weightSpecs = weightSpecs; + const metadataString = this.LS.getItem(this.keys.modelMetadata); + if (metadataString != null) { + const metadata = JSON.parse(metadataString); + out.format = metadata["format"]; + out.generatedBy = metadata["generatedBy"]; + out.convertedBy = metadata["convertedBy"]; + if (metadata["signature"] != null) { + out.signature = metadata["signature"]; + } + if (metadata["userDefinedMetadata"] != null) { + out.userDefinedMetadata = metadata["userDefinedMetadata"]; + } + if (metadata["modelInitializer"] != null) { + out.modelInitializer = metadata["modelInitializer"]; + } + } + const weightDataBase64 = this.LS.getItem(this.keys.weightData); + if (weightDataBase64 == null) { + throw new Error(`In local storage, the binary weight values of model '${this.modelPath}' are missing.`); + } + out.weightData = base64StringToArrayBuffer(weightDataBase64); + return out; + } + }; + BrowserLocalStorage.URL_SCHEME = "localstorage://"; + var localStorageRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) { + return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length)); + } else { + return null; + } + } + }; + IORouterRegistry.registerSaveRouter(localStorageRouter); + IORouterRegistry.registerLoadRouter(localStorageRouter); + function browserLocalStorage(modelPath) { + return new BrowserLocalStorage(modelPath); + } + var BrowserLocalStorageManager = class { + constructor() { + assert(env().getBool("IS_BROWSER"), () => "Current environment is not a web browser"); + assert(typeof window === "undefined" || typeof window.localStorage !== "undefined", () => "Current browser does not appear to support localStorage"); + this.LS = window.localStorage; + } + async listModels() { + const out = {}; + const prefix = PATH_PREFIX + PATH_SEPARATOR; + const suffix = PATH_SEPARATOR + INFO_SUFFIX; + for (let i = 0; i < this.LS.length; ++i) { + const key = this.LS.key(i); + if (key.startsWith(prefix) && key.endsWith(suffix)) { + const modelPath = getModelPathFromKey(key); + out[modelPath] = JSON.parse(this.LS.getItem(key)); + } + } + return out; + } + async removeModel(path) { + path = maybeStripScheme2(path); + const keys = getModelKeys(path); + if (this.LS.getItem(keys.info) == null) { + throw new Error(`Cannot find model at path '${path}'`); + } + const info2 = JSON.parse(this.LS.getItem(keys.info)); + this.LS.removeItem(keys.info); + this.LS.removeItem(keys.topology); + this.LS.removeItem(keys.weightSpecs); + this.LS.removeItem(keys.weightData); + return info2; + } + }; + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var URL_SCHEME_SUFFIX = "://"; + var ModelStoreManagerRegistry = class { + constructor() { + this.managers = {}; + } + static getInstance() { + if (ModelStoreManagerRegistry.instance == null) { + ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry(); + } + return ModelStoreManagerRegistry.instance; + } + static registerManager(scheme, manager) { + assert(scheme != null, () => "scheme must not be undefined or null."); + if (scheme.endsWith(URL_SCHEME_SUFFIX)) { + scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX)); + } + assert(scheme.length > 0, () => "scheme must not be an empty string."); + const registry = ModelStoreManagerRegistry.getInstance(); + assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`); + registry.managers[scheme] = manager; + } + static getManager(scheme) { + const manager = this.getInstance().managers[scheme]; + if (manager == null) { + throw new Error(`Cannot find model manager for scheme '${scheme}'`); + } + return manager; + } + static getSchemes() { + return Object.keys(this.getInstance().managers); + } + }; + function parseURL(url) { + if (url.indexOf(URL_SCHEME_SUFFIX) === -1) { + throw new Error(`The url string provided does not contain a scheme. Supported schemes are: ${ModelStoreManagerRegistry.getSchemes().join(",")}`); + } + return { + scheme: url.split(URL_SCHEME_SUFFIX)[0], + path: url.split(URL_SCHEME_SUFFIX)[1] + }; + } + async function cloneModelInternal(sourceURL, destURL, deleteSource = false) { + assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`); + const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL); + assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`); + assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) load handlers for source URL ${sourceURL}.`); + const loadHandler = loadHandlers[0]; + const saveHandlers = IORouterRegistry.getSaveHandlers(destURL); + assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination URL ${destURL}.`); + assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) save handlers for destination URL ${destURL}.`); + const saveHandler = saveHandlers[0]; + const sourceScheme = parseURL(sourceURL).scheme; + const sourcePath = parseURL(sourceURL).path; + const sameMedium = sourceScheme === parseURL(sourceURL).scheme; + const modelArtifacts = await loadHandler.load(); + if (deleteSource && sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + const saveResult = await saveHandler.save(modelArtifacts); + if (deleteSource && !sameMedium) { + await ModelStoreManagerRegistry.getManager(sourceScheme).removeModel(sourcePath); + } + return saveResult.modelArtifactsInfo; + } + async function listModels() { + const schemes = ModelStoreManagerRegistry.getSchemes(); + const out = {}; + for (const scheme of schemes) { + const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels(); + for (const path in schemeOut) { + const url = scheme + URL_SCHEME_SUFFIX + path; + out[url] = schemeOut[path]; + } + } + return out; + } + async function removeModel(url) { + const schemeAndPath = parseURL(url); + const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme); + return manager.removeModel(schemeAndPath.path); + } + async function copyModel(sourceURL, destURL) { + const deleteSource = false; + return cloneModelInternal(sourceURL, destURL, deleteSource); + } + async function moveModel(sourceURL, destURL) { + const deleteSource = true; + return cloneModelInternal(sourceURL, destURL, deleteSource); + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var PlatformBrowser = class { + fetch(path, init2) { + return fetch(path, init2); + } + now() { + return performance.now(); + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`); + } + if (this.textEncoder == null) { + this.textEncoder = new TextEncoder(); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + return new TextDecoder(encoding).decode(bytes); + } + }; + if (env().get("IS_BROWSER")) { + env().setPlatform("browser", new PlatformBrowser()); + try { + ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager()); + } catch (err) { + } + try { + ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager()); + } catch (err) { + } + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var getNodeFetch = { + importFetch: () => require_browser() + }; + var systemFetch; + var PlatformNode = class { + constructor() { + this.util = require("util"); + this.textEncoder = new this.util.TextEncoder(); + } + fetch(path, requestInits) { + if (env().global.fetch != null) { + return env().global.fetch(path, requestInits); + } + if (systemFetch == null) { + systemFetch = getNodeFetch.importFetch(); + } + return systemFetch(path, requestInits); + } + now() { + const time2 = process.hrtime(); + return time2[0] * 1e3 + time2[1] / 1e6; + } + encode(text, encoding) { + if (encoding !== "utf-8" && encoding !== "utf8") { + throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`); + } + return this.textEncoder.encode(text); + } + decode(bytes, encoding) { + if (bytes.length === 0) { + return ""; + } + return new this.util.TextDecoder(encoding).decode(bytes); + } + }; + if (env().get("IS_NODE")) { + env().setPlatform("node", new PlatformNode()); + } + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function buffer(shape, dtype = "float32", values) { + dtype = dtype || "float32"; + assertNonNegativeIntegerDimensions(shape); + return new TensorBuffer(shape, dtype, values); + } + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function cast_(x, dtype) { + const $x = convertToTensor(x, "x", "cast"); + if (!isValidDtype(dtype)) { + throw new Error(`Failed to cast to unknown dtype ${dtype}`); + } + if (dtype === "string" && $x.dtype !== "string" || dtype !== "string" && $x.dtype === "string") { + throw new Error("Only strings can be casted to strings"); + } + const inputs = {x: $x}; + const attrs = {dtype}; + return ENGINE.runKernel(Cast, inputs, attrs); + } + var cast = op({cast_}); + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function clone_(x) { + const $x = convertToTensor(x, "x", "clone", "string_or_numeric"); + const inputs = {x: $x}; + return ENGINE.runKernel(Identity, inputs); + } + var clone = op({clone_}); + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function print2(x, verbose = false) { + console.log(x.toString(verbose)); + } + /** + * @license + * Copyright 2020 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + getOrMakeEngine(); + var opHandler2 = { + buffer, + cast, + clone, + print: print2 + }; + setOpHandler(opHandler2); + var io_exports = {}; + __export2(io_exports, { + browserFiles: () => browserFiles, + browserHTTPRequest: () => browserHTTPRequest, + concatenateArrayBuffers: () => concatenateArrayBuffers, + copyModel: () => copyModel, + decodeWeights: () => decodeWeights, + encodeWeights: () => encodeWeights, + fromMemory: () => fromMemory, + getLoadHandlers: () => getLoadHandlers, + getModelArtifactsInfoForJSON: () => getModelArtifactsInfoForJSON, + getSaveHandlers: () => getSaveHandlers, + http: () => http, + isHTTPScheme: () => isHTTPScheme, + listModels: () => listModels, + loadWeights: () => loadWeights, + moveModel: () => moveModel, + registerLoadRouter: () => registerLoadRouter, + registerSaveRouter: () => registerSaveRouter, + removeModel: () => removeModel, + weightsLoaderFactory: () => weightsLoaderFactory, + withSaveHandler: () => withSaveHandler + }); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var DEFAULT_FILE_NAME_PREFIX = "model"; + var DEFAULT_JSON_EXTENSION_NAME = ".json"; + var DEFAULT_WEIGHT_DATA_EXTENSION_NAME = ".weights.bin"; + function defer(f) { + return new Promise((resolve) => setTimeout(resolve)).then(f); + } + var BrowserDownloads = class { + constructor(fileNamePrefix) { + if (!env().getBool("IS_BROWSER")) { + throw new Error("browserDownloads() cannot proceed because the current environment is not a browser."); + } + if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) { + fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length); + } + if (fileNamePrefix == null || fileNamePrefix.length === 0) { + fileNamePrefix = DEFAULT_FILE_NAME_PREFIX; + } + this.modelTopologyFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME; + this.weightDataFileName = fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME; + } + async save(modelArtifacts) { + if (typeof document === "undefined") { + throw new Error("Browser downloads are not supported in this environment since `document` is not present"); + } + const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], {type: "application/octet-stream"})); + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserDownloads.save() does not support saving model topology in binary formats yet."); + } else { + const weightsManifest = [{ + paths: ["./" + this.weightDataFileName], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + const modelTopologyAndWeightManifestURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: "application/json"})); + const jsonAnchor = this.jsonAnchor == null ? document.createElement("a") : this.jsonAnchor; + jsonAnchor.download = this.modelTopologyFileName; + jsonAnchor.href = modelTopologyAndWeightManifestURL; + await defer(() => jsonAnchor.dispatchEvent(new MouseEvent("click"))); + if (modelArtifacts.weightData != null) { + const weightDataAnchor = this.weightDataAnchor == null ? document.createElement("a") : this.weightDataAnchor; + weightDataAnchor.download = this.weightDataFileName; + weightDataAnchor.href = weightsURL; + await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent("click"))); + } + return {modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts)}; + } + } + }; + BrowserDownloads.URL_SCHEME = "downloads://"; + var BrowserFiles = class { + constructor(files) { + if (files == null || files.length < 1) { + throw new Error(`When calling browserFiles, at least 1 file is required, but received ${files}`); + } + this.files = files; + } + async load() { + const jsonFile = this.files[0]; + const weightFiles = this.files.slice(1); + return new Promise((resolve, reject) => { + const jsonReader = new FileReader(); + jsonReader.onload = (event) => { + const modelJSON = JSON.parse(event.target.result); + const modelTopology = modelJSON.modelTopology; + if (modelTopology == null) { + reject(new Error(`modelTopology field is missing from file ${jsonFile.name}`)); + return; + } + if (weightFiles.length === 0) { + resolve({modelTopology}); + } + const weightsManifest = modelJSON.weightsManifest; + if (weightsManifest == null) { + reject(new Error(`weightManifest field is missing from file ${jsonFile.name}`)); + return; + } + let pathToFile; + try { + pathToFile = this.checkManifestAndWeightFiles(weightsManifest, weightFiles); + } catch (err) { + reject(err); + return; + } + const weightSpecs = []; + const paths = []; + const perFileBuffers = []; + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + paths.push(path); + perFileBuffers.push(null); + }); + weightSpecs.push(...weightsGroup.weights); + }); + weightsManifest.forEach((weightsGroup) => { + weightsGroup.paths.forEach((path) => { + const weightFileReader = new FileReader(); + weightFileReader.onload = (event2) => { + const weightData = event2.target.result; + const index = paths.indexOf(path); + perFileBuffers[index] = weightData; + if (perFileBuffers.indexOf(null) === -1) { + const result = { + modelTopology, + weightSpecs, + weightData: concatenateArrayBuffers(perFileBuffers), + format: modelJSON.format, + generatedBy: modelJSON.generatedBy, + convertedBy: modelJSON.convertedBy + }; + if (modelJSON.signature != null) { + result.signature = modelJSON.signature; + } + if (modelJSON.userDefinedMetadata != null) { + result.userDefinedMetadata = modelJSON.userDefinedMetadata; + } + if (modelJSON.modelInitializer != null) { + result.modelInitializer = modelJSON.modelInitializer; + } + resolve(result); + } + }; + weightFileReader.onerror = (error) => reject(`Failed to weights data from file of path '${path}'.`); + weightFileReader.readAsArrayBuffer(pathToFile[path]); + }); + }); + }; + jsonReader.onerror = (error) => reject(`Failed to read model topology and weights manifest JSON from file '${jsonFile.name}'. BrowserFiles supports loading Keras-style tf.Model artifacts only.`); + jsonReader.readAsText(jsonFile); + }); + } + checkManifestAndWeightFiles(manifest, files) { + const basenames = []; + const fileNames = files.map((file) => basename(file.name)); + const pathToFile = {}; + for (const group of manifest) { + group.paths.forEach((path) => { + const pathBasename = basename(path); + if (basenames.indexOf(pathBasename) !== -1) { + throw new Error(`Duplicate file basename found in weights manifest: '${pathBasename}'`); + } + basenames.push(pathBasename); + if (fileNames.indexOf(pathBasename) === -1) { + throw new Error(`Weight file with basename '${pathBasename}' is not provided.`); + } else { + pathToFile[path] = files[fileNames.indexOf(pathBasename)]; + } + }); + } + if (basenames.length !== files.length) { + throw new Error(`Mismatch in the number of files in weights manifest (${basenames.length}) and the number of weight files provided (${files.length}).`); + } + return pathToFile; + } + }; + var browserDownloadsRouter = (url) => { + if (!env().getBool("IS_BROWSER")) { + return null; + } else { + if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) { + return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length)); + } else { + return null; + } + } + }; + IORouterRegistry.registerSaveRouter(browserDownloadsRouter); + function browserDownloads(fileNamePrefix = "model") { + return new BrowserDownloads(fileNamePrefix); + } + function browserFiles(files) { + return new BrowserFiles(files); + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) { + checkPromises(promises); + startFraction = startFraction == null ? 0 : startFraction; + endFraction = endFraction == null ? 1 : endFraction; + checkFraction(startFraction, endFraction); + let resolvedPromise = 0; + const registerMonitor = (promise) => { + promise.then((value) => { + const fraction = startFraction + ++resolvedPromise / promises.length * (endFraction - startFraction); + onProgress(fraction); + return value; + }); + return promise; + }; + function checkPromises(promises2) { + assert(promises2 != null && Array.isArray(promises2) && promises2.length > 0, () => "promises must be a none empty array"); + } + function checkFraction(startFraction2, endFraction2) { + assert(startFraction2 >= 0 && startFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got startFraction ${startFraction2}`); + assert(endFraction2 >= 0 && endFraction2 <= 1, () => `Progress fraction must be in range [0, 1], but got endFraction ${endFraction2}`); + assert(endFraction2 >= startFraction2, () => `startFraction must be no more than endFraction, but got startFraction ${startFraction2} and endFraction ${endFraction2}`); + } + return Promise.all(promises.map(registerMonitor)); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) { + if (loadOptions == null) { + loadOptions = {}; + } + const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch : loadOptions.fetchFunc; + const requests = fetchURLs.map((fetchURL) => fetchFunc(fetchURL, loadOptions.requestInit, {isBinary: true})); + const fetchStartFraction = 0; + const fetchEndFraction = 0.5; + const responses = loadOptions.onProgress == null ? await Promise.all(requests) : await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction); + const bufferPromises = responses.map((response) => response.arrayBuffer()); + const bufferStartFraction = 0.5; + const bufferEndFraction = 1; + const buffers = loadOptions.onProgress == null ? await Promise.all(bufferPromises) : await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction); + return buffers; + } + async function loadWeights(manifest, filePathPrefix = "", weightNames, requestInit) { + const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, {requestInit}); + const loadWeights2 = weightsLoaderFactory(fetchWeights); + return loadWeights2(manifest, filePathPrefix, weightNames); + } + function weightsLoaderFactory(fetchWeightsFunction) { + return async (manifest, filePathPrefix = "", weightNames) => { + const groupIndicesToFetchMap = manifest.map(() => false); + const groupWeightsToFetch = {}; + const weightsFound = weightNames != null ? weightNames.map(() => false) : []; + const allManifestWeightNames = []; + manifest.forEach((manifestGroupConfig, groupIndex) => { + let groupOffset = 0; + manifestGroupConfig.weights.forEach((weightsEntry) => { + const rawDtype = "quantization" in weightsEntry ? weightsEntry.quantization.dtype : weightsEntry.dtype; + const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] * sizeFromShape(weightsEntry.shape); + const enqueueWeightsForFetchingFn = () => { + groupIndicesToFetchMap[groupIndex] = true; + if (groupWeightsToFetch[groupIndex] == null) { + groupWeightsToFetch[groupIndex] = []; + } + groupWeightsToFetch[groupIndex].push({ + manifestEntry: weightsEntry, + groupOffset, + sizeBytes: weightsBytes + }); + }; + if (weightNames != null) { + weightNames.forEach((weightName, weightIndex) => { + if (weightName === weightsEntry.name) { + enqueueWeightsForFetchingFn(); + weightsFound[weightIndex] = true; + } + }); + } else { + enqueueWeightsForFetchingFn(); + } + allManifestWeightNames.push(weightsEntry.name); + groupOffset += weightsBytes; + }); + }); + if (!weightsFound.every((found) => found)) { + const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]); + throw new Error(`Could not find weights in manifest with names: ${weightsNotFound.join(", ")}. +Manifest JSON has weights with names: ${allManifestWeightNames.join(", ")}.`); + } + const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => { + if (shouldFetch) { + accumulator.push(i); + } + return accumulator; + }, []); + const fetchUrls = []; + groupIndicesToFetch.forEach((i) => { + manifest[i].paths.forEach((filepath) => { + const fetchUrl = filePathPrefix + (!filePathPrefix.endsWith("/") ? "/" : "") + filepath; + fetchUrls.push(fetchUrl); + }); + }); + const buffers = await fetchWeightsFunction(fetchUrls); + const weightsTensorMap = {}; + let bufferIndexOffset = 0; + groupIndicesToFetch.forEach((i) => { + const numBuffers = manifest[i].paths.length; + let groupBytes = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + groupBytes += buffers[bufferIndexOffset + i2].byteLength; + } + const groupBuffer = new ArrayBuffer(groupBytes); + const groupByteBuffer = new Uint8Array(groupBuffer); + let groupBufferOffset = 0; + for (let i2 = 0; i2 < numBuffers; i2++) { + const buffer2 = new Uint8Array(buffers[bufferIndexOffset + i2]); + groupByteBuffer.set(buffer2, groupBufferOffset); + groupBufferOffset += buffer2.byteLength; + } + const weightsEntries = groupWeightsToFetch[i]; + weightsEntries.forEach((weightsEntry) => { + const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes); + const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]); + for (const name in nameToTensorMap) { + weightsTensorMap[name] = nameToTensorMap[name]; + } + }); + bufferIndexOffset += numBuffers; + }); + return weightsTensorMap; + }; + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var OCTET_STREAM_MIME_TYPE = "application/octet-stream"; + var JSON_TYPE = "application/json"; + var HTTPRequest = class { + constructor(path, loadOptions) { + this.DEFAULT_METHOD = "POST"; + if (loadOptions == null) { + loadOptions = {}; + } + this.weightPathPrefix = loadOptions.weightPathPrefix; + this.onProgress = loadOptions.onProgress; + this.weightUrlConverter = loadOptions.weightUrlConverter; + if (loadOptions.fetchFunc != null) { + assert(typeof loadOptions.fetchFunc === "function", () => "Must pass a function that matches the signature of `fetch` (see https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)"); + this.fetch = loadOptions.fetchFunc; + } else { + this.fetch = env().platform.fetch; + } + assert(path != null && path.length > 0, () => "URL path for http must not be null, undefined or empty."); + if (Array.isArray(path)) { + assert(path.length === 2, () => `URL paths for http must have a length of 2, (actual length is ${path.length}).`); + } + this.path = path; + if (loadOptions.requestInit != null && loadOptions.requestInit.body != null) { + throw new Error("requestInit is expected to have no pre-existing body, but has one."); + } + this.requestInit = loadOptions.requestInit || {}; + } + async save(modelArtifacts) { + if (modelArtifacts.modelTopology instanceof ArrayBuffer) { + throw new Error("BrowserHTTPRequest.save() does not support saving model topology in binary formats yet."); + } + const init2 = Object.assign({method: this.DEFAULT_METHOD}, this.requestInit); + init2.body = new FormData(); + const weightsManifest = [{ + paths: ["./model.weights.bin"], + weights: modelArtifacts.weightSpecs + }]; + const modelTopologyAndWeightManifest = { + modelTopology: modelArtifacts.modelTopology, + format: modelArtifacts.format, + generatedBy: modelArtifacts.generatedBy, + convertedBy: modelArtifacts.convertedBy, + weightsManifest + }; + if (modelArtifacts.signature != null) { + modelTopologyAndWeightManifest.signature = modelArtifacts.signature; + } + if (modelArtifacts.userDefinedMetadata != null) { + modelTopologyAndWeightManifest.userDefinedMetadata = modelArtifacts.userDefinedMetadata; + } + if (modelArtifacts.modelInitializer != null) { + modelTopologyAndWeightManifest.modelInitializer = modelArtifacts.modelInitializer; + } + init2.body.append("model.json", new Blob([JSON.stringify(modelTopologyAndWeightManifest)], {type: JSON_TYPE}), "model.json"); + if (modelArtifacts.weightData != null) { + init2.body.append("model.weights.bin", new Blob([modelArtifacts.weightData], {type: OCTET_STREAM_MIME_TYPE}), "model.weights.bin"); + } + const response = await this.fetch(this.path, init2); + if (response.ok) { + return { + modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts), + responses: [response] + }; + } else { + throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ${response.status}.`); + } + } + async load() { + const modelConfigRequest = await this.fetch(this.path, this.requestInit); + if (!modelConfigRequest.ok) { + throw new Error(`Request to ${this.path} failed with status code ${modelConfigRequest.status}. Please verify this URL points to the model JSON of the model to load.`); + } + let modelConfig; + try { + modelConfig = await modelConfigRequest.json(); + } catch (e) { + let message = `Failed to parse model JSON of response from ${this.path}.`; + if (this.path.endsWith(".pb")) { + message += " Your path contains a .pb file extension. Support for .pb models have been removed in TensorFlow.js 1.0 in favor of .json models. You can re-convert your Python TensorFlow model using the TensorFlow.js 1.0 conversion scripts or you can convert your.pb models with the 'pb2json'NPM script in the tensorflow/tfjs-converter repository."; + } else { + message += " Please make sure the server is serving valid JSON for this request."; + } + throw new Error(message); + } + const modelTopology = modelConfig.modelTopology; + const weightsManifest = modelConfig.weightsManifest; + const generatedBy = modelConfig.generatedBy; + const convertedBy = modelConfig.convertedBy; + const format = modelConfig.format; + const signature = modelConfig.signature; + const userDefinedMetadata = modelConfig.userDefinedMetadata; + if (modelTopology == null && weightsManifest == null) { + throw new Error(`The JSON from HTTP path ${this.path} contains neither model topology or manifest for weights.`); + } + let weightSpecs; + let weightData; + if (weightsManifest != null) { + const results = await this.loadWeights(weightsManifest); + [weightSpecs, weightData] = results; + } + const artifacts = { + modelTopology, + weightSpecs, + weightData, + generatedBy, + convertedBy, + format + }; + if (signature != null) { + artifacts.signature = signature; + } + if (userDefinedMetadata != null) { + artifacts.userDefinedMetadata = userDefinedMetadata; + } + const initializer = modelConfig.modelInitializer; + if (initializer) { + artifacts.modelInitializer = initializer; + } + return artifacts; + } + async loadWeights(weightsManifest) { + const weightPath = Array.isArray(this.path) ? this.path[1] : this.path; + const [prefix, suffix] = parseUrl(weightPath); + const pathPrefix = this.weightPathPrefix || prefix; + const weightSpecs = []; + for (const entry of weightsManifest) { + weightSpecs.push(...entry.weights); + } + const fetchURLs = []; + const urlPromises = []; + for (const weightsGroup of weightsManifest) { + for (const path of weightsGroup.paths) { + if (this.weightUrlConverter != null) { + urlPromises.push(this.weightUrlConverter(path)); + } else { + fetchURLs.push(pathPrefix + path + suffix); + } + } + } + if (this.weightUrlConverter) { + fetchURLs.push(...await Promise.all(urlPromises)); + } + const buffers = await loadWeightsAsArrayBuffer(fetchURLs, { + requestInit: this.requestInit, + fetchFunc: this.fetch, + onProgress: this.onProgress + }); + return [weightSpecs, concatenateArrayBuffers(buffers)]; + } + }; + HTTPRequest.URL_SCHEME_REGEX = /^https?:\/\//; + function parseUrl(url) { + const lastSlash = url.lastIndexOf("/"); + const lastSearchParam = url.lastIndexOf("?"); + const prefix = url.substring(0, lastSlash); + const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : ""; + return [prefix + "/", suffix]; + } + function isHTTPScheme(url) { + return url.match(HTTPRequest.URL_SCHEME_REGEX) != null; + } + var httpRouter = (url, loadOptions) => { + if (typeof fetch === "undefined" && (loadOptions == null || loadOptions.fetchFunc == null)) { + return null; + } else { + let isHTTP = true; + if (Array.isArray(url)) { + isHTTP = url.every((urlItem) => isHTTPScheme(urlItem)); + } else { + isHTTP = isHTTPScheme(url); + } + if (isHTTP) { + return http(url, loadOptions); + } + } + return null; + }; + IORouterRegistry.registerSaveRouter(httpRouter); + IORouterRegistry.registerLoadRouter(httpRouter); + function http(path, loadOptions) { + return new HTTPRequest(path, loadOptions); + } + function browserHTTPRequest(path, loadOptions) { + return http(path, loadOptions); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var PassthroughLoader = class { + constructor(modelArtifacts) { + this.modelArtifacts = modelArtifacts; + } + async load() { + return this.modelArtifacts; + } + }; + var PassthroughSaver = class { + constructor(saveHandler) { + this.saveHandler = saveHandler; + } + async save(modelArtifacts) { + return this.saveHandler(modelArtifacts); + } + }; + function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) { + if (arguments.length === 1) { + const isModelArtifacts = modelArtifacts.modelTopology != null || modelArtifacts.weightSpecs != null; + if (isModelArtifacts) { + return new PassthroughLoader(modelArtifacts); + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({modelTopology: modelArtifacts}); + } + } else { + console.warn("Please call tf.io.fromMemory() with only one argument. The argument should be of type ModelArtifacts. The multi-argument signature of tf.io.fromMemory() has been deprecated and will be removed in a future release."); + return new PassthroughLoader({ + modelTopology: modelArtifacts, + weightSpecs, + weightData, + trainingConfig + }); + } + } + function withSaveHandler(saveHandler) { + return new PassthroughSaver(saveHandler); + } + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var math_exports = {}; + __export2(math_exports, { + confusionMatrix: () => confusionMatrix + }); + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function matMul_(a, b, transposeA = false, transposeB = false) { + let $a = convertToTensor(a, "a", "matMul"); + let $b = convertToTensor(b, "b", "matMul"); + [$a, $b] = makeTypesMatch($a, $b); + const inputs = {a: $a, b: $b}; + const attrs = {transposeA, transposeB}; + return ENGINE.runKernel(BatchMatMul, inputs, attrs); + } + var matMul = op({matMul_}); + /** + * @license + * Copyright 2020 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function oneHot_(indices, depth, onValue = 1, offValue = 0) { + if (depth < 2) { + throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`); + } + const $indices = convertToTensor(indices, "indices", "oneHot", "int32"); + const inputs = {indices: $indices}; + const attrs = {depth, onValue, offValue}; + return ENGINE.runKernel(OneHot, inputs, attrs); + } + var oneHot = op({oneHot_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function transpose_(x, perm) { + const $x = convertToTensor(x, "x", "transpose"); + if (perm == null) { + perm = $x.shape.map((s, i) => i).reverse(); + } + assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} must match length of perm ${perm}.`); + perm.forEach((axis) => { + assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1} but got ${perm}`); + }); + if ($x.rank <= 1) { + return $x.clone(); + } + const inputs = {x: $x}; + const attrs = {perm}; + return ENGINE.runKernel(Transpose, inputs, attrs); + } + var transpose = op({transpose_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function confusionMatrix_(labels2, predictions, numClasses) { + const $labels = convertToTensor(labels2, "labels", "confusionMatrix"); + const $predictions = convertToTensor(predictions, "predictions", "confusionMatrix"); + assert(numClasses == null || numClasses > 0 && Number.isInteger(numClasses), () => `If provided, numClasses must be a positive integer, but got ${numClasses}`); + assert($labels.rank === 1, () => `Expected the rank of labels to be 1, but got ${$labels.rank}`); + assert($predictions.rank === 1, () => `Expected the rank of predictions to be 1, but got ${$predictions.rank}`); + assert($labels.shape[0] === $predictions.shape[0], () => `Mismatch in the number of examples: ${$labels.shape[0]} vs. ${$predictions.shape[0]}. Labels and predictions should have the same number of elements.`); + assert(numClasses > 0 && Number.isInteger(numClasses), () => `numClasses is required to be a positive integer, but got ${numClasses}`); + const oneHotLabels = oneHot(cast($labels, "int32"), numClasses); + const oneHotPredictions = oneHot(cast($predictions, "int32"), numClasses); + const oneHotLabelsT = transpose(oneHotLabels); + const product = matMul(oneHotLabelsT, oneHotPredictions); + return cast(product, "int32"); + } + var confusionMatrix = op({confusionMatrix_}); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var browser_exports = {}; + __export2(browser_exports, { + fromPixels: () => fromPixels, + fromPixelsAsync: () => fromPixelsAsync, + toPixels: () => toPixels + }); + /** + * @license + * Copyright 2018 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + function tensor3d(values, shape, dtype) { + assertNonNull(values); + if (shape != null && shape.length !== 3) { + throw new Error("tensor3d() requires shape to have three numbers"); + } + const inferredShape = inferShape(values, dtype); + if (inferredShape.length !== 3 && inferredShape.length !== 1) { + throw new Error("tensor3d() requires values to be number[][][] or flat/TypedArray"); + } + if (inferredShape.length === 1 && shape == null) { + throw new Error("tensor3d() requires shape to be provided when `values` are a flat array"); + } + return makeTensor(values, shape, inferredShape, dtype); + } + /** + * @license + * Copyright 2019 Google LLC. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================================= + */ + var fromPixels2DContext; + function fromPixels_(pixels, numChannels = 3) { + if (numChannels > 4) { + throw new Error("Cannot construct Tensor with more than 4 channels from pixels."); + } + if (pixels == null) { + throw new Error("pixels passed to tf.browser.fromPixels() can not be null"); + } + let isPixelData2 = false; + let isImageData = false; + let isVideo = false; + let isImage = false; + let isCanvasLike = false; + let isImageBitmap = false; + if (pixels.data instanceof Uint8Array) { + isPixelData2 = true; + } else if (typeof ImageData !== "undefined" && pixels instanceof ImageData) { + isImageData = true; + } else if (typeof HTMLVideoElement !== "undefined" && pixels instanceof HTMLVideoElement) { + isVideo = true; + } else if (typeof HTMLImageElement !== "undefined" && pixels instanceof HTMLImageElement) { + isImage = true; + } else if (pixels.getContext != null) { + isCanvasLike = true; + } else if (typeof ImageBitmap !== "undefined" && pixels instanceof ImageBitmap) { + isImageBitmap = true; + } else { + throw new Error(`pixels passed to tf.browser.fromPixels() must be either an HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData in browser, or OffscreenCanvas, ImageData in webworker or {data: Uint32Array, width: number, height: number}, but was ${pixels.constructor.name}`); + } + if (isVideo) { + const HAVE_CURRENT_DATA_READY_STATE = 2; + if (isVideo && pixels.readyState < HAVE_CURRENT_DATA_READY_STATE) { + throw new Error("The video element has not loaded data yet. Please wait for `loadeddata` event on the