@rel-packages/osu-beatmap-preview 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/assets/.gitkeep +1 -0
  2. package/dist/assets/fonts/Aller-Bold.ttf +0 -0
  3. package/dist/assets/fonts/Aller-Regular.ttf +0 -0
  4. package/dist/assets/fonts/KozGoProBold.otf +0 -0
  5. package/dist/assets/fonts/KozGoProRegular.otf +0 -0
  6. package/dist/browser/osu-parser.browser.js +0 -0
  7. package/dist/fonts.d.ts +3 -0
  8. package/dist/fonts.d.ts.map +1 -0
  9. package/dist/index.d.ts +2 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -4
  12. package/dist/index.js.map +23 -14
  13. package/dist/math/curves.d.ts.map +1 -1
  14. package/dist/parser/async_parser.d.ts +8 -6
  15. package/dist/parser/async_parser.d.ts.map +1 -1
  16. package/dist/parser/beatmap_parser.d.ts +16 -19
  17. package/dist/parser/beatmap_parser.d.ts.map +1 -1
  18. package/dist/parser/osz_loader.d.ts +1 -0
  19. package/dist/parser/osz_loader.d.ts.map +1 -1
  20. package/dist/player/beatmap_assets.d.ts +19 -0
  21. package/dist/player/beatmap_assets.d.ts.map +1 -0
  22. package/dist/player/player.d.ts +11 -4
  23. package/dist/player/player.d.ts.map +1 -1
  24. package/dist/renderer/backend/canvas_backend.d.ts +6 -0
  25. package/dist/renderer/backend/canvas_backend.d.ts.map +1 -1
  26. package/dist/renderer/backend/render_backend.d.ts +2 -0
  27. package/dist/renderer/backend/render_backend.d.ts.map +1 -1
  28. package/dist/renderer/drawable/circle_visual.d.ts +23 -0
  29. package/dist/renderer/drawable/circle_visual.d.ts.map +1 -0
  30. package/dist/renderer/drawable/drawable_hit_circle.d.ts +1 -7
  31. package/dist/renderer/drawable/drawable_hit_circle.d.ts.map +1 -1
  32. package/dist/renderer/drawable/drawable_slider.d.ts +8 -5
  33. package/dist/renderer/drawable/drawable_slider.d.ts.map +1 -1
  34. package/dist/renderer/standard/follow_points.d.ts +18 -0
  35. package/dist/renderer/standard/follow_points.d.ts.map +1 -0
  36. package/dist/renderer/standard/slider_events.d.ts +28 -0
  37. package/dist/renderer/standard/slider_events.d.ts.map +1 -0
  38. package/dist/renderer/standard/slider_math.d.ts +8 -0
  39. package/dist/renderer/standard/slider_math.d.ts.map +1 -0
  40. package/dist/renderer/standard/slider_path.d.ts +5 -0
  41. package/dist/renderer/standard/slider_path.d.ts.map +1 -0
  42. package/dist/renderer/standard/standard_renderer.d.ts +3 -10
  43. package/dist/renderer/standard/standard_renderer.d.ts.map +1 -1
  44. package/dist/renderer/standard/timing_state.d.ts +17 -0
  45. package/dist/renderer/standard/timing_state.d.ts.map +1 -0
  46. package/dist/skin/skin_config.d.ts +5 -0
  47. package/dist/skin/skin_config.d.ts.map +1 -1
  48. package/dist/types/mods.d.ts.map +1 -1
  49. package/package.json +3 -2
@@ -0,0 +1 @@
1
+
Binary file
@@ -0,0 +1,3 @@
1
+ export declare const wait_for_fonts_ready: () => Promise<void>;
2
+ export declare const load_default_fonts: (base_url?: string) => Promise<void>;
3
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../src/fonts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,IAAI,CAKzD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAU,WAAU,MAAwB,KAAG,OAAO,CAAC,IAAI,CAsCzF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { BeatmapPlayer, type IPlayerOptions } from "./player/player";
2
2
  export { AudioController } from "./player/audio_controller";
3
3
  export { VideoController } from "./player/video_controller";
4
- export { BeatmapParser, extract_preview_time, extract_audio_filename, extract_background_filename, extract_video_info } from "./parser/beatmap_parser";
4
+ export { BeatmapParser, extract_preview_time, extract_audio_filename, extract_background_filename, extract_video_info, configure_wasm_parser, init_wasm_parser, get_wasm_ready } from "./parser/beatmap_parser";
5
5
  export { OszLoader, type IOszLoaderOptions } from "./parser/osz_loader";
6
6
  export * from "./types/beatmap";
7
7
  export * from "./types/mods";
@@ -14,6 +14,7 @@ export { CanvasBackend } from "./renderer/backend/canvas_backend";
14
14
  export { BaseRenderer, type IRendererConfig, DEFAULT_RENDERER_CONFIG, GridLevel, PLAYFIELD_WIDTH, PLAYFIELD_HEIGHT } from "./renderer/base_renderer";
15
15
  export { StandardRenderer } from "./renderer/standard/standard_renderer";
16
16
  export { ManiaRenderer } from "./renderer/mania/mania_renderer";
17
+ export { load_default_fonts, wait_for_fonts_ready } from "./fonts";
17
18
  export { calculate_preempt, calculate_fade_in, calculate_radius, difficulty_range, inverse_difficulty_range, type IDifficultyRange, PREEMPT_RANGE, PREEMPT_MIN } from "./math/difficulty";
18
19
  export { flatten_bezier, flatten_linear, flatten_perfect, flatten_catmull } from "./math/curves";
19
20
  export * from "./math/vector2";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EACH,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,kBAAkB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxE,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAGvH,cAAc,QAAQ,CAAC;AAGvB,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,uBAAuB,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EACH,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,aAAa,EACb,WAAW,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjG,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO,EACH,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,EAC3B,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxE,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,KAAK,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAGvH,cAAc,QAAQ,CAAC;AAGvB,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,uBAAuB,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAGnE,OAAO,EACH,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,aAAa,EACb,WAAW,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACjG,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,3 @@
1
- var r;((D)=>{D[D.Standard=0]="Standard";D[D.Taiko=1]="Taiko";D[D.Catch=2]="Catch";D[D.Mania=3]="Mania"})(r||={});var H0;((D)=>{D[D.Auto=0]="Auto";D[D.Normal=1]="Normal";D[D.Soft=2]="Soft";D[D.Drum=3]="Drum"})(H0||={});var z={Circle:1,Slider:2,NewCombo:4,Spinner:8,ComboSkip:112,Hold:128},n={Normal:1,Whistle:2,Finish:4,Clap:8},x0=(I)=>(I.type&z.Circle)!==0,D0=(I)=>(I.type&z.Slider)!==0,g=(I)=>(I.type&z.Spinner)!==0,M0=(I)=>(I.type&z.Hold)!==0,y0=(I)=>(I.type&z.NewCombo)!==0;var v0;((P)=>{P.NoOsuFiles="NO_OSU_FILES";P.DifficultyNotFound="DIFFICULTY_NOT_FOUND";P.InvalidBeatmap="INVALID_BEATMAP";P.UnsupportedMode="UNSUPPORTED_MODE";P.AudioNotLoaded="AUDIO_NOT_LOADED";P.AudioDecodeError="AUDIO_DECODE_ERROR";P.NotLoaded="NOT_LOADED";P.Unknown="UNKNOWN"})(v0||={});var w0=(I)=>({success:!0,data:I}),L=(I,T)=>({success:!1,code:I,reason:T}),SI=(I)=>{if(I.success)return I.data;throw Error(`[${I.code}] ${I.reason}`)},QI=(I)=>{return I.success},qI=(I)=>{return!I.success};var F={None:0,NoFail:1,Easy:2,TouchDevice:4,Hidden:8,HardRock:16,SuddenDeath:32,DoubleTime:64,Relax:128,HalfTime:256,Nightcore:512,Flashlight:1024,Autoplay:2048,SpunOut:4096,Autopilot:8192,Perfect:16384,FadeIn:8388608,Mirror:1073741824},l0=F.DoubleTime|F.HalfTime|F.Nightcore,ZI=F.HardRock|F.Easy|l0,XI=(I)=>{let T=0,u=I.toLowerCase(),H={nf:F.NoFail,ez:F.Easy,td:F.TouchDevice,hd:F.Hidden,hr:F.HardRock,sd:F.SuddenDeath,dt:F.DoubleTime,rx:F.Relax,ht:F.HalfTime,nc:F.Nightcore,fl:F.Flashlight,at:F.Autoplay,so:F.SpunOut,ap:F.Autopilot,pf:F.Perfect,fi:F.FadeIn,mr:F.Mirror};for(let D=0;D<u.length-1;D+=2){let M=u.slice(D,D+2);if(H[M])T|=H[M]}return T},CI=(I)=>{let T=[];if(I&F.NoFail)T.push("NF");if(I&F.Easy)T.push("EZ");if(I&F.Hidden)T.push("HD");if(I&F.HardRock)T.push("HR");if(I&F.SuddenDeath)T.push("SD");if(I&F.DoubleTime)T.push("DT");if(I&F.HalfTime)T.push("HT");if(I&F.Nightcore)T.push("NC");if(I&F.Flashlight)T.push("FL");if(I&F.SpunOut)T.push("SO");if(I&F.FadeIn)T.push("FI");if(I&F.Mirror)T.push("MR");let u=T.indexOf("DT"),H=T.indexOf("NC");if(u>=0&&H>=0)T.splice(u,1);return T.join("")},k=(I)=>{if(I&(F.DoubleTime|F.Nightcore))return 1.5;if(I&F.HalfTime)return 0.75;return 1},o0=[F.HardRock|F.Easy,F.DoubleTime|F.HalfTime|F.Nightcore,F.Hidden|F.FadeIn],WI=(I,T)=>{if(I&T)return I&~T;let u=I;for(let H of o0)if(T&H)u&=~H;return u|T},K=(I,T)=>(I&T)!==0,KI=(I)=>{let T=[{name:"No Fail",acronym:"NF",value:F.NoFail},{name:"Easy",acronym:"EZ",value:F.Easy},{name:"Hidden",acronym:"HD",value:F.Hidden},{name:"Double Time",acronym:"DT",value:F.DoubleTime},{name:"Half Time",acronym:"HT",value:F.HalfTime},{name:"Nightcore",acronym:"NC",value:F.Nightcore}];switch(I){case"standard":return[...T,{name:"Hard Rock",acronym:"HR",value:F.HardRock},{name:"Flashlight",acronym:"FL",value:F.Flashlight}];case"mania":return[...T,{name:"Fade In",acronym:"FI",value:F.FadeIn},{name:"Mirror",acronym:"MR",value:F.Mirror}];case"taiko":case"catch":return[...T,{name:"Hard Rock",acronym:"HR",value:F.HardRock}];default:return T}};import f0 from"jszip";class c{beatmap;section="";parse(I){this.beatmap=this.create_empty_beatmap(),this.section="";let T=I.split(`
2
- `);for(let u of T)this.parse_line(u);if(this.beatmap.ar===-1)this.beatmap.ar=this.beatmap.od;return this.beatmap}parse_info(I,T){this.beatmap=this.create_empty_beatmap(),this.section="";let u=I.split(`
3
- `);for(let H of u)if(this.parse_line(H),this.section==="Events"||this.section==="TimingPoints"||this.section==="Colours"||this.section==="HitObjects")break;if(this.beatmap.ar===-1)this.beatmap.ar=this.beatmap.od;return{filename:T,title:this.beatmap.title,artist:this.beatmap.artist,version:this.beatmap.version,mode:this.beatmap.mode,ar:this.beatmap.ar,cs:this.beatmap.cs,od:this.beatmap.od,hp:this.beatmap.hp}}create_empty_beatmap(){return{format_version:1,mode:0,title:"",title_unicode:"",artist:"",artist_unicode:"",creator:"",version:"",ar:-1,cs:5,od:5,hp:5,sv:1,tick_rate:1,timing_points:[],objects:[],circle_count:0,slider_count:0,spinner_count:0,hold_count:0}}parse_line(I){if(I.startsWith(" ")||I.startsWith("_"))return;let T=I.trim();if(T.length===0||T.startsWith("//"))return;if(T.startsWith("[")&&T.endsWith("]")){this.section=T.slice(1,-1);return}let u=T.match(/osu file format v(\d+)/);if(u){this.beatmap.format_version=parseInt(u[1]);return}switch(this.section){case"General":this.parse_general(T);break;case"Metadata":this.parse_metadata(T);break;case"Difficulty":this.parse_difficulty(T);break;case"TimingPoints":this.parse_timing_point(T);break;case"HitObjects":this.parse_hit_object(T);break}}parse_general(I){let[T,u]=this.split_property(I);if(T==="Mode")this.beatmap.mode=parseInt(u)}parse_metadata(I){let[T,u]=this.split_property(I);switch(T){case"Title":this.beatmap.title=u;break;case"TitleUnicode":this.beatmap.title_unicode=u;break;case"Artist":this.beatmap.artist=u;break;case"ArtistUnicode":this.beatmap.artist_unicode=u;break;case"Creator":this.beatmap.creator=u;break;case"Version":this.beatmap.version=u;break}}parse_difficulty(I){let[T,u]=this.split_property(I),H=parseFloat(u);switch(T){case"CircleSize":this.beatmap.cs=H;break;case"OverallDifficulty":this.beatmap.od=H;break;case"ApproachRate":this.beatmap.ar=H;break;case"HPDrainRate":this.beatmap.hp=H;break;case"SliderMultiplier":this.beatmap.sv=H;break;case"SliderTickRate":this.beatmap.tick_rate=H;break}}current_beat_length=500;parse_timing_point(I){let T=I.split(",");if(T.length<2)return;let u=parseFloat(T[0]),H=parseFloat(T[1]),D=parseInt(T[3]??"0"),M=parseInt(T[4]??"0"),V=parseInt(T[5]??"100"),B=T.length>=7?T[6].trim()!=="0":!0,P=T.length>=8?(parseInt(T[7])&1)!==0:!1,$=H<0,J=$?-100/H:1;if(!$&&H>0)this.current_beat_length=H;this.beatmap.timing_points.push({time:u,ms_per_beat:H,change:B,sample_set:D,sample_index:M,volume:V,kiai:P,velocity:J,beat_length:this.current_beat_length})}parse_hit_object(I){let T=I.split(",");if(T.length<4)return;let u=parseFloat(T[0]),H=parseFloat(T[1]),D=parseFloat(T[2]),M=parseInt(T[3]),V=parseInt(T[4]??"0"),B={time:D,type:M,hit_sound:V,end_time:D,end_pos:[u,H],combo_number:0,combo_count:0,data:{pos:[u,H]}};if(M&z.Circle)this.beatmap.circle_count++,B.data={pos:[u,H]},this.parse_extras(T,5,B);else if(M&z.Slider){if(T.length<8)return;this.beatmap.slider_count++;let P=this.parse_slider_data(T,u,H);if(B.data=P,T.length>8)B.edge_sounds=T[8].split("|").map(($)=>parseInt($));if(T.length>9)B.edge_sets=T[9].split("|").map(($)=>{let J=$.split(":");return[parseInt(J[0]),parseInt(J[1])]});this.parse_extras(T,10,B)}else if(M&z.Spinner){this.beatmap.spinner_count++;let P=parseInt(T[5]);B.data={end_time:P},B.end_time=P,B.end_pos=[256,192],this.parse_extras(T,6,B)}else if(M&z.Hold){this.beatmap.hold_count++;let P=parseInt(T[5].split(":")[0]);B.data={pos:[u,H],end_time:P},B.end_time=P,this.parse_extras(T,6,B)}this.beatmap.objects.push(B)}parse_extras(I,T,u){if(T<I.length){let H=I[T];if(H&&H.includes(":")){let D=H.split(":");u.hit_sample={normal_set:parseInt(D[0]),addition_set:parseInt(D[1]),index:parseInt(D[2]),volume:parseInt(D[3]),filename:D[4]||void 0}}}}parse_slider_data(I,T,u){let H=I[5].split("|"),D=H[0],M=[];for(let P=1;P<H.length;P++){let $=H[P].split(":");M.push([parseInt($[0]),parseInt($[1])])}let V=parseInt(I[6]),B=parseFloat(I[7]);return{pos:[T,u],path_type:D,control_points:M,repetitions:V,distance:B}}split_property(I){let T=I.indexOf(":");if(T===-1)return[I,""];return[I.slice(0,T).trim(),I.slice(T+1).trim()]}}var p=4096,V0=(I)=>{let T=I.slice(0,p).match(/PreviewTime:\s*([+-]?\d+)/);return T?parseInt(T[1]):-1},P0=(I)=>{let T=I.slice(0,p).match(/AudioFilename:\s*(.+)/);return T?T[1].trim():null},B0=(I)=>{let T=I.slice(0,p).match(/0,0,"([^"]+)"/);return T?T[1]:null},$0=(I)=>{let T=I.slice(0,p).match(/(?:Video|1),(-?\d+),"([^"]+)"/);if(!T)return null;return{offset:parseInt(T[1]),filename:T[2]}};var j0=new c,x=(I)=>{return new Promise((T,u)=>{queueMicrotask(()=>{try{T(I())}catch(H){u(H)}})})};class l{parse(I){return x(()=>j0.parse(I))}parse_info(I,T){return x(()=>j0.parse_info(I,T))}extract_audio_filename(I){return x(()=>P0(I))}extract_background_filename(I){return x(()=>B0(I))}extract_video_info(I){return x(()=>$0(I))}extract_preview_time(I){return x(()=>V0(I))}dispose(){}}var F0=null,J0=()=>{if(!F0)F0=new l;return F0};class y{parser=new l;async load_osz(I,T){let u=await f0.loadAsync(I),H=new Map;for(let[D,M]of Object.entries(u.files))if(!M.dir)H.set(D,await M.async("arraybuffer"));return this.load_from_files(H,T)}async load_from_files(I,T){let u=[...I.keys()].filter((Q)=>Q.toLowerCase().endsWith(".osu"));if(u.length===0)throw Error("No .osu files found in beatmap");let H=await Promise.all(u.map(async(Q)=>{let W=this.to_string(I.get(Q));return this.parser.parse_info(W,Q)})),D=this.select_difficulty(u,I,T?.difficulty),M=this.to_string(I.get(D)),V=await this.parser.parse(M),[B,P,$]=await Promise.all([this.parser.extract_audio_filename(M),this.parser.extract_background_filename(M),this.parser.extract_video_info(M)]),J=new Map;for(let[Q,W]of I)if(W instanceof ArrayBuffer)J.set(Q,W);else J.set(Q,new TextEncoder().encode(W).buffer);let R;if(B)R=this.find_file(J,B);let S;if(P){let Q=this.find_file(J,P);if(Q)S=new Blob([Q])}let q,C;if($){let Q=this.find_file(J,$.filename);if(Q)q=new Blob([Q]),C=$.offset}return{beatmap:V,available_difficulties:H,files:J,audio:R,background:S,video:q,audio_filename:B??void 0,background_filename:P??void 0,video_filename:$?.filename,video_offset:C}}async list_difficulties(I){let T=await f0.loadAsync(I),u=[];for(let D of Object.keys(T.files))if(D.toLowerCase().endsWith(".osu"))u.push(D);let H=[];for(let D of u){let V=(await T.files[D].async("string")).match(/Version:\s*(.+)/);H.push(V?V[1].trim():D)}return H}select_difficulty(I,T,u){if(u===void 0)return I[0];if(typeof u==="number"){if(u<0||u>=I.length)throw Error(`Difficulty index ${u} out of range (0-${I.length-1})`);return I[u]}for(let H of I){let M=this.to_string(T.get(H)).match(/Version:\s*(.+)/);if(M&&M[1].trim()===u)return H}for(let H of I)if(H.toLowerCase().includes(u.toLowerCase()))return H;throw Error(`Difficulty "${u}" not found`)}find_file(I,T){if(I.has(T))return I.get(T);let u=T.toLowerCase();for(let[H,D]of I)if(H.toLowerCase()===u)return D;return}to_string(I){if(typeof I==="string")return I;return new TextDecoder().decode(I)}}var R0=512,S0=384,g0;((M)=>{M[M.None=0]="None";M[M.Large=32]="Large";M[M.Medium=16]="Medium";M[M.Small=8]="Small";M[M.Tiny=4]="Tiny"})(g0||={});var G={offset_x:64,offset_y:48,scale:1,show_playfield:!0,playfield_color:"#ffffff",playfield_opacity:0.1,grid_level:0,grid_color:"#ffffff",grid_opacity:0.35,use_high_dpi:!0};class v{backend;skin;config;mods;beatmap;objects=[];background_image=null;constructor(I,T,u=0,H=G){this.backend=I,this.skin=T,this.mods=u,this.config={...G,...H}}set_background(I){this.background_image=I}update_config(I){this.config={...this.config,...I}}dispose(){this.objects=[]}render_playfield(I,T,u,H){if(!this.config.show_playfield)return;let{backend:D,config:M}=this,V=I??512,B=T??384,P=u??0,$=H??0;D.save(),D.set_alpha(M.playfield_opacity),D.begin_path(),D.move_to(P,$),D.line_to(P+V,$),D.line_to(P+V,$+B),D.line_to(P,$+B),D.line_to(P,$),D.stroke_path(M.playfield_color,2),D.restore()}render_grid(){if(this.config.grid_level===0)return;let{backend:I,config:T}=this,u=T.grid_level;I.save(),I.set_alpha(T.grid_opacity);for(let H=0;H<=512;H+=u)I.begin_path(),I.move_to(H,0),I.line_to(H,384),I.stroke_path(T.grid_color,H%(u*4)===0?1:0.5);for(let H=0;H<=384;H+=u)I.begin_path(),I.move_to(0,H),I.line_to(512,H),I.stroke_path(T.grid_color,H%(u*4)===0?1:0.5);I.restore()}render_background(){if(!this.background_image)return;let{backend:I}=this;I.save(),I.set_alpha(0.3);let{width:T,height:u}=I,{width:H,height:D}=this.background_image;if(H>0&&D>0){let M=Math.max(T/H,u/D),V=H*M,B=D*M,P=(T-V)/2,$=(u-B)/2;I.draw_image(this.background_image,P,$,V,B)}else I.draw_image(this.background_image,0,0,T,u);I.restore()}get_visible_objects(I,T,u){let H=[];for(let D of this.objects){let M=D.time-T,V=D.end_time+u;if(I>=M&&I<=V)H.push(D)}return H}}class o{ctx;_width=0;_height=0;_dpr=1;get width(){return this._width}get height(){return this._height}initialize(I,T=!0){this._dpr=T?window.devicePixelRatio||1:1;let u=I.clientWidth||I.width,H=I.clientHeight||I.height;I.width=u*this._dpr,I.height=H*this._dpr;let D=I.getContext("2d",{alpha:!0,desynchronized:!0});if(!D)throw Error("Failed to get 2D context");this.ctx=D,this._width=u,this._height=H,D.scale(this._dpr,this._dpr),D.imageSmoothingEnabled=!0,D.imageSmoothingQuality="high"}clear(){this.ctx.save(),this.ctx.setTransform(this._dpr,0,0,this._dpr,0,0),this.ctx.clearRect(0,0,this._width,this._height),this.ctx.restore()}dispose(){}resize(I,T){this._width=I,this._height=T,this._dpr=window.devicePixelRatio||1;let u=this.ctx.canvas;u.width=I*this._dpr,u.height=T*this._dpr,u.style.width=`${I}px`,u.style.height=`${T}px`,this.ctx.resetTransform(),this.ctx.scale(this._dpr,this._dpr),this.ctx.imageSmoothingEnabled=!0,this.ctx.imageSmoothingQuality="high"}draw_circle(I,T,u,H,D,M){let V=this.ctx;if(V.beginPath(),V.arc(I,T,u,0,Math.PI*2),H&&H!=="transparent")V.fillStyle=H,V.fill();if(D&&M&&M>0)V.strokeStyle=D,V.lineWidth=M,V.stroke()}draw_arc(I,T,u,H,D,M,V,B=!1){let P=this.ctx;P.beginPath(),P.arc(I,T,u,H,D,B),P.strokeStyle=M,P.lineWidth=V,P.stroke()}draw_rect(I,T,u,H,D){this.ctx.fillStyle=D,this.ctx.fillRect(I,T,u,H)}draw_rect_gradient(I,T,u,H,D){this.ctx.fillStyle=D,this.ctx.fillRect(I,T,u,H)}create_linear_gradient(I,T,u,H,D){let M=this.ctx.createLinearGradient(I,T,u,H);for(let V of D)M.addColorStop(V.offset,V.color);return M}draw_text(I,T,u,H,D,M="left",V="alphabetic"){let B=this.ctx;B.font=H,B.fillStyle=D,B.textAlign=M,B.textBaseline=V,B.fillText(I,T,u)}begin_path(){this.ctx.beginPath()}move_to(I,T){this.ctx.moveTo(I,T)}line_to(I,T){this.ctx.lineTo(I,T)}bezier_curve_to(I,T,u,H,D,M){this.ctx.bezierCurveTo(I,T,u,H,D,M)}quadratic_curve_to(I,T,u,H){this.ctx.quadraticCurveTo(I,T,u,H)}arc_to(I,T,u,H,D,M){this.ctx.arc(I,T,u,H,D,M)}rect(I,T,u,H){this.ctx.rect(I,T,u,H)}clip(){this.ctx.clip()}stroke_path(I,T,u="butt",H="miter"){let D=this.ctx;D.strokeStyle=I,D.lineWidth=T,D.lineCap=u,D.lineJoin=H,D.stroke()}fill_path(I){this.ctx.fillStyle=I,this.ctx.fill()}close_path(){this.ctx.closePath()}save(){this.ctx.save()}restore(){this.ctx.restore()}translate(I,T){this.ctx.translate(I,T)}scale(I,T){this.ctx.scale(I,T)}rotate(I){this.ctx.rotate(I)}set_alpha(I){this.ctx.globalAlpha=I}set_shadow(I,T){this.ctx.shadowColor=I,this.ctx.shadowBlur=T}set_composite_operation(I){this.ctx.globalCompositeOperation=I}set_blend_mode(I){let T={normal:"source-over",lighter:"lighter",multiply:"multiply",screen:"screen"};this.ctx.globalCompositeOperation=T[I]??"source-over"}draw_image(I,T,u,H,D){if(H!==void 0&&D!==void 0)this.ctx.drawImage(I.source,T,u,H,D);else this.ctx.drawImage(I.source,T,u)}draw_image_part(I,T,u,H,D,M,V,B,P){this.ctx.drawImage(I.source,T,u,H,D,M,V,B,P)}render_slider_to_image(I,T,u,H,D,M=1,V=1){let B=1/0,P=1/0,$=-1/0,J=-1/0;for(let X of I){if(X[0]<B)B=X[0];if(X[0]>$)$=X[0];if(X[1]<P)P=X[1];if(X[1]>J)J=X[1]}let R=T+2;B-=R,P-=R,$+=R,J+=R;let S=Math.ceil(($-B)*D),q=Math.ceil((J-P)*D);if(S<=0||q<=0)return null;let C=document.createElement("canvas");C.width=S,C.height=q;let Q=C.getContext("2d");if(!Q)return null;Q.save(),Q.scale(D,D),Q.translate(-B,-P);let W=()=>{if(Q.beginPath(),I.length>0){Q.moveTo(I[0][0],I[0][1]);for(let X=1;X<I.length;X++)Q.lineTo(I[X][0],I[X][1])}};Q.lineCap="round",Q.lineJoin="round",Q.globalAlpha=V,Q.strokeStyle=u,Q.lineWidth=T*2,W(),Q.stroke();let Z=T*0.872;if(M<1)Q.globalCompositeOperation="destination-out",Q.globalAlpha=1,Q.lineWidth=Z*2,W(),Q.stroke(),Q.globalCompositeOperation="source-over";return Q.globalAlpha=M,Q.strokeStyle=H,Q.lineWidth=Z*2,W(),Q.stroke(),Q.restore(),{source:C,width:S,height:q,min_x:B,min_y:P}}}var d={min:1800,mid:1200,max:450},d0=450,k0=(I,T)=>{if(I>5)return T.mid+(T.max-T.mid)*(I-5)/5;if(I<5)return T.mid+(T.mid-T.min)*(I-5)/5;return T.mid},Q0=(I,T)=>{if(Math.sign(I-T.mid)===Math.sign(T.max-T.mid))return(I-T.mid)/(T.max-T.mid)*5+5;return(I-T.mid)/(T.mid-T.min)*5+5},b=(I)=>k0(I,d),q0=(I)=>400*Math.min(1,I/450),_0=(I)=>{return(1-0.7*((I-5)/5))/2},N0=(I)=>_0(I)*64;var Z0={name:"Hard Rock",acronym:"HR",apply_to_difficulty(I){I.cs=Math.min(I.cs*1.3,10),I.ar=Math.min(I.ar*1.4,10),I.od=Math.min(I.od*1.4,10),I.hp=Math.min(I.hp*1.4,10)}};var X0={name:"Easy",acronym:"EZ",apply_to_difficulty(I){I.cs*=0.5,I.ar*=0.5,I.od*=0.5,I.hp*=0.5}};var s0={name:"Double Time",acronym:"DT",get_rate_multiplier:()=>1.5},i0={name:"Nightcore",acronym:"NC",get_rate_multiplier:()=>1.5};var t0={name:"Half Time",acronym:"HT",get_rate_multiplier:()=>0.75};var a0=0.4,e0=0.3,II={name:"Hidden",acronym:"HD"};var C0=(I)=>{if(I&(F.DoubleTime|F.Nightcore))return 1.5;if(I&F.HalfTime)return 0.75;return 1},TI=(I,T)=>{if(T&F.Easy)X0.apply_to_difficulty(I);if(T&F.HardRock)Z0.apply_to_difficulty(I)},uI=(I,T)=>{if(T===1)return I;let u=b(I)/T;return Q0(u,d)},b0=(I,T,u,H,D)=>{let M={cs:I,ar:T,od:u,hp:H};TI(M,D);let V=C0(D);return M.ar=uI(M.ar,V),M};var h0=(I,T)=>[I[0]+T[0],I[1]+T[1]],U=(I,T)=>[I[0]-T[0],I[1]-T[1]],m0=(I,T)=>[I[0]*T,I[1]*T],HI=(I,T)=>[I[0]/T,I[1]/T],_I=(I,T)=>I[0]*T[0]+I[1]*T[1],Y=(I)=>Math.sqrt(I[0]*I[0]+I[1]*I[1]),sI=(I)=>I[0]*I[0]+I[1]*I[1],iI=(I,T)=>Y(U(I,T)),tI=(I)=>{let T=Y(I);return T>0?HI(I,T):[0,0]},E=(I,T,u)=>I+(T-I)*u,w=(I,T,u)=>[E(I[0],T[0],u),E(I[1],T[1],u)],N=(I,T,u)=>Math.min(u,Math.max(T,I));var _=(I,T=0.25)=>{if(I.length<2)return[...I];let u=[];return W0(I,u,T),u},W0=(I,T,u)=>{if(DI(I,u)){if(T.length===0)T.push(I[0]);T.push(I[I.length-1]);return}let H=[],D=[];VI(I,H,D),W0(H,T,u),W0(D,T,u)},DI=(I,T)=>{if(I.length<=2)return!0;let u=I[0],H=I[I.length-1];for(let D=1;D<I.length-1;D++)if(MI(I[D],u,H)>T)return!1;return!0},MI=(I,T,u)=>{let H=U(u,T),D=H[0]*H[0]+H[1]*H[1];if(D===0)return Y(U(I,T));let M=Math.max(0,Math.min(1,((I[0]-T[0])*H[0]+(I[1]-T[1])*H[1])/D)),V=[T[0]+M*H[0],T[1]+M*H[1]];return Y(U(I,V))},VI=(I,T,u)=>{let H=I.length,D=[I];for(let M=1;M<H;M++){D[M]=[];for(let V=0;V<H-M;V++)D[M][V]=w(D[M-1][V],D[M-1][V+1],0.5)}for(let M=0;M<H;M++)T.push(D[M][0]),u.push(D[H-1-M][M])},s=(I,T,u)=>{let H=U(T,I),D=Y(H);if(D===0)return[I];let M=[H[0]/D,H[1]/D],V=h0(I,m0(M,u));return[I,V]},K0=(I,T)=>{if(I.length!==3)return _(I);let[u,H,D]=I,M=PI(u,H,D);if(!M)return s(u,D,T);let V=Y(U(u,M)),B=Math.atan2(u[1]-M[1],u[0]-M[0]),P=Math.atan2(D[1]-M[1],D[0]-M[0]),J=(H[0]-u[0])*(D[1]-u[1])-(H[1]-u[1])*(D[0]-u[0])>0,R=P-B;if(J&&R<0)R+=2*Math.PI;if(!J&&R>0)R-=2*Math.PI;let S=Math.abs(R)*V,q=Math.max(2,Math.ceil(Math.abs(R)*V/4)),C=[];for(let Q=0;Q<=q;Q++){let W=Q/q,Z=B+R*W*Math.min(1,T/S);C.push([M[0]+V*Math.cos(Z),M[1]+V*Math.sin(Z)])}return C},PI=(I,T,u)=>{let H=2*(I[0]*(T[1]-u[1])+T[0]*(u[1]-I[1])+u[0]*(I[1]-T[1]));if(Math.abs(H)<0.001)return null;let D=((I[0]*I[0]+I[1]*I[1])*(T[1]-u[1])+(T[0]*T[0]+T[1]*T[1])*(u[1]-I[1])+(u[0]*u[0]+u[1]*u[1])*(I[1]-T[1]))/H,M=((I[0]*I[0]+I[1]*I[1])*(u[0]-T[0])+(T[0]*T[0]+T[1]*T[1])*(I[0]-u[0])+(u[0]*u[0]+u[1]*u[1])*(T[0]-I[0]))/H;return[D,M]},U0=(I)=>{if(I.length<2)return[...I];let T=[];for(let u=0;u<I.length-1;u++){let H=I[Math.max(0,u-1)],D=I[u],M=I[u+1],V=I[Math.min(I.length-1,u+2)],B=50;for(let P=0;P<=50;P++){let $=P/50;T.push(BI(H,D,M,V,$))}}return T},BI=(I,T,u,H,D)=>{let M=D*D,V=M*D;return[0.5*(2*T[0]+(-I[0]+u[0])*D+(2*I[0]-5*T[0]+4*u[0]-H[0])*M+(-I[0]+3*T[0]-3*u[0]+H[0])*V),0.5*(2*T[1]+(-I[1]+u[1])*D+(2*I[1]-5*T[1]+4*u[1]-H[1])*M+(-I[1]+3*T[1]-3*u[1]+H[1])*V)]};var Y0={1:["#d5bc00"],2:["#ffffff","#ffffff"],3:["#ffffff","#d5bc00","#ffffff"],4:["#ffffff","#dc8dba","#dc8dba","#ffffff"],5:["#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff"],6:["#ffffff","#dc8dba","#ffffff","#ffffff","#dc8dba","#ffffff"],7:["#ffffff","#dc8dba","#ffffff","#d5bc00","#ffffff","#dc8dba","#ffffff"],8:["#d5bc00","#ffffff","#dc8dba","#ffffff","#d5bc00","#ffffff","#dc8dba","#ffffff"],9:["#ffffff","#dc8dba","#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff","#dc8dba","#ffffff"],10:["#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff","#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff"]},O0={combo_colors:["0,185,0","7, 105, 227","224, 4, 38","227, 171, 2"],circle_border_width:0.12,hit_circle_opacity:0.95,enable_approach_circle:!0,approach_circle_width:0.1,approach_circle_opacity:0.5,approach_circle_use_combo_color:!0,enable_glow:!1,glow_use_combo_color:!0,glow_opacity:0.3,enable_hit_explode:!0,slider_body_opacity:0.9,slider_border_opacity:1,slider_tick_opacity:0.75,slider_tick_size:0.1,follow_circle_factor:1.5,follow_circle_width:4,follow_circle_opacity:0.5,follow_circle_color:"#d3d3d3ff",follow_circle_use_combo_color:!1,slider_ball_color:"#ffffff",slider_ball_opacity:1,enable_slider_ball:!0,follow_point_width:2,spinner_size:180,spinner_center_size:10,mania_lane_width:30,mania_note_height:15,mania_hit_position:364,mania_lane_spacing:1,mania_lane_colors:Y0,font_family:'"Exo 2", sans-serif',hit_animation_duration:300,hit_animation_scale:1.3,enable_hit_animations:!0,enable_follow_circle_animations:!0},i=(I)=>{if(!I)return{...O0};return{...O0,...I,mania_lane_colors:I.mania_lane_colors?{...Y0,...I.mania_lane_colors}:Y0}},A=(I,T,u=1)=>{return`rgba(${I.combo_colors[T%I.combo_colors.length]},${u})`},h=(I,T,u)=>{let H=I.mania_lane_colors[T]??I.mania_lane_colors[4];return H[u%H.length]??"#ffffff"};var O={None:(I)=>I,Out:(I)=>1-Math.pow(1-I,2),In:(I)=>I*I,InOut:(I)=>I<0.5?2*I*I:1-Math.pow(-2*I+2,2)/2,OutCubic:(I)=>1-Math.pow(1-I,3),InCubic:(I)=>I*I*I,OutQuad:(I)=>1-Math.pow(1-I,2),InQuad:(I)=>I*I,OutQuint:(I)=>1-Math.pow(1-I,5),InQuint:(I)=>I*I*I*I*I,OutElastic:(I)=>{let T=2*Math.PI/3;return I===0?0:I===1?1:Math.pow(2,-10*I)*Math.sin((I*10-0.75)*T)+1}};class t{transforms=[];add(I,T,u,H,D,M=O.None){return this.transforms.push({property:I,start_value:T,end_value:u,start_time:H,end_time:H+D,easing:M}),this}then(){return this}get_value(I,T,u){let H=u;for(let D of this.transforms){if(D.property!==I)continue;if(T<D.start_time)continue;if(T>=D.end_time)H=D.end_value;else{let M=(T-D.start_time)/(D.end_time-D.start_time),V=D.easing(M);H=D.start_value+(D.end_value-D.start_value)*V}}return H}clear(){this.transforms=[]}}class j{backend;skin;hit_object;config;alpha=1;scale=1;rotation=0;x=0;y=0;armed_state=0;transforms=new t;life_time_start=0;life_time_end=0;constructor(I,T){this.hit_object=I,this.config=T,this.backend=T.backend,this.skin=T.skin;let u=I.data;this.x=u.pos[0],this.y=u.pos[1],this.apply_defaults()}apply_defaults(){let{hit_object:I,config:T}=this,u=I.time-T.preempt;this.life_time_start=u,this.life_time_end=I.end_time+800}is_alive(I){return I>=this.life_time_start&&I<=this.life_time_end}update(I){this.alpha=this.transforms.get_value("alpha",I,1),this.scale=this.transforms.get_value("scale",I,1),this.rotation=this.transforms.get_value("rotation",I,0),this.update_state(I)}update_state(I){if(this.armed_state===0&&I>=this.hit_object.time)this.armed_state=1,this.on_hit(I)}on_hit(I){}render_body_pass(I){}render_head_pass(I){}get start_time(){return this.hit_object.time}get end_time(){return this.hit_object.end_time}get combo_number(){return this.hit_object.combo_number??0}get combo_count(){return this.hit_object.combo_count??1}get position(){return[this.x,this.y]}}class a extends j{circle_alpha=0;circle_scale=1;approach_alpha=0;approach_scale=4;flash_alpha=0;explode_alpha=0;constructor(I,T){super(I,T)}update(I){super.update(I),this.calculate_animations(I)}calculate_animations(I){let{config:T,hit_object:u}=this,H=u.time-T.preempt,D=u.time;if(this.flash_alpha=0,this.explode_alpha=0,I<H){this.circle_alpha=0,this.circle_scale=1,this.approach_alpha=0,this.approach_scale=4;return}if(I<D){let R=N((I-H)/T.fade_in,0,1);if(K(T.mods,F.Hidden)){let S=D-T.preempt*0.4,q=T.preempt*0.3;if(I>S){let C=N((I-S)/q,0,1);R*=1-C}}this.circle_alpha=R,this.circle_scale=1,this.approach_alpha=0,this.approach_scale=1;return}let M=I-D,V=40,B=100,P=400,$=240;if(this.approach_alpha=0.9*(1-N(M/50,0,1)),this.approach_scale=1,M<V)this.flash_alpha=0.8*(M/V);else if(M<V+B)this.flash_alpha=0.8*(1-(M-V)/B);if(M<V)this.explode_alpha=M/V;else this.explode_alpha=1-N((M-V)/($*2),0,1);let J=N(M/P,0,1);this.circle_scale=1+0.4*O.OutQuad(J),this.circle_alpha=1-N(M/$,0,1)}render(I){let{backend:T,skin:u,config:H,hit_object:D}=this,{radius:M}=H,V=this.position,B=A(u,this.combo_number,1);if(this.circle_alpha<=0&&this.approach_alpha<=0&&this.flash_alpha<=0&&this.explode_alpha<=0)return;let P=M*this.circle_scale;if(this.circle_alpha>0.01){let $=M*u.circle_border_width,J=M*(1-u.circle_border_width/2);T.set_alpha(this.circle_alpha*u.hit_circle_opacity),T.draw_circle(V[0],V[1],J,B,"rgba(255,255,255,1)",$);let R=M*0.8;T.draw_text(String(this.combo_count),V[0],V[1]+R*0.05,`600 ${R}px ${u.font_family}`,"rgba(255,255,255,1)","center","middle"),T.set_alpha(1)}if(u.enable_hit_explode&&this.flash_alpha>0.01)T.save(),T.set_blend_mode("lighter"),T.set_alpha(this.flash_alpha),T.draw_circle(V[0],V[1],P,"rgba(255,255,255,1)","transparent",0),T.restore();if(u.enable_hit_explode&&this.explode_alpha>0.01)T.save(),T.set_blend_mode("lighter"),T.set_alpha(this.explode_alpha*0.15),T.draw_circle(V[0],V[1],P*1.2,B,"transparent",0),T.restore()}}var z0=240,r0=150,L0=1.3,G0=35,$I=250,FI=300;class f extends j{slider_data;path;path_length;span_duration;body_alpha=0;head_alpha=0;head_scale=1;ball_alpha=0;ball_position;follow_alpha=0;follow_scale=1;ticks=[];repeats=[];tick_distance;cached_texture=null;constructor(I,T,u,H,D){super(I,T);this.slider_data=I.data,this.path=u,this.span_duration=H,this.tick_distance=D,this.path_length=this.calculate_path_length(),this.ball_position=this.slider_data.pos,this.generate_nested_objects(),this.life_time_end=I.end_time+z0}generate_nested_objects(){this.ticks=[],this.repeats=[];let{slider_data:I,path_length:T,span_duration:u,hit_object:H,tick_distance:D}=this,M=I.repetitions;if(D<=0||T<=0)return;let B=T/u*10;for(let P=0;P<M-1;P++){let $=H.time+(P+1)*u,J=(P+1)%2;this.repeats.push({pos:this.get_position_at_progress(J),time:$,repeat_index:P,path_progress:J})}for(let P=0;P<M;P++){let $=H.time+P*u,J=P%2===1;for(let R=D;R<T;R+=D){if(R>=T-B)break;let S=R/T,q=J?1-S:S;this.ticks.push({pos:this.get_position_at_progress(S),time:$+q*u,span_index:P,path_progress:S})}}this.ticks.sort((P,$)=>P.time-$.time)}calculate_path_length(){let I=0;for(let T=1;T<this.path.length;T++)I+=Y(U(this.path[T],this.path[T-1]));return I}update(I){super.update(I),this.calculate_ball_position(I),this.calculate_opacities(I)}calculate_ball_position(I){let{hit_object:T,span_duration:u}=this,H=300,D=300,M=2.4;if(I<T.time){this.ball_alpha=0,this.follow_alpha=0,this.follow_scale=1;return}if(I<=T.end_time){let $=I-T.time,J=$%(u*2),R=J<u?J/u:2-J/u;R=N(R,0,1),this.ball_position=this.get_position_at_progress(R),this.ball_alpha=1;let S=N($/300,0,1),q=O.OutQuint(S);this.follow_alpha=q,this.follow_scale=1+1.4*q;return}let V=I-T.end_time,B=N(V/300,0,1),P=O.OutQuint(B);this.ball_alpha=1-P,this.follow_alpha=1-P,this.follow_scale=2.4-1.4*P}get_position_at_progress(I){let T=I*this.path_length;return this.get_position_at_length(T)}get_position_at_length(I){let T=0;for(let u=1;u<this.path.length;u++){let H=Y(U(this.path[u],this.path[u-1]));if(T+H>=I){let D=(I-T)/H;return w(this.path[u-1],this.path[u],D)}T+=H}return this.path[this.path.length-1]}calculate_opacities(I){let{hit_object:T,config:u}=this,H=T.time-u.preempt,D=T.time;if(I<H)this.body_alpha=0;else if(I<D)this.body_alpha=N((I-H)/u.fade_in,0,1);else if(I<=T.end_time)this.body_alpha=1;else this.body_alpha=1-N((I-T.end_time)/z0,0,1);if(I<H)this.head_alpha=0,this.head_scale=1;else if(I<D)this.head_alpha=N((I-H)/u.fade_in,0,1),this.head_scale=1;else if(I<D+r0){let M=(I-D)/r0,V=O.OutCubic(M);this.head_alpha=1-V,this.head_scale=1+V*0.5}else this.head_alpha=0;if(K(u.mods,F.Hidden)){let V=D-u.preempt+u.preempt*0.4,B=T.end_time-V;if(I>V&&B>0){let J=1-N((I-V)/B,0,1);this.body_alpha*=J}let P=D-u.preempt*0.4,$=u.preempt*0.3;if(I>P){let J=1-N((I-P)/$,0,1);this.head_alpha*=J}}}render(I){if(this.body_alpha<=0&&this.head_alpha<=0&&this.ball_alpha<=0)return;this.render_body(I),this.render_head(),this.render_ball(I)}render_body_pass(I){this.render_body(I)}render_head_pass(I){this.render_head(),this.render_reverse_arrows(I),this.render_ball(I)}render_body(I){if(this.body_alpha<=0.01||this.path.length<2)return;let{backend:T,skin:u,config:H,path:D}=this,{radius:M}=H;if(!this.cached_texture){let V=A(u,this.combo_number,1),B=u.slider_border_color??"rgba(255,255,255,1)",P=H.scale??1;this.cached_texture=T.render_slider_to_image(D,M,B,V,P,u.slider_body_opacity,u.slider_border_opacity)}if(this.cached_texture&&this.cached_texture.min_x!==void 0&&this.cached_texture.min_y!==void 0){let V=H.scale??1;T.set_alpha(this.body_alpha),T.draw_image(this.cached_texture,this.cached_texture.min_x,this.cached_texture.min_y,this.cached_texture.width/V,this.cached_texture.height/V),T.set_alpha(1)}this.render_ticks(I)}render_ticks(I){if(this.ticks.length===0)return;let{backend:T,config:u,hit_object:H}=this,{radius:D}=u,M=D*0.12,V=H.time-u.preempt,B=N((I-V)/u.preempt,0,1),P=150,$=P*4;for(let J of this.ticks){if(I>J.time)continue;if(B<J.path_progress)continue;let R=V+J.path_progress*u.preempt,S=I-R;if(S<0)continue;let q=N(S/P,0,1);q*=this.body_alpha;let C=N(S/$,0,1),W=0.5+0.5*this.ease_out_elastic_half(C),Z=M*W;if(q>0.01)T.set_alpha(q),T.draw_circle(J.pos[0],J.pos[1],Z,"rgba(255,255,255,0.8)","transparent",0)}T.set_alpha(1)}ease_out_elastic_half(I){if(I<=0)return 0;if(I>=1)return 1;let T=0.3;return Math.pow(2,-10*I)*Math.sin((I-T/4)*(2*Math.PI)/T)+1}render_reverse_arrows(I){if(this.repeats.length===0)return;let{backend:T,config:u,hit_object:H,span_duration:D}=this,{radius:M}=u,V=M*0.6;for(let B of this.repeats){let P=u.preempt;if(B.repeat_index>0)P=D*2;else P+=H.time-(H.time-u.preempt);let $=B.time-P,J=B.repeat_index%2===0;if(I<$||I>B.time+z0)continue;let R=this.body_alpha*0.9;if(B.repeat_index===0){let Z=N((I-$)/150,0,1);R*=O.OutQuint(Z)}else if(I<$)R=0;if(I>B.time){let Z=Math.min(300,D);R*=1-N((I-B.time)/Z,0,1)}if(R<=0.01)continue;let S=this.path,q;if(J){let Z=S.length-1;q=S[0];for(let X=Z;X>=0;X--)if(Math.abs(S[X][0]-B.pos[0])>0.01||Math.abs(S[X][1]-B.pos[1])>0.01){q=S[X];break}}else{q=S[S.length-1];for(let Z=0;Z<S.length;Z++)if(Math.abs(S[Z][0]-B.pos[0])>0.01||Math.abs(S[Z][1]-B.pos[1])>0.01){q=S[Z];break}}let C=Math.atan2(q[1]-B.pos[1],q[0]-B.pos[0]),Q=1;if(I<B.time){let Z=H.time-u.preempt,X=(I-Z)%FI;if(X<G0)Q=1+(L0-1)*O.Out(X/G0);else{let m=(X-G0)/$I;Q=L0-(L0-1)*O.Out(N(m,0,1))}}else{let Z=Math.min(300,D),X=N((I-B.time)/Z,0,1);Q=1+0.5*O.Out(X)}let W=V*Q;T.save(),T.set_alpha(R),T.translate(B.pos[0],B.pos[1]),T.rotate(C),T.begin_path(),T.move_to(W*0.8,0),T.line_to(-W*0.4,-W*0.5),T.line_to(-W*0.4,W*0.5),T.close_path(),T.fill_path("rgba(255,255,255,0.9)"),T.restore()}}render_head(){if(this.head_alpha<=0.01)return;let{backend:I,skin:T,config:u}=this,{radius:H}=u,D=this.slider_data.pos,M=A(T,this.combo_number,1),V=H*(1-T.circle_border_width/2)*this.head_scale,B=H*T.circle_border_width*this.head_scale;I.set_alpha(this.head_alpha*T.hit_circle_opacity),I.draw_circle(D[0],D[1],V,M,"rgba(255,255,255,1)",B);let P=H*0.8*this.head_scale;I.draw_text(String(this.combo_count),D[0],D[1]+P*0.05,`600 ${P}px ${T.font_family}`,"rgba(255,255,255,1)","center","middle"),I.set_alpha(1)}render_ball(I){if(this.ball_alpha<=0.01&&this.follow_alpha<=0.01)return;let{backend:T,skin:u,config:H}=this,{radius:D}=H,M=this.ball_position,V=A(u,this.combo_number,0.9);if(this.follow_alpha>0.01){let B=D*this.follow_scale;T.set_alpha(this.follow_alpha*u.follow_circle_opacity),T.begin_path(),T.arc_to(M[0],M[1],B,0,Math.PI*2),T.stroke_path(u.follow_circle_color,u.follow_circle_width)}if(u.enable_slider_ball&&this.ball_alpha>0.01)T.set_alpha(this.ball_alpha*u.slider_ball_opacity),T.draw_circle(M[0],M[1],D*0.85,V,"rgba(255,255,255,0.9)",D*0.1);T.set_alpha(1)}}var A0=(I)=>384-I,JI=(I)=>1-Math.pow(1-I,3);class e extends v{radius=32;preempt=1200;fade_in=600;timing_points=[];drawables=[];drawable_config;constructor(I,T,u=0,H=G){super(I,T,u,H)}initialize(I){this.beatmap=I,this.objects=JSON.parse(JSON.stringify(I.objects)).sort((u,H)=>u.time-H.time),this.timing_points=this.process_timing_points([...I.timing_points]);let T=b0(I.cs,I.ar,0,0,this.mods);this.radius=N0(T.cs),this.preempt=b(T.ar),this.fade_in=q0(this.preempt),this.preprocess_objects(),this.create_drawables()}set_mods(I){if(this.mods=I,this.beatmap)this.initialize(this.beatmap)}process_timing_points(I){if(I.length===0)return I;I[0].time=0;let T=I[0].ms_per_beat;for(let u of I)if(u.ms_per_beat<0)u.ms_per_beat=T*(-u.ms_per_beat/100);else T=u.ms_per_beat;return I.reverse()}preprocess_objects(){let I=0,T=1;for(let u of this.objects){if(y0(u))I=(I+1)%this.skin.combo_colors.length,T=1;else T++;if(u.combo_number=I,u.combo_count=T,D0(u)){let H=u.data;if(K(this.mods,F.HardRock))H.pos=[H.pos[0],A0(H.pos[1])],H.control_points=H.control_points.map((V)=>[V[0],A0(V[1])]);H.computed_path=this.compute_slider_path(H);let D=this.get_timing_at(u.time),M=H.distance/(100*this.beatmap.sv)*D.ms_per_beat;H.duration=M,u.end_time=u.time+M*H.repetitions,u.end_pos=this.get_slider_end_position(H)}else if(g(u))u.end_pos=[256,192];else{let H=u.data;if(K(this.mods,F.HardRock))H.pos=[H.pos[0],A0(H.pos[1])];u.end_pos=H.pos}}}create_drawables(){this.drawables=[];let I=this.config.use_high_dpi?window.devicePixelRatio||1:1;this.drawable_config={backend:this.backend,skin:this.skin,preempt:this.preempt,fade_in:this.fade_in,radius:this.radius,scale:this.config.scale*I,mods:this.mods};for(let T of this.objects)if(x0(T))this.drawables.push(new a(T,this.drawable_config));else if(D0(T)){let u=T.data,H=u.computed_path||[],D=u.duration||0,M=this.calculate_path_length(H),V=D>0?M/D:0,B=this.get_base_beat_length_at(T.time),$=V*B/this.beatmap.tick_rate;this.drawables.push(new f(T,this.drawable_config,H,D,$))}}calculate_path_length(I){let T=0;for(let u=1;u<I.length;u++)T+=Y(U(I[u],I[u-1]));return T}get_base_beat_length_at(I){if(!this.beatmap||this.beatmap.timing_points.length===0)return 600;let T=this.beatmap.timing_points[0].ms_per_beat;for(let u of this.beatmap.timing_points){if(u.time>I)break;if(u.change)T=u.ms_per_beat}return T}render(I){let{backend:T,config:u}=this;this.render_background(),T.save(),T.translate(u.offset_x,u.offset_y),T.scale(u.scale,u.scale),this.render_playfield(),this.render_grid();let H=this.drawables.filter((D)=>D.is_alive(I));this.draw_follow_points(I);for(let D of this.objects)if(g(D)){let M=D.time-this.preempt;if(I>=M&&I<=D.end_time+200)this.draw_spinner(D,I)}H.sort((D,M)=>M.start_time-D.start_time);for(let D of H)D.update(I);for(let D of H)if(D instanceof f)D.render_body_pass(I);for(let D of H)if(D instanceof f)D.render_head_pass(I);else D.render(I);if(!K(this.mods,F.Hidden)&&this.skin.enable_approach_circle){for(let D of H)if(I<=D.start_time)this.draw_approach_circle(D,I)}T.restore()}draw_follow_points(I){if(K(this.mods,F.Hidden))return;for(let T=0;T<this.objects.length-1;T++){let u=this.objects[T],H=this.objects[T+1];if(g(u)||g(H))continue;if(u.combo_number!==H.combo_number)continue;if(I<u.end_time||I>H.time)continue;let D=u.end_pos,M=H.data.pos,V=M[0]-D[0],B=M[1]-D[1];if(Math.sqrt(V*V+B*B)<48)continue;let $=H.time-u.end_time,J=(I-u.end_time)/$,R=1;if(J<0.2)R=J/0.2;if(J>0.8)R=(1-J)/0.2;if(R<=0)continue;let S=N(J*1.5,0,1),q=E(D[0],M[0],Math.max(0,J-0.3)),C=E(D[1],M[1],Math.max(0,J-0.3)),Q=E(D[0],M[0],S),W=E(D[1],M[1],S);this.backend.set_alpha(R*0.6),this.backend.begin_path(),this.backend.move_to(q,C),this.backend.line_to(Q,W),this.backend.stroke_path("rgba(255,255,255,1)",this.skin.follow_point_width,"round","round"),this.backend.set_alpha(1)}}draw_approach_circle(I,T){let u=I.position,H=I.start_time-this.preempt,D=Math.min(this.fade_in*2,this.preempt),M=N((T-H)/D,0,1),V=this.ease_out_quint(M)*this.skin.approach_circle_opacity,P=4-3*N((T-H)/this.preempt,0,1),$=A(this.skin,I.combo_number,1);this.backend.save(),this.backend.set_alpha(V),this.backend.draw_circle(u[0],u[1],this.radius*P,"transparent",$,this.radius*this.skin.approach_circle_width),this.backend.restore()}ease_out_quint(I){return 1-Math.pow(1-I,5)}draw_spinner(I,T){let u=I.time-this.preempt,H=N((T-u)/this.fade_in,0,1);if(T>I.end_time)H=1-JI(N((T-I.end_time)/200,0,1));if(H<=0)return;let D=256,M=192,V=I.end_time-I.time,B=N((T-I.time)/V,0,1);this.backend.set_alpha(H);let P=this.skin.spinner_size*(1-B);if(P>5)this.backend.begin_path(),this.backend.arc_to(D,M,P,0,Math.PI*2),this.backend.stroke_path("rgba(255,255,255,0.6)",4);this.backend.draw_circle(D,M,this.skin.spinner_size,"rgba(0,0,0,0.2)"),this.backend.draw_circle(D,M,12,"white")}compute_slider_path(I){if(I.path_type==="L")return s(I.pos,I.control_points[0],I.distance);let T=[I.pos,...I.control_points];switch(I.path_type){case"P":return K0(T,I.distance);case"C":return U0(T);default:return this.flatten_multibezier(T,I.distance)}}flatten_multibezier(I,T){let u=[],H=[I[0]];for(let M=1;M<I.length;M++){let[V,B]=[I[M-1],I[M]];if(V[0]===B[0]&&V[1]===B[1]){if(H.length>1)u.push(H);H=[B]}else H.push(B)}if(H.length>1)u.push(H);let D=[];for(let M of u)D.push(..._(M));return this.clamp_path_to_distance(D,T)}clamp_path_to_distance(I,T){if(I.length<2)return I;let u=[I[0]],H=0;for(let D=1;D<I.length;D++){let M=Y(U(I[D],I[D-1]));if(H+M>=T){let V=T-H;u.push(w(I[D-1],I[D],V/M));break}H+=M,u.push(I[D])}return u}get_timing_at(I){for(let T of this.timing_points)if(T.time<=I)return T;return this.timing_points[this.timing_points.length-1]}get_slider_end_position(I){if(!I.computed_path||I.computed_path.length===0)return I.pos;return I.repetitions%2===0?I.pos:I.computed_path[I.computed_path.length-1]}}var n0=11485,c0=20;class I0 extends v{key_count=4;scroll_time=n0/c0;hd_coverage=0.25;fi_coverage=0.6;gradient_ratio=0.2;constructor(I,T,u=0,H=G){super(I,T,u,H);this.update_scroll_time()}initialize(I){this.beatmap=I,this.objects=[...I.objects],this.key_count=Math.floor(I.cs);for(let T of this.objects)if(M0(T))T.end_time=T.data.end_time}set_mods(I){this.mods=I,this.update_scroll_time()}update_scroll_time(){let I=C0(this.mods);this.scroll_time=n0/(c0*I)}time_to_y(I){let T=this.skin.mania_hit_position,u=I/this.scroll_time;return T-u*T}render(I){let{backend:T,config:u,skin:H,key_count:D}=this;this.render_background();let M=D*H.mania_lane_width,V=Math.floor((R0-M)/2),B=H.mania_hit_position;T.save(),T.translate(u.offset_x,u.offset_y),T.scale(u.scale,u.scale),this.render_playfield(M,S0,V),this.draw_lane_keys(I,V),this.draw_judgment_line(V),T.save(),T.begin_path(),T.rect(V,0,M,B),T.clip(),T.set_alpha(0.7),T.draw_rect(V,0,M,B,"#000000"),T.set_alpha(1);for(let P of this.objects){if(P.end_time<I)continue;if(M0(P))this.draw_hold_note(P,I,V);else this.draw_note(P,I,V)}if(K(this.mods,F.Hidden)||K(this.mods,F.FadeIn)){let P=K(this.mods,F.Hidden)?this.hd_coverage:this.fi_coverage,$=B*P,J=B*this.gradient_ratio;if(K(this.mods,F.Hidden)){let R=B-$,S=J/$,q=T.create_linear_gradient(V,R,V,B,[{offset:0,color:"rgba(0,0,0,0)"},{offset:S*0.4,color:"rgba(0,0,0,0.3)"},{offset:S*0.7,color:"rgba(0,0,0,0.75)"},{offset:S*0.9,color:"rgba(0,0,0,0.95)"},{offset:S,color:"rgba(0,0,0,1)"},{offset:1,color:"rgba(0,0,0,1)"}]);T.draw_rect_gradient(V,R,M,$,q)}else{let R=($-J)/$,S=T.create_linear_gradient(V,0,V,$,[{offset:0,color:"rgba(0,0,0,1)"},{offset:R,color:"rgba(0,0,0,1)"},{offset:R+(1-R)*0.1,color:"rgba(0,0,0,0.95)"},{offset:R+(1-R)*0.4,color:"rgba(0,0,0,0.75)"},{offset:R+(1-R)*0.7,color:"rgba(0,0,0,0.3)"},{offset:1,color:"rgba(0,0,0,0)"}]);T.draw_rect_gradient(V,0,M,$,S)}}T.restore(),T.restore()}get_lane(I){let T=I.data.pos,u=Math.floor(T[0]*this.key_count/512);if(K(this.mods,F.Mirror))u=this.key_count-1-u;return u}draw_note(I,T,u){let{backend:H,skin:D,key_count:M}=this,V=this.get_lane(I),B=D.mania_lane_width,P=D.mania_note_height,$=D.mania_lane_spacing,J=I.time-T,R=this.time_to_y(J);if(R<-P-64)return;let S=u+V*B,q=h(D,M,V);H.set_alpha(1),H.draw_rect(S+$,R-P,B-2*$,P,q)}draw_hold_note(I,T,u){let{backend:H,skin:D,key_count:M}=this,V=I.data,B=this.get_lane(I),P=D.mania_lane_width,$=D.mania_note_height,J=D.mania_lane_spacing,R=I.time-T,S=V.end_time-T,q=this.time_to_y(R),C=this.time_to_y(S),Q=u+B*P,W=h(D,M,B);if(C<-64&&q<-64)return;let Z=C,m=(R<0?D.mania_hit_position:q)-Z;if(m>0)H.set_alpha(0.9),H.draw_rect(Q+J,Z,P-2*J,m,W);if(R>=0)H.set_alpha(1),H.draw_rect(Q+J,q-$,P-2*J,$,W);H.set_alpha(1)}draw_judgment_line(I){let{backend:T,skin:u,key_count:H}=this,D=u.mania_lane_width,M=u.mania_hit_position;T.draw_rect(I,M-1,D*H,2,"#ffffff")}draw_lane_keys(I,T){let{backend:u,skin:H,key_count:D}=this,{mania_lane_width:M,mania_hit_position:V,mania_lane_spacing:B,mania_note_height:P}=H,$=P+5,J=new Set,R=50;for(let S of this.objects)if(I>=S.time-50&&I<=S.end_time+50)J.add(this.get_lane(S));for(let S=0;S<D;S++){let q=J.has(S),C=T+S*M,Q=h(H,D,S);if(u.set_alpha(0.3),u.draw_rect(C+B,V,M-2*B,$,Q),q)u.set_alpha(1),u.draw_rect(C+B,V,M-2*B,$,"#ff6666")}u.set_alpha(1)}}class T0{audio_context;audio_source=null;audio_buffer=null;gain_node;start_time=0;pause_time=0;speed=1;_is_playing=!1;_duration=0;_is_loaded=!1;constructor(I){this.audio_context=I,this.gain_node=this.audio_context.createGain(),this.gain_node.connect(this.audio_context.destination)}get is_playing(){return this._is_playing}get is_loaded(){return this._is_loaded}get duration(){return this._duration}get speed_multiplier(){return this.speed}get current_time(){if(!this._is_playing)return this.pause_time;return(this.audio_context.currentTime-this.start_time)*this.speed*1000}async load(I,T=0){this.stop();try{this.audio_buffer=await this.audio_context.decodeAudioData(I.slice(0)),this._duration=this.audio_buffer.duration*1000,this.speed=k(T),this._is_loaded=!0,this.pause_time=0}catch(u){throw console.error("Failed to decode audio data",u),u}}play(I){if(!this.audio_buffer){console.warn("[AudioController] Cannot play: not loaded");return}this.stop_source();let T=I!==void 0?I/1000:this.pause_time/1000,u=this.audio_buffer.duration,H=Math.max(0,Math.min(T,u));if(H>=u){this.pause_time=u*1000;return}this.audio_source=this.audio_context.createBufferSource(),this.audio_source.buffer=this.audio_buffer,this.audio_source.playbackRate.value=this.speed,this.audio_source.connect(this.gain_node),this.audio_source.onended=()=>{if(this._is_playing)this._is_playing=!1,this.pause_time=this._duration,this.audio_source=null},this.start_time=this.audio_context.currentTime-H/this.speed,this.audio_source.start(0,H),this._is_playing=!0}pause(){if(!this._is_playing)return;this.pause_time=this.current_time,this.stop_source(),this._is_playing=!1}seek(I){let T=Math.max(0,Math.min(I,this._duration));if(this._is_playing)this.stop_source(),this._is_playing=!1,this.pause_time=T,this.play();else this.pause_time=T}stop(){this.pause(),this.pause_time=0}get_host_time(I){return this.start_time+I/1000/this.speed}stop_source(){if(this.audio_source){try{this.audio_source.onended=null,this.audio_source.stop(),this.audio_source.disconnect()}catch{}this.audio_source=null}}set_volume(I){if(this.gain_node)this.gain_node.gain.value=Math.max(0,Math.min(1,I))}set_speed(I){if(this._is_playing){let T=this.current_time;this.speed=I,this.start_time=this.audio_context.currentTime-T/1000/I}else this.speed=I;if(this.audio_source)this.audio_source.playbackRate.value=I}dispose(){this.stop(),this.audio_buffer=null,this._is_loaded=!1,this.gain_node.disconnect()}}class u0{video=null;object_url=null;_offset=0;speed=1;get element(){return this.video}get offset(){return this._offset}async load(I,T=0,u=1){this.dispose(),this._offset=T,this.speed=u,this.video=document.createElement("video"),this.video.muted=!0,this.video.loop=!1,this.video.playsInline=!0,this.object_url=URL.createObjectURL(I),this.video.src=this.object_url,await new Promise((H,D)=>{if(!this.video)return D(Error("No video element"));this.video.onloadeddata=()=>H(),this.video.onerror=()=>D(Error("Failed to load video"))}),this.video.playbackRate=u}sync(I){if(!this.video)return;let T=(I-this._offset)/1000;if(T<0){if(!this.video.paused)this.video.pause();return}if(Math.abs(this.video.currentTime-T)>0.1)this.video.currentTime=T}play(){if(this.video&&this.video.paused)this.video.play().catch(()=>{console.log("failed to play video")})}pause(){if(this.video&&!this.video.paused)this.video.pause()}seek(I){if(!this.video)return;let T=Math.max(0,(I-this._offset)/1000);this.video.currentTime=T}set_speed(I){if(this.speed=I,this.video)this.video.playbackRate=I}dispose(){if(this.video)this.video.pause(),this.video.src="",this.video=null;if(this.object_url)URL.revokeObjectURL(this.object_url),this.object_url=null}}class E0{context;gain_node;samples=new Map;volume=1;constructor(I){this.context=I,this.gain_node=I.createGain(),this.gain_node.connect(I.destination)}set_volume(I){this.volume=Math.max(0,Math.min(1,I)),this.gain_node.gain.value=this.volume}async load_samples(I){this.samples.clear();let T=[];for(let[u,H]of I)if(u.endsWith(".wav")||u.endsWith(".mp3")||u.endsWith(".ogg"))T.push(this.context.decodeAudioData(H.slice(0)).then((D)=>{let M=u.toLowerCase().replace(/\.(wav|mp3|ogg)$/,"");this.samples.set(M,D)}).catch((D)=>{console.warn(`[HitsoundController] Failed to decode ${u}:`,D)}));await Promise.all(T)}play(I,T,u,H,D=100,M,V=0){let B=this.get_set_name(I),P=this.get_set_name(T);if(M){let $=M.toLowerCase().replace(/\.(wav|mp3|ogg)$/,"");if(this.play_buffer($,D,V))return}if(this.play_sound(B,"hitnormal",H,D,V),u&n.Whistle)this.play_sound(P,"hitwhistle",H,D,V);if(u&n.Finish)this.play_sound(P,"hitfinish",H,D,V);if(u&n.Clap)this.play_sound(P,"hitclap",H,D,V)}play_sound(I,T,u,H,D){let M=!1;if(u>1)M=this.play_buffer(`${I}-${T}${u}`,H,D);if(!M)this.play_buffer(`${I}-${T}`,H,D)}play_buffer(I,T,u){let H=this.samples.get(I);if(!H)return!1;let D=this.context.createBufferSource();D.buffer=H;let M=this.context.createGain();return M.gain.value=T/100,D.connect(M),M.connect(this.gain_node),D.start(u),!0}get_set_name(I){switch(I){case 3:return"drum";case 2:return"soft";default:return"normal"}}dispose(){this.samples.clear(),this.gain_node.disconnect()}}class p0{backend;renderer=null;audio_context;audio;hitsounds;video=null;resources=null;animation_frame=null;skin;mods;renderer_config;start_offset;volume;listeners=new Map;_raw_osu_content="";_is_loaded=!1;next_hit_object_index=0;resize_observer=null;key_handler=null;options;enable_fps_counter=!1;fps_frame_count=0;fps_last_update=0;current_fps=0;constructor(I){this.options=I,this.backend=I.backend??new o,this.skin=i(I.skin),this.mods=I.mods??0,this.renderer_config={...G,...I.renderer_config},this.calculate_layout(I.canvas.width,I.canvas.height,I.playfield_scale),this.start_offset=I.start_time??-1,this.volume=I.volume??0.5,this.backend.initialize(I.canvas,this.renderer_config.use_high_dpi);let T=window.AudioContext||window.webkitAudioContext;if(this.audio_context=new T,this.audio=new T0(this.audio_context),this.hitsounds=new E0(this.audio_context),this.audio.set_volume(this.volume),this.hitsounds.set_volume(this.volume),I.auto_resize)this.setup_auto_resize();this.enable_fps_counter=I.enable_fps_counter??!1,this.fps_last_update=performance.now()}async load_osz(I,T){try{let H=await new y().load_osz(I,{difficulty:T});return this.resources=H,this.setup()}catch(u){let H=u instanceof Error?u.message:String(u);return this.emit("error","INVALID_BEATMAP",H),L("INVALID_BEATMAP",H)}}async load_files(I,T){try{let u=new y;this.resources=await u.load_from_files(I,{difficulty:T});for(let[H,D]of I)if(H.endsWith(".osu")){this._raw_osu_content=typeof D==="string"?D:new TextDecoder().decode(D);break}return this.setup()}catch(u){let H=u instanceof Error?u.message:String(u);return this.emit("error","INVALID_BEATMAP",H),L("INVALID_BEATMAP",H)}}async load_hitsounds(I){try{await this.hitsounds.load_samples(I)}catch(T){console.error("[BeatmapPlayer] Failed to load hitsounds:",T)}}async load_beatmap(I,T,u,H,D){return this.resources={beatmap:I,available_difficulties:[],files:new Map,audio:T,background:u,video:H,video_offset:D},this.setup()}async load_osu_content(I,T){try{let H=await J0().parse(I);return this._raw_osu_content=I,this.load_beatmap(H,T)}catch(u){let H=u instanceof Error?u.message:String(u);return this.emit("error","INVALID_BEATMAP",H),L("INVALID_BEATMAP",H)}}async setup(){if(!this.resources)return L("NOT_LOADED","No resources loaded");let{beatmap:I,audio:T,video:u,video_offset:H}=this.resources,D=k(this.mods);if(T)try{await this.audio.load(T,this.mods)}catch(M){let V=M instanceof Error?M.message:String(M);return this.emit("error","AUDIO_DECODE_ERROR",V),L("AUDIO_DECODE_ERROR",V)}if(u)this.video=new u0,await this.video.load(u,H??0,D);try{this.renderer=this.create_renderer(I),this.renderer.initialize(I)}catch(M){let V=M instanceof Error?M.message:String(M);return this.emit("error","UNSUPPORTED_MODE",V),L("UNSUPPORTED_MODE",V)}if(this.start_offset<0&&this._raw_osu_content){let V=await J0().extract_preview_time(this._raw_osu_content);this.start_offset=V>0?V:this.get_last_object_time()*0.42}if(this.start_offset<0)this.start_offset=0;if(this.update_hit_index(this.start_offset),this.resources?.background)try{let M=new Image;M.src=URL.createObjectURL(this.resources.background),await M.decode(),this.renderer.set_background({source:M,width:M.width,height:M.height}),this._is_loaded=!0,requestAnimationFrame(()=>this.render_frame(this.start_offset))}catch(M){console.warn("[BeatmapPlayer] Failed to load background",M)}return this._is_loaded=!0,this.emit("loaded",I,this.resources),requestAnimationFrame(()=>this.render_frame(this.start_offset)),w0(this.resources)}create_renderer(I){switch(I.mode){case 0:return new e(this.backend,this.skin,this.mods,this.renderer_config);case 3:return new I0(this.backend,this.skin,this.mods,this.renderer_config);case 1:case 2:default:throw Error(`Unsupported game mode: ${r[I.mode]??I.mode}`)}}get_last_object_time(){if(!this.resources?.beatmap.objects.length)return 0;let I=this.resources.beatmap.objects;return I[I.length-1].end_time}async play(){if(!this.renderer||!this._is_loaded){console.warn("[BeatmapPlayer] Cannot play: not loaded");return}if(this.audio.is_playing)return;if(this.audio_context.state==="suspended")await this.audio_context.resume();this.audio.play(this.start_offset),this.video?.play(),this.start_render_loop(),this.emit("play"),this.emit("statechange",!0)}pause(){if(!this.audio.is_playing)return;this.start_offset=this.audio.current_time,this.audio.pause(),this.video?.pause(),this.stop_render_loop(),this.emit("pause"),this.emit("statechange",!1)}set_mods(I){this.mods=I;let T=k(I);if(this.renderer?.set_mods(I),this.audio.set_speed(T),this.video?.set_speed(T),this._is_loaded)requestAnimationFrame(()=>this.render_frame(this.current_time))}seek(I){this.start_offset=Math.max(0,Math.min(I,this.duration)),this.update_hit_index(this.start_offset),this.audio.seek(this.start_offset),this.video?.seek(this.start_offset),this.emit("seek",this.start_offset),this.render_frame(this.start_offset)}async set_difficulty(I){if(!this.resources)return L("NOT_LOADED","No beatmap resources loaded");let T=this.is_playing;this.stop();try{let H=await new y().load_from_files(this.resources.files,{difficulty:I});this.resources=H;let D=this.resources.available_difficulties.find((V)=>V.version===this.resources.beatmap.version)?.filename;if(D){let V=this.resources.files.get(D);if(V)this._raw_osu_content=typeof V==="string"?V:new TextDecoder().decode(V)}let M=await this.setup();if(M.success&&T)this.play();return M}catch(u){let H=u instanceof Error?u.message:String(u);return this.emit("error","INVALID_BEATMAP",H),L("INVALID_BEATMAP",H)}}update_hit_index(I){if(!this.resources?.beatmap)return;let T=this.resources.beatmap.objects;if(this.next_hit_object_index>0&&T[this.next_hit_object_index-1].time>I)this.next_hit_object_index=0;while(this.next_hit_object_index<T.length&&T[this.next_hit_object_index].time<I)this.next_hit_object_index++}stop(){this.pause(),this.start_offset=0,this.audio.seek(0),this.update_hit_index(0),this.render_frame(0)}dispose(){if(this.stop(),this.backend.dispose(),this.audio.dispose(),this.hitsounds.dispose(),this.video?.dispose(),this.renderer?.dispose(),this.listeners.clear(),this.resize_observer)this.resize_observer.disconnect(),this.resize_observer=null;if(this.key_handler)window.removeEventListener("keydown",this.key_handler),this.key_handler=null;if(this.audio_context&&this.audio_context.state!=="closed")this.audio_context.close().catch(()=>{});this.renderer=null,this.resources=null,this._is_loaded=!1,this.listeners.clear()}get current_time(){return this.audio.current_time}get duration(){return this.audio.duration||this.get_last_object_time()}get is_playing(){return this.audio.is_playing}get is_loaded(){return this._is_loaded}get mode(){if(!this.resources)return"standard";switch(this.resources.beatmap.mode){case 1:return"taiko";case 2:return"catch";case 3:return"mania";default:return"standard"}}get beatmap(){return this.resources?.beatmap??null}get available_difficulties(){return this.resources?.available_difficulties??[]}get background(){return this.resources?.background}get config(){return this.renderer_config}resize(I,T,u){if(this.backend.resize(I,T),this.calculate_layout(I,T,u),this._is_loaded)requestAnimationFrame(()=>this.render_frame(this.current_time))}update_config(I){if(this.renderer_config={...this.renderer_config,...I},this.renderer?.update_config(this.renderer_config),this._is_loaded)requestAnimationFrame(()=>this.render_frame(this.current_time))}set_skin(I){if(this.skin=i(I),this._is_loaded&&this.resources?.beatmap)this.renderer=this.create_renderer(this.resources.beatmap),this.renderer.initialize(this.resources.beatmap),requestAnimationFrame(()=>this.render_frame(this.current_time))}setup_auto_resize(){this.resize_observer=new ResizeObserver(()=>{let T=this.options.canvas.parentElement;if(T){let u=T.getBoundingClientRect();this.resize(u.width,u.height,this.options.playfield_scale)}}),this.resize_observer.observe(this.options.canvas.parentElement||this.options.canvas)}toggle_pause(){if(!this._is_loaded)return;this.is_playing?this.pause():this.play()}toggle_grid(){if(this.renderer_config.grid_level===0)this.renderer_config.grid_level=32;else this.renderer_config.grid_level=0;this.render_frame(this.current_time)}calculate_layout(I,T,u){let M=0.9;if(typeof u==="number")M=u;let V=I*M/512,B=T*M/384,P=Math.min(V,B);if(this.renderer_config.scale=P,this.renderer_config.offset_x=Math.floor((I-512*P)/2),this.renderer_config.offset_y=Math.floor((T-384*P)/2),this.renderer)this.renderer.update_config(this.renderer_config)}set_volume(I){this.volume=I,this.audio.set_volume(I),this.hitsounds.set_volume(I)}on(I,T){if(!this.listeners.has(I))this.listeners.set(I,new Set);this.listeners.get(I).add(T)}off(I,T){this.listeners.get(I)?.delete(T)}emit(I,...T){let u=this.listeners.get(I);if(u)for(let H of u)H(...T)}last_timestamp=0;smooth_time=0;start_render_loop(){if(this.animation_frame!==null)return;this.last_timestamp=performance.now(),this.smooth_time=this.audio.current_time;let I=(T)=>{if(!this.audio.is_playing){this.animation_frame=null;return}let u=T-this.last_timestamp;this.last_timestamp=T,this.smooth_time+=u*this.audio.speed_multiplier;let H=this.audio.current_time;if(Math.abs(this.smooth_time-H)>30)this.smooth_time=H;else this.smooth_time+=(H-this.smooth_time)*0.1;let M=this.smooth_time;if(this.schedule_hitsounds(),this.render_frame(M),this.video?.sync(M),this.emit("timeupdate",M,this.duration),M>=this.duration){this.emit("ended"),this.stop_render_loop(),this.emit("statechange",!1);return}this.animation_frame=requestAnimationFrame(I)};this.animation_frame=requestAnimationFrame(I)}schedule_hitsounds(){if(!this.resources?.beatmap||!this.audio.is_playing)return;let I=this.resources.beatmap.objects,T=this.audio.current_time,H=T+100;while(this.next_hit_object_index<I.length&&I[this.next_hit_object_index].time<=H){let D=I[this.next_hit_object_index];if(D.time>=T-20)this.play_hitsound(D);this.next_hit_object_index++}}play_hitsound(I){let T=this.get_timing_point(I.time),u=T.volume,H=T.sample_set,D=T.sample_set,M=T.sample_index,V=void 0;if(I.hit_sample){let P=I.hit_sample;if(P.normal_set!==0){if(H=P.normal_set,P.addition_set===0)D=H}if(P.addition_set!==0)D=P.addition_set;if(P.index!==0)M=P.index;if(P.volume!==0)u=P.volume;V=P.filename}if(H===0)H=1;if(D===0)D=H;let B=this.audio.get_host_time(I.time);this.hitsounds.play(H,D,I.hit_sound,M,u,V,B)}get_timing_point(I){let T=this.resources?.beatmap.timing_points??[];for(let u=T.length-1;u>=0;u--)if(T[u].time<=I)return T[u];return T[0]}stop_render_loop(){if(this.animation_frame!==null)cancelAnimationFrame(this.animation_frame),this.animation_frame=null}render_frame(I){if(this.backend.clear(),this.renderer?.render(I),this.enable_fps_counter){this.fps_frame_count++;let T=performance.now(),u=T-this.fps_last_update;if(u>=1000)this.current_fps=Math.round(this.fps_frame_count*1000/u),this.fps_frame_count=0,this.fps_last_update=T;this.backend.draw_text(`${this.current_fps} FPS`,10,20,"14px monospace","rgba(255,255,255,0.8)","left","top")}}set_fps_counter(I){this.enable_fps_counter=I}}export{U as vec2_sub,tI as vec2_normalize,m0 as vec2_mul,w as vec2_lerp,sI as vec2_len_sq,Y as vec2_len,_I as vec2_dot,HI as vec2_div,iI as vec2_dist,h0 as vec2_add,SI as unwrap,WI as toggle_mod,w0 as ok,CI as mods_to_string,XI as mods_from_string,i as merge_skin,E as lerp,g as is_spinner,D0 as is_slider,QI as is_ok,y0 as is_new_combo,M0 as is_hold,qI as is_err,x0 as is_circle,Q0 as inverse_difficulty_range,K as has_mod,k as get_speed_multiplier,C0 as get_rate_multiplier,h as get_mania_lane_color,A as get_combo_color,KI as get_available_mods,b0 as get_adjusted_difficulty,K0 as flatten_perfect,s as flatten_linear,U0 as flatten_catmull,_ as flatten_bezier,$0 as extract_video_info,V0 as extract_preview_time,B0 as extract_background_filename,P0 as extract_audio_filename,L as err,k0 as difficulty_range,N as clamp,N0 as calculate_radius,b as calculate_preempt,q0 as calculate_fade_in,uI as apply_rate_to_ar,TI as apply_mods_to_difficulty,u0 as VideoController,e as StandardRenderer,l0 as SpeedChangingMods,H0 as SampleSet,d as PREEMPT_RANGE,d0 as PREEMPT_MIN,R0 as PLAYFIELD_WIDTH,S0 as PLAYFIELD_HEIGHT,y as OszLoader,F as Mods,i0 as ModNightcore,II as ModHidden,Z0 as ModHardRock,t0 as ModHalfTime,X0 as ModEasy,s0 as ModDoubleTime,I0 as ManiaRenderer,n as HitSoundType,z as HitObjectType,e0 as HD_FADE_OUT_MULTIPLIER,a0 as HD_FADE_IN_MULTIPLIER,g0 as GridLevel,r as GameMode,v0 as ErrorCode,ZI as DifficultyChangingMods,O0 as DEFAULT_SKIN,G as DEFAULT_RENDERER_CONFIG,o as CanvasBackend,p0 as BeatmapPlayer,c as BeatmapParser,v as BaseRenderer,T0 as AudioController};
1
+ var Vt=Object.create;var{getPrototypeOf:Bt,defineProperty:Kr,getOwnPropertyNames:Mt}=Object;var Rt=Object.prototype.hasOwnProperty;var dt=(r,t,n)=>{n=r!=null?Vt(Bt(r)):{};let e=t||!r||!r.__esModule?Kr(n,"default",{value:r,enumerable:!0}):n;for(let s of Mt(r))if(!Rt.call(e,s))Kr(e,s,{get:()=>r[s],enumerable:!0});return e};var Ct=(r,t)=>()=>(t||r((t={exports:{}}).exports,t),t.exports);var et=Ct((rt)=>{Object.defineProperty(rt,"__esModule",{value:!0});rt.parse=rt.get_section=rt.get_properties=rt.get_property=rt.init_wasm_from_url=rt.init_wasm=rt.is_wasm_ready=rt.set_wasm_factory=void 0;var H=null,Z=null,_r=null,jr="create_osu_parser",Gr=new Map,kr=(r)=>{return r.global_name||jr},At=(r)=>{let t=Gr.get(r);if(t)return t;let n=new Promise((e,s)=>{if(typeof document>"u"){s(Error("script loading requires a browser environment"));return}let u=document.createElement("script");u.src=r,u.async=!0,u.onload=()=>e(),u.onerror=()=>s(Error(`failed to load wasm script: ${r}`)),document.head.appendChild(u)});return Gr.set(r,n),n},$t=async(r)=>{if(r.factory)return r.factory;if(_r)return _r;if(r.script_url)await At(r.script_url);let t=kr(r);return globalThis[t]},Ot=(r,t)=>{if(_r=r,t)jr=t};rt.set_wasm_factory=Ot;var Et=()=>{return H!=null};rt.is_wasm_ready=Et;var Qt=async(r={})=>{if(H)return;if(Z)return Z;return Z=(async()=>{let t=await $t(r);if(typeof t!="function"){let n=kr(r);throw Error(`wasm factory not found: ${n}`)}H=await t(r.module_config)})(),Z.catch((t)=>{throw Z=null,t})};rt.init_wasm=Qt;var Ut=async(r,t={},n)=>{return rt.init_wasm({script_url:r,module_config:t,global_name:n})};rt.init_wasm_from_url=Ut;var Jt=(r,t)=>{if(H==null)throw Error("wasm not initialized");let n=H._malloc(r.length);H.HEAPU8.set(r,n);try{return H.get_property(n,r.length,t)}finally{H._free(n)}};rt.get_property=Jt;var qt=(r,t)=>{if(H==null)throw Error("wasm not initialized");let n=H._malloc(r.length);H.HEAPU8.set(r,n);try{return H.get_properties(n,r.length,t)}finally{H._free(n)}};rt.get_properties=qt;var zt=(r,t)=>{if(H==null)throw Error("wasm not initialized");let n=H._malloc(r.length);H.HEAPU8.set(r,n);try{return H.get_section(n,r.length,t)}finally{H._free(n)}};rt.get_section=zt;var Zt=(r)=>{if(H==null)throw Error("wasm not initialized");let t=H._malloc(r.length);H.HEAPU8.set(r,t);try{return H.parse(t,r.length)}finally{H._free(t)}};rt.parse=Zt});var lr;((s)=>{s[s.Standard=0]="Standard";s[s.Taiko=1]="Taiko";s[s.Catch=2]="Catch";s[s.Mania=3]="Mania"})(lr||={});var fr;((s)=>{s[s.Auto=0]="Auto";s[s.Normal=1]="Normal";s[s.Soft=2]="Soft";s[s.Drum=3]="Drum"})(fr||={});var M={Circle:1,Slider:2,NewCombo:4,Spinner:8,ComboSkip:112,Hold:128},G={Normal:1,Whistle:2,Finish:4,Clap:8},Yr=(r)=>(r.type&M.Circle)!==0,br=(r)=>(r.type&M.Slider)!==0,$=(r)=>(r.type&M.Spinner)!==0,Ir=(r)=>(r.type&M.Hold)!==0,xr=(r)=>(r.type&M.NewCombo)!==0;var Wr;((m)=>{m.NoOsuFiles="NO_OSU_FILES";m.DifficultyNotFound="DIFFICULTY_NOT_FOUND";m.InvalidBeatmap="INVALID_BEATMAP";m.UnsupportedMode="UNSUPPORTED_MODE";m.AudioNotLoaded="AUDIO_NOT_LOADED";m.AudioDecodeError="AUDIO_DECODE_ERROR";m.NotLoaded="NOT_LOADED";m.Unknown="UNKNOWN"})(Wr||={});var Lr=(r)=>({success:!0,data:r}),C=(r,t)=>({success:!1,code:r,reason:t}),$n=(r)=>{if(r.success)return r.data;throw Error(`[${r.code}] ${r.reason}`)},On=(r)=>{return r.success},En=(r)=>{return!r.success};var h={None:0,NoFail:1,Easy:2,TouchDevice:4,Hidden:8,HardRock:16,SuddenDeath:32,DoubleTime:64,Relax:128,HalfTime:256,Nightcore:512,Flashlight:1024,Autoplay:2048,SpunOut:4096,Autopilot:8192,Perfect:16384,FadeIn:8388608,Mirror:1073741824},Ft=h.DoubleTime|h.HalfTime|h.Nightcore,Un=h.HardRock|h.Easy|Ft,Jn=(r)=>{let t=0,n=r.toLowerCase(),e={nf:h.NoFail,ez:h.Easy,td:h.TouchDevice,hd:h.Hidden,hr:h.HardRock,sd:h.SuddenDeath,dt:h.DoubleTime,rx:h.Relax,ht:h.HalfTime,nc:h.Nightcore,fl:h.Flashlight,at:h.Autoplay,so:h.SpunOut,ap:h.Autopilot,pf:h.Perfect,fi:h.FadeIn,mr:h.Mirror};for(let s=0;s<n.length-1;s+=2){let u=n.slice(s,s+2);if(e[u])t|=e[u]}return t},qn=(r)=>{let t=[];if(r&h.NoFail)t.push("NF");if(r&h.Easy)t.push("EZ");if(r&h.Hidden)t.push("HD");if(r&h.HardRock)t.push("HR");if(r&h.SuddenDeath)t.push("SD");if(r&h.DoubleTime)t.push("DT");if(r&h.HalfTime)t.push("HT");if(r&h.Nightcore)t.push("NC");if(r&h.Flashlight)t.push("FL");if(r&h.SpunOut)t.push("SO");if(r&h.FadeIn)t.push("FI");if(r&h.Mirror)t.push("MR");let n=t.indexOf("DT"),e=t.indexOf("NC");if(n>=0&&e>=0)t.splice(n,1);return t.join("")},z=(r)=>{if(r&(h.DoubleTime|h.Nightcore))return 1.5;if(r&h.HalfTime)return 0.75;return 1},Nt=[h.HardRock|h.Easy,h.DoubleTime|h.HalfTime|h.Nightcore,h.Hidden|h.FadeIn],zn=(r,t)=>{if(r&t)return r&~t;let n=r;for(let e of Nt)if(t&e)n&=~e;return n|t},w=(r,t)=>(r&t)!==0,Zn=(r)=>{let t=[{name:"Easy",acronym:"EZ",value:h.Easy},{name:"Hidden",acronym:"HD",value:h.Hidden},{name:"Double Time",acronym:"DT",value:h.DoubleTime},{name:"Half Time",acronym:"HT",value:h.HalfTime},{name:"Nightcore",acronym:"NC",value:h.Nightcore}];switch(r){case"standard":return[...t,{name:"Hard Rock",acronym:"HR",value:h.HardRock}];case"mania":return[...t,{name:"Hard Rock",acronym:"HR",value:h.HardRock},{name:"Fade In",acronym:"FI",value:h.FadeIn}];case"taiko":case"catch":return[...t,{name:"Hard Rock",acronym:"HR",value:h.HardRock}];default:return t}};import ot from"jszip";var V=dt(et(),1),st=null,j=null,Gt=new TextEncoder,jt=typeof window<"u"?new URL("/browser/osu-parser.browser.js",window.location.origin).toString():new URL("./browser/osu-parser.browser.js",import.meta.url).toString(),ut=(r)=>{if(st=r,r.factory)V.set_wasm_factory(r.factory,r.global_name)},kt=async()=>{if(V.is_wasm_ready())return;if(j)return j;let r=st??{},t=r.script_url??jt;return j=V.init_wasm_from_url(t,r.module_config??{},r.global_name),j},Tr=async(r)=>{if(r)ut(r);return kt()},O=()=>{if(!V.is_wasm_ready())throw Error("WASM parser not initialized. Call init_wasm_parser or configure_wasm_parser.")},rn=(r)=>Gt.encode(r),E=(r)=>typeof r==="string"?rn(r):r,tn=(r)=>{return{normal_set:r.normalSet,addition_set:r.additionSet,index:r.index,volume:r.volume,filename:r.filename||void 0}},nn=(r)=>{let t=[],n=[...r.TimingPoints].sort((u,i)=>{if(u.time!==i.time)return u.time-i.time;return i.uninherited-u.uninherited}),e=500,s=n.find((u)=>u.uninherited===1&&u.beatLength>0);if(s&&s.beatLength>0)e=s.beatLength;for(let u of n){let i=u.beatLength,o=u.uninherited===0||i<0;if(!o&&i>0)e=i;t.push({time:u.time,ms_per_beat:i,change:!o,sample_set:u.sampleSet,sample_index:u.sampleIndex,volume:u.volume,kiai:(u.effects&1)!==0,velocity:o?-100/i:1,beat_length:e})}return t},en=(r)=>{let t=[];for(let n of r.HitObjects){let e={time:n.time,type:n.type,hit_sound:n.hitSound,end_time:n.endTime||n.time,end_pos:[n.x,n.y],combo_number:0,combo_count:0,data:{pos:[n.x,n.y]}};if(n.hitSample)e.hit_sample=tn(n.hitSample);if(n.edgeSounds?.length)e.edge_sounds=[...n.edgeSounds];if(n.edgeSets?.length)e.edge_sets=n.edgeSets.map((s)=>[s.normalSet,s.additionSet]);if(n.type&M.Circle)e.data={pos:[n.x,n.y]};else if(n.type&M.Slider){let s={pos:[n.x,n.y],path_type:n.curveType||"L",control_points:n.curvePoints.map((u)=>[u.x,u.y]),repetitions:n.slides||1,distance:n.length||0};e.data=s}else if(n.type&M.Spinner){let s=n.endTime||n.time;e.data={end_time:s},e.end_time=s,e.end_pos=[256,192]}else if(n.type&M.Hold){let s=n.endTime||n.time;e.data={pos:[n.x,n.y],end_time:s},e.end_time=s}t.push(e)}return t},sn=(r)=>{let t={format_version:r.version,mode:r.General.Mode,title:r.Metadata.Title,title_unicode:r.Metadata.TitleUnicode,artist:r.Metadata.Artist,artist_unicode:r.Metadata.ArtistUnicode,creator:r.Metadata.Creator,version:r.Metadata.Version,ar:r.Difficulty.ApproachRate,cs:r.Difficulty.CircleSize,od:r.Difficulty.OverallDifficulty,hp:r.Difficulty.HPDrainRate,sv:r.Difficulty.SliderMultiplier,tick_rate:r.Difficulty.SliderTickRate,timing_points:[],objects:[],circle_count:0,slider_count:0,spinner_count:0,hold_count:0};t.timing_points=nn(r),t.objects=en(r);for(let n of t.objects)if(n.type&M.Circle)t.circle_count++;else if(n.type&M.Slider)t.slider_count++;else if(n.type&M.Spinner)t.spinner_count++;else if(n.type&M.Hold)t.hold_count++;if(t.ar===-1)t.ar=t.od;return t},un=(r)=>{for(let t of r){let n=t.split(",");if(n.length<3)continue;let e=n[0].trim();if(e!=="Video"&&e!=="1")continue;let s=parseInt(n[1]),u=n[2].replace(/^"|"$/g,"");if(!u)continue;return{filename:u,offset:Number.isFinite(s)?s:0}}return null};class k{parse(r){O();let t=E(r),n=V.parse(t);return sn(n)}parse_info(r,t){O();let n=E(r),e=V.get_properties(n,["Title","Artist","Version","Mode","ApproachRate","CircleSize","OverallDifficulty","HPDrainRate"]),s=parseFloat(e.ApproachRate??"-1"),u=parseFloat(e.OverallDifficulty??"5");return{filename:t,title:e.Title??"",artist:e.Artist??"",version:e.Version??"",mode:parseInt(e.Mode??"0"),ar:Number.isFinite(s)&&s>=0?s:u,cs:parseFloat(e.CircleSize??"5"),od:u,hp:parseFloat(e.HPDrainRate??"5")}}}var gr=(r)=>{O();let t=E(r),n=V.get_property(t,"PreviewTime"),e=parseInt(n);return Number.isFinite(e)?e:-1},Dr=(r)=>{O();let t=E(r),n=V.get_property(t,"AudioFilename");return n?n:null},vr=(r)=>{O();let t=E(r),n=V.get_property(t,"Background");return n?n:null},Hr=(r)=>{O();let t=E(r),n=V.get_section(t,"Events");return un(n)},on=()=>V.is_wasm_ready();var it=new k;class rr{init_promise=null;ensure_ready(){if(!this.init_promise)this.init_promise=Tr();return this.init_promise}async parse(r){return await this.ensure_ready(),it.parse(r)}async parse_info(r,t){return await this.ensure_ready(),it.parse_info(r,t)}async extract_audio_filename(r){return await this.ensure_ready(),Dr(r)}async extract_background_filename(r){return await this.ensure_ready(),vr(r)}async extract_video_info(r){return await this.ensure_ready(),Hr(r)}async extract_preview_time(r){return await this.ensure_ready(),gr(r)}dispose(){this.init_promise=null}}var wr=null,yr=()=>{if(!wr)wr=new rr;return wr};class Q{parser=new rr;async load_osz(r,t){let n=await ot.loadAsync(r),e=new Map;for(let[s,u]of Object.entries(n.files))if(!u.dir)e.set(s,await u.async("arraybuffer"));return this.load_from_files(e,t)}async load_from_files(r,t){let n=[...r.keys()].filter((T)=>T.toLowerCase().endsWith(".osu"));if(n.length===0)throw Error("No .osu files found in beatmap");let e=await Promise.all(n.map(async(T)=>{let _=r.get(T),D=this.to_bytes(_);return this.parser.parse_info(D,T)})),s=this.select_difficulty(n,r,t?.difficulty),u=r.get(s),i=this.to_bytes(u),o=await this.parser.parse(i),[m,a,f]=await Promise.all([this.parser.extract_audio_filename(i),this.parser.extract_background_filename(i),this.parser.extract_video_info(i)]),c=new Map;for(let[T,_]of r)if(_ instanceof ArrayBuffer)c.set(T,_);else c.set(T,new TextEncoder().encode(_).buffer);let p;if(m)p=this.find_file(c,m);let I;if(a){let T=this.find_file(c,a);if(T)I=new Blob([T])}let b,l;if(f){let T=this.find_file(c,f.filename);if(T)b=new Blob([T]),l=f.offset}return{beatmap:o,available_difficulties:e,files:c,audio:p,background:I,video:b,audio_filename:m??void 0,background_filename:a??void 0,video_filename:f?.filename,video_offset:l}}async list_difficulties(r){let t=await ot.loadAsync(r),n=[];for(let s of Object.keys(t.files))if(s.toLowerCase().endsWith(".osu"))n.push(s);let e=[];for(let s of n){let i=(await t.files[s].async("string")).match(/Version:\s*(.+)/);e.push(i?i[1].trim():s)}return e}select_difficulty(r,t,n){if(n===void 0)return r[0];if(typeof n==="number"){if(n<0||n>=r.length)throw Error(`Difficulty index ${n} out of range (0-${r.length-1})`);return r[n]}for(let e of r){let u=this.to_string(t.get(e)).match(/Version:\s*(.+)/);if(u&&u[1].trim()===n)return e}for(let e of r)if(e.toLowerCase().includes(n.toLowerCase()))return e;throw Error(`Difficulty "${n}" not found`)}find_file(r,t){if(r.has(t))return r.get(t);let n=t.toLowerCase();for(let[e,s]of r)if(e.toLowerCase()===n)return s;return}to_string(r){if(typeof r==="string")return r;return new TextDecoder().decode(r)}to_bytes(r){if(r instanceof ArrayBuffer)return new Uint8Array(r);return new TextEncoder().encode(r)}}var Sr=512,Pr=384,mt;((u)=>{u[u.None=0]="None";u[u.Large=32]="Large";u[u.Medium=16]="Medium";u[u.Small=8]="Small";u[u.Tiny=4]="Tiny"})(mt||={});var F={offset_x:64,offset_y:48,scale:1,show_playfield:!0,playfield_color:"#ffffff",playfield_opacity:0.1,grid_level:0,grid_color:"#ffffff",grid_opacity:0.35,use_high_dpi:!0};class U{backend;skin;config;mods;beatmap;objects=[];background_image=null;constructor(r,t,n=0,e=F){this.backend=r,this.skin=t,this.mods=n,this.config={...F,...e}}set_background(r){this.background_image=r}update_config(r){this.config={...this.config,...r}}dispose(){this.objects=[]}render_playfield(r,t,n,e){if(!this.config.show_playfield)return;let{backend:s,config:u}=this,i=r??512,o=t??384,m=n??0,a=e??0;s.save(),s.set_alpha(u.playfield_opacity),s.begin_path(),s.move_to(m,a),s.line_to(m+i,a),s.line_to(m+i,a+o),s.line_to(m,a+o),s.line_to(m,a),s.stroke_path(u.playfield_color,2),s.restore()}render_grid(){if(this.config.grid_level===0)return;let{backend:r,config:t}=this,n=t.grid_level;r.save(),r.set_alpha(t.grid_opacity);for(let e=0;e<=512;e+=n)r.begin_path(),r.move_to(e,0),r.line_to(e,384),r.stroke_path(t.grid_color,e%(n*4)===0?1:0.5);for(let e=0;e<=384;e+=n)r.begin_path(),r.move_to(0,e),r.line_to(512,e),r.stroke_path(t.grid_color,e%(n*4)===0?1:0.5);r.restore()}render_background(){if(!this.background_image)return;let{backend:r}=this;r.save(),r.set_alpha(0.3);let{width:t,height:n}=r,{width:e,height:s}=this.background_image;if(e>0&&s>0){let u=Math.max(t/e,n/s),i=e*u,o=s*u,m=(t-i)/2,a=(n-o)/2;r.draw_image(this.background_image,m,a,i,o)}else r.draw_image(this.background_image,0,0,t,n);r.restore()}get_visible_objects(r,t,n){let e=[];for(let s of this.objects){let u=s.time-t,i=s.end_time+n;if(r>=u&&r<=i)e.push(s)}return e}}class tr{ctx;_width=0;_height=0;_dpr=1;is_initialized=!1;get width(){return this._width}get height(){return this._height}initialize(r,t=!0){this._dpr=t?window.devicePixelRatio||1:1;let n=r.clientWidth||r.width,e=r.clientHeight||r.height;this.apply_canvas_size(r,n,e);let s=r.getContext("2d",{alpha:!0,desynchronized:!0});if(!s)throw Error("Failed to get 2D context");this.ctx=s,this._width=n,this._height=e,this.configure_context(),this.is_initialized=!0}clear(){if(!this.is_initialized)return;this.ctx.save(),this.ctx.setTransform(this._dpr,0,0,this._dpr,0,0),this.ctx.clearRect(0,0,this._width,this._height),this.ctx.restore()}dispose(){}resize(r,t){if(!this.is_initialized)return;this._width=r,this._height=t,this._dpr=window.devicePixelRatio||1;let n=this.ctx.canvas;this.apply_canvas_size(n,r,t),this.reset_transform(),this.configure_context()}draw_circle(r,t,n,e,s,u){let i=this.ctx;if(i.beginPath(),i.arc(r,t,n,0,Math.PI*2),e&&e!=="transparent")i.fillStyle=e,i.fill();if(s&&u&&u>0)i.strokeStyle=s,i.lineWidth=u,i.stroke()}draw_arc(r,t,n,e,s,u,i,o=!1){let m=this.ctx;m.beginPath(),m.arc(r,t,n,e,s,o),m.strokeStyle=u,m.lineWidth=i,m.stroke()}draw_rect(r,t,n,e,s){this.ctx.fillStyle=s,this.ctx.fillRect(r,t,n,e)}draw_rect_gradient(r,t,n,e,s){this.ctx.fillStyle=s,this.ctx.fillRect(r,t,n,e)}create_linear_gradient(r,t,n,e,s){let u=this.ctx.createLinearGradient(r,t,n,e);for(let i of s)u.addColorStop(i.offset,i.color);return u}draw_text(r,t,n,e,s,u="left",i="alphabetic"){let o=this.ctx;o.font=e,o.fillStyle=s,o.textAlign=u,o.textBaseline=i,o.fillText(r,t,n)}measure_text(r,t){let n=this.ctx,e=n.font;n.font=t;let s=n.measureText(r);return n.font=e,s}begin_path(){this.ctx.beginPath()}move_to(r,t){this.ctx.moveTo(r,t)}line_to(r,t){this.ctx.lineTo(r,t)}draw_line(r,t,n,e,s,u,i="butt",o="miter"){this.ctx.beginPath(),this.ctx.moveTo(r,t),this.ctx.lineTo(n,e),this.ctx.strokeStyle=s,this.ctx.lineWidth=u,this.ctx.lineCap=i,this.ctx.lineJoin=o,this.ctx.stroke()}bezier_curve_to(r,t,n,e,s,u){this.ctx.bezierCurveTo(r,t,n,e,s,u)}quadratic_curve_to(r,t,n,e){this.ctx.quadraticCurveTo(r,t,n,e)}arc_to(r,t,n,e,s,u){this.ctx.arc(r,t,n,e,s,u)}rect(r,t,n,e){this.ctx.rect(r,t,n,e)}clip(){this.ctx.clip()}stroke_path(r,t,n="butt",e="miter"){let s=this.ctx;s.strokeStyle=r,s.lineWidth=t,s.lineCap=n,s.lineJoin=e,s.stroke()}fill_path(r){this.ctx.fillStyle=r,this.ctx.fill()}close_path(){this.ctx.closePath()}save(){this.ctx.save()}restore(){this.ctx.restore()}translate(r,t){this.ctx.translate(r,t)}scale(r,t){this.ctx.scale(r,t)}rotate(r){this.ctx.rotate(r)}set_alpha(r){this.ctx.globalAlpha=r}set_shadow(r,t){this.ctx.shadowColor=r,this.ctx.shadowBlur=t}set_composite_operation(r){this.ctx.globalCompositeOperation=r}set_blend_mode(r){let t={normal:"source-over",lighter:"lighter",multiply:"multiply",screen:"screen"};this.ctx.globalCompositeOperation=t[r]??"source-over"}draw_image(r,t,n,e,s){if(e!==void 0&&s!==void 0)this.ctx.drawImage(r.source,t,n,e,s);else this.ctx.drawImage(r.source,t,n)}draw_image_part(r,t,n,e,s,u,i,o,m){this.ctx.drawImage(r.source,t,n,e,s,u,i,o,m)}render_slider_to_image(r,t,n,e,s,u=1,i=1){let o=1/0,m=1/0,a=-1/0,f=-1/0;for(let D of r){if(D[0]<o)o=D[0];if(D[0]>a)a=D[0];if(D[1]<m)m=D[1];if(D[1]>f)f=D[1]}let c=t+2;o-=c,m-=c,a+=c,f+=c;let p=Math.ceil((a-o)*s),I=Math.ceil((f-m)*s);if(p<=0||I<=0)return null;let b=document.createElement("canvas");b.width=p,b.height=I;let l=b.getContext("2d");if(!l)return null;l.save(),l.scale(s,s),l.translate(-o,-m);let T=()=>{if(l.beginPath(),r.length>0){l.moveTo(r[0][0],r[0][1]);for(let D=1;D<r.length;D++)l.lineTo(r[D][0],r[D][1])}};l.lineCap="round",l.lineJoin="round",l.globalAlpha=i,l.strokeStyle=n,l.lineWidth=t*2,T(),l.stroke();let _=t*0.872;if(u<1)l.globalCompositeOperation="destination-out",l.globalAlpha=1,l.lineWidth=_*2,T(),l.stroke(),l.globalCompositeOperation="source-over";return l.globalAlpha=u,l.strokeStyle=e,l.lineWidth=_*2,T(),l.stroke(),l.restore(),{source:b,width:p,height:I,min_x:o,min_y:m}}apply_canvas_size(r,t,n){r.width=t*this._dpr,r.height=n*this._dpr,r.style.width=`${t}px`,r.style.height=`${n}px`}configure_context(){this.ctx.scale(this._dpr,this._dpr),this.ctx.imageSmoothingEnabled=!0,this.ctx.imageSmoothingQuality="high"}reset_transform(){if(this.ctx.resetTransform)this.ctx.resetTransform();else this.ctx.setTransform(1,0,0,1,0,0)}}var nr={min:1800,mid:1200,max:450},mn=450,at=(r,t)=>{if(r>5)return t.mid+(t.max-t.mid)*(r-5)/5;if(r<5)return t.mid+(t.mid-t.min)*(r-5)/5;return t.mid},Vr=(r,t)=>{if(Math.sign(r-t.mid)===Math.sign(t.max-t.mid))return(r-t.mid)/(t.max-t.mid)*5+5;return(r-t.mid)/(t.mid-t.min)*5+5},X=(r)=>at(r,nr),Br=(r)=>400*Math.min(1,r/450),an=(r)=>{return(1-0.7*((r-5)/5))/2},Mr=(r)=>an(r)*64;var Rr={name:"Hard Rock",acronym:"HR",apply_to_difficulty(r){r.cs=Math.min(r.cs*1.3,10),r.ar=Math.min(r.ar*1.4,10),r.od=Math.min(r.od*1.4,10),r.hp=Math.min(r.hp*1.4,10)}};var dr={name:"Easy",acronym:"EZ",apply_to_difficulty(r){r.cs*=0.5,r.ar*=0.5,r.od*=0.5,r.hp*=0.5}};var cn={name:"Double Time",acronym:"DT",get_rate_multiplier:()=>1.5},pn={name:"Nightcore",acronym:"NC",get_rate_multiplier:()=>1.5};var hn={name:"Half Time",acronym:"HT",get_rate_multiplier:()=>0.75};var ln=0.4,fn=0.3,bn={name:"Hidden",acronym:"HD"};var Cr=(r)=>{if(r&(h.DoubleTime|h.Nightcore))return 1.5;if(r&h.HalfTime)return 0.75;return 1},In=(r,t)=>{if(t&h.Easy)dr.apply_to_difficulty(r);if(t&h.HardRock)Rr.apply_to_difficulty(r)},_n=(r,t)=>{if(t===1)return r;let n=X(r)/t;return Vr(n,nr)},ct=(r,t,n,e,s)=>{let u={cs:r,ar:t,od:n,hp:e};In(u,s);let i=Cr(s);return u.ar=_n(u.ar,i),u};var pt=(r,t)=>[r[0]+t[0],r[1]+t[1]],B=(r,t)=>[r[0]-t[0],r[1]-t[1]],ht=(r,t)=>[r[0]*t,r[1]*t],Tn=(r,t)=>[r[0]/t,r[1]/t],De=(r,t)=>r[0]*t[0]+r[1]*t[1],R=(r)=>Math.sqrt(r[0]*r[0]+r[1]*r[1]),ve=(r)=>r[0]*r[0]+r[1]*r[1],He=(r,t)=>R(B(r,t)),we=(r)=>{let t=R(r);return t>0?Tn(r,t):[0,0]},er=(r,t,n)=>r+(t-r)*n,d=(r,t,n)=>[er(r[0],t[0],n),er(r[1],t[1],n)],g=(r,t,n)=>Math.min(n,Math.max(t,r));var Fr={1:["#d5bc00"],2:["#ffffff","#ffffff"],3:["#ffffff","#d5bc00","#ffffff"],4:["#ffffff","#dc8dba","#dc8dba","#ffffff"],5:["#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff"],6:["#ffffff","#dc8dba","#ffffff","#ffffff","#dc8dba","#ffffff"],7:["#ffffff","#dc8dba","#ffffff","#d5bc00","#ffffff","#dc8dba","#ffffff"],8:["#d5bc00","#ffffff","#dc8dba","#ffffff","#d5bc00","#ffffff","#dc8dba","#ffffff"],9:["#ffffff","#dc8dba","#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff","#dc8dba","#ffffff"],10:["#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff","#ffffff","#dc8dba","#d5bc00","#dc8dba","#ffffff"]},Nr={combo_colors:["0,185,0","7, 105, 227","224, 4, 38","227, 171, 2"],circle_border_width:0.12,hit_circle_opacity:0.95,enable_approach_circle:!0,approach_circle_width:0.1,approach_circle_opacity:0.5,approach_circle_use_combo_color:!0,enable_glow:!1,glow_use_combo_color:!0,glow_opacity:0.3,enable_hit_explode:!0,slider_body_opacity:0.9,slider_border_opacity:1,slider_tick_opacity:0.75,slider_tick_size:0.1,slider_render_scale:2,follow_circle_factor:1.5,follow_circle_width:4,follow_circle_opacity:0.5,follow_circle_color:"#d3d3d3ff",follow_circle_use_combo_color:!1,slider_ball_color:"#ffffff",slider_ball_opacity:1,enable_slider_ball:!0,follow_point_width:2,follow_point_shape:"line",follow_point_mode:"full",follow_point_length:12,follow_point_line_gap:0,spinner_size:180,spinner_center_size:10,mania_lane_width:30,mania_note_height:15,mania_hit_position:364,mania_lane_spacing:1,mania_lane_colors:Fr,font_family:'"Kozuka Gothic Pro B", "Kozuka Gothic Pro R", "Aller", "Exo 2", sans-serif',hit_animation_duration:240,hit_animation_scale:1.2,enable_hit_animations:!0,enable_follow_circle_animations:!0},sr=(r)=>{if(!r)return{...Nr};return{...Nr,...r,mania_lane_colors:r.mania_lane_colors?{...Fr,...r.mania_lane_colors}:Fr}},N=(r,t,n=1)=>{return`rgba(${r.combo_colors[t%r.combo_colors.length]},${n})`},K=(r,t,n)=>{let e=r.mania_lane_colors[t]??r.mania_lane_colors[4];return e[n%e.length]??"#ffffff"};var v={None:(r)=>r,Out:(r)=>1-Math.pow(1-r,2),In:(r)=>r*r,InOut:(r)=>r<0.5?2*r*r:1-Math.pow(-2*r+2,2)/2,OutCubic:(r)=>1-Math.pow(1-r,3),InCubic:(r)=>r*r*r,OutQuad:(r)=>1-Math.pow(1-r,2),InQuad:(r)=>r*r,OutQuint:(r)=>1-Math.pow(1-r,5),InQuint:(r)=>r*r*r*r*r,OutElastic:(r)=>{let t=2*Math.PI/3;return r===0?0:r===1?1:Math.pow(2,-10*r)*Math.sin((r*10-0.75)*t)+1}};class ur{transforms=[];add(r,t,n,e,s,u=v.None){return this.transforms.push({property:r,start_value:t,end_value:n,start_time:e,end_time:e+s,easing:u}),this}then(){return this}get_value(r,t,n){let e=n;for(let s of this.transforms){if(s.property!==r)continue;if(t<s.start_time)continue;if(t>=s.end_time)e=s.end_value;else{let u=(t-s.start_time)/(s.end_time-s.start_time),i=s.easing(u);e=s.start_value+(s.end_value-s.start_value)*i}}return e}clear(){this.transforms=[]}}class J{backend;skin;hit_object;config;alpha=1;scale=1;rotation=0;x=0;y=0;armed_state=0;transforms=new ur;life_time_start=0;life_time_end=0;constructor(r,t){this.hit_object=r,this.config=t,this.backend=t.backend,this.skin=t.skin;let n=r.data;this.x=n.pos[0],this.y=n.pos[1],this.apply_defaults()}apply_defaults(){let{hit_object:r,config:t}=this,n=r.time-t.preempt;this.life_time_start=n,this.life_time_end=r.end_time+800}is_alive(r){return r>=this.life_time_start&&r<=this.life_time_end}update(r){this.alpha=this.transforms.get_value("alpha",r,1),this.scale=this.transforms.get_value("scale",r,1),this.rotation=this.transforms.get_value("rotation",r,0),this.update_state(r)}update_state(r){if(this.armed_state===0&&r>=this.hit_object.time)this.armed_state=1,this.on_hit(r)}on_hit(r){}render_body_pass(r){}render_head_pass(r){}get start_time(){return this.hit_object.time}get end_time(){return this.hit_object.end_time}get combo_number(){return this.hit_object.combo_number??0}get combo_count(){return this.hit_object.combo_count??1}get position(){return[this.x,this.y]}}class Y{state={circle_alpha:0,circle_scale:1,number_alpha:1,flash_alpha:0,glow_alpha:0};update(r,t,n,e={}){let s=t-n.preempt;if(r<s){this.reset_pre_hit_state();return}if(r<t){this.update_pre_hit(r,s,t,n);return}if(e.allow_hit_animation===!1){this.state.circle_alpha=0,this.state.circle_scale=1,this.state.number_alpha=0,this.state.flash_alpha=0,this.state.glow_alpha=0;return}let u=this.get_pre_hit_alpha(t,s,t,n);if(w(n.mods,h.Hidden)&&u<0.6){this.state.circle_alpha=0,this.state.circle_scale=1,this.state.number_alpha=0,this.state.flash_alpha=0,this.state.glow_alpha=0;return}this.update_post_hit(r,t,n,u)}render(r,t,n,e,s,u,i={}){let{circle_alpha:o,circle_scale:m,number_alpha:a,flash_alpha:f,glow_alpha:c}=this.state;if(o<=0.01&&f<=0.01&&c<=0.01)return;let p=e*m;if(o>0.01){let l=e*t.circle_border_width,T=e*(1-t.circle_border_width/2)*m;if(r.set_alpha(o*t.hit_circle_opacity),r.draw_circle(n[0],n[1],T,s,"rgba(255,255,255,1)",l),a>0.01){let _=e*0.7*m;r.set_alpha(a*t.hit_circle_opacity);let D=`600 ${_}px ${t.font_family}`;r.draw_text(String(u),n[0],n[1],D,"rgba(255,255,255,1)","center","middle")}r.set_alpha(1)}let I=i.enable_flash??t.enable_hit_explode,b=i.enable_glow??t.enable_glow;if(I&&f>0.01)r.save(),r.set_blend_mode("lighter"),r.set_alpha(f*0.02),r.draw_circle(n[0],n[1],p,"rgba(255,255,255,1)","transparent",0),r.restore();if(b&&c>0.01){r.save(),r.set_blend_mode("lighter"),r.set_alpha(c*t.glow_opacity);let l=t.glow_use_combo_color?s:t.glow_color??s;r.draw_circle(n[0],n[1],p*1.08,l,"transparent",0),r.restore()}}get circle_alpha(){return this.state.circle_alpha}reset_pre_hit_state(){this.state.circle_alpha=0,this.state.circle_scale=1,this.state.number_alpha=1,this.state.flash_alpha=0,this.state.glow_alpha=0}update_pre_hit(r,t,n,e){let s=this.get_pre_hit_alpha(r,t,n,e);this.state.circle_alpha=s,this.state.circle_scale=1,this.state.number_alpha=s,this.state.flash_alpha=0,this.state.glow_alpha=0}update_post_hit(r,t,n,e){let s=r-t,{skin:u}=n,i=Math.max(120,u.hit_animation_duration),o=i,m=Math.max(90,i*0.85),a=Math.max(30,i*0.25),f=Math.max(70,i*0.5),c=u.hit_animation_scale,p=g(s/a,0,1),I=g(s/o,0,1),l=(w(n.mods,h.Hidden)?g(e,0,1):g(Math.max(e,0.25),0,1))*(1-v.OutQuad(I)),T=g(s/m,0,1);if(this.state.circle_alpha=l,this.state.circle_scale=er(1,c,v.OutCubic(T)),this.state.number_alpha=l,s<=a)this.state.flash_alpha=v.OutQuint(p),this.state.glow_alpha=v.OutQuint(p);else{let _=g((s-a)/f,0,1);this.state.flash_alpha=1-v.OutQuint(_),this.state.glow_alpha=1-v.OutQuint(_)}}get_pre_hit_alpha(r,t,n,e){let u=g((r-t)/e.fade_in,0,1);if(w(e.mods,h.Hidden)){let i=n-e.preempt+e.fade_in,o=e.preempt*0.3;if(r>i){let m=g((r-i)/o,0,1);u*=1-m}}return u}}class ir extends J{visual=new Y;constructor(r,t){super(r,t)}update(r){super.update(r),this.visual.update(r,this.hit_object.time,this.config)}render(r){let{backend:t,skin:n,config:e}=this,{radius:s}=e,u=this.position,i=N(n,this.combo_number,1);this.visual.render(t,n,u,s,i,this.combo_count)}}var lt=(r)=>{let{start_time:t,span_duration:n,span_count:e,length:s,tick_distance:u,min_distance_from_end:i,get_position_at_progress:o}=r,m=[],a=[];if(s<=0||n<=0||e<=0)return{ticks:m,repeats:a};let c=Math.min(1e5,s),p=Math.min(Math.max(u,0),c),I=Math.max(0,Math.min(i,c));for(let b=0;b<e;b++){let l=t+b*n,T=b%2===1;if(p>0){let _=gn(b,l,n,T,c,p,I,o);if(T)_.reverse();m.push(..._)}if(b<e-1){let _=(b+1)%2;a.push({pos:o(_),time:l+n,repeat_index:b,path_progress:_})}}return m.sort((b,l)=>b.time-l.time),{ticks:m,repeats:a}},gn=(r,t,n,e,s,u,i,o)=>{let m=[];for(let a=u;a<=s;a+=u){if(a>=s-i)break;let f=a/s,c=e?1-f:f;m.push({pos:o(f),time:t+c*n,span_index:r,path_progress:f})}return m};var Ar=240,$r=1.3,Or=35,Dn=250,vn=300;class q extends J{slider_data;position_path;render_path;path_length;span_duration;body_alpha=0;head_visual=new Y;ball_alpha=0;ball_position;follow_alpha=0;follow_scale=1;ticks=[];repeats=[];tick_distance;min_distance_from_end;cached_texture=null;cached_scale=1;constructor(r,t,n,e,s,u){super(r,t);this.slider_data=r.data;let i=Math.max(1,t.radius*0.05);this.position_path=n,this.render_path=this.resample_path(n,i),this.span_duration=e,this.tick_distance=s,this.min_distance_from_end=u;let o=this.calculate_path_length();this.path_length=this.slider_data.distance>0?this.slider_data.distance:o,this.ball_position=this.slider_data.pos,this.build_nested_objects(),this.life_time_end=r.end_time+Ar}build_nested_objects(){let{slider_data:r,path_length:t,span_duration:n,hit_object:e}=this,s=Math.max(1,r.repetitions),u=1e5,i=Math.min(1e5,r.distance>0?r.distance:t),o=g(this.tick_distance,0,i);if(i<=0||n<=0){this.ticks=[],this.repeats=[];return}let m=lt({start_time:e.time,span_duration:n,span_count:s,length:i,tick_distance:o,min_distance_from_end:this.min_distance_from_end,get_position_at_progress:(a)=>this.get_position_at_progress(a)});this.ticks=m.ticks,this.repeats=m.repeats}calculate_path_length(){let r=0;for(let t=1;t<this.position_path.length;t++)r+=R(B(this.position_path[t],this.position_path[t-1]));return r}resample_path(r,t){if(r.length<2)return r.slice();let n=[r[0]],e=0,s=[];for(let f=1;f<r.length;f++){let c=R(B(r[f],r[f-1]));s.push(c),e+=c}if(e<=0)return n;let u=t,i=0,o=0;while(u<e&&o<s.length){let f=s[o],c=r[o],p=r[o+1];if(f>0&&i+f>=u){let I=(u-i)/f;n.push(d(c,p,I)),u+=t}else i+=f,o++}let m=r[r.length-1],a=n[n.length-1];if(a[0]!==m[0]||a[1]!==m[1])n.push(m);return n}update(r){super.update(r),this.calculate_ball_position(r),this.calculate_opacities(r),this.head_visual.update(r,this.hit_object.time,this.config)}calculate_ball_position(r){let{hit_object:t,span_duration:n}=this,e=300,s=300,u=2.4;if(r<t.time){this.ball_alpha=0,this.follow_alpha=0,this.follow_scale=1;return}if(r<=t.end_time){let a=r-t.time,f=Math.max(1,this.slider_data.repetitions),c=Math.min(Math.floor(a/n),f-1),p=g((a-c*n)/n,0,1),I=c%2===1?1-p:p;this.ball_position=this.get_position_at_progress(I),this.ball_alpha=1;let b=g(a/300,0,1),l=v.OutQuint(b);this.follow_alpha=l,this.follow_scale=1+1.4*l;return}let i=r-t.end_time,o=g(i/300,0,1),m=v.OutQuint(o);this.ball_alpha=1-m,this.follow_alpha=1-m,this.follow_scale=2.4-1.4*m}get_position_at_progress(r){let t=r*this.path_length;return this.get_position_at_length(t)}get_position_at_length(r){let t=0;for(let n=1;n<this.position_path.length;n++){let e=R(B(this.position_path[n],this.position_path[n-1]));if(t+e>=r){let s=(r-t)/e;return d(this.position_path[n-1],this.position_path[n],s)}t+=e}return this.position_path[this.position_path.length-1]}calculate_opacities(r){let{hit_object:t,config:n}=this,e=t.time-n.preempt,s=t.time;if(w(n.mods,h.Hidden)){let u=s-n.preempt+n.fade_in;if(r<e)this.body_alpha=0;else if(r<u)this.body_alpha=g((r-e)/n.fade_in,0,1);else if(r<=t.end_time){let i=Math.max(1,t.end_time-u);this.body_alpha=1-g((r-u)/i,0,1)}else this.body_alpha=0}else if(r<e)this.body_alpha=0;else if(r<s)this.body_alpha=g((r-e)/n.fade_in,0,1);else if(r<=t.end_time)this.body_alpha=1;else this.body_alpha=1-g((r-t.end_time)/Ar,0,1)}render(r){if(this.body_alpha<=0&&this.head_visual.circle_alpha<=0&&this.ball_alpha<=0)return;this.render_body(r),this.render_head(),this.render_ball(r)}render_body_pass(r){this.render_body(r)}render_head_pass(r){this.render_head(),this.render_reverse_arrows(r),this.render_ball(r)}render_body(r){if(this.body_alpha<=0.01||this.render_path.length<2)return;let{backend:t,skin:n,config:e}=this,{radius:s}=e,u=(e.scale??1)*(n.slider_render_scale||1);if(!this.cached_texture||this.cached_scale!==u){let i=N(n,this.combo_number,1),o=n.slider_border_color??"rgba(255,255,255,1)",m=u;this.cached_texture=t.render_slider_to_image(this.render_path,s,o,i,m,n.slider_body_opacity,n.slider_border_opacity),this.cached_scale=u}if(this.cached_texture&&this.cached_texture.min_x!==void 0&&this.cached_texture.min_y!==void 0){let i=this.cached_scale;t.set_alpha(this.body_alpha),t.draw_image(this.cached_texture,this.cached_texture.min_x,this.cached_texture.min_y,this.cached_texture.width/i,this.cached_texture.height/i),t.set_alpha(1)}this.render_ticks(r)}render_ticks(r){if(this.ticks.length===0)return;let{backend:t,config:n,hit_object:e}=this,{radius:s}=n,u=s*0.12,i=e.time-n.preempt,o=g((r-i)/n.preempt,0,1),m=150,a=m*4,f=w(n.mods,h.Hidden),c=Math.min(n.preempt-m,1000);for(let p of this.ticks){if(o<p.path_progress)continue;let I=i+p.path_progress*n.preempt,b=r-I;if(b<0)continue;let l=g(b/m,0,1);if(f&&c>0){let y=p.time-c;if(r>=y){let P=g((r-y)/c,0,1);l*=1-P}}else if(r>p.time){let y=g((r-p.time)/m,0,1);l*=1-y}l*=this.body_alpha;let T=g(b/a,0,1),D=0.5+0.5*this.ease_out_elastic_half(T),S=u*D;if(l>0.01)t.set_alpha(l),t.draw_circle(p.pos[0],p.pos[1],S,"rgba(255,255,255,0.8)","transparent",0)}t.set_alpha(1)}ease_out_elastic_half(r){if(r<=0)return 0;if(r>=1)return 1;let t=0.3;return Math.pow(2,-10*r)*Math.sin((r-t/4)*(2*Math.PI)/t)+1}render_reverse_arrows(r){if(this.repeats.length===0)return;let{backend:t,config:n,hit_object:e,span_duration:s}=this,{radius:u}=n,i=u*0.6;for(let o of this.repeats){let m=n.preempt;if(o.repeat_index>0)m=s*2;else m+=e.time-(e.time-n.preempt);let a=o.time-m,f=o.repeat_index%2===0;if(r<a||r>o.time+Ar)continue;let c=this.body_alpha*0.9;if(o.repeat_index===0){let _=g((r-a)/150,0,1);c*=v.OutQuint(_)}else if(r<a)c=0;if(r>o.time){let _=Math.min(300,s);c*=1-g((r-o.time)/_,0,1)}if(c<=0.01)continue;let p=this.position_path,I;if(f){let _=p.length-1;I=p[0];for(let D=_;D>=0;D--)if(Math.abs(p[D][0]-o.pos[0])>0.01||Math.abs(p[D][1]-o.pos[1])>0.01){I=p[D];break}}else{I=p[p.length-1];for(let _=0;_<p.length;_++)if(Math.abs(p[_][0]-o.pos[0])>0.01||Math.abs(p[_][1]-o.pos[1])>0.01){I=p[_];break}}let b=Math.atan2(I[1]-o.pos[1],I[0]-o.pos[0]),l=1;if(r<o.time){let _=e.time-n.preempt,D=(r-_)%vn;if(D<Or)l=1+($r-1)*v.Out(D/Or);else{let S=(D-Or)/Dn;l=$r-($r-1)*v.Out(g(S,0,1))}}else{let _=Math.min(300,s),D=g((r-o.time)/_,0,1);l=1+0.5*v.Out(D)}let T=i*l;t.save(),t.set_alpha(c),t.translate(o.pos[0],o.pos[1]),t.rotate(b),t.begin_path(),t.move_to(T*0.8,0),t.line_to(-T*0.4,-T*0.5),t.line_to(-T*0.4,T*0.5),t.close_path(),t.fill_path("rgba(255,255,255,0.9)"),t.restore()}}render_head(){if(this.head_visual.circle_alpha<=0.01)return;let{backend:r,skin:t,config:n}=this,{radius:e}=n,s=this.slider_data.pos,u=N(t,this.combo_number,1);this.head_visual.render(r,t,s,e,u,this.combo_count)}render_ball(r){if(this.ball_alpha<=0.01&&this.follow_alpha<=0.01)return;let{backend:t,skin:n,config:e}=this,{radius:s}=e,u=this.ball_position,i=N(n,this.combo_number,0.9);if(this.follow_alpha>0.01){let o=s*this.follow_scale;t.set_alpha(this.follow_alpha*n.follow_circle_opacity),t.begin_path(),t.arc_to(u[0],u[1],o,0,Math.PI*2),t.stroke_path(n.follow_circle_color,n.follow_circle_width)}if(n.enable_slider_ball&&this.ball_alpha>0.01)t.set_alpha(this.ball_alpha*n.slider_ball_opacity),t.draw_circle(u[0],u[1],s*0.85,i,"rgba(255,255,255,0.9)",s*0.1);t.set_alpha(1)}}class Er{skin;mods;preempt;fade_in;radius;points=[];lines=[];constructor(r,t,n,e,s){this.skin=r,this.mods=t,this.preempt=n,this.fade_in=e,this.radius=s}update_settings(r,t,n,e){this.mods=r,this.preempt=t,this.fade_in=n,this.radius=e}build(r){this.points=[],this.lines=[];let t=32,n=Math.max(450,this.preempt*0.9);for(let e=0;e<r.length-1;e++){let s=r[e],u=r[e+1];if($(s)||$(u))continue;if(s.combo_number!==u.combo_number)continue;let i=s.end_pos,o=u.data.pos,m=o[0]-i[0],a=o[1]-i[1],f=Math.sqrt(m*m+a*a);if(f<t*1.5)continue;let c=s.end_time,p=u.time-c;if(p<=0)continue;let I=f>0?1/f:0,b=[m*I,a*I],l=c-n,T=u.time-n,_=c+(T-c)*0.5,D=u.time;if(w(this.mods,h.Hidden))_=c+(T-c)*0.3,D=c+(u.time-c)*0.65;this.lines.push({start_pos:i,end_pos:o,dir:b,start_time:c,end_time:u.time,appear_time:l,grow_end_time:T,shrink_start_time:_,shrink_end_time:D});for(let S=t*1.5;S<f-t;S+=t){let y=S/f,P=s.end_time+y*p,A=Math.max(s.end_time,P-n);if(w(this.mods,h.Hidden))P=Math.min(P,c+p*0.65);let W=[i[0]+(y-0.1)*m,i[1]+(y-0.1)*a],L=[i[0]+y*m,i[1]+y*a];this.points.push({start_pos:W,end_pos:L,dir:b,fade_in_time:A,fade_out_time:P})}}}render(r,t,n){let e=this.skin.follow_point_shape,s=this.skin.follow_point_mode??"segments",u=this.skin.follow_point_length||this.radius*0.6,i=g(this.skin.follow_point_line_gap??0,0,0.9),o=Math.max(this.fade_in*0.15,50),m=0.2;if(s==="full")for(let a of this.lines){if(r<a.appear_time||r>a.shrink_end_time)continue;let f=0,c=a.start_pos[0],p=a.start_pos[1],I=a.end_pos[0],b=a.end_pos[1],l=Math.hypot(I-c,b-p),T=this.get_alpha_gate(r,a.start_time,a.end_time,n);if(T<=0.01)continue;let _=this.radius*1.05,D=Math.min(_,l*0.22);if(c+=a.dir[0]*D,p+=a.dir[1]*D,I-=a.dir[0]*D,b-=a.dir[1]*D,r<a.grow_end_time){let S=Math.max(1,a.grow_end_time-a.appear_time),y=g((r-a.appear_time)/S,0,1),P=v.OutQuint(y);f=P,I=c+(I-c)*P,b=p+(b-p)*P}else if(r<a.shrink_start_time)f=1;else{let S=Math.max(1,a.shrink_end_time-a.shrink_start_time),y=g((r-a.shrink_start_time)/S,0,1),P=v.InQuint(y);f=1,c=c+(I-c)*P,p=p+(b-p)*P}if(f<=0)continue;if(t.set_alpha(f*0.2*T),e==="line")if(i>0){let S=Math.hypot(I-c,b-p),y=a.dir[0],P=a.dir[1],A=S*i/2,W=(c+I)/2,L=(p+b)/2,wt=W-y*A,yt=L-P*A,St=W+y*A,Pt=L+P*A;t.draw_line(c,p,wt,yt,"rgba(255,255,255,1)",this.skin.follow_point_width,"round","round"),t.draw_line(St,Pt,I,b,"rgba(255,255,255,1)",this.skin.follow_point_width,"round","round")}else t.draw_line(c,p,I,b,"rgba(255,255,255,1)",this.skin.follow_point_width,"round","round");else{let S=this.radius*0.12,y=(a.start_pos[0]+a.end_pos[0])/2,P=(a.start_pos[1]+a.end_pos[1])/2;t.draw_circle(y,P,S,"rgba(255,255,255,1)","transparent",0)}}else for(let a of this.points){if(r<a.fade_in_time||r>a.fade_out_time+o)continue;let f=0,c=1,p=a.end_pos;if(r<a.fade_in_time+o){let b=g((r-a.fade_in_time)/o,0,1),l=v.OutCubic(b);f=l,c=1.5-0.5*l,p=d(a.start_pos,a.end_pos,l)}else if(r<=a.fade_out_time)f=1,c=1,p=a.end_pos;else{let b=g((r-a.fade_out_time)/o,0,1),l=v.OutCubic(b);f=1-l,c=1,p=d(a.start_pos,a.end_pos,1-l)}if(f<=0)continue;let I=this.get_alpha_gate(r,a.fade_in_time+this.preempt,a.fade_out_time,n);if(I<=0.01)continue;if(t.set_alpha(f*0.2*I),e==="line"){let l=u*c/2,T=a.dir[0],_=a.dir[1],D=p[0]-T*l,S=p[1]-_*l,y=p[0]+T*l,P=p[1]+_*l;t.draw_line(D,S,y,P,"rgba(255,255,255,1)",this.skin.follow_point_width,"round","round")}else{let b=this.radius*0.12*c;t.draw_circle(p[0],p[1],b,"rgba(255,255,255,1)","transparent",0)}}t.set_alpha(1)}get_alpha_gate(r,t,n,e){let s=e(r,t),u=e(r,n);return g(Math.min(s,u)/0.7,0,1)}}var x=(r,t=0.08)=>{if(r.length<2)return[...r];let n=[];return Qr(r,n,t),n},Qr=(r,t,n)=>{if(Hn(r,n)){if(t.length===0)t.push(r[0]);t.push(r[r.length-1]);return}let e=[],s=[];yn(r,e,s),Qr(e,t,n),Qr(s,t,n)},Hn=(r,t)=>{if(r.length<=2)return!0;let n=r[0],e=r[r.length-1];for(let s=1;s<r.length-1;s++)if(wn(r[s],n,e)>t)return!1;return!0},wn=(r,t,n)=>{let e=B(n,t),s=e[0]*e[0]+e[1]*e[1];if(s===0)return R(B(r,t));let u=Math.max(0,Math.min(1,((r[0]-t[0])*e[0]+(r[1]-t[1])*e[1])/s)),i=[t[0]+u*e[0],t[1]+u*e[1]];return R(B(r,i))},yn=(r,t,n)=>{let e=r.length,s=[r];for(let u=1;u<e;u++){s[u]=[];for(let i=0;i<e-u;i++)s[u][i]=d(s[u-1][i],s[u-1][i+1],0.5)}for(let u=0;u<e;u++)t.push(s[u][0]),n.push(s[e-1-u][u])},or=(r,t,n)=>{let e=B(t,r),s=R(e);if(s===0)return[r];let u=[e[0]/s,e[1]/s],i=pt(r,ht(u,n));return[r,i]},Ur=(r,t)=>{if(r.length!==3)return x(r);let[n,e,s]=r,u=Sn(n,e,s);if(!u)return or(n,s,t);let i=R(B(n,u)),o=Math.atan2(n[1]-u[1],n[0]-u[0]),m=Math.atan2(s[1]-u[1],s[0]-u[0]),f=(e[0]-n[0])*(s[1]-n[1])-(e[1]-n[1])*(s[0]-n[0])>0,c=m-o;if(f&&c<0)c+=2*Math.PI;if(!f&&c>0)c-=2*Math.PI;if(Math.abs(c)>Math.PI)return x(r);let p=Math.abs(c)*i,I=2;if(i*2>0.1){let l=Math.abs(c),T=2*Math.acos(1-0.1/i);if(I=Math.max(2,Math.ceil(l/T)),I>=1000)I=1000}let b=[];for(let l=0;l<=I;l++){let T=l/I,_=o+c*T;b.push([u[0]+i*Math.cos(_),u[1]+i*Math.sin(_)])}return b},Sn=(r,t,n)=>{let e=2*(r[0]*(t[1]-n[1])+t[0]*(n[1]-r[1])+n[0]*(r[1]-t[1]));if(Math.abs(e)<0.001)return null;let s=((r[0]*r[0]+r[1]*r[1])*(t[1]-n[1])+(t[0]*t[0]+t[1]*t[1])*(n[1]-r[1])+(n[0]*n[0]+n[1]*n[1])*(r[1]-t[1]))/e,u=((r[0]*r[0]+r[1]*r[1])*(n[0]-t[0])+(t[0]*t[0]+t[1]*t[1])*(r[0]-n[0])+(n[0]*n[0]+n[1]*n[1])*(t[0]-r[0]))/e;return[s,u]},Jr=(r)=>{if(r.length<2)return[...r];let t=[];for(let n=0;n<r.length-1;n++){let e=r[Math.max(0,n-1)],s=r[n],u=r[n+1],i=r[Math.min(r.length-1,n+2)],o=R(B(u,s)),m=Math.max(8,Math.ceil(o/3));for(let a=0;a<=m;a++){let f=a/m;t.push(Pn(e,s,u,i,f))}}return t},Pn=(r,t,n,e,s)=>{let u=s*s,i=u*s;return[0.5*(2*t[0]+(-r[0]+n[0])*s+(2*r[0]-5*t[0]+4*n[0]-e[0])*u+(-r[0]+3*t[0]-3*n[0]+e[0])*i),0.5*(2*t[1]+(-r[1]+n[1])*s+(2*r[1]-5*t[1]+4*n[1]-e[1])*u+(-r[1]+3*t[1]-3*n[1]+e[1])*i)]};var ft=(r)=>{let t;if(r.path_type==="L")t=or(r.pos,r.control_points[0],r.distance);else{let n=[r.pos,...r.control_points];switch(r.path_type){case"P":t=Ur(n,r.distance);break;case"C":t=Jr(n);break;default:t=Vn(n);break}}return Bn(t,r.distance)},bt=(r)=>{if(!r.computed_path||r.computed_path.length===0)return r.pos;return r.repetitions%2===0?r.pos:r.computed_path[r.computed_path.length-1]},Vn=(r)=>{let t=[],n=[r[0]];for(let s=1;s<r.length;s++){let[u,i]=[r[s-1],r[s]];if(u[0]===i[0]&&u[1]===i[1]){if(n.length>1)t.push(n);n=[i]}else n.push(i)}if(n.length>1)t.push(n);let e=[];for(let s of t)e.push(...x(s));return e},Bn=(r,t)=>{if(r.length<2)return r;let n=[r[0]],e=0,s=null,u=!1;for(let i=1;i<r.length;i++){let o=R(B(r[i],r[i-1])),m=B(r[i],r[i-1]);if(o>0)s=[m[0]/o,m[1]/o];if(o===0)continue;if(e+o>=t){let a=t-e;n.push(d(r[i-1],r[i],a/o)),e=t,u=!0;break}e+=o,n.push(r[i])}if(!u&&e<t&&s){let i=t-e,o=n[n.length-1];n.push([o[0]+s[0]*i,o[1]+s[1]*i])}return n};var It=(r,t,n)=>{if(r<=0)return 0;return r*n.base_beat_length/(100*t.sv*n.sv_multiplier)},_t=(r,t)=>{let n=t.sv_multiplier||1,e=100*r.sv*n,s=r.format_version<8?1/n:1,u=e/r.tick_rate*s,i=e/t.base_beat_length;return{tick_distance:u,min_distance_from_end:i*10}};var Tt=(r)=>{if(r.length===0)return r;return r.sort((t,n)=>{if(t.time!==n.time)return t.time-n.time;if(t.change===n.change)return 0;return t.change?-1:1})};class qr{points;index=0;last_time=Number.NEGATIVE_INFINITY;base_beat_length=600;sv_multiplier=1;constructor(r){if(this.points=r,r.length>0&&r[0].change&&r[0].ms_per_beat>0)this.base_beat_length=r[0].ms_per_beat}reset(){this.index=0,this.last_time=Number.NEGATIVE_INFINITY,this.base_beat_length=600,this.sv_multiplier=1}get_state_at(r){if(this.points.length===0)return{base_beat_length:600,sv_multiplier:1};if(r<this.last_time)this.reset();for(let t=this.index;t<this.points.length;t++){let n=this.points[t];if(n.time>r)break;if(n.change&&n.ms_per_beat>0)this.base_beat_length=n.ms_per_beat,this.sv_multiplier=1;else if(!n.change){if(n.velocity>0)this.sv_multiplier=n.velocity}this.index=t}return this.last_time=r,this.sv_multiplier=g(this.sv_multiplier,0.1,10),{base_beat_length:this.base_beat_length,sv_multiplier:this.sv_multiplier}}}var zr=(r)=>384-r;class mr extends U{radius=32;preempt=1200;fade_in=600;timing_points=[];timing_resolver=null;drawables=[];drawable_config;follow_point_renderer;constructor(r,t,n=0,e=F){super(r,t,n,e);this.follow_point_renderer=new Er(t,n,this.preempt,this.fade_in,this.radius)}initialize(r){this.beatmap=r,this.objects=JSON.parse(JSON.stringify(r.objects)).sort((n,e)=>n.time-e.time),this.timing_points=Tt([...r.timing_points]),this.timing_resolver=new qr(this.timing_points);let t=ct(r.cs,r.ar,0,0,this.mods);if(this.radius=Mr(t.cs),this.preempt=X(t.ar),this.fade_in=Br(this.preempt),w(this.mods,h.Hidden))this.fade_in=this.preempt*0.4;this.follow_point_renderer.update_settings(this.mods,this.preempt,this.fade_in,this.radius),this.preprocess_objects(),this.follow_point_renderer.build(this.objects),this.create_drawables()}set_mods(r){if(this.mods=r,this.beatmap)this.initialize(this.beatmap)}preprocess_objects(){let r=0,t=1;if(this.timing_resolver)this.timing_resolver.reset();for(let n of this.objects){if(xr(n))r=(r+1)%this.skin.combo_colors.length,t=1;else t++;if(n.combo_number=r,n.combo_count=t,br(n)){let e=n.data;if(w(this.mods,h.HardRock))e.pos=[e.pos[0],zr(e.pos[1])],e.control_points=e.control_points.map((i)=>[i[0],zr(i[1])]);e.computed_path=ft(e);let s=this.timing_resolver?.get_state_at(n.time)??{base_beat_length:600,sv_multiplier:1},u=It(e.distance,this.beatmap,s);e.duration=u,n.end_time=n.time+u*e.repetitions,n.end_pos=bt(e)}else if($(n))n.end_pos=[256,192];else{let e=n.data;if(w(this.mods,h.HardRock))e.pos=[e.pos[0],zr(e.pos[1])];n.end_pos=e.pos}}}create_drawables(){this.drawables=[];let r=this.config.use_high_dpi?window.devicePixelRatio||1:1;if(this.drawable_config={backend:this.backend,skin:this.skin,preempt:this.preempt,fade_in:this.fade_in,radius:this.radius,scale:this.config.scale*r,mods:this.mods},this.timing_resolver)this.timing_resolver.reset();for(let t of this.objects)if(Yr(t))this.drawables.push(new ir(t,this.drawable_config));else if(br(t)){let n=t.data,e=n.computed_path||[],s=n.duration||0,u=this.timing_resolver?.get_state_at(t.time)??{base_beat_length:600,sv_multiplier:1},{tick_distance:i,min_distance_from_end:o}=_t(this.beatmap,u);this.drawables.push(new q(t,this.drawable_config,e,s,i,o))}}render(r){let{backend:t,config:n}=this;this.render_background(),t.save(),t.translate(n.offset_x,n.offset_y),t.scale(n.scale,n.scale),this.render_playfield(),this.render_grid();let e=[];for(let s=this.drawables.length-1;s>=0;s--){let u=this.drawables[s];if(u.is_alive(r))e.push(u)}this.follow_point_renderer.render(r,t,(s,u)=>this.get_circle_alpha(s,u));for(let s of this.objects)if($(s)){let u=s.time-this.preempt;if(r>=u&&r<=s.end_time+200)this.draw_spinner(s,r)}for(let s of e)s.update(r);for(let s of e)if(s instanceof q)s.render_body_pass(r);for(let s of e)if(s instanceof q)s.render_head_pass(r);else s.render(r);if(!w(this.mods,h.Hidden)&&this.skin.enable_approach_circle){for(let s of e)if(r<=s.start_time)this.draw_approach_circle(s,r)}t.restore()}draw_approach_circle(r,t){let n=r.position,e=r.start_time-this.preempt,s=Math.min(this.fade_in*2,this.preempt),u=g((t-e)/s,0,1),i=v.OutQuint(u)*this.skin.approach_circle_opacity,m=4-3*g((t-e)/this.preempt,0,1),a=N(this.skin,r.combo_number,1);this.backend.save(),this.backend.set_alpha(i),this.backend.draw_circle(n[0],n[1],this.radius*m,"transparent",a,this.radius*this.skin.approach_circle_width),this.backend.restore()}get_circle_alpha(r,t){let n=t-this.preempt;if(r<n)return 0;let e=g((r-n)/this.fade_in,0,1);if(w(this.mods,h.Hidden)){let s=t-this.preempt+this.fade_in,u=this.preempt*0.3;if(r>s){let i=g((r-s)/u,0,1);e*=1-i}}return e}draw_spinner(r,t){let n=r.time-this.preempt,e=g((t-n)/this.fade_in,0,1);if(t>r.end_time)e=1-v.OutCubic(g((t-r.end_time)/200,0,1));if(e<=0)return;let s=256,u=192,i=r.end_time-r.time,o=g((t-r.time)/i,0,1);this.backend.set_alpha(e);let m=this.skin.spinner_size*(1-o);if(m>5)this.backend.begin_path(),this.backend.arc_to(s,u,m,0,Math.PI*2),this.backend.stroke_path("rgba(255,255,255,0.6)",4);this.backend.draw_circle(s,u,this.skin.spinner_size,"rgba(0,0,0,0.2)"),this.backend.draw_circle(s,u,12,"white")}}var gt=11485,Dt=20;class ar extends U{key_count=4;scroll_time=gt/Dt;hd_coverage=0.25;fi_coverage=0.6;gradient_ratio=0.2;constructor(r,t,n=0,e=F){super(r,t,n,e);this.update_scroll_time()}initialize(r){this.beatmap=r,this.objects=[...r.objects],this.key_count=Math.floor(r.cs);for(let t of this.objects)if(Ir(t))t.end_time=t.data.end_time}set_mods(r){this.mods=r,this.update_scroll_time()}update_scroll_time(){let r=Cr(this.mods);this.scroll_time=gt/(Dt*r)}time_to_y(r){let t=this.skin.mania_hit_position,n=r/this.scroll_time;return t-n*t}render(r){let{backend:t,config:n,skin:e,key_count:s}=this;this.render_background();let u=s*e.mania_lane_width,i=Math.floor((Sr-u)/2),o=e.mania_hit_position;t.save(),t.translate(n.offset_x,n.offset_y),t.scale(n.scale,n.scale),this.render_playfield(u,Pr,i),this.draw_lane_keys(r,i),this.draw_judgment_line(i),t.save(),t.begin_path(),t.rect(i,0,u,o),t.clip(),t.set_alpha(0.7),t.draw_rect(i,0,u,o,"#000000"),t.set_alpha(1);for(let m of this.objects){if(m.end_time<r)continue;if(Ir(m))this.draw_hold_note(m,r,i);else this.draw_note(m,r,i)}if(w(this.mods,h.Hidden)||w(this.mods,h.FadeIn)){let m=w(this.mods,h.Hidden)?this.hd_coverage:this.fi_coverage,a=o*m,f=o*this.gradient_ratio;if(w(this.mods,h.Hidden)){let c=o-a,p=f/a,I=t.create_linear_gradient(i,c,i,o,[{offset:0,color:"rgba(0,0,0,0)"},{offset:p*0.4,color:"rgba(0,0,0,0.3)"},{offset:p*0.7,color:"rgba(0,0,0,0.75)"},{offset:p*0.9,color:"rgba(0,0,0,0.95)"},{offset:p,color:"rgba(0,0,0,1)"},{offset:1,color:"rgba(0,0,0,1)"}]);t.draw_rect_gradient(i,c,u,a,I)}else{let c=(a-f)/a,p=t.create_linear_gradient(i,0,i,a,[{offset:0,color:"rgba(0,0,0,1)"},{offset:c,color:"rgba(0,0,0,1)"},{offset:c+(1-c)*0.1,color:"rgba(0,0,0,0.95)"},{offset:c+(1-c)*0.4,color:"rgba(0,0,0,0.75)"},{offset:c+(1-c)*0.7,color:"rgba(0,0,0,0.3)"},{offset:1,color:"rgba(0,0,0,0)"}]);t.draw_rect_gradient(i,0,u,a,p)}}t.restore(),t.restore()}get_lane(r){let t=r.data.pos,n=Math.floor(t[0]*this.key_count/512);if(w(this.mods,h.Mirror))n=this.key_count-1-n;return n}draw_note(r,t,n){let{backend:e,skin:s,key_count:u}=this,i=this.get_lane(r),o=s.mania_lane_width,m=s.mania_note_height,a=s.mania_lane_spacing,f=r.time-t,c=this.time_to_y(f);if(c<-m-64)return;let p=n+i*o,I=K(s,u,i);e.set_alpha(1),e.draw_rect(p+a,c-m,o-2*a,m,I)}draw_hold_note(r,t,n){let{backend:e,skin:s,key_count:u}=this,i=r.data,o=this.get_lane(r),m=s.mania_lane_width,a=s.mania_note_height,f=s.mania_lane_spacing,c=r.time-t,p=i.end_time-t,I=this.time_to_y(c),b=this.time_to_y(p),l=n+o*m,T=K(s,u,o);if(b<-64&&I<-64)return;let _=b,S=(c<0?s.mania_hit_position:I)-_;if(S>0)e.set_alpha(0.9),e.draw_rect(l+f,_,m-2*f,S,T);if(c>=0)e.set_alpha(1),e.draw_rect(l+f,I-a,m-2*f,a,T);e.set_alpha(1)}draw_judgment_line(r){let{backend:t,skin:n,key_count:e}=this,s=n.mania_lane_width,u=n.mania_hit_position;t.draw_rect(r,u-1,s*e,2,"#ffffff")}draw_lane_keys(r,t){let{backend:n,skin:e,key_count:s}=this,{mania_lane_width:u,mania_hit_position:i,mania_lane_spacing:o,mania_note_height:m}=e,a=m+5,f=new Set,c=50;for(let p of this.objects)if(r>=p.time-50&&r<=p.end_time+50)f.add(this.get_lane(p));for(let p=0;p<s;p++){let I=f.has(p),b=t+p*u,l=K(e,s,p);if(n.set_alpha(0.3),n.draw_rect(b+o,i,u-2*o,a,l),I)n.set_alpha(1),n.draw_rect(b+o,i,u-2*o,a,"#ff6666")}n.set_alpha(1)}}class cr{audio_context;audio_source=null;audio_buffer=null;gain_node;start_time=0;pause_time=0;speed=1;_is_playing=!1;_duration=0;_is_loaded=!1;constructor(r){this.audio_context=r,this.gain_node=this.audio_context.createGain(),this.gain_node.connect(this.audio_context.destination)}get is_playing(){return this._is_playing}get is_loaded(){return this._is_loaded}get duration(){return this._duration}get speed_multiplier(){return this.speed}get current_time(){if(!this._is_playing)return this.pause_time;return(this.audio_context.currentTime-this.start_time)*this.speed*1000}async load(r,t=0){this.stop();try{this.audio_buffer=await this.audio_context.decodeAudioData(r.slice(0)),this._duration=this.audio_buffer.duration*1000,this.speed=z(t),this._is_loaded=!0,this.pause_time=0}catch(n){throw console.error("Failed to decode audio data",n),n}}play(r){if(!this.audio_buffer){console.warn("[AudioController] Cannot play: not loaded");return}this.stop_source();let t=r!==void 0?r/1000:this.pause_time/1000,n=this.audio_buffer.duration,e=Math.max(0,Math.min(t,n));if(e>=n){this.pause_time=n*1000;return}this.audio_source=this.audio_context.createBufferSource(),this.audio_source.buffer=this.audio_buffer,this.audio_source.playbackRate.value=this.speed,this.audio_source.connect(this.gain_node),this.audio_source.onended=()=>{if(this._is_playing)this._is_playing=!1,this.pause_time=this._duration,this.audio_source=null},this.start_time=this.audio_context.currentTime-e/this.speed,this.audio_source.start(0,e),this._is_playing=!0}pause(){if(!this._is_playing)return;this.pause_time=this.current_time,this.stop_source(),this._is_playing=!1}seek(r){let t=Math.max(0,Math.min(r,this._duration));if(this._is_playing)this.stop_source(),this._is_playing=!1,this.pause_time=t,this.play();else this.pause_time=t}stop(){this.pause(),this.pause_time=0}get_host_time(r){return this.start_time+r/1000/this.speed}stop_source(){if(this.audio_source){try{this.audio_source.onended=null,this.audio_source.stop(),this.audio_source.disconnect()}catch{}this.audio_source=null}}set_volume(r){if(this.gain_node)this.gain_node.gain.value=Math.max(0,Math.min(1,r))}set_speed(r){if(this._is_playing){let t=this.current_time;this.speed=r,this.start_time=this.audio_context.currentTime-t/1000/r}else this.speed=r;if(this.audio_source)this.audio_source.playbackRate.value=r}dispose(){this.stop(),this.audio_buffer=null,this._is_loaded=!1,this.gain_node.disconnect()}}class pr{video=null;object_url=null;_offset=0;speed=1;get element(){return this.video}get offset(){return this._offset}async load(r,t=0,n=1){this.dispose(),this._offset=t,this.speed=n,this.video=document.createElement("video"),this.video.muted=!0,this.video.loop=!1,this.video.playsInline=!0,this.object_url=URL.createObjectURL(r),this.video.src=this.object_url,await new Promise((e,s)=>{if(!this.video)return s(Error("No video element"));this.video.onloadeddata=()=>e(),this.video.onerror=()=>s(Error("Failed to load video"))}),this.video.playbackRate=n}sync(r){if(!this.video)return;let t=(r-this._offset)/1000;if(t<0){if(!this.video.paused)this.video.pause();return}if(Math.abs(this.video.currentTime-t)>0.1)this.video.currentTime=t}play(){if(this.video&&this.video.paused)this.video.play().catch(()=>{console.log("failed to play video")})}pause(){if(this.video&&!this.video.paused)this.video.pause()}seek(r){if(!this.video)return;let t=Math.max(0,(r-this._offset)/1000);this.video.currentTime=t}set_speed(r){if(this.speed=r,this.video)this.video.playbackRate=r}dispose(){if(this.video)this.video.pause(),this.video.src="",this.video=null;if(this.object_url)URL.revokeObjectURL(this.object_url),this.object_url=null}}class Zr{context;gain_node;samples=new Map;volume=1;constructor(r){this.context=r,this.gain_node=r.createGain(),this.gain_node.connect(r.destination)}set_volume(r){this.volume=Math.max(0,Math.min(1,r)),this.gain_node.gain.value=this.volume}async load_samples(r){this.samples.clear();let t=[];for(let[n,e]of r)if(n.endsWith(".wav")||n.endsWith(".mp3")||n.endsWith(".ogg"))t.push(this.context.decodeAudioData(e.slice(0)).then((s)=>{let u=n.toLowerCase().replace(/\.(wav|mp3|ogg)$/,"");this.samples.set(u,s)}).catch((s)=>{console.warn(`[HitsoundController] Failed to decode ${n}:`,s)}));await Promise.all(t)}play(r,t,n,e,s=100,u,i=0){let o=this.get_set_name(r),m=this.get_set_name(t);if(u){let a=u.toLowerCase().replace(/\.(wav|mp3|ogg)$/,"");if(this.play_buffer(a,s,i))return}if(this.play_sound(o,"hitnormal",e,s,i),n&G.Whistle)this.play_sound(m,"hitwhistle",e,s,i);if(n&G.Finish)this.play_sound(m,"hitfinish",e,s,i);if(n&G.Clap)this.play_sound(m,"hitclap",e,s,i)}play_sound(r,t,n,e,s){let u=!1;if(n>1)u=this.play_buffer(`${r}-${t}${n}`,e,s);if(!u)this.play_buffer(`${r}-${t}`,e,s)}play_buffer(r,t,n){let e=this.samples.get(r);if(!e)return!1;let s=this.context.createBufferSource();s.buffer=e;let u=this.context.createGain();return u.gain.value=t/100,s.connect(u),u.connect(this.gain_node),s.start(n),!0}get_set_name(r){switch(r){case 3:return"drum";case 2:return"soft";default:return"normal"}}dispose(){this.samples.clear(),this.gain_node.disconnect()}}var vt=()=>typeof document<"u"&&("fonts"in document),hr=async()=>{if(!vt())return;try{await document.fonts.ready}catch{}},Mn=async(r="/assets/fonts")=>{if(!vt())return;let t=[];try{t.push(new FontFace("Aller",`url(${r}/Aller-Regular.ttf)`,{weight:"400",style:"normal"}))}catch{}try{t.push(new FontFace("Aller",`url(${r}/Aller-Bold.ttf)`,{weight:"600",style:"normal"}))}catch{}try{t.push(new FontFace("Kozuka Gothic Pro R",`url(${r}/KozGoProRegular.otf)`,{weight:"400",style:"normal"}))}catch{}try{t.push(new FontFace("Kozuka Gothic Pro B",`url(${r}/KozGoProBold.otf)`,{weight:"600",style:"normal"}))}catch{}if(t.length===0)return;let n=await Promise.all(t.map(async(e)=>{try{return await e.load()}catch{return null}}));for(let e of n)if(e)document.fonts.add(e);await hr()};class Xr{files;audio_filename;background_filename;video_filename;video_offset;constructor(r){this.files=r.files,this.audio_filename=r.audio_filename,this.background_filename=r.background_filename,this.video_filename=r.video_filename,this.video_offset=r.video_offset}resolve(){let r=this.audio_filename?this.find_file(this.audio_filename):void 0,t=this.background_filename?this.find_file(this.background_filename):void 0,n=this.video_filename?this.find_file(this.video_filename):void 0;return{audio:r,background:t?new Blob([t]):void 0,video:n?new Blob([n]):void 0,video_offset:this.video_offset}}find_file(r){if(this.files.has(r))return this.files.get(r);let t=r.toLowerCase();for(let[n,e]of this.files)if(n.toLowerCase()===t)return e;return}}var Rn=0.42,dn=100,Cn=30,Fn=20;class Ht{backend;renderer=null;audio_context;audio;hitsounds;video=null;resources=null;animation_frame=null;skin;mods;renderer_config;start_offset;volume;background_url=null;listeners=new Map;raw_osu_content="";is_loaded_flag=!1;next_hit_object_index=0;resize_observer=null;key_handler=null;options;enable_fps_counter=!1;fps_frame_count=0;fps_last_update=0;current_fps=0;time_smoothing=0.1;smoothed_delta=0;max_frame_delta=100;last_timestamp=0;smooth_time=0;constructor(r){this.options=r,this.backend=r.backend??new tr,this.skin=sr(r.skin),this.mods=r.mods??0,this.renderer_config={...F,...r.renderer_config},this.calculate_layout(r.canvas.width,r.canvas.height,r.playfield_scale),this.start_offset=r.start_time??-1,this.volume=r.volume??0.5,this.backend.initialize(r.canvas,this.renderer_config.use_high_dpi);let t=window.AudioContext||window.webkitAudioContext;if(this.audio_context=new t,this.audio=new cr(this.audio_context),this.hitsounds=new Zr(this.audio_context),this.audio.set_volume(this.volume),this.hitsounds.set_volume(this.volume),r.auto_resize)this.setup_auto_resize();this.enable_fps_counter=r.enable_fps_counter??!1,this.fps_last_update=performance.now();let n=r.time_smoothing;if(Number.isFinite(n))this.time_smoothing=Math.max(0,Math.min(1,n));let e=r.max_frame_delta;if(Number.isFinite(e))this.max_frame_delta=Math.max(10,e)}async load_osz(r,t){try{let e=await new Q().load_osz(r,{difficulty:t});return this.resources=e,this.setup()}catch(n){let e=n instanceof Error?n.message:String(n);return this.emit("error","INVALID_BEATMAP",e),C("INVALID_BEATMAP",e)}}async load_files(r,t){try{let n=new Q;this.resources=await n.load_from_files(r,{difficulty:t});for(let[e,s]of r)if(e.endsWith(".osu")){this.raw_osu_content=typeof s==="string"?s:new TextDecoder().decode(s);break}return this.setup()}catch(n){let e=n instanceof Error?n.message:String(n);return this.emit("error","INVALID_BEATMAP",e),C("INVALID_BEATMAP",e)}}async load_hitsounds(r){try{await this.hitsounds.load_samples(r)}catch(t){console.error("[BeatmapPlayer] Failed to load hitsounds:",t)}}async load_beatmap(r,t,n,e,s){return this.resources={beatmap:r,available_difficulties:[],files:new Map,audio:t,background:n,video:e,video_offset:s},this.setup()}async load_osu_content(r,t){try{let e=await yr().parse(r);return this.raw_osu_content=r,this.load_beatmap(e,t)}catch(n){let e=n instanceof Error?n.message:String(n);return this.emit("error","INVALID_BEATMAP",e),C("INVALID_BEATMAP",e)}}async setup(){if(!this.resources)return C("NOT_LOADED","No resources loaded");let{beatmap:r}=this.resources,t=z(this.mods),n=new Xr(this.resources).resolve();if(!this.resources.audio&&n.audio)this.resources.audio=n.audio;if(!this.resources.background&&n.background)this.resources.background=n.background;if(!this.resources.video&&n.video)this.resources.video=n.video;if(!this.resources.video_offset&&n.video_offset)this.resources.video_offset=n.video_offset;let{audio:e,video:s,video_offset:u}=this.resources;if(e)try{await this.audio.load(e,this.mods)}catch(i){let o=i instanceof Error?i.message:String(i);return this.emit("error","AUDIO_DECODE_ERROR",o),C("AUDIO_DECODE_ERROR",o)}if(s)this.video=new pr,await this.video.load(s,u??0,t);try{this.renderer=this.create_renderer(r),this.renderer.initialize(r)}catch(i){let o=i instanceof Error?i.message:String(i);return this.emit("error","UNSUPPORTED_MODE",o),C("UNSUPPORTED_MODE",o)}if(this.start_offset<0&&this.raw_osu_content){let o=await yr().extract_preview_time(this.raw_osu_content);this.start_offset=o>0?o:this.get_last_object_time()*Rn}if(this.start_offset<0)this.start_offset=0;return this.update_hit_index(this.start_offset),await this.load_background(),await hr(),this.is_loaded_flag=!0,this.emit("loaded",r,this.resources),requestAnimationFrame(()=>this.render_frame(this.start_offset)),Lr(this.resources)}async load_background(){if(!this.resources?.background||!this.renderer)return;try{let r=new Image;if(this.background_url)URL.revokeObjectURL(this.background_url);this.background_url=URL.createObjectURL(this.resources.background),r.src=this.background_url,await r.decode(),this.renderer.set_background({source:r,width:r.width,height:r.height})}catch(r){console.warn("[BeatmapPlayer] Failed to load background",r)}}create_renderer(r){switch(r.mode){case 0:return new mr(this.backend,this.skin,this.mods,this.renderer_config);case 3:return new ar(this.backend,this.skin,this.mods,this.renderer_config);case 1:case 2:default:throw Error(`Unsupported game mode: ${lr[r.mode]??r.mode}`)}}get_last_object_time(){if(!this.resources?.beatmap.objects.length)return 0;let r=this.resources.beatmap.objects;return r[r.length-1].end_time}async play(){if(!this.renderer||!this.is_loaded_flag){console.warn("[BeatmapPlayer] Cannot play: not loaded");return}if(this.audio.is_playing)return;if(this.audio_context.state==="suspended")await this.audio_context.resume();this.audio.play(this.start_offset),this.video?.play(),this.start_render_loop(),this.emit("play"),this.emit("statechange",!0)}pause(){if(!this.audio.is_playing)return;this.start_offset=this.audio.current_time,this.audio.pause(),this.video?.pause(),this.stop_render_loop(),this.emit("pause"),this.emit("statechange",!1)}set_mods(r){this.mods=r;let t=z(r);if(this.renderer?.set_mods(r),this.audio.set_speed(t),this.video?.set_speed(t),this.is_loaded_flag)requestAnimationFrame(()=>this.render_frame(this.current_time))}seek(r){this.start_offset=Math.max(0,Math.min(r,this.duration)),this.update_hit_index(this.start_offset),this.audio.seek(this.start_offset),this.video?.seek(this.start_offset),this.emit("seek",this.start_offset),this.render_frame(this.start_offset)}async set_difficulty(r){if(!this.resources)return C("NOT_LOADED","No beatmap resources loaded");let t=this.is_playing;this.stop();try{let e=await new Q().load_from_files(this.resources.files,{difficulty:r});this.resources=e;let s=this.resources.available_difficulties.find((i)=>i.version===this.resources.beatmap.version)?.filename;if(s){let i=this.resources.files.get(s);if(i)this.raw_osu_content=typeof i==="string"?i:new TextDecoder().decode(i)}let u=await this.setup();if(u.success&&t)this.play();return u}catch(n){let e=n instanceof Error?n.message:String(n);return this.emit("error","INVALID_BEATMAP",e),C("INVALID_BEATMAP",e)}}update_hit_index(r){if(!this.resources?.beatmap)return;let t=this.resources.beatmap.objects;if(this.next_hit_object_index>0&&t[this.next_hit_object_index-1].time>r)this.next_hit_object_index=0;while(this.next_hit_object_index<t.length&&t[this.next_hit_object_index].time<r)this.next_hit_object_index++}stop(){this.pause(),this.start_offset=0,this.audio.seek(0),this.update_hit_index(0),this.render_frame(0)}dispose(){if(this.stop(),this.backend.dispose(),this.audio.dispose(),this.hitsounds.dispose(),this.video?.dispose(),this.renderer?.dispose(),this.background_url)URL.revokeObjectURL(this.background_url),this.background_url=null;if(this.resize_observer)this.resize_observer.disconnect(),this.resize_observer=null;if(this.key_handler)window.removeEventListener("keydown",this.key_handler),this.key_handler=null;if(this.audio_context&&this.audio_context.state!=="closed")this.audio_context.close().catch(()=>{});this.renderer=null,this.resources=null,this.is_loaded_flag=!1,this.listeners.clear()}get current_time(){return this.audio.current_time}get duration(){return this.audio.duration||this.get_last_object_time()}get is_playing(){return this.audio.is_playing}get is_loaded(){return this.is_loaded_flag}get mode(){if(!this.resources)return"standard";switch(this.resources.beatmap.mode){case 1:return"taiko";case 2:return"catch";case 3:return"mania";default:return"standard"}}get beatmap(){return this.resources?.beatmap??null}get available_difficulties(){return this.resources?.available_difficulties??[]}get background(){return this.resources?.background}get config(){return this.renderer_config}resize(r,t,n){if(this.backend.resize(r,t),this.calculate_layout(r,t,n),this.is_loaded_flag)requestAnimationFrame(()=>this.render_frame(this.current_time))}update_config(r){if(this.renderer_config={...this.renderer_config,...r},this.renderer?.update_config(this.renderer_config),this.is_loaded_flag)requestAnimationFrame(()=>this.render_frame(this.current_time))}set_skin(r){if(this.skin=sr(r),this.is_loaded_flag&&this.resources?.beatmap)this.renderer=this.create_renderer(this.resources.beatmap),this.renderer.initialize(this.resources.beatmap),requestAnimationFrame(()=>this.render_frame(this.current_time))}setup_auto_resize(){this.resize_observer=new ResizeObserver(()=>{let t=this.options.canvas.parentElement;if(t){let n=t.getBoundingClientRect();this.resize(n.width,n.height,this.options.playfield_scale)}}),this.resize_observer.observe(this.options.canvas.parentElement||this.options.canvas)}toggle_pause(){if(!this.is_loaded_flag)return;if(this.is_playing)this.pause();else this.play()}toggle_grid(){if(this.renderer_config.grid_level===0)this.renderer_config.grid_level=32;else this.renderer_config.grid_level=0;this.render_frame(this.current_time)}calculate_layout(r,t,n){let u=0.9;if(Number.isFinite(n))u=n;let i=r*u/512,o=t*u/384,m=Math.min(i,o);if(this.renderer_config.scale=m,this.renderer_config.offset_x=Math.floor((r-512*m)/2),this.renderer_config.offset_y=Math.floor((t-384*m)/2),this.renderer)this.renderer.update_config(this.renderer_config)}set_volume(r){this.volume=r,this.audio.set_volume(r),this.hitsounds.set_volume(r)}on(r,t){if(!this.listeners.has(r))this.listeners.set(r,new Set);this.listeners.get(r).add(t)}off(r,t){this.listeners.get(r)?.delete(t)}emit(r,...t){let n=this.listeners.get(r);if(n)for(let e of n)e(...t)}start_render_loop(){if(this.animation_frame!==null)return;this.last_timestamp=performance.now(),this.smooth_time=this.audio.current_time,this.smoothed_delta=0;let r=(t)=>{if(!this.audio.is_playing){this.animation_frame=null;return}let n=Math.max(0,t-this.last_timestamp);this.last_timestamp=t;let e=Math.min(n,this.max_frame_delta);if(this.time_smoothing>0){if(this.smoothed_delta===0)this.smoothed_delta=e;else this.smoothed_delta+=(e-this.smoothed_delta)*this.time_smoothing;e=this.smoothed_delta}this.smooth_time+=e*this.audio.speed_multiplier;let s=this.audio.current_time;if(Math.abs(this.smooth_time-s)>Cn)this.smooth_time=s;else this.smooth_time+=(s-this.smooth_time)*0.1;let i=this.smooth_time;if(this.schedule_hitsounds(i),this.render_frame(i),this.video?.sync(i),this.emit("timeupdate",i,this.duration),i>=this.duration){this.emit("ended"),this.stop_render_loop(),this.emit("statechange",!1);return}this.animation_frame=requestAnimationFrame(r)};this.animation_frame=requestAnimationFrame(r)}schedule_hitsounds(r){if(!this.resources?.beatmap||!this.audio.is_playing)return;let t=this.resources.beatmap.objects,n=r+dn;while(this.next_hit_object_index<t.length&&t[this.next_hit_object_index].time<=n){let e=t[this.next_hit_object_index];if(e.time>=r-Fn)this.play_hitsound(e);this.next_hit_object_index++}}play_hitsound(r){let t=this.get_timing_point(r.time),n=t.volume,e=t.sample_set,s=t.sample_set,u=t.sample_index,i=void 0;if(r.hit_sample){let m=r.hit_sample;if(m.normal_set!==0){if(e=m.normal_set,m.addition_set===0)s=e}if(m.addition_set!==0)s=m.addition_set;if(m.index!==0)u=m.index;if(m.volume!==0)n=m.volume;i=m.filename}if(e===0)e=1;if(s===0)s=e;let o=this.audio.get_host_time(r.time);this.hitsounds.play(e,s,r.hit_sound,u,n,i,o)}get_timing_point(r){let t=this.resources?.beatmap.timing_points??[];for(let n=t.length-1;n>=0;n--)if(t[n].time<=r)return t[n];return t[0]}stop_render_loop(){if(this.animation_frame!==null)cancelAnimationFrame(this.animation_frame),this.animation_frame=null}render_frame(r){if(this.backend.clear(),this.renderer?.render(r),this.enable_fps_counter){this.fps_frame_count++;let t=performance.now(),n=t-this.fps_last_update;if(n>=1000)this.current_fps=Math.round(this.fps_frame_count*1000/n),this.fps_frame_count=0,this.fps_last_update=t;this.backend.draw_text(`${this.current_fps} FPS`,10,20,"14px monospace","rgba(255,255,255,0.8)","left","top")}}set_fps_counter(r){this.enable_fps_counter=r}}export{hr as wait_for_fonts_ready,B as vec2_sub,we as vec2_normalize,ht as vec2_mul,d as vec2_lerp,ve as vec2_len_sq,R as vec2_len,De as vec2_dot,Tn as vec2_div,He as vec2_dist,pt as vec2_add,$n as unwrap,zn as toggle_mod,Lr as ok,qn as mods_to_string,Jn as mods_from_string,sr as merge_skin,Mn as load_default_fonts,er as lerp,$ as is_spinner,br as is_slider,On as is_ok,xr as is_new_combo,Ir as is_hold,En as is_err,Yr as is_circle,Vr as inverse_difficulty_range,Tr as init_wasm_parser,w as has_mod,on as get_wasm_ready,z as get_speed_multiplier,Cr as get_rate_multiplier,K as get_mania_lane_color,N as get_combo_color,Zn as get_available_mods,ct as get_adjusted_difficulty,Ur as flatten_perfect,or as flatten_linear,Jr as flatten_catmull,x as flatten_bezier,Hr as extract_video_info,gr as extract_preview_time,vr as extract_background_filename,Dr as extract_audio_filename,C as err,at as difficulty_range,ut as configure_wasm_parser,g as clamp,Mr as calculate_radius,X as calculate_preempt,Br as calculate_fade_in,_n as apply_rate_to_ar,In as apply_mods_to_difficulty,pr as VideoController,mr as StandardRenderer,Ft as SpeedChangingMods,fr as SampleSet,nr as PREEMPT_RANGE,mn as PREEMPT_MIN,Sr as PLAYFIELD_WIDTH,Pr as PLAYFIELD_HEIGHT,Q as OszLoader,h as Mods,pn as ModNightcore,bn as ModHidden,Rr as ModHardRock,hn as ModHalfTime,dr as ModEasy,cn as ModDoubleTime,ar as ManiaRenderer,G as HitSoundType,M as HitObjectType,fn as HD_FADE_OUT_MULTIPLIER,ln as HD_FADE_IN_MULTIPLIER,mt as GridLevel,lr as GameMode,Wr as ErrorCode,Un as DifficultyChangingMods,Nr as DEFAULT_SKIN,F as DEFAULT_RENDERER_CONFIG,tr as CanvasBackend,Ht as BeatmapPlayer,k as BeatmapParser,U as BaseRenderer,cr as AudioController};
4
2
 
5
- //# debugId=8D68191BE9969DD864756E2164756E21
3
+ //# debugId=D006F70D7CDEDA8864756E2164756E21