font update

This commit is contained in:
micialware committed 2026-10-05 09:56:09 +03:00
1 parent f754cafbe4
commit 17731364bd
66 files changed
+10342 -76

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
var ft=(()=>{var qe=import.meta.url;return function(oe={}){var fe,i=oe,ye,be,Oe=new Promise((e,t)=>{ye=e,be=t}),Xe=typeof window=="object",Ce=typeof importScripts=="function";typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";const Pe=globalThis.sqlite3InitModuleState||Object.assign(Object.create(null),{debugModule:()=>{}});delete globalThis.sqlite3InitModuleState,Pe.debugModule("globalThis.location =",globalThis.location);var He=Object.assign({},i),re="./this.program",me="";function Ie(e){return i.locateFile?i.locateFile(e,me):me+e}var De,je;(Xe||Ce)&&(Ce?me=self.location.href:typeof document<"u"&&document.currentScript&&(me=document.currentScript.src),qe&&(me=qe),me.startsWith("blob:")?me="":me=me.substr(0,me.replace(/[?#].*/,"").lastIndexOf("/")+1),Ce&&(je=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),De=e=>fetch(e,{credentials:"same-origin"}).then(t=>t.ok?t.arrayBuffer():Promise.reject(new Error(t.status+" : "+t.url))));var Ve=i.print||console.log.bind(console),Le=i.printErr||console.error.bind(console);Object.assign(i,He),He=null,i.arguments&&i.arguments,i.thisProgram&&(re=i.thisProgram);var Ye=i.wasmBinary,Re,dt=!1,xe,Be,Ge,ue,Ee,ke;function pt(){var e=Re.buffer;i.HEAP8=xe=new Int8Array(e),i.HEAP16=Ge=new Int16Array(e),i.HEAPU8=Be=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAP32=ue=new Int32Array(e),i.HEAPU32=Ee=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e),i.HEAP64=ke=new BigInt64Array(e),i.HEAPU64=new BigUint64Array(e)}if(i.wasmMemory)Re=i.wasmMemory;else{var Pt=i.INITIAL_MEMORY||16777216;Re=new WebAssembly.Memory({initial:Pt/65536,maximum:32768})}pt();var ht=[],mt=[],gt=[];function Lt(){var e=i.preRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Rt)),ot(ht)}function Ct(){!i.noFSInit&&!a.initialized&&a.init(),a.ignorePermissions=!1,ot(mt)}function Dt(){var e=i.postRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Mt)),ot(gt)}function Rt(e){ht.unshift(e)}function Nt(e){mt.unshift(e)}function Mt(e){gt.unshift(e)}var Ne=0,$e=null;function tr(e){return e}function rt(e){Ne++,i.monitorRunDependencies?.(Ne)}function Ze(e){if(Ne--,i.monitorRunDependencies?.(Ne),Ne==0&&$e){var t=$e;$e=null,t()}}function st(e){i.onAbort?.(e),e="Aborted("+e+")",Le(e),dt=!0,e+=". Build with -sASSERTIONS for more info.";var t=new WebAssembly.RuntimeError(e);throw be(t),t}var jt="data:application/octet-stream;base64,",qt=e=>e.startsWith(jt);function Bt(){if(i.locateFile){var e="sqlite3.wasm";return qt(e)?e:Ie(e)}return new URL("/assets/sqlite3-DBpDb1lf.wasm",import.meta.url).href}var it;function bt(e){if(e==it&&Ye)return new Uint8Array(Ye);if(je)return je(e);throw"both async and sync fetching of the wasm failed"}function Ut(e){return Ye?Promise.resolve().then(()=>bt(e)):De(e).then(t=>new Uint8Array(t),()=>bt(e))}function yt(e,t,n){return Ut(e).then(r=>WebAssembly.instantiate(r,t)).then(n,r=>{Le(`failed to asynchronously prepare wasm: ${r}`),st(r)})}function zt(e,t,n,r){return!e&&typeof WebAssembly.instantiateStreaming=="function"&&!qt(t)&&typeof fetch=="function"?fetch(t,{credentials:"same-origin"}).then(s=>{var o=WebAssembly.instantiateStreaming(s,n);return o.then(r,function(p){return Le(`wasm streaming compile failed: ${p}`),Le("falling back to ArrayBuffer instantiation"),yt(t,n,r)})}):yt(t,n,r)}function Wt(){return{env:It,wasi_snapshot_preview1:It}}function Qt(){var e=Wt();function t(r,s){return h=r.exports,Nt(h.__wasm_call_ctors),Ze(),h}rt();function n(r){t(r.instance)}if(i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(r){Le(`Module.instantiateWasm callback failed with error: ${r}`),be(r)}return it??=Bt(),zt(Ye,it,e,n).catch(be),{}}var ot=e=>{e.forEach(t=>t(i))};i.noExitRuntime;var de={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return t.exec(e).slice(1)},normalizeArray:(e,t)=>{for(var n=0,r=e.length-1;r>=0;r--){var s=e[r];s==="."?e.splice(r,1):s===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n;n--)e.unshift("..");return e},normalize:e=>{var t=de.isAbs(e),n=e.substr(-1)==="/";return e=de.normalizeArray(e.split("/").filter(r=>!!r),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},dirname:e=>{var t=de.splitPath(e),n=t[0],r=t[1];return!n&&!r?".":(r&&(r=r.substr(0,r.length-1)),n+r)},basename:e=>{if(e==="/")return"/";e=de.normalize(e),e=e.replace(/\/$/,"");var t=e.lastIndexOf("/");return t===-1?e:e.substr(t+1)},join:(...e)=>de.normalize(e.join("/")),join2:(e,t)=>de.normalize(e+"/"+t)},Ht=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return e=>crypto.getRandomValues(e);st("initRandomDevice")},wt=e=>(wt=Ht())(e),Te={resolve:(...e)=>{for(var t="",n=!1,r=e.length-1;r>=-1&&!n;r--){var s=r>=0?e[r]:a.cwd();if(typeof s!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!s)return"";t=s+"/"+t,n=de.iLine truncated
`)),!e)return null;lt=vt(e)}return lt.shift()},Me={ttys:[],init(){},shutdown(){},register(e,t){Me.ttys[e]={input:[],output:[],ops:t},a.registerDevice(e,Me.stream_ops)},stream_ops:{open(e){var t=Me.ttys[e.node.rdev];if(!t)throw new a.ErrnoError(43);e.tty=t,e.seekable=!1},close(e){e.tty.ops.fsync(e.tty)},fsync(e){e.tty.ops.fsync(e.tty)},read(e,t,n,r,s){if(!e.tty||!e.tty.ops.get_char)throw new a.ErrnoError(60);for(var o=0,p=0;p<r;p++){var g;try{g=e.tty.ops.get_char(e.tty)}catch{throw new a.ErrnoError(29)}if(g===void 0&&o===0)throw new a.ErrnoError(6);if(g==null)break;o++,t[n+p]=g}return o&&(e.node.timestamp=Date.now()),o},write(e,t,n,r,s){if(!e.tty||!e.tty.ops.put_char)throw new a.ErrnoError(60);try{for(var o=0;o<r;o++)e.tty.ops.put_char(e.tty,t[n+o])}catch{throw new a.ErrnoError(29)}return r&&(e.node.timestamp=Date.now()),o}},default_tty_ops:{get_char(e){return Vt()},put_char(e,t){t===null||t===10?(Ve(Ue(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(Ve(Ue(e.output)),e.output=[])},ioctl_tcgets(e){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,t,n){return 0},ioctl_tiocgwinsz(e){return[24,80]}},default_tty1_ops:{put_char(e,t){t===null||t===10?(Le(Ue(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(Le(Ue(e.output)),e.output=[])}}},Gt=(e,t)=>{Be.fill(0,e,e+t)},xt=(e,t)=>Math.ceil(e/t)*t,St=e=>{e=xt(e,65536);var t=kt(65536,e);return t&&Gt(t,e),t},le={ops_table:null,mount(e){return le.createNode(null,"/",16895,0)},createNode(e,t,n,r){if(a.isBlkdev(n)||a.isFIFO(n))throw new a.ErrnoError(63);le.ops_table||={dir:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr,lookup:le.node_ops.lookup,mknod:le.node_ops.mknod,rename:le.node_ops.rename,unlink:le.node_ops.unlink,rmdir:le.node_ops.rmdir,readdir:le.node_ops.readdir,symlink:le.node_ops.symlink},stream:{llseek:le.stream_ops.llseek}},file:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr},stream:{llseek:le.stream_ops.llseek,read:le.stream_ops.read,write:le.stream_ops.write,allocate:le.stream_ops.allocate,mmap:le.stream_ops.mmap,msync:le.stream_ops.msync}},link:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr,readlink:le.node_ops.readlink},stream:{}},chrdev:{node:{getattr:le.node_ops.getattr,setattr:le.node_ops.setattr},stream:a.chrdev_stream_ops}};var s=a.createNode(e,t,n,r);return a.isDir(s.mode)?(s.node_ops=le.ops_table.dir.node,s.stream_ops=le.ops_table.dir.stream,s.contents={}):a.isFile(s.mode)?(s.node_ops=le.ops_table.file.node,s.stream_ops=le.ops_table.file.stream,s.usedBytes=0,s.contents=null):a.isLink(s.mode)?(s.node_ops=le.ops_table.link.node,s.stream_ops=le.ops_table.link.stream):a.isChrdev(s.mode)&&(s.node_ops=le.ops_table.chrdev.node,s.stream_ops=le.ops_table.chrdev.stream),s.timestamp=Date.now(),e&&(e.contents[t]=s,e.timestamp=s.timestamp),s},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,t){var n=e.contents?e.contents.length:0;if(!(n>=t)){var r=1024*1024;t=Math.max(t,n*(n<r?2:1.125)>>>0),n!=0&&(t=Math.max(t,256));var s=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(s.subarray(0,e.usedBytes),0)}},resizeFileStorage(e,t){if(e.usedBytes!=t)if(t==0)e.contents=null,e.usedBytes=0;else{var n=e.contents;e.contents=new Uint8Array(t),n&&e.contents.set(n.subarray(0,Math.min(t,e.usedBytes))),e.usedBytes=t}},node_ops:{getattr(e){var t={};return t.dev=a.isChrdev(e.mode)?e.id:1,t.ino=e.id,t.mode=e.mode,t.nlink=1,t.uid=0,t.gid=0,t.rdev=e.rdev,a.isDir(e.mode)?t.size=4096:a.isFile(e.mode)?t.size=e.usedBytes:a.isLink(e.mode)?t.size=e.link.length:t.size=0,t.atime=new Date(e.timestamp),t.mtime=new Date(e.timestamp),t.ctime=new Date(e.timestamp),t.blksize=4096,t.blocks=Math.ceil(t.size/t.blksize),t},setattr(e,t){t.mode!==void 0&&(e.mode=t.mode),t.timestamp!==void 0&&(e.timestamp=t.timestamp),t.size!==void 0&&le.resizeFileStorage(e,t.size)},lookup(e,t){throw a.genericErrors[44]},mknod(e,t,n,r){return le.createNode(e,t,n,r)},rename(e,t,n){if(a.isDir(e.mode)){var r;try{r=a.lookupNode(t,n)}catch{}if(r)for(var s in r.contents)throw new a.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=n,t.contents[n]=e,t.timestamp=e.parent.timestamp},unlink(e,t){delete e.contents[t],e.timestamp=Date.now()},rmdir(e,t){var n=a.lookupNode(e,t);for(var r in n.contents)throw new a.ErrnoError(55);delete e.contents[t],e.timestamp=Date.now()},readdir(e){var t=[".",".."];for(var n of Object.keys(e.contents))t.push(n);return t},symlink(e,t,n){var r=le.createNode(e,t,41471,0);return r.link=n,r},readlink(e){if(!a.isLink(e.mode))throw new a.ErrnoError(28);return e.link}},stream_ops:{read(e,t,n,r,s){var o=e.node.contents;if(s>=e.node.usedBytes)return 0;var p=Math.min(e.node.usedBytes-s,r);if(p>8&&o.subarray)t.set(o.sub Line truncated
Total of`,C,"op(s) for",M,"ms (incl. "+J+" ms of waiting on the async side)"),t.config.log("Serialization metrics:",I.s11n),m.postMessage({type:"opfs-async-metrics"})},reset:function(){let E;const C=J=>J.count=J.time=J.wait=0;for(E in u.opIds)C(I[E]=Object.create(null));let M=I.s11n=Object.create(null);M=M.serialize=Object.create(null),M.count=M.time=0,M=I.s11n.deserialize=Object.create(null),M.count=M.time=0}};const c=new S,d=new N().addOnDispose(()=>c.dispose());let y;const B=E=>(y=!0,d.dispose(),O(E)),f=()=>(y=!1,g(t)),m=new Worker(new URL("/assets/sqlite3-opfs-async-proxy-B_ImRJXp.js",import.meta.url));setTimeout(()=>{y===void 0&&B(new Error("Timeout while waiting for OPFS async proxy worker."))},4e3),m._originalOnError=m.onerror,m.onerror=function(E){A("Error initializing OPFS asyncer:",E),B(new Error("Loading OPFS async Worker failed for unknown reasons."))};const l=q.sqlite3_vfs_find(null),_=l?new N(l):null;c.$iVersion=1,d.$iVersion=2,d.$szOsFile=q.sqlite3_file.structInfo.sizeof,d.$mxPathname=1024,d.$zName=x.allocCString("opfs"),d.$xDlOpen=d.$xDlError=d.$xDlSym=d.$xDlClose=null,d.addOnDispose("$zName",d.$zName,"cleanup default VFS wrapper",()=>_?_.dispose():null);const u=Object.create(null);u.verbose=s.verbose,u.littleEndian=(()=>{const E=new ArrayBuffer(2);return new DataView(E).setInt16(0,256,!0),new Int16Array(E)[0]===256})(),u.asyncIdleWaitTime=150,u.asyncS11nExceptions=1,u.fileBufferSize=1024*64,u.sabS11nOffset=u.fileBufferSize,u.sabS11nSize=d.$mxPathname*2,u.sabIO=new SharedArrayBuffer(u.fileBufferSize+u.sabS11nSize),u.opIds=Object.create(null);const I=Object.create(null);{let E=0;u.opIds.whichOp=E++,u.opIds.rc=E++,u.opIds.xAccess=E++,u.opIds.xClose=E++,u.opIds.xDelete=E++,u.opIds.xDeleteNoWait=E++,u.opIds.xFileSize=E++,u.opIds.xLock=E++,u.opIds.xOpen=E++,u.opIds.xRead=E++,u.opIds.xSleep=E++,u.opIds.xSync=E++,u.opIds.xTruncate=E++,u.opIds.xUnlock=E++,u.opIds.xWrite=E++,u.opIds.mkdir=E++,u.opIds["opfs-async-metrics"]=E++,u.opIds["opfs-async-shutdown"]=E++,u.opIds.retry=E++,u.sabOP=new SharedArrayBuffer(E*4),L.metrics.reset()}u.sq3Codes=Object.create(null),["SQLITE_ACCESS_EXISTS","SQLITE_ACCESS_READWRITE","SQLITE_BUSY","SQLITE_CANTOPEN","SQLITE_ERROR","SQLITE_IOERR","SQLITE_IOERR_ACCESS","SQLITE_IOERR_CLOSE","SQLITE_IOERR_DELETE","SQLITE_IOERR_FSYNC","SQLITE_IOERR_LOCK","SQLITE_IOERR_READ","SQLITE_IOERR_SHORT_READ","SQLITE_IOERR_TRUNCATE","SQLITE_IOERR_UNLOCK","SQLITE_IOERR_WRITE","SQLITE_LOCK_EXCLUSIVE","SQLITE_LOCK_NONE","SQLITE_LOCK_PENDING","SQLITE_LOCK_RESERVED","SQLITE_LOCK_SHARED","SQLITE_LOCKED","SQLITE_MISUSE","SQLITE_NOTFOUND","SQLITE_OPEN_CREATE","SQLITE_OPEN_DELETEONCLOSE","SQLITE_OPEN_MAIN_DB","SQLITE_OPEN_READONLY"].forEach(E=>{(u.sq3Codes[E]=q[E])===void 0&&D("Maintenance required: not found:",E)}),u.opfsFlags=Object.assign(Object.create(null),{OPFS_UNLOCK_ASAP:1,OPFS_UNLINK_BEFORE_OPEN:2,defaultUnlockAsap:!1});const U=(E,...C)=>{const M=u.opIds[E]||D("Invalid op ID:",E);u.s11n.serialize(...C),Atomics.store(u.sabOPView,u.opIds.rc,-1),Atomics.store(u.sabOPView,u.opIds.whichOp,M),Atomics.notify(u.sabOPView,u.opIds.whichOp);const J=performance.now();for(;Atomics.wait(u.sabOPView,u.opIds.rc,-1)!=="not-equal";);const G=Atomics.load(u.sabOPView,u.opIds.rc);if(I[E].wait+=performance.now()-J,G&&u.asyncS11nExceptions){const te=u.s11n.deserialize();te&&A(E+"() async error:",...te)}return G};L.debug={asyncShutdown:()=>{T("Shutting down OPFS async listener. The OPFS VFS will no longer work."),U("opfs-async-shutdown")},asyncRestart:()=>{T("Attempting to restart OPFS VFS async listener. Might work, might not."),m.postMessage({type:"opfs-async-restart"})}};const ee=()=>{if(u.s11n)return u.s11n;const E=new TextDecoder,C=new TextEncoder("utf-8"),M=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),J=new DataView(u.sabIO,u.sabS11nOffset,u.sabS11nSize);u.s11n=Object.create(null);const G=Object.create(null);G.number={id:1,size:8,getter:"getFloat64",setter:"setFloat64"},G.bigint={id:2,size:8,getter:"getBigInt64",setter:"setBigInt64"},G.boolean={id:3,size:4,getter:"getInt32",setter:"setInt32"},G.string={id:4};const te=Y=>G[typeof Y]||D("Maintenance required: this value type cannot be serialized.",Y),ae=Y=>{switch(Y){case G.number.id:return G.number;case G.bigint.id:return G.bigint;case G.boolean.id:return G.boolean;case G.string.id:return G.string;default:D("Invalid type ID:",Y)}};return u.s11n.deserialize=function(Y=!1){++I.s11n.deserialize.count;const we=performance.now(),F=M[0],V=F?[]:null;if(F){const K=[];let X=1,_e,ge,pe;for(_e=0;_e<F;++_e,++X)K.push(ae(M[X]));for(_e=0;_e<F;++_e){const he=K[_e];he.getter?(pe=J[he.getter](X,u.littleEndian),X+=he.size):(ge=J.getInt32(X,u.littleEndian),X+=4,pe=E.decode(M.slice(X,X+ge)),X+=ge),V.push(pe)}}return Y&&(M[0]=0),I.s11n.deserialize.time+=performance.now()-we,V},u.s11n.serialize=function(...Y){const we=performance.now();if(++I.s11n.serialize.count,Y.length){const F=[];let V=0,K=1;for(M[0]=Y.length&255;V<Y.length;++V,++K)F.push(te(Y[V])),M[K]=F[V].id;for(V Line truncated
+1
View File
@@ -0,0 +1 @@
@font-face{font-family:Noto Sans JP;src:url(/fonts/NotoSansJP-VariableFont_wght.ttf) format("truetype");font-weight:100 900;font-style:normal;font-display:swap}:root{color-scheme:dark;--bg: #282828;--fg: #fbf1c7;--bg-weakest: #2f2f2f;--bg-weak: #414141;--bg-strong: #4f4f4f;--muted: #908c7c;--secondary: #908c7c;--secondary-strong: #9f9b8d;--on-secondary: #1f1e1a;--primary: #458588;--primary-weak: #3b6c6e;--primary-strong: #49a8ac;--on-primary: #0a1c1d;--success: #98971a;--success-strong: #7c7900;--on-success: #222102;--warning: #d79921;--warning-strong: #b67a00;--on-warning: #342203;--danger: #cc241d;--danger-strong: #ff0000;--on-danger: #fdf9f9;--danger-text: #fb4934;--fg-soft: rgb(251 241 199 / .85);--fg-faint: rgb(251 241 199 / .3);--surface-press: rgb(255 255 255 / .1);--surface-press-soft: rgb(255 255 255 / .08);--space: 16px;--space-half: 8px;--space-quarter: 4px;--radius: 8px;--radius-sm: 12px;--radius-xs: 2px;font-family:Noto Sans JP,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:17px;line-height:1.5;color:var(--fg);background:var(--bg)}*{box-sizing:border-box}body{margin:0;min-height:100dvh;display:flex;justify-content:center;background:var(--bg);color:var(--fg);padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)}::selection{background:var(--primary-weak);color:var(--fg)}#app{width:100%;max-width:480px;padding:var(--space) var(--space) calc(var(--space) * 2);display:flex;flex-direction:column;gap:var(--space)}.top-bar{display:flex;align-items:center;gap:12px}.burger-btn{width:44px;height:44px;border:none;border-radius:var(--radius);background:transparent;color:var(--fg);cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;touch-action:manipulation;flex:none}.burger-btn span{display:block;width:20px;height:2px;border-radius:1px;background:currentColor}.burger-btn:active,.burger-btn[aria-expanded=true]{background:var(--surface-press)}.burger-btn[aria-expanded=true] span{background:var(--primary-strong)}.top-bar-title h1{margin:0;font-size:22px;font-weight:700;line-height:1.2}.top-bar-title p{margin:0;font-size:.9rem;color:var(--muted)}.top-bar-spacer{flex:1}.app-content{display:flex;flex-direction:column;gap:var(--space)}.drawer-overlay{position:fixed;inset:0;background:#282828b8;z-index:40}.drawer-overlay[hidden]{display:none}.drawer{position:fixed;top:0;left:0;bottom:0;width:min(300px,85vw);background:var(--bg-weakest);border-right:1px solid var(--bg-weak);z-index:50;transform:translate(-105%);visibility:hidden;transition:transform .22s ease,visibility 0s linear .22s;display:flex;flex-direction:column;gap:var(--space-quarter);padding:var(--space) var(--space-half)}.drawer.open{transform:translate(0);visibility:visible;transition:transform .22s ease,visibility 0s}.drawer-header{padding:var(--space-quarter) var(--space-half) 14px;border-bottom:1px solid var(--bg-strong);margin-bottom:var(--space-half)}.drawer-logo{font-size:22px;font-weight:800;color:var(--primary-strong)}.drawer-subtitle{font-size:.9rem;color:var(--muted)}.drawer-btn{border:none;background:transparent;text-align:left;font:inherit;font-size:1.05rem;font-weight:600;color:var(--fg);padding:13px 12px;border-radius:var(--radius);cursor:pointer;touch-action:manipulation}.drawer-btn:hover,.drawer-btn:active{background:var(--surface-press)}.drawer-btn.active{background:var(--surface-press);color:var(--primary-strong)}body.drawer-open{overflow:hidden}.card{background:var(--bg-weakest);border:1px solid var(--bg-weak);border-radius:var(--radius-sm);padding:var(--space);display:flex;flex-direction:column;gap:12px}.card-title{margin:0;font-size:1.25rem;font-weight:700}.card-hint{margin:0;color:var(--muted);font-size:.95rem}.field-label{font-weight:600;font-size:.95rem}.token-input,.words-search,.words-group{padding:12px;font:inherit;font-size:1rem;color:var(--fg);background:var(--bg);border:1px solid var(--bg-strong);border-radius:var(--radius);outline:none;appearance:none}.token-input::placeholder,.words-search::placeholder{color:var(--muted)}.token-input:focus,.words-search:focus,.words-group:focus{border-color:var(--primary-strong)}.token-input:disabled{background:var(--bg-weak);color:var(--muted)}.token-input{width:100%;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;letter-spacing:.04em}.token-input.invalid{border-color:var(--danger-text)}.token-meta{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-half);min-height:1.4em}.token-error{color:var(--danger-text);font-size:.9rem}.token-counter{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}.btn-row{display:flex;gap:12px}.btn{flex:1;padding:12px 14px;font:inherit;font-size:1rem;font-weight:600;border:1px solid transparent;border-radius:var(--radius);background:var(--secondary);color:var(--on-secondary);cursor:pointer;touch-action:manipulation}.btn:not(:disabled):active{background:var(--secondary-strong)}.btn-primLine truncated
+126
View File
@@ -0,0 +1,126 @@
(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))o(s);new MutationObserver(s=>{for(const c of s)if(c.type==="childList")for(const u of c.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&o(u)}).observe(document,{childList:!0,subtree:!0});function a(s){const c={};return s.integrity&&(c.integrity=s.integrity),s.referrerPolicy&&(c.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?c.credentials="include":s.crossOrigin==="anonymous"?c.credentials="omit":c.credentials="same-origin",c}function o(s){if(s.ep)return;s.ep=!0;const c=a(s);fetch(s.href,c)}})();const Qe=new Worker(new URL("/assets/db-worker-DFFhVJkA.js",import.meta.url),{type:"module"});let pr=0,Ae=null;const et=new Map;function On(){return Ae||(Ae=new Promise((e,r)=>{Qe.onmessage=o=>{const s=o.data;if(s.type==="ready")return;const c=et.get(s.id);c&&(et.delete(s.id),s.type=="success"?c.resolve(s.data):c.reject(new Error(s.error??s.message??"Неизвестная ошибка Worker")))},Qe.onerror=o=>{console.error("[SQLite Worker] Ошибка:",o),r(new Error("Ошибка Worker"))};const a=++pr;et.set(a,{resolve:e,reject:r}),Qe.postMessage({type:"start",id:a})}),Ae)}function hr(e,r){return new Promise((a,o)=>{if(!Qe){o(new Error("Worker не создан"));return}const s=++pr;et.set(s,{resolve:a,reject:o}),Qe.postMessage({type:e,id:s,...r})})}async function ie(e,r){return await hr("query",{sql:e,params:r??[]})}async function wr(e,r){await hr("command",{sql:e,params:r??[]})}function gr(e){return new Date(e*1e3)}function Jn(){return Math.floor(Date.now()/1e3)}function Kn(e){const r=gr(e),a=String(r.getDate()).padStart(2,"0"),o=String(r.getMonth()+1).padStart(2,"0");return`${a}.${o}.${r.getFullYear()}`}function Dn(e){const r=gr(e),a=String(r.getHours()).padStart(2,"0"),o=String(r.getMinutes()).padStart(2,"0");return`${Kn(e)} ${a}:${o}`}function Xn(e){if(e==null)return[];const r=String(e).trim();return r?r.split(/[,\s;]+/).map(a=>a.trim()).filter(a=>a.length>0):[]}function zn(e){const r=new Map;if(e==null)return r;const a=String(e);if(!a)return r;const o=a.split("");for(let s=0;s+1<o.length;s+=2){const c=Number(o[s]),u=o[s+1]??"";!Number.isFinite(c)||!Number.isInteger(c)||u&&r.set(c,u)}return r}function mr(e){const r=Number(e.id??0),a=String(e.key??""),o=String(e.value??""),s=e.tags==null?"":String(e.tags),c=Number(e.group_id??1);return{id:r,key:a,value:o,tags:s,tagsList:Xn(s),more:zn(e.more),group_id:Number.isFinite(c)?c:1}}function vr(e){const r=[],a=[],o=(e.search??"").trim();if(o){r.push("(key LIKE ? ESCAPE '\\' OR value LIKE ? ESCAPE '\\' OR tags LIKE ? ESCAPE '\\')");const s=`%${o.replace(/\\/g,"\\\\").replace(/%/g,"\\%").replace(/_/g,"\\_")}%`;a.push(s,s,s)}return e.groupId!=null&&(r.push("group_id = ?"),a.push(e.groupId)),{clause:r.length>0?`WHERE ${r.join(" AND ")}`:"",params:a}}async function Bn(e={}){const{clause:r,params:a}=vr(e),s=(await ie(`SELECT COUNT(*) as cnt FROM words ${r}`,a))[0]?.cnt;return typeof s=="number"?s:Number(s??0)}async function tr(e={}){const{clause:r,params:a}=vr(e),o=Math.max(1,Math.min(e.limit??50,500)),s=Math.max(0,e.offset??0);return(await ie(`SELECT id, key, value, tags, more, group_id FROM words ${r} ORDER BY id LIMIT ? OFFSET ?`,[...a,o,s])).map(mr)}async function Vn(){return(await ie("SELECT id, name FROM word_groups ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??"")}))}async function Yn(){return(await ie("SELECT id, name, forward, backward, filter FROM decks ORDER BY id")).map(r=>({id:Number(r.id),name:String(r.name??""),forward:String(r.forward??""),backward:String(r.backward??""),filter:String(r.filter??"")}))}async function Zn(e,r){return await wr("UPDATE decks SET forward = ?, backward = ?, filter = ? WHERE id = ?",[r.forward,r.backward,r.filter,e]),nt(e)}async function nt(e){const a=(await ie("SELECT id, name, forward, backward, filter FROM decks WHERE id = ? LIMIT 1",[e]))[0];return a?{id:Number(a.id),name:String(a.name??""),forward:String(a.forward??""),backward:String(a.backward??""),filter:String(a.filter??"")}:null}async function Gn(){const e=await ie("SELECT deck_id, COUNT(*) as cnt FROM states WHERE deck_id IS NOT NULL GROUP BY deck_id"),r=new Map;for(const a of e){if(a.deck_id==null)continue;const o=a.cnt;r.set(Number(a.deck_id),typeof o=="number"?o:Number(o??0))}return r}async function jn(e){const a=(await ie("SELECT COUNT(DISTINCT word_id) as cnt FROM states WHERE deck_id = ?",[e]))[0]?.cnt;return typeof a=="number"?a:Number(a??0)}async function rr(e){const r=new Map,a=[...new Set(e.filter(s=>Number.isFinite(s)))];if(a.length===0)return r;const o=400;for(let s=0;s<a.length;s+=o){const c=a.slice(s,s+o),u=c.map(()=>"?").join(","),h=await ie(`SELECT id, key, value, tags, more, group_id FROM words WHERE id IN (${u})`,c);for(const v of h.map(mr))r.set(v.id,v)}return r}function Wn(e,r){const a=new Map;a.set("key",e.key),a.set("value"Line truncated
w.key as wkey, w.value as wvalue
FROM history h LEFT JOIN words w ON w.id = h.word_id
WHERE h.deck_id = ? ORDER BY h.timestamp DESC, h.id DESC LIMIT ? OFFSET ?`,[e,a,o])).map(c=>({id:Number(c.id),deck_id:Number(c.deck_id),word_id:Number(c.word_id),timestamp:Number(c.timestamp??0),answer:Number(c.answer??0),before:Number(c.before??0),after:Number(c.after??0),fsrs:Number(c.fsrs??0),wordKey:c.wkey==null?"":String(c.wkey),wordValue:c.wvalue==null?"":String(c.wvalue)}))}const Ut="japanese_app.db";async function xt(){return navigator.storage.getDirectory()}async function na(e){e[18]=1,e[19]=1;const a=await(await xt()).getFileHandle(Ut,{create:!0}),o=a.createSyncAccessHandle;if(typeof o=="function")try{const c=await o.call(a);try{c.truncate(0),c.write(e,{at:0}),c.flush()}finally{c.close()}return}catch{}const s=await a.createWritable();try{await s.truncate(0);const c=new Uint8Array(e.length);c.set(e),await s.write(c)}finally{await s.close()}}async function aa(){const e=await xt();let r;try{r=await e.getFileHandle(Ut)}catch{throw new Error("Локальная база не найдена — сначала скачай сохранение")}const a=await r.getFile();if(a.size===0)throw new Error("Локальная база пуста");return new Uint8Array(await a.arrayBuffer())}async function Oe(){try{return(await(await(await xt()).getFileHandle(Ut)).getFile()).size>0}catch{return!1}}var sa=ArrayBuffer,G=Uint8Array,tt=Uint16Array,ia=Int16Array,at=Int32Array,mt=function(e,r,a){if(G.prototype.slice)return G.prototype.slice.call(e,r,a);(r==null||r<0)&&(r=0),(a==null||a>e.length)&&(a=e.length);var o=new G(a-r);return o.set(e.subarray(r,a)),o},Ie=function(e,r,a,o){if(G.prototype.fill)return G.prototype.fill.call(e,r,a,o);for((a==null||a<0)&&(a=0),(o==null||o>e.length)&&(o=e.length);a<o;++a)e[a]=r;return e},oa=function(e,r,a,o){if(G.prototype.copyWithin)return G.prototype.copyWithin.call(e,r,a,o);for((a==null||a<0)&&(a=0),(o==null||o>e.length)&&(o=e.length);a<o;)e[r++]=e[a++]},ca=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],A=function(e,r,a){var o=new Error(r||ca[e]);if(o.code=e,Error.captureStackTrace&&Error.captureStackTrace(o,A),!a)throw o;return o},sr=function(e,r,a){for(var o=0,s=0;o<a;++o)s|=e[r++]<<(o<<3);return s},la=function(e,r){return(e[r]|e[r+1]<<8|e[r+2]<<16|e[r+3]<<24)>>>0},ua=function(e,r){var a=e[0]|e[1]<<8|e[2]<<16;if(a==3126568&&e[3]==253){var o=e[4],s=o>>5&1,c=o>>2&1,u=o&3,h=o>>6;o&8&&A(0);var v=6-s,p=u==3?4:u,y=sr(e,v,p);v+=p;var C=h?1<<h:s,k=sr(e,v,C)+(h==1&&256),E=k;if(!s){var $=1<<10+(e[5]>>3);E=$+($>>3)*(e[5]&7)}E>2145386496&&A(1);var w=new G((r==1?k||E:r?0:E)+12);return w[0]=1,w[4]=4,w[8]=8,{b:v+C,y:0,l:0,d:y,w:r&&r!=1?r:w.subarray(12),e:E,o:new at(w.buffer,0,3),u:k,c,m:Math.min(131072,E)}}else if((a>>4|e[3]<<20)==25481893)return la(e,4)+8;A(0)},Ce=function(e){for(var r=0;1<<r<=e;++r);return r-1},Je=function(e,r,a){var o=(r<<3)+4,s=(e[r]&15)+5;s>a&&A(3);for(var c=1<<s,u=c,h=-1,v=-1,p=-1,y=c,C=new sa(512+(c<<2)),k=new ia(C,0,256),E=new tt(C,0,256),$=new tt(C,512,c),w=512+(c<<1),U=new G(C,w,c),I=new G(C,w+c);h<255&&u>0;){var O=Ce(u+1),H=o>>3,z=(1<<O+1)-1,R=(e[H]|e[H+1]<<8|e[H+2]<<16)>>(o&7)&z,x=(1<<O)-1,F=z-u-1,Q=R&x;if(Q<F?(o+=O,R=Q):(o+=O+1,R>x&&(R-=F)),k[++h]=--R,R==-1?(u+=R,U[--y]=h):u-=R,!R)do{var q=o>>3;v=(e[q]|e[q+1]<<8)>>(o&7)&3,o+=2,h+=v}while(v==3)}(h>255||u)&&A(0);for(var X=0,j=(c>>1)+(c>>3)+3,V=c-1,B=0;B<=h;++B){var L=k[B];if(L<1){E[B]=-L;continue}for(p=0;p<L;++p){U[X]=B;do X=X+j&V;while(X>=y)}}for(X&&A(0),p=0;p<c;++p){var b=E[U[p]]++,S=I[p]=s-Ce(b);$[p]=(b<<S)-c}return[o+7>>3,{b:s,s:U,n:I,t:$}]},da=function(e,r){var a=0,o=-1,s=new G(292),c=e[r],u=s.subarray(0,256),h=s.subarray(256,268),v=new tt(s.buffer,268);if(c<128){var p=Je(e,r+1,6),y=p[0],C=p[1];r+=c;var k=y<<3,E=e[r];E||A(0);for(var $=0,w=0,U=C.b,I=U,O=(++r<<3)-8+Ce(E);O-=U,!(O<k);){var H=O>>3;if($+=(e[H]|e[H+1]<<8)>>(O&7)&(1<<U)-1,u[++o]=C.s[$],O-=I,O<k)break;H=O>>3,w+=(e[H]|e[H+1]<<8)>>(O&7)&(1<<I)-1,u[++o]=C.s[w],U=C.n[$],$=C.t[$],I=C.n[w],w=C.t[w]}++o>255&&A(0)}else{for(o=c-127;a<o;a+=2){var z=e[++r];u[a]=z>>4,u[a+1]=z&15}++r}var R=0;for(a=0;a<o;++a){var x=u[a];x>11&&A(0),R+=x&&1<<x-1}var F=Ce(R)+1,Q=1<<F,q=Q-R;for(q&q-1&&A(0),u[o++]=Ce(q)+1,a=0;a<o;++a){var x=u[a];++h[u[a]=x&&F+1-x]}var X=new G(Q<<1),j=X.subarray(0,Q),V=X.subarray(Q);for(v[F]=0,a=F;a>0;--a){var B=v[a];Ie(V,a,B,v[a-1]=B+h[a]*(1<<F-a))}for(v[0]!=Q&&A(0),a=0;a<o;++a){var L=u[a];if(L){var b=v[L];Ie(j,a,b,v[L]=b+(1<<F-L))}}return[r,{n:V,b:F,s:j}]},fa=Je(new G([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],pa=Je(new G([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],ha=Je(new G([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],br=function(e,r){for(var a=e.length,o=new at(a),s=0;s<a;++s)o[s]=r,r+=1<<e[s];return o},kt=new G(new at([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),wa=br(kt,0),Et=new G(new at([0,0,0,0,0,0,0,0,16843009,50528770,11776 Line truncated
<div id="home-db-banner" class="db-banner" role="status" hidden>
<span id="home-db-text" class="db-banner-text">Проверка локальной базы…</span>
<button id="home-db-go" class="db-banner-link" type="button">Синхронизация →</button>
</div>
<section class="card" aria-labelledby="words-title">
<h2 id="words-title" class="card-title">Слова</h2>
<div class="words-toolbar">
<input id="words-search" class="words-search" type="search" placeholder="Поиск: ключ, перевод, тег…"
autocomplete="off" aria-label="Поиск по словам" />
<select id="words-group" class="words-group" aria-label="Фильтр по группе">
<option value="">Все группы</option>
</select>
</div>
<p id="words-count" class="card-hint" role="status" aria-live="polite"></p>
<div id="words-status" class="status-bar" role="status">База ещё не проверена.</div>
<div id="words-list" class="words-list" aria-live="polite"></div>
<div class="btn-row"><button id="words-more" class="btn" type="button" hidden>Показать ещё</button></div>
</section>
`;const a=e.querySelector("#home-db-banner"),o=e.querySelector("#home-db-text"),s=e.querySelector("#home-db-go"),c=e.querySelector("#words-search"),u=e.querySelector("#words-group"),h=e.querySelector("#words-count"),v=e.querySelector("#words-status"),p=e.querySelector("#words-list"),y=e.querySelector("#words-more");function C(b,S){a.hidden=!1,o.textContent=b,s.hidden=!1}function k(){a.hidden=!0}s.addEventListener("click",()=>{document.querySelector('.drawer-btn[data-page="sync"]')?.click()});let E=!1,$=new Map,w=0,U=[],I=null,O=0,H=!1,z=0,R=0;function x(){const b=u.value;if(b==="")return{search:c.value.trim(),groupId:null};const S=Number(b);return{search:c.value.trim(),groupId:Number.isFinite(S)?S:null}}function F(){y.hidden=!(E&&U.length<w),y.hidden||(y.textContent=`Показать ещё (${w-U.length} осталось)`)}function Q(){p.innerHTML=U.map(b=>or(b,$,b.id===I)).join(""),h.textContent=w>0?`Показано ${U.length} из ${w}`:"",F()}function q(b){if(I===b){b!=null&&X(b),I=null;return}I!=null&&X(I),I=b,b!=null&&j(b)}function X(b){const S=p.querySelector(`.word-row-wrap[data-word-id="${b}"]`);if(!S)return;const T=S.querySelector(".word-row"),P=S.querySelector(".word-extra");T&&(T.classList.remove("open"),T.setAttribute("aria-expanded","false")),P&&(P.hidden=!0,P.innerHTML="")}function j(b){const S=U.find(he=>he.id===b),T=p.querySelector(`.word-row-wrap[data-word-id="${b}"]`);if(!S||!T)return;const P=T.querySelector(".word-row"),J=T.querySelector(".word-extra");P&&(P.classList.add("open"),P.setAttribute("aria-expanded","true")),J&&(J.hidden=!1,J.innerHTML=Er(S,$))}function V(b){v.textContent=b,v.hidden=b===""}async function B(){if(!E||H)return;H=!0;const b=++z,S=x();y.disabled=!0,U.length===0&&V("Загрузка слов…");try{const[T,P]=await Promise.all([Bn({search:S.search,groupId:S.groupId??void 0}),tr({search:S.search,groupId:S.groupId??void 0,limit:ir,offset:0})]);if(b!==z)return;w=T,U=P,O=P.length,I!=null&&!U.some(J=>J.id===I)&&(I=null),Q(),V(P.length===0?"По этому запросу слов нет.":""),P.length===0&&w===0&&(h.textContent="Слов в базе пока нет.")}catch(T){if(b!==z)return;V(`Не удалось загрузить слова: ${T instanceof Error?T.message:String(T)}`)}finally{b===z&&(H=!1,y.disabled=!1,F())}}async function L(){if(!E||H||U.length>=w)return;H=!0;const b=++z,S=x();y.disabled=!0,y.textContent="Загрузка…";try{const T=await tr({search:S.search,groupId:S.groupId??void 0,limit:ir,offset:O});if(b!==z)return;U=U.concat(T),O+=T.length,p.insertAdjacentHTML("beforeend",T.map(P=>or(P,$,P.id===I)).join("")),h.textContent=`Показано ${U.length} из ${w}`,F()}catch(T){if(b!==z)return;V(`Не удалось догрузить: ${T instanceof Error?T.message:String(T)}`)}finally{b===z&&(H=!1,y.disabled=!1,F())}}c.addEventListener("input",()=>{window.clearTimeout(R),R=window.setTimeout(()=>{B()},300)}),c.addEventListener("keydown",b=>{b.key==="Enter"&&(window.clearTimeout(R),B())}),u.addEventListener("change",()=>{B()}),y.addEventListener("click",()=>{L()}),p.addEventListener("click",b=>{const S=b.target.closest(".word-row");if(!S||S.disabled)return;const T=Number(S.dataset.wordId);Number.isFinite(T)&&q(I===T?null:T)}),(async()=>{if(!await Oe()){C("Локальной базы нет — скачай сохранение."),V("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),h.textContent="";return}try{const S=await aa();if(!$t(S)){C("Файл в OPFS не похож на SQLite — перекачай сохранение.",!0),V("Файл в OPFS не похож на SQLite — перекачай сохранение.");return}k();try{const[P,J]=await Promise.all([Vn(),yr()]),he=P;$=new Map(J.map(ue=>[ue.id,ue])),u.innerHTML='<option value="">Все группы</option>'+he.map(ue=>`<option value="${ue.id}">${Ee(ue.name)}</option>`).join(""),E=!0,await B(),u.options[0].textContent=`Все группы (${w})`}catch(P){V(`БД есть, но слова не прочитались: ${P instanceof Error?P.message:String(P)}`)}}catch(S){C(`Не удалось прочитать базу: ${S instanceof Error?S.message:String(S)}`)}})()}function cr(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Fa(e){const r=e%10,a=e%100;return r===1&&a!==11?"запись":r>=2&&r<=4&&(a<12||a>14)?"записи":"записей"}function Pa(e,r){const a=cr(e.name)||`<span class="empty-val">Колода #${e.id}</span>`;return`<div class="word-row-wrap deck-row" data-deck-id="${e.id}"><button class="word-row deck-name" type="button" data-act="open" data-deck-id="${e.id}"><span class="word-main"><span class="word-key">${a}</span></span><span class="word-tag">${r} ${Fa(r)}</span></button><button class="deck-play" type="button" data-act="review" data-deck-id="${e.id}" aria-label="ПовторLine truncated
<section class="card" aria-labelledby="decks-title">
<h2 id="decks-title" class="card-title">Колоды</h2>
<p id="decks-count" class="card-hint" role="status" aria-live="polite"></p>
<div id="decks-status" class="status-bar" role="status">Проверка локальной базы…</div>
<div id="decks-list" class="words-list" aria-live="polite"></div>
</section>
`;const a=e.querySelector("#decks-count"),o=e.querySelector("#decks-status"),s=e.querySelector("#decks-list");function c(u){o.textContent=u,o.hidden=u===""}s.addEventListener("click",u=>{const h=u.target.closest("[data-act]");if(!h)return;const v=Number(h.dataset.deckId);Number.isFinite(v)&&(h.dataset.act==="review"?r.goReview(v):r.goDeck(v))}),(async()=>{if(!await Oe()){c("Нет локальной базы — скачай сохранение на странице «Синхронизация»."),a.textContent="";return}c("Загрузка колод…");try{const[h,v]=await Promise.all([Yn(),Gn()]);if(h.length===0){a.textContent="Колоды пока отсутствуют.",c(""),s.innerHTML="";return}a.textContent=`Всего: ${h.length}`,c(""),s.innerHTML=h.map(p=>Pa(p,v.get(p.id)??0)).join("")}catch(h){c(`Не удалось загрузить колоды: ${h instanceof Error?h.message:String(h)}`)}})()}function Qa(e){return e?Ia(e):'<span class="empty-val">—</span>'}function Ia(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function bt(e){return e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Oa(e){const r=e%10,a=e%100;return r===1&&a!==11?"слово":r>=2&&r<=4&&(a<12||a>14)?"слова":"слов"}function Ja(e,r,a){e.innerHTML=`
<button id="deck-back" class="btn btn-ghost" type="button">← Назад к колодам</button>
<section class="card" aria-labelledby="deck-title">
<h2 id="deck-title" class="card-title">Колода…</h2>
<div id="deck-status" class="status-bar" role="status">Загрузка колоды…</div>
<div id="deck-body"></div>
</section>
`;const o=e.querySelector("#deck-back"),s=e.querySelector("#deck-title"),c=e.querySelector("#deck-status"),u=e.querySelector("#deck-body");o.addEventListener("click",()=>a.goDecks()),(async()=>{if(!await Oe()){s.textContent="Колода недоступна",c.textContent="Нет локальной базы — скачай сохранение на странице «Синхронизация».";return}let v=null;try{v=await nt(r)}catch(x){s.textContent="Колода недоступна",c.textContent=`Не удалось загрузить колоду: ${x instanceof Error?x.message:String(x)}`;return}if(!v){s.textContent="Колода не найдена",c.textContent=`Колоды с id=${r} нет в локальной базе. Возможно, база обновилась — вернись к списку.`;return}const p=v;s.textContent=p.name||`Колода #${p.id}`,c.hidden=!0;let y=null;try{y=await jn(p.id)}catch(x){c.hidden=!1,c.textContent=`Данные колоды загружены, а количество слов — нет: ${x instanceof Error?x.message:String(x)}`}u.innerHTML=`
<dl class="word-extra-list">
<div class="word-extra-row"><dt>id</dt><dd>${p.id}</dd></div>
<div class="word-extra-row"><dt>name</dt><dd>${Qa(p.name)}</dd></div>
</dl>
<form id="deck-form" class="deck-form" autocomplete="off">
<label class="field-label" for="deck-forward">forward</label>
<input id="deck-forward" class="token-input" type="text" value="${bt(p.forward)}" />
<label class="field-label" for="deck-backward">backward</label>
<input id="deck-backward" class="token-input" type="text" value="${bt(p.backward)}" />
<label class="field-label" for="deck-filter">filter</label>
<input id="deck-filter" class="token-input" type="text" value="${bt(p.filter)}" />
<div class="btn-row">
<button id="deck-save" class="btn btn-primary" type="submit">Сохранить</button>
</div>
<p id="deck-form-status" class="card-hint" role="status" aria-live="polite"></p>
</form>
<h3 class="deck-sub">${y==null?"Количество слов неизвестно":`${y} ${Oa(y)}`}</h3>
<div class="btn-row">
<button id="deck-review" class="btn btn-primary" type="button"${y===0?" disabled":""}>Повторять</button>
</div>
<div class="btn-row">
<button id="deck-history" class="btn" type="button">История ответов</button>
</div>
`;const C=u.querySelector("#deck-form"),k=u.querySelector("#deck-forward"),E=u.querySelector("#deck-backward"),$=u.querySelector("#deck-filter"),w=u.querySelector("#deck-save"),U=u.querySelector("#deck-form-status"),I=u.querySelector("#deck-review"),O=u.querySelector("#deck-history");I.addEventListener("click",()=>a.goReview(p.id)),O.addEventListener("click",()=>a.goHistory(p.id));const H=()=>`${k.value}
${E.value}
${$.value}`;let z=H();function R(){w.disabled=H()===z||w.dataset.busy==="1"}for(const x of[k,E,$])x.addEventListener("input",R);R(),C.addEventListener("submit",x=>{x.preventDefault(),!w.disabled&&(w.dataset.busy="1",w.disabled=!0,w.textContent="Сохранение…",U.textContent="",(async()=>{try{const F=await Zn(p.id,{forward:k.value,backward:E.value,filter:$.value});if(!F){U.textContent="Колода пропала из базы — вернись к списку.";return}k.value=F.forward,E.value=F.backward,$.value=F.filter,z=H(),U.textContent="Сохранено в локальную базу."}catch(F){U.textContent=`Не удалось сохранить: ${F instanceof Error?F.message:String(F)}`}finally{delete w.dataset.busy,w.textContent="Сохранить",R()}})())})})()}function Fe(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const Ka=50,Da=[{label:"Не получилось",cls:"grade-fail"},{label:"Тяжело",cls:"grade-hard"},{label:"Хорошо",cls:"grade-good"},{label:"Легко",cls:"grade-easy"}];function Xa(e){const r=Da[e.answer]??{label:`Оценка ${e.answer}`,cls:""},a=e.wordKey?`<span class="word-key">${Fe(e.wordKey)}</span>`+(e.wordValue?`<span class="word-sep"> — </span><span class="word-value">${Fe(e.wordValue)}</span>`:""):`<span class="empty-val">Слово #${e.word_id} (удалено)</span>`,o=e.before===e.after?`${e.before}`:`${e.before}→${e.after}`;return`<div class="hist-row-wrap"><div class="hist-main">${a}</div><div class="hist-meta"><span class="hist-grade ${r.cls}">${Fe(r.label)}</span><span class="word-tag">${Fe(Dn(e.timestamp))} · score ${Fe(o)}</span></div></div>`}function za(e,r,a){e.innerHTML=`
<button id="hist-back" class="btn btn-ghost" type="button">← Назад к колоде</button>
<section class="card" aria-labelledby="hist-title">
<h2 id="hist-title" class="card-title">История…</h2>
<p id="hist-count" class="card-hint" role="status" aria-live="polite"></p>
<div id="hist-status" class="status-bar" role="status">Загрузка истории…</div>
<div id="hist-list" class="words-list" aria-live="polite"></div>
<div class="btn-row"><button id="hist-more" class="btn" type="button" hidden>Показать ещё</button></div>
</section>
`;const o=e.querySelector("#hist-back"),s=e.querySelector("#hist-title"),c=e.querySelector("#hist-count"),u=e.querySelector("#hist-status"),h=e.querySelector("#hist-list"),v=e.querySelector("#hist-more");o.addEventListener("click",()=>a.goDeck(r));function p(w){u.textContent=w,u.hidden=w===""}let y=0,C=0,k=!1;function E(){const w=y-C;v.hidden=w<=0,w>0&&(v.textContent=`Показать ещё (${w} осталось)`)}async function $(){if(!(k||C>=y)){k=!0,v.disabled=!0,v.textContent="Загрузка…";try{const w=await ra(r,{limit:Ka,offset:C});C+=w.length,h.insertAdjacentHTML("beforeend",w.map(Xa).join("")),c.textContent=`Показано ${C} из ${y}`}catch(w){p(`Не удалось загрузить историю: ${w instanceof Error?w.message:String(w)}`)}finally{k=!1,v.disabled=!1,E()}}}v.addEventListener("click",()=>{$()}),(async()=>{if(!await Oe()){s.textContent="История недоступна",p("Нет локальной базы — скачай сохранение на странице «Синхронизация».");return}try{const U=await nt(r);if(!U){s.textContent="Колода не найдена",p(`Колоды с id=${r} нет в локальной базе.`);return}if(s.textContent=U.name||`Колода #${U.id}`,y=await ta(U.id),y===0){c.textContent="Ответов пока нет — начни повторение.",p("");return}p(""),await $()}catch(U){s.textContent="История недоступна",p(`Не удалось загрузить историю: ${U instanceof Error?U.message:String(U)}`)}})()}function Ba(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const Va=[{value:0,label:"Не получилось",cls:"grade-fail"},{value:1,label:"Тяжело",cls:"grade-hard"},{value:2,label:"Хорошо",cls:"grade-good"},{value:3,label:"Легко",cls:"grade-easy"}];function Ya(e,r,a){e.innerHTML=`
<button id="review-back" class="btn btn-ghost" type="button">← Назад к колодам</button>
<section class="card" aria-labelledby="review-title">
<h2 id="review-title" class="card-title">Повторение…</h2>
<p id="review-progress" class="card-hint" role="status" aria-live="polite"></p>
<div id="review-status" class="status-bar" role="status">Загрузка карточек…</div>
<div id="review-body"></div>
</section>
`;const o=e.querySelector("#review-back"),s=e.querySelector("#review-title"),c=e.querySelector("#review-progress"),u=e.querySelector("#review-status"),h=e.querySelector("#review-body");o.addEventListener("click",()=>a.goDecks());function v(Q){u.textContent=Q,u.hidden=Q===""}let p=[],y=new Map,C=[],k="",E="",$=0,w=!1,U=null,I=0,O=!1;function H(Q,q){return Q.length===0?`<div class="review-side ${q}"><span class="empty-val">—</span></div>`:`<div class="review-side ${q}">`+Q.map(X=>`<p class="review-line">${Ba(X)}</p>`).join("")+"</div>"}async function z(){const Q=++I,q=p[$],X=y.get(q);if(!X){h.innerHTML="",c.textContent="",v("Слово пропало из базы — пропускаю.");return}U=null;let j="";try{U=await An(r,q)??1}catch{U=1,j=" (score прочитать не удалось — пишу before/after=1)"}if(Q!==I)return;O=!1;const V=Wn(X,C),B=nr(k,V),L=w?nr(E,V):null;c.textContent=`Карточка ${$+1} из ${p.length}`,v("");const b=w?H(L??[],"review-back-side"):'<p class="review-tap">Тап — показать ответ</p>',S=w?`<div class="review-grades" role="group" aria-label="Оценка повторения">
${Va.map(T=>`<button class="btn review-grade ${T.cls}" type="button" data-grade="${T.value}">${T.label}</button>`).join("")}
</div>`:"";h.innerHTML=`
<button id="review-card" class="review-card" type="button"
aria-expanded="${w}" aria-label="${w?"Карточка открыта":"Показать ответ"}">
${H(B,"review-front")}
${w?'<hr class="review-hr" />':""}
${b}
</button>
${S}
`,h.querySelector("#review-card").addEventListener("click",()=>{w||(w=!0,z())}),h.querySelectorAll(".review-grade").forEach(T=>{T.addEventListener("click",()=>{const P=Number(T.dataset.grade);R(P,j)})})}async function R(Q,q){if(O)return;O=!0;const X=p[$],j=U??1,V=[...h.querySelectorAll(".review-grade")];for(const B of V)B.disabled=!0;try{await ea({deckId:r,wordId:X,answer:Q,before:j,after:j})}catch(B){v(`Ответ не записался: ${B instanceof Error?B.message:String(B)}${q}`),O=!1;for(const L of V)L.disabled=!1;return}$+=1,w=!1,U=null,$>=p.length?x():await z()}function x(){c.textContent=`Готово: ${p.length} из ${p.length}`,v(""),h.innerHTML=`
<p class="card-hint">Все карточки сессии просмотрены, ответы записаны в history.</p>
<div class="btn-row">
<button id="review-again" class="btn btn-primary" type="button">Перемешать заново</button>
</div>
`,h.querySelector("#review-again").addEventListener("click",()=>{F()})}async function F(){if(v("Перемешиваю…"),h.innerHTML="",c.textContent="",p=await ar(r),$=0,w=!1,p.length===0){v("В колоде нет слов для повторения.");return}y=await rr(p),z()}(async()=>{if(!await Oe()){s.textContent="Повторение недоступно",v("Нет локальной базы — скачай сохранение на странице «Синхронизация».");return}try{const[q,X]=await Promise.all([nt(r),yr()]);if(!q){s.textContent="Колода не найдена",v(`Колоды с id=${r} нет в локальной базе. Вернись к списку.`);return}if(C=X,k=q.forward,E=q.backward,s.textContent=q.name||`Колода #${q.id}`,p=await ar(q.id),p.length===0){c.textContent="",v("В колоде нет слов для повторения.");return}y=await rr(p),$=0,w=!1,await z()}catch(q){s.textContent="Повторение недоступно",v(`Не удалось загрузить карточки: ${q instanceof Error?q.message:String(q)}`)}})()}const lr=24,Za=/^[A-Za-z0-9]{24}$/,Cr="japlearn_sync_token";function ur(e){return e.trim().replace(/\s+/g,"")}function Pe(e){return Za.test(e)}function Ga(){try{return localStorage.getItem(Cr)??""}catch{return""}}function dr(e){try{localStorage.setItem(Cr,e)}catch{}}const $r="https://learning.micialware.ru";function ja(e,r=$r){return`${r.replace(/\/+$/,"")}/download/${encodeURIComponent(e)}`}async function Wa(e,r,a=$r){const o=ja(e,a);let s;try{s=await fetch(o,{method:"GET",...r})}catch(u){throw new Error(`Нет связи с сервером: ${u instanceof Error?u.message:String(u)}`)}if(!s.ok)throw s.status===404?new Error("Сохранение не найдено (404). Проверь токен."):new Error(`Сервер ответил ${s.status} ${s.statusText}`);const c=await s.arrayBuffer();if(c.byteLength===0)throw new Error("Сервер вернул пустой файл");return new Uint8Array(c)}function Aa(e){e.innerHTML=`
<main class="card" aria-labelledby="sync-title">
<h2 id="sync-title" class="card-title">Синхронизация</h2>
<p class="card-hint">Токен сохранения — 24 символа: латинские буквы и цифры.</p>
<label class="field-label" for="token-input">Токен сохранения</label>
<input
id="token-input"
class="token-input"
type="text"
inputmode="latin"
autocomplete="off"
autocapitalize="off"
autocorrect="off"
spellcheck="false"
maxlength="24"
minlength="24"
placeholder="Например: aB3dEf7hJk9mN2pQr5tUvWx1z"
aria-describedby="token-error token-counter"
/>
<div class="token-meta">
<span id="token-error" class="token-error" role="alert"></span>
<span id="token-counter" class="token-counter" aria-live="polite">0 / 24</span>
</div>
<div class="btn-row">
<button id="btn-download" class="btn btn-primary" type="button" disabled>Скачать</button>
</div>
<p id="status" class="status-bar" role="status">Введите токен из 24 символов</p>
</main>
`;const r=e.querySelector("#token-input"),a=e.querySelector("#token-error"),o=e.querySelector("#token-counter"),s=e.querySelector("#btn-download"),c=e.querySelector("#status");function u(k){c.textContent=k,console.log(`[JapLearn] ${k}`)}function h(){return ur(r.value)}function v(k){s.disabled=k||!Pe(h()),r.disabled=k}function p(){const k=h(),E=k.length;o.textContent=`${E} / ${lr}`;const $=Pe(k),w=E===0;r.classList.toggle("invalid",!w&&!$),r.setAttribute("aria-invalid",String(!w&&!$)),w?a.textContent="":E!==lr?a.textContent=`Нужно 24 символа, сейчас ${E}`:a.textContent=$?"":"Только латинские буквы и цифры",s.disabled=!$}async function y(){const k=h();if(Pe(k)){dr(k),v(!0),u("Скачивание сохранения...");try{const E=await Wa(k);u(`Скачано ${(E.length/1024).toFixed(1)} КБ, распаковка...`);const $=await Ha(E);u(`Распаковано ${($.length/1024).toFixed(1)} КБ, сохранение в OPFS...`),await na($),u(`Готово: база ${($.length/1024).toFixed(1)} КБ сохранена локально (OPFS).`)}catch(E){u(`Ошибка скачивания: ${E instanceof Error?E.message:String(E)}`)}finally{v(!1),p()}}}r.addEventListener("input",()=>{p()}),r.addEventListener("change",()=>{const k=h();r.value=k,Pe(k)&&(dr(k),u("Токен сохранён локально. Можно скачивать.")),p()}),s.addEventListener("click",()=>{y()});const C=Ga();C&&(r.value=C),p(),Pe(ur(C))&&u("Токен восстановлен. Нажми «Скачать», чтобы получить базу.")}const es="modulepreload",ts=function(e){return"/"+e},fr={},rs=function(r,a,o){let s=Promise.resolve();if(a&&a.length>0){let v=function(p){return Promise.all(p.map(y=>Promise.resolve(y).then(C=>({status:"fulfilled",value:C}),C=>({status:"rejected",reason:C}))))};document.getElementsByTagName("link");const u=document.querySelector("meta[property=csp-nonce]"),h=u?.nonce||u?.getAttribute("nonce");s=v(a.map(p=>{if(p=ts(p),p in fr)return;fr[p]=!0;const y=p.endsWith(".css"),C=y?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${p}"]${C}`))return;const k=document.createElement("link");if(k.rel=y?"stylesheet":es,y||(k.as="script"),k.crossOrigin="",k.href=p,h&&k.setAttribute("nonce",h),document.head.appendChild(k),y)return new Promise((E,$)=>{k.addEventListener("load",E),k.addEventListener("error",()=>$(new Error(`Unable to preload CSS for ${p}`)))})}))}function c(u){const h=new Event("vite:preloadError",{cancelable:!0});if(h.payload=u,window.dispatchEvent(h),!h.defaultPrevented)throw u}return s.then(u=>{for(const h of u||[])h.status==="rejected"&&c(h.reason);return r().catch(c)})};function ns(e={}){const{immediate:r=!1,onNeedReload:a,onNeedRefresh:o,onOfflineReady:s,onRegistered:c,onRegisteredSW:u,onRegisterError:h}=e;let v,p,y;const C=async(E=!0)=>{await p,y?.()};async function k(){if("serviceWorker"in navigator){if(v=await rs(async()=>{const{Workbox:E}=await import("./workbox-window.prod.es5-BBnX5xw4.js");return{Workbox:E}},[]).then(({Workbox:E})=>new E("/sw.js",{scope:"/",type:"classic"})).catch(E=>{h?.(E)}),!v)return;y=()=>{v?.messageSkipWaiting()};{let E=!1;const $=()=>{E=!0,v?.addEventListener("controlling",w=>{w.isUpdate&&(a?a():window.location.reload())}),o?.()};v.addEventListener("installed",w=>{typeof w.isUpdate>"u"?typeof w.isExternal<"u"&&w.isExternal?$():!E&&s?.():w.isUpdate||s?.()}),v.addEventListener("waiting",$)}v.register({immediate:r}).then(E=>{u?u("/sw.js",E):c?.(E)}).catch(E=>{h?.(E)})}}return p=k(),C}const Ur="japlearn_ios_install_hint_seen";function as(){const e=navigator;return window.matchMedia("(display-mode: standalone)").matches||e.standalone===!0}function ss(){const e=navigator.userAgent;return(/iPhone|iPad|iPod/.test(e)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1)&&/WebKit/.test(e)&&!/CriOS|FxiOS|EdgiOS|OPiOS/.test(e)}function is(){try{return localStorage.getItem(Ur)==="1"}catch{return!0}}function os(){const e=document.getElementById("pwa-banner");if(!e)return;let r=null,a=null,o=!1;function s(){e.hidden=!0,e.replaceChildren()}function c(p,y){const C=document.createElement("span");C.className="pwa-banner-text",C.textContent=p;const k=document.createElement("div");k.className="pwa-actions";for(const E of y){const $=document.createElement("button");$.type="button",$.className=E.primary?"btn btn-primary pwa-btn":"btn pwa-btn",$.textContent=E.label,$.addEventListener("click",E.onClick),k.append($)}e.replaceChildren(C,k),e.hidden=!1}function u(){if(r){c("Доступна новая версия приложения",[{label:"Обновить",primary:!0,onClick:()=>{r?.()}},{label:"Позже",onClick:()=>{r=null,u()}}]);return}if(a){c("Установить JapLearn на домашний экран?",[{label:"Установить",primary:!0,onClick:()=>{h()}},{label:"Не сейчас",onClick:()=>{a=null,u()}}]);return}if(ss()&&!as()&&!is()){c("На iPhone: «Поделитьс Line truncated
Binary file not shown.
@@ -0,0 +1 @@
const m=(w,...t)=>postMessage({type:w,payload:t}),Q=function(){const w=function(...e){throw new Error(e.join(" "))};globalThis.window===globalThis?w("This code cannot run from the main thread.","Load it as a Worker from a separate Worker."):navigator?.storage?.getDirectory||w("This API requires navigator.storage.getDirectory.");const t=Object.create(null);t.verbose=1;const v={0:console.error.bind(console),1:console.warn.bind(console),2:console.log.bind(console)},A=(e,...s)=>{t.verbose>e&&v[e]("OPFS asyncer:",...s)},g=(...e)=>A(2,...e),S=(...e)=>A(1,...e),h=(...e)=>A(0,...e),E=Object.create(null),I=new Set,k=function(e,s){const n=new URL(e,"file://irrelevant").pathname;return s?n.split("/").filter(o=>!!o):n},x=async function(s,n=!1){const o=k(s,!0),a=o.pop();let i=t.rootDir;for(const r of o)r&&(i=await i.getDirectoryHandle(r,{create:!!n}));return[i,a]},R=async e=>{if(e.syncHandle){g("Closing sync handle for",e.filenameAbs);const s=e.syncHandle;return delete e.syncHandle,delete e.xLock,I.delete(e.fid),s.close()}},F=async e=>{try{await R(e)}catch(s){S("closeSyncHandleNoThrow() ignoring:",s,e)}},D=async()=>{if(I.size)for(const e of I){const s=E[e];await F(s),g("Auto-unlocked",e,s.filenameAbs)}},T=async e=>{if(e.releaseImplicitLocks&&I.has(e.fid))return F(e)};class b extends Error{constructor(s,...n){super([...n,": "+s.name+":",s.message].join(" "),{cause:s}),this.name="GetSyncHandleError"}}b.convertRc=(e,s)=>{if(e instanceof b){if(e.cause.name==="NoModificationAllowedError"||e.cause.name==="DOMException"&&e.cause.message.indexOf("Access Handles cannot")===0)return t.sq3Codes.SQLITE_BUSY;if(e.cause.name==="NotFoundError")return t.sq3Codes.SQLITE_CANTOPEN}else if(e?.name==="NotFoundError")return t.sq3Codes.SQLITE_CANTOPEN;return s};const O=async(e,s)=>{if(!e.syncHandle){const n=performance.now();g("Acquiring sync handle for",e.filenameAbs);const o=6,a=t.asyncIdleWaitTime*2;let i=1,r=a;for(;;r=a*++i)try{e.syncHandle=await e.fileHandle.createSyncAccessHandle();break}catch(c){if(i===o)throw new b(c,"Error getting sync handle for",s+"().",o,"attempts failed.",e.filenameAbs);S("Error getting sync handle for",s+"(). Waiting",r,"ms and trying again.",e.filenameAbs,c),Atomics.wait(t.sabOPView,t.opIds.retry,0,r)}g("Got",s+"() sync handle for",e.filenameAbs,"in",performance.now()-n,"ms"),e.xLock||(I.add(e.fid),g("Acquired implicit lock for",s+"()",e.fid,e.filenameAbs))}return e.syncHandle},d=(e,s)=>{g(e+"() => notify(",s,")"),Atomics.store(t.sabOPView,t.opIds.rc,s),Atomics.notify(t.sabOPView,t.opIds.rc)},H=function(e,s){s.readOnly&&w(e+"(): File is read-only: "+s.filenameAbs)};let L=!1;const _={"opfs-async-shutdown":async()=>{L=!0,d("opfs-async-shutdown",0)},mkdir:async e=>{let s=0;try{await x(e+"/filepart",!0)}catch(n){t.s11n.storeException(2,n),s=t.sq3Codes.SQLITE_IOERR}d("mkdir",s)},xAccess:async e=>{let s=0;try{const[n,o]=await x(e);await n.getFileHandle(o)}catch(n){t.s11n.storeException(2,n),s=t.sq3Codes.SQLITE_IOERR}d("xAccess",s)},xClose:async function(e){const s="xClose";I.delete(e);const n=E[e];let o=0;if(n){if(delete E[e],await R(n),n.deleteOnClose)try{await n.dirHandle.removeEntry(n.filenamePart)}catch(a){S("Ignoring dirHandle.removeEntry() failure of",n,a)}}else t.s11n.serialize(),o=t.sq3Codes.SQLITE_NOTFOUND;d(s,o)},xDelete:async function(...e){const s=await _.xDeleteNoWait(...e);d("xDelete",s)},xDeleteNoWait:async function(e,s=0,n=!1){let o=0;try{for(;e;){const[a,i]=await x(e,!1);if(!i||(await a.removeEntry(i,{recursive:n}),s!==4660))break;n=!1,e=k(e,!0),e.pop(),e=e.join("/")}}catch(a){t.s11n.storeException(2,a),o=t.sq3Codes.SQLITE_IOERR_DELETE}return o},xFileSize:async function(e){const s=E[e];let n=0;try{const o=await(await O(s,"xFileSize")).getSize();t.s11n.serialize(Number(o))}catch(o){t.s11n.storeException(1,o),n=b.convertRc(o,t.sq3Codes.SQLITE_IOERR)}await T(s),d("xFileSize",n)},xLock:async function(e,s){const n=E[e];let o=0;const a=n.xLock;if(n.xLock=s,!n.syncHandle)try{await O(n,"xLock"),I.delete(e)}catch(i){t.s11n.storeException(1,i),o=b.convertRc(i,t.sq3Codes.SQLITE_IOERR_LOCK),n.xLock=a}d("xLock",o)},xOpen:async function(e,s,n,o){const a="xOpen",i=t.sq3Codes.SQLITE_OPEN_CREATE&n;try{let r,c;try{[r,c]=await x(s,!!i)}catch(f){t.s11n.storeException(1,f),d(a,t.sq3Codes.SQLITE_NOTFOUND);return}if(t.opfsFlags.OPFS_UNLINK_BEFORE_OPEN&o)try{await r.removeEntry(c)}catch{}const y=await r.getFileHandle(c,{create:i}),l=Object.assign(Object.create(null),{fid:e,filenameAbs:s,filenamePart:c,dirHandle:r,fileHandle:y,sabView:t.sabFileBufView,readOnly:!i&&!!(t.sq3Codes.SQLITE_OPEN_READONLY&n),deleteOnClose:!!(t.sq3Codes.SQLITE_OPEN_DELETEONCLOSE&n)});l.releaseImplicitLocks=o&t.opfsFlags.OPFS_UNLOCK_ASAP||t.opfsFlags.defaultUnlockAsap,E[e]=l,d(a,0)}catch(r){h(a,r),t.s11n.storeException(1,r),d(a,t.sq3Codes.SQLITE_IOERR)}},xRead:async function(e,s,n){let o=0,a;const i=E[e];try{a=(await O(i,"xRead")).read(i.sabView.subarray(0,s),{at:Number(n)}),a<s&&(i.sabView.fill(0,a,s),o=t.sq3Codes.SQLITE_IOERR_SHORT_READ)}catch(r){Line truncated
@@ -0,0 +1,3 @@
var ot=(()=>{var Ie=import.meta.url;return function(qe={}){var be,i=qe,ve,Ee,$e=new Promise((e,t)=>{ve=e,Ee=t}),lt=typeof window=="object",Ue=typeof importScripts=="function";typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string"&&process.type!="renderer";const Tt=globalThis.sqlite3InitModuleState||Object.assign(Object.create(null),{debugModule:()=>{}});delete globalThis.sqlite3InitModuleState,Tt.debugModule("globalThis.location =",globalThis.location);var at=Object.assign({},i),ct="./this.program",ye="";function Ft(e){return i.locateFile?i.locateFile(e,ye):ye+e}var Ke,ze;(lt||Ue)&&(Ue?ye=self.location.href:typeof document<"u"&&document.currentScript&&(ye=document.currentScript.src),Ie&&(ye=Ie),ye.startsWith("blob:")?ye="":ye=ye.substr(0,ye.replace(/[?#].*/,"").lastIndexOf("/")+1),Ue&&(ze=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}),Ke=e=>fetch(e,{credentials:"same-origin"}).then(t=>t.ok?t.arrayBuffer():Promise.reject(new Error(t.status+" : "+t.url))));var Je=i.print||console.log.bind(console),ke=i.printErr||console.error.bind(console);Object.assign(i,at),at=null,i.arguments&&i.arguments,i.thisProgram&&(ct=i.thisProgram);var Qe=i.wasmBinary,Te,_t=!1,ge,Pe,Ne,ce,he,xe;function ut(){var e=Te.buffer;i.HEAP8=ge=new Int8Array(e),i.HEAP16=Ne=new Int16Array(e),i.HEAPU8=Pe=new Uint8Array(e),i.HEAPU16=new Uint16Array(e),i.HEAP32=ce=new Int32Array(e),i.HEAPU32=he=new Uint32Array(e),i.HEAPF32=new Float32Array(e),i.HEAPF64=new Float64Array(e),i.HEAP64=xe=new BigInt64Array(e),i.HEAPU64=new BigUint64Array(e)}if(i.wasmMemory)Te=i.wasmMemory;else{var Ot=i.INITIAL_MEMORY||16777216;Te=new WebAssembly.Memory({initial:Ot/65536,maximum:32768})}ut();var ft=[],dt=[],pt=[];function Pt(){var e=i.preRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Dt)),et(ft)}function Lt(){!i.noFSInit&&!a.initialized&&a.init(),a.ignorePermissions=!1,et(dt)}function Ct(){var e=i.postRun;e&&(typeof e=="function"&&(e=[e]),e.forEach(Nt)),et(pt)}function Dt(e){ft.unshift(e)}function Rt(e){dt.unshift(e)}function Nt(e){pt.unshift(e)}var Fe=0,Me=null;function Zn(e){return e}function Xe(e){Fe++,i.monitorRunDependencies?.(Fe)}function We(e){if(Fe--,i.monitorRunDependencies?.(Fe),Fe==0&&Me){var t=Me;Me=null,t()}}function Ye(e){i.onAbort?.(e),e="Aborted("+e+")",ke(e),_t=!0,e+=". Build with -sASSERTIONS for more info.";var t=new WebAssembly.RuntimeError(e);throw Ee(t),t}var Mt="data:application/octet-stream;base64,",ht=e=>e.startsWith(Mt);function jt(){if(i.locateFile){var e="sqlite3.wasm";return ht(e)?e:Ft(e)}return new URL("/assets/sqlite3-DBpDb1lf.wasm",import.meta.url).href}var Ze;function mt(e){if(e==Ze&&Qe)return new Uint8Array(Qe);if(ze)return ze(e);throw"both async and sync fetching of the wasm failed"}function Bt(e){return Qe?Promise.resolve().then(()=>mt(e)):Ke(e).then(t=>new Uint8Array(t),()=>mt(e))}function gt(e,t,n){return Bt(e).then(r=>WebAssembly.instantiate(r,t)).then(n,r=>{ke(`failed to asynchronously prepare wasm: ${r}`),Ye(r)})}function Ut(e,t,n,r){return!e&&typeof WebAssembly.instantiateStreaming=="function"&&!ht(t)&&typeof fetch=="function"?fetch(t,{credentials:"same-origin"}).then(s=>{var o=WebAssembly.instantiateStreaming(s,n);return o.then(r,function(p){return ke(`wasm streaming compile failed: ${p}`),ke("falling back to ArrayBuffer instantiation"),gt(t,n,r)})}):gt(t,n,r)}function zt(){return{env:xt,wasi_snapshot_preview1:xt}}function Qt(){var e=zt();function t(r,s){return h=r.exports,Rt(h.__wasm_call_ctors),We(),h}Xe();function n(r){t(r.instance)}if(i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(r){ke(`Module.instantiateWasm callback failed with error: ${r}`),Ee(r)}return Ze??=jt(),Ut(Qe,Ze,e,n).catch(Ee),{}}var et=e=>{e.forEach(t=>t(i))};i.noExitRuntime;var _e={isAbs:e=>e.charAt(0)==="/",splitPath:e=>{var t=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return t.exec(e).slice(1)},normalizeArray:(e,t)=>{for(var n=0,r=e.length-1;r>=0;r--){var s=e[r];s==="."?e.splice(r,1):s===".."?(e.splice(r,1),n++):n&&(e.splice(r,1),n--)}if(t)for(;n;n--)e.unshift("..");return e},normalize:e=>{var t=_e.isAbs(e),n=e.substr(-1)==="/";return e=_e.normalizeArray(e.split("/").filter(r=>!!r),!t).join("/"),!e&&!t&&(e="."),e&&n&&(e+="/"),(t?"/":"")+e},dirname:e=>{var t=_e.splitPath(e),n=t[0],r=t[1];return!n&&!r?".":(r&&(r=r.substr(0,r.length-1)),n+r)},basename:e=>{if(e==="/")return"/";e=_e.normalize(e),e=e.replace(/\/$/,"");var t=e.lastIndexOf("/");return t===-1?e:e.substr(t+1)},join:(...e)=>_e.normalize(e.join("/")),join2:(e,t)=>_e.normalize(e+"/"+t)},Wt=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return e=>crypto.getRandomValues(e);Ye("initRandomDevice")},qt=e=>(qt=Wt())(e),Se={resolve:(...e)=>{for(var t="",n=!1,r=e.length-1;r>=-1&&!n;r--){var s=r>=0?e[r]:a.cwd();if(typeof s!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!s)return"";t=s+"/"+t,n=_e.iLine truncated
`)),!e)return null;tt=yt(e)}return tt.shift()},Oe={ttys:[],init(){},shutdown(){},register(e,t){Oe.ttys[e]={input:[],output:[],ops:t},a.registerDevice(e,Oe.stream_ops)},stream_ops:{open(e){var t=Oe.ttys[e.node.rdev];if(!t)throw new a.ErrnoError(43);e.tty=t,e.seekable=!1},close(e){e.tty.ops.fsync(e.tty)},fsync(e){e.tty.ops.fsync(e.tty)},read(e,t,n,r,s){if(!e.tty||!e.tty.ops.get_char)throw new a.ErrnoError(60);for(var o=0,p=0;p<r;p++){var g;try{g=e.tty.ops.get_char(e.tty)}catch{throw new a.ErrnoError(29)}if(g===void 0&&o===0)throw new a.ErrnoError(6);if(g==null)break;o++,t[n+p]=g}return o&&(e.node.timestamp=Date.now()),o},write(e,t,n,r,s){if(!e.tty||!e.tty.ops.put_char)throw new a.ErrnoError(60);try{for(var o=0;o<r;o++)e.tty.ops.put_char(e.tty,t[n+o])}catch{throw new a.ErrnoError(29)}return r&&(e.node.timestamp=Date.now()),o}},default_tty_ops:{get_char(e){return Ht()},put_char(e,t){t===null||t===10?(Je(Le(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(Je(Le(e.output)),e.output=[])},ioctl_tcgets(e){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(e,t,n){return 0},ioctl_tiocgwinsz(e){return[24,80]}},default_tty1_ops:{put_char(e,t){t===null||t===10?(ke(Le(e.output)),e.output=[]):t!=0&&e.output.push(t)},fsync(e){e.output&&e.output.length>0&&(ke(Le(e.output)),e.output=[])}}},Vt=(e,t)=>{Pe.fill(0,e,e+t)},wt=(e,t)=>Math.ceil(e/t)*t,vt=e=>{e=wt(e,65536);var t=St(65536,e);return t&&Vt(t,e),t},ie={ops_table:null,mount(e){return ie.createNode(null,"/",16895,0)},createNode(e,t,n,r){if(a.isBlkdev(n)||a.isFIFO(n))throw new a.ErrnoError(63);ie.ops_table||={dir:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr,lookup:ie.node_ops.lookup,mknod:ie.node_ops.mknod,rename:ie.node_ops.rename,unlink:ie.node_ops.unlink,rmdir:ie.node_ops.rmdir,readdir:ie.node_ops.readdir,symlink:ie.node_ops.symlink},stream:{llseek:ie.stream_ops.llseek}},file:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr},stream:{llseek:ie.stream_ops.llseek,read:ie.stream_ops.read,write:ie.stream_ops.write,allocate:ie.stream_ops.allocate,mmap:ie.stream_ops.mmap,msync:ie.stream_ops.msync}},link:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr,readlink:ie.node_ops.readlink},stream:{}},chrdev:{node:{getattr:ie.node_ops.getattr,setattr:ie.node_ops.setattr},stream:a.chrdev_stream_ops}};var s=a.createNode(e,t,n,r);return a.isDir(s.mode)?(s.node_ops=ie.ops_table.dir.node,s.stream_ops=ie.ops_table.dir.stream,s.contents={}):a.isFile(s.mode)?(s.node_ops=ie.ops_table.file.node,s.stream_ops=ie.ops_table.file.stream,s.usedBytes=0,s.contents=null):a.isLink(s.mode)?(s.node_ops=ie.ops_table.link.node,s.stream_ops=ie.ops_table.link.stream):a.isChrdev(s.mode)&&(s.node_ops=ie.ops_table.chrdev.node,s.stream_ops=ie.ops_table.chrdev.stream),s.timestamp=Date.now(),e&&(e.contents[t]=s,e.timestamp=s.timestamp),s},getFileDataAsTypedArray(e){return e.contents?e.contents.subarray?e.contents.subarray(0,e.usedBytes):new Uint8Array(e.contents):new Uint8Array(0)},expandFileStorage(e,t){var n=e.contents?e.contents.length:0;if(!(n>=t)){var r=1024*1024;t=Math.max(t,n*(n<r?2:1.125)>>>0),n!=0&&(t=Math.max(t,256));var s=e.contents;e.contents=new Uint8Array(t),e.usedBytes>0&&e.contents.set(s.subarray(0,e.usedBytes),0)}},resizeFileStorage(e,t){if(e.usedBytes!=t)if(t==0)e.contents=null,e.usedBytes=0;else{var n=e.contents;e.contents=new Uint8Array(t),n&&e.contents.set(n.subarray(0,Math.min(t,e.usedBytes))),e.usedBytes=t}},node_ops:{getattr(e){var t={};return t.dev=a.isChrdev(e.mode)?e.id:1,t.ino=e.id,t.mode=e.mode,t.nlink=1,t.uid=0,t.gid=0,t.rdev=e.rdev,a.isDir(e.mode)?t.size=4096:a.isFile(e.mode)?t.size=e.usedBytes:a.isLink(e.mode)?t.size=e.link.length:t.size=0,t.atime=new Date(e.timestamp),t.mtime=new Date(e.timestamp),t.ctime=new Date(e.timestamp),t.blksize=4096,t.blocks=Math.ceil(t.size/t.blksize),t},setattr(e,t){t.mode!==void 0&&(e.mode=t.mode),t.timestamp!==void 0&&(e.timestamp=t.timestamp),t.size!==void 0&&ie.resizeFileStorage(e,t.size)},lookup(e,t){throw a.genericErrors[44]},mknod(e,t,n,r){return ie.createNode(e,t,n,r)},rename(e,t,n){if(a.isDir(e.mode)){var r;try{r=a.lookupNode(t,n)}catch{}if(r)for(var s in r.contents)throw new a.ErrnoError(55)}delete e.parent.contents[e.name],e.parent.timestamp=Date.now(),e.name=n,t.contents[n]=e,t.timestamp=e.parent.timestamp},unlink(e,t){delete e.contents[t],e.timestamp=Date.now()},rmdir(e,t){var n=a.lookupNode(e,t);for(var r in n.contents)throw new a.ErrnoError(55);delete e.contents[t],e.timestamp=Date.now()},readdir(e){var t=[".",".."];for(var n of Object.keys(e.contents))t.push(n);return t},symlink(e,t,n){var r=ie.createNode(e,t,41471,0);return r.link=n,r},readlink(e){if(!a.isLink(e.mode))throw new a.ErrnoError(28);return e.link}},stream_ops:{read(e,t,n,r,s){var o=e.node.contents;if(s>=e.node.usedBytes)return 0;var p=Math.min(e.node.usedBytes-s,r);if(p>8&&o.subarray)t.set(o.sub Line truncated
Total of`,C,"op(s) for",M,"ms (incl. "+J+" ms of waiting on the async side)"),t.config.log("Serialization metrics:",I.s11n),m.postMessage({type:"opfs-async-metrics"})},reset:function(){let E;const C=J=>J.count=J.time=J.wait=0;for(E in u.opIds)C(I[E]=Object.create(null));let M=I.s11n=Object.create(null);M=M.serialize=Object.create(null),M.count=M.time=0,M=I.s11n.deserialize=Object.create(null),M.count=M.time=0}};const c=new S,d=new N().addOnDispose(()=>c.dispose());let y;const B=E=>(y=!0,d.dispose(),O(E)),f=()=>(y=!1,g(t)),m=new Worker(new URL("/assets/sqlite3-opfs-async-proxy-B_ImRJXp.js",import.meta.url));setTimeout(()=>{y===void 0&&B(new Error("Timeout while waiting for OPFS async proxy worker."))},4e3),m._originalOnError=m.onerror,m.onerror=function(E){A("Error initializing OPFS asyncer:",E),B(new Error("Loading OPFS async Worker failed for unknown reasons."))};const l=q.sqlite3_vfs_find(null),_=l?new N(l):null;c.$iVersion=1,d.$iVersion=2,d.$szOsFile=q.sqlite3_file.structInfo.sizeof,d.$mxPathname=1024,d.$zName=x.allocCString("opfs"),d.$xDlOpen=d.$xDlError=d.$xDlSym=d.$xDlClose=null,d.addOnDispose("$zName",d.$zName,"cleanup default VFS wrapper",()=>_?_.dispose():null);const u=Object.create(null);u.verbose=s.verbose,u.littleEndian=(()=>{const E=new ArrayBuffer(2);return new DataView(E).setInt16(0,256,!0),new Int16Array(E)[0]===256})(),u.asyncIdleWaitTime=150,u.asyncS11nExceptions=1,u.fileBufferSize=1024*64,u.sabS11nOffset=u.fileBufferSize,u.sabS11nSize=d.$mxPathname*2,u.sabIO=new SharedArrayBuffer(u.fileBufferSize+u.sabS11nSize),u.opIds=Object.create(null);const I=Object.create(null);{let E=0;u.opIds.whichOp=E++,u.opIds.rc=E++,u.opIds.xAccess=E++,u.opIds.xClose=E++,u.opIds.xDelete=E++,u.opIds.xDeleteNoWait=E++,u.opIds.xFileSize=E++,u.opIds.xLock=E++,u.opIds.xOpen=E++,u.opIds.xRead=E++,u.opIds.xSleep=E++,u.opIds.xSync=E++,u.opIds.xTruncate=E++,u.opIds.xUnlock=E++,u.opIds.xWrite=E++,u.opIds.mkdir=E++,u.opIds["opfs-async-metrics"]=E++,u.opIds["opfs-async-shutdown"]=E++,u.opIds.retry=E++,u.sabOP=new SharedArrayBuffer(E*4),L.metrics.reset()}u.sq3Codes=Object.create(null),["SQLITE_ACCESS_EXISTS","SQLITE_ACCESS_READWRITE","SQLITE_BUSY","SQLITE_CANTOPEN","SQLITE_ERROR","SQLITE_IOERR","SQLITE_IOERR_ACCESS","SQLITE_IOERR_CLOSE","SQLITE_IOERR_DELETE","SQLITE_IOERR_FSYNC","SQLITE_IOERR_LOCK","SQLITE_IOERR_READ","SQLITE_IOERR_SHORT_READ","SQLITE_IOERR_TRUNCATE","SQLITE_IOERR_UNLOCK","SQLITE_IOERR_WRITE","SQLITE_LOCK_EXCLUSIVE","SQLITE_LOCK_NONE","SQLITE_LOCK_PENDING","SQLITE_LOCK_RESERVED","SQLITE_LOCK_SHARED","SQLITE_LOCKED","SQLITE_MISUSE","SQLITE_NOTFOUND","SQLITE_OPEN_CREATE","SQLITE_OPEN_DELETEONCLOSE","SQLITE_OPEN_MAIN_DB","SQLITE_OPEN_READONLY"].forEach(E=>{(u.sq3Codes[E]=q[E])===void 0&&D("Maintenance required: not found:",E)}),u.opfsFlags=Object.assign(Object.create(null),{OPFS_UNLOCK_ASAP:1,OPFS_UNLINK_BEFORE_OPEN:2,defaultUnlockAsap:!1});const U=(E,...C)=>{const M=u.opIds[E]||D("Invalid op ID:",E);u.s11n.serialize(...C),Atomics.store(u.sabOPView,u.opIds.rc,-1),Atomics.store(u.sabOPView,u.opIds.whichOp,M),Atomics.notify(u.sabOPView,u.opIds.whichOp);const J=performance.now();for(;Atomics.wait(u.sabOPView,u.opIds.rc,-1)!=="not-equal";);const G=Atomics.load(u.sabOPView,u.opIds.rc);if(I[E].wait+=performance.now()-J,G&&u.asyncS11nExceptions){const te=u.s11n.deserialize();te&&A(E+"() async error:",...te)}return G};L.debug={asyncShutdown:()=>{T("Shutting down OPFS async listener. The OPFS VFS will no longer work."),U("opfs-async-shutdown")},asyncRestart:()=>{T("Attempting to restart OPFS VFS async listener. Might work, might not."),m.postMessage({type:"opfs-async-restart"})}};const ee=()=>{if(u.s11n)return u.s11n;const E=new TextDecoder,C=new TextEncoder("utf-8"),M=new Uint8Array(u.sabIO,u.sabS11nOffset,u.sabS11nSize),J=new DataView(u.sabIO,u.sabS11nOffset,u.sabS11nSize);u.s11n=Object.create(null);const G=Object.create(null);G.number={id:1,size:8,getter:"getFloat64",setter:"setFloat64"},G.bigint={id:2,size:8,getter:"getBigInt64",setter:"setBigInt64"},G.boolean={id:3,size:4,getter:"getInt32",setter:"setInt32"},G.string={id:4};const te=Y=>G[typeof Y]||D("Maintenance required: this value type cannot be serialized.",Y),oe=Y=>{switch(Y){case G.number.id:return G.number;case G.bigint.id:return G.bigint;case G.boolean.id:return G.boolean;case G.string.id:return G.string;default:D("Invalid type ID:",Y)}};return u.s11n.deserialize=function(Y=!1){++I.s11n.deserialize.count;const pe=performance.now(),F=M[0],V=F?[]:null;if(F){const K=[];let X=1,ae,de,ue;for(ae=0;ae<F;++ae,++X)K.push(oe(M[X]));for(ae=0;ae<F;++ae){const fe=K[ae];fe.getter?(ue=J[fe.getter](X,u.littleEndian),X+=fe.size):(de=J.getInt32(X,u.littleEndian),X+=4,ue=E.decode(M.slice(X,X+de)),X+=de),V.push(ue)}}return Y&&(M[0]=0),I.s11n.deserialize.time+=performance.now()-pe,V},u.s11n.serialize=function(...Y){const pe=performance.now();if(++I.s11n.serialize.count,Y.length){const F=[];let V=0,K=1;for(M[0]=Y.length&255;V<Y.length;++V,++K)F.push(te(Y[V])),M[K]=F[V].id;for(V Line truncated
@@ -0,0 +1,2 @@
try{self["workbox:window:7.4.0"]&&_()}catch{}function b(t,r){return new Promise((function(n){var u=new MessageChannel;u.port1.onmessage=function(s){n(s.data)},t.postMessage(r,[u.port2])}))}function P(t,r){(r==null||r>t.length)&&(r=t.length);for(var n=0,u=Array(r);n<r;n++)u[n]=t[n];return u}function j(t,r,n){return r&&(function(u,s){for(var c=0;c<s.length;c++){var o=s[c];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(u,W(o.key),o)}})(t.prototype,r),Object.defineProperty(t,"prototype",{writable:!1}),t}function S(t,r){var n=typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(n)return(n=n.call(t)).next.bind(n);if(Array.isArray(t)||(n=(function(s,c){if(s){if(typeof s=="string")return P(s,c);var o={}.toString.call(s).slice(8,-1);return o==="Object"&&s.constructor&&(o=s.constructor.name),o==="Map"||o==="Set"?Array.from(s):o==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?P(s,c):void 0}})(t))||r){n&&(t=n);var u=0;return function(){return u>=t.length?{done:!0}:{done:!1,value:t[u++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function w(t,r){return w=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(n,u){return n.__proto__=u,n},w(t,r)}function W(t){var r=(function(n,u){if(typeof n!="object"||!n)return n;var s=n[Symbol.toPrimitive];if(s!==void 0){var c=s.call(n,u);if(typeof c!="object")return c;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(n)})(t,"string");return typeof r=="symbol"?r:r+""}try{self["workbox:core:7.4.0"]&&_()}catch{}var m=function(){var t=this;this.promise=new Promise((function(r,n){t.resolve=r,t.reject=n}))};function y(t,r){var n=location.href;return new URL(t,n).href===new URL(r,n).href}var d=function(t,r){this.type=t,Object.assign(this,r)};function l(t,r,n){return t&&t.then||(t=Promise.resolve(t)),r?t.then(r):t}function k(){}var L={type:"SKIP_WAITING"};function E(t,r){return t&&t.then?t.then(k):Promise.resolve()}var O=(function(t){function r(c,o){var e,i;return o===void 0&&(o={}),(e=t.call(this)||this).nn={},e.tn=0,e.rn=new m,e.en=new m,e.on=new m,e.un=0,e.an=new Set,e.cn=function(){var f=e.fn,a=f.installing;e.tn>0||!y(a.scriptURL,e.sn.toString())||performance.now()>e.un+6e4?(e.vn=a,f.removeEventListener("updatefound",e.cn)):(e.hn=a,e.an.add(a),e.rn.resolve(a)),++e.tn,a.addEventListener("statechange",e.ln)},e.ln=function(f){var a=e.fn,v=f.target,h=v.state,p=v===e.vn,g={sw:v,isExternal:p,originalEvent:f};!p&&e.mn&&(g.isUpdate=!0),e.dispatchEvent(new d(h,g)),h==="installed"?e.wn=self.setTimeout((function(){h==="installed"&&a.waiting===v&&e.dispatchEvent(new d("waiting",g))}),200):h==="activating"&&(clearTimeout(e.wn),p||e.en.resolve(v))},e.yn=function(f){var a=e.hn,v=a!==navigator.serviceWorker.controller;e.dispatchEvent(new d("controlling",{isExternal:v,originalEvent:f,sw:a,isUpdate:e.mn})),v||e.on.resolve(a)},e.gn=(i=function(f){var a=f.data,v=f.ports,h=f.source;return l(e.getSW(),(function(){e.an.has(h)&&e.dispatchEvent(new d("message",{data:a,originalEvent:f,ports:v,sw:h}))}))},function(){for(var f=[],a=0;a<arguments.length;a++)f[a]=arguments[a];try{return Promise.resolve(i.apply(this,f))}catch(v){return Promise.reject(v)}}),e.sn=c,e.nn=o,navigator.serviceWorker.addEventListener("message",e.gn),e}var n,u;u=t,(n=r).prototype=Object.create(u.prototype),n.prototype.constructor=n,w(n,u);var s=r.prototype;return s.register=function(c){var o=(c===void 0?{}:c).immediate,e=o!==void 0&&o;try{var i=this;return l((function(f,a){var v=f();return v&&v.then?v.then(a):a(v)})((function(){if(!e&&document.readyState!=="complete")return E(new Promise((function(f){return window.addEventListener("load",f)})))}),(function(){return i.mn=!!navigator.serviceWorker.controller,i.dn=i.pn(),l(i.bn(),(function(f){i.fn=f,i.dn&&(i.hn=i.dn,i.en.resolve(i.dn),i.on.resolve(i.dn),i.dn.addEventListener("statechange",i.ln,{once:!0}));var a=i.fn.waiting;return a&&y(a.scriptURL,i.sn.toString())&&(i.hn=a,Promise.resolve().then((function(){i.dispatchEvent(new d("waiting",{sw:a,wasWaitingBeforeRegister:!0}))})).then((function(){}))),i.hn&&(i.rn.resolve(i.hn),i.an.add(i.hn)),i.fn.addEventListener("updatefound",i.cn),navigator.serviceWorker.addEventListener("controllerchange",i.yn),i.fn}))})))}catch(f){return Promise.reject(f)}},s.update=function(){try{return this.fn?l(E(this.fn.update())):l()}catch(c){return Promise.reject(c)}},s.getSW=function(){return this.hn!==void 0?Promise.resolve(this.hn):this.rn.promise},s.messageSW=function(c){try{return l(this.getSW(),(function(o){return b(o,c)}))}catch(o){return Promise.reject(o)}},s.messageSkipWaiting=function(){this.fn&&this.fn.waiting&&b(this.fn.waiting,L)},s.pn=function(){var c=navigator.serviceWorker.controller;return c&&y(c.scriptURL,this.sn.toString())?c:void 0},s.bn=function(){try{var c=this;return l((function(o,e){try{var i=o()}catch(f){return e(f)}return i&&i.then?i.then(void 0,e):i})((function(){return l(navigator.serviceWorker.register(c.sn,c.nn),(function(o){return c.un=performance.now(),o}))}),(function(o){throw o})))}catch(o){return Promise.reject(o)}},j(r,[{key:"active",get:function(){return this.en.promise}},{key:"controlling",get:function(){return this.on.promise}}])})((function(){function t(){this.Pn=new Map}var r=t.prototype;return r.addEventListener=function(n,u){this.jn(n).add(u)},r.removeEventListener=function(n,u){this.jn(n).delete(u)},r.dispatchEvent=function(n){n.target=this;for(var u,s=S(this.jn(n.type));!(u=s()).done;)(0,u.value)(n)},r.jn=function(n){return this.Pn.has(n)||this.Pn.set(n,new Set),this.Pn.get(n)},t})());export{O as Workbox,d as WorkboxEvent,b as messageSW};