akarisub 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ (()=>{async function n1(G={}){var O,j=G,U=(...J)=>console.log(...J),N=(...J)=>console.error(...J);function P(){v?.(j)}var Y=!!globalThis.WorkerGlobalScope;(function(){var J=typeof WebAssembly<"u"&&WebAssembly.instantiateStreaming;if(!J)return;WebAssembly.instantiateStreaming=function(Z,Q){var K=null,X=Promise.resolve(Z).then(function(z){return K=z.clone(),z});return J.call(WebAssembly,X,Q).catch(function(z){if(console.warn("[AkariSub] instantiateStreaming failed, using ArrayBuffer fallback:",z&&z.message||z),!K)throw z;return K.arrayBuffer().then(function(W){return WebAssembly.instantiate(W,Q)})})}})(),U=(J)=>{if(J==="AkariSub: No usable fontconfig configuration file found, using fallback."||J.startsWith("Unable to revert mtime:")||J.trim()==="")console.debug(J);else console.log(J)},N=(J)=>{if(J==="Fontconfig error: Cannot load default config file: No such file: (null)"||J==="Fontconfig error: Cannot load default config file: File not found"||J==="Fontconfig error: No writable cache directories"||J.includes("/var/cache/fontconfig")||J.includes("/.cache/fontconfig")||J.includes("/.local/share/fonts"))console.debug(J);else console.error(J)};function w(J){throw J}var v,a,l=!1;function x(){var J=g.buffer;k=new Int8Array(J),D=new Int16Array(J),b=new Uint8Array(J),h=new Uint16Array(J),L=new Int32Array(J),B=new Uint32Array(J),S=new Float32Array(J),M=new Float64Array(J),H=new BigInt64Array(J),o=new BigUint64Array(J)}function n(){{var J=16777216;g=new WebAssembly.Memory({initial:J/65536,maximum:32768})}x()}n();var D,L,H,k,S,M,h,B,o,b,T=(J)=>v0(J),s=()=>C0(),g,OJ=new TextDecoder,GJ=(J,Z,Q,K)=>{var X=Z+Q;if(K)return X;while(J[Z]&&!(Z>=X))++Z;return Z},zJ=(J,Z,Q)=>{if(!J)return"";var K=GJ(b,J,Z,Q);return OJ.decode(b.subarray(J,K))},pJ=(J,Z,Q,K)=>w(`Assertion failed: ${zJ(J)}, at: `+[Z?zJ(Z):"unknown filename",Q,K?zJ(K):"unknown function"]),p={isAbs:(J)=>J.charAt(0)==="/",splitPath:(J)=>{var Z=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return Z.exec(J).slice(1)},normalizeArray:(J,Z)=>{var Q=0;for(var K=J.length-1;K>=0;K--){var X=J[K];if(X===".")J.splice(K,1);else if(X==="..")J.splice(K,1),Q++;else if(Q)J.splice(K,1),Q--}if(Z)for(;Q;Q--)J.unshift("..");return J},normalize:(J)=>{var Z=p.isAbs(J),Q=J.slice(-1)==="/";if(J=p.normalizeArray(J.split("/").filter((K)=>!!K),!Z).join("/"),!J&&!Z)J=".";if(J&&Q)J+="/";return(Z?"/":"")+J},dirname:(J)=>{var Z=p.splitPath(J),Q=Z[0],K=Z[1];if(!Q&&!K)return".";if(K)K=K.slice(0,-1);return Q+K},basename:(J)=>J&&J.match(/([^\/]+|\/)\/*$/)[1],join:(...J)=>p.normalize(J.join("/")),join2:(J,Z)=>p.normalize(J+"/"+Z)},e0=()=>(J)=>crypto.getRandomValues(J),ZZ=(J)=>{(ZZ=e0())(J)},yJ={resolve:(...J)=>{var Z="",Q=!1;for(var K=J.length-1;K>=-1&&!Q;K--){var X=K>=0?J[K]:$.cwd();if(typeof X!="string")throw TypeError("Arguments to path.resolve must be strings");else if(!X)return"";Z=X+"/"+Z,Q=p.isAbs(X)}return Z=p.normalizeArray(Z.split("/").filter((z)=>!!z),!Q).join("/"),(Q?"/":"")+Z||"."},relative:(J,Z)=>{J=yJ.resolve(J).slice(1),Z=yJ.resolve(Z).slice(1);function Q(R){var m=0;for(;m<R.length;m++)if(R[m]!=="")break;var I=R.length-1;for(;I>=0;I--)if(R[I]!=="")break;if(m>I)return[];return R.slice(m,I-m+1)}var K=Q(J.split("/")),X=Q(Z.split("/")),z=Math.min(K.length,X.length),W=z;for(var V=0;V<z;V++)if(K[V]!==X[V]){W=V;break}var q=[];for(var V=W;V<K.length;V++)q.push("..");return q=q.concat(X.slice(W)),q.join("/")}},RJ=(J,Z=0,Q,K)=>{var X=GJ(J,Z,Q,K);return OJ.decode(J.buffer?J.subarray(Z,X):new Uint8Array(J.slice(Z,X)))},$Z=[],fJ=(J)=>{var Z=0;for(var Q=0;Q<J.length;++Q){var K=J.charCodeAt(Q);if(K<=127)Z++;else if(K<=2047)Z+=2;else if(K>=55296&&K<=57343)Z+=4,++Q;else Z+=3}return Z},FZ=(J,Z,Q,K)=>{if(!(K>0))return 0;var X=Q,z=Q+K-1;for(var W=0;W<J.length;++W){var V=J.codePointAt(W);if(V<=127){if(Q>=z)break;Z[Q++]=V}else if(V<=2047){if(Q+1>=z)break;Z[Q++]=192|V>>6,Z[Q++]=128|V&63}else if(V<=65535){if(Q+2>=z)break;Z[Q++]=224|V>>12,Z[Q++]=128|V>>6&63,Z[Q++]=128|V&63}else{if(Q+3>=z)break;Z[Q++]=240|V>>18,Z[Q++]=128|V>>12&63,Z[Q++]=128|V>>6&63,Z[Q++]=128|V&63,W++}}return Z[Q]=0,Q-X},QZ=(J,Z,Q)=>{var K=Q>0?Q:fJ(J)+1,X=Array(K),z=FZ(J,X,0,X.length);if(Z)X.length=z;return X},J1=()=>{if(!$Z.length){var J=null;if(!J)return null;$Z=QZ(J,!0)}return $Z.shift()},NJ={ttys:[],init(){},shutdown(){},register(J,Z){NJ.ttys[J]={input:[],output:[],ops:Z},$.registerDevice(J,NJ.stream_ops)},stream_ops:{open(J){var Z=NJ.ttys[J.node.rdev];if(!Z)throw new $.ErrnoError(43);J.tty=Z,J.seekable=!1},close(J){J.tty.ops.fsync(J.tty)},fsync(J){J.tty.ops.fsync(J.tty)},read(J,Z,Q,K,X){if(!J.tty||!J.tty.ops.get_char)throw new $.ErrnoError(60);var z=0;for(var W=0;W<K;W++){var V;try{V=J.tty.ops.get_char(J.tty)}catch(q){throw new $.ErrnoError(29)}if(V===void 0&&z===0)throw new $.ErrnoError(6);if(V===null||V===void 0)break;z++,Z[Q+W]=V}if(z)J.node.atime=Date.now();return z},write(J,Z,Q,K,X){if(!J.tty||!J.tty.ops.put_char)throw new $.ErrnoError(60);try{for(var z=0;z<K;z++)J.tty.ops.put_char(J.tty,Z[Q+z])}catch(W){throw new $.ErrnoError(29)}if(K)J.node.mtime=J.node.ctime=Date.now();return z}},default_tty_ops:{get_char(J){return J1()},put_char(J,Z){if(Z===null||Z===10)U(RJ(J.output)),J.output=[];else if(Z!=0)J.output.push(Z)},fsync(J){if(J.output?.length>0)U(RJ(J.output)),J.output=[]},ioctl_tcgets(J){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(J,Z,Q){return 0},ioctl_tiocgwinsz(J){return[24,80]}},default_tty1_ops:{put_char(J,Z){if(Z===null||Z===10)N(RJ(J.output)),J.output=[];else if(Z!=0)J.output.push(Z)},fsync(J){if(J.output?.length>0)N(RJ(J.output)),J.output=[]}}},Z1=(J,Z)=>b.fill(0,J,J+Z),TZ=(J,Z)=>Math.ceil(J/Z)*Z,bZ=(J)=>{J=TZ(J,65536);var Z=R0(65536,J);if(Z)Z1(Z,J);return Z},A={ops_table:null,mount(J){return A.createNode(null,"/",16895,0)},createNode(J,Z,Q,K){if($.isBlkdev(Q)||$.isFIFO(Q))throw new $.ErrnoError(63);A.ops_table||={dir:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr,lookup:A.node_ops.lookup,mknod:A.node_ops.mknod,rename:A.node_ops.rename,unlink:A.node_ops.unlink,rmdir:A.node_ops.rmdir,readdir:A.node_ops.readdir,symlink:A.node_ops.symlink},stream:{llseek:A.stream_ops.llseek}},file:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr},stream:{llseek:A.stream_ops.llseek,read:A.stream_ops.read,write:A.stream_ops.write,mmap:A.stream_ops.mmap,msync:A.stream_ops.msync}},link:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr,readlink:A.node_ops.readlink},stream:{}},chrdev:{node:{getattr:A.node_ops.getattr,setattr:A.node_ops.setattr},stream:$.chrdev_stream_ops}};var X=$.createNode(J,Z,Q,K);if($.isDir(X.mode))X.node_ops=A.ops_table.dir.node,X.stream_ops=A.ops_table.dir.stream,X.contents={};else if($.isFile(X.mode))X.node_ops=A.ops_table.file.node,X.stream_ops=A.ops_table.file.stream,X.usedBytes=0,X.contents=A.emptyFileContents??=new Uint8Array(0);else if($.isLink(X.mode))X.node_ops=A.ops_table.link.node,X.stream_ops=A.ops_table.link.stream;else if($.isChrdev(X.mode))X.node_ops=A.ops_table.chrdev.node,X.stream_ops=A.ops_table.chrdev.stream;if(X.atime=X.mtime=X.ctime=Date.now(),J)J.contents[Z]=X,J.atime=J.mtime=J.ctime=X.atime;return X},getFileDataAsTypedArray(J){return J.contents.subarray(0,J.usedBytes)},expandFileStorage(J,Z){var Q=J.contents.length;if(Q>=Z)return;var K=1048576;if(Z=Math.max(Z,Q*(Q<K?2:1.125)>>>0),Q)Z=Math.max(Z,256);var X=A.getFileDataAsTypedArray(J);J.contents=new Uint8Array(Z),J.contents.set(X)},resizeFileStorage(J,Z){if(J.usedBytes==Z)return;var Q=J.contents;J.contents=new Uint8Array(Z),J.contents.set(Q.subarray(0,Math.min(Z,J.usedBytes))),J.usedBytes=Z},node_ops:{getattr(J){var Z={};if(Z.dev=$.isChrdev(J.mode)?J.id:1,Z.ino=J.id,Z.mode=J.mode,Z.nlink=1,Z.uid=0,Z.gid=0,Z.rdev=J.rdev,$.isDir(J.mode))Z.size=4096;else if($.isFile(J.mode))Z.size=J.usedBytes;else if($.isLink(J.mode))Z.size=J.link.length;else Z.size=0;return Z.atime=new Date(J.atime),Z.mtime=new Date(J.mtime),Z.ctime=new Date(J.ctime),Z.blksize=4096,Z.blocks=Math.ceil(Z.size/Z.blksize),Z},setattr(J,Z){for(let Q of["mode","atime","mtime","ctime"])if(Z[Q]!=null)J[Q]=Z[Q];if(Z.size!==void 0)A.resizeFileStorage(J,Z.size)},lookup(J,Z){if(!A.doesNotExistError)A.doesNotExistError=new $.ErrnoError(44),A.doesNotExistError.stack="<generic error, no stack>";throw A.doesNotExistError},mknod(J,Z,Q,K){return A.createNode(J,Z,Q,K)},rename(J,Z,Q){var K;try{K=$.lookupNode(Z,Q)}catch(z){}if(K){if($.isDir(J.mode))for(var X in K.contents)throw new $.ErrnoError(55);$.hashRemoveNode(K)}delete J.parent.contents[J.name],Z.contents[Q]=J,J.name=Q,Z.ctime=Z.mtime=J.parent.ctime=J.parent.mtime=Date.now()},unlink(J,Z){delete J.contents[Z],J.ctime=J.mtime=Date.now()},rmdir(J,Z){var Q=$.lookupNode(J,Z);for(var K in Q.contents)throw new $.ErrnoError(55);delete J.contents[Z],J.ctime=J.mtime=Date.now()},readdir(J){return[".","..",...Object.keys(J.contents)]},symlink(J,Z,Q){var K=A.createNode(J,Z,41471,0);return K.link=Q,K},readlink(J){if(!$.isLink(J.mode))throw new $.ErrnoError(28);return J.link}},stream_ops:{read(J,Z,Q,K,X){var z=J.node.contents;if(X>=J.node.usedBytes)return 0;var W=Math.min(J.node.usedBytes-X,K);return Z.set(z.subarray(X,X+W),Q),W},write(J,Z,Q,K,X,z){if(Z.buffer===k.buffer)z=!1;if(!K)return 0;var W=J.node;if(W.mtime=W.ctime=Date.now(),z)W.contents=Z.subarray(Q,Q+K),W.usedBytes=K;else if(W.usedBytes===0&&X===0)W.contents=Z.slice(Q,Q+K),W.usedBytes=K;else A.expandFileStorage(W,X+K),W.contents.set(Z.subarray(Q,Q+K),X),W.usedBytes=Math.max(W.usedBytes,X+K);return K},llseek(J,Z,Q){var K=Z;if(Q===1)K+=J.position;else if(Q===2){if($.isFile(J.node.mode))K+=J.node.usedBytes}if(K<0)throw new $.ErrnoError(28);return K},mmap(J,Z,Q,K,X){if(!$.isFile(J.node.mode))throw new $.ErrnoError(43);var z,W,V=J.node.contents;if(!(X&2)&&V.buffer===k.buffer)W=!1,z=V.byteOffset;else{if(W=!0,z=bZ(Z),!z)throw new $.ErrnoError(48);if(V){if(Q>0||Q+Z<V.length)if(V.subarray)V=V.subarray(Q,Q+Z);else V=Array.prototype.slice.call(V,Q,Q+Z);k.set(V,z)}}return{ptr:z,allocated:W}},msync(J,Z,Q,K,X){return A.stream_ops.write(J,Z,0,K,Q,!1),0}}},$1=(J)=>{if(typeof J!="string")return J;var Z={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},Q=Z[J];if(typeof Q>"u")throw Error(`Unknown file open mode: ${J}`);return Q},_Z=(J)=>{if(typeof J=="string")J=QZ(J,!0);if(!J.subarray)J=new Uint8Array(J);return J},KZ=(J,Z)=>{var Q=0;if(J)Q|=365;if(Z)Q|=146;return Q},$={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(J){this.errno=J}},FSStream:class{shared={};get object(){return this.node}set object(J){this.node=J}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(J){this.shared.flags=J}get position(){return this.shared.position}set position(J){this.shared.position=J}},FSNode:class{node_ops={};stream_ops={};readMode=365;writeMode=146;mounted=null;constructor(J,Z,Q,K){if(!J)J=this;this.parent=J,this.mount=J.mount,this.id=$.nextInode++,this.name=Z,this.mode=Q,this.rdev=K,this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(J){J?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(J){J?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return $.isDir(this.mode)}get isDevice(){return $.isChrdev(this.mode)}},lookupPath(J,Z={}){if(!J)throw new $.ErrnoError(44);if(Z.follow_mount??=!0,!p.isAbs(J))J=$.cwd()+"/"+J;J:for(var Q=0;Q<40;Q++){var K=J.split("/").filter((R)=>!!R),X=$.root,z="/";for(var W=0;W<K.length;W++){var V=W===K.length-1;if(V&&Z.parent)break;if(K[W]===".")continue;if(K[W]===".."){if(z=p.dirname(z),$.isRoot(X)){J=z+"/"+K.slice(W+1).join("/"),Q--;continue J}else X=X.parent;continue}z=p.join2(z,K[W]);try{X=$.lookupNode(X,K[W])}catch(R){if(R?.errno===44&&V&&Z.noent_okay)return{path:z};throw R}if($.isMountpoint(X)&&(!V||Z.follow_mount))X=X.mounted.root;if($.isLink(X.mode)&&(!V||Z.follow)){if(!X.node_ops.readlink)throw new $.ErrnoError(52);var q=X.node_ops.readlink(X);if(!p.isAbs(q))q=p.dirname(z)+"/"+q;J=q+"/"+K.slice(W+1).join("/");continue J}}return{path:z,node:X}}throw new $.ErrnoError(32)},getPath(J){var Z;while(!0){if($.isRoot(J)){var Q=J.mount.mountpoint;if(!Z)return Q;return Q[Q.length-1]!=="/"?`${Q}/${Z}`:Q+Z}Z=Z?`${J.name}/${Z}`:J.name,J=J.parent}},hashName(J,Z){var Q=0;for(var K=0;K<Z.length;K++)Q=(Q<<5)-Q+Z.charCodeAt(K)|0;return(J+Q>>>0)%$.nameTable.length},hashAddNode(J){var Z=$.hashName(J.parent.id,J.name);J.name_next=$.nameTable[Z],$.nameTable[Z]=J},hashRemoveNode(J){var Z=$.hashName(J.parent.id,J.name);if($.nameTable[Z]===J)$.nameTable[Z]=J.name_next;else{var Q=$.nameTable[Z];while(Q){if(Q.name_next===J){Q.name_next=J.name_next;break}Q=Q.name_next}}},lookupNode(J,Z){var Q=$.mayLookup(J);if(Q)throw new $.ErrnoError(Q);var K=$.hashName(J.id,Z);for(var X=$.nameTable[K];X;X=X.name_next){var z=X.name;if(X.parent.id===J.id&&z===Z)return X}return $.lookup(J,Z)},createNode(J,Z,Q,K){var X=new $.FSNode(J,Z,Q,K);return $.hashAddNode(X),X},destroyNode(J){$.hashRemoveNode(J)},isRoot(J){return J===J.parent},isMountpoint(J){return!!J.mounted},isFile(J){return(J&61440)===32768},isDir(J){return(J&61440)===16384},isLink(J){return(J&61440)===40960},isChrdev(J){return(J&61440)===8192},isBlkdev(J){return(J&61440)===24576},isFIFO(J){return(J&61440)===4096},isSocket(J){return(J&49152)===49152},flagsToPermissionString(J){var Z=["r","w","rw"][J&3];if(J&512)Z+="w";return Z},nodePermissions(J,Z){if($.ignorePermissions)return 0;if(Z.includes("r")&&!(J.mode&292))return 2;if(Z.includes("w")&&!(J.mode&146))return 2;if(Z.includes("x")&&!(J.mode&73))return 2;return 0},mayLookup(J){if(!$.isDir(J.mode))return 54;var Z=$.nodePermissions(J,"x");if(Z)return Z;if(!J.node_ops.lookup)return 2;return 0},mayCreate(J,Z){if(!$.isDir(J.mode))return 54;try{var Q=$.lookupNode(J,Z);return 20}catch(K){}return $.nodePermissions(J,"wx")},mayDelete(J,Z,Q){var K;try{K=$.lookupNode(J,Z)}catch(z){return z.errno}var X=$.nodePermissions(J,"wx");if(X)return X;if(Q){if(!$.isDir(K.mode))return 54;if($.isRoot(K)||$.getPath(K)===$.cwd())return 10}else if($.isDir(K.mode))return 31;return 0},mayOpen(J,Z){if(!J)return 44;if($.isLink(J.mode))return 32;var Q=$.flagsToPermissionString(Z);if($.isDir(J.mode)){if(Q!=="r"||Z&576)return 31}return $.nodePermissions(J,Q)},checkOpExists(J,Z){if(!J)throw new $.ErrnoError(Z);return J},MAX_OPEN_FDS:4096,nextfd(){for(var J=0;J<=$.MAX_OPEN_FDS;J++)if(!$.streams[J])return J;throw new $.ErrnoError(33)},getStreamChecked(J){var Z=$.getStream(J);if(!Z)throw new $.ErrnoError(8);return Z},getStream:(J)=>$.streams[J],createStream(J,Z=-1){if(J=Object.assign(new $.FSStream,J),Z==-1)Z=$.nextfd();return J.fd=Z,$.streams[Z]=J,J},closeStream(J){$.streams[J]=null},dupStream(J,Z=-1){var Q=$.createStream(J,Z);return Q.stream_ops?.dup?.(Q),Q},doSetAttr(J,Z,Q){var K=J?.stream_ops.setattr,X=K?J:Z;K??=Z.node_ops.setattr,$.checkOpExists(K,63),K(X,Q)},chrdev_stream_ops:{open(J){var Z=$.getDevice(J.node.rdev);J.stream_ops=Z.stream_ops,J.stream_ops.open?.(J)},llseek(){throw new $.ErrnoError(70)}},major:(J)=>J>>8,minor:(J)=>J&255,makedev:(J,Z)=>J<<8|Z,registerDevice(J,Z){$.devices[J]={stream_ops:Z}},getDevice:(J)=>$.devices[J],getMounts(J){var Z=[],Q=[J];while(Q.length){var K=Q.pop();Z.push(K),Q.push(...K.mounts)}return Z},syncfs(J,Z){if(typeof J=="function")Z=J,J=!1;if($.syncFSRequests++,$.syncFSRequests>1)N(`warning: ${$.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var Q=$.getMounts($.root.mount),K=0;function X(V){return $.syncFSRequests--,Z(V)}function z(V){if(V){if(!z.errored)return z.errored=!0,X(V);return}if(++K>=Q.length)X(null)}for(var W of Q)if(W.type.syncfs)W.type.syncfs(W,J,z);else z(null)},mount(J,Z,Q){var K=Q==="/",X=!Q,z;if(K&&$.root)throw new $.ErrnoError(10);else if(!K&&!X){var W=$.lookupPath(Q,{follow_mount:!1});if(Q=W.path,z=W.node,$.isMountpoint(z))throw new $.ErrnoError(10);if(!$.isDir(z.mode))throw new $.ErrnoError(54)}var V={type:J,opts:Z,mountpoint:Q,mounts:[]},q=J.mount(V);if(q.mount=V,V.root=q,K)$.root=q;else if(z){if(z.mounted=V,z.mount)z.mount.mounts.push(V)}return q},unmount(J){var Z=$.lookupPath(J,{follow_mount:!1});if(!$.isMountpoint(Z.node))throw new $.ErrnoError(28);var Q=Z.node,K=Q.mounted,X=$.getMounts(K);for(var[z,W]of Object.entries($.nameTable))while(W){var V=W.name_next;if(X.includes(W.mount))$.destroyNode(W);W=V}Q.mounted=null;var q=Q.mount.mounts.indexOf(K);Q.mount.mounts.splice(q,1)},lookup(J,Z){return J.node_ops.lookup(J,Z)},mknod(J,Z,Q){var K=$.lookupPath(J,{parent:!0}),X=K.node,z=p.basename(J);if(!z)throw new $.ErrnoError(28);if(z==="."||z==="..")throw new $.ErrnoError(20);var W=$.mayCreate(X,z);if(W)throw new $.ErrnoError(W);if(!X.node_ops.mknod)throw new $.ErrnoError(63);return X.node_ops.mknod(X,z,Z,Q)},statfs(J){return $.statfsNode($.lookupPath(J,{follow:!0}).node)},statfsStream(J){return $.statfsNode(J.node)},statfsNode(J){var Z={bsize:4096,frsize:4096,blocks:1e6,bfree:500000,bavail:500000,files:$.nextInode,ffree:$.nextInode-1,fsid:42,flags:2,namelen:255};if(J.node_ops.statfs)Object.assign(Z,J.node_ops.statfs(J.mount.opts.root));return Z},create(J,Z=438){return Z&=4095,Z|=32768,$.mknod(J,Z,0)},mkdir(J,Z=511){return Z&=1023,Z|=16384,$.mknod(J,Z,0)},mkdirTree(J,Z){var Q=J.split("/"),K="";for(var X of Q){if(!X)continue;if(K||p.isAbs(J))K+="/";K+=X;try{$.mkdir(K,Z)}catch(z){if(z.errno!=20)throw z}}},mkdev(J,Z,Q){if(typeof Q>"u")Q=Z,Z=438;return Z|=8192,$.mknod(J,Z,Q)},symlink(J,Z){if(!yJ.resolve(J))throw new $.ErrnoError(44);var Q=$.lookupPath(Z,{parent:!0}),K=Q.node;if(!K)throw new $.ErrnoError(44);var X=p.basename(Z),z=$.mayCreate(K,X);if(z)throw new $.ErrnoError(z);if(!K.node_ops.symlink)throw new $.ErrnoError(63);return K.node_ops.symlink(K,X,J)},rename(J,Z){var Q=p.dirname(J),K=p.dirname(Z),X=p.basename(J),z=p.basename(Z),W,V,q;if(W=$.lookupPath(J,{parent:!0}),V=W.node,W=$.lookupPath(Z,{parent:!0}),q=W.node,!V||!q)throw new $.ErrnoError(44);if(V.mount!==q.mount)throw new $.ErrnoError(75);var R=$.lookupNode(V,X),m=yJ.relative(J,K);if(m.charAt(0)!==".")throw new $.ErrnoError(28);if(m=yJ.relative(Z,Q),m.charAt(0)!==".")throw new $.ErrnoError(55);var I;try{I=$.lookupNode(q,z)}catch(d){}if(R===I)return;var y=$.isDir(R.mode),_=$.mayDelete(V,X,y);if(_)throw new $.ErrnoError(_);if(_=I?$.mayDelete(q,z,y):$.mayCreate(q,z),_)throw new $.ErrnoError(_);if(!V.node_ops.rename)throw new $.ErrnoError(63);if($.isMountpoint(R)||I&&$.isMountpoint(I))throw new $.ErrnoError(10);if(q!==V){if(_=$.nodePermissions(V,"w"),_)throw new $.ErrnoError(_)}$.hashRemoveNode(R);try{V.node_ops.rename(R,q,z),R.parent=q}catch(d){throw d}finally{$.hashAddNode(R)}},rmdir(J){var Z=$.lookupPath(J,{parent:!0}),Q=Z.node,K=p.basename(J),X=$.lookupNode(Q,K),z=$.mayDelete(Q,K,!0);if(z)throw new $.ErrnoError(z);if(!Q.node_ops.rmdir)throw new $.ErrnoError(63);if($.isMountpoint(X))throw new $.ErrnoError(10);Q.node_ops.rmdir(Q,K),$.destroyNode(X)},readdir(J){var Z=$.lookupPath(J,{follow:!0}),Q=Z.node,K=$.checkOpExists(Q.node_ops.readdir,54);return K(Q)},unlink(J){var Z=$.lookupPath(J,{parent:!0}),Q=Z.node;if(!Q)throw new $.ErrnoError(44);var K=p.basename(J),X=$.lookupNode(Q,K),z=$.mayDelete(Q,K,!1);if(z)throw new $.ErrnoError(z);if(!Q.node_ops.unlink)throw new $.ErrnoError(63);if($.isMountpoint(X))throw new $.ErrnoError(10);Q.node_ops.unlink(Q,K),$.destroyNode(X)},readlink(J){var Z=$.lookupPath(J),Q=Z.node;if(!Q)throw new $.ErrnoError(44);if(!Q.node_ops.readlink)throw new $.ErrnoError(28);return Q.node_ops.readlink(Q)},stat(J,Z){var Q=$.lookupPath(J,{follow:!Z}),K=Q.node,X=$.checkOpExists(K.node_ops.getattr,63);return X(K)},fstat(J){var Z=$.getStreamChecked(J),Q=Z.node,K=Z.stream_ops.getattr,X=K?Z:Q;return K??=Q.node_ops.getattr,$.checkOpExists(K,63),K(X)},lstat(J){return $.stat(J,!0)},doChmod(J,Z,Q,K){$.doSetAttr(J,Z,{mode:Q&4095|Z.mode&-4096,ctime:Date.now(),dontFollow:K})},chmod(J,Z,Q){var K;if(typeof J=="string"){var X=$.lookupPath(J,{follow:!Q});K=X.node}else K=J;$.doChmod(null,K,Z,Q)},lchmod(J,Z){$.chmod(J,Z,!0)},fchmod(J,Z){var Q=$.getStreamChecked(J);$.doChmod(Q,Q.node,Z,!1)},doChown(J,Z,Q){$.doSetAttr(J,Z,{timestamp:Date.now(),dontFollow:Q})},chown(J,Z,Q,K){var X;if(typeof J=="string"){var z=$.lookupPath(J,{follow:!K});X=z.node}else X=J;$.doChown(null,X,K)},lchown(J,Z,Q){$.chown(J,Z,Q,!0)},fchown(J,Z,Q){var K=$.getStreamChecked(J);$.doChown(K,K.node,!1)},doTruncate(J,Z,Q){if($.isDir(Z.mode))throw new $.ErrnoError(31);if(!$.isFile(Z.mode))throw new $.ErrnoError(28);var K=$.nodePermissions(Z,"w");if(K)throw new $.ErrnoError(K);$.doSetAttr(J,Z,{size:Q,timestamp:Date.now()})},truncate(J,Z){if(Z<0)throw new $.ErrnoError(28);var Q;if(typeof J=="string"){var K=$.lookupPath(J,{follow:!0});Q=K.node}else Q=J;$.doTruncate(null,Q,Z)},ftruncate(J,Z){var Q=$.getStreamChecked(J);if(Z<0||(Q.flags&2097155)===0)throw new $.ErrnoError(28);$.doTruncate(Q,Q.node,Z)},utime(J,Z,Q){var K=$.lookupPath(J,{follow:!0}),X=K.node,z=$.checkOpExists(X.node_ops.setattr,63);z(X,{atime:Z,mtime:Q})},open(J,Z,Q=438){if(J==="")throw new $.ErrnoError(44);if(Z=$1(Z),Z&64)Q=Q&4095|32768;else Q=0;var K,X;if(typeof J=="object")K=J;else{X=J.endsWith("/");var z=$.lookupPath(J,{follow:!(Z&131072),noent_okay:!0});K=z.node,J=z.path}var W=!1;if(Z&64)if(K){if(Z&128)throw new $.ErrnoError(20)}else if(X)throw new $.ErrnoError(31);else K=$.mknod(J,Q|511,0),W=!0;if(!K)throw new $.ErrnoError(44);if($.isChrdev(K.mode))Z&=-513;if(Z&65536&&!$.isDir(K.mode))throw new $.ErrnoError(54);if(!W){var V=$.mayOpen(K,Z);if(V)throw new $.ErrnoError(V)}if(Z&512&&!W)$.truncate(K,0);Z&=-131713;var q=$.createStream({node:K,path:$.getPath(K),flags:Z,seekable:!0,position:0,stream_ops:K.stream_ops,ungotten:[],error:!1});if(q.stream_ops.open)q.stream_ops.open(q);if(W)$.chmod(K,Q&511);return q},close(J){if($.isClosed(J))throw new $.ErrnoError(8);if(J.getdents)J.getdents=null;try{if(J.stream_ops.close)J.stream_ops.close(J)}catch(Z){throw Z}finally{$.closeStream(J.fd)}J.fd=null},isClosed(J){return J.fd===null},llseek(J,Z,Q){if($.isClosed(J))throw new $.ErrnoError(8);if(!J.seekable||!J.stream_ops.llseek)throw new $.ErrnoError(70);if(Q!=0&&Q!=1&&Q!=2)throw new $.ErrnoError(28);return J.position=J.stream_ops.llseek(J,Z,Q),J.ungotten=[],J.position},read(J,Z,Q,K,X){if(K<0||X<0)throw new $.ErrnoError(28);if($.isClosed(J))throw new $.ErrnoError(8);if((J.flags&2097155)===1)throw new $.ErrnoError(8);if($.isDir(J.node.mode))throw new $.ErrnoError(31);if(!J.stream_ops.read)throw new $.ErrnoError(28);var z=typeof X<"u";if(!z)X=J.position;else if(!J.seekable)throw new $.ErrnoError(70);var W=J.stream_ops.read(J,Z,Q,K,X);if(!z)J.position+=W;return W},write(J,Z,Q,K,X,z){if(K<0||X<0)throw new $.ErrnoError(28);if($.isClosed(J))throw new $.ErrnoError(8);if((J.flags&2097155)===0)throw new $.ErrnoError(8);if($.isDir(J.node.mode))throw new $.ErrnoError(31);if(!J.stream_ops.write)throw new $.ErrnoError(28);if(J.seekable&&J.flags&1024)$.llseek(J,0,2);var W=typeof X<"u";if(!W)X=J.position;else if(!J.seekable)throw new $.ErrnoError(70);var V=J.stream_ops.write(J,Z,Q,K,X,z);if(!W)J.position+=V;return V},mmap(J,Z,Q,K,X){if((K&2)!==0&&(X&2)===0&&(J.flags&2097155)!==2)throw new $.ErrnoError(2);if((J.flags&2097155)===1)throw new $.ErrnoError(2);if(!J.stream_ops.mmap)throw new $.ErrnoError(43);if(!Z)throw new $.ErrnoError(28);return J.stream_ops.mmap(J,Z,Q,K,X)},msync(J,Z,Q,K,X){if(!J.stream_ops.msync)return 0;return J.stream_ops.msync(J,Z,Q,K,X)},ioctl(J,Z,Q){if(!J.stream_ops.ioctl)throw new $.ErrnoError(59);return J.stream_ops.ioctl(J,Z,Q)},readFile(J,Z={}){if(Z.flags=Z.flags||0,Z.encoding=Z.encoding||"binary",Z.encoding!=="utf8"&&Z.encoding!=="binary")w(`Invalid encoding type "${Z.encoding}"`);var Q=$.open(J,Z.flags),K=$.stat(J),X=K.size,z=new Uint8Array(X);if($.read(Q,z,0,X,0),Z.encoding==="utf8")z=RJ(z);return $.close(Q),z},writeFile(J,Z,Q={}){Q.flags=Q.flags||577;var K=$.open(J,Q.flags,Q.mode);Z=_Z(Z),$.write(K,Z,0,Z.byteLength,void 0,Q.canOwn),$.close(K)},cwd:()=>$.currentPath,chdir(J){var Z=$.lookupPath(J,{follow:!0});if(Z.node===null)throw new $.ErrnoError(44);if(!$.isDir(Z.node.mode))throw new $.ErrnoError(54);var Q=$.nodePermissions(Z.node,"x");if(Q)throw new $.ErrnoError(Q);$.currentPath=Z.path},createDefaultDirectories(){$.mkdir("/tmp"),$.mkdir("/home"),$.mkdir("/home/web_user")},createDefaultDevices(){$.mkdir("/dev"),$.registerDevice($.makedev(1,3),{read:()=>0,write:(K,X,z,W,V)=>W,llseek:()=>0}),$.mkdev("/dev/null",$.makedev(1,3)),NJ.register($.makedev(5,0),NJ.default_tty_ops),NJ.register($.makedev(6,0),NJ.default_tty1_ops),$.mkdev("/dev/tty",$.makedev(5,0)),$.mkdev("/dev/tty1",$.makedev(6,0));var J=new Uint8Array(1024),Z=0,Q=()=>{if(Z===0)ZZ(J),Z=J.byteLength;return J[--Z]};$.createDevice("/dev","random",Q),$.createDevice("/dev","urandom",Q),$.mkdir("/dev/shm"),$.mkdir("/dev/shm/tmp")},createSpecialDirectories(){$.mkdir("/proc");var J=$.mkdir("/proc/self");$.mkdir("/proc/self/fd"),$.mount({mount(){var Z=$.createNode(J,"fd",16895,73);return Z.stream_ops={llseek:A.stream_ops.llseek},Z.node_ops={lookup(Q,K){var X=+K,z=$.getStreamChecked(X),W={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>z.path},id:X+1};return W.parent=W,W},readdir(){return Array.from($.streams.entries()).filter(([Q,K])=>K).map(([Q,K])=>Q.toString())}},Z}},{},"/proc/self/fd")},createStandardStreams(J,Z,Q){if(J)$.createDevice("/dev","stdin",J);else $.symlink("/dev/tty","/dev/stdin");if(Z)$.createDevice("/dev","stdout",null,Z);else $.symlink("/dev/tty","/dev/stdout");if(Q)$.createDevice("/dev","stderr",null,Q);else $.symlink("/dev/tty1","/dev/stderr");var K=$.open("/dev/stdin",0),X=$.open("/dev/stdout",1),z=$.open("/dev/stderr",1)},staticInit(){$.nameTable=Array(4096),$.mount(A,{},"/"),$.createDefaultDirectories(),$.createDefaultDevices(),$.createSpecialDirectories(),$.filesystems={MEMFS:A}},init(J,Z,Q){$.initialized=!0,$.createStandardStreams(J,Z,Q)},quit(){$.initialized=!1;for(var J of $.streams)if(J)$.close(J)},findObject(J,Z){var Q=$.analyzePath(J,Z);if(!Q.exists)return null;return Q.object},analyzePath(J,Z){try{var Q=$.lookupPath(J,{follow:!Z});J=Q.path}catch(X){}var K={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var Q=$.lookupPath(J,{parent:!0});K.parentExists=!0,K.parentPath=Q.path,K.parentObject=Q.node,K.name=p.basename(J),Q=$.lookupPath(J,{follow:!Z}),K.exists=!0,K.path=Q.path,K.object=Q.node,K.name=Q.node.name,K.isRoot=Q.path==="/"}catch(X){K.error=X.errno}return K},createPath(J,Z,Q,K){J=typeof J=="string"?J:$.getPath(J);var X=Z.split("/").reverse();while(X.length){var z=X.pop();if(!z)continue;var W=p.join2(J,z);try{$.mkdir(W)}catch(V){if(V.errno!=20)throw V}J=W}return W},createFile(J,Z,Q,K,X){var z=p.join2(typeof J=="string"?J:$.getPath(J),Z),W=KZ(K,X);return $.create(z,W)},createDataFile(J,Z,Q,K,X,z){var W=Z;if(J)J=typeof J=="string"?J:$.getPath(J),W=Z?p.join2(J,Z):J;var V=KZ(K,X),q=$.create(W,V);if(Q){Q=_Z(Q),$.chmod(q,V|146);var R=$.open(q,577);$.write(R,Q,0,Q.length,0,z),$.close(R),$.chmod(q,V)}},createDevice(J,Z,Q,K){var X=p.join2(typeof J=="string"?J:$.getPath(J),Z),z=KZ(!!Q,!!K);$.createDevice.major??=64;var W=$.makedev($.createDevice.major++,0);return $.registerDevice(W,{open(V){V.seekable=!1},close(V){if(K?.buffer?.length)K(10)},read(V,q,R,m,I){var y=0;for(var _=0;_<m;_++){var d;try{d=Q()}catch(t){throw new $.ErrnoError(29)}if(d===void 0&&y===0)throw new $.ErrnoError(6);if(d===null||d===void 0)break;y++,q[R+_]=d}if(y)V.node.atime=Date.now();return y},write(V,q,R,m,I){for(var y=0;y<m;y++)try{K(q[R+y])}catch(_){throw new $.ErrnoError(29)}if(m)V.node.mtime=V.node.ctime=Date.now();return y}}),$.mkdev(X,z,W)},forceLoadFile(J){if(J.isDevice||J.isFolder||J.link||J.contents)return!0;if(globalThis.XMLHttpRequest)w("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");else try{J.contents=readBinary(J.url)}catch(Z){throw new $.ErrnoError(29)}},createLazyFile(J,Z,Q,K,X){class z{lengthKnown=!1;chunks=[];get(I){if(I>this.length-1||I<0)return;var y=I%this.chunkSize,_=I/this.chunkSize|0;return this.getter(_)[y]}setDataGetter(I){this.getter=I}cacheLength(){var I=new XMLHttpRequest;if(I.open("HEAD",Q,!1),I.send(null),!(I.status>=200&&I.status<300||I.status===304))w("Couldn't load "+Q+". Status: "+I.status);var y=Number(I.getResponseHeader("Content-length")),_,d=(_=I.getResponseHeader("Accept-Ranges"))&&_==="bytes",t=(_=I.getResponseHeader("Content-Encoding"))&&_==="gzip",e=1048576;if(!d)e=y;var CJ=(WJ,kJ)=>{if(WJ>kJ)w("invalid range ("+WJ+", "+kJ+") or no bytes requested!");if(kJ>y-1)w("only "+y+" bytes available! programmer error!");var JJ=new XMLHttpRequest;if(JJ.open("GET",Q,!1),y!==e)JJ.setRequestHeader("Range","bytes="+WJ+"-"+kJ);if(JJ.responseType="arraybuffer",JJ.overrideMimeType)JJ.overrideMimeType("text/plain; charset=x-user-defined");if(JJ.send(null),!(JJ.status>=200&&JJ.status<300||JJ.status===304))w("Couldn't load "+Q+". Status: "+JJ.status);if(JJ.response!==void 0)return new Uint8Array(JJ.response||[]);return QZ(JJ.responseText||"",!0)},QJ=this;if(QJ.setDataGetter((WJ)=>{var kJ=WJ*e,JJ=(WJ+1)*e-1;if(JJ=Math.min(JJ,y-1),typeof QJ.chunks[WJ]>"u")QJ.chunks[WJ]=CJ(kJ,JJ);if(typeof QJ.chunks[WJ]>"u")w("doXHR failed!");return QJ.chunks[WJ]}),t||!y)e=y=1,y=this.getter(0).length,e=y,U("LazyFiles on gzip forces download of the whole file when length is accessed");this._length=y,this._chunkSize=e,this.lengthKnown=!0}get length(){if(!this.lengthKnown)this.cacheLength();return this._length}get chunkSize(){if(!this.lengthKnown)this.cacheLength();return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!Y)w("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var W=new z,V={isDevice:!1,contents:W}}else var V={isDevice:!1,url:Q};var q=$.createFile(J,Z,V,K,X);if(V.contents)q.contents=V.contents;else if(V.url)q.contents=null,q.url=V.url;Object.defineProperties(q,{usedBytes:{get:function(){return this.contents.length}}});var R={};for(let[I,y]of Object.entries(q.stream_ops))R[I]=(..._)=>{return $.forceLoadFile(q),y(..._)};function m(I,y,_,d,t){var e=I.node.contents;if(t>=e.length)return 0;var CJ=Math.min(e.length-t,d);if(e.slice)for(var QJ=0;QJ<CJ;QJ++)y[_+QJ]=e[t+QJ];else for(var QJ=0;QJ<CJ;QJ++)y[_+QJ]=e.get(t+QJ);return CJ}return R.read=(I,y,_,d,t)=>{return $.forceLoadFile(q),m(I,y,_,d,t)},R.mmap=(I,y,_,d,t)=>{$.forceLoadFile(q);var e=bZ(y);if(!e)throw new $.ErrnoError(48);return m(I,k,e,y,_),{ptr:e,allocated:!0}},q.stream_ops=R,q}},F={calculateAt(J,Z,Q){if(p.isAbs(Z))return Z;var K;if(J===-100)K=$.cwd();else{var X=F.getStreamFromFD(J);K=X.path}if(Z.length==0){if(!Q)throw new $.ErrnoError(44);return K}return K+"/"+Z},writeStat(J,Z){B[J>>2]=Z.dev,B[J+4>>2]=Z.mode,B[J+8>>2]=Z.nlink,B[J+12>>2]=Z.uid,B[J+16>>2]=Z.gid,B[J+20>>2]=Z.rdev,H[J+24>>3]=BigInt(Z.size),L[J+32>>2]=4096,L[J+36>>2]=Z.blocks;var Q=Z.atime.getTime(),K=Z.mtime.getTime(),X=Z.ctime.getTime();return H[J+40>>3]=BigInt(Math.floor(Q/1000)),B[J+48>>2]=Q%1000*1000*1000,H[J+56>>3]=BigInt(Math.floor(K/1000)),B[J+64>>2]=K%1000*1000*1000,H[J+72>>3]=BigInt(Math.floor(X/1000)),B[J+80>>2]=X%1000*1000*1000,H[J+88>>3]=BigInt(Z.ino),0},writeStatFs(J,Z){B[J+4>>2]=Z.bsize,B[J+60>>2]=Z.bsize,H[J+8>>3]=BigInt(Z.blocks),H[J+16>>3]=BigInt(Z.bfree),H[J+24>>3]=BigInt(Z.bavail),H[J+32>>3]=BigInt(Z.files),H[J+40>>3]=BigInt(Z.ffree),B[J+48>>2]=Z.fsid,B[J+64>>2]=Z.flags,B[J+56>>2]=Z.namelen},doMsync(J,Z,Q,K,X){if(!$.isFile(Z.node.mode))throw new $.ErrnoError(43);if(K&2)return 0;var z=b.slice(J,J+Q);$.msync(Z,z,X,Q,K)},getStreamFromFD(J){var Z=$.getStreamChecked(J);return Z},varargs:void 0,getStr(J){var Z=zJ(J);return Z}};function Q1(J,Z){try{return J=F.getStr(J),$.chmod(J,Z),0}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}function K1(J,Z,Q,K){try{if(Z=F.getStr(Z),Z=F.calculateAt(J,Z),Q&-8)return-28;var X=$.lookupPath(Z,{follow:!0}),z=X.node;if(!z)return-44;var W="";if(Q&4)W+="r";if(Q&2)W+="w";if(Q&1)W+="x";if(W&&$.nodePermissions(z,W))return-2;return 0}catch(V){if(typeof $>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}var cJ=()=>{var J=L[+F.varargs>>2];return F.varargs+=4,J},DJ=cJ;function G1(J,Z,Q){F.varargs=Q;try{var K=F.getStreamFromFD(J);switch(Z){case 0:{var X=cJ();if(X<0)return-28;while($.streams[X])X++;var z=$.dupStream(K,X);return z.fd}case 1:case 2:return 0;case 3:return K.flags;case 4:{var X=cJ();return K.flags|=X,0}case 12:{var X=DJ(),W=0;return D[X+W>>1]=2,0}case 13:case 14:return 0}return-28}catch(V){if(typeof $>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function X1(J,Z){try{return F.writeStat(Z,$.fstat(J))}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}var mJ=(J,Z,Q)=>FZ(J,b,Z,Q);function z1(J,Z){try{if(Z===0)return-28;var Q=$.cwd(),K=fJ(Q)+1;if(Z<K)return-68;return mJ(Q,J,Z),K}catch(X){if(typeof $>"u"||X.name!=="ErrnoError")throw X;return-X.errno}}function j1(J,Z,Q){try{var K=F.getStreamFromFD(J);K.getdents||=$.readdir(K.path);var X=280,z=0,W=$.llseek(K,0,1),V=Math.floor(W/X),q=Math.min(K.getdents.length,V+Math.floor(Q/X));for(var R=V;R<q;R++){var m,I,y=K.getdents[R];if(y===".")m=K.node.id,I=4;else if(y===".."){var _=$.lookupPath(K.path,{parent:!0});m=_.node.id,I=4}else{var d;try{d=$.lookupNode(K.node,y)}catch(t){if(t?.errno===28)continue;throw t}m=d.id,I=$.isChrdev(d.mode)?2:$.isDir(d.mode)?4:$.isLink(d.mode)?10:8}H[Z+z>>3]=BigInt(m),H[Z+z+8>>3]=BigInt((R+1)*X),D[Z+z+16>>1]=280,k[Z+z+18]=I,mJ(y,Z+z+19,256),z+=X}return $.llseek(K,R*X,0),z}catch(t){if(typeof $>"u"||t.name!=="ErrnoError")throw t;return-t.errno}}function O1(J,Z,Q){F.varargs=Q;try{var K=F.getStreamFromFD(J);switch(Z){case 21509:{if(!K.tty)return-59;return 0}case 21505:{if(!K.tty)return-59;if(K.tty.ops.ioctl_tcgets){var X=K.tty.ops.ioctl_tcgets(K),z=DJ();L[z>>2]=X.c_iflag||0,L[z+4>>2]=X.c_oflag||0,L[z+8>>2]=X.c_cflag||0,L[z+12>>2]=X.c_lflag||0;for(var W=0;W<32;W++)k[z+W+17]=X.c_cc[W]||0;return 0}return 0}case 21510:case 21511:case 21512:{if(!K.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!K.tty)return-59;if(K.tty.ops.ioctl_tcsets){var z=DJ(),V=L[z>>2],q=L[z+4>>2],R=L[z+8>>2],m=L[z+12>>2],I=[];for(var W=0;W<32;W++)I.push(k[z+W+17]);return K.tty.ops.ioctl_tcsets(K.tty,Z,{c_iflag:V,c_oflag:q,c_cflag:R,c_lflag:m,c_cc:I})}return 0}case 21519:{if(!K.tty)return-59;var z=DJ();return L[z>>2]=0,0}case 21520:{if(!K.tty)return-59;return-28}case 21537:case 21531:{var z=DJ();return $.ioctl(K,Z,z)}case 21523:{if(!K.tty)return-59;if(K.tty.ops.ioctl_tiocgwinsz){var y=K.tty.ops.ioctl_tiocgwinsz(K.tty),z=DJ();D[z>>1]=y[0],D[z+2>>1]=y[1]}return 0}case 21524:{if(!K.tty)return-59;return 0}case 21515:{if(!K.tty)return-59;return 0}default:return-28}}catch(_){if(typeof $>"u"||_.name!=="ErrnoError")throw _;return-_.errno}}function W1(J,Z){try{return J=F.getStr(J),F.writeStat(Z,$.lstat(J))}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}function V1(J,Z,Q){try{return Z=F.getStr(Z),Z=F.calculateAt(J,Z),$.mkdir(Z,Q,0),0}catch(K){if(typeof $>"u"||K.name!=="ErrnoError")throw K;return-K.errno}}function Y1(J,Z,Q,K){try{Z=F.getStr(Z);var X=K&256,z=K&4096;return K=K&-6401,Z=F.calculateAt(J,Z,z),F.writeStat(Q,X?$.lstat(Z):$.stat(Z))}catch(W){if(typeof $>"u"||W.name!=="ErrnoError")throw W;return-W.errno}}function U1(J,Z,Q,K){F.varargs=K;try{Z=F.getStr(Z),Z=F.calculateAt(J,Z);var X=K?cJ():0;return $.open(Z,Q,X).fd}catch(z){if(typeof $>"u"||z.name!=="ErrnoError")throw z;return-z.errno}}function B1(J,Z,Q,K){try{if(Z=F.getStr(Z),Z=F.calculateAt(J,Z),K<=0)return-28;var X=$.readlink(Z),z=Math.min(K,fJ(X)),W=k[Q+z];return mJ(X,Q,K+1),k[Q+z]=W,z}catch(V){if(typeof $>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function q1(J,Z,Q,K){try{return Z=F.getStr(Z),K=F.getStr(K),Z=F.calculateAt(J,Z),K=F.calculateAt(Q,K),$.rename(Z,K),0}catch(X){if(typeof $>"u"||X.name!=="ErrnoError")throw X;return-X.errno}}function N1(J){try{return J=F.getStr(J),$.rmdir(J),0}catch(Z){if(typeof $>"u"||Z.name!=="ErrnoError")throw Z;return-Z.errno}}function H1(J,Z){try{return J=F.getStr(J),F.writeStat(Z,$.stat(J))}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return-Q.errno}}function P1(J,Z,Q){try{if(Z=F.getStr(Z),Z=F.calculateAt(J,Z),!Q)$.unlink(Z);else if(Q===512)$.rmdir(Z);else return-28;return 0}catch(K){if(typeof $>"u"||K.name!=="ErrnoError")throw K;return-K.errno}}var EZ=(J)=>B[J>>2]+L[J+4>>2]*4294967296;function w1(J,Z,Q,K){try{Z=F.getStr(Z),Z=F.calculateAt(J,Z,!0);var X=Date.now(),z,W;if(!Q)z=X,W=X;else{var V=EZ(Q),q=L[Q+8>>2];if(q==1073741823)z=X;else if(q==1073741822)z=null;else z=V*1000+q/1e6;if(Q+=16,V=EZ(Q),q=L[Q+8>>2],q==1073741823)W=X;else if(q==1073741822)W=null;else W=V*1000+q/1e6}if((W??z)!==null)$.utime(Z,z,W);return 0}catch(R){if(typeof $>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var D1=()=>w(""),k1=()=>{throw 1/0},L1=()=>Date.now(),A1=()=>performance.now(),I1=()=>2147483648,y1=(J)=>{var Z=g.buffer.byteLength,Q=(J-Z+65535)/65536|0;try{return g.grow(Q),x(),1}catch(K){}},R1=(J)=>{var Z=b.length;J>>>=0;var Q=I1();if(J>Q)return!1;for(var K=1;K<=4;K*=2){var X=Z*(1+0.2/K);X=Math.min(X,J+100663296);var z=Math.min(Q,TZ(Math.max(J,X),65536)),W=y1(z);if(W)return!0}return!1},GZ={},v1=()=>"./this.program",vJ=()=>{if(!vJ.strings){var J=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",Z={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:J,_:v1()};for(var Q in GZ)if(GZ[Q]===void 0)delete Z[Q];else Z[Q]=GZ[Q];var K=[];for(var Q in Z)K.push(`${Q}=${Z[Q]}`);vJ.strings=K}return vJ.strings},C1=(J,Z)=>{var Q=0,K=0;for(var X of vJ()){var z=Z+Q;B[J+K>>2]=z,Q+=mJ(X,z,1/0)+1,K+=4}return 0},F1=(J,Z)=>{var Q=vJ();B[J>>2]=Q.length;var K=0;for(var X of Q)K+=fJ(X)+1;return B[Z>>2]=K,0},T1=(J)=>{throw`exit(${J})`},b1=T1;function _1(J){try{var Z=F.getStreamFromFD(J);return $.close(Z),0}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return Q.errno}}var E1=(J,Z,Q,K)=>{var X=0;for(var z=0;z<Q;z++){var W=B[Z>>2],V=B[Z+4>>2];Z+=8;var q=$.read(J,k,W,V,K);if(q<0)return-1;if(X+=q,q<V)break;if(typeof K<"u")K+=q}return X};function g1(J,Z,Q,K){try{var X=F.getStreamFromFD(J),z=E1(X,Z,Q);return B[K>>2]=z,0}catch(W){if(typeof $>"u"||W.name!=="ErrnoError")throw W;return W.errno}}var M1=9007199254740992,x1=-9007199254740992,S1=(J)=>J<x1||J>M1?NaN:Number(J);function h1(J,Z,Q,K){Z=S1(Z);try{if(isNaN(Z))return 61;var X=F.getStreamFromFD(J);if($.llseek(X,Z,Q),H[K>>3]=BigInt(X.position),X.getdents&&Z===0&&Q===0)X.getdents=null;return 0}catch(z){if(typeof $>"u"||z.name!=="ErrnoError")throw z;return z.errno}}var p1=(J,Z,Q,K)=>{var X=0;for(var z=0;z<Q;z++){var W=B[Z>>2],V=B[Z+4>>2];Z+=8;var q=$.write(J,k,W,V,K);if(q<0)return-1;if(X+=q,q<V)break;if(typeof K<"u")K+=q}return X};function f1(J,Z,Q,K){try{var X=F.getStreamFromFD(J),z=p1(X,Z,Q);return B[K>>2]=z,0}catch(W){if(typeof $>"u"||W.name!=="ErrnoError")throw W;return W.errno}}function c1(J,Z){try{return ZZ(b.subarray(J,J+Z)),0}catch(Q){if(typeof $>"u"||Q.name!=="ErrnoError")throw Q;return Q.errno}}var gZ=[],MZ=(J)=>{var Z=gZ[J];if(!Z)gZ[J]=Z=F0.get(J);return Z};$.staticInit();var xZ,SZ,hZ,pZ,fZ,cZ,mZ,uZ,lZ,sZ,oZ,dZ,rZ,nZ,iZ,aZ,tZ,eZ,J0,Z0,$0,Q0,K0,G0,X0,z0,j0,O0,W0,V0,Y0,U0,B0,q0,N0,H0,P0,w0,D0,k0,L0,A0,I0,y0,R0,XZ,v0,C0,m1,F0;function u1(J){xZ=J.J,SZ=J.K,hZ=J.L,pZ=J.M,fZ=J.N,cZ=J.O,mZ=J.P,uZ=J.Q,lZ=J.R,sZ=J.S,oZ=J.T,dZ=J.U,rZ=J.V,nZ=J.W,iZ=J.X,aZ=J.Y,tZ=J.Z,eZ=J._,J0=J.$,Z0=J.aa,$0=J.ba,Q0=J.ca,K0=J.da,G0=J.ea,X0=J.fa,z0=J.ga,j0=J.ha,O0=J.ia,W0=J.ja,V0=J.ka,Y0=J.la,U0=J.ma,B0=J.na,q0=J.oa,N0=J.pa,H0=J.qa,P0=J.ra,w0=J.sa,D0=J.ta,k0=J.ua,L0=J.va,A0=J.wa,I0=J.xa,y0=J.ya,R0=J.Aa,XZ=J.Ba,v0=J.Ca,C0=J.Da,m1=F0=J.za}var l1={b:pJ,H:Q1,k:K1,c:G1,G:X1,C:z1,w:j1,m:O1,D:W1,x:V1,E:Y1,i:U1,v:B1,u:q1,t:N1,F:H1,s:P1,r:w1,l:D1,p:k1,j:L1,f:A1,q:R1,z:C1,A:F1,g:b1,d:_1,h:g1,y:h1,e:f1,o:s1,n:o1,a:g,B:c1};function s1(J,Z,Q){var K=s();try{return MZ(J)(Z,Q)}catch(X){if(T(K),X!==X+0)throw X;XZ(1,0)}}function o1(J,Z,Q,K,X){var z=s();try{return MZ(J)(Z,Q,K,X)}catch(W){if(T(z),W!==W+0)throw W;XZ(1,0)}}function d1(J){if(l=!0,!j.noFSInit&&!$.initialized)$.init();J.I(),$.ignorePermissions=!1}var r1={a:l1};WebAssembly.instantiateStreaming(fetch(new URL("akarisub-worker.wasm",self.location.href)),r1).then((J)=>{var Z=J.instance.exports;u1(Z),d1(Z),P()});let zZ=()=>{try{if(typeof g<"u"){if(self.wasmMemory=g,self.HEAPU8C=new Uint8ClampedArray(g.buffer),typeof BigInt64Array<"u")self.HEAP64=new BigInt64Array(g.buffer),self.HEAPU64=new BigUint64Array(g.buffer)}if(typeof b<"u")self.HEAPU8=b;if(typeof H<"u")self.HEAP64=H;if(typeof o<"u")self.HEAPU64=o}catch(J){}};if(typeof updateGlobalBufferAndViews==="function"){let J=updateGlobalBufferAndViews;updateGlobalBufferAndViews=(Z)=>{J(Z),zZ()}}if(typeof x==="function"){let J=x;x=()=>{J(),zZ()}}let T0=typeof P==="function"?P:null;if(T0)P=()=>{if(j._malloc=SZ,j._free=hZ,j._akarisub_create=xZ,j._akarisub_destroy=pZ,j._akarisub_set_drop_animations=fZ,j._akarisub_create_track_mem=cZ,j._akarisub_remove_track=mZ,j._akarisub_resize_canvas=uZ,j._akarisub_add_font=lZ,j._akarisub_reload_fonts=sZ,j._akarisub_set_default_font=oZ,j._akarisub_set_fallback_fonts=dZ,j._akarisub_set_memory_limits=rZ,j._akarisub_get_event_count=nZ,j._akarisub_alloc_event=iZ,j._akarisub_remove_event=aZ,j._akarisub_get_style_count=tZ,j._akarisub_alloc_style=eZ,j._akarisub_remove_style=J0,j._akarisub_style_override_index=Z0,j._akarisub_disable_style_override=$0,j._akarisub_render_blend=Q0,j._akarisub_render_image=K0,j._akarisub_get_changed=G0,j._akarisub_get_count=X0,j._akarisub_get_time=z0,j._akarisub_get_track_color_space=j0,j._akarisub_event_get_int=O0,j._akarisub_event_set_int=W0,j._akarisub_event_get_str=V0,j._akarisub_event_set_str=Y0,j._akarisub_style_get_num=U0,j._akarisub_style_set_num=B0,j._akarisub_style_get_str=q0,j._akarisub_style_set_str=N0,j._akarisub_render_result_x=H0,j._akarisub_render_result_y=P0,j._akarisub_render_result_w=w0,j._akarisub_render_result_h=D0,j._akarisub_render_result_image=k0,j._akarisub_render_result_next=L0,j._akarisub_render_result_collect=A0,j._akarisub_render_blend_collect=I0,j._akarisub_render_image_collect=y0,typeof $<"u")j.FS_createPath=$.createPath,j.FS_createDataFile=$.createDataFile;return zZ(),T0()};if(l)O=j;else O=new Promise((J,Z)=>{v=J,a=Z});return O}var b0=n1;var jZ=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function _0(G,O=!1){let j=[],U=G.split(/[\r\n]+/g),N=U.length,P=null,Y=null;for(let w=0;w<N;w++){let v=U[w];if(!v||/^\s*$/.test(v))continue;let a=v[0];if(a==="["){let l=v.match(/^\[(.*)\]$/);if(l){if(O&&l[1].toLowerCase()==="events")break;P=null,Y={name:l[1],body:[]},j.push(Y);continue}}if(!Y)continue;if(a===";")Y.body.push({type:"comment",value:v.substring(1)});else{let l=v.indexOf(":");if(l===-1)continue;let x=v.substring(0,l),n=v.substring(l+1).trim();if(P||x==="Format"){let D=n.split(",");if(P&&D.length>P.length){let H=D.slice(P.length-1).join(",");D=D.slice(0,P.length-1),D.push(H)}let L=D.length;for(let H=0;H<L;H++)D[H]=D[H].trim();if(P){let H={},k=Math.min(P.length,L);for(let S=0;S<k;S++)H[P[S]]=D[S];n=H}else n=D}if(x==="Format")P=n;Y.body.push({key:x,value:n})}}return j}var i1=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function OZ(G){return G.replace(i1,"")}var a1=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function t1(G,O){let j=[...a1].sort((U,N)=>U.w-N.w);for(let U of j)if(G<=U.w&&O<=U.h)return U;return{w:Math.ceil(G/100)*100,h:Math.ceil(O/100)*100}}function r(G,O){return O&&O.includes(".")?G.toFixed(2).replace(/\.?0+$/,""):Math.round(G)}function WZ(G){let O=G.match(/PlayResX:\s*(\d+)/i),j=G.match(/PlayResY:\s*(\d+)/i),U=O?parseInt(O[1],10):1920,N=j?parseInt(j[1],10):1080,P=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,Y=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,w=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,v=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,a=0,l=0,x=(b,T,s)=>{let g,OJ=new RegExp(b.source,"g");while((g=OJ.exec(G))!==null){for(let GJ of T)if(g[GJ]){let zJ=Math.abs(parseFloat(g[GJ]));if(zJ>a)a=zJ}for(let GJ of s)if(g[GJ]){let zJ=Math.abs(parseFloat(g[GJ]));if(zJ>l)l=zJ}}};if(x(P,[1],[2]),x(Y,[1,3],[2,4]),x(w,[1],[2]),x(v,[1,3],[2,4]),a<=U&&l<=N)return G;let n=t1(a,l),D=U/n.w,L=N/n.h,H=Math.min(D,L),k=Math.max(D,L),S=1,M=G,h=M.match(/(\[Events\][\s\S]*)/i);if(!h)return M;let B=h[1];return B=B.replace(P,(b,T,s)=>`\\pos(${r(parseFloat(T)*D,T)},${r(parseFloat(s)*L,s)})`),B=B.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(b,T,s,g,OJ,GJ,zJ)=>{let pJ=`\\move(${r(parseFloat(T)*D,T)},${r(parseFloat(s)*L,s)},${r(parseFloat(g)*D,g)},${r(parseFloat(OJ)*L,OJ)}`;return GJ?`${pJ},${GJ},${zJ})`:`${pJ})`}),B=B.replace(w,(b,T,s)=>`\\org(${r(parseFloat(T)*D,T)},${r(parseFloat(s)*L,s)})`),B=B.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(b,T,s,g,OJ,GJ)=>`\\${T}(${r(parseFloat(s)*D,s)},${r(parseFloat(g)*L,g)},${r(parseFloat(OJ)*D,OJ)},${r(parseFloat(GJ)*L,GJ)})`),B=B.replace(/\\fs([\d.]+)/g,(b,T)=>`\\fs${r(parseFloat(T)*k,T)}`),B=B.replace(/\\fscx([\d.]+)/g,(b,T)=>`\\fscx${r(parseFloat(T)*S,T)}`),B=B.replace(/\\xbord([\d.]+)/g,(b,T)=>`\\xbord${r(parseFloat(T)*D,T)}`),B=B.replace(/\\ybord([\d.]+)/g,(b,T)=>`\\ybord${r(parseFloat(T)*L,T)}`),B=B.replace(/\\xshad(-?[\d.]+)/g,(b,T)=>`\\xshad${r(parseFloat(T)*D,T)}`),B=B.replace(/\\yshad(-?[\d.]+)/g,(b,T)=>`\\yshad${r(parseFloat(T)*L,T)}`),["fsp","bord","shad","be","blur"].forEach((b)=>{let T=new RegExp(`\\\\${b}(-?[\\d.]+)`,"g");B=B.replace(T,(s,g)=>`\\${b}${r(parseFloat(g)*H,g)}`)}),B=B.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(b)=>{return b.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(T,s,g)=>{return`${r(parseFloat(s)*D,s)} ${r(parseFloat(g)*L,g)}`})}),M.substring(0,h.index)+B}var wJ=0,S0=1,jJ=null,VZ=!1,tJ=Date.now(),oJ=24,gJ=!1,h0=!1,yZ="wasm",PJ={},dJ={},p0=0,f0=0,FJ=[],i=!1,NZ=!1,MJ=!1,e1=3,$J=[];self.width=0;self.height=0;var C={framesRendered:0,framesDropped:0,totalRenderTime:0,maxRenderTime:0,minRenderTime:1/0,lastRenderTime:0,renderStartTime:0,pendingRenders:0,totalEvents:0,currentEventIndex:0,cacheHits:0,cacheMisses:0},J4=()=>{C.framesRendered=0,C.framesDropped=0,C.totalRenderTime=0,C.maxRenderTime=0,C.minRenderTime=1/0,C.lastRenderTime=0,C.cacheHits=0,C.cacheMisses=0},UJ=!1,TJ=!0,YJ=null,LJ=null,xJ=!1,HJ=null,c0=null,c=0,IJ=null,HZ=!1,Z4=!1,ZJ=null,rJ=!1,m0=new TextEncoder,$4=new TextDecoder,PZ=null,eJ=128,u0=Math.max(eJ,4096),l0=u0;var Q4=30,K4=1,G4=24,wZ=1000,s0=Array(eJ),E0=!1;var DZ=3,sJ=5,YZ=0,X4=0,KJ=0,VJ=0,z4=[],j4=[],O4=[],UZ=null;var W4=!1,JZ=null,AJ=null,kZ=(G)=>new Promise((O)=>setTimeout(O,G)),o0=()=>{if(E0)return;for(let G=0;G<eJ;G++)s0[G]={w:0,h:0,x:0,y:0,image:0};E0=!0},g0=(G)=>{if(G<eJ)return s0[G];return{w:0,h:0,x:0,y:0,image:0}};var RZ=(G)=>{if(!ZJ||G<=0)return;let O=DZ+sJ*G;if(VJ>=O&&KJ)return;let j=Math.max(O,(VJ||64)*2),U=j*Int32Array.BYTES_PER_ELEMENT;if(KJ)ZJ._free(KJ),KJ=0,VJ=0;if(KJ=ZJ._malloc(U),!KJ)throw VJ=0,Error("Failed to allocate render-collect buffer");VJ=j},nJ=(G)=>{if(!c)return;let O=E(),j=u();if(RZ(l0),yZ==="wasm")O.renderBlendCollect(j,G,0,KJ,VJ);else O.renderImageCollect(j,G,0,KJ,VJ)},d0=()=>{if(!c)return null;let G=E(),O=u(),j=G.getEventCount(O);if(j<=0)return null;let U=Number.POSITIVE_INFINITY;for(let N=0;N<j;N++){let P=G.eventGetInt(O,N,XJ.Start)/wZ;if(Number.isFinite(P)&&P<U)U=P}if(!Number.isFinite(U))return null;return Math.max(0,U)},V4=()=>{if(!c)return null;let G=E(),O=u(),j=G.getEventCount(O);if(j<=0)return null;let U=Number.POSITIVE_INFINITY,N=0;for(let P=0;P<j;P++){let Y=G.eventGetInt(O,P,XJ.Start)/wZ,w=Math.max(0,G.eventGetInt(O,P,XJ.Duration)/wZ);if(!Number.isFinite(Y))continue;let v=Y+w;if(Y<U)U=Y;if(v>N)N=v}if(!Number.isFinite(U))return null;if(N<U)N=U;return{start:Math.max(0,U),end:Math.max(0,N)}},Y4=async()=>{if(!c)return;let G=V4();if(!G)return;let O=Math.min(G.end,G.start+Q4),j=0;for(let U=G.start;U<=O;U+=K4){if(!c)return;if(gJ&&(MJ||$J.length>0||C.pendingRenders>0)){await kZ(0);continue}if(nJ(U),j++,gJ||j%G4===0)await kZ(0)}nJ(O)};var vZ=()=>{if(W4=!1,UZ)clearTimeout(UZ),UZ=null},U4=()=>{if(AJ||!c)return;AJ=(async()=>{await kZ(0);try{await Y4()}catch(G){if(i)console.warn("[AkariSub] Full track warmup failed, continuing:",G)}try{if(c)nJ(n0())}catch(G){if(i)console.warn("[AkariSub] Post-warmup re-prime failed, continuing:",G)}})().finally(()=>{AJ=null})};var XJ={Start:0,Duration:1,ReadOrder:2,Layer:3,Style:4,MarginL:5,MarginR:6,MarginV:7},bJ={Name:0,Effect:1,Text:2},f={FontSize:0,PrimaryColour:1,SecondaryColour:2,OutlineColour:3,BackColour:4,Bold:5,Italic:6,Underline:7,StrikeOut:8,ScaleX:9,ScaleY:10,Spacing:11,Angle:12,BorderStyle:13,Outline:14,Shadow:15,Alignment:16,MarginL:17,MarginR:18,MarginV:19,Encoding:20,treat_fontname_as_pattern:21,Blur:22,Justify:23},iJ={Name:0,FontName:1},B4=(G)=>{return m0.encode(G)},q4=(G)=>{if(!ZJ)return 0;let O=B4(G),j=ZJ._malloc(O.length+1);if(!j)return 0;return self.HEAPU8.set(O,j),self.HEAPU8[j+O.length]=0,j},_J=(G)=>{if(!G)return"";let O=G,j=self.HEAPU8;while(j[O]!==0)O++;return $4.decode(j.subarray(G,O))},qJ=(G,O)=>{let j=q4(G);try{return O(j)}finally{if(j&&ZJ)ZJ._free(j)}},E=()=>{if(!PZ)throw Error("AkariSub API is not initialized");return PZ},u=()=>{if(!c)throw Error("AkariSub instance is not initialized");return c};self.addFont=({font:G})=>r0(G,!1);var uJ=(G)=>{if(G=G.trim().toLowerCase(),G.startsWith("@"))G=G.substring(1);if(dJ[G])return;if(dJ[G]=!0,!PJ[G]){if(h0)postMessage({target:"getLocalFont",font:G})}else r0(PJ[G])},r0=(G,O=!0)=>{if(typeof G==="string")IZ(G,(j)=>{M0(new Uint8Array(j),O)},console.error);else M0(G,O)};var BZ=null,N4=()=>{if(BZ)return;BZ=setTimeout(()=>{if(BZ=null,c)E().reloadFonts(c)},16)},SJ=(G,O)=>{if(!ZJ||!c){if(i)console.warn("[AkariSub] Cannot add embedded font, module or AkariSub not ready:",O);return}try{let j=E(),U=ZJ._malloc(G.length);if(!U){console.warn("[AkariSub] Failed to allocate memory for embedded font:",O);return}if(self.HEAPU8.set(G,U),qJ(O,(N)=>{j.addFont(c,N,U,G.length)}),i)console.log("[AkariSub] Added embedded font:",O,"size:",G.length)}catch(j){console.warn("[AkariSub] Failed to add embedded font:",O,j)}},M0=(G,O=!0)=>{let j=O?"/fonts/fallback":"/fonts/attached",U=O?"fallback-"+f0++:"attached-"+p0++;if(ZJ){try{ZJ.FS_createDataFile(j,U,G,!0,!0,!0)}catch(N){console.warn("Failed to write font to filesystem:",j+"/"+U,N)}if(!O)SJ(G,U);else if(c)SJ(G,U);else FJ.push({data:G,name:U})}N4()},lJ=(G,O=!0)=>{let j=O?"/fonts/fallback":"/fonts/attached",U=O?"fallback-"+f0++:"attached-"+p0++;if(ZJ){try{if(ZJ.FS_createDataFile(j,U,G,!0,!0,!0),i)console.log("[AkariSub] Wrote font to FS:",j+"/"+U,"size:",G.length)}catch(N){console.warn("Failed to write font to filesystem:",j+"/"+U,N)}if(!O)SJ(G,U);else if(c)SJ(G,U);else FJ.push({data:G,name:U})}},LZ=(G)=>{if(!PJ)return;if(G.length>500000){let j=G.match(/\[V4\+?\s*Styles?\][^\[]*(?=\[|$)/i);if(j){let P=j[0].matchAll(/^Style:[^,]*,([^,]+)/gm);for(let Y of P)uJ(Y[1].trim())}let U=G.match(/\[Events\][\s\S]*/i);if(U){let P=U[0].matchAll(/\\fn([^\\}]*?)[\\}]/g),Y=0;for(let w of P)if(uJ(w[1]),++Y>=1000)break}}else{let j=_0(G,!0);for(let N=0;N<j.length;N++)for(let P=0;P<j[N].body.length;P++){let Y=j[N].body[P];if(Y.key==="Style"&&typeof Y.value==="object"&&!Array.isArray(Y.value))uJ(Y.value.Fontname)}let U=G.match(/\[Events\][\s\S]*/i);if(U){let P=U[0].matchAll(/\\fn([^\\}]*?)[\\}]/g);for(let Y of P)uJ(Y[1])}}},AZ=(G,O)=>{let j=new XMLHttpRequest;return j.open("GET",G,!1),j.responseType=O?"arraybuffer":"text",j.send(null),j.response},IZ=(G,O,j)=>{let U=new XMLHttpRequest;U.open("GET",G,!0),U.responseType="arraybuffer",U.onload=()=>{if((U.status===200||U.status===0)&&U.response)return O(U.response)},U.onerror=j,U.send(null)};self.setTrack=({content:G})=>{if(vZ(),AJ=null,LZ(G),NZ)G=WZ(G);if(HZ)G=OZ(G);let O=E(),j=u();qJ(G,(U)=>{O.createTrackMem(j,U)}),JZ=d0(),IJ=jZ[O.getTrackColorSpace(j)],rJ=!0,postMessage({target:"verifyColorSpace",subtitleColorSpace:IJ})};self.getColorSpace=()=>{postMessage({target:"verifyColorSpace",subtitleColorSpace:IJ})};self.freeTrack=()=>{vZ(),AJ=null,JZ=null;let G=E(),O=u();G.removeTrack(O)};self.setTrackByUrl=({url:G})=>{self.setTrack({content:AZ(G)})};var EJ=!0,n0=()=>{let G=(Date.now()-tJ)/1000;if(EJ)return wJ;else{if(G>5)console.error("Didn't receive currentTime > 5 seconds. Assuming video was paused."),i0(!0);return wJ+G*S0}},H4=(G)=>{if(wJ=G,tJ=Date.now(),gJ)return;if(!jJ)if(VZ)jJ=CZ(aJ);else aJ(),VZ=!0,setTimeout(()=>{VZ=!1},20)},i0=(G)=>{if(gJ){if(EJ=G,jJ)x0(jJ),jJ=null;return}if(G!==EJ)if(EJ=G,G){if(jJ)x0(jJ),jJ=null}else tJ=Date.now(),jJ=CZ(aJ)},P4=()=>{if(MJ||$J.length===0)return;if($J.length>1){let O=$J.length-1;C.framesDropped+=O;let j=$J[$J.length-1];$J.length=0,$J.push(j)}let G=$J.shift();if(!G)return;hJ(G.time,G.force)},BJ=()=>{MJ=!1,P4()},hJ=(G,O)=>{if(MJ){let D={time:G,force:O?1:0};if(D.force)$J.length=0;else{let L=$J[$J.length-1];if(L&&Math.abs(L.time-D.time)>0.25)$J.length=0}if($J.length>=e1)$J.shift(),C.framesDropped++;$J.push(D);return}MJ=!0,o0();let j={},U=performance.now();C.renderStartTime=U,C.pendingRenders++;let N=E(),P=u(),Y=O?1:0;RZ(u0);let w=yZ==="wasm"?N.renderBlendCollect(P,G,Y,KJ,VJ):N.renderImageCollect(P,G,Y,KJ,VJ),v=new Int32Array(self.wasmMemory.buffer,KJ,DZ),a=v[0],l=v[1],n=performance.now()-U;if(C.lastRenderTime=n,C.totalRenderTime+=n,C.maxRenderTime=Math.max(C.maxRenderTime,n),n>0)C.minRenderTime=Math.min(C.minRenderTime,n);if(a!==0||O)C.framesRendered++,C.cacheMisses++;else C.cacheHits++;if(C.totalEvents=N.getEventCount(P),i){let D=performance.now(),L=v[2];j.WASMRenderTime=L-U,j.WASMBitmapDecodeTime=D-L,j.JSRenderTime=Date.now()}if(a!==0||O){let D=z4,L=j4;if(D.length=0,L.length=0,w===0)return qZ({images:D,buffers:L,times:j});let H=KJ+DZ*Int32Array.BYTES_PER_ELEMENT,k=new Int32Array(self.wasmMemory.buffer,H,w*sJ);if(UJ&&xJ!==!0){let M=O4;M.length=w;for(let h=0;h<w;++h){let B=h*sJ,o=g0(h);o.x=k[B],o.y=k[B+1],o.w=k[B+2],o.h=k[B+3],o.image=0;let b=k[B+4],T=o.w*o.h*4,s=self.HEAPU8C.slice(b,b+T),g=new ImageData(s,o.w,o.h);M[h]=TJ?createImageBitmap(g,{premultiplyAlpha:"none",colorSpaceConversion:"none"}):createImageBitmap(g),D[h]=o}Promise.all(M).then((h)=>{for(let B=0;B<w;B++)D[B].image=h[B];if(i)j.JSBitmapGenerationTime=Date.now()-(j.JSRenderTime||0);qZ({images:D,buffers:h,times:j})}).catch(()=>{if(TJ)TJ=!1,console.warn("[AkariSub] createImageBitmap options not supported, disabling"),C.pendingRenders--,BJ(),hJ(G,O);else C.pendingRenders--,postMessage({target:"unbusy"}),BJ()})}else{for(let M=0;M<w;++M){let h=M*sJ,B=g0(M);if(B.x=k[h],B.y=k[h+1],B.w=k[h+2],B.h=k[h+3],B.image=k[h+4],!LJ){let o=B.image,b=self.wasmMemory.buffer.slice(o,o+B.w*B.h*4);L.push(b),B.image=b}D[M]=B}qZ({images:D,buffers:L,times:j})}}else C.pendingRenders--,postMessage({target:"unbusy"}),BJ()};self.demand=({time:G})=>{wJ=G,tJ=Date.now();let O=rJ?1:0;rJ=!1,hJ(G,O)};var aJ=(G)=>{if(jJ=null,hJ(n0(),G),!EJ)jJ=CZ(aJ)},qZ=({times:G,images:O,buffers:j})=>{C.pendingRenders--;let{width:U,height:N}=self,P=O.length,Y={target:"render",asyncRender:UJ,images:O,times:G,width:U,height:N,colorSpace:IJ};if(xJ){if(YJ.height!==N||YJ.width!==U)YJ.width=U,YJ.height=N;if(LJ.clearRect(0,0,U,N),UJ)for(let w=0;w<P;w++){let v=O[w];if(v.image)LJ.drawImage(v.image,v.x,v.y),v.image.close()}else for(let w=0;w<P;w++){let v=O[w];if(v.image){let{w:a,h:l}=v;if(HJ.width!==a||HJ.height!==l)HJ.width=a,HJ.height=l;let x=v.image,n=a*l*4,D=self.HEAPU8C.subarray(x,x+n);c0.putImageData(new ImageData(new Uint8ClampedArray(D.buffer,D.byteOffset,D.byteLength),a,l),0,0),LJ.drawImage(HJ,v.x,v.y)}}if(xJ==="hybrid"){if(!P){postMessage(Y),BJ();return}if(i)G.bitmaps=P;try{let w=YJ.transferToImageBitmap(),v={...Y,images:[{image:w,x:0,y:0}],asyncRender:!0};postMessage(v,[w]),BJ()}catch{postMessage({target:"unbusy"}),BJ()}}else{if(i){G.JSRenderTime=Date.now()-(G.JSRenderTime||0)-(G.JSBitmapGenerationTime||0);let w=0;for(let v in G)w+=G[v]||0;console.log("Bitmaps: "+P+" Total: "+(w|0)+"ms",G)}postMessage({target:"unbusy"}),BJ()}}else postMessage(Y,j),BJ()},CZ=self.requestAnimationFrame?self.requestAnimationFrame.bind(self):(()=>{let G=0;return(O)=>{let j=Date.now();if(G===0)G=j+1000/oJ;else while(j+2>=G)G+=1000/oJ;let U=Math.max(G-j,0);return setTimeout(O,U)}})(),x0=self.cancelAnimationFrame?self.cancelAnimationFrame.bind(self):clearTimeout;self.init=async(G)=>{if(Z4=G.hasBitmapBug,typeof G.initialTime==="number"&&Number.isFinite(G.initialTime))wJ=G.initialTime;let O=self.fetch,j=(Y)=>{if(WebAssembly.instantiateStreaming)self.fetch=(w)=>O(Y)},U=()=>{self.fetch=O},N=(Y)=>{return j(Y),b0({wasm:!WebAssembly.instantiateStreaming?AZ(Y,!0):void 0}).finally(U)},P=async(Y)=>{ZJ=Y,PZ={create:Y._akarisub_create,destroy:Y._akarisub_destroy,setDropAnimations:Y._akarisub_set_drop_animations,createTrackMem:Y._akarisub_create_track_mem,removeTrack:Y._akarisub_remove_track,resizeCanvas:Y._akarisub_resize_canvas,addFont:Y._akarisub_add_font,reloadFonts:Y._akarisub_reload_fonts,setDefaultFont:Y._akarisub_set_default_font,setFallbackFonts:Y._akarisub_set_fallback_fonts,setMemoryLimits:Y._akarisub_set_memory_limits,getEventCount:Y._akarisub_get_event_count,allocEvent:Y._akarisub_alloc_event,removeEvent:Y._akarisub_remove_event,getStyleCount:Y._akarisub_get_style_count,allocStyle:Y._akarisub_alloc_style,removeStyle:Y._akarisub_remove_style,styleOverrideIndex:Y._akarisub_style_override_index,disableStyleOverride:Y._akarisub_disable_style_override,renderBlend:Y._akarisub_render_blend,renderImage:Y._akarisub_render_image,getChanged:Y._akarisub_get_changed,getCount:Y._akarisub_get_count,getTime:Y._akarisub_get_time,getTrackColorSpace:Y._akarisub_get_track_color_space,eventGetInt:Y._akarisub_event_get_int,eventSetInt:Y._akarisub_event_set_int,eventGetStr:Y._akarisub_event_get_str,eventSetStr:Y._akarisub_event_set_str,styleGetNum:Y._akarisub_style_get_num,styleSetNum:Y._akarisub_style_set_num,styleGetStr:Y._akarisub_style_get_str,styleSetStr:Y._akarisub_style_set_str,rrX:Y._akarisub_render_result_x,rrY:Y._akarisub_render_result_y,rrW:Y._akarisub_render_result_w,rrH:Y._akarisub_render_result_h,rrImage:Y._akarisub_render_result_image,rrNext:Y._akarisub_render_result_next,rrCollect:Y._akarisub_render_result_collect,renderBlendCollect:Y._akarisub_render_blend_collect,renderImageCollect:Y._akarisub_render_image_collect};let w=[],v=new Set;if(G.fallbackFonts&&G.fallbackFonts.length>0)for(let H of G.fallbackFonts){let k=H.trim(),S=k.toLowerCase();if(S&&!v.has(S))v.add(S),w.push(k)}try{Y.FS_createPath("/","fonts",!0,!0),Y.FS_createPath("/fonts","attached",!0,!0),Y.FS_createPath("/fonts","fallback",!0,!0),Y.FS_createPath("/","fontconfig",!0,!0),Y.FS_createPath("/","assets",!0,!0),Y.FS_createPath("/","etc",!0,!0),Y.FS_createPath("/etc","fonts",!0,!0);let H=`<?xml version="1.0"?>
2
+ <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
3
+ <fontconfig>
4
+ <!-- Font directories listed in priority order -->
5
+ <dir>/fonts/attached</dir>
6
+ <dir>/fonts</dir>
7
+ <dir>/fonts/fallback</dir>
8
+ <match target="pattern">
9
+ <test qual="any" name="family">
10
+ <string>mono</string>
11
+ </test>
12
+ <edit name="family" mode="assign" binding="same">
13
+ <string>monospace</string>
14
+ </edit>
15
+ </match>
16
+ <match target="pattern">
17
+ <test qual="any" name="family">
18
+ <string>sans serif</string>
19
+ </test>
20
+ <edit name="family" mode="assign" binding="same">
21
+ <string>sans-serif</string>
22
+ </edit>
23
+ </match>
24
+ <match target="pattern">
25
+ <test qual="any" name="family">
26
+ <string>sans</string>
27
+ </test>
28
+ <edit name="family" mode="assign" binding="same">
29
+ <string>sans-serif</string>
30
+ </edit>
31
+ </match>
32
+ <cachedir>/fontconfig</cachedir>
33
+ <config>
34
+ <rescan>
35
+ <int>0</int>
36
+ </rescan>
37
+ </config>
38
+ </fontconfig>
39
+ `,k=m0.encode(H);Y.FS_createDataFile("/assets","fonts.conf",k,!0,!1,!1),Y.FS_createDataFile("/etc/fonts","fonts.conf",k,!0,!1,!1)}catch(H){console.warn("Failed to create font directories or fonts.conf:",H)}if(self.width=G.width,self.height=G.height,gJ=!!G.onDemandRender,yZ=G.blendMode,UJ=G.asyncRender,UJ&&typeof createImageBitmap>"u")UJ=!1,console.error("'createImageBitmap' needed for 'asyncRender' unsupported!");if(UJ)try{let k=new OffscreenCanvas(1,1).getContext("2d");if(k){let S=k.getImageData(0,0,1,1);await createImageBitmap(S,{premultiplyAlpha:"none",colorSpaceConversion:"none"}).catch(()=>{TJ=!1,console.warn("[AkariSub] createImageBitmap options not supported (Safari?), rendering without options")})}}catch{TJ=!1}PJ=G.availableFonts,i=G.debug,oJ=G.targetFps||oJ,h0=G.useLocalFonts,HZ=G.dropAllBlur,NZ=G.clampPos,await(async()=>{let H=[];for(let k of w){let S=k.trim().toLowerCase(),M=S.startsWith("@")?S.substring(1):S;if(PJ&&PJ[M]){let h=PJ[M];if(typeof h==="string"){let B=new Promise((o)=>{IZ(h,(b)=>{if(lJ(new Uint8Array(b),!0),dJ[M]=!0,i)console.log("[AkariSub] Loaded fallback font async:",M);o()},(b)=>{console.error("Failed to load fallback font:",M,b),o()})});H.push(B)}else lJ(h,!0),dJ[M]=!0}}if(H.length>0){let k=null,S=!1,M=new Promise((h)=>{k=setTimeout(()=>{S=!0,console.warn("[AkariSub] Fallback font loading timeout, continuing with available fonts"),h()},30000)});if(await Promise.race([Promise.all(H).then(()=>{if(k!==null)clearTimeout(k)}),M]),!S&&i)console.log("[AkariSub] All fallback fonts loaded successfully")}})();let l=w.length>0?w[0]:null;if(c=qJ(l||"",(H)=>{return E().create(self.width,self.height,H,i?1:0)}),FJ.length>0){for(let{data:H,name:k}of FJ)SJ(H,k);FJ.length=0,E().reloadFonts(c)}if(w.length>0)qJ(w.join(","),(H)=>{E().setFallbackFonts(u(),H)});let x=G.subContent;if(!x)x=AZ(G.subUrl);if(x.length>500000){if(postMessage({target:"partial_ready"}),i)console.log("[AkariSub] Large subtitle detected, emitting partial_ready early")}if(LZ(x),NZ)x=WZ(x);if(HZ)x=OZ(x);let D=!1,L=[];for(let H of G.fonts||[])if(typeof H==="string"){let k=new Promise((S)=>{IZ(H,(M)=>{if(lJ(new Uint8Array(M),!1),D=!0,i)console.log("[AkariSub] Loaded attached font async:",H);S()},(M)=>{console.error("Failed to load attached font:",H,M),S()})});L.push(k)}else lJ(H,!1),D=!0;if(L.length>0){let H=null,k=!1,S=new Promise((M)=>{H=setTimeout(()=>{k=!0,console.warn("[AkariSub] Attached font loading timeout, continuing with available fonts"),M()},30000)});if(await Promise.race([Promise.all(L).then(()=>{if(H!==null)clearTimeout(H)}),S]),!k&&i)console.log("[AkariSub] Attached font loading complete")}if(D){if(i)console.log("[AkariSub] Reloading fonts after writing attached fonts to FS");if(E().reloadFonts(u()),i)console.log("[AkariSub] Font reload complete")}if(LZ(x),qJ(x,(H)=>{E().createTrackMem(u(),H)}),JZ=d0(),IJ=jZ[E().getTrackColorSpace(u())],E().setDropAnimations(u(),G.dropAllAnimations||0),G.libassMemoryLimit>0||G.libassGlyphLimit>0)E().setMemoryLimits(u(),G.libassGlyphLimit||0,G.libassMemoryLimit||0);o0(),RZ(l0);try{nJ(wJ)}catch(H){if(i)console.warn("[AkariSub] Prewarm render failed, continuing:",H)}rJ=!0,postMessage({target:"ready"}),postMessage({target:"verifyColorSpace",subtitleColorSpace:IJ}),U4()};N(G.wasmUrl).then(P).catch((Y)=>{console.error("[AkariSub] WASM loading failed:",Y),postMessage({target:"error",error:"WASM loading failed: "+(Y&&Y.message?Y.message:String(Y))})})};self.offscreenCanvas=({transferable:G})=>{if(YJ=G[0],LJ=YJ.getContext("2d"),!UJ)HJ=new OffscreenCanvas(self.height,self.width),c0=HJ.getContext("2d",{desynchronized:!0});xJ=!0};self.detachOffscreen=()=>{YJ=new OffscreenCanvas(self.height,self.width),LJ=YJ.getContext("2d",{desynchronized:!0}),xJ="hybrid"};self.canvas=({width:G,height:O,videoWidth:j,videoHeight:U,force:N})=>{if(G==null)throw Error("Invalid canvas size specified");if(self.width=G,self.height=O,c)E().resizeCanvas(c,G,O,j,U);if(N)hJ(wJ,!0)};self.video=({currentTime:G,isPaused:O,rate:j})=>{if(G!=null)H4(G);if(O!=null)i0(O);if(j!=null)S0=j};self.destroy=()=>{if(vZ(),AJ=null,JZ=null,ZJ){if(YZ)ZJ._free(YZ),YZ=0,X4=0;if(KJ)ZJ._free(KJ),KJ=0,VJ=0}if(c)E().destroy(c),c=0};self.setAsyncRender=({value:G})=>{UJ=G&&typeof createImageBitmap<"u"};var a0=(G,O)=>{let j=E(),U=u();for(let N of Object.keys(O)){let P=O[N];if(P==null||N==="_index")continue;if(N in XJ){j.eventSetInt(U,G,XJ[N],Number(P));continue}if(N in bJ)qJ(String(P),(Y)=>{j.eventSetStr(U,G,bJ[N],Y)})}},w4=(G)=>{let O=E(),j=u();return{Start:O.eventGetInt(j,G,XJ.Start),Duration:O.eventGetInt(j,G,XJ.Duration),ReadOrder:O.eventGetInt(j,G,XJ.ReadOrder),Layer:O.eventGetInt(j,G,XJ.Layer),Style:String(O.eventGetInt(j,G,XJ.Style)),MarginL:O.eventGetInt(j,G,XJ.MarginL),MarginR:O.eventGetInt(j,G,XJ.MarginR),MarginV:O.eventGetInt(j,G,XJ.MarginV),Name:_J(O.eventGetStr(j,G,bJ.Name)),Text:_J(O.eventGetStr(j,G,bJ.Text)),Effect:_J(O.eventGetStr(j,G,bJ.Effect))}},t0=(G,O)=>{let j=E(),U=u();for(let N of Object.keys(O)){let P=O[N];if(P==null)continue;if(N in f){j.styleSetNum(U,G,f[N],Number(P));continue}if(N in iJ)qJ(String(P),(Y)=>{j.styleSetStr(U,G,iJ[N],Y)})}},D4=(G)=>{let O=E(),j=u();return{Name:_J(O.styleGetStr(j,G,iJ.Name)),FontName:_J(O.styleGetStr(j,G,iJ.FontName)),FontSize:O.styleGetNum(j,G,f.FontSize),PrimaryColour:O.styleGetNum(j,G,f.PrimaryColour),SecondaryColour:O.styleGetNum(j,G,f.SecondaryColour),OutlineColour:O.styleGetNum(j,G,f.OutlineColour),BackColour:O.styleGetNum(j,G,f.BackColour),Bold:O.styleGetNum(j,G,f.Bold),Italic:O.styleGetNum(j,G,f.Italic),Underline:O.styleGetNum(j,G,f.Underline),StrikeOut:O.styleGetNum(j,G,f.StrikeOut),ScaleX:O.styleGetNum(j,G,f.ScaleX),ScaleY:O.styleGetNum(j,G,f.ScaleY),Spacing:O.styleGetNum(j,G,f.Spacing),Angle:O.styleGetNum(j,G,f.Angle),BorderStyle:O.styleGetNum(j,G,f.BorderStyle),Outline:O.styleGetNum(j,G,f.Outline),Shadow:O.styleGetNum(j,G,f.Shadow),Alignment:O.styleGetNum(j,G,f.Alignment),MarginL:O.styleGetNum(j,G,f.MarginL),MarginR:O.styleGetNum(j,G,f.MarginR),MarginV:O.styleGetNum(j,G,f.MarginV),Encoding:O.styleGetNum(j,G,f.Encoding),treat_fontname_as_pattern:O.styleGetNum(j,G,f.treat_fontname_as_pattern),Blur:O.styleGetNum(j,G,f.Blur),Justify:O.styleGetNum(j,G,f.Justify)}};self.createEvent=({event:G})=>{let O=E().allocEvent(u());if(O>=0)a0(O,G)};self.getEvents=()=>{let G=[],j=E().getEventCount(u());for(let U=0;U<j;U++)G.push({...w4(U),_index:U});postMessage({target:"getEvents",events:G})};self.setEvent=({event:G,index:O})=>{a0(O,G)};self.removeEvent=({index:G})=>{E().removeEvent(u(),G)};self.createStyle=({style:G})=>{let O=E().allocStyle(u());if(O>=0)t0(O,G);return O};self.getStyles=()=>{let G=[],j=E().getStyleCount(u());for(let U=0;U<j;U++)G.push(D4(U));postMessage({target:"getStyles",time:Date.now(),styles:G})};self.setStyle=({style:G,index:O})=>{t0(O,G)};self.removeStyle=({index:G})=>{E().removeStyle(u(),G)};self.styleOverride=(G)=>{let O=self.createStyle(G);if(typeof O==="number"&&O>=0)E().styleOverrideIndex(u(),O)};self.disableStyleOverride=()=>{E().disableStyleOverride(u())};self.defaultFont=({font:G})=>{qJ(G,(O)=>{E().setDefaultFont(u(),O)})};self.getStats=()=>{let G=C.framesRendered>0?C.totalRenderTime/C.framesRendered:0;postMessage({target:"getStats",stats:{framesRendered:C.framesRendered,framesDropped:C.framesDropped,avgRenderTime:Math.round(G*100)/100,maxRenderTime:Math.round(C.maxRenderTime*100)/100,minRenderTime:C.minRenderTime===1/0?0:Math.round(C.minRenderTime*100)/100,lastRenderTime:Math.round(C.lastRenderTime*100)/100,pendingRenders:Math.max(0,C.pendingRenders),totalEvents:C.totalEvents,cacheHits:C.cacheHits,cacheMisses:C.cacheMisses}})};self.resetStats=()=>{J4(),postMessage({target:"resetStats",success:!0})};self.getEventCount=()=>{let G=c?E().getEventCount(c):0;postMessage({target:"getEventCount",count:G})};self.getStyleCount=()=>{let G=c?E().getStyleCount(c):0;postMessage({target:"getStyleCount",count:G})};onmessage=({data:G})=>{if(self[G.target])self[G.target](G);else throw Error("Unknown event target "+G.target)};})();
Binary file
@@ -0,0 +1,159 @@
1
+ (function(root, factory) {
2
+ if (typeof define === 'function' && define.amd) {
3
+ define([], factory);
4
+ } else if (typeof module === 'object' && module.exports) {
5
+ module.exports = factory();
6
+ } else {
7
+ root.AkariSub = factory();
8
+ }
9
+ }(typeof self !== 'undefined' ? self : this, function() {
10
+ (()=>{var{defineProperty:h,getOwnPropertyNames:KJ,getOwnPropertyDescriptor:NJ}=Object,ZJ=Object.prototype.hasOwnProperty;function $J(J){return this[J]}var QJ=(J)=>{var K=(g??=new WeakMap).get(J),Z;if(K)return K;if(K=h({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function"){for(var N of KJ(J))if(!ZJ.call(K,N))h(K,N,{get:$J.bind(J,N),enumerable:!(Z=NJ(J,N))||Z.enumerable})}return g.set(J,K),K},g;var OJ=(J)=>J;function FJ(J,K){this[J]=OJ.bind(null,K)}var UJ=(J,K)=>{for(var Z in K)h(J,Z,{get:K[Z],enumerable:!0,configurable:!0,set:FJ.bind(K,Z)})};var YJ={};UJ(YJ,{webYCbCrMap:()=>u,testImageBugs:()=>l,runFeatureTests:()=>a,parseAss:()=>r,libassYCbCrMap:()=>s,isWebGPUSupported:()=>f,isWebGL2Supported:()=>p,getVideoPosition:()=>c,getColorSpaceFilterUrl:()=>o,getBitmapBug:()=>e,getAlphaBug:()=>t,fixPlayRes:()=>i,fixAlpha:()=>m,dropBlur:()=>n,default:()=>R,computeCanvasSize:()=>w,colorMatrixConversionMap:()=>y,WebGPURenderer:()=>v,WebGL2Renderer:()=>x,AkariSub:()=>R});var u={bt709:"BT709",bt470bg:"BT601",smpte170m:"BT601"},y={BT601:{BT709:"1.0863 -0.0723 -0.014 0 0 0.0965 0.8451 0.0584 0 0 -0.0141 -0.0277 1.0418"},BT709:{BT601:"0.9137 0.0784 0.0079 0 0 -0.1049 1.1722 -0.0671 0 0 0.0096 0.0322 0.9582"},FCC:{BT709:"1.0873 -0.0736 -0.0137 0 0 0.0974 0.8494 0.0531 0 0 -0.0127 -0.0251 1.0378",BT601:"1.001 -0.0008 -0.0002 0 0 0.0009 1.005 -0.006 0 0 0.0013 0.0027 0.996"},SMPTE240M:{BT709:"0.9993 0.0006 0.0001 0 0 -0.0004 0.9812 0.0192 0 0 -0.0034 -0.0114 1.0148",BT601:"0.913 0.0774 0.0096 0 0 -0.1051 1.1508 -0.0456 0 0 0.0063 0.0207 0.973"}},s=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function o(J,K){if(!J||!K)return null;if(J===K)return null;let Z=y[J]?.[K];if(!Z)return null;return`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${Z} 0 0 0 0 0 1 0'/></filter></svg>#f")`}function w(J,K,Z,N,Q){let F=Z<=0?1:Z,$=globalThis.devicePixelRatio||1;if(K<=0||J<=0)return{width:0,height:0};let U=F<1?-1:1,O=K*$;if(U*O*F<=U*N)O*=F;else if(U*O<U*N)O=N;if(Q>0&&O>Q)O=Q;return J*=O/K,K=O,{width:J,height:K}}function c(J,K=J.videoWidth,Z=J.videoHeight){let N=K/Z,{offsetWidth:Q,offsetHeight:F}=J,$=Q/F,U=Q,O=F;if($>N)U=Math.floor(F*N);else O=Math.floor(Q/N);let E=(Q-U)/2,q=(F-O)/2;return{width:U,height:O,x:E,y:q}}function m(J,K){if(!K)return J;let Z=J.length,N=Z-Z%16,Q=3;for(;Q<N;Q+=16){if(J[Q]<2)J[Q]=1;if(J[Q+4]<2)J[Q+4]=1;if(J[Q+8]<2)J[Q+8]=1;if(J[Q+12]<2)J[Q+12]=1}for(;Q<Z;Q+=4)if(J[Q]<2)J[Q]=1;return J}function r(J,K=!1){let Z=[],N=J.split(/[\r\n]+/g),Q=N.length,F=null,$=null;for(let U=0;U<Q;U++){let O=N[U];if(!O||/^\s*$/.test(O))continue;let E=O[0];if(E==="["){let q=O.match(/^\[(.*)\]$/);if(q){if(K&&q[1].toLowerCase()==="events")break;F=null,$={name:q[1],body:[]},Z.push($);continue}}if(!$)continue;if(E===";")$.body.push({type:"comment",value:O.substring(1)});else{let q=O.indexOf(":");if(q===-1)continue;let L=O.substring(0,q),_=O.substring(q+1).trim();if(F||L==="Format"){let Y=_.split(",");if(F&&Y.length>F.length){let z=Y.slice(F.length-1).join(",");Y=Y.slice(0,F.length-1),Y.push(z)}let T=Y.length;for(let z=0;z<T;z++)Y[z]=Y[z].trim();if(F){let z={},j=Math.min(F.length,T);for(let P=0;P<j;P++)z[F[P]]=Y[P];_=z}else _=Y}if(L==="Format")F=_;$.body.push({key:L,value:_})}}return Z}var EJ=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function n(J){return J.replace(EJ,"")}var XJ=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function qJ(J,K){let Z=[...XJ].sort((N,Q)=>N.w-Q.w);for(let N of Z)if(J<=N.w&&K<=N.h)return N;return{w:Math.ceil(J/100)*100,h:Math.ceil(K/100)*100}}function k(J,K){return K&&K.includes(".")?J.toFixed(2).replace(/\.?0+$/,""):Math.round(J)}function i(J){let K=J.match(/PlayResX:\s*(\d+)/i),Z=J.match(/PlayResY:\s*(\d+)/i),N=K?parseInt(K[1],10):1920,Q=Z?parseInt(Z[1],10):1080,F=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,$=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,U=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,O=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,E=0,q=0,L=(M,X,V)=>{let I,D=new RegExp(M.source,"g");while((I=D.exec(J))!==null){for(let C of X)if(I[C]){let A=Math.abs(parseFloat(I[C]));if(A>E)E=A}for(let C of V)if(I[C]){let A=Math.abs(parseFloat(I[C]));if(A>q)q=A}}};if(L(F,[1],[2]),L($,[1,3],[2,4]),L(U,[1],[2]),L(O,[1,3],[2,4]),E<=N&&q<=Q)return J;let _=qJ(E,q),Y=N/_.w,T=Q/_.h,z=Math.min(Y,T),j=Math.max(Y,T),P=1,W=J,B=W.match(/(\[Events\][\s\S]*)/i);if(!B)return W;let G=B[1];return G=G.replace(F,(M,X,V)=>`\\pos(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*T,V)})`),G=G.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(M,X,V,I,D,C,A)=>{let d=`\\move(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*T,V)},${k(parseFloat(I)*Y,I)},${k(parseFloat(D)*T,D)}`;return C?`${d},${C},${A})`:`${d})`}),G=G.replace(U,(M,X,V)=>`\\org(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*T,V)})`),G=G.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(M,X,V,I,D,C)=>`\\${X}(${k(parseFloat(V)*Y,V)},${k(parseFloat(I)*T,I)},${k(parseFloat(D)*Y,D)},${k(parseFloat(C)*T,C)})`),G=G.replace(/\\fs([\d.]+)/g,(M,X)=>`\\fs${k(parseFloat(X)*j,X)}`),G=G.replace(/\\fscx([\d.]+)/g,(M,X)=>`\\fscx${k(parseFloat(X)*P,X)}`),G=G.replace(/\\xbord([\d.]+)/g,(M,X)=>`\\xbord${k(parseFloat(X)*Y,X)}`),G=G.replace(/\\ybord([\d.]+)/g,(M,X)=>`\\ybord${k(parseFloat(X)*T,X)}`),G=G.replace(/\\xshad(-?[\d.]+)/g,(M,X)=>`\\xshad${k(parseFloat(X)*Y,X)}`),G=G.replace(/\\yshad(-?[\d.]+)/g,(M,X)=>`\\yshad${k(parseFloat(X)*T,X)}`),["fsp","bord","shad","be","blur"].forEach((M)=>{let X=new RegExp(`\\\\${M}(-?[\\d.]+)`,"g");G=G.replace(X,(V,I)=>`\\${M}${k(parseFloat(I)*z,I)}`)}),G=G.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(M)=>{return M.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(X,V,I)=>{return`${k(parseFloat(V)*Y,V)} ${k(parseFloat(I)*T,I)}`})}),W.substring(0,B.index)+G}var b=null,S=null;async function l(){if(b!==null&&S!==null)return{hasAlphaBug:b,hasBitmapBug:S};let J=document.createElement("canvas"),K=J.getContext("2d",{willReadFrequently:!0});if(!K)throw Error("Canvas rendering not supported");if(typeof ImageData.prototype.constructor==="function")try{new ImageData(new Uint8ClampedArray([0,0,0,0]),1,1)}catch{console.log("Detected that ImageData is not constructable despite browser saying so")}let Z=document.createElement("canvas"),N=Z.getContext("2d",{willReadFrequently:!0});if(!N)throw Error("Canvas rendering not supported");J.width=Z.width=1,J.height=Z.height=1,K.clearRect(0,0,1,1),N.clearRect(0,0,1,1);let Q=N.getImageData(0,0,1,1).data;K.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),N.drawImage(J,0,0);let F=N.getImageData(0,0,1,1).data;if(b=Q[1]!==F[1],b)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let $=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);N.drawImage(await createImageBitmap(new ImageData($,1)),0,0);let{data:U}=N.getImageData(0,0,1,1);S=!1;for(let O=0;O<U.length;O++)if(Math.abs($[O]-U[O])>15){S=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else S=!1;return J.remove(),Z.remove(),{hasAlphaBug:b,hasBitmapBug:S}}async function a(){return l()}function t(){return b}function e(){return S}function f(){return typeof navigator<"u"&&"gpu"in navigator}class v{device=null;context=null;pipeline=null;bindGroupLayout=null;uniformBuffer=null;imageDataBuffer=null;textureArray=null;textureArrayView=null;textureArraySize=0;textureArrayWidth=0;textureArrayHeight=0;pendingDestroyTextures=[];imageDataArray;resolutionArray=new Float32Array(2);conversionBuffer=null;conversionBufferSize=0;bindGroup=null;bindGroupDirty=!0;lastCanvasWidth=0;lastCanvasHeight=0;format="bgra8unorm";_canvas=null;_initPromise=null;_initialized=!1;constructor(){this.imageDataArray=new Float32Array(2048)}async init(){if(this._initPromise)return this._initPromise;return this._initPromise=this._initDevice(),this._initPromise}async _initDevice(){if(!navigator.gpu)throw Error("WebGPU not supported");let J=await navigator.gpu.requestAdapter({powerPreference:"high-performance"});if(!J)throw Error("No WebGPU adapter found");this.device=await J.requestDevice(),this.format=navigator.gpu.getPreferredCanvasFormat();let K=this.device.createShaderModule({code:`
11
+ struct VertexOutput {
12
+ @builtin(position) position: vec4f,
13
+ @location(0) @interpolate(flat) instanceIndex: u32,
14
+ @location(1) @interpolate(flat) destXY: vec2f,
15
+ @location(2) @interpolate(flat) texSize: vec2f,
16
+ }
17
+
18
+ struct Uniforms {
19
+ resolution: vec2f,
20
+ }
21
+
22
+ struct ImageData {
23
+ destRect: vec4f, // x, y, w, h
24
+ texInfo: vec4f, // texW, texH, texIndex, 0
25
+ }
26
+
27
+ @group(0) @binding(0) var<uniform> uniforms: Uniforms;
28
+ @group(0) @binding(1) var<storage, read> imageData: array<ImageData>;
29
+
30
+ // Quad vertices (two triangles)
31
+ const QUAD_POSITIONS = array<vec2f, 6>(
32
+ vec2f(0.0, 0.0),
33
+ vec2f(1.0, 0.0),
34
+ vec2f(0.0, 1.0),
35
+ vec2f(1.0, 0.0),
36
+ vec2f(1.0, 1.0),
37
+ vec2f(0.0, 1.0)
38
+ );
39
+
40
+ @vertex
41
+ fn vertexMain(
42
+ @builtin(vertex_index) vertexIndex: u32,
43
+ @builtin(instance_index) instanceIndex: u32
44
+ ) -> VertexOutput {
45
+ var output: VertexOutput;
46
+
47
+ let data = imageData[instanceIndex];
48
+ let quadPos = QUAD_POSITIONS[vertexIndex];
49
+ let wh = data.destRect.zw;
50
+
51
+ // Calculate pixel position
52
+ let pixelPos = data.destRect.xy + quadPos * wh;
53
+
54
+ // Convert to clip space (-1 to 1)
55
+ var clipPos = (pixelPos / uniforms.resolution) * 2.0 - 1.0;
56
+ clipPos.y = -clipPos.y;
57
+
58
+ output.position = vec4f(clipPos, 0.0, 1.0);
59
+ output.instanceIndex = instanceIndex;
60
+ output.destXY = data.destRect.xy;
61
+ output.texSize = data.texInfo.xy;
62
+
63
+ return output;
64
+ }
65
+ `}),Z=this.device.createShaderModule({code:`
66
+ @group(0) @binding(2) var texArray: texture_2d_array<f32>;
67
+
68
+ struct ImageData {
69
+ destRect: vec4f,
70
+ texInfo: vec4f,
71
+ }
72
+
73
+ @group(0) @binding(1) var<storage, read> imageData: array<ImageData>;
74
+
75
+ struct FragmentInput {
76
+ @builtin(position) fragCoord: vec4f,
77
+ @location(0) @interpolate(flat) instanceIndex: u32,
78
+ @location(1) @interpolate(flat) destXY: vec2f,
79
+ @location(2) @interpolate(flat) texSize: vec2f,
80
+ }
81
+
82
+ @fragment
83
+ fn fragmentMain(input: FragmentInput) -> @location(0) vec4f {
84
+ let data = imageData[input.instanceIndex];
85
+ let texIndex = u32(data.texInfo.z);
86
+
87
+ // Calculate texel coordinates
88
+ let texCoordF = floor(input.fragCoord.xy - input.destXY);
89
+ let texCoord = vec2i(texCoordF);
90
+
91
+ // Bounds check
92
+ let texSizeI = vec2i(input.texSize);
93
+ if (texCoord.x < 0 || texCoord.y < 0 || texCoord.x >= texSizeI.x || texCoord.y >= texSizeI.y) {
94
+ discard;
95
+ }
96
+
97
+ // Load from texture array
98
+ let color = textureLoad(texArray, texCoord, texIndex, 0);
99
+
100
+ // Premultiplied alpha output
101
+ return vec4f(color.rgb * color.a, color.a);
102
+ }
103
+ `});this.uniformBuffer=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST}),this.imageDataBuffer=this.device.createBuffer({size:8192,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST}),this.createTextureArray(256,256,32),this.bindGroupLayout=this.device.createBindGroupLayout({entries:[{binding:0,visibility:GPUShaderStage.VERTEX,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.VERTEX|GPUShaderStage.FRAGMENT,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.FRAGMENT,texture:{sampleType:"unfilterable-float",viewDimension:"2d-array"}}]});let N=this.device.createPipelineLayout({bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=this.device.createRenderPipeline({layout:N,vertex:{module:K,entryPoint:"vertexMain"},fragment:{module:Z,entryPoint:"fragmentMain",targets:[{format:this.format,blend:{color:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"},alpha:{srcFactor:"one",dstFactor:"one-minus-src-alpha",operation:"add"}}}]},primitive:{topology:"triangle-list"}}),this._initialized=!0}nextPowerOf2(J){return J--,J|=J>>1,J|=J>>2,J|=J>>4,J|=J>>8,J|=J>>16,J+1}createTextureArray(J,K,Z){if(this.textureArray)this.pendingDestroyTextures.push(this.textureArray);let N=this.nextPowerOf2(Math.max(J,64)),Q=this.nextPowerOf2(Math.max(K,64)),F=Math.min(this.nextPowerOf2(Math.max(Z,16)),256);this.textureArray=this.device.createTexture({size:[N,Q,F],format:this.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),this.textureArrayView=this.textureArray.createView({dimension:"2d-array"}),this.textureArrayWidth=N,this.textureArrayHeight=Q,this.textureArraySize=F,this.bindGroupDirty=!0;let $=this.device.createCommandEncoder();for(let U=0;U<F;U++){let O=this.textureArray.createView({dimension:"2d",baseArrayLayer:U,arrayLayerCount:1});$.beginRenderPass({colorAttachments:[{view:O,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end()}this.device.queue.submit([$.finish()])}ensureTextureArray(J,K,Z){let N=Math.min(Z,256);if(J<=this.textureArrayWidth&&K<=this.textureArrayHeight&&N<=this.textureArraySize)return!1;let Q=this.nextPowerOf2(Math.max(this.textureArrayWidth,J)),F=this.nextPowerOf2(Math.max(this.textureArrayHeight,K)),$=Math.min(this.nextPowerOf2(Math.max(this.textureArraySize,N,N+16)),256);return this.createTextureArray(Q,F,$),!0}updateBindGroup(){if(!this.bindGroupDirty||!this.device||!this.bindGroupLayout)return;this.bindGroup=this.device.createBindGroup({layout:this.bindGroupLayout,entries:[{binding:0,resource:{buffer:this.uniformBuffer}},{binding:1,resource:{buffer:this.imageDataBuffer}},{binding:2,resource:this.textureArrayView}]}),this.bindGroupDirty=!1}ensureConversionBuffer(J){if(this.conversionBufferSize<J)this.conversionBufferSize=Math.max(J,this.conversionBufferSize*1.5|0,65536),this.conversionBuffer=new Uint8Array(this.conversionBufferSize);return this.conversionBuffer}async setCanvas(J,K,Z){if(await this.init(),!this.device)throw Error("WebGPU device not initialized");if(K<=0||Z<=0)return;if(this._canvas=J,J.width=K,J.height=Z,!this.context){if(this.context=J.getContext("webgpu"),!this.context)throw Error("Could not get WebGPU context");this.context.configure({device:this.device,format:this.format,alphaMode:"premultiplied"})}this.resolutionArray[0]=K,this.resolutionArray[1]=Z,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=K,this.lastCanvasHeight=Z}updateSize(J,K){if(!this.device||!this._canvas||J<=0||K<=0)return;if(J===this.lastCanvasWidth&&K===this.lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=K,this.resolutionArray[0]=J,this.resolutionArray[1]=K,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=J,this.lastCanvasHeight=K}renderBitmaps(J,K,Z){if(!this.device||!this.context||!this.pipeline)return;let N=J.length;if(N===0){this.clear();return}let Q=this.context.getCurrentTexture();if(Q.width===0||Q.height===0)return;let F=0,$=0,U=0;for(let j=0;j<N;j++){let{image:P}=J[j],W=P.width,B=P.height;if(W>0&&B>0){if(W>F)F=W;if(B>$)$=B;U++}}if(U===0){this.clear();return}let O=Math.min(U,256);this.ensureTextureArray(F,$,O),this.updateBindGroup();let E=this.device,q=E.queue,L=this.textureArray,_=this.imageDataArray,Y=Q.createView(),T=0,z=!0;while(T<N){let j=0;while(T<N&&j<256){let B=J[T++],G=B.image,H=G.width,M=G.height;if(H<=0||M<=0)continue;q.copyExternalImageToTexture({source:G,flipY:!1},{texture:L,origin:[0,0,j],premultipliedAlpha:!1},{width:H,height:M});let X=j<<3;_[X]=B.x,_[X+1]=B.y,_[X+2]=H,_[X+3]=M,_[X+4]=H,_[X+5]=M,_[X+6]=j,_[X+7]=0,j++}if(j===0)continue;q.writeBuffer(this.imageDataBuffer,0,_.buffer,0,j<<5);let P=E.createCommandEncoder(),W=P.beginRenderPass({colorAttachments:[{view:Y,clearValue:{r:0,g:0,b:0,a:0},loadOp:z?"clear":"load",storeOp:"store"}]});W.setPipeline(this.pipeline),W.setBindGroup(0,this.bindGroup),W.draw(6,j),W.end(),q.submit([P.finish()]),z=!1}this.cleanupPendingTextures()}render(J,K,Z){if(!this.device||!this.context||!this.pipeline)return;let N=J.length;if(N===0){this.clear();return}let Q=this.context.getCurrentTexture();if(Q.width===0||Q.height===0)return;let F=0,$=0,U=0;for(let P=0;P<N;P++){let{w:W,h:B}=J[P];if(W>0&&B>0){if(W>F)F=W;if(B>$)$=B;U++}}if(U===0){this.clear();return}let O=Math.min(U,256);this.ensureTextureArray(F,$,O),this.updateBindGroup();let E=this.device,q=E.queue,L=this.textureArray,_=this.imageDataArray,Y=this.format==="bgra8unorm",T=Q.createView(),z=0,j=!0;while(z<N){let P=0;while(z<N&&P<256){let G=J[z++],H=G.w,M=G.h;if(H<=0||M<=0)continue;let X=G.image;if(X instanceof ImageBitmap)q.copyExternalImageToTexture({source:X,flipY:!1},{texture:L,origin:[0,0,P],premultipliedAlpha:!1},{width:H,height:M});else if(X instanceof ArrayBuffer)this.uploadTextureData(P,X,H,M,Y);let V=P<<3;_[V]=G.x,_[V+1]=G.y,_[V+2]=H,_[V+3]=M,_[V+4]=H,_[V+5]=M,_[V+6]=P,_[V+7]=0,P++}if(P===0)continue;q.writeBuffer(this.imageDataBuffer,0,_.buffer,0,P<<5);let W=E.createCommandEncoder(),B=W.beginRenderPass({colorAttachments:[{view:T,clearValue:{r:0,g:0,b:0,a:0},loadOp:j?"clear":"load",storeOp:"store"}]});B.setPipeline(this.pipeline),B.setBindGroup(0,this.bindGroup),B.draw(6,P),B.end(),q.submit([W.finish()]),j=!1}this.cleanupPendingTextures()}uploadTextureData(J,K,Z,N,Q){let F=Z*N*4;if(Q){let $=this.ensureConversionBuffer(F),U=new Uint8Array(K);for(let O=0;O<F;O+=4)$[O]=U[O+2],$[O+1]=U[O+1],$[O+2]=U[O],$[O+3]=U[O+3];this.device.queue.writeTexture({texture:this.textureArray,origin:[0,0,J]},$.buffer,{bytesPerRow:Z*4},{width:Z,height:N})}else this.device.queue.writeTexture({texture:this.textureArray,origin:[0,0,J]},K,{bytesPerRow:Z*4},{width:Z,height:N})}cleanupPendingTextures(){let J=this.pendingDestroyTextures,K=J.length;if(K===0)return;for(let Z=0;Z<K;Z++)J[Z].destroy();J.length=0}clear(){if(!this.device||!this.context)return;try{let J=this.context.getCurrentTexture();if(J.width===0||J.height===0)return;let K=this.device.createCommandEncoder();K.beginRenderPass({colorAttachments:[{view:J.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([K.finish()])}catch{}}get initialized(){return this._initialized}destroy(){this.cleanupPendingTextures(),this.textureArray?.destroy(),this.textureArray=null,this.textureArrayView=null,this.uniformBuffer?.destroy(),this.uniformBuffer=null,this.imageDataBuffer?.destroy(),this.imageDataBuffer=null,this.bindGroup=null,this.conversionBuffer=null,this.conversionBufferSize=0,this.device?.destroy(),this.device=null,this.context=null,this._canvas=null,this._initialized=!1,this._initPromise=null}}function p(){if(typeof document>"u")return!1;try{return document.createElement("canvas").getContext("webgl2")!==null}catch{return!1}}function JJ(J,K,Z){let N=J.createShader(K);if(J.shaderSource(N,Z),J.compileShader(N),!J.getShaderParameter(N,J.COMPILE_STATUS)){let Q=J.getShaderInfoLog(N);throw J.deleteShader(N),Error(`WebGL2 shader compilation failed: ${Q}`)}return N}class x{_gl=null;_canvas=null;_program=null;_vao=null;_instanceBuffer=null;_texArray=null;_texWidth=0;_texHeight=0;_texLayers=0;_resolutionLoc=null;_texArraySizeLoc=null;_instanceData;_lastCanvasWidth=0;_lastCanvasHeight=0;_initialized=!1;_initPromise=null;constructor(){this._instanceData=new Float32Array(2048)}async init(){if(this._initPromise)return this._initPromise;return this._initPromise=this._checkSupport(),this._initPromise}async _checkSupport(){if(typeof document>"u")throw Error("WebGL2 requires a DOM environment");if(!document.createElement("canvas").getContext("webgl2"))throw Error("WebGL2 not supported")}_initGL(){if(!this._canvas)throw Error("Canvas not set before _initGL");if(this._gl)return;let J=this._canvas.getContext("webgl2",{alpha:!0,premultipliedAlpha:!0,antialias:!1});if(!J)throw Error("Failed to create WebGL2 context");this._gl=J;let K=JJ(J,J.VERTEX_SHADER,`#version 300 es
104
+ precision highp float;
105
+
106
+ in vec4 a_destRect;
107
+ in vec4 a_texInfo;
108
+
109
+ uniform vec2 u_resolution;
110
+
111
+ out vec2 v_uv;
112
+ flat out int v_texIndex;
113
+ flat out vec2 v_texSize;
114
+
115
+ vec2 quadPos(int id) {
116
+ if (id == 0) return vec2(0.0, 0.0);
117
+ if (id == 1) return vec2(1.0, 0.0);
118
+ if (id == 2) return vec2(0.0, 1.0);
119
+ if (id == 3) return vec2(1.0, 0.0);
120
+ if (id == 4) return vec2(1.0, 1.0);
121
+ return vec2(0.0, 1.0);
122
+ }
123
+
124
+ void main() {
125
+ vec2 qp = quadPos(gl_VertexID);
126
+ vec2 pixelPos = a_destRect.xy + qp * a_destRect.zw;
127
+
128
+ // Convert CSS pixel coords (y=0 top) to GL clip space (y=1 top)
129
+ vec2 clip = (pixelPos / u_resolution) * 2.0 - 1.0;
130
+ clip.y = -clip.y;
131
+
132
+ gl_Position = vec4(clip, 0.0, 1.0);
133
+ v_uv = qp;
134
+ v_texIndex = int(a_texInfo.z);
135
+ v_texSize = a_texInfo.xy;
136
+ }
137
+ `),Z=JJ(J,J.FRAGMENT_SHADER,`#version 300 es
138
+ precision highp float;
139
+ precision highp sampler2DArray;
140
+
141
+ uniform sampler2DArray u_texArray;
142
+ uniform ivec2 u_texArraySize;
143
+
144
+ in vec2 v_uv;
145
+ flat in int v_texIndex;
146
+ flat in vec2 v_texSize;
147
+
148
+ out vec4 fragColor;
149
+
150
+ void main() {
151
+ vec2 normalizedCoord = v_uv * v_texSize / vec2(u_texArraySize);
152
+ vec4 color = texture(u_texArray, vec3(normalizedCoord, float(v_texIndex)));
153
+ // Premultiplied alpha output (matches WebGPU renderer behaviour)
154
+ fragColor = vec4(color.rgb * color.a, color.a);
155
+ }
156
+ `),N=J.createProgram();if(J.attachShader(N,K),J.attachShader(N,Z),J.linkProgram(N),!J.getProgramParameter(N,J.LINK_STATUS))throw Error(`WebGL2 program link failed: ${J.getProgramInfoLog(N)}`);J.deleteShader(K),J.deleteShader(Z),this._program=N,this._resolutionLoc=J.getUniformLocation(N,"u_resolution"),this._texArraySizeLoc=J.getUniformLocation(N,"u_texArraySize"),this._vao=J.createVertexArray(),J.bindVertexArray(this._vao),this._instanceBuffer=J.createBuffer(),J.bindBuffer(J.ARRAY_BUFFER,this._instanceBuffer),J.bufferData(J.ARRAY_BUFFER,8192,J.DYNAMIC_DRAW);let Q=J.getAttribLocation(N,"a_destRect");J.enableVertexAttribArray(Q),J.vertexAttribPointer(Q,4,J.FLOAT,!1,32,0),J.vertexAttribDivisor(Q,1);let F=J.getAttribLocation(N,"a_texInfo");J.enableVertexAttribArray(F),J.vertexAttribPointer(F,4,J.FLOAT,!1,32,16),J.vertexAttribDivisor(F,1),J.bindVertexArray(null),this._texArray=J.createTexture(),this._allocateTextureArray(256,256,32),J.enable(J.BLEND),J.blendEquation(J.FUNC_ADD),J.blendFunc(J.ONE,J.ONE_MINUS_SRC_ALPHA),this._initialized=!0}_nextPow2(J){return J--,J|=J>>1,J|=J>>2,J|=J>>4,J|=J>>8,J|=J>>16,J+1}_allocateTextureArray(J,K,Z){let N=this._gl,Q=this._nextPow2(Math.max(J,64)),F=this._nextPow2(Math.max(K,64)),$=Math.min(this._nextPow2(Math.max(Z,16)),256);N.bindTexture(N.TEXTURE_2D_ARRAY,this._texArray),N.texImage3D(N.TEXTURE_2D_ARRAY,0,N.RGBA8,Q,F,$,0,N.RGBA,N.UNSIGNED_BYTE,null),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_MIN_FILTER,N.NEAREST),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_MAG_FILTER,N.NEAREST),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_WRAP_S,N.CLAMP_TO_EDGE),N.texParameteri(N.TEXTURE_2D_ARRAY,N.TEXTURE_WRAP_T,N.CLAMP_TO_EDGE),this._texWidth=Q,this._texHeight=F,this._texLayers=$}_ensureTextureArray(J,K,Z){let N=Math.min(Z,256);if(J<=this._texWidth&&K<=this._texHeight&&N<=this._texLayers)return;let Q=this._nextPow2(Math.max(this._texWidth,J)),F=this._nextPow2(Math.max(this._texHeight,K)),$=Math.min(this._nextPow2(Math.max(this._texLayers,N,N+16)),256);this._allocateTextureArray(Q,F,$)}async setCanvas(J,K,Z){if(await this.init(),K<=0||Z<=0)return;this._canvas=J,J.width=K,J.height=Z,this._initGL(),this._gl.viewport(0,0,K,Z),this._lastCanvasWidth=K,this._lastCanvasHeight=Z}updateSize(J,K){if(!this._gl||!this._canvas||J<=0||K<=0)return;if(J===this._lastCanvasWidth&&K===this._lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=K,this._gl.viewport(0,0,J,K),this._lastCanvasWidth=J,this._lastCanvasHeight=K}renderBitmaps(J,K,Z){if(!this._gl||!this._initialized)return;let N=J.length;if(N===0){this.clear();return}let Q=0,F=0;for(let E=0;E<N;E++){let{image:q}=J[E];if(q.width>Q)Q=q.width;if(q.height>F)F=q.height}this._ensureTextureArray(Q,F,Math.min(N,256));let $=this._gl;$.clearColor(0,0,0,0),$.clear($.COLOR_BUFFER_BIT),$.useProgram(this._program),$.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),$.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),$.activeTexture($.TEXTURE0),$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.pixelStorei($.UNPACK_FLIP_Y_WEBGL,!1);let U=this._instanceData,O=0;while(O<N){let E=0;while(O<N&&E<256){let q=J[O++],L=q.image.width,_=q.image.height;if(L<=0||_<=0)continue;$.texSubImage3D($.TEXTURE_2D_ARRAY,0,0,0,E,L,_,1,$.RGBA,$.UNSIGNED_BYTE,q.image);let Y=E<<3;U[Y]=q.x,U[Y+1]=q.y,U[Y+2]=L,U[Y+3]=_,U[Y+4]=L,U[Y+5]=_,U[Y+6]=E,U[Y+7]=0,E++}if(E===0)continue;$.bindBuffer($.ARRAY_BUFFER,this._instanceBuffer),$.bufferSubData($.ARRAY_BUFFER,0,U,0,E<<3),$.bindVertexArray(this._vao),$.drawArraysInstanced($.TRIANGLES,0,6,E),$.bindVertexArray(null)}}render(J,K,Z){if(!this._gl||!this._initialized)return;let N=J.length;if(N===0){this.clear();return}let Q=0,F=0;for(let E=0;E<N;E++){let{w:q,h:L}=J[E];if(q>Q)Q=q;if(L>F)F=L}this._ensureTextureArray(Q,F,Math.min(N,256));let $=this._gl;$.clearColor(0,0,0,0),$.clear($.COLOR_BUFFER_BIT),$.useProgram(this._program),$.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),$.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),$.activeTexture($.TEXTURE0),$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.pixelStorei($.UNPACK_FLIP_Y_WEBGL,!1);let U=this._instanceData,O=0;while(O<N){let E=0;while(O<N&&E<256){let q=J[O++],L=q.w,_=q.h;if(L<=0||_<=0)continue;let Y=q.image;if(Y instanceof ImageBitmap)$.texSubImage3D($.TEXTURE_2D_ARRAY,0,0,0,E,L,_,1,$.RGBA,$.UNSIGNED_BYTE,Y);else if(Y instanceof ArrayBuffer)$.texSubImage3D($.TEXTURE_2D_ARRAY,0,0,0,E,L,_,1,$.RGBA,$.UNSIGNED_BYTE,new Uint8Array(Y));let T=E<<3;U[T]=q.x,U[T+1]=q.y,U[T+2]=L,U[T+3]=_,U[T+4]=L,U[T+5]=_,U[T+6]=E,U[T+7]=0,E++}if(E===0)continue;$.bindBuffer($.ARRAY_BUFFER,this._instanceBuffer),$.bufferSubData($.ARRAY_BUFFER,0,U,0,E<<3),$.bindVertexArray(this._vao),$.drawArraysInstanced($.TRIANGLES,0,6,E),$.bindVertexArray(null)}}clear(){if(!this._gl)return;this._gl.clearColor(0,0,0,0),this._gl.clear(this._gl.COLOR_BUFFER_BIT)}get initialized(){return this._initialized}destroy(){let J=this._gl;if(J)J.deleteProgram(this._program),J.deleteVertexArray(this._vao),J.deleteBuffer(this._instanceBuffer),J.deleteTexture(this._texArray);this._gl=null,this._program=null,this._vao=null,this._instanceBuffer=null,this._texArray=null,this._canvas=null,this._initialized=!1,this._initPromise=null}}class R extends EventTarget{static MAX_PENDING_DEMANDS=3;static _hasAlphaBug=null;static _hasBitmapBug=null;_loaded;_init;_onDemandRender;_offscreenRender;_video;_videoWidth=0;_videoHeight=0;_videoColorSpace=null;_canvas;_canvasParent;_bufferCanvas;_bufferCtx;_canvasctrl;_ctx=null;_lastRenderTime=0;_playstate=!0;_destroyed=!1;_workerReady=!1;_ro;_worker;_pendingDemandTimes=[];_boundResize;_boundTimeUpdate;_boundSetRate;_boundUpdateColorSpace;_boundHandleRVFC;_gpuRenderer=null;_rendererType="canvas2d";_onCanvasFallback;_lastRenderWidth=0;_lastRenderHeight=0;timeOffset;debug;prescaleFactor;prescaleHeightLimit;maxRenderHeight;busy=!1;renderAhead;constructor(J){super();if(!globalThis.Worker)throw this.destroy(Error("Worker not supported"));if(!J)throw this.destroy(Error("No options provided"));this._loaded=new Promise((Q)=>{this._init=Q});let K=R._test();this._onDemandRender="requestVideoFrameCallback"in HTMLVideoElement.prototype&&(J.onDemandRender??!0),this._onCanvasFallback=J.onCanvasFallback;let Z=!J.canvas&&(f()||p());if(this._offscreenRender="transferControlToOffscreen"in HTMLCanvasElement.prototype&&!J.canvas&&!Z&&(J.offscreenRender??!0),this.timeOffset=J.timeOffset||0,this._video=J.video,this._canvas=J.canvas,this._video&&!this._canvas)this._canvasParent=document.createElement("div"),this._canvasParent.className="AkariSub",this._canvasParent.style.position="relative",this._canvas=this._createCanvas(),this._video.insertAdjacentElement("afterend",this._canvasParent);else if(!this._canvas)throw this.destroy(Error("Don't know where to render: you should give video or canvas in options."));this._bufferCanvas=document.createElement("canvas");let N=this._bufferCanvas.getContext("2d");if(!N)throw this.destroy(Error("Canvas rendering not supported"));if(this._bufferCtx=N,Z)this._initGPURenderer();else if(!this._offscreenRender)this._ctx=this._canvas.getContext("2d");if(this._canvasctrl=this._offscreenRender?this._canvas.transferControlToOffscreen():this._canvas,this._lastRenderTime=0,this.debug=!!J.debug,this.prescaleFactor=J.prescaleFactor||1,this.prescaleHeightLimit=J.prescaleHeightLimit||1080,this.maxRenderHeight=J.maxRenderHeight||0,this.renderAhead=J.renderAhead??0,this._boundResize=this.resize.bind(this),this._boundTimeUpdate=this._timeupdate.bind(this),this._boundSetRate=()=>this.setRate(this._video.playbackRate),this._boundUpdateColorSpace=this._updateColorSpace.bind(this),this._boundHandleRVFC=this._handleRVFC.bind(this),this._video)this.setVideo(this._video);if(this._onDemandRender)this.busy=!1,this._pendingDemandTimes.length=0;this._worker=new Worker(J.workerUrl||"akarisub-worker.js"),this._worker.onmessage=(Q)=>this._onmessage(Q),this._worker.onerror=(Q)=>this._error(Q),K.then(()=>{if(this._worker.postMessage({target:"init",wasmUrl:J.wasmUrl??"akarisub-worker.wasm",asyncRender:typeof createImageBitmap<"u"&&(J.asyncRender??!0),onDemandRender:this._onDemandRender,initialTime:(this._video?.currentTime??0)+this.timeOffset,width:this._canvasctrl.width||0,height:this._canvasctrl.height||0,blendMode:J.blendMode??"wasm",subUrl:J.subUrl,subContent:J.subContent||null,fonts:J.fonts||[],availableFonts:J.availableFonts||{"liberation sans":"./default.woff2"},fallbackFonts:J.fallbackFonts||["liberation sans"],debug:this.debug,targetFps:J.targetFps||24,dropAllAnimations:J.dropAllAnimations,dropAllBlur:J.dropAllBlur,clampPos:J.clampPos,libassMemoryLimit:J.libassMemoryLimit??128,libassGlyphLimit:J.libassGlyphLimit??2048,useLocalFonts:typeof globalThis.queryLocalFonts<"u"&&(J.useLocalFonts??!0),hasBitmapBug:R._hasBitmapBug}),this._offscreenRender)this.sendMessage("offscreenCanvas",{},[this._canvasctrl])})}static async _testImageBugs(){if(R._hasBitmapBug!==null)return;let J=document.createElement("canvas"),K=J.getContext("2d",{willReadFrequently:!0});if(!K)throw Error("Canvas rendering not supported");if(typeof ImageData.prototype.constructor==="function")try{new ImageData(new Uint8ClampedArray([0,0,0,0]),1,1)}catch{console.log("Detected that ImageData is not constructable despite browser saying so")}let Z=document.createElement("canvas"),N=Z.getContext("2d",{willReadFrequently:!0});if(!N)throw Error("Canvas rendering not supported");J.width=Z.width=1,J.height=Z.height=1,K.clearRect(0,0,1,1),N.clearRect(0,0,1,1);let Q=N.getImageData(0,0,1,1).data;K.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),N.drawImage(J,0,0);let F=N.getImageData(0,0,1,1).data;if(R._hasAlphaBug=Q[1]!==F[1],R._hasAlphaBug)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let $=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);N.drawImage(await createImageBitmap(new ImageData($,1)),0,0);let{data:U}=N.getImageData(0,0,1,1);R._hasBitmapBug=!1;for(let O=0;O<U.length;O++)if(Math.abs($[O]-U[O])>15){R._hasBitmapBug=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else R._hasBitmapBug=!1;J.remove(),Z.remove()}static async _test(){await R._testImageBugs()}async _initGPURenderer(){if(f())try{let J=new v;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgpu",console.log("[AkariSub] Using WebGPU renderer");return}catch(J){console.warn("[AkariSub] WebGPU init failed, trying WebGL2:",J)}if(p())try{let J=new x;if(await J.init(),!this._canvas)return;await J.setCanvas(this._canvas,Math.max(1,this._canvas.width||1),Math.max(1,this._canvas.height||1)),this._gpuRenderer=J,this._rendererType="webgl2",console.log("[AkariSub] Using WebGL2 renderer");return}catch(J){console.warn("[AkariSub] WebGL2 init failed, falling back to Canvas2D:",J)}if(this._rendererType="canvas2d",!this._offscreenRender&&!this._ctx)this._ctx=this._canvas.getContext("2d");this.sendMessage("setAsyncRender",{value:!1}),this._onCanvasFallback?.()}get rendererType(){return this._rendererType}get isUsingWebGPU(){return this._rendererType==="webgpu"}get isUsingGPURenderer(){return this._gpuRenderer!==null}_createCanvas(){return this._canvas=document.createElement("canvas"),this._canvas.style.display="block",this._canvas.style.position="absolute",this._canvas.style.pointerEvents="none",this._canvasParent.appendChild(this._canvas),this._canvas}resize(J=0,K=0,Z=0,N=0,Q=this._video?.paused??!1){if((!J||!K)&&this._video){let F=c(this._video),$;if(this._videoWidth){let U=this._video.videoWidth/this._videoWidth,O=this._video.videoHeight/this._videoHeight;$=w((F.width||0)/U,(F.height||0)/O,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight)}else $=w(F.width||0,F.height||0,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight);if(J=$.width,K=$.height,this._canvasParent)Z=F.y-(this._canvasParent.getBoundingClientRect().top-this._video.getBoundingClientRect().top),N=F.x;this._canvas.style.width=F.width+"px",this._canvas.style.height=F.height+"px"}if(this._canvas.style.top=Z+"px",this._canvas.style.left=N+"px",J>0&&K>0)this._canvasctrl.width=J,this._canvasctrl.height=K;if(this._gpuRenderer&&J>0&&K>0)this._gpuRenderer.updateSize(J,K);if(Q&&this.busy===!1)this.busy=!0;else Q=!1;this.sendMessage("canvas",{width:J,height:K,videoWidth:this._videoWidth||this._video?.videoWidth||0,videoHeight:this._videoHeight||this._video?.videoHeight||0,force:Q})}_timeupdate(J){let Z={seeking:!0,waiting:!0,playing:!1}[J.type];if(Z!=null)this._playstate=Z;this.setCurrentTime(this._video.paused||this._playstate,this._video.currentTime+this.timeOffset)}setVideo(J){if(J instanceof HTMLVideoElement){if(this._removeListeners(),this._video=J,this._onDemandRender){if(!this._destroyed&&this._video===J)J.requestVideoFrameCallback(this._boundHandleRVFC)}else this._playstate=J.paused,J.addEventListener("timeupdate",this._boundTimeUpdate,!1),J.addEventListener("progress",this._boundTimeUpdate,!1),J.addEventListener("waiting",this._boundTimeUpdate,!1),J.addEventListener("seeking",this._boundTimeUpdate,!1),J.addEventListener("playing",this._boundTimeUpdate,!1),J.addEventListener("ratechange",this._boundSetRate,!1),J.addEventListener("resize",this._boundResize,!1);if("VideoFrame"in window){if(J.addEventListener("loadedmetadata",this._boundUpdateColorSpace,!1),J.readyState>2)this._updateColorSpace()}if(J.videoWidth>0)this.resize();if(typeof ResizeObserver<"u"){if(!this._ro)this._ro=new ResizeObserver(()=>this.resize());this._ro.observe(J)}}else this._error(Error("Video element invalid!"))}runBenchmark(){this.sendMessage("runBenchmark")}setTrackByUrl(J){if(this.sendMessage("setTrackByUrl",{url:J}),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}setTrack(J){if(this.sendMessage("setTrack",{content:J}),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}freeTrack(){this.sendMessage("freeTrack")}setIsPaused(J){this.sendMessage("video",{isPaused:J})}setRate(J){this.sendMessage("video",{rate:J})}setCurrentTime(J,K,Z){this.sendMessage("video",{isPaused:J,currentTime:K,rate:Z,colorSpace:this._videoColorSpace})}createEvent(J){this.sendMessage("createEvent",{event:J})}setEvent(J,K){this.sendMessage("setEvent",{event:J,index:K})}removeEvent(J){this.sendMessage("removeEvent",{index:J})}async getEvents(){return(await this._fetchFromWorker({target:"getEvents"})).events??[]}styleOverride(J){this.sendMessage("styleOverride",{style:J})}disableStyleOverride(){this.sendMessage("disableStyleOverride")}createStyle(J){this.sendMessage("createStyle",{style:J})}setStyle(J,K){this.sendMessage("setStyle",{style:J,index:K})}removeStyle(J){this.sendMessage("removeStyle",{index:J})}async getStyles(){return(await this._fetchFromWorker({target:"getStyles"})).styles??[]}addFont(J){this.sendMessage("addFont",{font:J})}setDefaultFont(J){this.sendMessage("defaultFont",{font:J})}async getStats(){let K=(await this._fetchFromWorker({target:"getStats"})).stats;return{framesRendered:K.framesRendered??0,framesDropped:K.framesDropped??0,avgRenderTime:K.avgRenderTime??0,maxRenderTime:K.maxRenderTime??0,minRenderTime:K.minRenderTime??0,lastRenderTime:K.lastRenderTime??0,pendingRenders:K.pendingRenders??0,totalEvents:K.totalEvents??0,cacheHits:K.cacheHits??0,cacheMisses:K.cacheMisses??0,renderFps:K.avgRenderTime&&K.avgRenderTime>0?Math.round(1000/K.avgRenderTime):0,usingWorker:!0,offscreenRender:this._offscreenRender,onDemandRender:this._onDemandRender}}async resetStats(){await this._fetchFromWorker({target:"resetStats"})}async getEventCount(){return(await this._fetchFromWorker({target:"getEventCount"})).count}async getStyleCount(){return(await this._fetchFromWorker({target:"getStyleCount"})).count}_sendLocalFont(J){try{globalThis.queryLocalFonts().then((K)=>{let Z=K?.find((N)=>N.fullName.toLowerCase()===J);if(Z)Z.blob().then((N)=>{N.arrayBuffer().then((Q)=>{this.addFont(new Uint8Array(Q))})})})}catch(K){console.warn("Local fonts API:",K)}}_getLocalFont(J){try{if(navigator?.permissions?.query)navigator.permissions.query({name:"local-fonts"}).then((K)=>{if(K.state==="granted")this._sendLocalFont(J.font)});else this._sendLocalFont(J.font)}catch(K){console.warn("Local fonts API:",K)}}_unbusy(){if(this._pendingDemandTimes.length>0){if(this._pendingDemandTimes.length>1){let K=this._pendingDemandTimes[this._pendingDemandTimes.length-1];this._pendingDemandTimes.length=0,this._pendingDemandTimes.push(K)}let J=this._pendingDemandTimes.shift();if(J){this._demandRender(J);return}}this.busy=!1}_enqueueDemand(J){let K=this._pendingDemandTimes;if(K.length>0){let Z=K[K.length-1];if(Math.abs(Z.mediaTime-J.mediaTime)>0.25)K.length=0}if(K.length>=R.MAX_PENDING_DEMANDS)K.shift();K.push(J)}_handleRVFC(J,K){if(this._destroyed)return;let Z=this._video?.playbackRate??1,Q={mediaTime:K.mediaTime+this.renderAhead*Z,width:K.width,height:K.height};if(!this._workerReady){this._enqueueDemand(Q),this._video.requestVideoFrameCallback(this._boundHandleRVFC);return}if(this.busy)this._enqueueDemand(Q);else this.busy=!0,this._demandRender(Q);this._video.requestVideoFrameCallback(this._boundHandleRVFC)}_demandRender(J){if(J.width!==this._videoWidth||J.height!==this._videoHeight)this._videoWidth=J.width,this._videoHeight=J.height,this.resize();this.sendMessage("demand",{time:J.mediaTime+this.timeOffset})}_detachOffscreen(){if(!this._offscreenRender||this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas,this._ctx=this._canvasctrl.getContext("2d"),this.sendMessage("detachOffscreen"),this.busy=!1,this._pendingDemandTimes.length=0,this.resize(0,0,0,0,!0)}_reAttachOffscreen(){if(!this._offscreenRender||!this._ctx)return;this._canvas.remove(),this._createCanvas(),this._canvasctrl=this._canvas.transferControlToOffscreen(),this._ctx=!1,this.sendMessage("offscreenCanvas",{},[this._canvasctrl]),this.resize(0,0,0,0,!0)}_updateColorSpace(){this._video.requestVideoFrameCallback(()=>{try{let J=new globalThis.VideoFrame(this._video);this._videoColorSpace=u[J.colorSpace.matrix]??null,J.close(),this.sendMessage("getColorSpace")}catch(J){console.warn(J)}})}_verifyColorSpace(J){let{subtitleColorSpace:K,videoColorSpace:Z=this._videoColorSpace}=J;if(!K||!Z)return;if(K===Z)return;this._detachOffscreen();let N=y[K]?.[Z];if(N&&this._ctx)this._ctx.filter=`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${N} 0 0 0 0 0 1 0'/></filter></svg>#f")`}_render(J){this._unbusy();let{width:K,height:Z}=J;if(this.debug)J.times.IPCTime=Date.now()-(J.times.JSRenderTime||0);if(this._canvasctrl.width!==K||this._canvasctrl.height!==Z){if(this._canvasctrl.width=K,this._canvasctrl.height=Z,this._lastRenderWidth=K,this._lastRenderHeight=Z,this._gpuRenderer)this._gpuRenderer.updateSize(K,Z);this._verifyColorSpace({subtitleColorSpace:J.colorSpace})}if(this._gpuRenderer){this._renderGPU(J);return}if(!this._ctx)return;let Q=this._ctx,F=J.images,$=F.length;if(Q.clearRect(0,0,K,Z),J.asyncRender)for(let U=0;U<$;U++){let O=F[U];if(O.image)Q.drawImage(O.image,O.x,O.y),O.image.close()}else{let U=R._hasAlphaBug??!1;for(let O=0;O<$;O++){let E=F[O];if(E.image){let{w:q,h:L}=E,_=new Uint8ClampedArray(E.image),Y=m(_,U);Q.putImageData(new ImageData(Y,q,L),E.x,E.y)}}}if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let U=0,O=J.times.bitmaps||$;delete J.times.bitmaps;for(let E in J.times)U+=J.times[E]||0;console.log("Bitmaps: "+O+" Total: "+(U|0)+"ms",J.times)}}_renderGPU(J){let K=this._gpuRenderer;if(!K)return;if(J.images.length===0){K.clear();return}if(J.asyncRender){let Z=J.images.filter((N)=>N.image instanceof ImageBitmap).map((N)=>({image:N.image,x:N.x,y:N.y}));K.renderBitmaps(Z,this._canvasctrl.width,this._canvasctrl.height);for(let N of J.images)if(N.image instanceof ImageBitmap)N.image.close()}else K.render(J.images,this._canvasctrl.width,this._canvasctrl.height);if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let Z=0,N=J.times.bitmaps||J.images.length;delete J.times.bitmaps;for(let Q in J.times)Z+=J.times[Q]||0;console.log(`[${this._rendererType.toUpperCase()}] Bitmaps: `+N+" Total: "+(Z|0)+"ms",J.times)}}_ready(){if(this._workerReady=!0,this._init(),this._onDemandRender&&this._video){this.setCurrentTime(this._video.paused,this._video.currentTime+this.timeOffset,this._video.playbackRate);let J=this._pendingDemandTimes.length>0?this._pendingDemandTimes[this._pendingDemandTimes.length-1]:{mediaTime:this._video.currentTime+this.renderAhead*(this._video.playbackRate||1),width:this._video.videoWidth,height:this._video.videoHeight};this._pendingDemandTimes.length=0,this.busy=!0,this._demandRender(J)}this.dispatchEvent(new CustomEvent("ready"))}_partial_ready(){this.dispatchEvent(new CustomEvent("partial_ready"))}async sendMessage(J,K={},Z){if(await this._loaded,Z)this._worker.postMessage({target:J,transferable:Z,...K},[...Z]);else this._worker.postMessage({target:J,...K})}_fetchFromWorker(J){return new Promise((K,Z)=>{try{let N=J.target,Q=setTimeout(()=>{U(),Z(Error("Error: Timeout while trying to fetch "+N))},5000),F=(O)=>{if(O.data.target===N)U(),K(O.data)},$=(O)=>{U(),Z(O instanceof Error?O:O.error||Error("Worker error"))},U=()=>{this._worker.removeEventListener("message",F),this._worker.removeEventListener("error",$),clearTimeout(Q)};this._worker.addEventListener("message",F),this._worker.addEventListener("error",$),this._worker.postMessage(J)}catch(N){Z(N)}})}_console(J){console[J.command].apply(console,JSON.parse(J.content))}_onmessage(J){let K=J.data.target;if(K==="error"){this._error(J.data.error||"Unknown worker error");return}let Z=this["_"+K];if(Z)Z.call(this,J.data)}_error(J){let K=J instanceof Error?J:J instanceof ErrorEvent?J.error||Error(J.message):Error(String(J)),Z=J instanceof Event?new ErrorEvent(J.type,J):new ErrorEvent("error",{error:K});return this.dispatchEvent(Z),console.error(K),K}_removeListeners(){if(this._video){if(this._ro)this._ro.unobserve(this._video);if(this._ctx)this._ctx.filter="none";this._video.removeEventListener("timeupdate",this._boundTimeUpdate),this._video.removeEventListener("progress",this._boundTimeUpdate),this._video.removeEventListener("waiting",this._boundTimeUpdate),this._video.removeEventListener("seeking",this._boundTimeUpdate),this._video.removeEventListener("playing",this._boundTimeUpdate),this._video.removeEventListener("ratechange",this._boundSetRate),this._video.removeEventListener("resize",this._boundResize),this._video.removeEventListener("loadedmetadata",this._boundUpdateColorSpace)}}destroy(J){let K=J?this._error(J):void 0;if(this._video&&this._canvasParent)this._video.parentNode?.removeChild(this._canvasParent);if(this._gpuRenderer)this._gpuRenderer.destroy(),this._gpuRenderer=null,this._rendererType="canvas2d";return this._destroyed=!0,this._removeListeners(),this.sendMessage("destroy"),this._worker?.terminate(),K}}})();
157
+
158
+ return AkariSub;
159
+ }));
Binary file