(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))u(s);new MutationObserver(s=>{for(const l of s)if(l.type==="childList")for(const h of l.addedNodes)h.tagName==="LINK"&&h.rel==="modulepreload"&&u(h)}).observe(document,{childList:!0,subtree:!0});function i(s){const l={};return s.integrity&&(l.integrity=s.integrity),s.referrerPolicy&&(l.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?l.credentials="include":s.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function u(s){if(s.ep)return;s.ep=!0;const l=i(s);fetch(s.href,l)}})();const vt="japanese_app.db";async function wt(){return navigator.storage.getDirectory()}async function gn(r){const i=await(await wt()).getFileHandle(vt,{create:!0}),u=i.createSyncAccessHandle;if(typeof u=="function")try{const l=await u.call(i);try{l.truncate(0),l.write(r,{at:0}),l.flush()}finally{l.close()}return}catch{}const s=await i.createWritable();try{await s.truncate(0);const l=new Uint8Array(r.length);l.set(r),await s.write(l)}finally{await s.close()}}async function vn(){const r=await wt();let n;try{n=await r.getFileHandle(vt)}catch{throw new Error("Локальная база не найдена — сначала скачай сохранение")}const i=await n.getFile();if(i.size===0)throw new Error("Локальная база пуста");return new Uint8Array(await i.arrayBuffer())}async function Se(){try{return(await(await(await wt()).getFileHandle(vt)).getFile()).size>0}catch{return!1}}var wn=ArrayBuffer,L=Uint8Array,Ye=Uint16Array,yn=Int16Array,De=Int32Array,ut=function(r,n,i){if(L.prototype.slice)return L.prototype.slice.call(r,n,i);(n==null||n<0)&&(n=0),(i==null||i>r.length)&&(i=r.length);var u=new L(i-n);return u.set(r.subarray(n,i)),u},$e=function(r,n,i,u){if(L.prototype.fill)return L.prototype.fill.call(r,n,i,u);for((i==null||i<0)&&(i=0),(u==null||u>r.length)&&(u=r.length);ir.length)&&(u=r.length);i2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],I=function(r,n,i){var u=new Error(n||bn[r]);if(u.code=r,Error.captureStackTrace&&Error.captureStackTrace(u,I),!i)throw u;return u},Yt=function(r,n,i){for(var u=0,s=0;u>>0},Cn=function(r,n){var i=r[0]|r[1]<<8|r[2]<<16;if(i==3126568&&r[3]==253){var u=r[4],s=u>>5&1,l=u>>2&1,h=u&3,g=u>>6;u&8&&I(0);var y=6-s,E=h==3?4:h,U=Yt(r,y,E);y+=E;var k=g?1<>3);m=x+(x>>3)*(r[5]&7)}m>2145386496&&I(1);var w=new L((n==1?F||m:n?0:m)+12);return w[0]=1,w[4]=4,w[8]=8,{b:y+k,y:0,l:0,d:U,w:n&&n!=1?n:w.subarray(12),e:m,o:new De(w.buffer,0,3),u:F,c:l,m:Math.min(131072,m)}}else if((i>>4|r[3]<<20)==25481893)return Un(r,4)+8;I(0)},me=function(r){for(var n=0;1<i&&I(3);for(var l=1<0;){var X=me(h+1),J=u>>3,se=(1<>(u&7)&se,b=(1<b&&(R-=V)),F[++g]=--R,R==-1?(h+=R,$[--U]=g):h-=R,!R)do{var te=u>>3;y=(r[te]|r[te+1]<<8)>>(u&7)&3,u+=2,g+=y}while(y==3)}(g>255||h)&&I(0);for(var Y=0,re=(l>>1)+(l>>3)+3,ne=l-1,G=0;G<=g;++G){var N=F[G];if(N<1){m[G]=-N;continue}for(E=0;E=U)}}for(Y&&I(0),E=0;E>3,{b:s,s:$,n:D,t:x}]},Mn=function(r,n){var i=0,u=-1,s=new L(292),l=r[n],h=s.subarray(0,256),g=s.subarray(256,268),y=new Ye(s.buffer,268);if(l<128){var E=Te(r,n+1,6),U=E[0],k=E[1];n+=l;var F=U<<3,m=r[n];m||I(0);for(var x=0,w=0,$=k.b,D=$,X=(++n<<3)-8+me(m);X-=$,!(X>3;if(x+=(r[J]|r[J+1]<<8)>>(X&7)&(1<<$)-1,h[++u]=k.s[x],X-=D,X>3,w+=(r[J]|r[J+1]<<8)>>(X&7)&(1<255&&I(0)}else{for(u=l-127;i>4,h[i+1]=se&15}++n}var R=0;for(i=0;i11&&I(0),R+=b&&1<0;--i){var G=y[i];$e(ne,i,G,y[i-1]=G+g[i]*(1<g&&k>3,m=(r[F]|r[F+1]<<8|r[F+2]<<16)>>(U&7);y=(y<>2,h=l<<1,g=l+h;Pe(r.subarray(u,u+=r[0]|r[1]<<8),n.subarray(0,l),i),Pe(r.subarray(u,u+=r[2]|r[3]<<8),n.subarray(l,h),i),Pe(r.subarray(u,u+=r[4]|r[5]<<8),n.subarray(h,g),i),Pe(r.subarray(u),n.subarray(g),i)},Hn=function(r,n,i){var u,s=n.b,l=r[s],h=l>>1&3;n.l=l&1;var g=l>>3|r[s+1]<<5|r[s+2]<<13,y=(s+=3)+g;if(h==1)return s>=r.length?void 0:(n.b=s+1,i?($e(i,r[s],n.y,n.y+=g),i):$e(new L(g),r[s]));if(!(y>r.length)){if(h==0)return n.b=y,i?(i.set(r.subarray(s,y),n.y),n.y+=g,i):ut(r,s,y);if(h==2){var E=r[s],U=E&3,k=E>>2&3,F=E>>4,m=0,x=0;U<2?k&1?F|=r[++s]<<4|(k&2&&r[++s]<<12):F=E>>3:(x=k,k<2?(F|=(r[++s]&63)<<4,m=r[s]>>6|r[++s]<<2):k==2?(F|=r[++s]<<4|(r[++s]&3)<<12,m=r[s]>>2|r[++s]<<6):(F|=r[++s]<<4|(r[++s]&63)<<12,m=r[s]>>6|r[++s]<<2|r[++s]<<10)),++s;var w=i?i.subarray(n.y,n.y+n.m):new L(n.m),$=w.length-F;if(U==0)w.set(r.subarray(s,s+=F),$);else if(U==1)$e(w,r[s++],$);else{var D=n.h;if(U==2){var X=Mn(r,s);m+=s-(s=X[0]),n.h=D=X[1]}else D||I(0);(x?Nn:Pe)(r.subarray(s,s+=m),w.subarray($),D)}var J=r[s++];if(J){J==255?J=(r[s++]|r[s++]<<8)+32512:J>127&&(J=J-128<<8|r[s++]);var se=r[s++];se&3&&I(0);for(var R=[En,xn,Qn],b=2;b>-1;--b){var V=se>>(b<<1)+2&3;if(V==1){var Z=new L([0,0,r[s++]]);R[b]={s:Z.subarray(2,3),n:Z.subarray(0,1),t:new Ye(Z.buffer,0,1),b:0}}else V==2?(u=Te(r,s,9-(b&1)),s=u[0],R[b]=u[1]):V==3&&(n.t||I(0),R[b]=n.t[b])}var te=n.t=R,Y=te[0],re=te[1],ne=te[2],G=r[y-1];G||I(0);var N=(y<<3)-8+me(G)-ne.b,C=N>>3,S=0,j=(r[C]|r[C+1]<<8)>>(N&7)&(1<>3;var de=(r[C]|r[C+1]<<8)>>(N&7)&(1<>3;var q=(r[C]|r[C+1]<<8)>>(N&7)&(1<>3;var he=1<>>(N&7)&he-1);C=(N-=ft[Ce])>>3;var ae=Fn[Ce]+((r[C]|r[C+1]<<8|r[C+2]<<16)>>(N&7)&(1<>3;var pe=kn[Ue]+((r[C]|r[C+1]<<8|r[C+2]<<16)>>(N&7)&(1<>3,j=ne.t[j]+((r[C]|r[C+1]<<8)>>(N&7)&(1<>3,q=Y.t[q]+((r[C]|r[C+1]<<8)>>(N&7)&(1<>3,de=re.t[de]+((r[C]|r[C+1]<<8)>>(N&7)&(1<3)n.o[2]=n.o[1],n.o[1]=n.o[0],n.o[0]=W-=3;else{var be=W-(pe!=0);be?(W=be==3?n.o[0]-1:n.o[be],be>1&&(n.o[2]=n.o[1]),n.o[1]=n.o[0],n.o[0]=W):W=n.o[0]}for(var b=0;bae&&(A=ae);for(var b=0;b{throw e},u,s=console.log.bind(console),l=console.error.bind(console),h,g=!1,y,E=t=>t.startsWith("file://"),U=!1;function k(){return Ve.buffer}function F(){if(!Z?.buffer?.resizable){var t=k();Z=new Int8Array(t),Re=new Int16Array(t),n.HEAPU8=j=new Uint8Array(t),Ee=new Uint16Array(t),Ke=new Int32Array(t),q=new Uint32Array(t),Pt=new Float32Array(t),$t=new Float64Array(t),bt=new BigInt64Array(t),Ut=new BigUint64Array(t)}}function m(){U=!0,Fe.A()}function x(t){t=`Aborted(${t})`,l(t),g=!0,t+=". Build with -sASSERTIONS for more info.",U&&Rt();var e=new WebAssembly.RuntimeError(t);throw e}var w;let $=()=>"";function D(t){if(t==w&&h)return new Uint8Array(h);throw"both async and sync fetching of the wasm failed"}async function X(t){if(!h)try{var e=await u(t);return new Uint8Array(e)}catch{}return D(t)}async function J(t,e){try{var a=await X(t),o=await WebAssembly.instantiate(a,e);return o}catch(c){l(`failed to asynchronously prepare wasm: ${c}`),x(c)}}async function se(t,e,a){if(!t&&!E(e))try{var o=fetch(e,{credentials:"same-origin"}),c=await WebAssembly.instantiateStreaming(o,a);return c}catch(d){l(`wasm streaming compile failed: ${d}`),l("falling back to ArrayBuffer instantiation")}return J(e,a)}function R(){var t={a:fn};return t}async function b(){function t(d){return Fe=d.exports,pn(Fe),F(),Fe}function e(d){return t(d.instance)}var a=R();w??=$();var o=await se(h,w,a),c=e(o);return c}class V{name="ExitStatus";constructor(e){this.message=`Program terminated with exit(${e})`,this.status=e}}var Z,te=()=>Vt,Y=t=>{var e=t.getArg(te(),0);return zt(e)},re=()=>Xt(),ne=t=>Kt(t),G=t=>It(t),N=globalThis.TextDecoder&&new TextDecoder,C=(t,e,a,o)=>{var c=e+a;if(o)return c;for(;t[e]&&!(e>=c);)++e;return e},S=(t,e=0,a,o)=>{var c=C(t,e,a,o);if(c-e>16&&t.buffer&&N)return N.decode(t.subarray(e,c));for(var d="";e>10,56320|M&1023)}}return d},j,de=(t,e,a)=>t?S(j,t,e,a):"",q,Ue=t=>{var e=re(),a=G(4),o=G(4);Ot(t,a,o);var c=q[a>>2],d=q[o>>2],p=de(c);ce(c);var f;return d&&(f=de(d),ce(d)),ne(e),[p,f]},Le=t=>{var e=Y(t);return Ue(e)},Ce=t=>{var e=new WebAssembly.Exception(te(),[t],{traceStack:!0});throw e.message=Le(e),e},Je=()=>x(""),ve={},Me=t=>{for(;t.length;){var e=t.pop(),a=t.pop();a(e)}};function he(t){return this.fromWireType(q[t>>2])}var W={},ae={},pe={};class be extends Error{constructor(e){super(e),this.name="InternalError"}}var ue=t=>{throw new be(t)},A=(t,e,a)=>{t.forEach(f=>pe[f]=e);function o(f){var v=a(f);v.length!==t.length&&ue("Mismatched type converter count");for(var M=0;M{c[f]=ae[v],++p,p===d.length&&o(c)}));d.length===0&&o(c)},Ge=t=>{var e=ve[t];delete ve[t];var a=e.rawConstructor,o=e.rawDestructor,c=e.fields,d=c.map(p=>p.getterReturnType).concat(c.map(p=>p.setterArgumentType));A([t],d,p=>{var f={};for(var[v,M]of c.entries()){let Q=p[v],T=M.getter,P=M.getterContext,_=p[v+c.length],z=M.setter,ee=M.setterContext;f[M.fieldName]={read:O=>Q.fromWireType(T(P,O)),write:(O,K)=>{var ge=[];z(ee,O,_.toWireType(ge,K)),Me(ge)},optional:Q.optional}}return[{name:e.name,fromWireType:Q=>{var T={};for(var P in f)T[P]=f[P].read(Q);return o(Q),T},toWireType:(Q,T)=>{for(var P in f)if(!(P in T)&&!f[P].optional)throw new TypeError(`Missing field: "${P}"`);var _=a();for(P in f)f[P].write(_,T[P]);return Q!==null&&Q.push(o,_),_},readValueFromPointer:he,destructorFunction:o}]})},B=t=>{for(var e="";;){var a=j[t++];if(!a)return e;e+=String.fromCharCode(a)}};class Qe extends Error{constructor(e){super(e),this.name="BindingError"}}var H=t=>{throw new Qe(t)};function nr(t,e,a={}){var o=e.name;if(t||H(`type "${o}" must have a positive integer typeid pointer`),ae.hasOwnProperty(t)){if(a.ignoreDuplicateRegistrations)return;H(`Cannot register type '${o}' twice`)}if(ae[t]=e,delete pe[t],W.hasOwnProperty(t)){var c=W[t];delete W[t],c.forEach(d=>d())}}function le(t,e,a={}){return nr(t,e,a)}var Re,Ee,Ke,bt,Ut,Ct=(t,e,a)=>{switch(e){case 1:return a?o=>Z[o]:o=>j[o];case 2:return a?o=>Re[o>>1]:o=>Ee[o>>1];case 4:return a?o=>Ke[o>>2]:o=>q[o>>2];case 8:return a?o=>bt[o>>3]:o=>Ut[o>>3];default:throw new TypeError(`invalid integer width (${e}): ${t}`)}},ar=(t,e,a,o,c)=>{e=B(e);let d=o===0n,p=f=>f;if(d){let f=a*8;p=v=>BigInt.asUintN(f,v),c=p(c)}le(t,{name:e,fromWireType:p,toWireType:(f,v)=>(typeof v=="number"&&(v=BigInt(v)),v),readValueFromPointer:Ct(e,a,!d),destructorFunction:null})},ir=(t,e,a,o)=>{e=B(e),le(t,{name:e,fromWireType:function(c){return!!c},toWireType:function(c,d){return d?a:o},readValueFromPointer:function(c){return this.fromWireType(j[c])},destructorFunction:null})},or=t=>({count:t.count,deleteScheduled:t.deleteScheduled,preservePointerOnDelete:t.preservePointerOnDelete,ptr:t.ptr,ptrType:t.ptrType,smartPtr:t.smartPtr,smartPtrType:t.smartPtrType}),je=t=>{function e(a){return a.$$.ptrType.registeredClass.name}H(e(t)+" instance already deleted")},We=!1,Mt=t=>{},sr=t=>{t.smartPtr?t.smartPtrType.rawDestructor(t.smartPtr):t.ptrType.registeredClass.rawDestructor(t.ptr)},Qt=t=>{t.count.value-=1;var e=t.count.value===0;e&&sr(t)},xe=t=>globalThis.FinalizationRegistry?(We=new FinalizationRegistry(e=>{Qt(e.$$)}),xe=e=>{var a=e.$$,o=!!a.smartPtr;if(o){var c={$$:a};We.register(e,c,e)}return e},Mt=e=>We.unregister(e),xe(t)):(xe=e=>e,t),ur=()=>{let t=Ie.prototype;Object.assign(t,{isAliasOf(a){if(!(this instanceof Ie)||!(a instanceof Ie))return!1;var o=this.$$.ptrType.registeredClass,c=this.$$.ptr;a.$$=a.$$;for(var d=a.$$.ptrType.registeredClass,p=a.$$.ptr;o.baseClass;)c=o.upcast(c),o=o.baseClass;for(;d.baseClass;)p=d.upcast(p),d=d.baseClass;return o===d&&c===p},clone(){if(this.$$.ptr||je(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var a=xe(Object.create(Object.getPrototypeOf(this),{$$:{value:or(this.$$)}}));return a.$$.count.value+=1,a.$$.deleteScheduled=!1,a},delete(){this.$$.ptr||je(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&H("Object already scheduled for deletion"),Mt(this),Qt(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||je(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&H("Object already scheduled for deletion"),this.$$.deleteScheduled=!0,this}});let e=Symbol.dispose;e&&(t[e]=t.delete)};function Ie(){}var Et=(t,e)=>Object.defineProperty(e,"name",{value:t}),xt={},Ae=(t,e,a)=>{if(t[e].overloadTable===void 0){var o=t[e];t[e]=function(...c){return t[e].overloadTable.hasOwnProperty(c.length)||H(`Function '${a}' called with an invalid number of arguments (${c.length}) - expects one of (${t[e].overloadTable})!`),t[e].overloadTable[c.length].apply(this,c)},t[e].overloadTable=[],t[e].overloadTable[o.argCount]=o}},lr=(t,e,a)=>{n.hasOwnProperty(t)?(H(`Cannot register public name '${t}' twice`),Ae(n,t,t),n[t].overloadTable.hasOwnProperty(a)&&H(`Cannot register multiple overloads of a function with the same number of arguments (${a})!`),n[t].overloadTable[a]=e):(n[t]=e,n[t].argCount=a)},cr=48,dr=57,pr=t=>{t=t.replace(/[^a-zA-Z0-9_]/g,"$");var e=t.charCodeAt(0);return e>=cr&&e<=dr?`_${t}`:t};function fr(t,e,a,o,c,d,p,f){this.name=t,this.constructor=e,this.instancePrototype=a,this.rawDestructor=o,this.baseClass=c,this.getActualType=d,this.upcast=p,this.downcast=f,this.pureVirtualFunctions=[]}var et=(t,e,a)=>{for(;e!==a;)e.upcast||H(`Expected null or instance of ${a.name}, got an instance of ${e.name}`),t=e.upcast(t),e=e.baseClass;return t},tt=t=>{if(t===null)return"null";var e=typeof t;return e==="object"||e==="array"||e==="function"?t.toString():""+t};function hr(t,e){if(e===null)return this.isReference&&H(`null is not a valid ${this.name}`),0;e.$$||H(`Cannot pass "${tt(e)}" as a ${this.name}`),e.$$.ptr||H(`Cannot pass deleted object as a pointer of type ${this.name}`);var a=e.$$.ptrType.registeredClass,o=et(e.$$.ptr,a,this.registeredClass);return o}function gr(t,e){var a;if(e===null)return this.isReference&&H(`null is not a valid ${this.name}`),this.isSmartPointer?(a=this.rawConstructor(),t!==null&&t.push(this.rawDestructor,a),a):0;(!e||!e.$$)&&H(`Cannot pass "${tt(e)}" as a ${this.name}`),e.$$.ptr||H(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&e.$$.ptrType.isConst&&H(`Cannot convert argument of type ${e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name} to parameter type ${this.name}`);var o=e.$$.ptrType.registeredClass;if(a=et(e.$$.ptr,o,this.registeredClass),this.isSmartPointer)switch(e.$$.smartPtr===void 0&&H("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:e.$$.smartPtrType===this?a=e.$$.smartPtr:H(`Cannot convert argument of type ${e.$$.smartPtrType?e.$$.smartPtrType.name:e.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:a=e.$$.smartPtr;break;case 2:if(e.$$.smartPtrType===this)a=e.$$.smartPtr;else{var c=e.clone();a=this.rawShare(a,at.toHandle(()=>c.delete())),t!==null&&t.push(this.rawDestructor,a)}break;default:H("Unsupported sharing policy")}return a}function vr(t,e){if(e===null)return this.isReference&&H(`null is not a valid ${this.name}`),0;e.$$||H(`Cannot pass "${tt(e)}" as a ${this.name}`),e.$$.ptr||H(`Cannot pass deleted object as a pointer of type ${this.name}`),e.$$.ptrType.isConst&&H(`Cannot convert argument of type ${e.$$.ptrType.name} to parameter type ${this.name}`);var a=e.$$.ptrType.registeredClass,o=et(e.$$.ptr,a,this.registeredClass);return o}var kt=(t,e,a)=>{if(e===a)return t;if(a.baseClass===void 0)return null;var o=kt(t,e,a.baseClass);return o===null?null:a.downcast(o)},wr={},yr=(t,e)=>{for(e===void 0&&H("ptr should not be undefined");t.baseClass;)e=t.upcast(e),t=t.baseClass;return e},mr=(t,e)=>(e=yr(t,e),wr[e]),Xe=(t,e)=>{(!e.ptrType||!e.ptr)&&ue("makeClassHandle requires ptr and ptrType");var a=!!e.smartPtrType,o=!!e.smartPtr;return a!==o&&ue("Both smartPtrType and smartPtr must be specified"),e.count={value:1},xe(Object.create(t,{$$:{value:e,writable:!0}}))};function br(t){var e=this.getPointee(t);if(!e)return this.destructor(t),null;var a=mr(this.registeredClass,e);if(a!==void 0){if(a.$$.count.value===0)return a.$$.ptr=e,a.$$.smartPtr=t,a.clone();var o=a.clone();return this.destructor(t),o}function c(){return this.isSmartPointer?Xe(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:e,smartPtrType:this,smartPtr:t}):Xe(this.registeredClass.instancePrototype,{ptrType:this,ptr:t})}var d=this.registeredClass.getActualType(e),p=xt[d];if(!p)return c.call(this);var f;this.isConst?f=p.constPointerType:f=p.pointerType;var v=kt(e,this.registeredClass,f.registeredClass);return v===null?c.call(this):this.isSmartPointer?Xe(f.registeredClass.instancePrototype,{ptrType:f,ptr:v,smartPtrType:this,smartPtr:t}):Xe(f.registeredClass.instancePrototype,{ptrType:f,ptr:v})}var Ur=()=>{Object.assign(ze.prototype,{getPointee(t){return this.rawGetPointee&&(t=this.rawGetPointee(t)),t},destructor(t){this.rawDestructor?.(t)},readValueFromPointer:he,fromWireType:br})};function ze(t,e,a,o,c,d,p,f,v,M,Q){this.name=t,this.registeredClass=e,this.isReference=a,this.isConst=o,this.isSmartPointer=c,this.pointeeType=d,this.sharingPolicy=p,this.rawGetPointee=f,this.rawConstructor=v,this.rawShare=M,this.rawDestructor=Q,!c&&e.baseClass===void 0?o?(this.toWireType=hr,this.destructorFunction=null):(this.toWireType=vr,this.destructorFunction=null):this.toWireType=gr}var Cr=(t,e,a)=>{n.hasOwnProperty(t)||ue("Replacing nonexistent public symbol"),n[t].overloadTable!==void 0&&a!==void 0?n[t].overloadTable[a]=e:(n[t]=e,n[t].argCount=a)},Mr=t=>Zt.get(t),oe=(t,e,a=!1)=>{t=B(t);function o(){var d=Mr(e);return d}var c=o();return typeof c!="function"&&H(`unknown function pointer with signature ${t}: ${e}`),c};class Qr extends Error{}var Er=t=>{var e=Lt(t),a=B(e);return ce(e),a},Oe=(t,e)=>{var a=[],o={};function c(d){if(!o[d]&&!ae[d]){if(pe[d]){pe[d].forEach(c);return}a.push(d),o[d]=!0}}throw e.forEach(c),new Qr(`${t}: `+a.map(Er).join([", "]))},xr=(t,e,a,o,c,d,p,f,v,M,Q,T,P)=>{Q=B(Q),d=oe(c,d),f&&=oe(p,f),M&&=oe(v,M),P=oe(T,P);var _=pr(Q);lr(_,function(){Oe(`Cannot construct ${Q} due to unbound types`,[o])}),A([t,e,a],o?[o]:[],z=>{z=z[0];var ee,O;o?(ee=z.registeredClass,O=ee.instancePrototype):O=Ie.prototype;var K=Et(Q,function(...st){if(Object.getPrototypeOf(this)!==ge)throw new Qe(`Use 'new' to construct ${Q}`);if(ie.constructor_body===void 0)throw new Qe(`${Q} has no accessible constructor`);var St=ie.constructor_body[st.length];if(St===void 0)throw new Qe(`Tried to invoke ctor of ${Q} with invalid number of parameters (${st.length}) - expected (${Object.keys(ie.constructor_body).toString()}) parameters instead!`);return St.apply(this,st)}),ge=Object.create(O,{constructor:{value:K}});K.prototype=ge;var ie=new fr(Q,K,ge,P,ee,d,f,M);ie.baseClass&&(ie.baseClass.__derivedClasses??=[],ie.baseClass.__derivedClasses.push(ie));var ot=new ze(Q,ie,!0,!1,!1),fe=new ze(Q+"*",ie,!1,!1,!1),Ze=new ze(Q+" const*",ie,!1,!0,!1);return xt[t]={pointerType:fe,constPointerType:Ze},Cr(_,K),[ot,fe,Ze]})};function kr(t){for(var e=1;e{for(var a=[],o=0;o>2]);return a},Ft=t=>{t=t.trim();let e=t.indexOf("(");return e===-1?t:t.slice(0,e)},Fr=(t,e,a,o,c,d,p,f,v)=>{var M=nt(a,o);e=B(e),e=Ft(e),d=oe(c,d,f),A([],[t],Q=>{Q=Q[0];var T=`${Q.name}.${e}`;function P(){Oe(`Cannot call ${T} due to unbound types`,M)}e.startsWith("@@")&&(e=Symbol[e.substring(2)]);var _=Q.registeredClass.constructor;return _[e]===void 0?(P.argCount=a-1,_[e]=P):(Ae(_,e,T),_[e].overloadTable[a-1]=P),A([],M,z=>{var ee=[z[0],null].concat(z.slice(1)),O=rt(T,ee,null,d,p);if(_[e].overloadTable===void 0?(O.argCount=a-1,_[e]=O):_[e].overloadTable[a-1]=O,Q.registeredClass.__derivedClasses)for(let K of Q.registeredClass.__derivedClasses)K.constructor.hasOwnProperty(e)||(K.constructor[e]=O);return[]}),[]})},Nr=(t,e,a,o,c,d)=>{var p=nt(e,a);c=oe(o,c),A([],[t],f=>{f=f[0];var v=`constructor ${f.name}`;if(f.registeredClass.constructor_body===void 0&&(f.registeredClass.constructor_body=[]),f.registeredClass.constructor_body[e-1]!==void 0)throw new Qe(`Cannot register multiple constructors with identical number of parameters (${e-1}) for class '${f.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return f.registeredClass.constructor_body[e-1]=()=>{Oe(`Cannot construct ${f.name} due to unbound types`,p)},A([],p,M=>(M.splice(1,0,null),f.registeredClass.constructor_body[e-1]=rt(v,M,null,c,d),[])),[]})},Hr=(t,e,a,o,c,d,p,f,v,M)=>{var Q=nt(a,o);e=B(e),e=Ft(e),d=oe(c,d,v),A([],[t],T=>{T=T[0];var P=`${T.name}.${e}`;e.startsWith("@@")&&(e=Symbol[e.substring(2)]),f&&T.registeredClass.pureVirtualFunctions.push(e);function _(){Oe(`Cannot call ${P} due to unbound types`,Q)}var z=T.registeredClass.instancePrototype,ee=z[e];return ee===void 0||ee.overloadTable===void 0&&ee.className!==T.name&&ee.argCount===a-2?(_.argCount=a-2,_.className=T.name,z[e]=_):(Ae(z,e,P),z[e].overloadTable[a-2]=_),A([],Q,O=>{var K=rt(P,O,T,d,p);return z[e].overloadTable===void 0?(K.argCount=a-2,z[e]=K):z[e].overloadTable[a-2]=K,[]}),[]})},Nt=[],we=[0,1,,1,null,1,!0,1,!1,1],Ht=[],Pr=t=>{if(t>9&&--we[t+1]===0){var e=we[t];we[t]=void 0;var a=Ht[t];a&&(Ht[t]=void 0,a(e)),Nt.push(t)}},at={toValue:t=>(t||H(`Cannot use deleted val. handle = ${t}`),we[t]),toHandle:t=>{switch(t){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{let e=Nt.pop()||we.length;return we[e]=t,we[e+1]=1,e}}}},$r={name:"emscripten::val",fromWireType:t=>{var e=at.toValue(t);return Pr(t),e},toWireType:(t,e)=>at.toHandle(e),readValueFromPointer:he,destructorFunction:null},Tr=t=>le(t,$r),Pt,$t,_r=(t,e)=>{switch(e){case 4:return function(a){return this.fromWireType(Pt[a>>2])};case 8:return function(a){return this.fromWireType($t[a>>3])};default:throw new TypeError(`invalid float width (${e}): ${t}`)}},qr=(t,e,a)=>{e=B(e),le(t,{name:e,fromWireType:o=>o,toWireType:(o,c)=>c,readValueFromPointer:_r(e,a),destructorFunction:null})},Lr=(t,e,a,o,c)=>{e=B(e);let d=o===0,p=v=>v;if(d){var f=32-8*a;p=v=>v<>>f,c=p(c)}le(t,{name:e,fromWireType:p,toWireType:(v,M)=>M,readValueFromPointer:Ct(e,a,o!==0),destructorFunction:null})},Jr=(t,e,a)=>{var o=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array],c=o[e];function d(p){var f=q[p>>2],v=q[p+4>>2];return new c(Z.buffer,v,f)}a=B(a),le(t,{name:a,fromWireType:d,readValueFromPointer:d},{ignoreDuplicateRegistrations:!0})},Rr=(t,e,a,o)=>{if(!(o>0))return 0;for(var c=a,d=a+o-1,p=0;p=d)break;e[a++]=f}else if(f<=2047){if(a+1>=d)break;e[a++]=192|f>>6,e[a++]=128|f&63}else if(f<=65535){if(a+2>=d)break;e[a++]=224|f>>12,e[a++]=128|f>>6&63,e[a++]=128|f&63}else{if(a+3>=d)break;e[a++]=240|f>>18,e[a++]=128|f>>12&63,e[a++]=128|f>>6&63,e[a++]=128|f&63,p++}}return e[a]=0,a-c},Tt=(t,e,a)=>Rr(t,j,e,a),_t=t=>{for(var e=0,a=0;a=55296&&o<=57343?(e+=4,++a):e+=3}return e},Kr=(t,e)=>{e=B(e),le(t,{name:e,fromWireType(a){var o=q[a>>2],c=a+4,d;return d=de(c,o,!0),ce(a),d},toWireType(a,o){o instanceof ArrayBuffer&&(o=new Uint8Array(o));var c,d=typeof o=="string";d||ArrayBuffer.isView(o)&&o.BYTES_PER_ELEMENT==1||H("Cannot pass non-string to std::string"),d?c=_t(o):c=o.length;var p=it(4+c+1),f=p+4;return q[p>>2]=c,d?Tt(o,f,c+1):j.set(o,f),a!==null&&a.push(ce,p),p},readValueFromPointer:he,destructorFunction(a){ce(a)}})},qt=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,Ir=(t,e,a)=>{var o=t>>1,c=C(Ee,o,e/2,a);if(c-o>16&&qt)return qt.decode(Ee.subarray(o,c));for(var d="",p=o;p{if(a<2)return 0;a-=2;for(var o=e,c=a>1]=p,e+=2}return Re[e>>1]=0,e-o},zr=t=>t.length*2,Or=(t,e,a)=>{for(var o="",c=t>>2,d=0;!(d>=e/4);d++){var p=q[c+d];if(!p&&!a)break;o+=String.fromCodePoint(p)}return o},Vr=(t,e,a=2147483647)=>{if(a<4)return 0;for(var o=e,c=o+a-4,d=0;d65535&&d++,Ke[e>>2]=p,e+=4,e+4>c)break}return Ke[e>>2]=0,e-o},Zr=t=>{for(var e=0,a=0;a65535&&a++,e+=4}return e},Sr=(t,e,a)=>{a=B(a);var o,c,d;e===2?(o=Ir,c=Xr,d=zr):(o=Or,c=Vr,d=Zr),le(t,{name:a,fromWireType:p=>{var f=q[p>>2],v=o(p+4,f*e,!0);return ce(p),v},toWireType:(p,f)=>{typeof f!="string"&&H(`Cannot pass non-string to C++ string type ${a}`);var v=d(f),M=it(4+v+e);return q[M>>2]=v/e,c(f,M+4,v+e),p!==null&&p.push(ce,M),M},readValueFromPointer:he,destructorFunction(p){ce(p)}})},Yr=(t,e,a,o,c,d)=>{ve[t]={name:B(e),rawConstructor:oe(a,o),rawDestructor:oe(c,d),fields:[]}},Br=(t,e,a,o,c,d,p,f,v,M)=>{ve[t].fields.push({fieldName:B(e),getterReturnType:a,getter:oe(o,c),getterContext:d,setterArgumentType:p,setter:oe(f,v),setterContext:M})},Dr=(t,e)=>{e=B(e),le(t,{isVoid:!0,name:e,fromWireType:()=>{},toWireType:(a,o)=>{}})},Gr=()=>{},ke={},jr=t=>{if(t instanceof V||t=="unwind")return y;i(1,t)},Wr=t=>{y=t,i(t,new V(t))},Ar=t=>{if(!g)try{return t()}catch(e){jr(e)}},en=()=>performance.now(),tn=(t,e)=>{if(ke[t]&&(clearTimeout(ke[t].id),delete ke[t]),!e)return 0;var a=setTimeout(()=>{delete ke[t],Ar(()=>Jt(t,en()))},e);return ke[t]={id:a,timeout_ms:e},0},rn=()=>2147483648,nn=(t,e)=>Math.ceil(t/e)*e,an=t=>{var e=Ve.buffer.byteLength,a=(t-e+65535)/65536|0;try{return Ve.grow(a),F(),1}catch{}},on=t=>{var e=j.length;t>>>=0;var a=rn();if(t>a)return!1;for(var o=1;o<=4;o*=2){var c=e*(1+.2/o);c=Math.min(c,t+100663296);var d=Math.min(a,nn(Math.max(t,c),65536)),p=an(d);if(p)return!0}return!1},sn=t=>52;function un(t,e,a,o){return 70}var ln=[null,[],[]],cn=(t,e)=>{var a=ln[t];!e||e===10?((t===1?s:l)(S(a)),a.length=0):a.push(e)},dn=(t,e,a,o)=>{for(var c=0,d=0;d>2],f=q[e+4>>2];e+=8;for(var v=0;v>2]=c,0};ur(),Ur(),n.wasmBinary&&(h=n.wasmBinary),n.UTF8ToString=de,n.stringToUTF8=Tt,n.lengthBytesUTF8=_t;var Lt,it,ce,Jt,Rt,Kt,It,Xt,zt,Ot,Vt,Ve,Zt;function pn(t){Lt=t.B,it=n._malloc=t.C,ce=n._free=t.D,Jt=t.F,Rt=t.G,Kt=t.H,It=t.I,Xt=t.J,zt=t.K,Ot=t.L,Ve=t.z,Zt=t.E,Vt=t.M}var fn={t:Ce,x:Je,f:Ge,i:ar,l:ir,o:xr,b:Fr,n:Nr,d:Hr,y:Tr,h:qr,c:Lr,a:Jr,k:Kr,g:Sr,j:Yr,e:Br,m:Dr,w:Gr,p:tn,u:on,s:sn,q:un,r:dn,v:Wr};async function hn(){!g&&m()}var Fe;return Fe=await b(),await hn(),n}var _n=Tn,qn=new Int8Array([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,90,63,64,65,66,-1,67,68,69,70,71,-1,72,73,52,53,54,55,56,57,58,59,60,61,74,75,76,77,78,79,80,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,81,-1,82,83,84,85,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,86,87,88,89,-1]);function Ln(r){let n=new Uint8Array(170930),i=0,u=0,s=0,l=-1;for(let h=0,g=r.length;h127)continue;let E=qn[y];if(!(E<0))if(l<0)l=E;else{l+=E*91,u|=l<88?13:14;do n[i++]=u,u>>>=8,s-=8;while(s>7);l=-1}}return l>=0&&(n[i++]=(u|l<""})}function Kn(){ht=void 0}var In=class{_module;constructor(r){this._module=r}malloc(r){let n=this._module._malloc(r);return{ptr:n,size:r,dispose:()=>this.free({ptr:n,size:r,dispose:()=>{}})}}free(r){this._module._free(r.ptr)}dataToHeap(r){let n=this.malloc(r.byteLength);return this._module.HEAPU8.set(r,n.ptr),n}heapView(r){return this._module.HEAPU8.subarray(r.ptr,r.ptr+r.size)}heapToUint8Array(r){return new Uint8Array([...this.heapView(r)])}lengthBytes(r){return this._module.lengthBytesUTF8(r)}stringToHeap(r){let n=this.lengthBytes(r)+1,i=this._module._malloc(n);return this._module.stringToUTF8(r,i,n),{ptr:i,size:n,dispose:()=>this.free({ptr:i,size:n,dispose:()=>{}})}}heapToString(r){return this._module.UTF8ToString(r.ptr,r.size)}hasFilesystem(){let r=this._module;return r.FS_createPath!==void 0&&r.FS_createDataFile!==void 0&&r.FS_preloadFile!==void 0&&r.FS_unlink!==void 0}createPath(r,n=!0,i=!0){return this._module.FS_createPath("/",r,n,i)}createDataFile(r,n,i=!0,u=!0,s=!0){return this._module.FS_createDataFile("/",r,n,i,u,s)}preloadFile(r,n,i=!0,u=!0,s=!1,l=!0,h=!1){return this._module.FS_preloadFile("/",r,n,i,u,s,l,h)}unlink(r){return this._module.FS_unlink(r)}},Ne,Xn=4294967295;function He(r,n){if(!Number.isInteger(r)||r<0||r>Xn)throw new Error(`${n} length ${r} is outside the WASM32-safe range`)}function lt(r){if(r.length===0)return new Uint8Array(0);if(r.length===1)return r[0];let n=0;for(let s of r)n+=s.length;let i=new Uint8Array(n),u=0;for(let s of r)i.set(s,u),u+=s.length;return i}var zn=class Wt{_mainModule;_zstdClass;_zstd;_compressionLevel;_decompressFrameCompleted=!1;_decompressRemaining=0;_decompressSawInput=!1;constructor(n){this._mainModule=new In(n),this._zstdClass=n.zstd,this._zstd=new this._zstdClass,this._compressionLevel=this._zstdClass.defaultCLevel()}static load(){return Ne||(Ne=Rn().then(n=>new Wt(n))),Ne}static unload(){Kn(),Ne?.then(n=>{n?._zstd?.delete()}),Ne=void 0}copyHeap(n){return this._mainModule.heapView(n).slice()}mallocChecked(n,i){He(n,i);let u=this._mainModule.malloc(n);if(!u.ptr)throw this._mainModule.free(u),new Error(`Failed to allocate ${n} bytes for ${i}`);return u}throwStreamError(n,i){throw new Error(`${n} failed: ${i.errorName||"unknown error"}`)}ensureStreamOk(n,i){i.error&&this.throwStreamError(n,i)}version(){return this._zstdClass.version()}reset(){let n=this._zstd.reset();this.ensureStreamOk("reset",n),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}resetCompression(n){n!==void 0&&(this._compressionLevel=n);let i=this._zstd.resetCompression(this._compressionLevel);this.ensureStreamOk("resetCompression",i)}resetDecompression(){let n=this._zstd.resetDecompression();this.ensureStreamOk("resetDecompression",n),this._decompressFrameCompleted=!1,this._decompressRemaining=0,this._decompressSawInput=!1}setCompressionLevel(n){let i=this._zstd.setCompressionLevel(n);this.ensureStreamOk("setCompressionLevel",i),this._compressionLevel=n}compress(n,i=this.defaultCLevel()){He(n.length,"compress input");let u=this._mainModule.dataToHeap(n);try{if(!u.ptr&&n.length>0)throw new Error("Failed to allocate compress input buffer");let s=this._zstdClass.compressBound(n.length),l=this.mallocChecked(s,"compress output");try{if(l.size=this._zstdClass.compress(l.ptr,s,u.ptr,u.size,i),this._zstdClass.isError(l.size))throw new Error(`compress failed: ${this._zstdClass.getErrorName(l.size)}`);return this.copyHeap(l)}finally{this._mainModule.free(l)}}finally{this._mainModule.free(u)}}compressChunk(n){if(He(n.length,"compressChunk input"),n.length===0)return new Uint8Array(0);let i=this._mainModule.dataToHeap(n);try{if(!i.ptr)throw new Error("Failed to allocate compressChunk input buffer");let u=this._zstdClass.CStreamOutSize(),s=[],l=0;for(;l0&&(h.size=g.produced,s.push(this.copyHeap(h)))}finally{this._mainModule.free(h)}}return lt(s)}finally{this._mainModule.free(i)}}compressEnd(){let n=this._zstdClass.CStreamOutSize(),i=[],u=1;for(;u!==0;){let s=this.mallocChecked(n,"compressEnd output");try{let l=this._zstd.compressEnd(s.ptr,n);if(this.ensureStreamOk("compressEnd",l),l.produced===0&&l.remaining!==0)throw new Error("compressEnd failed: no progress while finishing stream");u=l.remaining,l.produced>0&&(s.size=l.produced,i.push(this.copyHeap(s)))}finally{this._mainModule.free(s)}}return lt(i)}frameContentSize(n){return this._zstdClass.getFrameContentSize(n.ptr,n.size)}decompress(n){He(n.length,"decompress input");let i=this._mainModule.dataToHeap(n);try{if(!i.ptr&&n.length>0)throw new Error("Failed to allocate decompress input buffer");let u=this.frameContentSize(i);if(u.error)throw new Error(`Failed to get frame content size: ${u.errorName}`);let s=u.known;if(s){let l=this._zstdClass.findFrameCompressedSize(i.ptr,i.size);if(this._zstdClass.isError(l))throw new Error(`Failed to find frame compressed size: ${this._zstdClass.getErrorName(l)}`);l0?i.ptr+l:0,U=this._zstd.decompressChunk(g.ptr,u,E,y);if(this.ensureStreamOk("decompressChunk",U),U.consumed===0&&U.produced===0){if(y===0){U.remaining>0&&(this._decompressRemaining=U.remaining);break}throw new Error("decompressChunk failed: no progress while consuming input")}l+=U.consumed,h=U.produced===u&&U.remaining!==0,U.produced>0&&(g.size=U.produced,s.push(this.copyHeap(g))),U.remaining===0?(this._decompressFrameCompleted=!0,this._decompressRemaining=0):this._decompressRemaining=U.remaining}finally{this._mainModule.free(g)}}return lt(s)}finally{this._mainModule.free(i)}}decompressEnd(){if(!this._decompressSawInput)throw new Error("decompressEnd failed: empty compressed input is not a completed frame");if(!this._decompressFrameCompleted||this._decompressRemaining!==0)throw new Error("decompressEnd failed: truncated Zstandard input")}defaultCLevel(){return this._zstdClass.defaultCLevel()}minCLevel(){return this._zstdClass.minCLevel()}maxCLevel(){return this._zstdClass.maxCLevel()}};let ct=null;function On(){return ct||(ct=zn.load()),ct}function Vn(r){return r.length>=4&&r[0]===40&&r[1]===181&&r[2]===47&&r[3]===253}function gt(r){const n="SQLite format 3\0";if(r.length

🏠 Главная

Локальное сохранение и повторения — всё работает офлайн.

Проверка локальной базы…
`;const i=r.querySelector("#home-db-status"),u=r.querySelector("#btn-go-sync"),s=r.querySelector("#home-actions"),l=r.querySelector("#btn-start");u.addEventListener("click",()=>n.goSync()),l.addEventListener("click",()=>{i.textContent="Экран повторений — следующий шаг."}),(async()=>{if(!await Se()){i.textContent="Локальной базы нет. Скачай сохранение на странице «Синхронизация».",s.hidden=!0;return}try{const g=await vn(),y=gt(g);i.textContent=y?`Локальная база на месте: ${(g.length/1024).toFixed(1)} КБ, сигнатура SQLite OK.`:"Файл в OPFS есть, но это не похоже на SQLite — перекачай сохранение.",s.hidden=!y}catch(g){i.textContent=`Не удалось прочитать базу: ${g instanceof Error?g.message:String(g)}`,s.hidden=!0}})()}const Bt=24,Yn=/^[A-Za-z0-9]{24}$/,At="japlearn_sync_token";function Dt(r){return r.trim().replace(/\s+/g,"")}function ye(r){return Yn.test(r)}function Bn(){try{return localStorage.getItem(At)??""}catch{return""}}function dt(r){try{localStorage.setItem(At,r)}catch{}}const er="https://learning.micialware.ru";function Dn(r,n=er){return`${n.replace(/\/+$/,"")}/download/${encodeURIComponent(r)}`}async function Gn(r,n,i=er){const u=Dn(r,i);let s;try{s=await fetch(u,{method:"GET",...n})}catch(h){throw new Error(`Нет связи с сервером: ${h instanceof Error?h.message:String(h)}`)}if(!s.ok)throw s.status===404?new Error("Сохранение не найдено (404). Проверь токен."):new Error(`Сервер ответил ${s.status} ${s.statusText}`);const l=await s.arrayBuffer();if(l.byteLength===0)throw new Error("Сервер вернул пустой файл");return new Uint8Array(l)}function jn(r){r.innerHTML=`

📡 Синхронизация

Токен сохранения — 24 символа: латинские буквы и цифры.

0 / 24

Введите токен из 24 символов

`;const n=r.querySelector("#token-input"),i=r.querySelector("#token-error"),u=r.querySelector("#token-counter"),s=r.querySelector("#btn-download"),l=r.querySelector("#btn-upload"),h=r.querySelector("#status");function g(m){h.textContent=m,console.log(`[JapLearn] ${m}`)}function y(){return Dt(n.value)}function E(m){s.disabled=m||!ye(y()),l.disabled=!0,n.disabled=m,m||Se().then(x=>{!n.disabled&&ye(y())&&(l.disabled=!x)})}function U(){const m=y(),x=m.length;u.textContent=`${x} / ${Bt}`;const w=ye(m),$=x===0;n.classList.toggle("invalid",!$&&!w),n.setAttribute("aria-invalid",String(!$&&!w)),$?i.textContent="":x!==Bt?i.textContent=`Нужно 24 символа, сейчас ${x}`:i.textContent=w?"":"Только латинские буквы и цифры",s.disabled=!w,w?Se().then(D=>{n.disabled||(l.disabled=!D)}):l.disabled=!0}async function k(){const m=y();if(ye(m)){dt(m),E(!0),g("Скачивание сохранения...");try{const x=await Gn(m);g(`Скачано ${(x.length/1024).toFixed(1)} КБ, распаковка...`);const w=await Zn(x);g(`Распаковано ${(w.length/1024).toFixed(1)} КБ, сохранение в OPFS...`),await gn(w),g(`Готово: база ${(w.length/1024).toFixed(1)} КБ сохранена локально (OPFS).`)}catch(x){g(`Ошибка скачивания: ${x instanceof Error?x.message:String(x)}`)}finally{E(!1),U()}}}n.addEventListener("input",()=>{U()}),n.addEventListener("change",()=>{const m=y();n.value=m,ye(m)&&(dt(m),g("Токен сохранён локально. Можно скачивать или выгружать.")),U()}),s.addEventListener("click",()=>{k()}),l.addEventListener("click",()=>{const m=y();ye(m)&&(dt(m),g("Выгрузка — следующий шаг (POST /upload/stream/{id})."))});const F=Bn();F&&(n.value=F),U(),ye(Dt(F))&&Se().then(m=>{g(m?"Токен восстановлен, локальная база на месте.":"Токен восстановлен. Нажми «Скачать», чтобы получить базу."),U()})}const Wn={home:"Главная",sync:"Синхронизация"};function _e(r){const n=document.getElementById(r);if(!n)throw new Error(`[JapLearn] Не найден элемент #${r}`);return n}const tr=_e("burger-btn"),Be=_e("drawer"),rr=_e("drawer-overlay"),An=_e("page-title"),Gt=_e("page");let yt=!1;function qe(r){yt=r,Be.classList.toggle("open",r),rr.hidden=!r,tr.setAttribute("aria-expanded",String(r)),Be.setAttribute("aria-hidden",String(!r)),document.body.classList.toggle("drawer-open",r)}function ea(r){Be.querySelectorAll(".drawer-btn").forEach(n=>{n.classList.toggle("active",n.dataset.page===r)})}function mt(r){An.textContent=Wn[r],ea(r),r==="home"?Sn(Gt,{goSync:()=>mt("sync")}):jn(Gt)}tr.addEventListener("click",()=>{qe(!yt)});rr.addEventListener("click",()=>{qe(!1)});document.addEventListener("keydown",r=>{r.key==="Escape"&&yt&&qe(!1)});Be.querySelectorAll(".drawer-btn").forEach(r=>{r.addEventListener("click",()=>{const n=r.dataset.page;(n==="home"||n==="sync")&&mt(n),qe(!1)})});qe(!1);mt("home");console.log("[JapLearn] crossOriginIsolated =",window.crossOriginIsolated);