commit 3dd301a3342599e9060caabc00d98f7f7be998e4 Author: Michael Zhang Date: Fri May 3 21:07:41 2024 -0500 initial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/Refault/approachcircle.png b/Refault/approachcircle.png new file mode 100644 index 0000000..1e4b200 Binary files /dev/null and b/Refault/approachcircle.png differ diff --git a/Refault/approachcircle@2x.png b/Refault/approachcircle@2x.png new file mode 100644 index 0000000..fc65ab3 Binary files /dev/null and b/Refault/approachcircle@2x.png differ diff --git a/Refault/cursor-smoke.png b/Refault/cursor-smoke.png new file mode 100644 index 0000000..9fad8d4 Binary files /dev/null and b/Refault/cursor-smoke.png differ diff --git a/Refault/cursor-smoke@2x.png b/Refault/cursor-smoke@2x.png new file mode 100644 index 0000000..0c4ff38 Binary files /dev/null and b/Refault/cursor-smoke@2x.png differ diff --git a/Refault/cursor.png b/Refault/cursor.png new file mode 100644 index 0000000..743a0c5 Binary files /dev/null and b/Refault/cursor.png differ diff --git a/Refault/cursor@2x.png b/Refault/cursor@2x.png new file mode 100644 index 0000000..079828f Binary files /dev/null and b/Refault/cursor@2x.png differ diff --git a/Refault/cursormiddle.png b/Refault/cursormiddle.png new file mode 100644 index 0000000..d1f079e Binary files /dev/null and b/Refault/cursormiddle.png differ diff --git a/Refault/cursormiddle@2x.png b/Refault/cursormiddle@2x.png new file mode 100644 index 0000000..9f9ccd6 Binary files /dev/null and b/Refault/cursormiddle@2x.png differ diff --git a/Refault/cursortrail.png b/Refault/cursortrail.png new file mode 100644 index 0000000..b6000c5 Binary files /dev/null and b/Refault/cursortrail.png differ diff --git a/Refault/cursortrail@2x.png b/Refault/cursortrail@2x.png new file mode 100644 index 0000000..a822f1d Binary files /dev/null and b/Refault/cursortrail@2x.png differ diff --git a/Refault/default-0.png b/Refault/default-0.png new file mode 100644 index 0000000..d2a31f0 Binary files /dev/null and b/Refault/default-0.png differ diff --git a/Refault/default-0@2x.png b/Refault/default-0@2x.png new file mode 100644 index 0000000..6726724 Binary files /dev/null and b/Refault/default-0@2x.png differ diff --git a/Refault/default-1.png b/Refault/default-1.png new file mode 100644 index 0000000..c3de39e Binary files /dev/null and b/Refault/default-1.png differ diff --git a/Refault/default-1@2x.png b/Refault/default-1@2x.png new file mode 100644 index 0000000..997a921 Binary files /dev/null and b/Refault/default-1@2x.png differ diff --git a/Refault/default-2.png b/Refault/default-2.png new file mode 100644 index 0000000..904d185 Binary files /dev/null and b/Refault/default-2.png differ diff --git a/Refault/default-2@2x.png b/Refault/default-2@2x.png new file mode 100644 index 0000000..c566dc8 Binary files /dev/null and b/Refault/default-2@2x.png differ diff --git a/Refault/default-3.png b/Refault/default-3.png new file mode 100644 index 0000000..698eeaa Binary files /dev/null and b/Refault/default-3.png differ diff --git a/Refault/default-3@2x.png b/Refault/default-3@2x.png new file mode 100644 index 0000000..8604aa9 Binary files /dev/null and b/Refault/default-3@2x.png differ diff --git a/Refault/default-4.png b/Refault/default-4.png new file mode 100644 index 0000000..91ea1ff Binary files /dev/null and b/Refault/default-4.png differ diff --git a/Refault/default-4@2x.png b/Refault/default-4@2x.png new file mode 100644 index 0000000..d1c16d1 Binary files /dev/null and b/Refault/default-4@2x.png differ diff --git a/Refault/default-5.png b/Refault/default-5.png new file mode 100644 index 0000000..dba06b3 Binary files /dev/null and b/Refault/default-5.png differ diff --git a/Refault/default-5@2x.png b/Refault/default-5@2x.png new file mode 100644 index 0000000..6cc15d5 Binary files /dev/null and b/Refault/default-5@2x.png differ diff --git a/Refault/default-6.png b/Refault/default-6.png new file mode 100644 index 0000000..eb78d26 Binary files /dev/null and b/Refault/default-6.png differ diff --git a/Refault/default-6@2x.png b/Refault/default-6@2x.png new file mode 100644 index 0000000..d68b3a2 Binary files /dev/null and b/Refault/default-6@2x.png differ diff --git a/Refault/default-7.png b/Refault/default-7.png new file mode 100644 index 0000000..72a9b4b Binary files /dev/null and b/Refault/default-7.png differ diff --git a/Refault/default-7@2x.png b/Refault/default-7@2x.png new file mode 100644 index 0000000..c479175 Binary files /dev/null and b/Refault/default-7@2x.png differ diff --git a/Refault/default-8.png b/Refault/default-8.png new file mode 100644 index 0000000..3405309 Binary files /dev/null and b/Refault/default-8.png differ diff --git a/Refault/default-8@2x.png b/Refault/default-8@2x.png new file mode 100644 index 0000000..e3a21fa Binary files /dev/null and b/Refault/default-8@2x.png differ diff --git a/Refault/default-9.png b/Refault/default-9.png new file mode 100644 index 0000000..3e36461 Binary files /dev/null and b/Refault/default-9.png differ diff --git a/Refault/default-9@2x.png b/Refault/default-9@2x.png new file mode 100644 index 0000000..1552c93 Binary files /dev/null and b/Refault/default-9@2x.png differ diff --git a/Refault/hit0.png b/Refault/hit0.png new file mode 100644 index 0000000..f605c31 Binary files /dev/null and b/Refault/hit0.png differ diff --git a/Refault/hit0@2x.png b/Refault/hit0@2x.png new file mode 100644 index 0000000..804195d Binary files /dev/null and b/Refault/hit0@2x.png differ diff --git a/Refault/hit100.png b/Refault/hit100.png new file mode 100644 index 0000000..f225bc2 Binary files /dev/null and b/Refault/hit100.png differ diff --git a/Refault/hit100@2x.png b/Refault/hit100@2x.png new file mode 100644 index 0000000..eac2960 Binary files /dev/null and b/Refault/hit100@2x.png differ diff --git a/Refault/hit100k.png b/Refault/hit100k.png new file mode 100644 index 0000000..05910b0 Binary files /dev/null and b/Refault/hit100k.png differ diff --git a/Refault/hit100k@2x.png b/Refault/hit100k@2x.png new file mode 100644 index 0000000..5136de7 Binary files /dev/null and b/Refault/hit100k@2x.png differ diff --git a/Refault/hit300.png b/Refault/hit300.png new file mode 100644 index 0000000..9521e68 Binary files /dev/null and b/Refault/hit300.png differ diff --git a/Refault/hit300@2x.png b/Refault/hit300@2x.png new file mode 100644 index 0000000..978e3da Binary files /dev/null and b/Refault/hit300@2x.png differ diff --git a/Refault/hit300g.png b/Refault/hit300g.png new file mode 100644 index 0000000..680d6b7 Binary files /dev/null and b/Refault/hit300g.png differ diff --git a/Refault/hit300g@2x.png b/Refault/hit300g@2x.png new file mode 100644 index 0000000..4d7eb1b Binary files /dev/null and b/Refault/hit300g@2x.png differ diff --git a/Refault/hit300k.png b/Refault/hit300k.png new file mode 100644 index 0000000..5a1f68e Binary files /dev/null and b/Refault/hit300k.png differ diff --git a/Refault/hit300k@2x.png b/Refault/hit300k@2x.png new file mode 100644 index 0000000..f07a538 Binary files /dev/null and b/Refault/hit300k@2x.png differ diff --git a/Refault/hit50.png b/Refault/hit50.png new file mode 100644 index 0000000..c28ec11 Binary files /dev/null and b/Refault/hit50.png differ diff --git a/Refault/hit50@2x.png b/Refault/hit50@2x.png new file mode 100644 index 0000000..f2c484c Binary files /dev/null and b/Refault/hit50@2x.png differ diff --git a/Refault/hitcircle.png b/Refault/hitcircle.png new file mode 100644 index 0000000..258d573 Binary files /dev/null and b/Refault/hitcircle.png differ diff --git a/Refault/hitcircle@2x.png b/Refault/hitcircle@2x.png new file mode 100644 index 0000000..1411d3e Binary files /dev/null and b/Refault/hitcircle@2x.png differ diff --git a/Refault/hitcircleoverlay.png b/Refault/hitcircleoverlay.png new file mode 100644 index 0000000..87c2652 Binary files /dev/null and b/Refault/hitcircleoverlay.png differ diff --git a/Refault/hitcircleoverlay@2x.png b/Refault/hitcircleoverlay@2x.png new file mode 100644 index 0000000..4b139ba Binary files /dev/null and b/Refault/hitcircleoverlay@2x.png differ diff --git a/Refault/lighting.png b/Refault/lighting.png new file mode 100644 index 0000000..b61d33a Binary files /dev/null and b/Refault/lighting.png differ diff --git a/Refault/lighting@2x.png b/Refault/lighting@2x.png new file mode 100644 index 0000000..2ba3ea6 Binary files /dev/null and b/Refault/lighting@2x.png differ diff --git a/Refault/menu-background.jpg b/Refault/menu-background.jpg new file mode 100644 index 0000000..f5e5f8d Binary files /dev/null and b/Refault/menu-background.jpg differ diff --git a/Refault/menu-button-background.png b/Refault/menu-button-background.png new file mode 100644 index 0000000..82bf916 Binary files /dev/null and b/Refault/menu-button-background.png differ diff --git a/Refault/menu-button-background@2x.png b/Refault/menu-button-background@2x.png new file mode 100644 index 0000000..294b272 Binary files /dev/null and b/Refault/menu-button-background@2x.png differ diff --git a/Refault/particle100.png b/Refault/particle100.png new file mode 100644 index 0000000..6b37490 Binary files /dev/null and b/Refault/particle100.png differ diff --git a/Refault/particle100@2x.png b/Refault/particle100@2x.png new file mode 100644 index 0000000..e9b3018 Binary files /dev/null and b/Refault/particle100@2x.png differ diff --git a/Refault/particle300.png b/Refault/particle300.png new file mode 100644 index 0000000..ac43893 Binary files /dev/null and b/Refault/particle300.png differ diff --git a/Refault/particle300@2x.png b/Refault/particle300@2x.png new file mode 100644 index 0000000..522094f Binary files /dev/null and b/Refault/particle300@2x.png differ diff --git a/Refault/particle50.png b/Refault/particle50.png new file mode 100644 index 0000000..b764e6d Binary files /dev/null and b/Refault/particle50.png differ diff --git a/Refault/particle50@2x.png b/Refault/particle50@2x.png new file mode 100644 index 0000000..e92a76e Binary files /dev/null and b/Refault/particle50@2x.png differ diff --git a/Refault/ranking-A-small.png b/Refault/ranking-A-small.png new file mode 100644 index 0000000..5d5955e Binary files /dev/null and b/Refault/ranking-A-small.png differ diff --git a/Refault/ranking-A-small@2x.png b/Refault/ranking-A-small@2x.png new file mode 100644 index 0000000..017ca17 Binary files /dev/null and b/Refault/ranking-A-small@2x.png differ diff --git a/Refault/ranking-A.png b/Refault/ranking-A.png new file mode 100644 index 0000000..391d7f6 Binary files /dev/null and b/Refault/ranking-A.png differ diff --git a/Refault/ranking-A@2x.png b/Refault/ranking-A@2x.png new file mode 100644 index 0000000..25bede4 Binary files /dev/null and b/Refault/ranking-A@2x.png differ diff --git a/Refault/ranking-B-small.png b/Refault/ranking-B-small.png new file mode 100644 index 0000000..7289f4e Binary files /dev/null and b/Refault/ranking-B-small.png differ diff --git a/Refault/ranking-B-small@2x.png b/Refault/ranking-B-small@2x.png new file mode 100644 index 0000000..ec88e05 Binary files /dev/null and b/Refault/ranking-B-small@2x.png differ diff --git a/Refault/ranking-B.png b/Refault/ranking-B.png new file mode 100644 index 0000000..2079237 Binary files /dev/null and b/Refault/ranking-B.png differ diff --git a/Refault/ranking-B@2x.png b/Refault/ranking-B@2x.png new file mode 100644 index 0000000..821c011 Binary files /dev/null and b/Refault/ranking-B@2x.png differ diff --git a/Refault/ranking-C-small.png b/Refault/ranking-C-small.png new file mode 100644 index 0000000..f99c0d3 Binary files /dev/null and b/Refault/ranking-C-small.png differ diff --git a/Refault/ranking-C-small@2x.png b/Refault/ranking-C-small@2x.png new file mode 100644 index 0000000..b559863 Binary files /dev/null and b/Refault/ranking-C-small@2x.png differ diff --git a/Refault/ranking-C.png b/Refault/ranking-C.png new file mode 100644 index 0000000..43c580b Binary files /dev/null and b/Refault/ranking-C.png differ diff --git a/Refault/ranking-C@2x.png b/Refault/ranking-C@2x.png new file mode 100644 index 0000000..7e4baef Binary files /dev/null and b/Refault/ranking-C@2x.png differ diff --git a/Refault/ranking-D-small.png b/Refault/ranking-D-small.png new file mode 100644 index 0000000..bd2fb4a Binary files /dev/null and b/Refault/ranking-D-small.png differ diff --git a/Refault/ranking-D-small@2x.png b/Refault/ranking-D-small@2x.png new file mode 100644 index 0000000..f61343d Binary files /dev/null and b/Refault/ranking-D-small@2x.png differ diff --git a/Refault/ranking-D.png b/Refault/ranking-D.png new file mode 100644 index 0000000..0d7caf2 Binary files /dev/null and b/Refault/ranking-D.png differ diff --git a/Refault/ranking-D@2x.png b/Refault/ranking-D@2x.png new file mode 100644 index 0000000..9f4560a Binary files /dev/null and b/Refault/ranking-D@2x.png differ diff --git a/Refault/ranking-S-small.png b/Refault/ranking-S-small.png new file mode 100644 index 0000000..b675b88 Binary files /dev/null and b/Refault/ranking-S-small.png differ diff --git a/Refault/ranking-S-small@2x.png b/Refault/ranking-S-small@2x.png new file mode 100644 index 0000000..f53e388 Binary files /dev/null and b/Refault/ranking-S-small@2x.png differ diff --git a/Refault/ranking-S.png b/Refault/ranking-S.png new file mode 100644 index 0000000..3c61ffb Binary files /dev/null and b/Refault/ranking-S.png differ diff --git a/Refault/ranking-S@2x.png b/Refault/ranking-S@2x.png new file mode 100644 index 0000000..88d3553 Binary files /dev/null and b/Refault/ranking-S@2x.png differ diff --git a/Refault/ranking-SH-small.png b/Refault/ranking-SH-small.png new file mode 100644 index 0000000..d233666 Binary files /dev/null and b/Refault/ranking-SH-small.png differ diff --git a/Refault/ranking-SH-small@2x.png b/Refault/ranking-SH-small@2x.png new file mode 100644 index 0000000..8d4ecc9 Binary files /dev/null and b/Refault/ranking-SH-small@2x.png differ diff --git a/Refault/ranking-SH.png b/Refault/ranking-SH.png new file mode 100644 index 0000000..a93657e Binary files /dev/null and b/Refault/ranking-SH.png differ diff --git a/Refault/ranking-SH@2x.png b/Refault/ranking-SH@2x.png new file mode 100644 index 0000000..2f5e4a4 Binary files /dev/null and b/Refault/ranking-SH@2x.png differ diff --git a/Refault/ranking-X-small.png b/Refault/ranking-X-small.png new file mode 100644 index 0000000..6778f48 Binary files /dev/null and b/Refault/ranking-X-small.png differ diff --git a/Refault/ranking-X-small@2x.png b/Refault/ranking-X-small@2x.png new file mode 100644 index 0000000..5d7b447 Binary files /dev/null and b/Refault/ranking-X-small@2x.png differ diff --git a/Refault/ranking-X.png b/Refault/ranking-X.png new file mode 100644 index 0000000..427dc44 Binary files /dev/null and b/Refault/ranking-X.png differ diff --git a/Refault/ranking-X@2x.png b/Refault/ranking-X@2x.png new file mode 100644 index 0000000..eb899bc Binary files /dev/null and b/Refault/ranking-X@2x.png differ diff --git a/Refault/ranking-XH-small.png b/Refault/ranking-XH-small.png new file mode 100644 index 0000000..b30dc66 Binary files /dev/null and b/Refault/ranking-XH-small.png differ diff --git a/Refault/ranking-XH-small@2x.png b/Refault/ranking-XH-small@2x.png new file mode 100644 index 0000000..a3dee80 Binary files /dev/null and b/Refault/ranking-XH-small@2x.png differ diff --git a/Refault/ranking-XH.png b/Refault/ranking-XH.png new file mode 100644 index 0000000..fd49e94 Binary files /dev/null and b/Refault/ranking-XH.png differ diff --git a/Refault/ranking-XH@2x.png b/Refault/ranking-XH@2x.png new file mode 100644 index 0000000..3c6aa7f Binary files /dev/null and b/Refault/ranking-XH@2x.png differ diff --git a/Refault/reversearrow.png b/Refault/reversearrow.png new file mode 100644 index 0000000..37a290e Binary files /dev/null and b/Refault/reversearrow.png differ diff --git a/Refault/reversearrow@2x.png b/Refault/reversearrow@2x.png new file mode 100644 index 0000000..4b66879 Binary files /dev/null and b/Refault/reversearrow@2x.png differ diff --git a/Refault/score-0.png b/Refault/score-0.png new file mode 100644 index 0000000..c16c5c7 Binary files /dev/null and b/Refault/score-0.png differ diff --git a/Refault/score-0@2x.png b/Refault/score-0@2x.png new file mode 100644 index 0000000..549398d Binary files /dev/null and b/Refault/score-0@2x.png differ diff --git a/Refault/score-1.png b/Refault/score-1.png new file mode 100644 index 0000000..d3e4e40 Binary files /dev/null and b/Refault/score-1.png differ diff --git a/Refault/score-1@2x.png b/Refault/score-1@2x.png new file mode 100644 index 0000000..d4c304e Binary files /dev/null and b/Refault/score-1@2x.png differ diff --git a/Refault/score-2.png b/Refault/score-2.png new file mode 100644 index 0000000..0c97474 Binary files /dev/null and b/Refault/score-2.png differ diff --git a/Refault/score-2@2x.png b/Refault/score-2@2x.png new file mode 100644 index 0000000..8242be9 Binary files /dev/null and b/Refault/score-2@2x.png differ diff --git a/Refault/score-3.png b/Refault/score-3.png new file mode 100644 index 0000000..8f09239 Binary files /dev/null and b/Refault/score-3.png differ diff --git a/Refault/score-3@2x.png b/Refault/score-3@2x.png new file mode 100644 index 0000000..bd890af Binary files /dev/null and b/Refault/score-3@2x.png differ diff --git a/Refault/score-4.png b/Refault/score-4.png new file mode 100644 index 0000000..27264d4 Binary files /dev/null and b/Refault/score-4.png differ diff --git a/Refault/score-4@2x.png b/Refault/score-4@2x.png new file mode 100644 index 0000000..3667866 Binary files /dev/null and b/Refault/score-4@2x.png differ diff --git a/Refault/score-5.png b/Refault/score-5.png new file mode 100644 index 0000000..31382de Binary files /dev/null and b/Refault/score-5.png differ diff --git a/Refault/score-5@2x.png b/Refault/score-5@2x.png new file mode 100644 index 0000000..11dd644 Binary files /dev/null and b/Refault/score-5@2x.png differ diff --git a/Refault/score-6.png b/Refault/score-6.png new file mode 100644 index 0000000..2a70150 Binary files /dev/null and b/Refault/score-6.png differ diff --git a/Refault/score-6@2x.png b/Refault/score-6@2x.png new file mode 100644 index 0000000..ae9c282 Binary files /dev/null and b/Refault/score-6@2x.png differ diff --git a/Refault/score-7.png b/Refault/score-7.png new file mode 100644 index 0000000..5883297 Binary files /dev/null and b/Refault/score-7.png differ diff --git a/Refault/score-7@2x.png b/Refault/score-7@2x.png new file mode 100644 index 0000000..55f859f Binary files /dev/null and b/Refault/score-7@2x.png differ diff --git a/Refault/score-8.png b/Refault/score-8.png new file mode 100644 index 0000000..8575184 Binary files /dev/null and b/Refault/score-8.png differ diff --git a/Refault/score-8@2x.png b/Refault/score-8@2x.png new file mode 100644 index 0000000..026c8eb Binary files /dev/null and b/Refault/score-8@2x.png differ diff --git a/Refault/score-9.png b/Refault/score-9.png new file mode 100644 index 0000000..59f7665 Binary files /dev/null and b/Refault/score-9.png differ diff --git a/Refault/score-9@2x.png b/Refault/score-9@2x.png new file mode 100644 index 0000000..8fb5576 Binary files /dev/null and b/Refault/score-9@2x.png differ diff --git a/Refault/score-comma.png b/Refault/score-comma.png new file mode 100644 index 0000000..006d7e7 Binary files /dev/null and b/Refault/score-comma.png differ diff --git a/Refault/score-comma@2x.png b/Refault/score-comma@2x.png new file mode 100644 index 0000000..2cc88a4 Binary files /dev/null and b/Refault/score-comma@2x.png differ diff --git a/Refault/score-dot.png b/Refault/score-dot.png new file mode 100644 index 0000000..7ea9f03 Binary files /dev/null and b/Refault/score-dot.png differ diff --git a/Refault/score-dot@2x.png b/Refault/score-dot@2x.png new file mode 100644 index 0000000..a9cf313 Binary files /dev/null and b/Refault/score-dot@2x.png differ diff --git a/Refault/score-percent.png b/Refault/score-percent.png new file mode 100644 index 0000000..dfb0dad Binary files /dev/null and b/Refault/score-percent.png differ diff --git a/Refault/score-percent@2x.png b/Refault/score-percent@2x.png new file mode 100644 index 0000000..284b513 Binary files /dev/null and b/Refault/score-percent@2x.png differ diff --git a/Refault/score-precent.png b/Refault/score-precent.png new file mode 100644 index 0000000..750c6d0 Binary files /dev/null and b/Refault/score-precent.png differ diff --git a/Refault/score-precent@2x.png b/Refault/score-precent@2x.png new file mode 100644 index 0000000..f92b4ac Binary files /dev/null and b/Refault/score-precent@2x.png differ diff --git a/Refault/score-x.png b/Refault/score-x.png new file mode 100644 index 0000000..5f73012 Binary files /dev/null and b/Refault/score-x.png differ diff --git a/Refault/score-x@2x.png b/Refault/score-x@2x.png new file mode 100644 index 0000000..94e28f6 Binary files /dev/null and b/Refault/score-x@2x.png differ diff --git a/Refault/scorebar-bg.png b/Refault/scorebar-bg.png new file mode 100644 index 0000000..cd6262d Binary files /dev/null and b/Refault/scorebar-bg.png differ diff --git a/Refault/scorebar-bg@2x.png b/Refault/scorebar-bg@2x.png new file mode 100644 index 0000000..116e7ff Binary files /dev/null and b/Refault/scorebar-bg@2x.png differ diff --git a/Refault/scorebar-colour.png b/Refault/scorebar-colour.png new file mode 100644 index 0000000..b86ecc6 Binary files /dev/null and b/Refault/scorebar-colour.png differ diff --git a/Refault/scorebar-colour@2x.png b/Refault/scorebar-colour@2x.png new file mode 100644 index 0000000..34a2024 Binary files /dev/null and b/Refault/scorebar-colour@2x.png differ diff --git a/Refault/scorebar-marker.png b/Refault/scorebar-marker.png new file mode 100644 index 0000000..f9d4ef6 Binary files /dev/null and b/Refault/scorebar-marker.png differ diff --git a/Refault/scorebar-marker@2x.png b/Refault/scorebar-marker@2x.png new file mode 100644 index 0000000..aa57257 Binary files /dev/null and b/Refault/scorebar-marker@2x.png differ diff --git a/Refault/selection-mode-over.png b/Refault/selection-mode-over.png new file mode 100644 index 0000000..edb8cb1 Binary files /dev/null and b/Refault/selection-mode-over.png differ diff --git a/Refault/selection-mode-over@2x.png b/Refault/selection-mode-over@2x.png new file mode 100644 index 0000000..6a76cc0 Binary files /dev/null and b/Refault/selection-mode-over@2x.png differ diff --git a/Refault/selection-mode.png b/Refault/selection-mode.png new file mode 100644 index 0000000..03593fb Binary files /dev/null and b/Refault/selection-mode.png differ diff --git a/Refault/selection-mode@2x.png b/Refault/selection-mode@2x.png new file mode 100644 index 0000000..7387e54 Binary files /dev/null and b/Refault/selection-mode@2x.png differ diff --git a/Refault/selection-mods-over.png b/Refault/selection-mods-over.png new file mode 100644 index 0000000..02ae5c6 Binary files /dev/null and b/Refault/selection-mods-over.png differ diff --git a/Refault/selection-mods-over@2x.png b/Refault/selection-mods-over@2x.png new file mode 100644 index 0000000..1a04b60 Binary files /dev/null and b/Refault/selection-mods-over@2x.png differ diff --git a/Refault/selection-mods.png b/Refault/selection-mods.png new file mode 100644 index 0000000..816517f Binary files /dev/null and b/Refault/selection-mods.png differ diff --git a/Refault/selection-mods@2x.png b/Refault/selection-mods@2x.png new file mode 100644 index 0000000..b523ec9 Binary files /dev/null and b/Refault/selection-mods@2x.png differ diff --git a/Refault/selection-options-over.png b/Refault/selection-options-over.png new file mode 100644 index 0000000..14e33b9 Binary files /dev/null and b/Refault/selection-options-over.png differ diff --git a/Refault/selection-options-over@2x.png b/Refault/selection-options-over@2x.png new file mode 100644 index 0000000..c87ac8e Binary files /dev/null and b/Refault/selection-options-over@2x.png differ diff --git a/Refault/selection-options.png b/Refault/selection-options.png new file mode 100644 index 0000000..0c7bc87 Binary files /dev/null and b/Refault/selection-options.png differ diff --git a/Refault/selection-options@2x.png b/Refault/selection-options@2x.png new file mode 100644 index 0000000..06bb3d4 Binary files /dev/null and b/Refault/selection-options@2x.png differ diff --git a/Refault/selection-random-over.png b/Refault/selection-random-over.png new file mode 100644 index 0000000..bfe85e7 Binary files /dev/null and b/Refault/selection-random-over.png differ diff --git a/Refault/selection-random-over@2x.png b/Refault/selection-random-over@2x.png new file mode 100644 index 0000000..0d5b78a Binary files /dev/null and b/Refault/selection-random-over@2x.png differ diff --git a/Refault/selection-random.png b/Refault/selection-random.png new file mode 100644 index 0000000..c5fa2b7 Binary files /dev/null and b/Refault/selection-random.png differ diff --git a/Refault/selection-random@2x.png b/Refault/selection-random@2x.png new file mode 100644 index 0000000..b4203be Binary files /dev/null and b/Refault/selection-random@2x.png differ diff --git a/Refault/skin.ini b/Refault/skin.ini new file mode 100644 index 0000000..091db55 --- /dev/null +++ b/Refault/skin.ini @@ -0,0 +1,41 @@ +[General] +Name: Refault +Author: Crawron +Version: 2.6 + +CursorCentre: 1 +CursorExpand: 1 +CursorRotate: 1 +SliderBallFlip: 0 +SliderBallFrames: 10 +HitCircleOverlayAboveNumber: 1 +SpinnerFrequencyModulate: 1 +LayeredHitSounds: 1 +SpinnerFadePlayfield: 1 +SpinnerNoBlink: 0 +AnimationFramerate: -1 +CursorTrailRotate: 0 +AllowSliderBallTint: 1 +ComboBurstRandom: 0 + +[Colours] +Combo1: 255, 192, 0 +Combo2: 0, 202, 0 +Combo3: 18, 124, 255 +Combo4: 242, 24, 57 +MenuGlow: 0, 78, 155 +SliderBall: 2, 170, 255 +// SliderTrackOverride: 0,0,0 +SliderBorder: 255,255,255 +SpinnerApproachCircle: 77, 139, 217 +SongSelectActiveText: 0,0,0 +SongSelectInactiveText: 255,255,255 +InputOverlayText: 255,255,255 + +[Fonts] +HitCirclePrefix: default +HitCircleOverlap: -2 +ScorePrefix: score +ScoreOverlap: 0 +ComboPrefix: score +ComboOverlap: 0 \ No newline at end of file diff --git a/Refault/sliderb-nd.png b/Refault/sliderb-nd.png new file mode 100644 index 0000000..9875ce5 Binary files /dev/null and b/Refault/sliderb-nd.png differ diff --git a/Refault/sliderb-nd@2x.png b/Refault/sliderb-nd@2x.png new file mode 100644 index 0000000..bba5664 Binary files /dev/null and b/Refault/sliderb-nd@2x.png differ diff --git a/Refault/sliderb-spec.png b/Refault/sliderb-spec.png new file mode 100644 index 0000000..c0b23e2 Binary files /dev/null and b/Refault/sliderb-spec.png differ diff --git a/Refault/sliderb-spec@2x.png b/Refault/sliderb-spec@2x.png new file mode 100644 index 0000000..38b6546 Binary files /dev/null and b/Refault/sliderb-spec@2x.png differ diff --git a/Refault/sliderb0.png b/Refault/sliderb0.png new file mode 100644 index 0000000..566c6b0 Binary files /dev/null and b/Refault/sliderb0.png differ diff --git a/Refault/sliderb0@2x.png b/Refault/sliderb0@2x.png new file mode 100644 index 0000000..1ea385f Binary files /dev/null and b/Refault/sliderb0@2x.png differ diff --git a/Refault/sliderb1.png b/Refault/sliderb1.png new file mode 100644 index 0000000..e615e83 Binary files /dev/null and b/Refault/sliderb1.png differ diff --git a/Refault/sliderb1@2x.png b/Refault/sliderb1@2x.png new file mode 100644 index 0000000..0ffc02b Binary files /dev/null and b/Refault/sliderb1@2x.png differ diff --git a/Refault/sliderb2.png b/Refault/sliderb2.png new file mode 100644 index 0000000..1750af9 Binary files /dev/null and b/Refault/sliderb2.png differ diff --git a/Refault/sliderb2@2x.png b/Refault/sliderb2@2x.png new file mode 100644 index 0000000..61868ff Binary files /dev/null and b/Refault/sliderb2@2x.png differ diff --git a/Refault/sliderb3.png b/Refault/sliderb3.png new file mode 100644 index 0000000..6a495b5 Binary files /dev/null and b/Refault/sliderb3.png differ diff --git a/Refault/sliderb3@2x.png b/Refault/sliderb3@2x.png new file mode 100644 index 0000000..6e2863f Binary files /dev/null and b/Refault/sliderb3@2x.png differ diff --git a/Refault/sliderb4.png b/Refault/sliderb4.png new file mode 100644 index 0000000..95a242c Binary files /dev/null and b/Refault/sliderb4.png differ diff --git a/Refault/sliderb4@2x.png b/Refault/sliderb4@2x.png new file mode 100644 index 0000000..001904e Binary files /dev/null and b/Refault/sliderb4@2x.png differ diff --git a/Refault/sliderb5.png b/Refault/sliderb5.png new file mode 100644 index 0000000..32de12d Binary files /dev/null and b/Refault/sliderb5.png differ diff --git a/Refault/sliderb5@2x.png b/Refault/sliderb5@2x.png new file mode 100644 index 0000000..92277ba Binary files /dev/null and b/Refault/sliderb5@2x.png differ diff --git a/Refault/sliderb6.png b/Refault/sliderb6.png new file mode 100644 index 0000000..6d82ab6 Binary files /dev/null and b/Refault/sliderb6.png differ diff --git a/Refault/sliderb6@2x.png b/Refault/sliderb6@2x.png new file mode 100644 index 0000000..85e86f7 Binary files /dev/null and b/Refault/sliderb6@2x.png differ diff --git a/Refault/sliderb7.png b/Refault/sliderb7.png new file mode 100644 index 0000000..9faaa78 Binary files /dev/null and b/Refault/sliderb7.png differ diff --git a/Refault/sliderb7@2x.png b/Refault/sliderb7@2x.png new file mode 100644 index 0000000..5590c35 Binary files /dev/null and b/Refault/sliderb7@2x.png differ diff --git a/Refault/sliderb8.png b/Refault/sliderb8.png new file mode 100644 index 0000000..df890e3 Binary files /dev/null and b/Refault/sliderb8.png differ diff --git a/Refault/sliderb8@2x.png b/Refault/sliderb8@2x.png new file mode 100644 index 0000000..185ed58 Binary files /dev/null and b/Refault/sliderb8@2x.png differ diff --git a/Refault/sliderb9.png b/Refault/sliderb9.png new file mode 100644 index 0000000..f126e97 Binary files /dev/null and b/Refault/sliderb9.png differ diff --git a/Refault/sliderb9@2x.png b/Refault/sliderb9@2x.png new file mode 100644 index 0000000..b3764dc Binary files /dev/null and b/Refault/sliderb9@2x.png differ diff --git a/Refault/sliderbframes/sliderb.blend b/Refault/sliderbframes/sliderb.blend new file mode 100644 index 0000000..e8c683f Binary files /dev/null and b/Refault/sliderbframes/sliderb.blend differ diff --git a/Refault/sliderbframes/sliderb.blend1 b/Refault/sliderbframes/sliderb.blend1 new file mode 100644 index 0000000..9a46e38 Binary files /dev/null and b/Refault/sliderbframes/sliderb.blend1 differ diff --git a/Refault/sliderbframes/sliderb/0001.png b/Refault/sliderbframes/sliderb/0001.png new file mode 100644 index 0000000..942b621 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0001.png differ diff --git a/Refault/sliderbframes/sliderb/0002.png b/Refault/sliderbframes/sliderb/0002.png new file mode 100644 index 0000000..1708028 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0002.png differ diff --git a/Refault/sliderbframes/sliderb/0003.png b/Refault/sliderbframes/sliderb/0003.png new file mode 100644 index 0000000..3b8e2f3 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0003.png differ diff --git a/Refault/sliderbframes/sliderb/0004.png b/Refault/sliderbframes/sliderb/0004.png new file mode 100644 index 0000000..cb0e2bd Binary files /dev/null and b/Refault/sliderbframes/sliderb/0004.png differ diff --git a/Refault/sliderbframes/sliderb/0005.png b/Refault/sliderbframes/sliderb/0005.png new file mode 100644 index 0000000..1b57bf5 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0005.png differ diff --git a/Refault/sliderbframes/sliderb/0006.png b/Refault/sliderbframes/sliderb/0006.png new file mode 100644 index 0000000..649be5b Binary files /dev/null and b/Refault/sliderbframes/sliderb/0006.png differ diff --git a/Refault/sliderbframes/sliderb/0007.png b/Refault/sliderbframes/sliderb/0007.png new file mode 100644 index 0000000..69efb23 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0007.png differ diff --git a/Refault/sliderbframes/sliderb/0008.png b/Refault/sliderbframes/sliderb/0008.png new file mode 100644 index 0000000..914c564 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0008.png differ diff --git a/Refault/sliderbframes/sliderb/0009.png b/Refault/sliderbframes/sliderb/0009.png new file mode 100644 index 0000000..0b475a6 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0009.png differ diff --git a/Refault/sliderbframes/sliderb/0010.png b/Refault/sliderbframes/sliderb/0010.png new file mode 100644 index 0000000..48a1d31 Binary files /dev/null and b/Refault/sliderbframes/sliderb/0010.png differ diff --git a/Refault/sliderbframes/tinted preview.png b/Refault/sliderbframes/tinted preview.png new file mode 100644 index 0000000..ea6aef9 Binary files /dev/null and b/Refault/sliderbframes/tinted preview.png differ diff --git a/Refault/sliderfollowcircle.png b/Refault/sliderfollowcircle.png new file mode 100644 index 0000000..daa43e2 Binary files /dev/null and b/Refault/sliderfollowcircle.png differ diff --git a/Refault/sliderfollowcircle@2x.png b/Refault/sliderfollowcircle@2x.png new file mode 100644 index 0000000..d08fe2a Binary files /dev/null and b/Refault/sliderfollowcircle@2x.png differ diff --git a/Refault/sliderscorepoint.png b/Refault/sliderscorepoint.png new file mode 100644 index 0000000..c8aeab1 Binary files /dev/null and b/Refault/sliderscorepoint.png differ diff --git a/Refault/sliderscorepoint@2x.png b/Refault/sliderscorepoint@2x.png new file mode 100644 index 0000000..0602f66 Binary files /dev/null and b/Refault/sliderscorepoint@2x.png differ diff --git a/Refault/spinner-approachcircle.png b/Refault/spinner-approachcircle.png new file mode 100644 index 0000000..b058f9a Binary files /dev/null and b/Refault/spinner-approachcircle.png differ diff --git a/Refault/spinner-approachcircle@2x.png b/Refault/spinner-approachcircle@2x.png new file mode 100644 index 0000000..c5cc09f Binary files /dev/null and b/Refault/spinner-approachcircle@2x.png differ diff --git a/Refault/spinner-bottom.png b/Refault/spinner-bottom.png new file mode 100644 index 0000000..9570850 Binary files /dev/null and b/Refault/spinner-bottom.png differ diff --git a/Refault/spinner-circle.png b/Refault/spinner-circle.png new file mode 100644 index 0000000..1888389 Binary files /dev/null and b/Refault/spinner-circle.png differ diff --git a/Refault/spinner-clear.png b/Refault/spinner-clear.png new file mode 100644 index 0000000..95007b9 Binary files /dev/null and b/Refault/spinner-clear.png differ diff --git a/Refault/spinner-glow.png b/Refault/spinner-glow.png new file mode 100644 index 0000000..65fe251 Binary files /dev/null and b/Refault/spinner-glow.png differ diff --git a/Refault/spinner-metre.png b/Refault/spinner-metre.png new file mode 100644 index 0000000..95007b9 Binary files /dev/null and b/Refault/spinner-metre.png differ diff --git a/Refault/spinner-middle.png b/Refault/spinner-middle.png new file mode 100644 index 0000000..95007b9 Binary files /dev/null and b/Refault/spinner-middle.png differ diff --git a/Refault/spinner-middle2@2x.png b/Refault/spinner-middle2@2x.png new file mode 100644 index 0000000..d79303f Binary files /dev/null and b/Refault/spinner-middle2@2x.png differ diff --git a/Refault/spinner-osu.png b/Refault/spinner-osu.png new file mode 100644 index 0000000..95007b9 Binary files /dev/null and b/Refault/spinner-osu.png differ diff --git a/Refault/spinner-rpm.png b/Refault/spinner-rpm.png new file mode 100644 index 0000000..4bf648c Binary files /dev/null and b/Refault/spinner-rpm.png differ diff --git a/Refault/spinner-top.png b/Refault/spinner-top.png new file mode 100644 index 0000000..95007b9 Binary files /dev/null and b/Refault/spinner-top.png differ diff --git a/Refault/star.png b/Refault/star.png new file mode 100644 index 0000000..7f2267e Binary files /dev/null and b/Refault/star.png differ diff --git a/Refault/star2.png b/Refault/star2.png new file mode 100644 index 0000000..7216fdd Binary files /dev/null and b/Refault/star2.png differ diff --git a/Refault/star2@2x.png b/Refault/star2@2x.png new file mode 100644 index 0000000..1216ded Binary files /dev/null and b/Refault/star2@2x.png differ diff --git a/Refault/star@2x.png b/Refault/star@2x.png new file mode 100644 index 0000000..f3e04ad Binary files /dev/null and b/Refault/star@2x.png differ diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..b7967ad --- /dev/null +++ b/biome.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.7.2/schema.json", + "organizeImports": { + "enabled": true + }, + "formatter": { "enabled": true, "indentStyle": "space", "indentWidth": 2 }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + } +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..6b34acb --- /dev/null +++ b/index.html @@ -0,0 +1,5 @@ + + +
+ + \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..3e39613 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "osuplayer.js", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "vite" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@biomejs/biome": "1.7.2", + "@types/three": "^0.164.0", + "vite": "^5.2.11", + "vite-plugin-node-polyfills": "^0.21.0" + }, + "dependencies": { + "@zip.js/zip.js": "^2.7.43", + "osu-classes": "^3.1.0", + "osu-parsers": "^4.1.7", + "rosu-pp-js": "https://github.com/MaxOhn/rosu-pp-js/releases/download/v1.0.2/rosu_pp_js_web.tar.gz", + "three": "^0.164.1" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..d33188d --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1531 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@zip.js/zip.js': + specifier: ^2.7.43 + version: 2.7.43 + osu-classes: + specifier: ^3.1.0 + version: 3.1.0 + osu-parsers: + specifier: ^4.1.7 + version: 4.1.7(osu-classes@3.1.0) + rosu-pp-js: + specifier: https://github.com/MaxOhn/rosu-pp-js/releases/download/v1.0.2/rosu_pp_js_web.tar.gz + version: '@github.com/MaxOhn/rosu-pp-js/releases/download/v1.0.2/rosu_pp_js_web.tar.gz' + three: + specifier: ^0.164.1 + version: 0.164.1 + +devDependencies: + '@biomejs/biome': + specifier: 1.7.2 + version: 1.7.2 + '@types/three': + specifier: ^0.164.0 + version: 0.164.0 + vite: + specifier: ^5.2.11 + version: 5.2.11 + vite-plugin-node-polyfills: + specifier: ^0.21.0 + version: 0.21.0(vite@5.2.11) + +packages: + + /@biomejs/biome@1.7.2: + resolution: {integrity: sha512-6Skx9N47inLQzYi9RKgJ7PBnUnaHnMe/imqX43cOcJjZtfMnQLxEvfM2Eyo7gChkwrZlwc+VbA4huFRjw2fsYA==} + engines: {node: '>=14.21.3'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.7.2 + '@biomejs/cli-darwin-x64': 1.7.2 + '@biomejs/cli-linux-arm64': 1.7.2 + '@biomejs/cli-linux-arm64-musl': 1.7.2 + '@biomejs/cli-linux-x64': 1.7.2 + '@biomejs/cli-linux-x64-musl': 1.7.2 + '@biomejs/cli-win32-arm64': 1.7.2 + '@biomejs/cli-win32-x64': 1.7.2 + dev: true + + /@biomejs/cli-darwin-arm64@1.7.2: + resolution: {integrity: sha512-CrldIueHivWEWmeTkK8bTXajeX53F8i2Rrkkt8cPZyMtzkrwxf8Riq4a/jz3SQBHkxHFT4TqGbSTNMXe3X1ogA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-darwin-x64@1.7.2: + resolution: {integrity: sha512-UELnLJuJOsTL9meArvn8BtiXDURyPil2Ej9me2uVpEvee8UQdqd/bssP5we400OWShlL1AAML4fn6d2WX5332g==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64-musl@1.7.2: + resolution: {integrity: sha512-kKYZiem7Sj7wI0dpVxJlK7C+TFQwzO/ctufIGXGJAyEmUe9vEKSzV8CXpv+JIRiTWyqaZJ4K+eHz4SPdPCv05w==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-arm64@1.7.2: + resolution: {integrity: sha512-Z1CSGQE6fHz55gkiFHv9E8wEAaSUd7dHSRaxSCBa7utonHqpIeMbvj3Evm1w0WfGLFDtRXLV1fTfEdM0FMTOhA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64-musl@1.7.2: + resolution: {integrity: sha512-x10LpGMepDrLS+h2TZ6/T7egpHjGKtiI4GuShNylmBQJWfTotbFf9eseHggrqJ4WZf9yrGoVYrtbxXftuB95sQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-linux-x64@1.7.2: + resolution: {integrity: sha512-vXXyox8/CQijBxAu0+r8FfSO7JlC4tob3PbaFda8gPJFRz2uFJw39HtxVUwbTV1EcU6wSPh4SiRu5sZfP1VHrQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-arm64@1.7.2: + resolution: {integrity: sha512-kRXdlKzcU7INf6/ldu0nVmkOgt7bKqmyXRRCUqqaJfA32+9InTbkD8tGrHZEVYIWr+eTuKcg16qZVDsPSDFZ8g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-x64@1.7.2: + resolution: {integrity: sha512-qHTtpAs+CNglAAuaTy09htoqUhrQyd3nd0aGTuLNqD10h1llMVi8WFZfoa+e5MuDSfYtMK6nW2Tbf6WgzzR1Qw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@rollup/plugin-inject@5.0.5: + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.1.0 + estree-walker: 2.0.2 + magic-string: 0.30.10 + dev: true + + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/rollup-android-arm-eabi@4.17.2: + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.17.2: + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.17.2: + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.17.2: + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.17.2: + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.17.2: + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.17.2: + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.17.2: + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.17.2: + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.17.2: + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.17.2: + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.17.2: + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.17.2: + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.17.2: + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.17.2: + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@tweenjs/tween.js@23.1.1: + resolution: {integrity: sha512-ZpboH7pCPPeyBWKf8c7TJswtCEQObFo3bOBYalm99NzZarATALYCo5OhbCa/n4RQyJyHfhkdx+hNrdL5ByFYDw==} + dev: true + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + + /@types/node@20.12.8: + resolution: {integrity: sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/stats.js@0.17.3: + resolution: {integrity: sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==} + dev: true + + /@types/three@0.164.0: + resolution: {integrity: sha512-SFDofn9dJVrE+1DKta7xj7lc4ru7B3S3yf10NsxOserW57aQlB6GxtAS1UK5To3LfEMN5HUHMu3n5v+M5rApgA==} + dependencies: + '@tweenjs/tween.js': 23.1.1 + '@types/stats.js': 0.17.3 + '@types/webxr': 0.5.16 + fflate: 0.8.2 + meshoptimizer: 0.18.1 + dev: true + + /@types/webxr@0.5.16: + resolution: {integrity: sha512-0E0Cl84FECtzrB4qG19TNTqpunw0F1YF0QZZnFMF6pDw1kNKJtrlTKlVB34stGIsHbZsYQ7H0tNjPfZftkHHoA==} + dev: true + + /@zip.js/zip.js@2.7.43: + resolution: {integrity: sha512-kW7elA/Q1o5xusStfZeysCvheD1SvW3TWDfqTCmoWW4ALBSqKonZSTrQgdEGOUec2U/TLMSGq0SuSMTAxy4gFg==} + engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} + dev: false + + /asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} + dependencies: + bn.js: 4.12.0 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + dev: true + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: true + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: true + + /browser-resolve@2.0.0: + resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} + dependencies: + resolve: 1.22.8 + dev: true + + /browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-cipher@1.0.1: + resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==} + dependencies: + browserify-aes: 1.2.0 + browserify-des: 1.0.2 + evp_bytestokey: 1.0.3 + dev: true + + /browserify-des@1.0.2: + resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==} + dependencies: + cipher-base: 1.0.4 + des.js: 1.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /browserify-rsa@4.1.0: + resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} + dependencies: + bn.js: 5.2.1 + randombytes: 2.1.0 + dev: true + + /browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} + dependencies: + bn.js: 5.2.1 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + create-hmac: 1.1.7 + elliptic: 6.5.5 + hash-base: 3.0.4 + inherits: 2.0.4 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 + safe-buffer: 5.2.1 + dev: true + + /browserify-zlib@0.2.0: + resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==} + dependencies: + pako: 1.0.11 + dev: true + + /buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /builtin-status-codes@3.0.0: + resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + dev: true + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /console-browserify@1.2.0: + resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} + dev: true + + /constants-browserify@1.0.0: + resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-ecdh@4.0.4: + resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} + dependencies: + bn.js: 4.12.0 + elliptic: 6.5.5 + dev: true + + /create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + dev: true + + /create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /crypto-browserify@3.12.0: + resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} + dependencies: + browserify-cipher: 1.0.1 + browserify-sign: 4.2.3 + create-ecdh: 4.0.4 + create-hash: 1.2.0 + create-hmac: 1.1.7 + diffie-hellman: 5.0.3 + inherits: 2.0.4 + pbkdf2: 3.1.2 + public-encrypt: 4.0.3 + randombytes: 2.1.0 + randomfill: 1.0.4 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /diffie-hellman@5.0.3: + resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} + dependencies: + bn.js: 4.12.0 + miller-rabin: 4.0.1 + randombytes: 2.1.0 + dev: true + + /domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} + engines: {node: '>=10'} + dev: true + + /elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + dev: true + + /fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + dev: true + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: true + + /https-browserify@1.0.0: + resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isomorphic-timers-promises@1.0.1: + resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} + engines: {node: '>=10'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lzma-js-simple-v2@1.2.3: + resolution: {integrity: sha512-6kgy86Q3YLolV6dOwCqdQXg3V07e3XJJ6wqfrN8/s65mvCfqkr+jMJkfiSZNvk+u2ig+G8rLdtaoW/g1oJiwow==} + dependencies: + '@types/node': 20.12.8 + dev: false + + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /meshoptimizer@0.18.1: + resolution: {integrity: sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==} + dev: true + + /miller-rabin@4.0.1: + resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} + hasBin: true + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /node-stdlib-browser@1.2.0: + resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} + engines: {node: '>=10'} + dependencies: + assert: 2.1.0 + browser-resolve: 2.0.0 + browserify-zlib: 0.2.0 + buffer: 5.7.1 + console-browserify: 1.2.0 + constants-browserify: 1.0.0 + create-require: 1.1.1 + crypto-browserify: 3.12.0 + domain-browser: 4.23.0 + events: 3.3.0 + https-browserify: 1.0.0 + isomorphic-timers-promises: 1.0.1 + os-browserify: 0.3.0 + path-browserify: 1.0.1 + pkg-dir: 5.0.0 + process: 0.11.10 + punycode: 1.4.1 + querystring-es3: 0.2.1 + readable-stream: 3.6.2 + stream-browserify: 3.0.0 + stream-http: 3.2.0 + string_decoder: 1.3.0 + timers-browserify: 2.0.12 + tty-browserify: 0.0.1 + url: 0.11.3 + util: 0.12.5 + vm-browserify: 1.1.2 + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /os-browserify@0.3.0: + resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + dev: true + + /osu-classes@3.1.0: + resolution: {integrity: sha512-kz38FWMGnz5lr6ofovUrNaDAcs1gNpwlDc1qHjW86ILQZXG44w/+NflV7EyFomkI05XCADGfltE4FVoPwrkrmg==} + dev: false + + /osu-parsers@4.1.7(osu-classes@3.1.0): + resolution: {integrity: sha512-b8aYJy9vK0Yk8zVbxVN+HSChGnXufSxePb3gABG8s5YGCY+31CKJTUHDAVRST0kX4lyeI4Z3iRxsCRftHFHEug==} + peerDependencies: + osu-classes: ^3.1.0 + dependencies: + lzma-js-simple-v2: 1.2.3 + osu-classes: 3.1.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: true + + /parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} + dependencies: + asn1.js: 4.10.1 + browserify-aes: 1.2.0 + evp_bytestokey: 1.0.3 + hash-base: 3.0.4 + pbkdf2: 3.1.2 + safe-buffer: 5.2.1 + dev: true + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: true + + /public-encrypt@4.0.3: + resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} + dependencies: + bn.js: 4.12.0 + browserify-rsa: 4.1.0 + create-hash: 1.2.0 + parse-asn1: 5.1.7 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: true + + /querystring-es3@0.2.1: + resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} + engines: {node: '>=0.4.x'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /randomfill@1.0.4: + resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==} + dependencies: + randombytes: 2.1.0 + safe-buffer: 5.2.1 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + dev: true + + /rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: true + + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true + + /stream-browserify@3.0.0: + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /stream-http@3.2.0: + resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + xtend: 4.0.2 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /three@0.164.1: + resolution: {integrity: sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==} + dev: false + + /timers-browserify@2.0.12: + resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} + engines: {node: '>=0.6.0'} + dependencies: + setimmediate: 1.0.5 + dev: true + + /tty-browserify@0.0.1: + resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /url@0.11.3: + resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} + dependencies: + punycode: 1.4.1 + qs: 6.12.1 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + dev: true + + /vite-plugin-node-polyfills@0.21.0(vite@5.2.11): + resolution: {integrity: sha512-Sk4DiKnmxN8E0vhgEhzLudfJQfaT8k4/gJ25xvUPG54KjLJ6HAmDKbr4rzDD/QWEY+Lwg80KE85fGYBQihEPQA==} + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + dependencies: + '@rollup/plugin-inject': 5.0.5 + node-stdlib-browser: 1.2.0 + vite: 5.2.11 + transitivePeerDependencies: + - rollup + dev: true + + /vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vm-browserify@1.1.2: + resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + dev: true + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + '@github.com/MaxOhn/rosu-pp-js/releases/download/v1.0.2/rosu_pp_js_web.tar.gz': + resolution: {tarball: https://github.com/MaxOhn/rosu-pp-js/releases/download/v1.0.2/rosu_pp_js_web.tar.gz} + name: rosu-pp-js + version: 1.0.2 + dev: false diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..75e32fd --- /dev/null +++ b/src/index.ts @@ -0,0 +1,158 @@ +import { filterNull } from "./utils"; +import * as THREE from "three"; +import Stats from "three/addons/libs/stats.module.js"; +import { ZipReader, BlobWriter } from "@zip.js/zip.js"; +import rosuInit, * as rosu from "rosu-pp-js"; +import rosuWasm from "rosu-pp-js/rosu_pp_js_bg.wasm?url"; +import { Beatmap, BeatmapSet } from "./osu"; +import { BeatmapDecoder } from "osu-parsers"; + +const rosuLoad = rosuInit(rosuWasm); + +interface OsuPlayerOpts { + showControls: boolean; +} + +class OsuPlayer { + el: HTMLElement | null = null; + canvasEl: HTMLCanvasElement | null = null; + opts: OsuPlayerOpts = { showControls: true }; + beatmapSet: BeatmapSet = new BeatmapSet(); + diffsByStarRating: [number, number][] = []; + diffs: Map = new Map(); + + constructor(opts?: OsuPlayerOpts) { + if (opts) this.opts = opts; + } + + init(el: HTMLElement) { + this.el = el; + + this.el.style.width = "1024px"; + this.el.style.height = "768px"; + this.el.style.backgroundColor = "lightgray"; + + // Initialize dragging + this.el.addEventListener("drop", async (evt) => { + evt.preventDefault(); + const files = filterNull( + [...(evt.dataTransfer?.items ?? [])].map((item) => item.getAsFile()), + ); + if (!files.length) return; + const firstFile = files[0]; + const zipReader = new ZipReader(firstFile.stream()); + const entries = await zipReader.getEntries(); + await rosuLoad; + const perf = new rosu.Difficulty(); + const osuParser = new BeatmapDecoder(); + for (const entry of entries) { + const writer = new BlobWriter(); + const data = await entry.getData?.(writer); + if (!data) continue; + + if (!entry.filename.endsWith(".osu")) { + this.beatmapSet.assets.set(entry.filename, data); + continue; + } + + const text = await data.text(); + const map = new rosu.Beatmap(text); + const osuMap = osuParser.decodeFromString(text); + const result = perf.calculate(map); + const beatmap = new Beatmap(map, osuMap, this.beatmapSet); + const id = beatmap.id(); + this.diffs.set(id, beatmap); + this.diffsByStarRating.push([result.stars, id]); + } + this.diffsByStarRating.sort((a, b) => a[0] - b[0]); + + /* + const listEl = document.createElement("ul"); + listEl.style.margin = "0"; + for (const [stars, id] of this.diffsByStarRating) { + // biome-ignore lint/style/noNonNullAssertion: + const diff = this.diffs.get(id)!; + const liEl = document.createElement("li"); + const aEl = document.createElement("a"); + aEl.href = "javascript:void(0)"; + aEl.text = `${diff.osuInner.metadata.version} (${ + Math.round(stars * 100) / 100 + }*)`; + aEl.addEventListener("click", (evt) => { + this.setBeatmap(id); + }); + liEl.appendChild(aEl); + listEl.appendChild(liEl); + } + + console.log([...this.beatmapSet.assets.entries()]); + this.el?.replaceChildren(listEl); + */ + + this.setBeatmap( + this.diffsByStarRating[this.diffsByStarRating.length - 1][1], + ); + }); + + this.el.addEventListener("dragover", (evt) => { + evt.preventDefault(); + }); + } + + setBeatmap(id: number) { + this.canvasEl = document.createElement("canvas"); + this.canvasEl.width = 1024; + this.canvasEl.height = 768; + + // biome-ignore lint/style/noNonNullAssertion: + const context = this.canvasEl.getContext("webgl2")!; + + // biome-ignore lint/style/noNonNullAssertion: + const beatmap = this.diffs.get(id)!; + + const backgroundUrl = URL.createObjectURL(beatmap.background()); + + const scene = new THREE.Scene(); + const camera = new THREE.OrthographicCamera(-512, 512, -384, 384, 1, 1000); + scene.add(camera); + + scene.add(new THREE.AmbientLight()); + + const loader = new THREE.TextureLoader(); + + let backgroundPlane: THREE.Mesh; + { + const backgroundTexture = loader.load(backgroundUrl); + const backgroundMaterial = new THREE.MeshBasicMaterial({ + map: backgroundTexture, + color: new THREE.Color(0.25, 0.25, 0.25), + }); + backgroundPlane = new THREE.Mesh( + new THREE.PlaneGeometry(1024, 768), + backgroundMaterial, + ); + backgroundPlane.position.set(1, 0, 0); + backgroundPlane.rotation.set(Math.PI, Math.PI / 2, 0); + camera.lookAt(backgroundPlane.position); + camera.up.set(0, 1, 0); + scene.add(backgroundPlane); + } + + const renderer = new THREE.WebGLRenderer({ canvas: this.canvasEl }); + const stats = new Stats(); + this.el?.replaceChildren(this.canvasEl, stats.dom); + + function animate() { + requestAnimationFrame(animate); + + renderer.render(scene, camera); + } + + animate(); + } +} + +// biome-ignore lint/style/noNonNullAssertion: +const el = document.getElementById("root")!; +const player = new OsuPlayer(); +player.init(el); diff --git a/src/osu.ts b/src/osu.ts new file mode 100644 index 0000000..31d0ba5 --- /dev/null +++ b/src/osu.ts @@ -0,0 +1,25 @@ +import { Beatmap as OsuBeatmap } from "osu-classes"; +import * as rosu from "rosu-pp-js"; + +export class BeatmapSet { + public assets: Map = new Map(); +} + +export class Beatmap { + constructor( + public rosuInner: rosu.Beatmap, + public osuInner: OsuBeatmap, + public set: BeatmapSet, + ) {} + + public id(): number { + return this.osuInner.metadata.beatmapId; + } + + public background(): Blob { + // biome-ignore lint/style/noNonNullAssertion: + const filename = this.osuInner.events.backgroundPath!; + // biome-ignore lint/style/noNonNullAssertion: + return this.set.assets.get(filename)!; + } +} diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..97b018d --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,7 @@ +export function filterNull(arr: (T | null)[]): T[] { + const result: T[] = []; + for (const item of arr) { + if (item !== null) result.push(item); + } + return result; +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..e31954e --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vite"; +import { nodePolyfills } from "vite-plugin-node-polyfills"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [], +});