akarisub 0.2.0 → 0.2.1
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.
- package/README.md +3 -3
- package/dist/akarisub-worker.js +2 -2
- package/dist/akarisub-worker.wasm +0 -0
- package/dist/akarisub.umd.js +3 -3
- package/dist/index.js +3 -3
- package/dist/ts/index.d.ts +14 -0
- package/dist/ts/index.d.ts.map +1 -0
- package/dist/ts/index.js +17 -0
- package/dist/ts/index.js.map +1 -0
- package/dist/ts/ts/akarisub.d.ts +229 -0
- package/dist/ts/ts/akarisub.d.ts.map +1 -0
- package/dist/ts/ts/akarisub.js +1079 -0
- package/dist/ts/ts/akarisub.js.map +1 -0
- package/dist/ts/ts/types.d.ts +424 -0
- package/dist/ts/ts/types.d.ts.map +1 -0
- package/dist/ts/ts/types.js +5 -0
- package/dist/ts/ts/types.js.map +1 -0
- package/dist/ts/ts/utils.d.ts +78 -0
- package/dist/ts/ts/utils.d.ts.map +1 -0
- package/dist/ts/ts/utils.js +395 -0
- package/dist/ts/ts/utils.js.map +1 -0
- package/dist/ts/ts/webgl2-renderer.d.ts +51 -0
- package/dist/ts/ts/webgl2-renderer.d.ts.map +1 -0
- package/dist/ts/ts/webgl2-renderer.js +388 -0
- package/dist/ts/ts/webgl2-renderer.js.map +1 -0
- package/dist/ts/ts/webgpu-renderer.d.ts +64 -0
- package/dist/ts/ts/webgpu-renderer.d.ts.map +1 -0
- package/dist/ts/ts/webgpu-renderer.js +610 -0
- package/dist/ts/ts/webgpu-renderer.js.map +1 -0
- package/dist/ts/ts/worker.d.ts +6 -0
- package/dist/ts/ts/worker.d.ts.map +1 -0
- package/dist/ts/ts/worker.js +1695 -0
- package/dist/ts/ts/worker.js.map +1 -0
- package/dist/ts/wrapper.d.ts +8 -0
- package/dist/ts/wrapper.d.ts.map +1 -0
- package/dist/ts/wrapper.js +9 -0
- package/dist/ts/wrapper.js.map +1 -0
- package/package.json +7 -6
- package/src/ts/akarisub.ts +46 -4
- package/src/ts/types.ts +18 -4
- package/src/ts/worker.ts +177 -23
package/README.md
CHANGED
|
@@ -65,13 +65,13 @@ If you use a bundler like Vite, you can instead do:
|
|
|
65
65
|
|
|
66
66
|
```js
|
|
67
67
|
import AkariSub from 'akarisub'
|
|
68
|
-
import workerUrl from 'akarisub/
|
|
69
|
-
import wasmUrl from 'akarisub/
|
|
68
|
+
import workerUrl from 'akarisub/worker?url'
|
|
69
|
+
import wasmUrl from 'akarisub/worker.wasm?url'
|
|
70
70
|
|
|
71
71
|
const renderer = new AkariSub({
|
|
72
72
|
video: document.querySelector('video'),
|
|
73
73
|
subContent: subtitleString,
|
|
74
|
-
workerUrl,
|
|
74
|
+
workerUrl,
|
|
75
75
|
wasmUrl
|
|
76
76
|
})
|
|
77
77
|
```
|
package/dist/akarisub-worker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(()=>{async function _2($={}){var J,Z=$,Q=(...w)=>{console.log(...w)},X=(...w)=>{console.error(...w)};function U(){N?.(Z)}(function(){var w=typeof WebAssembly<"u"&&WebAssembly.instantiateStreaming;w&&(WebAssembly.instantiateStreaming=function(r,f){var h=null;return r=Promise.resolve(r).then(function(v){return h=v.clone(),v}),w.call(WebAssembly,r,f).catch(function(v){if(console.warn("[AkariSub] instantiateStreaming failed, using ArrayBuffer fallback:",v&&v.message||v),!h)throw v;return h.arrayBuffer().then(function(G){return WebAssembly.instantiate(G,f)})})})})(),Q=(w)=>{w==="AkariSub: No usable fontconfig configuration file found, using fallback."||w.startsWith("Unable to revert mtime:")||w.trim()===""?console.debug(w):console.log(w)},X=(w)=>{w==="Fontconfig error: Cannot load default config file: No such file: (null)"||w==="Fontconfig error: Cannot load default config file: File not found"||w==="Fontconfig error: No writable cache directories"||w.includes("/var/cache/fontconfig")||w.includes("/.cache/fontconfig")||w.includes("/.local/share/fonts")?console.debug(w):console.error(w)};class K{}class Y extends K{}var N,S=!1;function M(){var w=H.buffer;o=new Int8Array(w),E=new Int16Array(w),P=new Uint8Array(w),new Uint16Array(w),I=new Int32Array(w),j=new Uint32Array(w),new Float32Array(w),new Float64Array(w),O=new BigInt64Array(w),A=new BigUint64Array(w)}H=new WebAssembly.Memory({initial:256,maximum:32768}),M();var E,I,O,o,j,A,P,H,R=new TextDecoder,W=(w,r)=>{for(var f=r+void 0;w[r]&&!(r>=f);)++r;return r},D=(w)=>w?R.decode(P.subarray(w,W(P,w))):"",C=(w,r)=>{for(var f=0,h=w.length-1;0<=h;h--){var v=w[h];v==="."?w.splice(h,1):v===".."?(w.splice(h,1),f++):f&&(w.splice(h,1),f--)}if(r)for(;f;f--)w.unshift("..");return w},V=(w)=>{var r=w.charAt(0)==="/",f=w.slice(-1)==="/";return(w=C(w.split("/").filter((h)=>!!h),!r).join("/"))||r||(w="."),w&&f&&(w+="/"),(r?"/":"")+w},p=(w)=>{var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(w).slice(1);if(w=r[0],r=r[1],!w&&!r)return".";return r&&=r.slice(0,-1),w+r},u=(w)=>w&&w.match(/([^\/]+|\/)\/*$/)[1],K0=()=>(w)=>(crypto.getRandomValues(w),0),d=(w)=>(d=K0())(w),h0=(...w)=>{for(var r="",f=!1,h=w.length-1;-1<=h&&!f;h--){if(f=0<=h?w[h]:"/",typeof f!="string")throw TypeError("Arguments to path.resolve must be strings");if(!f)return"";r=f+"/"+r,f=f.charAt(0)==="/"}return r=C(r.split("/").filter((v)=>!!v),!f).join("/"),(f?"/":"")+r||"."},_0=(w,r)=>{function f(y){for(var B=0;B<y.length&&y[B]==="";B++);for(var L=y.length-1;0<=L&&y[L]==="";L--);return B>L?[]:y.slice(B,L-B+1)}w=h0(w).slice(1),r=h0(r).slice(1),w=f(w.split("/")),r=f(r.split("/"));for(var h=Math.min(w.length,r.length),v=h,G=0;G<h;G++)if(w[G]!==r[G]){v=G;break}h=[];for(G=v;G<w.length;G++)h.push("..");return h=h.concat(r.slice(v)),h.join("/")},s0=(w)=>{var r=W(w,0);return R.decode(w.buffer?w.subarray(0,r):new Uint8Array(w.slice(0,r)))},s1=[],m0=(w)=>{for(var r=0,f=0;f<w.length;++f){var h=w.charCodeAt(f);127>=h?r++:2047>=h?r+=2:55296<=h&&57343>=h?(r+=4,++f):r+=3}return r},D0=(w,r,f,h)=>{if(!(0<h))return 0;var v=f;h=f+h-1;for(var G=0;G<w.length;++G){var y=w.codePointAt(G);if(127>=y){if(f>=h)break;r[f++]=y}else if(2047>=y){if(f+1>=h)break;r[f++]=192|y>>6,r[f++]=128|y&63}else if(65535>=y){if(f+2>=h)break;r[f++]=224|y>>12,r[f++]=128|y>>6&63,r[f++]=128|y&63}else{if(f+3>=h)break;r[f++]=240|y>>18,r[f++]=128|y>>12&63,r[f++]=128|y>>6&63,r[f++]=128|y&63,G++}}return r[f]=0,f-v},m1=[];function l1(w,r){m1[w]={input:[],output:[],Ga:r},V1(w,O2)}var O2={open(w){var r=m1[w.node.Oa];if(!r)throw new z(43);w.fa=r,w.seekable=!1},close(w){w.fa.Ga.Qa(w.fa)},Qa(w){w.fa.Ga.Qa(w.fa)},read(w,r,f,h){if(!w.fa||!w.fa.Ga.ab)throw new z(60);for(var v=0,G=0;G<h;G++){try{var y=w.fa.Ga.ab(w.fa)}catch(B){throw new z(29)}if(y===void 0&&v===0)throw new z(6);if(y===null||y===void 0)break;v++,r[f+G]=y}return v&&(w.node.Fa=Date.now()),v},write(w,r,f,h){if(!w.fa||!w.fa.Ga.Za)throw new z(60);try{for(var v=0;v<h;v++)w.fa.Ga.Za(w.fa,r[f+v])}catch(G){throw new z(29)}return h&&(w.node.ra=w.node.qa=Date.now()),v}},W2={ab(){return s1.length?s1.shift():null},Za(w,r){r===null||r===10?(Q(s0(w.output)),w.output=[]):r!=0&&w.output.push(r)},Qa(w){0<w.output?.length&&(Q(s0(w.output)),w.output=[])},nb(){return{xb:25856,zb:5,wb:191,yb:35387,vb:[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]}},ob(){return 0},pb(){return[24,80]}},V2={Za(w,r){r===null||r===10?(X(s0(w.output)),w.output=[]):r!=0&&w.output.push(r)},Qa(w){0<w.output?.length&&(X(s0(w.output)),w.output=[])}},k={Ea:null,ua(){return k.createNode(null,"/",16895,0)},createNode(w,r,f,h){if((f&61440)===24576||(f&61440)===4096)throw new z(63);return k.Ea||(k.Ea={dir:{node:{ta:k.ca.ta,va:k.ca.va,Na:k.ca.Na,Ra:k.ca.Ra,Ta:k.ca.Ta,Wa:k.ca.Wa,Ua:k.ca.Ua,Sa:k.ca.Sa,Va:k.ca.Va},stream:{wa:k.da.wa}},file:{node:{ta:k.ca.ta,va:k.ca.va},stream:{wa:k.da.wa,read:k.da.read,write:k.da.write,cb:k.da.cb,fb:k.da.fb}},link:{node:{ta:k.ca.ta,va:k.ca.va,La:k.ca.La},stream:{}},$a:{node:{ta:k.ca.ta,va:k.ca.va},stream:q2}}),f=ww(w,r,f,h),a(f.mode)?(f.ca=k.Ea.dir.node,f.da=k.Ea.dir.stream,f.ga={}):(f.mode&61440)===32768?(f.ca=k.Ea.file.node,f.da=k.Ea.file.stream,f.sa=0,f.ga=k.jb??(k.jb=new Uint8Array(0))):(f.mode&61440)===40960?(f.ca=k.Ea.link.node,f.da=k.Ea.link.stream):(f.mode&61440)===8192&&(f.ca=k.Ea.$a.node,f.da=k.Ea.$a.stream),f.Fa=f.ra=f.qa=Date.now(),w&&(w.ga[r]=f,w.Fa=w.ra=w.qa=f.Fa),f},ca:{ta(w){var r={};return r.ib=(w.mode&61440)===8192?w.id:1,r.lb=w.id,r.mode=w.mode,r.rb=1,r.uid=0,r.kb=0,r.Oa=w.Oa,a(w.mode)?r.size=4096:(w.mode&61440)===32768?r.size=w.sa:(w.mode&61440)===40960?r.size=w.link.length:r.size=0,r.Fa=new Date(w.Fa),r.ra=new Date(w.ra),r.qa=new Date(w.qa),r.gb=4096,r.hb=Math.ceil(r.size/r.gb),r},va(w,r){for(var f of["mode","atime","mtime","ctime"])r[f]!=null&&(w[f]=r[f]);r.size!==void 0&&(r=r.size,w.sa!=r&&(f=w.ga,w.ga=new Uint8Array(r),w.ga.set(f.subarray(0,Math.min(r,w.sa))),w.sa=r))},Na(){throw k.Xa||(k.Xa=new z(44),k.Xa.stack="<generic error, no stack>"),k.Xa},Ra(w,r,f,h){return k.createNode(w,r,f,h)},Ta(w,r,f){try{var h=Z0(r,f)}catch(G){}if(h){if(a(w.mode))for(var v in h.ga)throw new z(55);t0(h)}delete w.parent.ga[w.name],r.ga[f]=w,w.name=f,r.qa=r.ra=w.parent.qa=w.parent.ra=Date.now()},Wa(w,r){delete w.ga[r],w.qa=w.ra=Date.now()},Ua(w,r){var f=Z0(w,r),h;for(h in f.ga)throw new z(55);delete w.ga[r],w.qa=w.ra=Date.now()},Sa(w){return[".","..",...Object.keys(w.ga)]},Va(w,r,f){return w=k.createNode(w,r,41471,0),w.link=f,w},La(w){if((w.mode&61440)!==40960)throw new z(28);return w.link}},da:{read(w,r,f,h,v){if(v>=w.node.sa)return 0;return h=Math.min(w.node.sa-v,h),r.set(w.node.ga.subarray(v,v+h),f),h},write(w,r,f,h,v,G){if(r.buffer===o.buffer&&(G=!1),!h)return 0;if(w=w.node,w.ra=w.qa=Date.now(),G)w.ga=r.subarray(f,f+h),w.sa=h;else if(w.sa===0&&v===0)w.ga=r.slice(f,f+h),w.sa=h;else{G=v+h;var y=w.ga.length;y>=G||(G=Math.max(G,y*(1048576>y?2:1.125)>>>0),y&&(G=Math.max(G,256)),y=w.ga.subarray(0,w.sa),w.ga=new Uint8Array(G),w.ga.set(y)),w.ga.set(r.subarray(f,f+h),v),w.sa=Math.max(w.sa,v+h)}return h},wa(w,r,f){if(f===1?r+=w.position:f===2&&(w.node.mode&61440)===32768&&(r+=w.node.sa),0>r)throw new z(28);return r},cb(w,r,f,h,v){if((w.node.mode&61440)!==32768)throw new z(43);if(w=w.node.ga,v&2||w.buffer!==o.buffer){v=!0,h=65536*Math.ceil(r/65536);var G=nw(65536,h);if(G&&P.fill(0,G,G+h),h=G,!h)throw new z(48);if(w){if(0<f||f+r<w.length)w.subarray?w=w.subarray(f,f+r):w=Array.prototype.slice.call(w,f,f+r);o.set(w,h)}}else v=!1,h=w.byteOffset;return{Db:h,ub:v}},fb(w,r,f,h){return k.da.write(w,r,0,h,f,!1),0}}},t1=(w,r)=>{var f=0;return w&&(f|=365),r&&(f|=146),f},U1=null,i1={},q0=[],k2=1,O0=null,d1=!1,a1=!0,z=class{name="ErrnoError";constructor(w){this.ea=w}},B2=class{Pa={};node=null;get flags(){return this.Pa.flags}set flags(w){this.Pa.flags=w}get position(){return this.Pa.position}set position(w){this.Pa.position=w}},Y2=class{ca={};da={};Ia=null;constructor(w,r,f,h){w||=this,this.parent=w,this.ua=w.ua,this.id=k2++,this.name=r,this.mode=f,this.Oa=h,this.Fa=this.ra=this.qa=Date.now()}get read(){return(this.mode&365)===365}set read(w){w?this.mode|=365:this.mode&=-366}get write(){return(this.mode&146)===146}set write(w){w?this.mode|=146:this.mode&=-147}};function l(w,r={}){if(!w)throw new z(44);r.Ya??(r.Ya=!0),w.charAt(0)==="/"||(w="//"+w);var f=0;w:for(;40>f;f++){w=w.split("/").filter((B)=>!!B);for(var h=U1,v="/",G=0;G<w.length;G++){var y=G===w.length-1;if(y&&r.parent)break;if(w[G]!==".")if(w[G]==="..")if(v=p(v),h===h.parent){w=v+"/"+w.slice(G+1).join("/"),f--;continue w}else h=h.parent;else{v=V(v+"/"+w[G]);try{h=Z0(h,w[G])}catch(B){if(B?.ea===44&&y&&r.sb)return{path:v};throw B}if(!h.Ia||y&&!r.Ya||(h=h.Ia.root),(h.mode&61440)===40960&&(!y||r.Ja)){if(!h.ca.La)throw new z(52);h=h.ca.La(h),h.charAt(0)==="/"||(h=p(v)+"/"+h),w=h+"/"+w.slice(G+1).join("/");continue w}}}return{path:v,node:h}}throw new z(32)}function l0(w){for(var r;;){if(w===w.parent)return w=w.ua.eb,r?w[w.length-1]!=="/"?`${w}/${r}`:w+r:w;r=r?`${w.name}/${r}`:w.name,w=w.parent}}function O1(w,r){for(var f=0,h=0;h<r.length;h++)f=(f<<5)-f+r.charCodeAt(h)|0;return(w+f>>>0)%O0.length}function e1(w){var r=O1(w.parent.id,w.name);w.Ma=O0[r],O0[r]=w}function t0(w){var r=O1(w.parent.id,w.name);if(O0[r]===w)O0[r]=w.Ma;else for(r=O0[r];r;){if(r.Ma===w){r.Ma=w.Ma;break}r=r.Ma}}function Z0(w,r){var f=a(w.mode)?(f=k0(w,"x"))?f:w.ca.Na?0:2:54;if(f)throw new z(f);for(f=O0[O1(w.id,r)];f;f=f.Ma){var h=f.name;if(f.parent.id===w.id&&h===r)return f}return w.ca.Na(w,r)}function ww(w,r,f,h){return w=new Y2(w,r,f,h),e1(w),w}function a(w){return(w&61440)===16384}function k0(w,r){return a1?0:r.includes("r")&&!(w.mode&292)||r.includes("w")&&!(w.mode&146)||r.includes("x")&&!(w.mode&73)?2:0}function W1(w,r){if(!a(w.mode))return 54;try{return Z0(w,r),20}catch(f){}return k0(w,"wx")}function i0(w,r,f){try{var h=Z0(w,r)}catch(v){return v.ea}if(w=k0(w,"wx"))return w;if(f){if(!a(h.mode))return 54;if(h===h.parent||l0(h)==="/")return 10}else if(a(h.mode))return 31;return 0}function L0(w,r){if(!w)throw new z(r);return w}function G0(w){if(w=q0[w],!w)throw new z(8);return w}function rw(w,r=-1){if(w=Object.assign(new B2,w),r==-1)w:{for(r=0;4096>=r;r++)if(!q0[r])break w;throw new z(33)}return w.Ha=r,q0[r]=w}function o2(w,r=-1){return w=rw(w,r),w.da?.Bb?.(w),w}function fw(w,r){var f=null?.da.va,h=f?null:w;f??=w.ca.va,L0(f,63),f(h,r)}var q2={open(w){w.da=i1[w.node.Oa].da,w.da.open?.(w)},wa(){throw new z(70)}};function V1(w,r){i1[w]={da:r}}function hw(w,r){var f=r==="/";if(f&&U1)throw new z(10);if(!f&&r){var h=l(r,{Ya:!1});if(r=h.path,h=h.node,h.Ia)throw new z(10);if(!a(h.mode))throw new z(54)}r={type:w,Cb:{},eb:r,qb:[]},w=w.ua(r),w.ua=r,r.root=w,f?U1=w:h&&(h.Ia=r,h.ua&&h.ua.qb.push(r))}function d0(w,r,f){var h=l(w,{parent:!0}).node;if(w=u(w),!w)throw new z(28);if(w==="."||w==="..")throw new z(20);var v=W1(h,w);if(v)throw new z(v);if(!h.ca.Ra)throw new z(63);return h.ca.Ra(h,w,r,f)}function N2(w,r=438){return d0(w,r&4095|32768,0)}function $0(w,r=511){return d0(w,r&1023|16384,0)}function a0(w,r,f){typeof f>"u"&&(f=r,r=438),d0(w,r|8192,f)}function k1(w,r){if(!h0(w))throw new z(44);var f=l(r,{parent:!0}).node;if(!f)throw new z(44);r=u(r);var h=W1(f,r);if(h)throw new z(h);if(!f.ca.Va)throw new z(63);f.ca.Va(f,r,w)}function $w(w){var r=l(w,{parent:!0}).node;w=u(w);var f=Z0(r,w),h=i0(r,w,!0);if(h)throw new z(h);if(!r.ca.Ua)throw new z(63);if(f.Ia)throw new z(10);r.ca.Ua(r,w),t0(f)}function e0(w,r){return w=l(w,{Ja:!r}).node,L0(w.ca.ta,63)(w)}function w1(w,r){w=typeof w=="string"?l(w,{Ja:!0}).node:w,fw(w,{mode:r&4095|w.mode&-4096,qa:Date.now(),Ab:void 0})}function g0(w,r,f=438){if(w==="")throw new z(44);if(typeof r=="string"){var h={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[r];if(typeof h>"u")throw Error(`Unknown file open mode: ${r}`);r=h}if(f=r&64?f&4095|32768:0,typeof w=="object")h=w;else{var v=w.endsWith("/"),G=l(w,{Ja:!(r&131072),sb:!0});h=G.node,w=G.path}if(G=!1,r&64)if(h){if(r&128)throw new z(20)}else{if(v)throw new z(31);h=d0(w,f|511,0),G=!0}if(!h)throw new z(44);if((h.mode&61440)===8192&&(r&=-513),r&65536&&!a(h.mode))throw new z(54);if(!G&&(h?(h.mode&61440)===40960?v=32:(v=["r","w","rw"][r&3],r&512&&(v+="w"),v=a(h.mode)&&(v!=="r"||r&576)?31:k0(h,v)):v=44,v))throw new z(v);if(r&512&&!G){if(v=h,v=typeof v=="string"?l(v,{Ja:!0}).node:v,a(v.mode))throw new z(31);if((v.mode&61440)!==32768)throw new z(28);if(w=k0(v,"w"))throw new z(w);fw(v,{size:0,timestamp:Date.now()})}return r=rw({node:h,path:l0(h),flags:r&-131713,seekable:!0,position:0,da:h.da,tb:[],error:!1}),r.da.open&&r.da.open(r),G&&w1(h,f&511),r}function vw(w){if(w.Ha===null)throw new z(8);w.Ka&&(w.Ka=null);try{w.da.close&&w.da.close(w)}catch(r){throw r}finally{q0[w.Ha]=null}w.Ha=null}function r1(w,r,f){if(w.Ha===null)throw new z(8);if(!w.seekable||!w.da.wa)throw new z(70);if(f!=0&&f!=1&&f!=2)throw new z(28);return w.position=w.da.wa(w,r,f),w.tb=[],w.position}function Jw(w,r,f,h,v,G){if(0>h||0>v)throw new z(28);if(w.Ha===null)throw new z(8);if((w.flags&2097155)===0)throw new z(8);if(a(w.node.mode))throw new z(31);if(!w.da.write)throw new z(28);w.seekable&&w.flags&1024&&r1(w,0,2);var y=typeof v<"u";if(!y)v=w.position;else if(!w.seekable)throw new z(70);return r=w.da.write(w,r,f,h,v,G),y||(w.position+=r),r}function A2(w,r){w=typeof w=="string"?w:l0(w);for(r=r.split("/").reverse();r.length;){var f=r.pop();if(f){var h=V(w+"/"+f);try{$0(h)}catch(v){if(v.ea!=20)throw v}w=h}}return h}function H2(w,r,f,h,v,G){var y=r;w&&(w=typeof w=="string"?w:l0(w),y=r?V(w+"/"+r):w),w=t1(h,v),y=N2(y,w),f&&(r=f,typeof r=="string"&&(f=Array(m0(r)+1),r=D0(r,f,0,f.length),f.length=r,r=f),r.subarray||(r=new Uint8Array(r)),f=r,w1(y,w|146),r=g0(y,577),Jw(r,f,0,f.length,0,G),vw(r),w1(y,w))}function I0(w,r){w=V("/dev/"+w);var f=t1(!!r,!1);I0.bb??(I0.bb=64);var h=I0.bb++<<8|0;V1(h,{open(v){v.seekable=!1},close(){(void 0)?.buffer?.length&&(void 0)(10)},read(v,G,y,B){for(var L=0,_=0;_<B;_++){try{var c=r()}catch(s){throw new z(29)}if(c===void 0&&L===0)throw new z(6);if(c===null||c===void 0)break;L++,G[y+_]=c}return L&&(v.node.Fa=Date.now()),L},write(v,G,y,B){for(var L=0;L<B;L++)try{(void 0)(G[y+L])}catch(_){throw new z(29)}return B&&(v.node.ra=v.node.qa=Date.now()),L}}),a0(w,f,h)}var n={};function y0(w,r,f){if(r.charAt(0)==="/")return r;if(w=w===-100?"/":G0(w).path,r.length==0){if(!f)throw new z(44);return w}return w+"/"+r}function f1(w,r){j[w>>2]=r.ib,j[w+4>>2]=r.mode,j[w+8>>2]=r.rb,j[w+12>>2]=r.uid,j[w+16>>2]=r.kb,j[w+20>>2]=r.Oa,O[w+24>>3]=BigInt(r.size),I[w+32>>2]=4096,I[w+36>>2]=r.hb;var f=r.Fa.getTime(),h=r.ra.getTime(),v=r.qa.getTime();return O[w+40>>3]=BigInt(Math.floor(f/1000)),j[w+48>>2]=f%1000*1e6,O[w+56>>3]=BigInt(Math.floor(h/1000)),j[w+64>>2]=h%1000*1e6,O[w+72>>3]=BigInt(Math.floor(v/1000)),j[w+80>>2]=v%1000*1e6,O[w+88>>3]=BigInt(r.lb),0}var E0=void 0,z0=()=>{var w=I[+E0>>2];return E0+=4,w},B1={},Zw=()=>{if(!Y1){var w={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:"./this.program"},r;for(r in B1)B1[r]===void 0?delete w[r]:w[r]=B1[r];var f=[];for(r in w)f.push(`${r}=${w[r]}`);Y1=f}return Y1},Y1,Gw=[],Qw=(w)=>{var r=Gw[w];return r||(Gw[w]=r=cw.get(w)),r};O0=Array(4096),hw(k,"/"),$0("/tmp"),$0("/home"),$0("/home/web_user"),function(){$0("/dev"),V1(259,{read:()=>0,write:(h,v,G,y)=>y,wa:()=>0}),a0("/dev/null",259),l1(1280,W2),l1(1536,V2),a0("/dev/tty",1280),a0("/dev/tty1",1536);var w=new Uint8Array(1024),r=0,f=()=>{return r===0&&(d(w),r=w.byteLength),w[--r]};I0("random",f),I0("urandom",f),$0("/dev/shm"),$0("/dev/shm/tmp")}(),function(){$0("/proc");var w=$0("/proc/self");$0("/proc/self/fd"),hw({ua(){var r=ww(w,"fd",16895,73);return r.da={wa:k.da.wa},r.ca={Na(f,h){f=+h;var v=G0(f);return f={parent:null,ua:{eb:"fake"},ca:{La:()=>v.path},id:f+1},f.parent=f},Sa(){return Array.from(q0.entries()).filter(([,f])=>f).map(([f])=>f.toString())}},r}},"/proc/self/fd")}();var Kw,yw,zw,jw,Xw,Uw,Ow,Ww,Vw,kw,Bw,Yw,ow,qw,Nw,Aw,Hw,Pw,_w,Dw,Lw,gw,Iw,Ew,Rw,Cw,Fw,uw,Mw,bw,Tw,pw,nw,o1,q1,N1,cw,P2={a:{b:(w,r,f,h)=>{throw`Assertion failed: ${D(w)}, at: `+[r?D(r):"unknown filename",f,h?D(h):"unknown function"]},H:function(w,r){try{return w=D(w),w1(w,r),0}catch(f){if(typeof n>"u"||f.name!=="ErrnoError")throw f;return-f.ea}},k:function(w,r,f){try{if(r=D(r),r=y0(w,r),f&-8)return-28;var h=l(r,{Ja:!0}).node;if(!h)return-44;return w="",f&4&&(w+="r"),f&2&&(w+="w"),f&1&&(w+="x"),w&&k0(h,w)?-2:0}catch(v){if(typeof n>"u"||v.name!=="ErrnoError")throw v;return-v.ea}},c:function(w,r,f){E0=f;try{var h=G0(w);switch(r){case 0:var v=z0();if(0>v)break;for(;q0[v];)v++;return o2(h,v).Ha;case 1:case 2:return 0;case 3:return h.flags;case 4:return v=z0(),h.flags|=v,0;case 12:return v=z0(),E[v+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(G){if(typeof n>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},G:function(w,r){try{var f=G0(w),h=f.node,v=f.da.ta;w=v?f:h,v??=h.ca.ta,L0(v,63);var G=v(w);return f1(r,G)}catch(y){if(typeof n>"u"||y.name!=="ErrnoError")throw y;return-y.ea}},C:function(w,r){try{if(r===0)return-28;var f=m0("/")+1;if(r<f)return-68;return D0("/",P,w,r),f}catch(h){if(typeof n>"u"||h.name!=="ErrnoError")throw h;return-h.ea}},w:function(w,r,f){try{var h=G0(w);if(!h.Ka){var v=l(h.path,{Ja:!0}).node,G=L0(v.ca.Sa,54)(v);h.Ka=G}w=0;var y=r1(h,0,1),B=Math.floor(y/280),L=Math.min(h.Ka.length,B+Math.floor(f/280));for(f=B;f<L;f++){var _=h.Ka[f];if(_===".")var c=h.node.id,s=4;else if(_==="..")c=l(h.path,{parent:!0}).node.id,s=4;else{try{var w0=Z0(h.node,_)}catch(r0){if(r0?.ea===28)continue;throw r0}c=w0.id,s=(w0.mode&61440)===8192?2:a(w0.mode)?4:(w0.mode&61440)===40960?10:8}O[r+w>>3]=BigInt(c),O[r+w+8>>3]=BigInt(280*(f+1)),E[r+w+16>>1]=280,o[r+w+18]=s,D0(_,P,r+w+19,256),w+=280}return r1(h,280*f,0),w}catch(r0){if(typeof n>"u"||r0.name!=="ErrnoError")throw r0;return-r0.ea}},m:function(w,r,f){E0=f;try{var h=G0(w);switch(r){case 21509:return h.fa?0:-59;case 21505:if(!h.fa)return-59;if(h.fa.Ga.nb){w=[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];var v=z0();I[v>>2]=25856,I[v+4>>2]=5,I[v+8>>2]=191,I[v+12>>2]=35387;for(var G=0;32>G;G++)o[v+G+17]=w[G]||0}return 0;case 21510:case 21511:case 21512:return h.fa?0:-59;case 21506:case 21507:case 21508:if(!h.fa)return-59;if(h.fa.Ga.ob)for(v=z0(),w=[],G=0;32>G;G++)w.push(o[v+G+17]);return 0;case 21519:if(!h.fa)return-59;return v=z0(),I[v>>2]=0;case 21520:return h.fa?-28:-59;case 21537:case 21531:if(v=z0(),!h.da.mb)throw new z(59);return h.da.mb(h,r,v);case 21523:if(!h.fa)return-59;return h.fa.Ga.pb&&(G=[24,80],v=z0(),E[v>>1]=G[0],E[v+2>>1]=G[1]),0;case 21524:return h.fa?0:-59;case 21515:return h.fa?0:-59;default:return-28}}catch(y){if(typeof n>"u"||y.name!=="ErrnoError")throw y;return-y.ea}},D:function(w,r){try{return w=D(w),f1(r,e0(w,!0))}catch(f){if(typeof n>"u"||f.name!=="ErrnoError")throw f;return-f.ea}},x:function(w,r,f){try{return r=D(r),r=y0(w,r),$0(r,f),0}catch(h){if(typeof n>"u"||h.name!=="ErrnoError")throw h;return-h.ea}},E:function(w,r,f,h){try{r=D(r);var v=h&256;return r=y0(w,r,h&4096),f1(f,v?e0(r,!0):e0(r))}catch(G){if(typeof n>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},i:function(w,r,f,h){E0=h;try{r=D(r),r=y0(w,r);var v=h?z0():0;return g0(r,f,v).Ha}catch(G){if(typeof n>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},v:function(w,r,f,h){try{if(r=D(r),r=y0(w,r),0>=h)return-28;var v=l(r).node;if(!v)throw new z(44);if(!v.ca.La)throw new z(28);var G=v.ca.La(v),y=Math.min(h,m0(G)),B=o[f+y];return D0(G,P,f,h+1),o[f+y]=B,y}catch(L){if(typeof n>"u"||L.name!=="ErrnoError")throw L;return-L.ea}},u:function(w,r,f,h){try{r=D(r),h=D(h),r=y0(w,r),h=y0(f,h),w=r;var v=p(w),G=p(h),y=u(w),B=u(h),L=l(w,{parent:!0}),_=L.node;L=l(h,{parent:!0});var c=L.node;if(!_||!c)throw new z(44);if(_.ua!==c.ua)throw new z(75);var s=Z0(_,y),w0=_0(w,G);if(w0.charAt(0)!==".")throw new z(28);if(w0=_0(h,v),w0.charAt(0)!==".")throw new z(55);try{var r0=Z0(c,B)}catch(v0){}if(s!==r0){var R0=a(s.mode),j0=i0(_,y,R0);if(j0)throw new z(j0);if(j0=r0?i0(c,B,R0):W1(c,B))throw new z(j0);if(!_.ca.Ta)throw new z(63);if(s.Ia||r0&&r0.Ia)throw new z(10);if(c!==_&&(j0=k0(_,"w")))throw new z(j0);t0(s);try{_.ca.Ta(s,c,B),s.parent=c}catch(v0){throw v0}finally{e1(s)}}return 0}catch(v0){if(typeof n>"u"||v0.name!=="ErrnoError")throw v0;return-v0.ea}},t:function(w){try{return w=D(w),$w(w),0}catch(r){if(typeof n>"u"||r.name!=="ErrnoError")throw r;return-r.ea}},F:function(w,r){try{return w=D(w),f1(r,e0(w))}catch(f){if(typeof n>"u"||f.name!=="ErrnoError")throw f;return-f.ea}},s:function(w,r,f){try{if(r=D(r),r=y0(w,r),f)if(f===512)$w(r);else return-28;else{w=r;var h=l(w,{parent:!0}).node;if(!h)throw new z(44);var v=u(w),G=Z0(h,v),y=i0(h,v,!1);if(y)throw new z(y);if(!h.ca.Wa)throw new z(63);if(G.Ia)throw new z(10);h.ca.Wa(h,v),t0(G)}return 0}catch(B){if(typeof n>"u"||B.name!=="ErrnoError")throw B;return-B.ea}},r:function(w,r,f){try{r=D(r),r=y0(w,r,!0);var h=Date.now(),v,G;if(f){var y=j[f>>2]+4294967296*I[f+4>>2],B=I[f+8>>2];B==1073741823?v=h:B==1073741822?v=null:v=1000*y+B/1e6,f+=16,y=j[f>>2]+4294967296*I[f+4>>2],B=I[f+8>>2],B==1073741823?G=h:B==1073741822?G=null:G=1000*y+B/1e6}else G=v=h;if((G??v)!==null){w=v;var L=l(r,{Ja:!0}).node;L0(L.ca.va,63)(L,{Fa:w,ra:G})}return 0}catch(_){if(typeof n>"u"||_.name!=="ErrnoError")throw _;return-_.ea}},l:()=>{throw""},p:()=>{throw new Y},j:()=>Date.now(),f:()=>performance.now(),q:(w)=>{var r=P.length;if(w>>>=0,2147483648<w)return!1;for(var f=1;4>=f;f*=2){var h=r*(1+0.2/f);h=Math.min(h,w+100663296);w:{h=(Math.min(2147483648,65536*Math.ceil(Math.max(w,h)/65536))-H.buffer.byteLength+65535)/65536|0;try{H.grow(h),M();var v=1;break w}catch(G){}v=void 0}if(v)return!0}return!1},z:(w,r)=>{var f=0,h=0,v;for(v of Zw()){var G=r+f;j[w+h>>2]=G,f+=D0(v,P,G,1/0)+1,h+=4}return 0},A:(w,r)=>{var f=Zw();j[w>>2]=f.length,w=0;for(var h of f)w+=m0(h)+1;return j[r>>2]=w,0},g:(w)=>{throw`exit(${w})`},d:function(w){try{var r=G0(w);return vw(r),0}catch(f){if(typeof n>"u"||f.name!=="ErrnoError")throw f;return f.ea}},h:function(w,r,f,h){try{w:{var v=G0(w);w=r;for(var G,y=r=0;y<f;y++){var B=j[w>>2],L=j[w+4>>2];w+=8;var _=v,c=B,s=L,w0=G,r0=o;if(0>s||0>w0)throw new z(28);if(_.Ha===null)throw new z(8);if((_.flags&2097155)===1)throw new z(8);if(a(_.node.mode))throw new z(31);if(!_.da.read)throw new z(28);var R0=typeof w0<"u";if(!R0)w0=_.position;else if(!_.seekable)throw new z(70);var j0=_.da.read(_,r0,c,s,w0);R0||(_.position+=j0);var v0=j0;if(0>v0){var Sw=-1;break w}if(r+=v0,v0<L)break;typeof G<"u"&&(G+=v0)}Sw=r}return j[h>>2]=Sw,0}catch(H1){if(typeof n>"u"||H1.name!=="ErrnoError")throw H1;return H1.ea}},y:function(w,r,f,h){r=-9007199254740992>r||9007199254740992<r?NaN:Number(r);try{if(isNaN(r))return 61;var v=G0(w);return r1(v,r,f),O[h>>3]=BigInt(v.position),v.Ka&&r===0&&f===0&&(v.Ka=null),0}catch(G){if(typeof n>"u"||G.name!=="ErrnoError")throw G;return G.ea}},e:function(w,r,f,h){try{w:{var v=G0(w);w=r;for(var G,y=r=0;y<f;y++){var B=j[w>>2],L=j[w+4>>2];w+=8;var _=Jw(v,o,B,L,G);if(0>_){var c=-1;break w}if(r+=_,_<L)break;typeof G<"u"&&(G+=_)}c=r}return j[h>>2]=c,0}catch(s){if(typeof n>"u"||s.name!=="ErrnoError")throw s;return s.ea}},o:function(w,r,f){var h=N1();try{return Qw(w)(r,f)}catch(v){if(q1(h),!(v instanceof K))throw v;o1(1,0)}},n:function(w,r,f,h,v){var G=N1();try{return Qw(w)(r,f,h,v)}catch(y){if(q1(G),!(y instanceof K))throw y;o1(1,0)}},a:H,B:(w,r)=>d(P.subarray(w,w+r))}};WebAssembly.instantiateStreaming(fetch(new URL("akarisub-worker.wasm",self.location.href)),P2).then((w)=>{w=w.instance.exports,Kw=w.J,yw=w.K,zw=w.L,jw=w.M,Xw=w.N,Uw=w.O,Ow=w.P,Ww=w.Q,Vw=w.R,kw=w.S,Bw=w.T,Yw=w.U,ow=w.V,qw=w.W,Nw=w.X,Aw=w.Y,Hw=w.Z,Pw=w._,_w=w.$,Dw=w.aa,Lw=w.ba,gw=w.ha,Iw=w.ia,Ew=w.ja,Rw=w.ka,Cw=w.la,Fw=w.ma,uw=w.na,Mw=w.oa,bw=w.pa,Tw=w.xa,pw=w.ya,nw=w.Aa,o1=w.Ba,q1=w.Ca,N1=w.Da,cw=w.za,S=!0,Z.noFSInit||d1||(d1=!0,k1("/dev/tty","/dev/stdin"),k1("/dev/tty","/dev/stdout"),k1("/dev/tty1","/dev/stderr"),g0("/dev/stdin",0),g0("/dev/stdout",1),g0("/dev/stderr",1)),w.I(),a1=!1,U()});let A1=()=>{try{typeof H<"u"&&(self.wasmMemory=H,self.HEAPU8C=new Uint8ClampedArray(H.buffer),typeof BigInt64Array<"u"&&(self.HEAP64=new BigInt64Array(H.buffer),self.HEAPU64=new BigUint64Array(H.buffer))),typeof P<"u"&&(self.HEAPU8=P),typeof O<"u"&&(self.HEAP64=O),typeof A<"u"&&(self.HEAPU64=A)}catch(w){}};if(typeof updateGlobalBufferAndViews==="function"){let w=updateGlobalBufferAndViews;updateGlobalBufferAndViews=(r)=>{w(r),A1()}}if(typeof M==="function"){let w=M;M=()=>{w(),A1()}}let xw=typeof U==="function"?U:null;return xw&&(U=()=>{return Object.assign(Z,{_malloc:yw,_free:zw,_akarisub_create:Kw,_akarisub_destroy:jw,_akarisub_set_drop_animations:Xw,_akarisub_create_track_mem:Uw,_akarisub_remove_track:Ow,_akarisub_resize_canvas:Ww,_akarisub_add_font:Vw,_akarisub_reload_fonts:kw,_akarisub_set_default_font:Bw,_akarisub_set_fallback_fonts:Yw,_akarisub_set_memory_limits:ow,_akarisub_get_event_count:qw,_akarisub_alloc_event:Nw,_akarisub_remove_event:Aw,_akarisub_get_style_count:Hw,_akarisub_alloc_style:Pw,_akarisub_remove_style:_w,_akarisub_style_override_index:Dw,_akarisub_disable_style_override:Lw,_akarisub_get_track_color_space:gw,_akarisub_event_get_int:Iw,_akarisub_event_set_int:Ew,_akarisub_event_get_str:Rw,_akarisub_event_set_str:Cw,_akarisub_style_get_num:Fw,_akarisub_style_set_num:uw,_akarisub_style_get_str:Mw,_akarisub_style_set_str:bw,_akarisub_render_blend_collect:Tw,_akarisub_render_image_collect:pw}),typeof n<"u"&&(Z.FS_createPath=A2,Z.FS_createDataFile=H2),A1(),xw()}),S?J=Z:J=new Promise((w)=>{N=w}),J}var sw=_2;var P1=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function mw($,J=!1){let Z=[],Q=$.split(/[\r\n]+/g),X=Q.length,U=null,K=null;for(let Y=0;Y<X;Y++){let N=Q[Y];if(!N||/^\s*$/.test(N))continue;let S=N[0];if(S==="["){let M=N.match(/^\[(.*)\]$/);if(M){if(J&&M[1].toLowerCase()==="events")break;U=null,K={name:M[1],body:[]},Z.push(K);continue}}if(!K)continue;if(S===";")K.body.push({type:"comment",value:N.substring(1)});else{let M=N.indexOf(":");if(M===-1)continue;let E=N.substring(0,M),I=N.substring(M+1).trim();if(U||E==="Format"){let O=I.split(",");if(U&&O.length>U.length){let j=O.slice(U.length-1).join(",");O=O.slice(0,U.length-1),O.push(j)}let o=O.length;for(let j=0;j<o;j++)O[j]=O[j].trim();if(U){let j={},A=Math.min(U.length,o);for(let P=0;P<A;P++)j[U[P]]=O[P];I=j}else I=O}if(E==="Format")U=I;K.body.push({key:E,value:I})}}return Z}var D2=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function _1($){return $.replace(D2,"")}var L2=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function g2($,J){let Z=[...L2].sort((Q,X)=>Q.w-X.w);for(let Q of Z)if($<=Q.w&&J<=Q.h)return Q;return{w:Math.ceil($/100)*100,h:Math.ceil(J/100)*100}}function x($,J){return J&&J.includes(".")?$.toFixed(2).replace(/\.?0+$/,""):Math.round($)}function D1($){let J=$.match(/PlayResX:\s*(\d+)/i),Z=$.match(/PlayResY:\s*(\d+)/i),Q=J?parseInt(J[1],10):1920,X=Z?parseInt(Z[1],10):1080,U=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,K=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,Y=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,N=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,S=0,M=0,E=(C,V,p)=>{let u,K0=new RegExp(C.source,"g");while((u=K0.exec($))!==null){for(let d of V)if(u[d]){let h0=Math.abs(parseFloat(u[d]));if(h0>S)S=h0}for(let d of p)if(u[d]){let h0=Math.abs(parseFloat(u[d]));if(h0>M)M=h0}}};if(E(U,[1],[2]),E(K,[1,3],[2,4]),E(Y,[1],[2]),E(N,[1,3],[2,4]),S<=Q&&M<=X)return $;let I=g2(S,M),O=Q/I.w,o=X/I.h,j=Math.min(O,o),A=Math.max(O,o),P=1,H=$,R=H.match(/(\[Events\][\s\S]*)/i);if(!R)return H;let W=R[1];return W=W.replace(U,(C,V,p)=>`\\pos(${x(parseFloat(V)*O,V)},${x(parseFloat(p)*o,p)})`),W=W.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(C,V,p,u,K0,d,h0)=>{let _0=`\\move(${x(parseFloat(V)*O,V)},${x(parseFloat(p)*o,p)},${x(parseFloat(u)*O,u)},${x(parseFloat(K0)*o,K0)}`;return d?`${_0},${d},${h0})`:`${_0})`}),W=W.replace(Y,(C,V,p)=>`\\org(${x(parseFloat(V)*O,V)},${x(parseFloat(p)*o,p)})`),W=W.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(C,V,p,u,K0,d)=>`\\${V}(${x(parseFloat(p)*O,p)},${x(parseFloat(u)*o,u)},${x(parseFloat(K0)*O,K0)},${x(parseFloat(d)*o,d)})`),W=W.replace(/\\fs([\d.]+)/g,(C,V)=>`\\fs${x(parseFloat(V)*A,V)}`),W=W.replace(/\\fscx([\d.]+)/g,(C,V)=>`\\fscx${x(parseFloat(V)*P,V)}`),W=W.replace(/\\xbord([\d.]+)/g,(C,V)=>`\\xbord${x(parseFloat(V)*O,V)}`),W=W.replace(/\\ybord([\d.]+)/g,(C,V)=>`\\ybord${x(parseFloat(V)*o,V)}`),W=W.replace(/\\xshad(-?[\d.]+)/g,(C,V)=>`\\xshad${x(parseFloat(V)*O,V)}`),W=W.replace(/\\yshad(-?[\d.]+)/g,(C,V)=>`\\yshad${x(parseFloat(V)*o,V)}`),["fsp","bord","shad","be","blur"].forEach((C)=>{let V=new RegExp(`\\\\${C}(-?[\\d.]+)`,"g");W=W.replace(V,(p,u)=>`\\${C}${x(parseFloat(u)*j,u)}`)}),W=W.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(C)=>{return C.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(V,p,u)=>{return`${x(parseFloat(p)*O,p)} ${x(parseFloat(u)*o,u)}`})}),H.substring(0,R.index)+W}var o0=0,aw=1,J0=null,L1=!1,P0=()=>typeof performance<"u"?performance.now():Date.now(),z1=P0(),J1=24,T0=!1,ew=!1,n1="wasm",Y0={},Z1={},w2=0,r2=0,C0=[],m=!1,R1=!1,p0=!1,I2=3,t=[];self.width=0;self.height=0;var q={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},E2=()=>{q.framesRendered=0,q.framesDropped=0,q.totalRenderTime=0,q.maxRenderTime=0,q.minRenderTime=1/0,q.lastRenderTime=0,q.cacheHits=0,q.cacheMisses=0},U0=!1,F0=!0,X0=null,N0=null,n0=!1,B0=null,f2=null,F=0,H0=null,C1=!1,h2=!1,R2=!1,i=null,G1=!1,$2=new TextEncoder,C2=new TextDecoder,F1=null,j1=128,v2=Math.max(j1,4096),J2=v2;var F2=30,u2=1,M2=24,u1=1000,Z2=Array(j1),lw=!1,M1=3,v1=5,e=0,Q0=0,b2=[],T2=[],p2=[],g1=null;var n2=!1,X1=null,A0=null,b1=($)=>new Promise((J)=>setTimeout(J,$)),G2=()=>{if(lw)return;for(let $=0;$<j1;$++)Z2[$]={w:0,h:0,x:0,y:0,image:0};lw=!0},tw=($)=>{if($<j1)return Z2[$];return{w:0,h:0,x:0,y:0,image:0}},c1=($)=>{if(!i||$<=0)return;let J=M1+v1*$;if(Q0>=J&&e)return;let Z=Math.max(J,(Q0||64)*2),Q=Z*Int32Array.BYTES_PER_ELEMENT;if(e)i._free(e),e=0,Q0=0;if(e=i._malloc(Q),!e)throw Q0=0,Error("Failed to allocate render-collect buffer");Q0=Z},Q1=($)=>{if(!F)return;let J=g(),Z=T();if(c1(J2),n1==="wasm")J.renderBlendCollect(Z,$,0,e,Q0);else J.renderImageCollect(Z,$,0,e,Q0)},x0=()=>{q.totalEvents=F?g().getEventCount(F):0},Q2=()=>{if(!F)return null;let $=g(),J=T(),Z=$.getEventCount(J);if(Z<=0)return null;let Q=Number.POSITIVE_INFINITY;for(let X=0;X<Z;X++){let U=$.eventGetInt(J,X,f0.Start)/u1;if(Number.isFinite(U)&&U<Q)Q=U}if(!Number.isFinite(Q))return null;return Math.max(0,Q)},c2=()=>{if(!F)return null;let $=g(),J=T(),Z=$.getEventCount(J);if(Z<=0)return null;let Q=Number.POSITIVE_INFINITY,X=0;for(let U=0;U<Z;U++){let K=$.eventGetInt(J,U,f0.Start)/u1,Y=Math.max(0,$.eventGetInt(J,U,f0.Duration)/u1);if(!Number.isFinite(K))continue;let N=K+Y;if(K<Q)Q=K;if(N>X)X=N}if(!Number.isFinite(Q))return null;if(X<Q)X=Q;return{start:Math.max(0,Q),end:Math.max(0,X)}},x2=async()=>{if(!F)return;let $=c2();if(!$)return;let J=Math.min($.end,$.start+F2),Z=0;for(let Q=$.start;Q<=J;Q+=u2){if(!F)return;if(T0&&(p0||t.length>0||q.pendingRenders>0)){await b1(0);continue}if(Q1(Q),Z++,T0||Z%M2===0)await b1(0)}Q1(J)};var x1=()=>{if(n2=!1,g1)clearTimeout(g1),g1=null},S2=()=>{if(!h2||A0||!F)return;A0=(async()=>{await b1(0);try{await x2()}catch($){if(m)console.warn("[AkariSub] Full track warmup failed, continuing:",$)}try{if(F)Q1(z2())}catch($){if(m)console.warn("[AkariSub] Post-warmup re-prime failed, continuing:",$)}})().finally(()=>{A0=null})};var f0={Start:0,Duration:1,ReadOrder:2,Layer:3,Style:4,MarginL:5,MarginR:6,MarginV:7},u0={Name:0,Effect:1,Text:2},b={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},K1={Name:0,FontName:1},s2=($)=>{return $2.encode($)},m2=($)=>{if(!i)return 0;let J=s2($),Z=i._malloc(J.length+1);if(!Z)return 0;return self.HEAPU8.set(J,Z),self.HEAPU8[Z+J.length]=0,Z},M0=($)=>{if(!$)return"";let J=$,Z=self.HEAPU8;while(Z[J]!==0)J++;return C2.decode(Z.subarray($,J))},V0=($,J)=>{let Z=m2($);try{return J(Z)}finally{if(Z&&i)i._free(Z)}},g=()=>{if(!F1)throw Error("AkariSub API is not initialized");return F1},T=()=>{if(!F)throw Error("AkariSub instance is not initialized");return F};self.addFont=({font:$})=>K2($,!1);var h1=($)=>{if($=$.trim().toLowerCase(),$.startsWith("@"))$=$.substring(1);if(Z1[$])return;if(Z1[$]=!0,!Y0[$]){if(ew)postMessage({target:"getLocalFont",font:$})}else K2(Y0[$])},K2=($,J=!0)=>{if(typeof $==="string")p1($,(Z)=>{iw(new Uint8Array(Z),J)},console.error);else iw($,J)};var I1=null,l2=()=>{if(I1)return;I1=setTimeout(()=>{if(I1=null,F)g().reloadFonts(F)},16)},c0=($,J)=>{if(!i||!F){if(m)console.warn("[AkariSub] Cannot add embedded font, module or AkariSub not ready:",J);return}try{let Z=g(),Q=i._malloc($.length);if(!Q){console.warn("[AkariSub] Failed to allocate memory for embedded font:",J);return}if(self.HEAPU8.set($,Q),V0(J,(X)=>{Z.addFont(F,X,Q,$.length)}),m)console.log("[AkariSub] Added embedded font:",J,"size:",$.length)}catch(Z){console.warn("[AkariSub] Failed to add embedded font:",J,Z)}},iw=($,J=!0)=>{let Z=J?"/fonts/fallback":"/fonts/attached",Q=J?"fallback-"+r2++:"attached-"+w2++;if(i){try{i.FS_createDataFile(Z,Q,$,!0,!0,!0)}catch(X){console.warn("Failed to write font to filesystem:",Z+"/"+Q,X)}if(!J)c0($,Q);else if(F)c0($,Q);else C0.push({data:$,name:Q})}l2()},$1=($,J=!0)=>{let Z=J?"/fonts/fallback":"/fonts/attached",Q=J?"fallback-"+r2++:"attached-"+w2++;if(i){try{if(i.FS_createDataFile(Z,Q,$,!0,!0,!0),m)console.log("[AkariSub] Wrote font to FS:",Z+"/"+Q,"size:",$.length)}catch(X){console.warn("Failed to write font to filesystem:",Z+"/"+Q,X)}if(!J)c0($,Q);else if(F)c0($,Q);else C0.push({data:$,name:Q})}},y2=($)=>{if(!Y0)return;if($.length>500000){let Z=$.match(/\[V4\+?\s*Styles?\][^\[]*(?=\[|$)/i);if(Z){let U=Z[0].matchAll(/^Style:[^,]*,([^,]+)/gm);for(let K of U)h1(K[1].trim())}let Q=$.match(/\[Events\][\s\S]*/i);if(Q){let U=Q[0].matchAll(/\\fn([^\\}]*?)[\\}]/g),K=0;for(let Y of U)if(h1(Y[1]),++K>=1000)break}}else{let Z=mw($,!0);for(let X=0;X<Z.length;X++)for(let U=0;U<Z[X].body.length;U++){let K=Z[X].body[U];if(K.key==="Style"&&typeof K.value==="object"&&!Array.isArray(K.value))h1(K.value.Fontname)}let Q=$.match(/\[Events\][\s\S]*/i);if(Q){let U=Q[0].matchAll(/\\fn([^\\}]*?)[\\}]/g);for(let K of U)h1(K[1])}}},T1=($,J)=>{let Z=new XMLHttpRequest;return Z.open("GET",$,!1),Z.responseType=J?"arraybuffer":"text",Z.send(null),Z.response},p1=($,J,Z)=>{let Q=new XMLHttpRequest;Q.open("GET",$,!0),Q.responseType="arraybuffer",Q.onload=()=>{if((Q.status===200||Q.status===0)&&Q.response)return J(Q.response)},Q.onerror=Z,Q.send(null)};self.setTrack=({content:$})=>{if(x1(),A0=null,y2($),R1)$=D1($);if(C1)$=_1($);let J=g(),Z=T();V0($,(Q)=>{J.createTrackMem(Z,Q)}),x0(),X1=Q2(),H0=P1[J.getTrackColorSpace(Z)],G1=!0,postMessage({target:"verifyColorSpace",subtitleColorSpace:H0})};self.getColorSpace=()=>{postMessage({target:"verifyColorSpace",subtitleColorSpace:H0})};self.freeTrack=()=>{x1(),A0=null,X1=null;let $=g(),J=T();$.removeTrack(J),x0()};self.setTrackByUrl=({url:$})=>{self.setTrack({content:T1($)})};var b0=!0,z2=()=>{let $=(P0()-z1)/1000;if(b0)return o0;else{if($>5)console.error("Didn't receive currentTime > 5 seconds. Assuming video was paused."),j2(!0);return o0+$*aw}},t2=($)=>{if(o0=$,z1=P0(),T0)return;if(!J0)if(L1)J0=S1(y1);else y1(),L1=!0,setTimeout(()=>{L1=!1},20)},j2=($)=>{if(T0){if(b0=$,J0)dw(J0),J0=null;return}if($!==b0)if(b0=$,$){if(J0)dw(J0),J0=null}else z1=P0(),J0=S1(y1)},i2=()=>{if(p0||t.length===0)return;if(t.length>1){let J=t.length-1;q.framesDropped+=J;let Z=t[t.length-1];t.length=0,t.push(Z)}let $=t.shift();if(!$)return;S0($.time,$.force)},W0=()=>{p0=!1,i2()},S0=($,J)=>{if(p0){let O={time:$,force:J?1:0};if(O.force)t.length=0;else{let o=t[t.length-1];if(o&&Math.abs(o.time-O.time)>0.25)t.length=0}if(t.length>=I2)t.shift(),q.framesDropped++;t.push(O);return}p0=!0,G2();let Z={},Q=performance.now();q.renderStartTime=Q,q.pendingRenders++;let X=g(),U=T(),K=J?1:0;c1(v2);let Y=n1==="wasm"?X.renderBlendCollect(U,$,K,e,Q0):X.renderImageCollect(U,$,K,e,Q0),N=new Int32Array(self.wasmMemory.buffer,e,M1),S=N[0],M=N[1],I=performance.now()-Q;if(q.lastRenderTime=I,q.totalRenderTime+=I,q.maxRenderTime=Math.max(q.maxRenderTime,I),I>0)q.minRenderTime=Math.min(q.minRenderTime,I);if(S!==0||J)q.framesRendered++,q.cacheMisses++;else q.cacheHits++;if(m){let O=performance.now(),o=N[2];Z.WASMRenderTime=o-Q,Z.WASMBitmapDecodeTime=O-o,Z.JSRenderTime=Date.now()}if(S!==0||J){let O=b2,o=T2;if(O.length=0,o.length=0,Y===0)return E1({images:O,buffers:o,times:Z});let j=e+M1*Int32Array.BYTES_PER_ELEMENT,A=new Int32Array(self.wasmMemory.buffer,j,Y*v1);if(U0&&n0!==!0){let H=p2;H.length=Y;for(let R=0;R<Y;++R){let W=R*v1,D=tw(R);D.x=A[W],D.y=A[W+1],D.w=A[W+2],D.h=A[W+3],D.image=0;let C=A[W+4],V=D.w*D.h*4,p=new Uint8ClampedArray(self.wasmMemory.buffer,C,V),u=new ImageData(p,D.w,D.h);H[R]=F0?createImageBitmap(u,{premultiplyAlpha:"none",colorSpaceConversion:"none"}):createImageBitmap(u),O[R]=D}Promise.all(H).then((R)=>{for(let W=0;W<Y;W++)O[W].image=R[W];if(m)Z.JSBitmapGenerationTime=Date.now()-(Z.JSRenderTime||0);E1({images:O,buffers:R,times:Z})}).catch(()=>{if(F0)F0=!1,console.warn("[AkariSub] createImageBitmap options not supported, disabling"),q.pendingRenders--,W0(),S0($,J);else q.pendingRenders--,postMessage({target:"unbusy"}),W0()})}else{for(let H=0;H<Y;++H){let R=H*v1,W=tw(H);if(W.x=A[R],W.y=A[R+1],W.w=A[R+2],W.h=A[R+3],W.image=A[R+4],!N0){let D=W.image,C=W.w*W.h*4,V=new Uint8ClampedArray(C);V.set(self.HEAPU8C.subarray(D,D+C)),o.push(V.buffer),W.image=V}O[H]=W}E1({images:O,buffers:o,times:Z})}}else q.pendingRenders--,postMessage({target:"unbusy"}),W0()};self.demand=({time:$})=>{o0=$,z1=P0();let J=G1?1:0;G1=!1,S0($,J)};var y1=($)=>{if(J0=null,S0(z2(),$),!b0)J0=S1(y1)},E1=({times:$,images:J,buffers:Z})=>{q.pendingRenders--;let{width:Q,height:X}=self,U=J.length,K={target:"render",asyncRender:U0,images:J,times:$,width:Q,height:X,colorSpace:H0};if(n0){if(X0.height!==X||X0.width!==Q)X0.width=Q,X0.height=X;if(N0.clearRect(0,0,Q,X),U0)for(let Y=0;Y<U;Y++){let N=J[Y];if(N.image)N0.drawImage(N.image,N.x,N.y),N.image.close()}else for(let Y=0;Y<U;Y++){let N=J[Y];if(N.image){let{w:S,h:M}=N;if(B0.width!==S||B0.height!==M)B0.width=S,B0.height=M;let E=N.image,I=S*M*4,O=self.HEAPU8C.subarray(E,E+I);f2.putImageData(new ImageData(O,S,M),0,0),N0.drawImage(B0,N.x,N.y)}}if(n0==="hybrid"){if(!U){postMessage(K),W0();return}if(m)$.bitmaps=U;try{let Y=X0.transferToImageBitmap(),N={...K,images:[{image:Y,x:0,y:0}],asyncRender:!0};postMessage(N,[Y]),W0()}catch{postMessage({target:"unbusy"}),W0()}}else{if(m){$.JSRenderTime=Date.now()-($.JSRenderTime||0)-($.JSBitmapGenerationTime||0);let Y=0;for(let N in $)Y+=$[N]||0;console.log("Bitmaps: "+U+" Total: "+(Y|0)+"ms",$)}postMessage({target:"unbusy"}),W0()}}else postMessage(K,Z),W0()},S1=self.requestAnimationFrame?self.requestAnimationFrame.bind(self):(()=>{let $=0;return(J)=>{let Z=P0();if($===0)$=Z+1000/J1;else while(Z+2>=$)$+=1000/J1;let Q=Math.max($-Z,0);return setTimeout(J,Q)}})(),dw=self.cancelAnimationFrame?self.cancelAnimationFrame.bind(self):clearTimeout;self.init=async($)=>{if(R2=$.hasBitmapBug,h2=!!$.fullTrackWarmup,typeof $.initialTime==="number"&&Number.isFinite($.initialTime))o0=$.initialTime;let J=self.fetch,Z=(K)=>{if(WebAssembly.instantiateStreaming)self.fetch=(Y)=>J(K)},Q=()=>{self.fetch=J},X=(K)=>{return Z(K),sw({wasm:!WebAssembly.instantiateStreaming?T1(K,!0):void 0}).finally(Q)},U=async(K)=>{i=K,F1={create:K._akarisub_create,destroy:K._akarisub_destroy,setDropAnimations:K._akarisub_set_drop_animations,createTrackMem:K._akarisub_create_track_mem,removeTrack:K._akarisub_remove_track,resizeCanvas:K._akarisub_resize_canvas,addFont:K._akarisub_add_font,reloadFonts:K._akarisub_reload_fonts,setDefaultFont:K._akarisub_set_default_font,setFallbackFonts:K._akarisub_set_fallback_fonts,setMemoryLimits:K._akarisub_set_memory_limits,getEventCount:K._akarisub_get_event_count,allocEvent:K._akarisub_alloc_event,removeEvent:K._akarisub_remove_event,getStyleCount:K._akarisub_get_style_count,allocStyle:K._akarisub_alloc_style,removeStyle:K._akarisub_remove_style,styleOverrideIndex:K._akarisub_style_override_index,disableStyleOverride:K._akarisub_disable_style_override,getTrackColorSpace:K._akarisub_get_track_color_space,eventGetInt:K._akarisub_event_get_int,eventSetInt:K._akarisub_event_set_int,eventGetStr:K._akarisub_event_get_str,eventSetStr:K._akarisub_event_set_str,styleGetNum:K._akarisub_style_get_num,styleSetNum:K._akarisub_style_set_num,styleGetStr:K._akarisub_style_get_str,styleSetStr:K._akarisub_style_set_str,renderBlendCollect:K._akarisub_render_blend_collect,renderImageCollect:K._akarisub_render_image_collect};let Y=[],N=new Set;if($.fallbackFonts&&$.fallbackFonts.length>0)for(let j of $.fallbackFonts){let A=j.trim(),P=A.toLowerCase();if(P&&!N.has(P))N.add(P),Y.push(A)}try{K.FS_createPath("/","fonts",!0,!0),K.FS_createPath("/fonts","attached",!0,!0),K.FS_createPath("/fonts","fallback",!0,!0),K.FS_createPath("/","fontconfig",!0,!0),K.FS_createPath("/","assets",!0,!0),K.FS_createPath("/","etc",!0,!0),K.FS_createPath("/etc","fonts",!0,!0);let j=`<?xml version="1.0"?>
|
|
1
|
+
(()=>{async function F2($={}){var Z,h=$,K=(...w)=>{console.log(...w)},X=(...w)=>{console.error(...w)};function U(){B?.(h)}(function(){var w=typeof WebAssembly<"u"&&WebAssembly.instantiateStreaming;w&&(WebAssembly.instantiateStreaming=function(f,r){var J=null;return f=Promise.resolve(f).then(function(v){return J=v.clone(),v}),w.call(WebAssembly,f,r).catch(function(v){if(console.warn("[AkariSub] instantiateStreaming failed, using ArrayBuffer fallback:",v&&v.message||v),!J)throw v;return J.arrayBuffer().then(function(G){return WebAssembly.instantiate(G,r)})})})})(),K=(w)=>{w==="AkariSub: No usable fontconfig configuration file found, using fallback."||w.startsWith("Unable to revert mtime:")||w.trim()===""?console.debug(w):console.log(w)},X=(w)=>{w==="Fontconfig error: Cannot load default config file: No such file: (null)"||w==="Fontconfig error: Cannot load default config file: File not found"||w==="Fontconfig error: No writable cache directories"||w.includes("/var/cache/fontconfig")||w.includes("/.cache/fontconfig")||w.includes("/.local/share/fonts")?console.debug(w):console.error(w)};class Q{}class V extends Q{}var B,c=!1;function b(){var w=H.buffer;A=new Int8Array(w),I=new Int16Array(w),N=new Uint8Array(w),new Uint16Array(w),E=new Int32Array(w),_=new Uint32Array(w),new Float32Array(w),new Float64Array(w),W=new BigInt64Array(w),Y=new BigUint64Array(w)}H=new WebAssembly.Memory({initial:256,maximum:32768}),b();var I,E,W,A,_,Y,N,H,D=new TextDecoder,O=(w,f)=>{for(var r=f+void 0;w[f]&&!(f>=r);)++f;return f},R=(w)=>w?D.decode(N.subarray(w,O(N,w))):"",M=(w,f)=>{for(var r=0,J=w.length-1;J>=0;J--){var v=w[J];v==="."?w.splice(J,1):v===".."?(w.splice(J,1),r++):r&&(w.splice(J,1),r--)}if(f)for(;r;r--)w.unshift("..");return w},y=(w)=>{var f=w.charAt(0)==="/",r=w.slice(-1)==="/";return(w=M(w.split("/").filter((J)=>!!J),!f).join("/"))||f||(w="."),w&&r&&(w+="/"),(f?"/":"")+w},x=(w)=>{var f=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(w).slice(1);if(w=f[0],f=f[1],!w&&!f)return".";return f&&=f.slice(0,-1),w+f},C=(w)=>w&&w.match(/([^\/]+|\/)\/*$/)[1],K0=()=>(w)=>(crypto.getRandomValues(w),0),d=(w)=>(d=K0())(w),$0=(...w)=>{for(var f="",r=!1,J=w.length-1;J>=-1&&!r;J--){if(r=J>=0?w[J]:"/",typeof r!="string")throw TypeError("Arguments to path.resolve must be strings");if(!r)return"";f=r+"/"+f,r=r.charAt(0)==="/"}return f=M(f.split("/").filter((v)=>!!v),!r).join("/"),(r?"/":"")+f||"."},L0=(w,f)=>{function r(z){for(var q=0;q<z.length&&z[q]==="";q++);for(var o=z.length-1;o>=0&&z[o]==="";o--);return q>o?[]:z.slice(q,o-q+1)}w=$0(w).slice(1),f=$0(f).slice(1),w=r(w.split("/")),f=r(f.split("/"));for(var J=Math.min(w.length,f.length),v=J,G=0;G<J;G++)if(w[G]!==f[G]){v=G;break}J=[];for(G=v;G<w.length;G++)J.push("..");return J=J.concat(f.slice(v)),J.join("/")},m0=(w)=>{var f=O(w,0);return D.decode(w.buffer?w.subarray(0,f):new Uint8Array(w.slice(0,f)))},t1=[],l0=(w)=>{for(var f=0,r=0;r<w.length;++r){var J=w.charCodeAt(r);J<=127?f++:J<=2047?f+=2:J>=55296&&J<=57343?(f+=4,++r):f+=3}return f},g0=(w,f,r,J)=>{if(!(J>0))return 0;var v=r;J=r+J-1;for(var G=0;G<w.length;++G){var z=w.codePointAt(G);if(z<=127){if(r>=J)break;f[r++]=z}else if(z<=2047){if(r+1>=J)break;f[r++]=192|z>>6,f[r++]=128|z&63}else if(z<=65535){if(r+2>=J)break;f[r++]=224|z>>12,f[r++]=128|z>>6&63,f[r++]=128|z&63}else{if(r+3>=J)break;f[r++]=240|z>>18,f[r++]=128|z>>12&63,f[r++]=128|z>>6&63,f[r++]=128|z&63,G++}}return f[r]=0,r-v},d1=[];function a1(w,f){d1[w]={input:[],output:[],Ga:f},q1(w,N2)}var N2={open(w){var f=d1[w.node.Oa];if(!f)throw new j(43);w.fa=f,w.seekable=!1},close(w){w.fa.Ga.Pa(w.fa)},Pa(w){w.fa.Ga.Pa(w.fa)},read(w,f,r,J){if(!w.fa||!w.fa.Ga.$a)throw new j(60);for(var v=0,G=0;G<J;G++){try{var z=w.fa.Ga.$a(w.fa)}catch(q){throw new j(29)}if(z===void 0&&v===0)throw new j(6);if(z===null||z===void 0)break;v++,f[r+G]=z}return v&&(w.node.Fa=Date.now()),v},write(w,f,r,J){if(!w.fa||!w.fa.Ga.Ya)throw new j(60);try{for(var v=0;v<J;v++)w.fa.Ga.Ya(w.fa,f[r+v])}catch(G){throw new j(29)}return J&&(w.node.ra=w.node.qa=Date.now()),v}},H2={$a(){return t1.length?t1.shift():null},Ya(w,f){f===null||f===10?(K(m0(w.output)),w.output=[]):f!=0&&w.output.push(f)},Pa(w){w.output?.length>0&&(K(m0(w.output)),w.output=[])},mb(){return{xb:25856,zb:5,wb:191,yb:35387,ub:[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]}},nb(){return 0},ob(){return[24,80]}},A2={Ya(w,f){f===null||f===10?(X(m0(w.output)),w.output=[]):f!=0&&w.output.push(f)},Pa(w){w.output?.length>0&&(X(m0(w.output)),w.output=[])}},k={wa:null,ua(){return k.createNode(null,"/",16895,0)},createNode(w,f,r,J){if((r&61440)===24576||(r&61440)===4096)throw new j(63);return k.wa||(k.wa={dir:{node:{ta:k.ca.ta,Ea:k.ca.Ea,Na:k.ca.Na,Qa:k.ca.Qa,Sa:k.ca.Sa,Va:k.ca.Va,Ta:k.ca.Ta,Ra:k.ca.Ra,Ua:k.ca.Ua},stream:{va:k.da.va}},file:{node:{ta:k.ca.ta,Ea:k.ca.Ea},stream:{va:k.da.va,read:k.da.read,write:k.da.write,bb:k.da.bb,eb:k.da.eb}},link:{node:{ta:k.ca.ta,Ea:k.ca.Ea,La:k.ca.La},stream:{}},Za:{node:{ta:k.ca.ta,Ea:k.ca.Ea},stream:g2}}),r=Jw(w,f,r,J),a(r.mode)?(r.ca=k.wa.dir.node,r.da=k.wa.dir.stream,r.ga={}):(r.mode&61440)===32768?(r.ca=k.wa.file.node,r.da=k.wa.file.stream,r.sa=0,r.ga=k.ib??(k.ib=new Uint8Array(0))):(r.mode&61440)===40960?(r.ca=k.wa.link.node,r.da=k.wa.link.stream):(r.mode&61440)===8192&&(r.ca=k.wa.Za.node,r.da=k.wa.Za.stream),r.Fa=r.ra=r.qa=Date.now(),w&&(w.ga[f]=r,w.Fa=w.ra=w.qa=r.Fa),r},ca:{ta(w){var f={};return f.hb=(w.mode&61440)===8192?w.id:1,f.kb=w.id,f.mode=w.mode,f.qb=1,f.uid=0,f.jb=0,f.Oa=w.Oa,a(w.mode)?f.size=4096:(w.mode&61440)===32768?f.size=w.sa:(w.mode&61440)===40960?f.size=w.link.length:f.size=0,f.Fa=new Date(w.Fa),f.ra=new Date(w.ra),f.qa=new Date(w.qa),f.fb=4096,f.gb=Math.ceil(f.size/f.fb),f},Ea(w,f){for(var r of["mode","atime","mtime","ctime"])f[r]!=null&&(w[r]=f[r]);f.size!==void 0&&(f=f.size,w.sa!=f&&(r=w.ga,w.ga=new Uint8Array(f),w.ga.set(r.subarray(0,Math.min(f,w.sa))),w.sa=f))},Na(){throw k.Wa||(k.Wa=new j(44),k.Wa.stack="<generic error, no stack>"),k.Wa},Qa(w,f,r,J){return k.createNode(w,f,r,J)},Sa(w,f,r){try{var J=h0(f,r)}catch(G){}if(J){if(a(w.mode))for(var v in J.ga)throw new j(55);t0(J)}delete w.parent.ga[w.name],f.ga[r]=w,w.name=r,f.qa=f.ra=w.parent.qa=w.parent.ra=Date.now()},Va(w,f){delete w.ga[f],w.qa=w.ra=Date.now()},Ta(w,f){var r=h0(w,f),J;for(J in r.ga)throw new j(55);delete w.ga[f],w.qa=w.ra=Date.now()},Ra(w){return[".","..",...Object.keys(w.ga)]},Ua(w,f,r){return w=k.createNode(w,f,41471,0),w.link=r,w},La(w){if((w.mode&61440)!==40960)throw new j(28);return w.link}},da:{read(w,f,r,J,v){if(v>=w.node.sa)return 0;return J=Math.min(w.node.sa-v,J),f.set(w.node.ga.subarray(v,v+J),r),J},write(w,f,r,J,v,G){if(f.buffer===A.buffer&&(G=!1),!J)return 0;if(w=w.node,w.ra=w.qa=Date.now(),G)w.ga=f.subarray(r,r+J),w.sa=J;else if(w.sa===0&&v===0)w.ga=f.slice(r,r+J),w.sa=J;else{G=v+J;var z=w.ga.length;z>=G||(G=Math.max(G,z*(z<1048576?2:1.125)>>>0),z&&(G=Math.max(G,256)),z=w.ga.subarray(0,w.sa),w.ga=new Uint8Array(G),w.ga.set(z)),w.ga.set(f.subarray(r,r+J),v),w.sa=Math.max(w.sa,v+J)}return J},va(w,f,r){if(r===1?f+=w.position:r===2&&(w.node.mode&61440)===32768&&(f+=w.node.sa),f<0)throw new j(28);return f},bb(w,f,r,J,v){if((w.node.mode&61440)!==32768)throw new j(43);if(w=w.node.ga,v&2||w.buffer!==A.buffer){v=!0,J=Math.ceil(f/65536)*65536;var G=sw(65536,J);if(G&&N.fill(0,G,G+J),J=G,!J)throw new j(48);if(w){if(r>0||r+f<w.length)w.subarray?w=w.subarray(r,r+f):w=Array.prototype.slice.call(w,r,r+f);A.set(w,J)}}else v=!1,J=w.byteOffset;return{Db:J,tb:v}},eb(w,f,r,J){return k.da.write(w,f,0,J,r,!1),0}}},e1=(w,f)=>{var r=0;return w&&(r|=365),f&&(r|=146),r},Y1=null,ww={},H0=[],P2=1,W0=null,fw=!1,rw=!0,j=class{name="ErrnoError";constructor(w){this.ea=w}},_2=class{shared={};node=null;get flags(){return this.shared.flags}set flags(w){this.shared.flags=w}get position(){return this.shared.position}set position(w){this.shared.position=w}},D2=class{ca={};da={};Ia=null;constructor(w,f,r,J){w||=this,this.parent=w,this.ua=w.ua,this.id=P2++,this.name=f,this.mode=r,this.Oa=J,this.Fa=this.ra=this.qa=Date.now()}get read(){return(this.mode&365)===365}set read(w){w?this.mode|=365:this.mode&=-366}get write(){return(this.mode&146)===146}set write(w){w?this.mode|=146:this.mode&=-147}};function i(w,f={}){if(!w)throw new j(44);f.Xa??(f.Xa=!0),w.charAt(0)==="/"||(w="//"+w);var r=0;w:for(;r<40;r++){w=w.split("/").filter((q)=>!!q);for(var J=Y1,v="/",G=0;G<w.length;G++){var z=G===w.length-1;if(z&&f.parent)break;if(w[G]!==".")if(w[G]==="..")if(v=x(v),J===J.parent){w=v+"/"+w.slice(G+1).join("/"),r--;continue w}else J=J.parent;else{v=y(v+"/"+w[G]);try{J=h0(J,w[G])}catch(q){if(q?.ea===44&&z&&f.rb)return{path:v};throw q}if(!J.Ia||z&&!f.Xa||(J=J.Ia.root),(J.mode&61440)===40960&&(!z||f.Ja)){if(!J.ca.La)throw new j(52);J=J.ca.La(J),J.charAt(0)==="/"||(J=x(v)+"/"+J),w=J+"/"+w.slice(G+1).join("/");continue w}}}return{path:v,node:J}}throw new j(32)}function i0(w){for(var f;;){if(w===w.parent)return w=w.ua.cb,f?w[w.length-1]!=="/"?`${w}/${f}`:w+f:w;f=f?`${w.name}/${f}`:w.name,w=w.parent}}function B1(w,f){for(var r=0,J=0;J<f.length;J++)r=(r<<5)-r+f.charCodeAt(J)|0;return(w+r>>>0)%W0.length}function $w(w){var f=B1(w.parent.id,w.name);w.Ma=W0[f],W0[f]=w}function t0(w){var f=B1(w.parent.id,w.name);if(W0[f]===w)W0[f]=w.Ma;else for(f=W0[f];f;){if(f.Ma===w){f.Ma=w.Ma;break}f=f.Ma}}function h0(w,f){var r=a(w.mode)?(r=y0(w,"x"))?r:w.ca.Na?0:2:54;if(r)throw new j(r);for(r=W0[B1(w.id,f)];r;r=r.Ma){var J=r.name;if(r.parent.id===w.id&&J===f)return r}return w.ca.Na(w,f)}function Jw(w,f,r,J){return w=new D2(w,f,r,J),$w(w),w}function a(w){return(w&61440)===16384}function y0(w,f){return rw?0:f.includes("r")&&!(w.mode&292)||f.includes("w")&&!(w.mode&146)||f.includes("x")&&!(w.mode&73)?2:0}function k1(w,f){if(!a(w.mode))return 54;try{return h0(w,f),20}catch(r){}return y0(w,"wx")}function d0(w,f,r){try{var J=h0(w,f)}catch(v){return v.ea}if(w=y0(w,"wx"))return w;if(r){if(!a(J.mode))return 54;if(J===J.parent||i0(J)==="/")return 10}else if(a(J.mode))return 31;return 0}function I0(w,f){if(!w)throw new j(f);return w}function G0(w){if(w=H0[w],!w)throw new j(8);return w}function vw(w,f=-1){if(w=Object.assign(new _2,w),f==-1)w:{for(f=0;f<=4096;f++)if(!H0[f])break w;throw new j(33)}return w.Ha=f,H0[f]=w}function L2(w,f=-1){return w=vw(w,f),w.da?.Bb?.(w),w}function Zw(w,f){var r=void 0,J=r?null:w;r??=w.ca.Ea,I0(r,63);try{r(J,f)}catch(v){if(v instanceof RangeError)throw new j(22);throw v}}var g2={open(w){w.da=ww[w.node.Oa].da,w.da.open?.(w)},va(){throw new j(70)}};function q1(w,f){ww[w]={da:f}}function hw(w,f){var r=f==="/";if(r&&Y1)throw new j(10);if(!r&&f){var J=i(f,{Xa:!1});if(f=J.path,J=J.node,J.Ia)throw new j(10);if(!a(J.mode))throw new j(54)}f={type:w,Cb:{},cb:f,pb:[]},w=w.ua(f),w.ua=f,f.root=w,r?Y1=w:J&&(J.Ia=f,J.ua&&J.ua.pb.push(f))}function a0(w,f,r){var J=i(w,{parent:!0}).node;if(w=C(w),!w)throw new j(28);if(w==="."||w==="..")throw new j(20);var v=k1(J,w);if(v)throw new j(v);if(!J.ca.Qa)throw new j(63);return J.ca.Qa(J,w,f,r)}function I2(w,f=438){return a0(w,f&4095|32768,0)}function J0(w,f=511){return a0(w,f&1023|16384,0)}function e0(w,f,r){typeof r>"u"&&(r=f,f=438),a0(w,f|8192,r)}function N1(w,f){if(!$0(w))throw new j(44);var r=i(f,{parent:!0}).node;if(!r)throw new j(44);f=C(f);var J=k1(r,f);if(J)throw new j(J);if(!r.ca.Ua)throw new j(63);r.ca.Ua(r,f,w)}function Gw(w){var f=i(w,{parent:!0}).node;w=C(w);var r=h0(f,w),J=d0(f,w,!0);if(J)throw new j(J);if(!f.ca.Ta)throw new j(63);if(r.Ia)throw new j(10);f.ca.Ta(f,w),t0(r)}function w1(w,f){return w=i(w,{Ja:!f}).node,I0(w.ca.ta,63)(w)}function f1(w,f){w=typeof w=="string"?i(w,{Ja:!0}).node:w,Zw(w,{mode:f&4095|w.mode&-4096,qa:Date.now(),Ab:void 0})}function E0(w,f,r=438){if(w==="")throw new j(44);if(typeof f=="string"){var J={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090}[f];if(typeof J>"u")throw Error(`Unknown file open mode: ${f}`);f=J}if(r=f&64?r&4095|32768:0,typeof w=="object")J=w;else{var v=w.endsWith("/"),G=i(w,{Ja:!(f&131072),rb:!0});J=G.node,w=G.path}if(G=!1,f&64)if(J){if(f&128)throw new j(20)}else{if(v)throw new j(31);J=a0(w,r|511,0),G=!0}if(!J)throw new j(44);if((J.mode&61440)===8192&&(f&=-513),f&65536&&!a(J.mode))throw new j(54);if(!G&&(J?(J.mode&61440)===40960?v=32:(v=["r","w","rw"][f&3],f&512&&(v+="w"),v=a(J.mode)&&(v!=="r"||f&576)?31:y0(J,v)):v=44,v))throw new j(v);if(f&512&&!G){if(v=J,v=typeof v=="string"?i(v,{Ja:!0}).node:v,a(v.mode))throw new j(31);if((v.mode&61440)!==32768)throw new j(28);if(w=y0(v,"w"))throw new j(w);Zw(v,{size:0,timestamp:Date.now()})}return f=vw({node:J,path:i0(J),flags:f&-131713,seekable:!0,position:0,da:J.da,sb:[],error:!1}),f.da.open&&f.da.open(f),G&&f1(J,r&511),f}function Qw(w){if(w.Ha===null)throw new j(8);w.Ka&&(w.Ka=null);try{w.da.close&&w.da.close(w)}catch(f){throw f}finally{H0[w.Ha]=null}w.Ha=null}function r1(w,f,r){if(w.Ha===null)throw new j(8);if(!w.seekable||!w.da.va)throw new j(70);if(r!=0&&r!=1&&r!=2)throw new j(28);return w.position=w.da.va(w,f,r),w.sb=[],w.position}function Kw(w,f,r,J,v,G){if(J<0||v<0)throw new j(28);if(w.Ha===null)throw new j(8);if((w.flags&2097155)===0)throw new j(8);if(a(w.node.mode))throw new j(31);if(!w.da.write)throw new j(28);w.seekable&&w.flags&1024&&r1(w,0,2);var z=typeof v<"u";if(!z)v=w.position;else if(!w.seekable)throw new j(70);return f=w.da.write(w,f,r,J,v,G),z||(w.position+=f),f}function E2(w,f){w=typeof w=="string"?w:i0(w);for(f=f.split("/").reverse();f.length;){var r=f.pop();if(r){var J=y(w+"/"+r);try{J0(J)}catch(v){if(v.ea!=20)throw v}w=J}}return J}function o2(w,f,r,J,v,G){var z=f;w&&(w=typeof w=="string"?w:i0(w),z=f?y(w+"/"+f):w),w=e1(J,v),z=I2(z,w),r&&(f=r,typeof f=="string"&&(r=Array(l0(f)+1),f=g0(f,r,0,r.length),r.length=f,f=r),f.subarray||(f=new Uint8Array(f)),r=f,f1(z,w|146),f=E0(z,577),Kw(f,r,0,r.length,0,G),Qw(f),f1(z,w))}function o0(w,f){w=y("/dev/"+w);var r=e1(!!f,!1);o0.ab??(o0.ab=64);var J=o0.ab++<<8|0;q1(J,{open(v){v.seekable=!1},close(){},read(v,G,z,q){for(var o=0,L=0;L<q;L++){try{var S=f()}catch(m){throw new j(29)}if(S===void 0&&o===0)throw new j(6);if(S===null||S===void 0)break;o++,G[z+L]=S}return o&&(v.node.Fa=Date.now()),o},write(v,G,z,q){for(var o=0;o<q;o++)try{(void 0)(G[z+o])}catch(L){throw new j(29)}return q&&(v.node.ra=v.node.qa=Date.now()),o}}),e0(w,r,J)}var p={};function z0(w,f,r){if(f.charAt(0)==="/")return f;if(w=w===-100?"/":G0(w).path,f.length==0){if(!r)throw new j(44);return w}return w+"/"+f}function $1(w,f){_[w>>2]=f.hb,_[w+4>>2]=f.mode,_[w+8>>2]=f.qb,_[w+12>>2]=f.uid,_[w+16>>2]=f.jb,_[w+20>>2]=f.Oa,W[w+24>>3]=BigInt(f.size),E[w+32>>2]=4096,E[w+36>>2]=f.gb;var r=f.Fa.getTime(),J=f.ra.getTime(),v=f.qa.getTime();return W[w+40>>3]=BigInt(Math.floor(r/1000)),_[w+48>>2]=r%1000*1000*1000,W[w+56>>3]=BigInt(Math.floor(J/1000)),_[w+64>>2]=J%1000*1000*1000,W[w+72>>3]=BigInt(Math.floor(v/1000)),_[w+80>>2]=v%1000*1000*1000,W[w+88>>3]=BigInt(f.kb),0}var R0=void 0,j0=()=>{var w=E[+R0>>2];return R0+=4,w},H1={},zw=()=>{if(!A1){var w={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8",_:"./this.program"},f;for(f in H1)H1[f]===void 0?delete w[f]:w[f]=H1[f];var r=[];for(f in w)r.push(`${f}=${w[f]}`);A1=r}return A1},A1,jw=[],Xw=(w)=>{var f=jw[w];return f||(jw[w]=f=mw.get(w)),f};W0=Array(4096),hw(k,"/"),J0("/tmp"),J0("/home"),J0("/home/web_user"),function(){J0("/dev"),q1(259,{read:()=>0,write:(J,v,G,z)=>z,va:()=>0}),e0("/dev/null",259),a1(1280,H2),a1(1536,A2),e0("/dev/tty",1280),e0("/dev/tty1",1536);var w=new Uint8Array(1024),f=0,r=()=>{return f===0&&(d(w),f=w.byteLength),w[--f]};o0("random",r),o0("urandom",r),J0("/dev/shm"),J0("/dev/shm/tmp")}(),function(){J0("/proc");var w=J0("/proc/self");J0("/proc/self/fd"),hw({ua(){var f=Jw(w,"fd",16895,73);return f.da={va:k.da.va},f.ca={Na(r,J){r=+J;var v=G0(r);return r={parent:null,ua:{cb:"fake"},ca:{La:()=>v.path},id:r+1},r.parent=r},Ra(){return Array.from(H0.entries()).filter(([,r])=>r).map(([r])=>r.toString())}},f}},"/proc/self/fd")}();var Uw,Ow,Ww,Vw,yw,Yw,Bw,kw,qw,Nw,Hw,Aw,Pw,_w,Dw,Lw,gw,Iw,Ew,ow,Rw,Fw,Mw,Cw,bw,Tw,uw,xw,pw,Sw,cw,nw,sw,P1,_1,D1,mw,R2={a:{b:(w,f,r,J)=>{throw`Assertion failed: ${R(w)}, at: `+[f?R(f):"unknown filename",r,J?R(J):"unknown function"]},H:function(w,f){try{return w=R(w),f1(w,f),0}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return-r.ea}},k:function(w,f,r){try{if(f=R(f),f=z0(w,f),r&-8)return-28;var J=i(f,{Ja:!0}).node;if(!J)return-44;return w="",r&4&&(w+="r"),r&2&&(w+="w"),r&1&&(w+="x"),w&&y0(J,w)?-2:0}catch(v){if(typeof p>"u"||v.name!=="ErrnoError")throw v;return-v.ea}},c:function(w,f,r){R0=r;try{var J=G0(w);switch(f){case 0:var v=j0();if(v<0)break;for(;H0[v];)v++;return L2(J,v).Ha;case 1:case 2:return 0;case 3:return J.flags;case 4:return v=j0(),J.flags=J.flags&-289793|v&289792,0;case 12:return v=j0(),I[v+0>>1]=2,0;case 13:case 14:return 0}return-28}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},G:function(w,f){try{var r=G0(w),J=r.node,v=r.da.ta;w=v?r:J,v??=J.ca.ta,I0(v,63);var G=v(w);return $1(f,G)}catch(z){if(typeof p>"u"||z.name!=="ErrnoError")throw z;return-z.ea}},C:function(w,f){try{if(f===0)return-28;var r=l0("/")+1;if(f<r)return-68;return g0("/",N,w,f),r}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return-J.ea}},w:function(w,f,r){try{var J=G0(w);if(!J.Ka){var v=i(J.path,{Ja:!0}).node,G=I0(v.ca.Ra,54)(v);J.Ka=G}w=0;var z=r1(J,0,1),q=Math.floor(z/280),o=Math.min(J.Ka.length,q+Math.floor(r/280));for(r=q;r<o;r++){var L=J.Ka[r];if(L===".")var S=J.node.id,m=4;else if(L==="..")S=i(J.path,{parent:!0}).node.id,m=4;else{try{var w0=h0(J.node,L)}catch(f0){if(f0?.ea===28)continue;throw f0}S=w0.id,m=(w0.mode&61440)===8192?2:a(w0.mode)?4:(w0.mode&61440)===40960?10:8}W[f+w>>3]=BigInt(S),W[f+w+8>>3]=BigInt((r+1)*280),I[f+w+16>>1]=280,A[f+w+18]=m,g0(L,N,f+w+19,256),w+=280}return r1(J,r*280,0),w}catch(f0){if(typeof p>"u"||f0.name!=="ErrnoError")throw f0;return-f0.ea}},m:function(w,f,r){R0=r;try{var J=G0(w);switch(f){case 21509:return J.fa?0:-59;case 21505:if(!J.fa)return-59;if(J.fa.Ga.mb){w=[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];var v=j0();E[v>>2]=25856,E[v+4>>2]=5,E[v+8>>2]=191,E[v+12>>2]=35387;for(var G=0;G<32;G++)A[v+G+17]=w[G]||0}return 0;case 21510:case 21511:case 21512:return J.fa?0:-59;case 21506:case 21507:case 21508:if(!J.fa)return-59;if(J.fa.Ga.nb)for(v=j0(),w=[],G=0;G<32;G++)w.push(A[v+G+17]);return 0;case 21519:if(!J.fa)return-59;return v=j0(),E[v>>2]=0;case 21520:return J.fa?-28:-59;case 21537:case 21531:if(v=j0(),!J.da.lb)throw new j(59);return J.da.lb(J,f,v);case 21523:if(!J.fa)return-59;return J.fa.Ga.ob&&(G=[24,80],v=j0(),I[v>>1]=G[0],I[v+2>>1]=G[1]),0;case 21524:return J.fa?0:-59;case 21515:return J.fa?0:-59;default:return-28}}catch(z){if(typeof p>"u"||z.name!=="ErrnoError")throw z;return-z.ea}},D:function(w,f){try{return w=R(w),$1(f,w1(w,!0))}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return-r.ea}},x:function(w,f,r){try{return f=R(f),f=z0(w,f),J0(f,r&-19),0}catch(J){if(typeof p>"u"||J.name!=="ErrnoError")throw J;return-J.ea}},E:function(w,f,r,J){try{f=R(f);var v=J&256;return f=z0(w,f,J&4096),$1(r,v?w1(f,!0):w1(f))}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},i:function(w,f,r,J){R0=J;try{f=R(f),f=z0(w,f);var v=J?j0():0;return r&64&&(v&=-19),E0(f,r,v).Ha}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return-G.ea}},v:function(w,f,r,J){try{if(f=R(f),f=z0(w,f),J<=0)return-28;var v=i(f).node;if(!v)throw new j(44);if(!v.ca.La)throw new j(28);var G=v.ca.La(v),z=Math.min(J,l0(G)),q=A[r+z];return g0(G,N,r,J+1),A[r+z]=q,z}catch(o){if(typeof p>"u"||o.name!=="ErrnoError")throw o;return-o.ea}},u:function(w,f,r,J){try{f=R(f),J=R(J),f=z0(w,f),J=z0(r,J),w=f;var v=x(w),G=x(J),z=C(w),q=C(J),o=i(w,{parent:!0}),L=o.node;o=i(J,{parent:!0});var S=o.node;if(!L||!S)throw new j(44);if(L.ua!==S.ua)throw new j(75);var m=h0(L,z),w0=L0(w,G);if(w0.charAt(0)!==".")throw new j(28);if(w0=L0(J,v),w0.charAt(0)!==".")throw new j(55);try{var f0=h0(S,q)}catch(v0){}if(m!==f0){var F0=a(m.mode),X0=d0(L,z,F0);if(X0)throw new j(X0);if(X0=f0?d0(S,q,F0):k1(S,q))throw new j(X0);if(!L.ca.Sa)throw new j(63);if(m.Ia||f0&&f0.Ia)throw new j(10);if(S!==L&&(X0=y0(L,"w")))throw new j(X0);t0(m);try{L.ca.Sa(m,S,q),m.parent=S}catch(v0){throw v0}finally{$w(m)}}return 0}catch(v0){if(typeof p>"u"||v0.name!=="ErrnoError")throw v0;return-v0.ea}},t:function(w){try{return w=R(w),Gw(w),0}catch(f){if(typeof p>"u"||f.name!=="ErrnoError")throw f;return-f.ea}},F:function(w,f){try{return w=R(w),$1(f,w1(w))}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return-r.ea}},s:function(w,f,r){try{if(f=R(f),f=z0(w,f),r)if(r===512)Gw(f);else return-28;else{w=f;var J=i(w,{parent:!0}).node;if(!J)throw new j(44);var v=C(w),G=h0(J,v),z=d0(J,v,!1);if(z)throw new j(z);if(!J.ca.Va)throw new j(63);if(G.Ia)throw new j(10);J.ca.Va(J,v),t0(G)}return 0}catch(q){if(typeof p>"u"||q.name!=="ErrnoError")throw q;return-q.ea}},r:function(w,f,r){try{f=R(f),f=z0(w,f,!0);var J=Date.now(),v,G;if(r){var z=_[r>>2]+E[r+4>>2]*4294967296,q=E[r+8>>2];q==1073741823?v=J:q==1073741822?v=null:v=z*1000+q/1e6,r+=16,z=_[r>>2]+E[r+4>>2]*4294967296,q=E[r+8>>2],q==1073741823?G=J:q==1073741822?G=null:G=z*1000+q/1e6}else G=v=J;if((G??v)!==null){w=v;var o=i(f,{Ja:!0}).node;I0(o.ca.Ea,63)(o,{Fa:w,ra:G})}return 0}catch(L){if(typeof p>"u"||L.name!=="ErrnoError")throw L;return-L.ea}},l:()=>{throw""},p:()=>{throw new V},j:()=>Date.now(),f:()=>performance.now(),q:(w)=>{var f=N.length;if(w>>>=0,w>2147483648)return!1;for(var r=1;r<=4;r*=2){var J=f*(1+0.2/r);J=Math.min(J,w+100663296);w:{J=(Math.min(2147483648,Math.ceil(Math.max(w,J)/65536)*65536)-H.buffer.byteLength+65535)/65536|0;try{H.grow(J),b();var v=1;break w}catch(G){}v=void 0}if(v)return!0}return!1},z:(w,f)=>{var r=0,J=0,v;for(v of zw()){var G=f+r;_[w+J>>2]=G,r+=g0(v,N,G,1/0)+1,J+=4}return 0},A:(w,f)=>{var r=zw();_[w>>2]=r.length,w=0;for(var J of r)w+=l0(J)+1;return _[f>>2]=w,0},g:(w)=>{throw`exit(${w})`},d:function(w){try{var f=G0(w);return Qw(f),0}catch(r){if(typeof p>"u"||r.name!=="ErrnoError")throw r;return r.ea}},h:function(w,f,r,J){try{w:{var v=G0(w);w=f;for(var G,z=f=0;z<r;z++){var q=_[w>>2],o=_[w+4>>2];w+=8;var L=v,S=q,m=o,w0=G,f0=A;if(m<0||w0<0)throw new j(28);if(L.Ha===null)throw new j(8);if((L.flags&2097155)===1)throw new j(8);if(a(L.node.mode))throw new j(31);if(!L.da.read)throw new j(28);var F0=typeof w0<"u";if(!F0)w0=L.position;else if(!L.seekable)throw new j(70);var X0=L.da.read(L,f0,S,m,w0);F0||(L.position+=X0);var v0=X0;if(v0<0){var iw=-1;break w}if(f+=v0,v0<o)break;typeof G<"u"&&(G+=v0)}iw=f}return _[J>>2]=iw,0}catch(g1){if(typeof p>"u"||g1.name!=="ErrnoError")throw g1;return g1.ea}},y:function(w,f,r,J){f=f<-9007199254740992||f>9007199254740992?NaN:Number(f);try{if(isNaN(f))return 22;var v=G0(w);return r1(v,f,r),W[J>>3]=BigInt(v.position),v.Ka&&f===0&&r===0&&(v.Ka=null),0}catch(G){if(typeof p>"u"||G.name!=="ErrnoError")throw G;return G.ea}},e:function(w,f,r,J){try{w:{var v=G0(w);w=f;for(var G,z=f=0;z<r;z++){var q=_[w>>2],o=_[w+4>>2];w+=8;var L=Kw(v,A,q,o,G);if(L<0){var S=-1;break w}if(f+=L,L<o)break;typeof G<"u"&&(G+=L)}S=f}return _[J>>2]=S,0}catch(m){if(typeof p>"u"||m.name!=="ErrnoError")throw m;return m.ea}},o:function(w,f,r){var J=D1();try{return Xw(w)(f,r)}catch(v){if(_1(J),!(v instanceof Q))throw v;P1(1,0)}},n:function(w,f,r,J,v){var G=D1();try{return Xw(w)(f,r,J,v)}catch(z){if(_1(G),!(z instanceof Q))throw z;P1(1,0)}},a:H,B:(w,f)=>d(N.subarray(w,w+f))}};WebAssembly.instantiateStreaming(fetch(new URL("akarisub-worker.wasm",self.location.href)),R2).then((w)=>{w=w.instance.exports,Uw=w.J,Ow=w.K,Ww=w.L,Vw=w.M,yw=w.N,Yw=w.O,Bw=w.P,kw=w.Q,qw=w.R,Nw=w.S,Hw=w.T,Aw=w.U,Pw=w.V,_w=w.W,Dw=w.X,Lw=w.Y,gw=w.Z,Iw=w._,Ew=w.$,ow=w.aa,Rw=w.ba,Fw=w.ha,Mw=w.ia,Cw=w.ja,bw=w.ka,Tw=w.la,uw=w.ma,xw=w.na,pw=w.oa,Sw=w.pa,cw=w.xa,nw=w.ya,sw=w.Aa,P1=w.Ba,_1=w.Ca,D1=w.Da,mw=w.za,c=!0,h.noFSInit||fw||(fw=!0,N1("/dev/tty","/dev/stdin"),N1("/dev/tty","/dev/stdout"),N1("/dev/tty1","/dev/stderr"),E0("/dev/stdin",0),E0("/dev/stdout",1),E0("/dev/stderr",1)),w.I(),rw=!1,U()});let L1=()=>{try{typeof H<"u"&&(self.wasmMemory=H,self.HEAPU8C=new Uint8ClampedArray(H.buffer),typeof BigInt64Array<"u"&&(self.HEAP64=new BigInt64Array(H.buffer),self.HEAPU64=new BigUint64Array(H.buffer))),typeof N<"u"&&(self.HEAPU8=N),typeof W<"u"&&(self.HEAP64=W),typeof Y<"u"&&(self.HEAPU64=Y)}catch(w){}};if(typeof updateGlobalBufferAndViews==="function"){let w=updateGlobalBufferAndViews;updateGlobalBufferAndViews=(f)=>{w(f),L1()}}if(typeof b==="function"){let w=b;b=()=>{w(),L1()}}let lw=typeof U==="function"?U:null;return lw&&(U=()=>{return Object.assign(h,{_malloc:Ow,_free:Ww,_akarisub_create:Uw,_akarisub_destroy:Vw,_akarisub_set_drop_animations:yw,_akarisub_create_track_mem:Yw,_akarisub_remove_track:Bw,_akarisub_resize_canvas:kw,_akarisub_add_font:qw,_akarisub_reload_fonts:Nw,_akarisub_set_default_font:Hw,_akarisub_set_fallback_fonts:Aw,_akarisub_set_memory_limits:Pw,_akarisub_get_event_count:_w,_akarisub_alloc_event:Dw,_akarisub_remove_event:Lw,_akarisub_get_style_count:gw,_akarisub_alloc_style:Iw,_akarisub_remove_style:Ew,_akarisub_style_override_index:ow,_akarisub_disable_style_override:Rw,_akarisub_get_track_color_space:Fw,_akarisub_event_get_int:Mw,_akarisub_event_set_int:Cw,_akarisub_event_get_str:bw,_akarisub_event_set_str:Tw,_akarisub_style_get_num:uw,_akarisub_style_set_num:xw,_akarisub_style_get_str:pw,_akarisub_style_set_str:Sw,_akarisub_render_blend_collect:cw,_akarisub_render_image_collect:nw}),typeof p<"u"&&(h.FS_createPath=E2,h.FS_createDataFile=o2),L1(),lw()}),c?Z=h:Z=new Promise((w)=>{B=w}),Z}var tw=F2;var I1=[null,"BT601",null,"BT601","BT601","BT709","BT709","SMPTE240M","SMPTE240M","FCC","FCC"];function dw($,Z=!1){let h=[],K=$.split(/[\r\n]+/g),X=K.length,U=null,Q=null;for(let V=0;V<X;V++){let B=K[V];if(!B||/^\s*$/.test(B))continue;let c=B[0];if(c==="["){let b=B.match(/^\[(.*)\]$/);if(b){if(Z&&b[1].toLowerCase()==="events")break;U=null,Q={name:b[1],body:[]},h.push(Q);continue}}if(!Q)continue;if(c===";")Q.body.push({type:"comment",value:B.substring(1)});else{let b=B.indexOf(":");if(b===-1)continue;let I=B.substring(0,b),E=B.substring(b+1).trim();if(U||I==="Format"){let W=E.split(",");if(U&&W.length>U.length){let _=W.slice(U.length-1).join(",");W=W.slice(0,U.length-1),W.push(_)}let A=W.length;for(let _=0;_<A;_++)W[_]=W[_].trim();if(U){let _={},Y=Math.min(U.length,A);for(let N=0;N<Y;N++)_[U[N]]=W[N];E=_}else E=W}if(I==="Format")U=E;Q.body.push({key:I,value:E})}}return h}var M2=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function E1($){return $.replace(M2,"")}var C2=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function b2($,Z){let h=[...C2].sort((K,X)=>K.w-X.w);for(let K of h)if($<=K.w&&Z<=K.h)return K;return{w:Math.ceil($/100)*100,h:Math.ceil(Z/100)*100}}function n($,Z){return Z&&Z.includes(".")?$.toFixed(2).replace(/\.?0+$/,""):Math.round($)}function o1($){let Z=$.match(/PlayResX:\s*(\d+)/i),h=$.match(/PlayResY:\s*(\d+)/i),K=Z?parseInt(Z[1],10):1920,X=h?parseInt(h[1],10):1080,U=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,Q=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,V=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,B=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,c=0,b=0,I=(M,y,x)=>{let C,K0=new RegExp(M.source,"g");while((C=K0.exec($))!==null){for(let d of y)if(C[d]){let $0=Math.abs(parseFloat(C[d]));if($0>c)c=$0}for(let d of x)if(C[d]){let $0=Math.abs(parseFloat(C[d]));if($0>b)b=$0}}};if(I(U,[1],[2]),I(Q,[1,3],[2,4]),I(V,[1],[2]),I(B,[1,3],[2,4]),c<=K&&b<=X)return $;let E=b2(c,b),W=K/E.w,A=X/E.h,_=Math.min(W,A),Y=Math.max(W,A),N=1,H=$,D=H.match(/(\[Events\][\s\S]*)/i);if(!D)return H;let O=D[1];return O=O.replace(U,(M,y,x)=>`\\pos(${n(parseFloat(y)*W,y)},${n(parseFloat(x)*A,x)})`),O=O.replace(/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)(?:\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+))?\s*\)/g,(M,y,x,C,K0,d,$0)=>{let L0=`\\move(${n(parseFloat(y)*W,y)},${n(parseFloat(x)*A,x)},${n(parseFloat(C)*W,C)},${n(parseFloat(K0)*A,K0)}`;return d?`${L0},${d},${$0})`:`${L0})`}),O=O.replace(V,(M,y,x)=>`\\org(${n(parseFloat(y)*W,y)},${n(parseFloat(x)*A,x)})`),O=O.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(M,y,x,C,K0,d)=>`\\${y}(${n(parseFloat(x)*W,x)},${n(parseFloat(C)*A,C)},${n(parseFloat(K0)*W,K0)},${n(parseFloat(d)*A,d)})`),O=O.replace(/\\fs([\d.]+)/g,(M,y)=>`\\fs${n(parseFloat(y)*Y,y)}`),O=O.replace(/\\fscx([\d.]+)/g,(M,y)=>`\\fscx${n(parseFloat(y)*N,y)}`),O=O.replace(/\\xbord([\d.]+)/g,(M,y)=>`\\xbord${n(parseFloat(y)*W,y)}`),O=O.replace(/\\ybord([\d.]+)/g,(M,y)=>`\\ybord${n(parseFloat(y)*A,y)}`),O=O.replace(/\\xshad(-?[\d.]+)/g,(M,y)=>`\\xshad${n(parseFloat(y)*W,y)}`),O=O.replace(/\\yshad(-?[\d.]+)/g,(M,y)=>`\\yshad${n(parseFloat(y)*A,y)}`),["fsp","bord","shad","be","blur"].forEach((M)=>{let y=new RegExp(`\\\\${M}(-?[\\d.]+)`,"g");O=O.replace(y,(x,C)=>`\\${M}${n(parseFloat(C)*_,C)}`)}),O=O.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(M)=>{return M.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(y,x,C)=>{return`${n(parseFloat(x)*W,x)} ${n(parseFloat(C)*A,C)}`})}),H.substring(0,D.index)+O}var q0=0,$2=1,Z0=null,R1=!1,D0=()=>typeof performance<"u"?performance.now():Date.now(),O1=D0(),Q1=24,x0=!1,J2=!1,s1="wasm",B0={},K1={},v2=0,Z2=0,M0=[],s=!1,Z1=!1,p0=!1,T2=3,t=[];self.width=0;self.height=0;var P={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},u2=()=>{P.framesRendered=0,P.framesDropped=0,P.totalRenderTime=0,P.maxRenderTime=0,P.minRenderTime=1/0,P.lastRenderTime=0,P.cacheHits=0,P.cacheMisses=0},O0=!1,C0=!0,U0=null,A0=null,S0=!1,Y0=null,h2=null,F=0,P0=null,h1=!1,G2=!1,x2=!1,l=null,z1=!1,Q2=new TextEncoder,p2=new TextDecoder,b1=null,W1=128,K2=Math.max(W1,4096),z2=K2;var S2=30,c2=1,n2=24,T1=1000,j2=Array(W1),aw=!1,u1=3,G1=5,e=0,Q0=0,s2=[],m2=[],l2=[],F1=null;var i2=!1,V1=null,k0=null,_0=!1,x1=($)=>new Promise((Z)=>setTimeout(Z,$)),X2=()=>{if(aw)return;for(let $=0;$<W1;$++)j2[$]={w:0,h:0,x:0,y:0,image:0};aw=!0},ew=($)=>{if($<W1)return j2[$];return{w:0,h:0,x:0,y:0,image:0}},m1=($)=>{if(!l||$<=0)return;let Z=u1+G1*$;if(Q0>=Z&&e)return;let h=Math.max(Z,(Q0||64)*2),K=h*Int32Array.BYTES_PER_ELEMENT;if(e)l._free(e),e=0,Q0=0;if(e=l._malloc(K),!e)throw Q0=0,Error("Failed to allocate render-collect buffer");Q0=h},j1=($)=>{if(!F)return;let Z=g(),h=u();if(m1(z2),s1==="wasm")Z.renderBlendCollect(h,$,0,e,Q0);else Z.renderImageCollect(h,$,0,e,Q0)},n0=()=>{P.totalEvents=F?g().getEventCount(F):0},U2=()=>{if(!F)return null;let $=g(),Z=u(),h=$.getEventCount(Z);if(h<=0)return null;let K=Number.POSITIVE_INFINITY;for(let X=0;X<h;X++){let U=$.eventGetInt(Z,X,r0.Start)/T1;if(Number.isFinite(U)&&U<K)K=U}if(!Number.isFinite(K))return null;return Math.max(0,K)},t2=()=>{if(!F)return null;let $=g(),Z=u(),h=$.getEventCount(Z);if(h<=0)return null;let K=Number.POSITIVE_INFINITY,X=0;for(let U=0;U<h;U++){let Q=$.eventGetInt(Z,U,r0.Start)/T1,V=Math.max(0,$.eventGetInt(Z,U,r0.Duration)/T1);if(!Number.isFinite(Q))continue;let B=Q+V;if(Q<K)K=Q;if(B>X)X=B}if(!Number.isFinite(K))return null;if(X<K)X=K;return{start:Math.max(0,K),end:Math.max(0,X)}},d2=async()=>{if(!F)return;let $=t2();if(!$)return;let Z=Math.min($.end,$.start+S2),h=0;for(let K=$.start;K<=Z;K+=c2){if(!F)return;if(x0&&(p0||t.length>0||P.pendingRenders>0)){await x1(0);continue}if(j1(K),h++,x0||h%n2===0)await x1(0)}j1(Z)};var y1=()=>{if(i2=!1,F1)clearTimeout(F1),F1=null},a2=()=>{if(!G2||k0||!F)return;k0=(async()=>{await x1(0);try{await d2()}catch($){if(s)console.warn("[AkariSub] Full track warmup failed, continuing:",$)}try{if(F)j1(Y2())}catch($){if(s)console.warn("[AkariSub] Post-warmup re-prime failed, continuing:",$)}})().finally(()=>{k0=null})};var r0={Start:0,Duration:1,ReadOrder:2,Layer:3,Style:4,MarginL:5,MarginR:6,MarginV:7},b0={Name:0,Effect:1,Text:2},T={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},X1={Name:0,FontName:1},e2=($)=>{return Q2.encode($)},w4=($)=>{if(!l)return 0;let Z=e2($),h=l._malloc(Z.length+1);if(!h)return 0;return self.HEAPU8.set(Z,h),self.HEAPU8[h+Z.length]=0,h},T0=($)=>{if(!$)return"";let Z=$,h=self.HEAPU8;while(h[Z]!==0)Z++;return p2.decode(h.subarray($,Z))},N0=($,Z)=>{let h=w4($);try{return Z(h)}finally{if(h&&l)l._free(h)}},p1=($)=>{return $ instanceof Uint8Array?$:new Uint8Array($)},f4=($)=>{return $ instanceof Uint8Array||$ instanceof ArrayBuffer},r4=($,Z)=>{if(!l)throw Error("AkariSub module is not initialized");let h=l._malloc($.length+1);if(!h)throw Error("Failed to allocate subtitle content");try{return self.HEAPU8.set($,h),self.HEAPU8[h+$.length]=0,Z(h)}finally{self.HEAPU8.fill(0,h,h+$.length+1),l._free(h)}},w2=async($,Z)=>{let h=new Uint8Array($),K=8,X=12,U=21;if(h.length<37)throw Error("Ciphertext too short for v2 subtitle payload");if(h[0]!==2)throw Error("Unsupported encrypted subtitle protocol version");let Q=h.subarray(0,9),V=h.subarray(9,21),B=h.subarray(21),c=await crypto.subtle.decrypt({name:"AES-GCM",iv:V.buffer.slice(V.byteOffset,V.byteOffset+V.byteLength),additionalData:Q.buffer.slice(Q.byteOffset,Q.byteOffset+Q.byteLength),tagLength:128},Z,B.buffer.slice(B.byteOffset,B.byteOffset+B.byteLength));return new Uint8Array(c)},O2=async($)=>{if($.encrypted)return w2($.encrypted,$.contentKey);let Z=$.encryptedChunks||[];if(Z.length===0)throw Error("Encrypted subtitle content is empty");let h=await Promise.all(Z.map((Q)=>w2(Q,$.contentKey))),K=h.reduce((Q,V)=>Q+V.length,0),X=new Uint8Array(K),U=0;for(let Q of h)X.set(Q,U),Q.fill(0),U+=Q.length;return X},l1=($)=>{let Z=g(),h=u();r4($,(K)=>{Z.createTrackMem(h,K)})},W2=($)=>{let Z=g(),h=u();N0($,(K)=>{Z.createTrackMem(h,K)})},g=()=>{if(!b1)throw Error("AkariSub API is not initialized");return b1},u=()=>{if(!F)throw Error("AkariSub instance is not initialized");return F};self.addFont=({font:$})=>V2($,!1);var J1=($)=>{if($=$.trim().toLowerCase(),$.startsWith("@"))$=$.substring(1);if(K1[$])return;if(K1[$]=!0,!B0[$]){if(J2)postMessage({target:"getLocalFont",font:$})}else V2(B0[$])},V2=($,Z=!0)=>{if(typeof $==="string")c1($,(h)=>{f2(new Uint8Array(h),Z)},console.error);else f2($,Z)};var M1=null,$4=()=>{if(M1)return;M1=setTimeout(()=>{if(M1=null,F)g().reloadFonts(F)},16)},c0=($,Z)=>{if(!l||!F){if(s)console.warn("[AkariSub] Cannot add embedded font, module or AkariSub not ready:",Z);return}try{let h=g(),K=l._malloc($.length);if(!K){console.warn("[AkariSub] Failed to allocate memory for embedded font:",Z);return}if(self.HEAPU8.set($,K),N0(Z,(X)=>{h.addFont(F,X,K,$.length)}),s)console.log("[AkariSub] Added embedded font:",Z,"size:",$.length)}catch(h){console.warn("[AkariSub] Failed to add embedded font:",Z,h)}},f2=($,Z=!0)=>{let h=Z?"/fonts/fallback":"/fonts/attached",K=Z?"fallback-"+Z2++:"attached-"+v2++;if(l){try{l.FS_createDataFile(h,K,$,!0,!0,!0)}catch(X){console.warn("Failed to write font to filesystem:",h+"/"+K,X)}if(!Z)c0($,K);else if(F)c0($,K);else M0.push({data:$,name:K})}$4()},v1=($,Z=!0)=>{let h=Z?"/fonts/fallback":"/fonts/attached",K=Z?"fallback-"+Z2++:"attached-"+v2++;if(l){try{if(l.FS_createDataFile(h,K,$,!0,!0,!0),s)console.log("[AkariSub] Wrote font to FS:",h+"/"+K,"size:",$.length)}catch(X){console.warn("Failed to write font to filesystem:",h+"/"+K,X)}if(!Z)c0($,K);else if(F)c0($,K);else M0.push({data:$,name:K})}},y2=($)=>{if(!B0)return;if($.length>500000){let h=$.match(/\[V4\+?\s*Styles?\][^\[]*(?=\[|$)/i);if(h){let U=h[0].matchAll(/^Style:[^,]*,([^,]+)/gm);for(let Q of U)J1(Q[1].trim())}let K=$.match(/\[Events\][\s\S]*/i);if(K){let U=K[0].matchAll(/\\fn([^\\}]*?)[\\}]/g),Q=0;for(let V of U)if(J1(V[1]),++Q>=1000)break}}else{let h=dw($,!0);for(let X=0;X<h.length;X++)for(let U=0;U<h[X].body.length;U++){let Q=h[X].body[U];if(Q.key==="Style"&&typeof Q.value==="object"&&!Array.isArray(Q.value))J1(Q.value.Fontname)}let K=$.match(/\[Events\][\s\S]*/i);if(K){let U=K[0].matchAll(/\\fn([^\\}]*?)[\\}]/g);for(let Q of U)J1(Q[1])}}},S1=($,Z)=>{let h=new XMLHttpRequest;return h.open("GET",$,!1),h.responseType=Z?"arraybuffer":"text",h.send(null),h.response},c1=($,Z,h)=>{let K=new XMLHttpRequest;K.open("GET",$,!0),K.responseType="arraybuffer",K.onload=()=>{if((K.status===200||K.status===0)&&K.response)return Z(K.response)},K.onerror=h,K.send(null)},n1=()=>{let $=g(),Z=u();n0(),V1=U2(),P0=I1[$.getTrackColorSpace(Z)],z1=!0,postMessage({target:"verifyColorSpace",subtitleColorSpace:P0}),postMessage({target:"trackReady"})};self.setTrack=({content:$})=>{if(y1(),k0=null,_0=!1,f4($)){l1(p1($)),n1();return}if(y2($),Z1)$=o1($);if(h1)$=E1($);W2($),n1()};self.setEncryptedTrack=async({content:$})=>{y1(),k0=null,_0=!0;let Z=await O2($);try{l1(Z)}finally{Z.fill(0)}n1()};self.getColorSpace=()=>{postMessage({target:"verifyColorSpace",subtitleColorSpace:P0})};self.freeTrack=()=>{y1(),k0=null,V1=null,_0=!1;let $=g(),Z=u();$.removeTrack(Z),n0()};self.setTrackByUrl=({url:$})=>{self.setTrack({content:S1($)})};var u0=!0,Y2=()=>{let $=(D0()-O1)/1000;if(u0)return q0;else{if($>5)console.error("Didn't receive currentTime > 5 seconds. Assuming video was paused."),B2(!0);return q0+$*$2}},J4=($)=>{if(q0=$,O1=D0(),x0)return;if(!Z0)if(R1)Z0=i1(U1);else U1(),R1=!0,setTimeout(()=>{R1=!1},20)},B2=($)=>{if(x0){if(u0=$,Z0)r2(Z0),Z0=null;return}if($!==u0)if(u0=$,$){if(Z0)r2(Z0),Z0=null}else O1=D0(),Z0=i1(U1)},v4=()=>{if(p0||t.length===0)return;if(t.length>1){let Z=t.length-1;P.framesDropped+=Z;let h=t[t.length-1];t.length=0,t.push(h)}let $=t.shift();if(!$)return;s0($.time,$.force)},V0=()=>{p0=!1,v4()},s0=($,Z)=>{if(p0){let W={time:$,force:Z?1:0};if(W.force)t.length=0;else{let A=t[t.length-1];if(A&&Math.abs(A.time-W.time)>0.25)t.length=0}if(t.length>=T2)t.shift(),P.framesDropped++;t.push(W);return}p0=!0,X2();let h={},K=performance.now();P.renderStartTime=K,P.pendingRenders++;let X=g(),U=u(),Q=Z?1:0;m1(K2);let V=s1==="wasm"?X.renderBlendCollect(U,$,Q,e,Q0):X.renderImageCollect(U,$,Q,e,Q0),B=new Int32Array(self.wasmMemory.buffer,e,u1),c=B[0],b=B[1],E=performance.now()-K;if(P.lastRenderTime=E,P.totalRenderTime+=E,P.maxRenderTime=Math.max(P.maxRenderTime,E),E>0)P.minRenderTime=Math.min(P.minRenderTime,E);if(c!==0||Z)P.framesRendered++,P.cacheMisses++;else P.cacheHits++;if(s){let W=performance.now(),A=B[2];h.WASMRenderTime=A-K,h.WASMBitmapDecodeTime=W-A,h.JSRenderTime=Date.now()}if(c!==0||Z){let W=s2,A=m2;if(W.length=0,A.length=0,V===0)return C1({images:W,buffers:A,times:h});let _=e+u1*Int32Array.BYTES_PER_ELEMENT,Y=new Int32Array(self.wasmMemory.buffer,_,V*G1);if(O0&&S0!==!0){let H=l2;H.length=V;for(let D=0;D<V;++D){let O=D*G1,R=ew(D);R.x=Y[O],R.y=Y[O+1],R.w=Y[O+2],R.h=Y[O+3],R.image=0;let M=Y[O+4],y=R.w*R.h*4,x=new Uint8ClampedArray(self.wasmMemory.buffer,M,y),C=new ImageData(x,R.w,R.h);H[D]=C0?createImageBitmap(C,{premultiplyAlpha:"none",colorSpaceConversion:"none"}):createImageBitmap(C),W[D]=R}Promise.all(H).then((D)=>{for(let O=0;O<V;O++)W[O].image=D[O];if(s)h.JSBitmapGenerationTime=Date.now()-(h.JSRenderTime||0);C1({images:W,buffers:D,times:h})}).catch(()=>{if(C0)C0=!1,console.warn("[AkariSub] createImageBitmap options not supported, disabling"),P.pendingRenders--,V0(),s0($,Z);else P.pendingRenders--,postMessage({target:"unbusy"}),V0()})}else{for(let H=0;H<V;++H){let D=H*G1,O=ew(H);if(O.x=Y[D],O.y=Y[D+1],O.w=Y[D+2],O.h=Y[D+3],O.image=Y[D+4],!A0){let R=O.image,M=O.w*O.h*4,y=new Uint8ClampedArray(M);y.set(self.HEAPU8C.subarray(R,R+M)),A.push(y.buffer),O.image=y}W[H]=O}C1({images:W,buffers:A,times:h})}}else P.pendingRenders--,postMessage({target:"unbusy"}),V0()};self.demand=({time:$})=>{q0=$,O1=D0();let Z=z1?1:0;z1=!1,s0($,Z)};var U1=($)=>{if(Z0=null,s0(Y2(),$),!u0)Z0=i1(U1)},C1=({times:$,images:Z,buffers:h})=>{P.pendingRenders--;let{width:K,height:X}=self,U=Z.length,Q={target:"render",asyncRender:O0,images:Z,times:$,width:K,height:X,colorSpace:P0};if(S0){if(U0.height!==X||U0.width!==K)U0.width=K,U0.height=X;if(A0.clearRect(0,0,K,X),O0)for(let V=0;V<U;V++){let B=Z[V];if(B.image)A0.drawImage(B.image,B.x,B.y),B.image.close()}else for(let V=0;V<U;V++){let B=Z[V];if(B.image){let{w:c,h:b}=B;if(Y0.width!==c||Y0.height!==b)Y0.width=c,Y0.height=b;let I=B.image,E=c*b*4,W=self.HEAPU8C.subarray(I,I+E);h2.putImageData(new ImageData(W,c,b),0,0),A0.drawImage(Y0,B.x,B.y)}}if(S0==="hybrid"){if(!U){postMessage(Q),V0();return}if(s)$.bitmaps=U;try{let V=U0.transferToImageBitmap(),B={...Q,images:[{image:V,x:0,y:0}],asyncRender:!0};postMessage(B,[V]),V0()}catch{postMessage({target:"unbusy"}),V0()}}else{if(s){$.JSRenderTime=Date.now()-($.JSRenderTime||0)-($.JSBitmapGenerationTime||0);let V=0;for(let B in $)V+=$[B]||0;console.log("Bitmaps: "+U+" Total: "+(V|0)+"ms",$)}postMessage({target:"unbusy"}),V0()}}else postMessage(Q,h),V0()},i1=self.requestAnimationFrame?self.requestAnimationFrame.bind(self):(()=>{let $=0;return(Z)=>{let h=D0();if($===0)$=h+1000/Q1;else while(h+2>=$)$+=1000/Q1;let K=Math.max($-h,0);return setTimeout(Z,K)}})(),r2=self.cancelAnimationFrame?self.cancelAnimationFrame.bind(self):clearTimeout;self.init=async($)=>{if(x2=$.hasBitmapBug,G2=!!$.fullTrackWarmup,typeof $.initialTime==="number"&&Number.isFinite($.initialTime))q0=$.initialTime;let Z=self.fetch,h=(Q)=>{if(WebAssembly.instantiateStreaming)self.fetch=(V)=>Z(Q)},K=()=>{self.fetch=Z},X=(Q)=>{return h(Q),tw({wasm:!WebAssembly.instantiateStreaming?S1(Q,!0):void 0}).finally(K)},U=async(Q)=>{l=Q,b1={create:Q._akarisub_create,destroy:Q._akarisub_destroy,setDropAnimations:Q._akarisub_set_drop_animations,createTrackMem:Q._akarisub_create_track_mem,removeTrack:Q._akarisub_remove_track,resizeCanvas:Q._akarisub_resize_canvas,addFont:Q._akarisub_add_font,reloadFonts:Q._akarisub_reload_fonts,setDefaultFont:Q._akarisub_set_default_font,setFallbackFonts:Q._akarisub_set_fallback_fonts,setMemoryLimits:Q._akarisub_set_memory_limits,getEventCount:Q._akarisub_get_event_count,allocEvent:Q._akarisub_alloc_event,removeEvent:Q._akarisub_remove_event,getStyleCount:Q._akarisub_get_style_count,allocStyle:Q._akarisub_alloc_style,removeStyle:Q._akarisub_remove_style,styleOverrideIndex:Q._akarisub_style_override_index,disableStyleOverride:Q._akarisub_disable_style_override,getTrackColorSpace:Q._akarisub_get_track_color_space,eventGetInt:Q._akarisub_event_get_int,eventSetInt:Q._akarisub_event_set_int,eventGetStr:Q._akarisub_event_get_str,eventSetStr:Q._akarisub_event_set_str,styleGetNum:Q._akarisub_style_get_num,styleSetNum:Q._akarisub_style_set_num,styleGetStr:Q._akarisub_style_get_str,styleSetStr:Q._akarisub_style_set_str,renderBlendCollect:Q._akarisub_render_blend_collect,renderImageCollect:Q._akarisub_render_image_collect};let V=[],B=new Set;if($.fallbackFonts&&$.fallbackFonts.length>0)for(let Y of $.fallbackFonts){let N=Y.trim(),H=N.toLowerCase();if(H&&!B.has(H))B.add(H),V.push(N)}try{Q.FS_createPath("/","fonts",!0,!0),Q.FS_createPath("/fonts","attached",!0,!0),Q.FS_createPath("/fonts","fallback",!0,!0),Q.FS_createPath("/","fontconfig",!0,!0),Q.FS_createPath("/","assets",!0,!0),Q.FS_createPath("/","etc",!0,!0),Q.FS_createPath("/etc","fonts",!0,!0);let Y=`<?xml version="1.0"?>
|
|
2
2
|
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
|
|
3
3
|
<fontconfig>
|
|
4
4
|
<!-- Font directories listed in priority order -->
|
|
@@ -36,4 +36,4 @@
|
|
|
36
36
|
</rescan>
|
|
37
37
|
</config>
|
|
38
38
|
</fontconfig>
|
|
39
|
-
`,
|
|
39
|
+
`,N=Q2.encode(Y);Q.FS_createDataFile("/assets","fonts.conf",N,!0,!1,!1),Q.FS_createDataFile("/etc/fonts","fonts.conf",N,!0,!1,!1)}catch(Y){console.warn("Failed to create font directories or fonts.conf:",Y)}if(self.width=$.width,self.height=$.height,x0=!!$.onDemandRender,s1=$.blendMode,O0=$.asyncRender,O0&&typeof createImageBitmap>"u")O0=!1,console.error("'createImageBitmap' needed for 'asyncRender' unsupported!");if(O0)try{let N=new OffscreenCanvas(1,1).getContext("2d");if(N){let H=N.getImageData(0,0,1,1);await createImageBitmap(H,{premultiplyAlpha:"none",colorSpaceConversion:"none"}).catch(()=>{C0=!1,console.warn("[AkariSub] createImageBitmap options not supported (Safari?), rendering without options")})}}catch{C0=!1}B0=$.availableFonts,s=$.debug,Q1=$.targetFps||Q1,J2=$.useLocalFonts,h1=$.dropAllBlur,Z1=$.clampPos,await(async()=>{let Y=[];for(let N of V){let H=N.trim().toLowerCase(),D=H.startsWith("@")?H.substring(1):H;if(B0&&B0[D]){let O=B0[D];if(typeof O==="string"){let R=new Promise((M)=>{c1(O,(y)=>{if(v1(new Uint8Array(y),!0),K1[D]=!0,s)console.log("[AkariSub] Loaded fallback font async:",D);M()},(y)=>{console.error("Failed to load fallback font:",D,y),M()})});Y.push(R)}else v1(O,!0),K1[D]=!0}}if(Y.length>0){let N=null,H=!1,D=new Promise((O)=>{N=setTimeout(()=>{H=!0,console.warn("[AkariSub] Fallback font loading timeout, continuing with available fonts"),O()},30000)});if(await Promise.race([Promise.all(Y).then(()=>{if(N!==null)clearTimeout(N)}),D]),!H&&s)console.log("[AkariSub] All fallback fonts loaded successfully")}})();let b=V.length>0?V[0]:null;if(F=N0(b||"",(Y)=>{return g().create(self.width,self.height,Y,s?1:0)}),M0.length>0){for(let{data:Y,name:N}of M0)c0(Y,N);M0.length=0,g().reloadFonts(F)}if(V.length>0)N0(V.join(","),(Y)=>{g().setFallbackFonts(u(),Y)});let I=$.subContent,E=null;if($.encryptedSubContent)_0=!0,E=await O2($.encryptedSubContent),I=E;else if(_0=!1,!I)I=S1($.subUrl);if(typeof I==="string"?I.length>500000:p1(I).byteLength>500000){if(postMessage({target:"partial_ready"}),s)console.log("[AkariSub] Large subtitle detected, emitting partial_ready early")}if(typeof I==="string"){if(y2(I),Z1)I=o1(I);if(h1)I=E1(I)}else if(s&&(Z1||h1))console.warn("[AkariSub] Text rewrite options are skipped for protected binary subtitle content");let A=!1,_=[];for(let Y of $.fonts||[])if(typeof Y==="string"){let N=new Promise((H)=>{c1(Y,(D)=>{if(v1(new Uint8Array(D),!1),A=!0,s)console.log("[AkariSub] Loaded attached font async:",Y);H()},(D)=>{console.error("Failed to load attached font:",Y,D),H()})});_.push(N)}else v1(Y,!1),A=!0;if(_.length>0){let Y=null,N=!1,H=new Promise((D)=>{Y=setTimeout(()=>{N=!0,console.warn("[AkariSub] Attached font loading timeout, continuing with available fonts"),D()},30000)});if(await Promise.race([Promise.all(_).then(()=>{if(Y!==null)clearTimeout(Y)}),H]),!N&&s)console.log("[AkariSub] Attached font loading complete")}if(A){if(s)console.log("[AkariSub] Reloading fonts after writing attached fonts to FS");if(g().reloadFonts(u()),s)console.log("[AkariSub] Font reload complete")}if(typeof I==="string")W2(I);else try{l1(p1(I))}finally{E?.fill(0)}if(n0(),V1=U2(),P0=I1[g().getTrackColorSpace(u())],g().setDropAnimations(u(),$.dropAllAnimations||0),$.libassMemoryLimit>0||$.libassGlyphLimit>0)g().setMemoryLimits(u(),$.libassGlyphLimit||0,$.libassMemoryLimit||0);X2(),m1(z2);try{j1(q0)}catch(Y){if(s)console.warn("[AkariSub] Prewarm render failed, continuing:",Y)}z1=!0,postMessage({target:"ready"}),postMessage({target:"verifyColorSpace",subtitleColorSpace:P0}),a2()};X($.wasmUrl).then(U).catch((Q)=>{console.error("[AkariSub] WASM loading failed:",Q),postMessage({target:"error",error:"WASM loading failed: "+(Q&&Q.message?Q.message:String(Q))})})};self.offscreenCanvas=({transferable:$})=>{if(U0=$[0],A0=U0.getContext("2d",{desynchronized:!0}),!O0)Y0=new OffscreenCanvas(self.width,self.height),h2=Y0.getContext("2d",{desynchronized:!0});S0=!0};self.detachOffscreen=()=>{U0=new OffscreenCanvas(self.width,self.height),A0=U0.getContext("2d",{desynchronized:!0}),S0="hybrid"};self.canvas=({width:$,height:Z,videoWidth:h,videoHeight:K,force:X})=>{if($==null)throw Error("Invalid canvas size specified");if(self.width=$,self.height=Z,F)g().resizeCanvas(F,$,Z,h,K);if(X)s0(q0,!0)};self.video=({currentTime:$,isPaused:Z,rate:h})=>{if($!=null)J4($);if(Z!=null)B2(Z);if(h!=null)$2=h};self.destroy=()=>{if(y1(),k0=null,V1=null,l){if(e)l._free(e),e=0,Q0=0}if(F)g().destroy(F),F=0;P.totalEvents=0};self.setAsyncRender=({value:$})=>{O0=$&&typeof createImageBitmap<"u"};var k2=($,Z)=>{let h=g(),K=u();for(let X of Object.keys(Z)){let U=Z[X];if(U==null||X==="_index")continue;if(X in r0){h.eventSetInt(K,$,r0[X],Number(U));continue}if(X in b0)N0(String(U),(Q)=>{h.eventSetStr(K,$,b0[X],Q)})}},Z4=($)=>{let Z=g(),h=u();return{Start:Z.eventGetInt(h,$,r0.Start),Duration:Z.eventGetInt(h,$,r0.Duration),ReadOrder:Z.eventGetInt(h,$,r0.ReadOrder),Layer:Z.eventGetInt(h,$,r0.Layer),Style:String(Z.eventGetInt(h,$,r0.Style)),MarginL:Z.eventGetInt(h,$,r0.MarginL),MarginR:Z.eventGetInt(h,$,r0.MarginR),MarginV:Z.eventGetInt(h,$,r0.MarginV),Name:T0(Z.eventGetStr(h,$,b0.Name)),Text:T0(Z.eventGetStr(h,$,b0.Text)),Effect:T0(Z.eventGetStr(h,$,b0.Effect))}},q2=($,Z)=>{let h=g(),K=u();for(let X of Object.keys(Z)){let U=Z[X];if(U==null)continue;if(X in T){h.styleSetNum(K,$,T[X],Number(U));continue}if(X in X1)N0(String(U),(Q)=>{h.styleSetStr(K,$,X1[X],Q)})}},h4=($)=>{let Z=g(),h=u();return{Name:T0(Z.styleGetStr(h,$,X1.Name)),FontName:T0(Z.styleGetStr(h,$,X1.FontName)),FontSize:Z.styleGetNum(h,$,T.FontSize),PrimaryColour:Z.styleGetNum(h,$,T.PrimaryColour),SecondaryColour:Z.styleGetNum(h,$,T.SecondaryColour),OutlineColour:Z.styleGetNum(h,$,T.OutlineColour),BackColour:Z.styleGetNum(h,$,T.BackColour),Bold:Z.styleGetNum(h,$,T.Bold),Italic:Z.styleGetNum(h,$,T.Italic),Underline:Z.styleGetNum(h,$,T.Underline),StrikeOut:Z.styleGetNum(h,$,T.StrikeOut),ScaleX:Z.styleGetNum(h,$,T.ScaleX),ScaleY:Z.styleGetNum(h,$,T.ScaleY),Spacing:Z.styleGetNum(h,$,T.Spacing),Angle:Z.styleGetNum(h,$,T.Angle),BorderStyle:Z.styleGetNum(h,$,T.BorderStyle),Outline:Z.styleGetNum(h,$,T.Outline),Shadow:Z.styleGetNum(h,$,T.Shadow),Alignment:Z.styleGetNum(h,$,T.Alignment),MarginL:Z.styleGetNum(h,$,T.MarginL),MarginR:Z.styleGetNum(h,$,T.MarginR),MarginV:Z.styleGetNum(h,$,T.MarginV),Encoding:Z.styleGetNum(h,$,T.Encoding),treat_fontname_as_pattern:Z.styleGetNum(h,$,T.treat_fontname_as_pattern),Blur:Z.styleGetNum(h,$,T.Blur),Justify:Z.styleGetNum(h,$,T.Justify)}};self.createEvent=({event:$})=>{let Z=g().allocEvent(u());if(Z>=0)k2(Z,$);n0()};self.getEvents=()=>{let $=[],h=g().getEventCount(u());for(let K=0;K<h;K++){let X={...Z4(K),_index:K};if(_0)X.Name="",X.Effect="",X.Text="";$.push(X)}postMessage({target:"getEvents",events:$})};self.setEvent=({event:$,index:Z})=>{k2(Z,$)};self.removeEvent=({index:$})=>{g().removeEvent(u(),$),n0()};self.createStyle=({style:$})=>{let Z=g().allocStyle(u());if(Z>=0)q2(Z,$);return Z};self.getStyles=()=>{let $=[],h=g().getStyleCount(u());for(let K=0;K<h;K++)$.push(h4(K));postMessage({target:"getStyles",time:Date.now(),styles:$})};self.setStyle=({style:$,index:Z})=>{q2(Z,$)};self.removeStyle=({index:$})=>{g().removeStyle(u(),$)};self.styleOverride=($)=>{let Z=self.createStyle($);if(typeof Z==="number"&&Z>=0)g().styleOverrideIndex(u(),Z)};self.disableStyleOverride=()=>{g().disableStyleOverride(u())};self.defaultFont=({font:$})=>{N0($,(Z)=>{g().setDefaultFont(u(),Z)})};self.getStats=()=>{let $=P.framesRendered>0?P.totalRenderTime/P.framesRendered:0;postMessage({target:"getStats",stats:{framesRendered:P.framesRendered,framesDropped:P.framesDropped,avgRenderTime:Math.round($*100)/100,maxRenderTime:Math.round(P.maxRenderTime*100)/100,minRenderTime:P.minRenderTime===1/0?0:Math.round(P.minRenderTime*100)/100,lastRenderTime:Math.round(P.lastRenderTime*100)/100,pendingRenders:Math.max(0,P.pendingRenders),totalEvents:P.totalEvents,cacheHits:P.cacheHits,cacheMisses:P.cacheMisses}})};self.resetStats=()=>{u2(),postMessage({target:"resetStats",success:!0})};self.getEventCount=()=>{let $=F?g().getEventCount(F):0;postMessage({target:"getEventCount",count:$})};self.getStyleCount=()=>{let $=F?g().getStyleCount(F):0;postMessage({target:"getStyleCount",count:$})};onmessage=({data:$})=>{if(!self[$.target])throw Error("Unknown event target "+$.target);Promise.resolve(self[$.target]($)).catch((Z)=>{postMessage({target:"error",error:Z instanceof Error?Z.message:String(Z)})})};})();
|
|
Binary file
|
package/dist/akarisub.umd.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
root.AkariSub = factory();
|
|
8
8
|
}
|
|
9
9
|
}(typeof self !== 'undefined' ? self : this, function() {
|
|
10
|
-
(()=>{var{defineProperty:h,getOwnPropertyNames:$J,getOwnPropertyDescriptor:QJ}=Object,KJ=Object.prototype.hasOwnProperty;function NJ(J){return this[J]}var OJ=(J)=>{var Z=(d??=new WeakMap).get(J),Q;if(Z)return Z;if(Z=h({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function"){for(var $ of $J(J))if(!KJ.call(Z,$))h(Z,$,{get:NJ.bind(J,$),enumerable:!(Q=QJ(J,$))||Q.enumerable})}return d.set(J,Z),Z},d;var GJ=(J)=>J;function FJ(J,Z){this[J]=GJ.bind(null,Z)}var UJ=(J,Z)=>{for(var Q in Z)h(J,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:FJ.bind(Z,Q)})};var PJ={};UJ(PJ,{webYCbCrMap:()=>u,testImageBugs:()=>l,runFeatureTests:()=>
|
|
10
|
+
(()=>{var{defineProperty:h,getOwnPropertyNames:$J,getOwnPropertyDescriptor:QJ}=Object,KJ=Object.prototype.hasOwnProperty;function NJ(J){return this[J]}var OJ=(J)=>{var Z=(d??=new WeakMap).get(J),Q;if(Z)return Z;if(Z=h({},"__esModule",{value:!0}),J&&typeof J==="object"||typeof J==="function"){for(var $ of $J(J))if(!KJ.call(Z,$))h(Z,$,{get:NJ.bind(J,$),enumerable:!(Q=QJ(J,$))||Q.enumerable})}return d.set(J,Z),Z},d;var GJ=(J)=>J;function FJ(J,Z){this[J]=GJ.bind(null,Z)}var UJ=(J,Z)=>{for(var Q in Z)h(J,Q,{get:Z[Q],enumerable:!0,configurable:!0,set:FJ.bind(Z,Q)})};var PJ={};UJ(PJ,{webYCbCrMap:()=>u,testImageBugs:()=>l,runFeatureTests:()=>a,parseAss:()=>o,libassYCbCrMap:()=>s,isWebGPUSupported:()=>f,isWebGL2Supported:()=>p,getVideoPosition:()=>c,getColorSpaceFilterUrl:()=>r,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 r(J,Z){if(!J||!Z)return null;if(J===Z)return null;let Q=y[J]?.[Z];if(!Q)return null;return`url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='f'><feColorMatrix type='matrix' values='${Q} 0 0 0 0 0 1 0'/></filter></svg>#f")`}function w(J,Z,Q,$,O){let N=Q<=0?1:Q,K=globalThis.devicePixelRatio||1;if(Z<=0||J<=0)return{width:0,height:0};let F=N<1?-1:1,G=Z*K;if(F*G*N<=F*$)G*=N;else if(F*G<F*$)G=$;if(O>0&&G>O)G=O;return J*=G/Z,Z=G,{width:J,height:Z}}function c(J,Z=J.videoWidth,Q=J.videoHeight){let $=Z/Q,{offsetWidth:O,offsetHeight:N}=J,K=O/N,F=O,G=N;if(K>$)F=Math.floor(N*$);else G=Math.floor(O/$);let U=(O-F)/2,E=(N-G)/2;return{width:F,height:G,x:U,y:E}}function m(J,Z){if(!Z)return J;let Q=J.length,$=Q-Q%16,O=3;for(;O<$;O+=16){if(J[O]<2)J[O]=1;if(J[O+4]<2)J[O+4]=1;if(J[O+8]<2)J[O+8]=1;if(J[O+12]<2)J[O+12]=1}for(;O<Q;O+=4)if(J[O]<2)J[O]=1;return J}function o(J,Z=!1){let Q=[],$=J.split(/[\r\n]+/g),O=$.length,N=null,K=null;for(let F=0;F<O;F++){let G=$[F];if(!G||/^\s*$/.test(G))continue;let U=G[0];if(U==="["){let E=G.match(/^\[(.*)\]$/);if(E){if(Z&&E[1].toLowerCase()==="events")break;N=null,K={name:E[1],body:[]},Q.push(K);continue}}if(!K)continue;if(U===";")K.body.push({type:"comment",value:G.substring(1)});else{let E=G.indexOf(":");if(E===-1)continue;let T=G.substring(0,E),q=G.substring(E+1).trim();if(N||T==="Format"){let Y=q.split(",");if(N&&Y.length>N.length){let B=Y.slice(N.length-1).join(",");Y=Y.slice(0,N.length-1),Y.push(B)}let L=Y.length;for(let B=0;B<L;B++)Y[B]=Y[B].trim();if(N){let B={},j=Math.min(N.length,L);for(let P=0;P<j;P++)B[N[P]]=Y[P];q=B}else q=Y}if(T==="Format")N=q;K.body.push({key:T,value:q})}}return Q}var XJ=/\\blur(?:[0-9]+\.)?[0-9]+/gm;function n(J){return J.replace(XJ,"")}var qJ=[{w:7680,h:4320},{w:3840,h:2160},{w:2560,h:1440},{w:1920,h:1080},{w:1280,h:720}];function YJ(J,Z){let Q=[...qJ].sort(($,O)=>$.w-O.w);for(let $ of Q)if(J<=$.w&&Z<=$.h)return $;return{w:Math.ceil(J/100)*100,h:Math.ceil(Z/100)*100}}function k(J,Z){return Z&&Z.includes(".")?J.toFixed(2).replace(/\.?0+$/,""):Math.round(J)}function i(J){let Z=J.match(/PlayResX:\s*(\d+)/i),Q=J.match(/PlayResY:\s*(\d+)/i),$=Z?parseInt(Z[1],10):1920,O=Q?parseInt(Q[1],10):1080,N=/\\pos\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,K=/\\move\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)/g,F=/\\org\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,G=/\\i?clip\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,U=0,E=0,T=(M,X,V)=>{let H,D=new RegExp(M.source,"g");while((H=D.exec(J))!==null){for(let A of X)if(H[A]){let C=Math.abs(parseFloat(H[A]));if(C>U)U=C}for(let A of V)if(H[A]){let C=Math.abs(parseFloat(H[A]));if(C>E)E=C}}};if(T(N,[1],[2]),T(K,[1,3],[2,4]),T(F,[1],[2]),T(G,[1,3],[2,4]),U<=$&&E<=O)return J;let q=YJ(U,E),Y=$/q.w,L=O/q.h,B=Math.min(Y,L),j=Math.max(Y,L),P=1,z=J,W=z.match(/(\[Events\][\s\S]*)/i);if(!W)return z;let _=W[1];return _=_.replace(N,(M,X,V)=>`\\pos(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*L,V)})`),_=_.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,H,D,A,C)=>{let g=`\\move(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*L,V)},${k(parseFloat(H)*Y,H)},${k(parseFloat(D)*L,D)}`;return A?`${g},${A},${C})`:`${g})`}),_=_.replace(F,(M,X,V)=>`\\org(${k(parseFloat(X)*Y,X)},${k(parseFloat(V)*L,V)})`),_=_.replace(/\\(i?clip)\s*\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)/g,(M,X,V,H,D,A)=>`\\${X}(${k(parseFloat(V)*Y,V)},${k(parseFloat(H)*L,H)},${k(parseFloat(D)*Y,D)},${k(parseFloat(A)*L,A)})`),_=_.replace(/\\fs([\d.]+)/g,(M,X)=>`\\fs${k(parseFloat(X)*j,X)}`),_=_.replace(/\\fscx([\d.]+)/g,(M,X)=>`\\fscx${k(parseFloat(X)*P,X)}`),_=_.replace(/\\xbord([\d.]+)/g,(M,X)=>`\\xbord${k(parseFloat(X)*Y,X)}`),_=_.replace(/\\ybord([\d.]+)/g,(M,X)=>`\\ybord${k(parseFloat(X)*L,X)}`),_=_.replace(/\\xshad(-?[\d.]+)/g,(M,X)=>`\\xshad${k(parseFloat(X)*Y,X)}`),_=_.replace(/\\yshad(-?[\d.]+)/g,(M,X)=>`\\yshad${k(parseFloat(X)*L,X)}`),["fsp","bord","shad","be","blur"].forEach((M)=>{let X=new RegExp(`\\\\${M}(-?[\\d.]+)`,"g");_=_.replace(X,(V,H)=>`\\${M}${k(parseFloat(H)*B,H)}`)}),_=_.replace(/(\\i?clip\s*\([^,)]+m[^)]+\)|\\p[1-9][^}]*?)(?=[\\}]|$)/g,(M)=>{return M.replace(/(-?[\d.]+)\s+(-?[\d.]+)/g,(X,V,H)=>{return`${k(parseFloat(V)*Y,V)} ${k(parseFloat(H)*L,H)}`})}),z.substring(0,W.index)+_}var b=null,S=null;async function l(){if(b!==null&&S!==null)return{hasAlphaBug:b,hasBitmapBug:S};let J=document.createElement("canvas"),Z=J.getContext("2d",{willReadFrequently:!0});if(!Z)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 Q=document.createElement("canvas"),$=Q.getContext("2d",{willReadFrequently:!0});if(!$)throw Error("Canvas rendering not supported");J.width=Q.width=1,J.height=Q.height=1,Z.clearRect(0,0,1,1),$.clearRect(0,0,1,1);let O=$.getImageData(0,0,1,1).data;Z.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),$.drawImage(J,0,0);let N=$.getImageData(0,0,1,1).data;if(b=O[1]!==N[1],b)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let K=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);$.drawImage(await createImageBitmap(new ImageData(K,1)),0,0);let{data:F}=$.getImageData(0,0,1,1);S=!1;for(let G=0;G<F.length;G++)if(Math.abs(K[G]-F[G])>15){S=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else S=!1;return J.remove(),Q.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}function EJ(J){if(J instanceof ArrayBuffer)return new Uint8Array(J);return new Uint8Array(J.buffer,J.byteOffset,J.byteLength)}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 Z=this.device.createShaderModule({code:`
|
|
11
11
|
struct VertexOutput {
|
|
12
12
|
@builtin(position) position: vec4f,
|
|
13
13
|
@location(0) @interpolate(flat) instanceIndex: u32,
|
|
@@ -100,7 +100,7 @@ fn fragmentMain(input: FragmentInput) -> @location(0) vec4f {
|
|
|
100
100
|
// Premultiplied alpha output
|
|
101
101
|
return vec4f(color.rgb * color.a, color.a);
|
|
102
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 $=this.device.createPipelineLayout({bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=this.device.createRenderPipeline({layout:$,vertex:{module:Z,entryPoint:"vertexMain"},fragment:{module:Q,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,Z,Q){if(this.textureArray)this.pendingDestroyTextures.push(this.textureArray);let $=this.nextPowerOf2(Math.max(J,64)),
|
|
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 $=this.device.createPipelineLayout({bindGroupLayouts:[this.bindGroupLayout]});this.pipeline=this.device.createRenderPipeline({layout:$,vertex:{module:Z,entryPoint:"vertexMain"},fragment:{module:Q,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,Z,Q){if(this.textureArray)this.pendingDestroyTextures.push(this.textureArray);let $=this.nextPowerOf2(Math.max(J,64)),O=this.nextPowerOf2(Math.max(Z,64)),N=Math.min(this.nextPowerOf2(Math.max(Q,16)),256);this.textureArray=this.device.createTexture({size:[$,O,N],format:this.format,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.COPY_DST|GPUTextureUsage.RENDER_ATTACHMENT}),this.textureArrayView=this.textureArray.createView({dimension:"2d-array"}),this.textureArrayWidth=$,this.textureArrayHeight=O,this.textureArraySize=N,this.bindGroupDirty=!0;let K=this.device.createCommandEncoder();for(let F=0;F<N;F++){let G=this.textureArray.createView({dimension:"2d",baseArrayLayer:F,arrayLayerCount:1});K.beginRenderPass({colorAttachments:[{view:G,clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end()}this.device.queue.submit([K.finish()])}ensureTextureArray(J,Z,Q){let $=Math.min(Q,256);if(J<=this.textureArrayWidth&&Z<=this.textureArrayHeight&&$<=this.textureArraySize)return!1;let O=this.nextPowerOf2(Math.max(this.textureArrayWidth,J)),N=this.nextPowerOf2(Math.max(this.textureArrayHeight,Z)),K=Math.min(this.nextPowerOf2(Math.max(this.textureArraySize,$,$+16)),256);return this.createTextureArray(O,N,K),!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,Z,Q){if(await this.init(),!this.device)throw Error("WebGPU device not initialized");if(Z<=0||Q<=0)return;if(this._canvas=J,J.width=Z,J.height=Q,!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]=Z,this.resolutionArray[1]=Q,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=Z,this.lastCanvasHeight=Q}updateSize(J,Z){if(!this.device||!this._canvas||J<=0||Z<=0)return;if(J===this.lastCanvasWidth&&Z===this.lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=Z,this.resolutionArray[0]=J,this.resolutionArray[1]=Z,this.device.queue.writeBuffer(this.uniformBuffer,0,this.resolutionArray),this.lastCanvasWidth=J,this.lastCanvasHeight=Z}renderBitmaps(J,Z,Q){if(!this.device||!this.context||!this.pipeline)return;let $=J.length;if($===0){this.clear();return}let O=this.context.getCurrentTexture();if(O.width===0||O.height===0)return;let N=0,K=0,F=0;for(let j=0;j<$;j++){let{image:P}=J[j],z=P.width,W=P.height;if(z>0&&W>0){if(z>N)N=z;if(W>K)K=W;F++}}if(F===0){this.clear();return}let G=Math.min(F,256);this.ensureTextureArray(N,K,G),this.updateBindGroup();let U=this.device,E=U.queue,T=this.textureArray,q=this.imageDataArray,Y=O.createView(),L=0,B=!0;while(L<$){let j=0;while(L<$&&j<256){let W=J[L++],_=W.image,I=_.width,M=_.height;if(I<=0||M<=0)continue;E.copyExternalImageToTexture({source:_,flipY:!1},{texture:T,origin:[0,0,j],premultipliedAlpha:!1},{width:I,height:M});let X=j<<3;q[X]=W.x,q[X+1]=W.y,q[X+2]=I,q[X+3]=M,q[X+4]=I,q[X+5]=M,q[X+6]=j,q[X+7]=0,j++}if(j===0)continue;E.writeBuffer(this.imageDataBuffer,0,q.buffer,0,j<<5);let P=U.createCommandEncoder(),z=P.beginRenderPass({colorAttachments:[{view:Y,clearValue:{r:0,g:0,b:0,a:0},loadOp:B?"clear":"load",storeOp:"store"}]});z.setPipeline(this.pipeline),z.setBindGroup(0,this.bindGroup),z.draw(6,j),z.end(),E.submit([P.finish()]),B=!1}this.cleanupPendingTextures()}render(J,Z,Q){if(!this.device||!this.context||!this.pipeline)return;let $=J.length;if($===0){this.clear();return}let O=this.context.getCurrentTexture();if(O.width===0||O.height===0)return;let N=0,K=0,F=0;for(let P=0;P<$;P++){let{w:z,h:W}=J[P];if(z>0&&W>0){if(z>N)N=z;if(W>K)K=W;F++}}if(F===0){this.clear();return}let G=Math.min(F,256);this.ensureTextureArray(N,K,G),this.updateBindGroup();let U=this.device,E=U.queue,T=this.textureArray,q=this.imageDataArray,Y=this.format==="bgra8unorm",L=O.createView(),B=0,j=!0;while(B<$){let P=0;while(B<$&&P<256){let _=J[B++],I=_.w,M=_.h;if(I<=0||M<=0)continue;let X=_.image;if(X instanceof ImageBitmap)E.copyExternalImageToTexture({source:X,flipY:!1},{texture:T,origin:[0,0,P],premultipliedAlpha:!1},{width:I,height:M});else if(X instanceof ArrayBuffer||X instanceof Uint8Array||X instanceof Uint8ClampedArray)this.uploadTextureData(P,X,I,M,Y);let V=P<<3;q[V]=_.x,q[V+1]=_.y,q[V+2]=I,q[V+3]=M,q[V+4]=I,q[V+5]=M,q[V+6]=P,q[V+7]=0,P++}if(P===0)continue;E.writeBuffer(this.imageDataBuffer,0,q.buffer,0,P<<5);let z=U.createCommandEncoder(),W=z.beginRenderPass({colorAttachments:[{view:L,clearValue:{r:0,g:0,b:0,a:0},loadOp:j?"clear":"load",storeOp:"store"}]});W.setPipeline(this.pipeline),W.setBindGroup(0,this.bindGroup),W.draw(6,P),W.end(),E.submit([z.finish()]),j=!1}this.cleanupPendingTextures()}uploadTextureData(J,Z,Q,$,O){let N=Q*$*4,K=EJ(Z);if(O){let F=this.ensureConversionBuffer(N);for(let G=0;G<N;G+=4)F[G]=K[G+2],F[G+1]=K[G+1],F[G+2]=K[G],F[G+3]=K[G+3];this.device.queue.writeTexture({texture:this.textureArray,origin:[0,0,J]},F.buffer,{bytesPerRow:Q*4},{width:Q,height:$})}else this.device.queue.writeTexture({texture:this.textureArray,origin:[0,0,J]},K,{bytesPerRow:Q*4},{width:Q,height:$})}cleanupPendingTextures(){let J=this.pendingDestroyTextures,Z=J.length;if(Z===0)return;for(let Q=0;Q<Z;Q++)J[Q].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 Z=this.device.createCommandEncoder();Z.beginRenderPass({colorAttachments:[{view:J.createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:"clear",storeOp:"store"}]}).end(),this.device.queue.submit([Z.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 _J(J){return J instanceof Uint8Array||J instanceof Uint8ClampedArray}function JJ(J,Z,Q){let $=J.createShader(Z);if(J.shaderSource($,Q),J.compileShader($),!J.getShaderParameter($,J.COMPILE_STATUS)){let O=J.getShaderInfoLog($);throw J.deleteShader($),Error(`WebGL2 shader compilation failed: ${O}`)}return $}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 Z=JJ(J,J.VERTEX_SHADER,`#version 300 es
|
|
104
104
|
precision highp float;
|
|
105
105
|
|
|
106
106
|
in vec4 a_destRect;
|
|
@@ -153,7 +153,7 @@ void main() {
|
|
|
153
153
|
// Premultiplied alpha output (matches WebGPU renderer behaviour)
|
|
154
154
|
fragColor = vec4(color.rgb * color.a, color.a);
|
|
155
155
|
}
|
|
156
|
-
`),$=J.createProgram();if(J.attachShader($,Z),J.attachShader($,Q),J.linkProgram($),!J.getProgramParameter($,J.LINK_STATUS))throw Error(`WebGL2 program link failed: ${J.getProgramInfoLog($)}`);J.deleteShader(Z),J.deleteShader(Q),this._program=$,this._resolutionLoc=J.getUniformLocation($,"u_resolution"),this._texArraySizeLoc=J.getUniformLocation($,"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 N=J.getAttribLocation($,"a_destRect");J.enableVertexAttribArray(N),J.vertexAttribPointer(N,4,J.FLOAT,!1,32,0),J.vertexAttribDivisor(N,1);let O=J.getAttribLocation($,"a_texInfo");J.enableVertexAttribArray(O),J.vertexAttribPointer(O,4,J.FLOAT,!1,32,16),J.vertexAttribDivisor(O,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,Z,Q){let $=this._gl,N=this._nextPow2(Math.max(J,64)),O=this._nextPow2(Math.max(Z,64)),K=Math.min(this._nextPow2(Math.max(Q,16)),256);$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.texImage3D($.TEXTURE_2D_ARRAY,0,$.RGBA8,N,O,K,0,$.RGBA,$.UNSIGNED_BYTE,null),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MIN_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MAG_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_S,$.CLAMP_TO_EDGE),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_T,$.CLAMP_TO_EDGE),this._texWidth=N,this._texHeight=O,this._texLayers=K}_ensureTextureArray(J,Z,Q){let $=Math.min(Q,256);if(J<=this._texWidth&&Z<=this._texHeight&&$<=this._texLayers)return;let N=this._nextPow2(Math.max(this._texWidth,J)),O=this._nextPow2(Math.max(this._texHeight,Z)),K=Math.min(this._nextPow2(Math.max(this._texLayers,$,$+16)),256);this._allocateTextureArray(N,O,K)}async setCanvas(J,Z,Q){if(await this.init(),Z<=0||Q<=0)return;this._canvas=J,J.width=Z,J.height=Q,this._initGL(),this._gl.viewport(0,0,Z,Q),this._lastCanvasWidth=Z,this._lastCanvasHeight=Q}updateSize(J,Z){if(!this._gl||!this._canvas||J<=0||Z<=0)return;if(J===this._lastCanvasWidth&&Z===this._lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=Z,this._gl.viewport(0,0,J,Z),this._lastCanvasWidth=J,this._lastCanvasHeight=Z}renderBitmaps(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let N=0,O=0;for(let U=0;U<$;U++){let{image:E}=J[U];if(E.width>N)N=E.width;if(E.height>O)O=E.height}this._ensureTextureArray(N,O,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let F=this._instanceData,G=0;while(G<$){let U=0;while(G<$&&U<256){let E=J[G++],M=E.image.width,q=E.image.height;if(M<=0||q<=0)continue;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,M,q,1,K.RGBA,K.UNSIGNED_BYTE,E.image);let Y=U<<3;F[Y]=E.x,F[Y+1]=E.y,F[Y+2]=M,F[Y+3]=q,F[Y+4]=M,F[Y+5]=q,F[Y+6]=U,F[Y+7]=0,U++}if(U===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,F,0,U<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,U),K.bindVertexArray(null)}}render(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let N=0,O=0;for(let U=0;U<$;U++){let{w:E,h:M}=J[U];if(E>N)N=E;if(M>O)O=M}this._ensureTextureArray(N,O,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let F=this._instanceData,G=0;while(G<$){let U=0;while(G<$&&U<256){let E=J[G++],M=E.w,q=E.h;if(M<=0||q<=0)continue;let Y=E.image;if(Y instanceof ImageBitmap)K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,M,q,1,K.RGBA,K.UNSIGNED_BYTE,Y);else if(Y instanceof ArrayBuffer||_J(Y)){let B=Y instanceof ArrayBuffer?new Uint8Array(Y):Y;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,M,q,1,K.RGBA,K.UNSIGNED_BYTE,B)}let L=U<<3;F[L]=E.x,F[L+1]=E.y,F[L+2]=M,F[L+3]=q,F[L+4]=M,F[L+5]=q,F[L+6]=U,F[L+7]=0,U++}if(U===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,F,0,U<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,U),K.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}}var ZJ=0.008,LJ=ZJ*1000,MJ=16,TJ=()=>{if(typeof navigator>"u")return!1;let J=navigator.userAgent||"",Z=navigator.vendor||"",Q=/\b(iPhone|iPad|iPod)\b/i.test(J);if(!/AppleWebKit/i.test(J))return!1;if(Q)return!0;if(/\b(Chrome|Chromium|Edg|OPR|SamsungBrowser|Firefox)\b/i.test(J))return!1;return Z.includes("Apple")};class H 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=[];_isLikelyWebKit;_activeDemandStartedAt=0;_smoothedDemandLatencyMs;_boundResize;_boundTimeUpdate;_boundSetRate;_boundUpdateColorSpace;_boundHandleRVFC;_gpuRenderer=null;_rendererType="canvas2d";_onCanvasFallback;_lastRenderWidth=0;_lastRenderHeight=0;_gpuBitmapImages=[];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((O)=>{this._init=O}),this._isLikelyWebKit=TJ(),this._smoothedDemandLatencyMs=this._isLikelyWebKit?MJ:LJ;let Z=H._test();this._onDemandRender="requestVideoFrameCallback"in HTMLVideoElement.prototype&&(J.onDemandRender??!0),this._onCanvasFallback=J.onCanvasFallback;let Q=!this._isLikelyWebKit&&!J.canvas&&(f()||p()),$=typeof createImageBitmap<"u"&&(J.asyncRender??!this._isLikelyWebKit);if(this._offscreenRender="transferControlToOffscreen"in HTMLCanvasElement.prototype&&!J.canvas&&!Q&&(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,Q)this._initGPURenderer();else if(!this._offscreenRender)this._ctx=this._canvas.getContext("2d",{alpha:!0,desynchronized:!0});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??ZJ,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=(O)=>this._onmessage(O),this._worker.onerror=(O)=>this._error(O),Z.then(()=>{if(this._worker.postMessage({target:"init",wasmUrl:J.wasmUrl??"akarisub-worker.wasm",asyncRender:$,fullTrackWarmup:J.fullTrackWarmup??!1,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:H._hasBitmapBug}),this._offscreenRender)this.sendMessage("offscreenCanvas",{},[this._canvasctrl])})}static async _testImageBugs(){if(H._hasBitmapBug!==null)return;let J=document.createElement("canvas"),Z=J.getContext("2d",{willReadFrequently:!0});if(!Z)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 Q=document.createElement("canvas"),$=Q.getContext("2d",{willReadFrequently:!0});if(!$)throw Error("Canvas rendering not supported");J.width=Q.width=1,J.height=Q.height=1,Z.clearRect(0,0,1,1),$.clearRect(0,0,1,1);let N=$.getImageData(0,0,1,1).data;Z.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),$.drawImage(J,0,0);let O=$.getImageData(0,0,1,1).data;if(H._hasAlphaBug=N[1]!==O[1],H._hasAlphaBug)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let K=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);$.drawImage(await createImageBitmap(new ImageData(K,1)),0,0);let{data:F}=$.getImageData(0,0,1,1);H._hasBitmapBug=!1;for(let G=0;G<F.length;G++)if(Math.abs(K[G]-F[G])>15){H._hasBitmapBug=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else H._hasBitmapBug=!1;J.remove(),Q.remove()}static async _test(){await H._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",{alpha:!0,desynchronized:!0});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,Z=0,Q=0,$=0,N=this._video?.paused??!1){if((!J||!Z)&&this._video){let O=c(this._video),K;if(this._videoWidth){let F=this._video.videoWidth/this._videoWidth,G=this._video.videoHeight/this._videoHeight;K=w((O.width||0)/F,(O.height||0)/G,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight)}else K=w(O.width||0,O.height||0,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight);if(J=K.width,Z=K.height,this._canvasParent)Q=O.y-(this._canvasParent.getBoundingClientRect().top-this._video.getBoundingClientRect().top),$=O.x;this._canvas.style.width=O.width+"px",this._canvas.style.height=O.height+"px"}if(this._canvas.style.top=Q+"px",this._canvas.style.left=$+"px",J>0&&Z>0)this._canvasctrl.width=J,this._canvasctrl.height=Z;if(this._gpuRenderer&&J>0&&Z>0)this._gpuRenderer.updateSize(J,Z);if(N&&this.busy===!1)this.busy=!0;else N=!1;this.sendMessage("canvas",{width:J,height:Z,videoWidth:this._videoWidth||this._video?.videoWidth||0,videoHeight:this._videoHeight||this._video?.videoHeight||0,force:N})}_timeupdate(J){let Q={seeking:!0,waiting:!0,playing:!1}[J.type];if(Q!=null)this._playstate=Q;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,Z,Q){this.sendMessage("video",{isPaused:J,currentTime:Z,rate:Q,colorSpace:this._videoColorSpace})}createEvent(J){this.sendMessage("createEvent",{event:J})}setEvent(J,Z){this.sendMessage("setEvent",{event:J,index:Z})}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,Z){this.sendMessage("setStyle",{style:J,index:Z})}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 Z=(await this._fetchFromWorker({target:"getStats"})).stats;return{framesRendered:Z.framesRendered??0,framesDropped:Z.framesDropped??0,avgRenderTime:Z.avgRenderTime??0,maxRenderTime:Z.maxRenderTime??0,minRenderTime:Z.minRenderTime??0,lastRenderTime:Z.lastRenderTime??0,pendingRenders:Z.pendingRenders??0,totalEvents:Z.totalEvents??0,cacheHits:Z.cacheHits??0,cacheMisses:Z.cacheMisses??0,renderFps:Z.avgRenderTime&&Z.avgRenderTime>0?Math.round(1000/Z.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((Z)=>{let Q=Z?.find(($)=>$.fullName.toLowerCase()===J);if(Q)Q.blob().then(($)=>{$.arrayBuffer().then((N)=>{this.addFont(new Uint8Array(N))})})})}catch(Z){console.warn("Local fonts API:",Z)}}_getLocalFont(J){try{if(navigator?.permissions?.query)navigator.permissions.query({name:"local-fonts"}).then((Z)=>{if(Z.state==="granted")this._sendLocalFont(J.font)});else this._sendLocalFont(J.font)}catch(Z){console.warn("Local fonts API:",Z)}}_unbusy(){if(this._observeDemandCompletion(),this._pendingDemandTimes.length>0){if(this._pendingDemandTimes.length>1){let Z=this._pendingDemandTimes[this._pendingDemandTimes.length-1];this._pendingDemandTimes.length=0,this._pendingDemandTimes.push(Z)}let J=this._pendingDemandTimes.shift();if(J){this._demandRender(J);return}}this.busy=!1}_markDemandDispatched(){if(!this._onDemandRender)return;this._activeDemandStartedAt=performance.now()}_observeDemandCompletion(){if(!this._onDemandRender||this._activeDemandStartedAt===0)return;let J=performance.now()-this._activeDemandStartedAt;if(this._activeDemandStartedAt=0,!Number.isFinite(J)||J<=0)return;this._smoothedDemandLatencyMs=this._smoothedDemandLatencyMs<=0?J:this._smoothedDemandLatencyMs*0.75+J*0.25}_getDemandPipelineLeadSeconds(J,Z){let Q=Z.expectedDisplayTime??Z.presentationTime??J,$=Math.max(0,Q-J)/1000;return Math.max(0,this._smoothedDemandLatencyMs/1000-$)}_enqueueDemand(J){let Z=this._pendingDemandTimes;if(Z.length>0){let Q=Z[Z.length-1];if(Math.abs(Q.mediaTime-J.mediaTime)>0.25)Z.length=0}if(Z.length>=H.MAX_PENDING_DEMANDS)Z.shift();Z.push(J)}_handleRVFC(J,Z){if(this._destroyed)return;let Q=this._video?.playbackRate??1,$=this._getDemandPipelineLeadSeconds(J,Z),O={mediaTime:Z.mediaTime+($+this.renderAhead)*Q,width:Z.width,height:Z.height};if(!this._workerReady){this._enqueueDemand(O),this._video.requestVideoFrameCallback(this._boundHandleRVFC);return}if(this.busy)this._enqueueDemand(O);else this.busy=!0,this._demandRender(O);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._markDemandDispatched(),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",{alpha:!0,desynchronized:!0}),this.sendMessage("detachOffscreen"),this.busy=!1,this._activeDemandStartedAt=0,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:Z,videoColorSpace:Q=this._videoColorSpace}=J;if(!Z||!Q)return;if(Z===Q)return;this._detachOffscreen();let $=y[Z]?.[Q];if($&&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='${$} 0 0 0 0 0 1 0'/></filter></svg>#f")`}_render(J){try{let{width:Z,height:Q}=J;if(this.debug)J.times.IPCTime=Date.now()-(J.times.JSRenderTime||0);if(this._canvasctrl.width!==Z||this._canvasctrl.height!==Q){if(this._canvasctrl.width=Z,this._canvasctrl.height=Q,this._lastRenderWidth=Z,this._lastRenderHeight=Q,this._gpuRenderer)this._gpuRenderer.updateSize(Z,Q);this._verifyColorSpace({subtitleColorSpace:J.colorSpace})}if(this._gpuRenderer){this._renderGPU(J);return}if(!this._ctx)return;let N=this._ctx,O=J.images,K=O.length;if(N.clearRect(0,0,Z,Q),J.asyncRender)for(let F=0;F<K;F++){let G=O[F];if(G.image)N.drawImage(G.image,G.x,G.y),G.image.close()}else{let F=H._hasAlphaBug??!1;for(let G=0;G<K;G++){let U=O[G];if(U.image){let{w:E,h:M,image:q}=U,Y=q instanceof Uint8ClampedArray?q:q instanceof Uint8Array?new Uint8ClampedArray(q.buffer,q.byteOffset,q.byteLength):new Uint8ClampedArray(q),L=m(Y,F);N.putImageData(new ImageData(L,E,M),U.x,U.y)}}}if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let F=0,G=J.times.bitmaps||K;delete J.times.bitmaps;for(let U in J.times)F+=J.times[U]||0;console.log("Bitmaps: "+G+" Total: "+(F|0)+"ms",J.times)}}finally{this._unbusy()}}_renderGPU(J){let Z=this._gpuRenderer;if(!Z)return;if(J.images.length===0){Z.clear();return}if(J.asyncRender){let Q=this._gpuBitmapImages,$=0;for(let N=0;N<J.images.length;N++){let O=J.images[N];if(!(O.image instanceof ImageBitmap))continue;let K=Q[$]||(Q[$]={image:O.image,x:0,y:0});K.image=O.image,K.x=O.x,K.y=O.y,$++}Q.length=$,Z.renderBitmaps(Q,this._canvasctrl.width,this._canvasctrl.height);for(let N of J.images)if(N.image instanceof ImageBitmap)N.image.close()}else Z.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 Q=0,$=J.times.bitmaps||J.images.length;delete J.times.bitmaps;for(let N in J.times)Q+=J.times[N]||0;console.log(`[${this._rendererType.toUpperCase()}] Bitmaps: `+$+" Total: "+(Q|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,Z={},Q){if(await this._loaded,Q)this._worker.postMessage({target:J,transferable:Q,...Z},[...Q]);else this._worker.postMessage({target:J,...Z})}_fetchFromWorker(J){return new Promise((Z,Q)=>{try{let $=J.target,N=setTimeout(()=>{F(),Q(Error("Error: Timeout while trying to fetch "+$))},5000),O=(G)=>{if(G.data.target===$)F(),Z(G.data)},K=(G)=>{F(),Q(G instanceof Error?G:G.error||Error("Worker error"))},F=()=>{this._worker.removeEventListener("message",O),this._worker.removeEventListener("error",K),clearTimeout(N)};this._worker.addEventListener("message",O),this._worker.addEventListener("error",K),this._worker.postMessage(J)}catch($){Q($)}})}_console(J){console[J.command].apply(console,JSON.parse(J.content))}_onmessage(J){let Z=J.data.target;if(Z==="error"){this._error(J.data.error||"Unknown worker error");return}let Q=this["_"+Z];if(Q)Q.call(this,J.data)}_error(J){let Z=J instanceof Error?J:J instanceof ErrorEvent?J.error||Error(J.message):Error(String(J)),Q=J instanceof Event?new ErrorEvent(J.type,J):new ErrorEvent("error",{error:Z});return this.dispatchEvent(Q),console.error(Z),Z}_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 Z=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(),Z}}})();
|
|
156
|
+
`),$=J.createProgram();if(J.attachShader($,Z),J.attachShader($,Q),J.linkProgram($),!J.getProgramParameter($,J.LINK_STATUS))throw Error(`WebGL2 program link failed: ${J.getProgramInfoLog($)}`);J.deleteShader(Z),J.deleteShader(Q),this._program=$,this._resolutionLoc=J.getUniformLocation($,"u_resolution"),this._texArraySizeLoc=J.getUniformLocation($,"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 O=J.getAttribLocation($,"a_destRect");J.enableVertexAttribArray(O),J.vertexAttribPointer(O,4,J.FLOAT,!1,32,0),J.vertexAttribDivisor(O,1);let N=J.getAttribLocation($,"a_texInfo");J.enableVertexAttribArray(N),J.vertexAttribPointer(N,4,J.FLOAT,!1,32,16),J.vertexAttribDivisor(N,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,Z,Q){let $=this._gl,O=this._nextPow2(Math.max(J,64)),N=this._nextPow2(Math.max(Z,64)),K=Math.min(this._nextPow2(Math.max(Q,16)),256);$.bindTexture($.TEXTURE_2D_ARRAY,this._texArray),$.texImage3D($.TEXTURE_2D_ARRAY,0,$.RGBA8,O,N,K,0,$.RGBA,$.UNSIGNED_BYTE,null),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MIN_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_MAG_FILTER,$.NEAREST),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_S,$.CLAMP_TO_EDGE),$.texParameteri($.TEXTURE_2D_ARRAY,$.TEXTURE_WRAP_T,$.CLAMP_TO_EDGE),this._texWidth=O,this._texHeight=N,this._texLayers=K}_ensureTextureArray(J,Z,Q){let $=Math.min(Q,256);if(J<=this._texWidth&&Z<=this._texHeight&&$<=this._texLayers)return;let O=this._nextPow2(Math.max(this._texWidth,J)),N=this._nextPow2(Math.max(this._texHeight,Z)),K=Math.min(this._nextPow2(Math.max(this._texLayers,$,$+16)),256);this._allocateTextureArray(O,N,K)}async setCanvas(J,Z,Q){if(await this.init(),Z<=0||Q<=0)return;this._canvas=J,J.width=Z,J.height=Q,this._initGL(),this._gl.viewport(0,0,Z,Q),this._lastCanvasWidth=Z,this._lastCanvasHeight=Q}updateSize(J,Z){if(!this._gl||!this._canvas||J<=0||Z<=0)return;if(J===this._lastCanvasWidth&&Z===this._lastCanvasHeight)return;this._canvas.width=J,this._canvas.height=Z,this._gl.viewport(0,0,J,Z),this._lastCanvasWidth=J,this._lastCanvasHeight=Z}renderBitmaps(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let O=0,N=0;for(let U=0;U<$;U++){let{image:E}=J[U];if(E.width>O)O=E.width;if(E.height>N)N=E.height}this._ensureTextureArray(O,N,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let F=this._instanceData,G=0;while(G<$){let U=0;while(G<$&&U<256){let E=J[G++],T=E.image.width,q=E.image.height;if(T<=0||q<=0)continue;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,T,q,1,K.RGBA,K.UNSIGNED_BYTE,E.image);let Y=U<<3;F[Y]=E.x,F[Y+1]=E.y,F[Y+2]=T,F[Y+3]=q,F[Y+4]=T,F[Y+5]=q,F[Y+6]=U,F[Y+7]=0,U++}if(U===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,F,0,U<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,U),K.bindVertexArray(null)}}render(J,Z,Q){if(!this._gl||!this._initialized)return;let $=J.length;if($===0){this.clear();return}let O=0,N=0;for(let U=0;U<$;U++){let{w:E,h:T}=J[U];if(E>O)O=E;if(T>N)N=T}this._ensureTextureArray(O,N,Math.min($,256));let K=this._gl;K.clearColor(0,0,0,0),K.clear(K.COLOR_BUFFER_BIT),K.useProgram(this._program),K.uniform2f(this._resolutionLoc,this._lastCanvasWidth,this._lastCanvasHeight),K.uniform2i(this._texArraySizeLoc,this._texWidth,this._texHeight),K.activeTexture(K.TEXTURE0),K.bindTexture(K.TEXTURE_2D_ARRAY,this._texArray),K.pixelStorei(K.UNPACK_FLIP_Y_WEBGL,!1);let F=this._instanceData,G=0;while(G<$){let U=0;while(G<$&&U<256){let E=J[G++],T=E.w,q=E.h;if(T<=0||q<=0)continue;let Y=E.image;if(Y instanceof ImageBitmap)K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,T,q,1,K.RGBA,K.UNSIGNED_BYTE,Y);else if(Y instanceof ArrayBuffer||_J(Y)){let B=Y instanceof ArrayBuffer?new Uint8Array(Y):Y;K.texSubImage3D(K.TEXTURE_2D_ARRAY,0,0,0,U,T,q,1,K.RGBA,K.UNSIGNED_BYTE,B)}let L=U<<3;F[L]=E.x,F[L+1]=E.y,F[L+2]=T,F[L+3]=q,F[L+4]=T,F[L+5]=q,F[L+6]=U,F[L+7]=0,U++}if(U===0)continue;K.bindBuffer(K.ARRAY_BUFFER,this._instanceBuffer),K.bufferSubData(K.ARRAY_BUFFER,0,F,0,U<<3),K.bindVertexArray(this._vao),K.drawArraysInstanced(K.TRIANGLES,0,6,U),K.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}}var ZJ=0.008,LJ=ZJ*1000,TJ=16,MJ=()=>{if(typeof navigator>"u")return!1;let J=navigator.userAgent||"",Z=navigator.vendor||"",Q=/\b(iPhone|iPad|iPod)\b/i.test(J);if(!/AppleWebKit/i.test(J))return!1;if(Q)return!0;if(/\b(Chrome|Chromium|Edg|OPR|SamsungBrowser|Firefox)\b/i.test(J))return!1;return Z.includes("Apple")};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=[];_isLikelyWebKit;_activeDemandStartedAt=0;_smoothedDemandLatencyMs;_boundResize;_boundTimeUpdate;_boundSetRate;_boundUpdateColorSpace;_boundHandleRVFC;_gpuRenderer=null;_rendererType="canvas2d";_onCanvasFallback;_lastRenderWidth=0;_lastRenderHeight=0;_gpuBitmapImages=[];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((N)=>{this._init=N}),this._isLikelyWebKit=MJ(),this._smoothedDemandLatencyMs=this._isLikelyWebKit?TJ:LJ;let Z=R._test();this._onDemandRender="requestVideoFrameCallback"in HTMLVideoElement.prototype&&(J.onDemandRender??!0),this._onCanvasFallback=J.onCanvasFallback;let Q=!this._isLikelyWebKit&&!J.canvas&&(f()||p()),$=typeof createImageBitmap<"u"&&(J.asyncRender??!this._isLikelyWebKit);if(this._offscreenRender="transferControlToOffscreen"in HTMLCanvasElement.prototype&&!J.canvas&&!Q&&(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 O=this._bufferCanvas.getContext("2d");if(!O)throw this.destroy(Error("Canvas rendering not supported"));if(this._bufferCtx=O,Q)this._initGPURenderer();else if(!this._offscreenRender)this._ctx=this._canvas.getContext("2d",{alpha:!0,desynchronized:!0});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??ZJ,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=(N)=>this._onmessage(N),this._worker.onerror=(N)=>this._error(N),Z.then(()=>{let N={target:"init",wasmUrl:J.wasmUrl??"akarisub-worker.wasm",asyncRender:$,fullTrackWarmup:J.fullTrackWarmup??!1,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,encryptedSubContent:J.encryptedSubContent||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};if(this._worker.postMessage(N,R._getSubtitleTransfers(J.subContent,J.encryptedSubContent)),this._offscreenRender)this.sendMessage("offscreenCanvas",{},[this._canvasctrl])})}static async _testImageBugs(){if(R._hasBitmapBug!==null)return;let J=document.createElement("canvas"),Z=J.getContext("2d",{willReadFrequently:!0});if(!Z)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 Q=document.createElement("canvas"),$=Q.getContext("2d",{willReadFrequently:!0});if(!$)throw Error("Canvas rendering not supported");J.width=Q.width=1,J.height=Q.height=1,Z.clearRect(0,0,1,1),$.clearRect(0,0,1,1);let O=$.getImageData(0,0,1,1).data;Z.putImageData(new ImageData(new Uint8ClampedArray([0,255,0,0]),1,1),0,0),$.drawImage(J,0,0);let N=$.getImageData(0,0,1,1).data;if(R._hasAlphaBug=O[1]!==N[1],R._hasAlphaBug)console.log("Detected a browser having issue with transparent pixels, applying workaround");if(typeof createImageBitmap<"u"){let K=new Uint8ClampedArray([255,0,255,0,255]).subarray(1,5);$.drawImage(await createImageBitmap(new ImageData(K,1)),0,0);let{data:F}=$.getImageData(0,0,1,1);R._hasBitmapBug=!1;for(let G=0;G<F.length;G++)if(Math.abs(K[G]-F[G])>15){R._hasBitmapBug=!0,console.log("Detected a browser having issue with partial bitmaps, applying workaround");break}}else R._hasBitmapBug=!1;J.remove(),Q.remove()}static async _test(){await R._testImageBugs()}static _getSubtitleTransfers(J,Z){let Q=[];if(J instanceof ArrayBuffer)Q.push(J);else if(J instanceof Uint8Array)Q.push(J.buffer);if(Z?.encrypted)Q.push(Z.encrypted);for(let $ of Z?.encryptedChunks||[])Q.push($);return Q}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",{alpha:!0,desynchronized:!0});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,Z=0,Q=0,$=0,O=this._video?.paused??!1){if((!J||!Z)&&this._video){let N=c(this._video),K;if(this._videoWidth){let F=this._video.videoWidth/this._videoWidth,G=this._video.videoHeight/this._videoHeight;K=w((N.width||0)/F,(N.height||0)/G,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight)}else K=w(N.width||0,N.height||0,this.prescaleFactor,this.prescaleHeightLimit,this.maxRenderHeight);if(J=K.width,Z=K.height,this._canvasParent)Q=N.y-(this._canvasParent.getBoundingClientRect().top-this._video.getBoundingClientRect().top),$=N.x;this._canvas.style.width=N.width+"px",this._canvas.style.height=N.height+"px"}if(this._canvas.style.top=Q+"px",this._canvas.style.left=$+"px",J>0&&Z>0)this._canvasctrl.width=J,this._canvasctrl.height=Z;if(this._gpuRenderer&&J>0&&Z>0)this._gpuRenderer.updateSize(J,Z);if(O&&this.busy===!1)this.busy=!0;else O=!1;this.sendMessage("canvas",{width:J,height:Z,videoWidth:this._videoWidth||this._video?.videoWidth||0,videoHeight:this._videoHeight||this._video?.videoHeight||0,force:O})}_timeupdate(J){let Q={seeking:!0,waiting:!0,playing:!1}[J.type];if(Q!=null)this._playstate=Q;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},R._getSubtitleTransfers(J)),this._reAttachOffscreen(),this._ctx)this._ctx.filter="none"}setEncryptedTrack(J){if(this.sendMessage("setEncryptedTrack",{content:J},R._getSubtitleTransfers(void 0,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,Z,Q){this.sendMessage("video",{isPaused:J,currentTime:Z,rate:Q,colorSpace:this._videoColorSpace})}createEvent(J){this.sendMessage("createEvent",{event:J})}setEvent(J,Z){this.sendMessage("setEvent",{event:J,index:Z})}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,Z){this.sendMessage("setStyle",{style:J,index:Z})}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 Z=(await this._fetchFromWorker({target:"getStats"})).stats;return{framesRendered:Z.framesRendered??0,framesDropped:Z.framesDropped??0,avgRenderTime:Z.avgRenderTime??0,maxRenderTime:Z.maxRenderTime??0,minRenderTime:Z.minRenderTime??0,lastRenderTime:Z.lastRenderTime??0,pendingRenders:Z.pendingRenders??0,totalEvents:Z.totalEvents??0,cacheHits:Z.cacheHits??0,cacheMisses:Z.cacheMisses??0,renderFps:Z.avgRenderTime&&Z.avgRenderTime>0?Math.round(1000/Z.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((Z)=>{let Q=Z?.find(($)=>$.fullName.toLowerCase()===J);if(Q)Q.blob().then(($)=>{$.arrayBuffer().then((O)=>{this.addFont(new Uint8Array(O))})})})}catch(Z){console.warn("Local fonts API:",Z)}}_getLocalFont(J){try{if(navigator?.permissions?.query)navigator.permissions.query({name:"local-fonts"}).then((Z)=>{if(Z.state==="granted")this._sendLocalFont(J.font)});else this._sendLocalFont(J.font)}catch(Z){console.warn("Local fonts API:",Z)}}_unbusy(){if(this._observeDemandCompletion(),this._pendingDemandTimes.length>0){if(this._pendingDemandTimes.length>1){let Z=this._pendingDemandTimes[this._pendingDemandTimes.length-1];this._pendingDemandTimes.length=0,this._pendingDemandTimes.push(Z)}let J=this._pendingDemandTimes.shift();if(J){this._demandRender(J);return}}this.busy=!1}_markDemandDispatched(){if(!this._onDemandRender)return;this._activeDemandStartedAt=performance.now()}_observeDemandCompletion(){if(!this._onDemandRender||this._activeDemandStartedAt===0)return;let J=performance.now()-this._activeDemandStartedAt;if(this._activeDemandStartedAt=0,!Number.isFinite(J)||J<=0)return;this._smoothedDemandLatencyMs=this._smoothedDemandLatencyMs<=0?J:this._smoothedDemandLatencyMs*0.75+J*0.25}_getDemandPipelineLeadSeconds(J,Z){let Q=Z.expectedDisplayTime??Z.presentationTime??J,$=Math.max(0,Q-J)/1000;return Math.max(0,this._smoothedDemandLatencyMs/1000-$)}_enqueueDemand(J){let Z=this._pendingDemandTimes;if(Z.length>0){let Q=Z[Z.length-1];if(Math.abs(Q.mediaTime-J.mediaTime)>0.25)Z.length=0}if(Z.length>=R.MAX_PENDING_DEMANDS)Z.shift();Z.push(J)}_handleRVFC(J,Z){if(this._destroyed)return;let Q=this._video?.playbackRate??1,$=this._getDemandPipelineLeadSeconds(J,Z),N={mediaTime:Z.mediaTime+($+this.renderAhead)*Q,width:Z.width,height:Z.height};if(!this._workerReady){this._enqueueDemand(N),this._video.requestVideoFrameCallback(this._boundHandleRVFC);return}if(this.busy)this._enqueueDemand(N);else this.busy=!0,this._demandRender(N);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._markDemandDispatched(),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",{alpha:!0,desynchronized:!0}),this.sendMessage("detachOffscreen"),this.busy=!1,this._activeDemandStartedAt=0,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:Z,videoColorSpace:Q=this._videoColorSpace}=J;if(!Z||!Q)return;if(Z===Q)return;this._detachOffscreen();let $=y[Z]?.[Q];if($&&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='${$} 0 0 0 0 0 1 0'/></filter></svg>#f")`}_render(J){try{let{width:Z,height:Q}=J;if(this.debug)J.times.IPCTime=Date.now()-(J.times.JSRenderTime||0);if(this._canvasctrl.width!==Z||this._canvasctrl.height!==Q){if(this._canvasctrl.width=Z,this._canvasctrl.height=Q,this._lastRenderWidth=Z,this._lastRenderHeight=Q,this._gpuRenderer)this._gpuRenderer.updateSize(Z,Q);this._verifyColorSpace({subtitleColorSpace:J.colorSpace})}if(this._gpuRenderer){this._renderGPU(J);return}if(!this._ctx)return;let O=this._ctx,N=J.images,K=N.length;if(O.clearRect(0,0,Z,Q),J.asyncRender)for(let F=0;F<K;F++){let G=N[F];if(G.image)O.drawImage(G.image,G.x,G.y),G.image.close()}else{let F=R._hasAlphaBug??!1;for(let G=0;G<K;G++){let U=N[G];if(U.image){let{w:E,h:T,image:q}=U,Y=q instanceof Uint8ClampedArray?q:q instanceof Uint8Array?new Uint8ClampedArray(q.buffer,q.byteOffset,q.byteLength):new Uint8ClampedArray(q),L=m(Y,F);O.putImageData(new ImageData(L,E,T),U.x,U.y)}}}if(this.debug){J.times.JSRenderTime=Date.now()-(J.times.JSRenderTime||0)-(J.times.IPCTime||0);let F=0,G=J.times.bitmaps||K;delete J.times.bitmaps;for(let U in J.times)F+=J.times[U]||0;console.log("Bitmaps: "+G+" Total: "+(F|0)+"ms",J.times)}}finally{this._unbusy()}}_renderGPU(J){let Z=this._gpuRenderer;if(!Z)return;if(J.images.length===0){Z.clear();return}if(J.asyncRender){let Q=this._gpuBitmapImages,$=0;for(let O=0;O<J.images.length;O++){let N=J.images[O];if(!(N.image instanceof ImageBitmap))continue;let K=Q[$]||(Q[$]={image:N.image,x:0,y:0});K.image=N.image,K.x=N.x,K.y=N.y,$++}Q.length=$,Z.renderBitmaps(Q,this._canvasctrl.width,this._canvasctrl.height);for(let O of J.images)if(O.image instanceof ImageBitmap)O.image.close()}else Z.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 Q=0,$=J.times.bitmaps||J.images.length;delete J.times.bitmaps;for(let O in J.times)Q+=J.times[O]||0;console.log(`[${this._rendererType.toUpperCase()}] Bitmaps: `+$+" Total: "+(Q|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"))}_trackReady(){this.dispatchEvent(new CustomEvent("trackReady"))}async sendMessage(J,Z={},Q){if(await this._loaded,Q)this._worker.postMessage({target:J,transferable:Q,...Z},[...Q]);else this._worker.postMessage({target:J,...Z})}_fetchFromWorker(J){return new Promise((Z,Q)=>{try{let $=J.target,O=setTimeout(()=>{F(),Q(Error("Error: Timeout while trying to fetch "+$))},5000),N=(G)=>{if(G.data.target===$)F(),Z(G.data)},K=(G)=>{F(),Q(G instanceof Error?G:G.error||Error("Worker error"))},F=()=>{this._worker.removeEventListener("message",N),this._worker.removeEventListener("error",K),clearTimeout(O)};this._worker.addEventListener("message",N),this._worker.addEventListener("error",K),this._worker.postMessage(J)}catch($){Q($)}})}_console(J){console[J.command].apply(console,JSON.parse(J.content))}_onmessage(J){let Z=J.data.target;if(Z==="error"){this._error(J.data.error||"Unknown worker error");return}let Q=this["_"+Z];if(Q)Q.call(this,J.data)}_error(J){let Z=J instanceof Error?J:J instanceof ErrorEvent?J.error||Error(J.message):Error(String(J)),Q=J instanceof Event?new ErrorEvent(J.type,J):new ErrorEvent("error",{error:Z});return this.dispatchEvent(Q),console.error(Z),Z}_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 Z=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(),Z}}})();
|
|
157
157
|
|
|
158
158
|
return AkariSub;
|
|
159
159
|
}));
|